<?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 - nothus par Nothus</title>
		<link>https://www.developpez.net/forums/blogs/318041-nothus/</link>
		<description>Developpez.com, le Club des Développeurs et IT Pro</description>
		<language>fr</language>
		<lastBuildDate>Fri, 17 Apr 2026 11:36:09 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 - nothus par Nothus</title>
			<link>https://www.developpez.net/forums/blogs/318041-nothus/</link>
		</image>
		<item>
			<title><![CDATA[[MariaDB] Requête récursive : un exemple de graphe PERT (gestion de projet) extrait en une seule requête]]></title>
			<link>https://www.developpez.net/forums/blogs/318041-nothus/b9145/mariadb-requete-recursive-exemple-graphe-pert-gestion-projet-extrait-seule-requete/</link>
			<pubDate>Fri, 03 Apr 2020 14:25:19 GMT</pubDate>
			<description><![CDATA[[Message de service] cet...]]></description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">[Message de service] cet article a été transféré vers mon wiki : <br />
<a href="https://code.nothus.fr/doku.php?id=sql:requete-recursive" target="_blank">https://code.nothus.fr/doku.php?id=s...uete-recursive</a> <br />
<br />
<i>(màj possible) </i></blockquote>

]]></content:encoded>
			<dc:creator>Nothus</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/318041-nothus/b9145/mariadb-requete-recursive-exemple-graphe-pert-gestion-projet-extrait-seule-requete/</guid>
		</item>
		<item>
			<title><![CDATA[[Pense-bête] Rust / Python : le cas des strings / str (chaîne de caractères)]]></title>
			<link>https://www.developpez.net/forums/blogs/318041-nothus/b9033/pense-bete-rust-python-cas-strings-str-chaine-caracteres/</link>
			<pubDate>Thu, 05 Mar 2020 12:12:38 GMT</pubDate>
			<description>Pour ce pense-bête,...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">Pour ce pense-bête, penchons-nous tout d'abord dans un nouveau projet : <br />
<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:36px;">cargo new projet</pre>
</div>... en pensant à ajouter dans le fichier <i>toml</i> de ce projet : <br />
<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:84px;"><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 /></div></td><td valign="top"><pre style="margin: 0">
[lib]
name = &quot;projet&quot;
crate-type = [&quot;dylib&quot;]</pre></td></tr></table></pre>
</div>... et éditer le fichier (préalablement créé) <i>lib.rs</i> dans le dossier <i>./src</i> : <br />
<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 rust :</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"><span style="color: #0000ff;">use</span> std::ffi::CString; 
<span style="color: #0000ff;">use</span> std::ffi::CStr; 
<span style="color: #0000ff;">use</span> std::os::raw::c_char; 
&nbsp;
<span style="color: #339933;">#</span><span style="color: #339933;"><span class="br0">&#91;</span>no_mangle<span class="br0">&#93;</span></span> <span style="color: #808080;">// </span>
<span style="color: #0000ff;">pub</span> <span style="color: #0000ff;">extern</span> <span style="color: #0000ff;">fn</span> depuis_rust<span class="br0">&#40;</span><span class="br0">&#41;</span> -&gt; *<span style="color: #0000ff;">const</span> c_char <span class="br0">&#123;</span>
    <span style="color: #0000ff;">let</span> s = CString::new<span class="br0">&#40;</span><span style="color: #FF0000;">&quot;&amp; oui&quot;</span><span class="br0">&#41;</span>.unwrap<span class="br0">&#40;</span><span class="br0">&#41;</span>;
    <span style="color: #0000ff;">let</span> p = s.as_ptr<span class="br0">&#40;</span><span class="br0">&#41;</span>; 
    std::mem::forget<span class="br0">&#40;</span>s<span class="br0">&#41;</span>; 
    p 
<span class="br0">&#125;</span> 
&nbsp;
<span style="color: #339933;">#</span><span style="color: #339933;"><span class="br0">&#91;</span>no_mangle<span class="br0">&#93;</span></span>
<span style="color: #0000ff;">pub</span> <span style="color: #0000ff;">extern</span> <span style="color: #0000ff;">fn</span> vers_rust<span class="br0">&#40;</span> texte: *<span style="color: #0000ff;">const</span> c_char<span class="br0">&#41;</span> -&gt; *<span style="color: #0000ff;">const</span> c_char <span class="br0">&#123;</span> 
    <span style="color: #0000ff;">let</span> cstr = <span style="color: #0000ff;">unsafe</span> <span class="br0">&#123;</span> 
        CStr::from_ptr<span class="br0">&#40;</span> texte <span class="br0">&#41;</span> 
    <span class="br0">&#125;</span>; 
    <span style="color: #0000ff;">let</span> string = cstr.to_str<span class="br0">&#40;</span><span class="br0">&#41;</span>.expect<span class="br0">&#40;</span><span style="color: #FF0000;">&quot;chaine UTF-8 invalide&quot;</span><span class="br0">&#41;</span>;
    <span style="color: #0080ff;">println!</span><span class="br0">&#40;</span><span style="color: #FF0000;">&quot;<span style="color: #800000;">{}</span>&quot;</span>, string<span class="br0">&#41;</span>; 
    <span style="color: #0000ff;">let</span> s = CString::new<span class="br0">&#40;</span><span style="color: #FF0000;">&quot;@ maison&quot;</span><span class="br0">&#41;</span>.unwrap<span class="br0">&#40;</span><span class="br0">&#41;</span>;
    <span style="color: #0000ff;">let</span> p = s.as_ptr<span class="br0">&#40;</span><span class="br0">&#41;</span>;
    std::mem::forget<span class="br0">&#40;</span>s<span class="br0">&#41;</span>;
    p 
<span class="br0">&#125;</span></pre></td></tr></table></pre>
</div><br />
... puis lancer la compilation : <br />
<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:36px;">cargo build --release</pre>
</div>Vous obtenez le fichier <i>.so</i> correspondant. Éditons maintenant le fichier <i>.py</i> qui utilisera cette bibliothèque : <br />
<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 python3 :</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">import ctypes 

lib = ctypes.cdll.LoadLibrary(&quot;./target/release/libembed.so&quot;)

l = lib.depuis_rust() 

print( ctypes.c_char_p( l ).value ) 

l2 = lib.vers_rust( 
    ctypes.c_char_p( 
        &quot;tout ça : ²&amp;é\&quot;'(-è_çà)=&quot;.encode('utf-8') 
    ) 
) 

print( ctypes.c_char_p( l2 ).value )</pre></td></tr></table></pre>
</div><br />
L'exécution du script Python devrait retourner alors les chaînes attendues : <br />
<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: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">b'&amp; oui'
tout ça : ²&amp;é&quot;'(-è_çà)=
b'@ maison'</pre></td></tr></table></pre>
</div>Quelques observations : <br />
<ul><li style=""> la gestion des chaînes &quot;via&quot; le format utilisé par C (le caractère \0 en fin de chaîne) ;</li><li style=""> l'usage &quot;natif&quot; d'UTF-8 ;</li><li style=""> l'inadéquation de la gestion habituelle de Rust sur du texte (vecteur) avec ce qui est supporté par ctypes dans Python (évolution à venir ?) ;</li><li style=""> l'entête &quot;no_mangle&quot; (<i>aucune mutilation</i>) dans Rust, permet de respecter les standards du C lors de la compilation. </li></ul><br />
<br />
Un dernier point : l'usage de <i>std::mem::forget</i> peut sembler singulier au sein de <i>depuis_rust</i>. On demande explicitement &quot;l'oubli&quot; de la variable &quot;s&quot; dont on a demandé le pointeur juste avant (et on retourne ce pointeur). Pourquoi un tel comportement ? <a href="https://thefullsnack.com/en/string-ffi-rust.html" target="_blank">L'explication est logique</a>  : il s'agit d'abord de préserver l'intégrité des règles (de toute façon incontournables...) de Rust - qui est aussi sa sécurité et sa force. <br />
La variable &quot;s&quot; utilisée ici, est liée au contexte de la fonction. L'usage de <i>std::mem::forget</i> &quot;libère&quot; en quelque sorte le pointeur, et peut donc être utilisée ailleurs (cf. règle de propriété / partage). <br />
<br />
Voir aussi : <br />
<ul><li style=""> <a href="https://docs.python.org/3.7/library/ctypes.html" target="_blank">documentation Python 3 sur ctype</a></li><li style=""> <a href="https://doc.rust-lang.org/std/ffi/struct.CString.html" target="_blank">documentation Rust sur CString</a> (voir aussi CStr)</li><li style=""> <a href="https://michaeljung.dev/2017/11/12/passing-strings-from-python-to-rust/" target="_blank">article de blog (En.) traitant du sujet</a> </li></ul></blockquote>

]]></content:encoded>
			<dc:creator>Nothus</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/318041-nothus/b9033/pense-bete-rust-python-cas-strings-str-chaine-caracteres/</guid>
		</item>
		<item>
			<title>Parseur LISP naïf en Rust</title>
			<link>https://www.developpez.net/forums/blogs/318041-nothus/b8521/parseur-lisp-naif-rust/</link>
			<pubDate>Thu, 28 Nov 2019 15:47:54 GMT</pubDate>
			<description>Bonjour à tous,  
 
Edit du...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">Bonjour à tous, <br />
<br />
Edit du 29/11/2019 : ajout à la fin de l'article, de l'amélioration de la fonction de &quot;letters&quot;. <br />
<br />
La version présentée ci-dessous permet de parser du LISP (grammaire standard) et renvoie le résultat (une structure dont un arbre plat des atomes génériques trouvés) vers la sortie standard : <br />
- un atome qui soit au moins un symbole, un nombre, ou un mélange des deux ; <br />
- un atome de texte avec la compréhension de l'échappement du caractère séparateur ' &quot; ' ; <br />
- une liste qui soit une composée d'une série d'expressions (un ou plus) ; <br />
- une expression qui soit composée d'une liste ou d'un atome. <br />
<br />
La forme est naïve car elle fait appel à un grand nombre de fois à la fonction &quot;is&quot; qui parcours la chaine d'origine, en reprenant pour chaque caractère, depuis l'amorce (une version efficiente pour la compréhension mais pas efficace). Pour rendre le code plus efficace, se référer à la fonction &quot;text&quot; qui parcours à partir de l'indice en cours, jusqu'à la fin ou à un point d'arrêt et l'adapter au type d'atome. <br />
<br />
<b>Code produit pour un usage pédagogie, ne pas utiliser en production. </b><br />
<br />
Pour transformer un vecteur de caractères en string en Rust : <a href="https://stackoverflow.com/questions/23430735/how-to-convert-vecchar-to-a-string" target="_blank">voir ici</a>. <br />
<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 />221<br />222<br />223<br />224<br />225<br />226<br />227<br />228<br />229<br />230<br />231<br />232<br />233<br />234<br />235<br />236<br />237<br />238<br />239<br />240<br />241<br />242<br />243<br />244<br />245<br />246<br />247<br />248<br />249<br />250<br />251<br />252<br />253<br />254<br />255<br />256<br />257<br />258<br />259<br />260<br />261<br />262<br />263<br />264<br />265<br />266<br />267<br />268<br />269<br />270<br />271<br />272<br />273<br />274<br />275<br />276<br />277<br />278<br />279<br />280<br />281<br />282<br />283<br />284<br />285<br />286<br />287<br />288<br />289<br />290<br />291<br />292<br />293<br />294<br />295<br />296<br />297<br />298<br />299<br />300<br />301<br />302<br />303<br />304<br />305<br />306<br />307<br />308<br />309<br />310<br />311<br />312<br />313<br />314<br />315<br />316<br />317<br />318<br /></div></td><td valign="top"><pre style="margin: 0">
// #![allow(dead_code)] 
// #![allow(unused_must_use)] 

#[derive(Debug)] 
enum Atom { 
	EspaceNul, 
	ParentheseOuvrante, 
	ParentheseFermante, 
	Texte { debut: usize, fin: usize, contenu: Vec&lt;char&gt; },  
	Espaces { debut: usize, fin: usize, contenu: Vec&lt;char&gt; }, 
	Chiffres { debut: usize, fin: usize, contenu: Vec&lt;char&gt; }, 
	Lettres { debut: usize, fin: usize, contenu: Vec&lt;char&gt; }, 
}

#[derive(Debug)] 
struct Request { 
	chaine: String, 
	indice: usize, 
	arbre: Vec&lt;Atom&gt;
} 

fn is( requete: &amp;mut Request, cherche: Vec&lt;char&gt;, debut: usize ) -&gt; Result&lt;char, usize&gt; { 
	for (i, c) in requete.chaine.chars().enumerate() { 
    	if i&gt;=debut { 
	    	if cherche.contains( &amp;c ) { 
				return Result::Ok( c ); 
	    	} else { 
	    		return Result::Err( debut ); 
	    	} 
    	} 
	} 
	return Result::Err( debut ); 
} 

fn space( requete: &amp;mut Request, debut: usize ) -&gt; Result&lt;char, usize&gt; { 
	is( 
		requete, 
		vec![ '\r', '\n', '\t', ' ' ], 
		debut 
	) 
} 

fn spaces( requete: &amp;mut Request, debut: usize, ajout: bool ) -&gt; Result&lt;usize, usize&gt; { 
	let mut i: usize = debut; 
	let mut signes = Vec::new(); 
	while let Result::Ok( s ) = space( requete, i ) { 
		if ajout { 
			signes.push( s ); 
		} 
		i = i+1; 
	} 
	if i==debut { 
		Result::Err( debut ) 
	} else { 
		if ajout { 
			requete.arbre.push( Atom::Espaces { 
				debut: debut, 
				fin: i, 
				contenu: signes 
			} ); 
		} 
		Result::Ok( i ) 
	} 
} 

fn letter( requete: &amp;mut Request, debut: usize ) -&gt; Result&lt;char, usize&gt; { 
	is( 
		requete, 
		vec![ 
			'a', 'b', 'c', 'd', 'e', 'f', 
			'g', 'h', 'i', 'j', 'k', 'l', 
			'm', 'n', 'o', 'p', 'q', 'r', 
			's', 't', 'u', 'v', 'w', 'x', 
			'y', 'z' 
		], 
		debut 
	) 
} 

fn letters( requete: &amp;mut Request, debut: usize, ajout: bool ) -&gt; Result&lt;usize, usize&gt; { 
	let mut i: usize = debut; 
	let mut signes = Vec::new(); 
	while let Result::Ok( s ) = letter( requete, i ) { 
		if ajout { 
			signes.push( s ); 
		} 
		i = i+1; 
	} 
	if i==debut { 
		Result::Err( i ) 
	} else { 
		if ajout { 
			requete.arbre.push( Atom::Lettres { 
				debut: debut, 
				fin: i, 
				contenu: signes 
			} ); 
		} 
		Result::Ok( i ) 
	} 
} 

fn number( requete: &amp;mut Request, debut: usize ) -&gt; Result&lt;char, usize&gt; { 
	is( 
		requete, 
		vec![ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' ], 
		debut 
	) 
} 

fn numbers( requete: &amp;mut Request, debut: usize, ajout: bool ) -&gt; Result&lt;usize, usize&gt; { 
	let mut i: usize = debut; 
	let mut signes = Vec::new(); 
	while let Result::Ok( s ) = number( requete, i ) { 
		if ajout { 
			signes.push( s ); 
		} 
		i = i+1; 
	} 
	if i==debut { 
		Result::Err( debut ) 
	} else { 
		if ajout {
			requete.arbre.push( Atom::Chiffres { 
				debut: debut, 
				fin: i, 
				contenu: signes 
			} ); 
		}
		Result::Ok( i ) 
	} 
} 

fn text( requete: &amp;mut Request, debut: usize, ajout: bool ) -&gt; Result&lt;usize, usize&gt; { 
	let mut text: Vec&lt;char&gt; = Vec::new(); 
	if let Result::Ok( s ) = is( requete, vec![ '&quot;' ], debut ) { 
		let mut precedent = s; 
		text.push( s ); 
		for (n, c) in requete.chaine.chars().enumerate() { 
	    	if n&gt;=debut+1 { 
	    		match c { 
	    			'&quot;' if precedent != '\\' =&gt; { 
	    				if ajout {
		    				requete.arbre.push( Atom::Texte { 
								debut: debut, 
								fin: n, 
								contenu: text  
							} ); 
	    				}
						return Result::Ok( n+1 ); 
	    			}, 
	    			'&quot;' if precedent == '\\' =&gt; { 
	    				precedent = c; 
    					text.push( c ); 
	    			} 
	    			_ =&gt; {
	    				precedent = c; 
	    				text.push( c ); 
	    			}, 
	    		} 
	    	} 
		} 
	} 
	return Result::Err( debut ); 
} 

fn atom( requete: &amp;mut Request, debut: usize, ajout: bool ) -&gt; Result&lt;usize, usize&gt; { 
	if let Result::Ok( v ) = text( requete, debut, ajout ) { 
		return Result::Ok( v ); 
	} 
	if let Result::Ok( v ) = letters( requete, debut, ajout ) { 
		return Result::Ok( v ); 
	} 
	if let Result::Ok( v ) = numbers( requete, debut, ajout ) { 
		return Result::Ok( v ); 
	} 
	Result::Err( debut ) 
} 

fn atoms( requete: &amp;mut Request, debut: usize ) -&gt; Result&lt;usize, usize&gt; { 
	let mut i: usize = debut; 
	while let Result::Ok( y ) = atom( requete, i, true ) { 
		i = y; 
	} 
	if i==debut { 
		Result::Err( debut ) 
	} else { 
		Result::Ok( i ) 
	} 
} 

fn list( requete: &amp;mut Request, debut: usize ) -&gt; Result&lt;usize, usize&gt; { 
	let mut i: usize = debut; 
	if let Result::Ok( .. ) = is( requete, vec![ '(' ], i ) { 
		i = i+1; 
		requete.arbre.push( Atom::ParentheseOuvrante ); 
		while let Result::Ok( y ) = expression( requete, i ) { 
			i = y; 
		} 
		if let Result::Ok( .. ) = is( requete, vec![ ')' ], i ) { 
			requete.arbre.push( Atom::ParentheseFermante ); 
			return Result::Ok( i+1 ); 
		} 
	} 
	return Result::Err( debut ); 
} 

fn nettoyer( requete: &amp;mut Request, debut: usize ) -&gt; usize { 
	if let Result::Ok( v ) = spaces( requete, debut, false ) { 
		requete.arbre.push( Atom::EspaceNul ); 
		return v; 
	} else { 
		return debut; 
	} 
} 

fn expression( requete: &amp;mut Request, debut: usize ) -&gt; Result&lt;usize, usize&gt; { 
	let mut i: usize = nettoyer( requete, debut ); 
	if let Result::Ok( y ) = list( requete, i ) { 
		i = y;  
	} else { 
		if let Result::Ok( y) = atoms( requete, i ) { 
			i = y; 
		} 
	} 
	if i==debut {  
		Result::Err( debut ) 
	} else { 
		Result::Ok( i ) 
	} 
} 

fn resoudre( requete: &amp;mut Request ) -&gt; Result&lt;usize, usize&gt; { 
	let mut i: usize = requete.indice; 
	while let Result::Ok( y ) = expression( requete, i ) { 
		i = y; 
	} 
	requete.indice = nettoyer( requete, i ); 
	if requete.indice!=requete.chaine.chars().count() {
		return Result::Err( requete.indice ); 
	} else { 
		return Result::Ok( requete.indice ); 
	} 
} 

fn main() { 

	let mut requetes = Vec::new(); 

	requetes.push( 
		Request{ 
	    	chaine: &quot;123&quot;.to_string(), 
	    	indice: 0, 
	    	arbre: Vec::new()  
	    }
	); 

	requetes.push( 
		Request{ 
	    	chaine: &quot;abc&quot;.to_string(), 
	    	indice: 0, 
	    	arbre: Vec::new()  
	    }
	); 

	requetes.push( 
		Request{ 
	    	chaine: &quot;	\&quot;ab\\\&quot;cd\&quot;	&quot;.to_string(), 
	    	indice: 0, 
	    	arbre: Vec::new()  
	    }
	); 

	requetes.push( 
		Request{ 
	    	chaine: &quot;	\&quot;a\\\&quot;bc\&quot;\&quot;	&quot;.to_string(), 
	    	indice: 0, 
	    	arbre: Vec::new()  
	    }
	); 

	requetes.push( 
		Request{ 
	    	chaine: &quot;(123)&quot;.to_string(), 
	    	indice: 0, 
	    	arbre: Vec::new()  
	    }
	); 

	requetes.push( 
		Request{ 
	    	chaine: &quot;(123 (abc))&quot;.to_string(), 
	    	indice: 0, 
	    	arbre: Vec::new()  
	    }
	); 

	requetes.push( 
		Request{ 
	    	chaine: &quot;(123 (abc&quot;.to_string(), 
	    	indice: 0, 
	    	arbre: Vec::new()  
	    }, 
	); 

    for r in requetes { 
    	println!(&quot;---------------&quot;); 
    	let mut requete = r; 
	    if let Result::Ok( .. ) = resoudre( &amp;mut requete ) { 
	    	println!( &quot;\nLe parsing s'est correctement déroulé {:?}&quot;, requete ); 
	    } else { 
	    	println!( &quot;\nAttention, l'expression donnée \n{:?}\n... n'est pas valide LISP&quot;, requete.chaine ); 
	    } 
	    println!(&quot;&quot;); 
	} 

}</pre></td></tr></table></pre>
</div><br />
... devrait vous retourner (<i>cargo run</i>) : <br />
<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 />30<br />31<br />32<br />33<br />34<br />35<br /></div></td><td valign="top"><pre style="margin: 0">julien@rdfnquads:~/dev/rust/rustlispparser$ cargo run
   Compiling rustlispparser v0.1.0 (/home/julien/dev/rust/rustlispparser)
    Finished dev [unoptimized + debuginfo] target(s) in 0.78s
     Running `target/debug/rustlispparser`
---------------

Le parsing s'est correctement déroulé Request { chaine: &quot;123&quot;, indice: 3, arbre: [Chiffres { debut: 0, fin: 3, contenu: ['1', '2', '3'] }] }

---------------

Le parsing s'est correctement déroulé Request { chaine: &quot;abc&quot;, indice: 3, arbre: [Lettres { debut: 0, fin: 3, contenu: ['a', 'b', 'c'] }] }

---------------

Le parsing s'est correctement déroulé Request { chaine: &quot;\t\&quot;ab\\\&quot;cd\&quot;\t&quot;, indice: 10, arbre: [EspaceNul, Texte { debut: 1, fin: 8, contenu: ['\&quot;', 'a', 'b', '\\', '\&quot;', 'c', 'd'] }, EspaceNul] }

---------------

Attention, l'expression donnée
&quot;\t\&quot;a\\\&quot;bc\&quot;\&quot;\t&quot;
... n'est pas valide LISP

---------------

Le parsing s'est correctement déroulé Request { chaine: &quot;(123)&quot;, indice: 5, arbre: [ParentheseOuvrante, Chiffres { debut: 1, fin: 4, contenu: ['1', '2', '3'] }, ParentheseFermante] }

---------------

Le parsing s'est correctement déroulé Request { chaine: &quot;(123 (abc))&quot;, indice: 11, arbre: [ParentheseOuvrante, Chiffres { debut: 1, fin: 4, contenu: ['1', '2', '3'] }, EspaceNul, ParentheseOuvrante, Lettres { debut: 6, fin: 9, contenu: ['a', 'b', 'c'] }, ParentheseFermante, ParentheseFermante] }

---------------

Attention, l'expression donnée
&quot;(123 (abc&quot;
... n'est pas valide LISP</pre></td></tr></table></pre>
</div><b>Mise à jour du 29/11/2019 : </b><br />
<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 />30<br />31<br />32<br />33<br /></div></td><td valign="top"><pre style="margin: 0">fn letters( requete: &amp;mut Request, debut: usize, ajout: bool ) -&gt; Result&lt;usize, usize&gt; { 
	let mut i: usize = debut; 
	let mut signes = Vec::new(); 
	let alphabet = vec![ 
		'a', 'b', 'c', 'd', 'e', 'f', 
		'g', 'h', 'i', 'j', 'k', 'l', 
		'm', 'n', 'o', 'p', 'q', 'r', 
		's', 't', 'u', 'v', 'w', 'x', 
		'y', 'z' 
	]; 
	for (y, c) in requete.chaine.chars().enumerate() { 
		if y&gt;=debut { 
	    	if alphabet.contains( &amp;c ) { 
				i = i+1; 
				signes.push( c ); 
	    	} else { 
	    		break; 
	    	} 
		} 
	} 
	if signes.len()&gt;0 {
		if ajout { 
			requete.arbre.push( Atom::Lettres { 
				debut: debut, 
				fin: i, 
				contenu: signes 
			} ); 
		} 
		Result::Ok( i ) 
	} else { 
		Result::Err( debut ) 
	} 
}</pre></td></tr></table></pre>
</div>Bon code à tous !</blockquote>

]]></content:encoded>
			<dc:creator>Nothus</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/318041-nothus/b8521/parseur-lisp-naif-rust/</guid>
		</item>
		<item>
			<title><![CDATA[[LISP] Deux méthodes de remplissage d'une matrice à partir d'un vecteur]]></title>
			<link>https://www.developpez.net/forums/blogs/318041-nothus/b7477/lisp-methodes-remplissage-d-matrice-partir-d-vecteur/</link>
			<pubDate>Fri, 10 May 2019 16:15:07 GMT</pubDate>
			<description>Ici une matrice finale de 4x4...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">Ici une matrice finale de 4x4 depuis un vecteur de 16 éléments. Deux solutions différentes : <br />
- une imbrication de boucles, permettant d'avoir un accès aux deux dimensions de la matrice avec une variable locale incrémentée (pas de 1) ; <br />
- une seule boucle, dont on applique au numéro de l'itération une division euclidienne (quotient et reste forment les deux dimensions de la matrice). <br />
<br />
nb : la même matrice est réutilisée, ce qui ne serait probablement pas le cas dans un usage de production (ce qui explique des valeurs très basses, car on y mesure seulement les temps d'accès et d'affectation cellule du vecteur -&gt; cellule de la matrice). <br />
<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 lisp :</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 /></div></td><td valign="top"><pre style="margin: 0">#!/usr/bin/sbcl --script 
&nbsp;
<span class="br0">&#40;</span><span style="color: #0000ff;">defvar</span> 
	original 
	#<span class="br0">&#40;</span> 
		<span style="color: #cc66cc;">87</span> <span style="color: #cc66cc;">139</span> <span style="color: #cc66cc;">166</span> <span style="color: #cc66cc;">249</span> <span style="color: #cc66cc;">95</span> 
		<span style="color: #cc66cc;">108</span> <span style="color: #cc66cc;">185</span> <span style="color: #cc66cc;">163</span> <span style="color: #cc66cc;">62</span> <span style="color: #cc66cc;">218</span> 
		<span style="color: #cc66cc;">158</span> <span style="color: #cc66cc;">164</span> <span style="color: #cc66cc;">20</span> <span style="color: #cc66cc;">210</span> <span style="color: #cc66cc;">129</span> 
		<span style="color: #cc66cc;">251</span>
	<span class="br0">&#41;</span> 
<span class="br0">&#41;</span> 
&nbsp;
<span class="br0">&#40;</span><span style="color: #0000ff;">defvar</span> 
	matrice 
	<span class="br0">&#40;</span><span style="color: #0080ff;">make-array</span> 
		'<span class="br0">&#40;</span><span style="color: #cc66cc;">4</span> <span style="color: #cc66cc;">4</span><span class="br0">&#41;</span> 
		<span style="color: #339933;">:initial-element</span> <span style="color: #cc66cc;">0</span>
	<span class="br0">&#41;</span> 
<span class="br0">&#41;</span>
&nbsp;
<span class="br0">&#40;</span><span style="color: #0000ff;">defun</span> remplir-matrice-4x4 <span class="br0">&#40;</span>matrice vecteur<span class="br0">&#41;</span>
	<span class="br0">&#40;</span><span style="color: #0000ff;">let</span> 
		<span class="br0">&#40;</span> 
			<span class="br0">&#40;</span>i <span style="color: #cc66cc;">0</span><span class="br0">&#41;</span> 
		<span class="br0">&#41;</span> 
		<span class="br0">&#40;</span><span style="color: #0000ff;">dotimes</span> <span class="br0">&#40;</span>n <span style="color: #cc66cc;">4</span><span class="br0">&#41;</span> 
			<span class="br0">&#40;</span><span style="color: #0000ff;">dotimes</span> <span class="br0">&#40;</span>m <span style="color: #cc66cc;">4</span><span class="br0">&#41;</span>
				<span class="br0">&#40;</span><span style="color: #0000ff;">setf</span> 
					<span class="br0">&#40;</span><span style="color: #0080ff;">aref</span> matrice n m<span class="br0">&#41;</span> 
					<span class="br0">&#40;</span><span style="color: #0080ff;">aref</span> vecteur i<span class="br0">&#41;</span> 
				<span class="br0">&#41;</span> 
				<span class="br0">&#40;</span><span style="color: #0000ff;">setf</span> i <span class="br0">&#40;</span><span style="color: #cc66cc;">1</span>+ i<span class="br0">&#41;</span><span class="br0">&#41;</span> 
			<span class="br0">&#41;</span> 
		<span class="br0">&#41;</span> 
		matrice
	<span class="br0">&#41;</span> 
<span class="br0">&#41;</span> 
&nbsp;
<span class="br0">&#40;</span><span style="color: #0000ff;">defun</span> remplir-matrice-4x4-modulo <span class="br0">&#40;</span>matrice vecteur<span class="br0">&#41;</span> 
	<span class="br0">&#40;</span><span style="color: #0000ff;">dotimes</span> <span class="br0">&#40;</span>i <span style="color: #cc66cc;">16</span><span class="br0">&#41;</span> 
		<span class="br0">&#40;</span><span style="color: #0000ff;">multiple-value-bind</span> 
			<span class="br0">&#40;</span>n m<span class="br0">&#41;</span> 
			<span class="br0">&#40;</span><span style="color: #0080ff;">floor</span> i <span style="color: #cc66cc;">4</span><span class="br0">&#41;</span> 
			<span class="br0">&#40;</span><span style="color: #0000ff;">setf</span> 
				<span class="br0">&#40;</span><span style="color: #0080ff;">aref</span> matrice n m<span class="br0">&#41;</span> 
				<span class="br0">&#40;</span><span style="color: #0080ff;">aref</span> vecteur i<span class="br0">&#41;</span> 
			<span class="br0">&#41;</span> 
		<span class="br0">&#41;</span> 
	<span class="br0">&#41;</span> 
	matrice 
<span class="br0">&#41;</span> 
&nbsp;
<span class="br0">&#40;</span><span style="color: #0080ff;">print</span> 
	<span class="br0">&#40;</span>remplir-matrice-4x4 matrice original<span class="br0">&#41;</span> 
<span class="br0">&#41;</span> 
&nbsp;
<span class="br0">&#40;</span><span style="color: #0000ff;">time</span> <span class="br0">&#40;</span><span style="color: #0000ff;">dotimes</span> <span class="br0">&#40;</span>n <span style="color: #cc66cc;">1000000</span><span class="br0">&#41;</span> 
	<span class="br0">&#40;</span>remplir-matrice-4x4 matrice original<span class="br0">&#41;</span>
<span class="br0">&#41;</span><span class="br0">&#41;</span> 
&nbsp;
<span class="br0">&#40;</span><span style="color: #0080ff;">print</span> 
	<span class="br0">&#40;</span>remplir-matrice-4x4-modulo matrice original<span class="br0">&#41;</span> 
<span class="br0">&#41;</span> 
&nbsp;
<span class="br0">&#40;</span><span style="color: #0000ff;">time</span> <span class="br0">&#40;</span><span style="color: #0000ff;">dotimes</span> <span class="br0">&#40;</span>n <span style="color: #cc66cc;">1000000</span><span class="br0">&#41;</span> 
	<span class="br0">&#40;</span>remplir-matrice-4x4-modulo matrice original<span class="br0">&#41;</span> 
<span class="br0">&#41;</span><span class="br0">&#41;</span></pre></td></tr></table></pre>
</div><br />
Les deux résultats sont sensiblement les mêmes depuis ma console... <br />
<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 /></div></td><td valign="top"><pre style="margin: 0">#2A((87 139 166 249) (95 108 185 163) (62 218 158 164) (20 210 129 251)) 
Evaluation took:
  0.159 seconds of real time
  0.159265 seconds of total run time (0.159107 user, 0.000158 system)
  100.00% CPU
  351,662,692 processor cycles
  0 bytes consed 

#2A((87 139 166 249) (95 108 185 163) (62 218 158 164) (20 210 129 251)) 
Evaluation took:
  0.156 seconds of real time
  0.155932 seconds of total run time (0.155926 user, 0.000006 system)
  100.00% CPU
  344,295,288 processor cycles
  0 bytes consed</pre></td></tr></table></pre>
</div></blockquote>

]]></content:encoded>
			<dc:creator>Nothus</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/318041-nothus/b7477/lisp-methodes-remplissage-d-matrice-partir-d-vecteur/</guid>
		</item>
		<item>
			<title><![CDATA[[LISP] "Coroutines" simples et SBCL]]></title>
			<link>https://www.developpez.net/forums/blogs/318041-nothus/b7302/lisp-coroutines-simples-sbcl/</link>
			<pubDate>Tue, 16 Apr 2019 08:54:39 GMT</pubDate>
			<description><![CDATA[Ne trouvant mon bonheur, j'ai...]]></description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">Ne trouvant mon bonheur, j'ai testé quelques combinaisons pour me rapprocher des coroutines... <b>Il ne s'agit pas réellement de coroutines,</b> car il n'y a pas suspension de l'exécution d'une fonction. La lambda utilisée ici comme un itérateur (closure), peut recevoir des arguments lors de l'appel (ce n'est pas le cas dans mon exemple). Ainsi vous pouvez facilement émettre et recevoir à chaque appel des valeurs. <br />
<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 lisp :</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 /></div></td><td valign="top"><pre style="margin: 0"><span class="br0">&#40;</span><span style="color: #0000ff;">define-condition</span> coroutine-terminee <span class="br0">&#40;</span><span style="color: #0000ff;"><span style="color: #0080ff;">error</span></span><span class="br0">&#41;</span>
	<span class="br0">&#40;</span> <span class="br0">&#40;</span>message <span style="color: #339933;">:initarg</span> <span style="color: #339933;">:message</span><span class="br0">&#41;</span> <span class="br0">&#41;</span>
<span class="br0">&#41;</span> 
&nbsp;
<span class="br0">&#40;</span><span style="color: #0000ff;">defmacro</span> coroutiner-simple <span class="br0">&#40;</span>corps<span class="br0">&#41;</span> 
	`<span class="br0">&#40;</span><span style="color: #0000ff;">let</span> 
		<span class="br0">&#40;</span> <span class="br0">&#40;</span>corps ,corps<span class="br0">&#41;</span> <span class="br0">&#40;</span>etape <span style="color: #0080ff;">nil</span><span class="br0">&#41;</span> <span class="br0">&#41;</span> 
		<span class="br0">&#40;</span>lambda <span class="br0">&#40;</span><span class="br0">&#41;</span> 
			<span class="br0">&#40;</span><span style="color: #0000ff;">setf</span> etape <span class="br0">&#40;</span><span style="color: #0080ff;">car</span> corps<span class="br0">&#41;</span><span class="br0">&#41;</span> 
			<span class="br0">&#40;</span><span style="color: #0000ff;">setf</span> corps <span class="br0">&#40;</span><span style="color: #0080ff;">cdr</span> corps<span class="br0">&#41;</span><span class="br0">&#41;</span> 
			<span class="br0">&#40;</span><span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span style="color: #0080ff;">eq</span> etape <span style="color: #0080ff;">nil</span><span class="br0">&#41;</span> 
				<span class="br0">&#40;</span><span style="color: #0000ff;"><span style="color: #0080ff;">error</span></span> <span style="color: #339933;">'coroutine-terminee</span> <span style="color: #339933;">:message</span> <span style="color: #FF0000;">&quot;coroutine termin&eacute;e&quot;</span><span class="br0">&#41;</span> <span style="color: #808080;">; inutile de continuer &agrave; renvoyer &quot;nil&quot; </span>
				<span class="br0">&#40;</span><span style="color: #0080ff;">eval</span> etape<span class="br0">&#41;</span> 
			<span class="br0">&#41;</span> 
		<span class="br0">&#41;</span> 
	<span class="br0">&#41;</span> 
<span class="br0">&#41;</span> 
&nbsp;
<span style="color: #808080; font-weight: bold;">;;; Test n&deg;1 </span>
&nbsp;
<span class="br0">&#40;</span><span style="color: #0000ff;">defvar</span> test <span class="br0">&#40;</span>coroutiner-simple '<span class="br0">&#40;</span> 
	<span class="br0">&#40;</span><span style="color: #0080ff;">print</span> <span style="color: #FF0000;">&quot;ok&quot;</span><span class="br0">&#41;</span> 
	<span class="br0">&#40;</span><span style="color: #0080ff;">print</span> <span style="color: #FF0000;">&quot;ko&quot;</span><span class="br0">&#41;</span>
<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> 
&nbsp;
<span class="br0">&#40;</span><span style="color: #0080ff;">funcall</span> test<span class="br0">&#41;</span> <span style="color: #808080;">; &eacute;tape 1 / affichera &quot;ok&quot; </span>
<span class="br0">&#40;</span><span style="color: #0080ff;">funcall</span> test<span class="br0">&#41;</span> <span style="color: #808080;">; &eacute;tape 2 / affichera &quot;ko&quot; </span>
<span class="br0">&#40;</span><span style="color: #0080ff;">funcall</span> test<span class="br0">&#41;</span> <span style="color: #808080;">; &eacute;tape ? / l&egrave;ve une erreur (la coroutine a termin&eacute;e) </span>
&nbsp;
<span style="color: #808080; font-weight: bold;">;;; Test n&deg;2 </span>
&nbsp;
<span class="br0">&#40;</span><span style="color: #0000ff;">defvar</span> test2 <span class="br0">&#40;</span>coroutiner-simple '<span class="br0">&#40;</span>
	<span class="br0">&#40;</span> <span class="br0">&#40;</span><span style="color: #0080ff;">print</span> <span style="color: #FF0000;">&quot;d&eacute;but&quot;</span><span class="br0">&#41;</span> <span class="br0">&#40;</span><span style="color: #0080ff;">print</span> <span style="color: #FF0000;">&quot;0&quot;</span><span class="br0">&#41;</span> <span class="br0">&#41;</span> <span style="color: #808080;">; &eacute;valuation impossible (expression incorrecte) </span>
	<span class="br0">&#40;</span><span style="color: #0080ff;">print</span> <span style="color: #FF0000;">&quot;1&quot;</span><span class="br0">&#41;</span> 
	<span class="br0">&#40;</span><span style="color: #0080ff;">print</span> <span style="color: #FF0000;">&quot;2&quot;</span><span class="br0">&#41;</span>
<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span style="color: #808080;">; ne fonctionnera pas </span>
&nbsp;
<span style="color: #808080; font-weight: bold;">;;; Test n&deg;3 </span>
&nbsp;
<span class="br0">&#40;</span><span style="color: #0000ff;">defvar</span> test3 <span class="br0">&#40;</span>coroutiner-simple '<span class="br0">&#40;</span> 
	<span class="br0">&#40;</span><span style="color: #0000ff;">progn</span> <span class="br0">&#40;</span><span style="color: #0080ff;">print</span> <span style="color: #FF0000;">&quot;d&eacute;but&quot;</span><span class="br0">&#41;</span> <span class="br0">&#40;</span><span style="color: #0080ff;">print</span> <span style="color: #FF0000;">&quot;0&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> 
	<span class="br0">&#40;</span><span style="color: #0080ff;">print</span> <span style="color: #FF0000;">&quot;1&quot;</span><span class="br0">&#41;</span> 
	<span class="br0">&#40;</span><span style="color: #0080ff;">print</span> <span style="color: #FF0000;">&quot;2&quot;</span><span class="br0">&#41;</span> 
<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> 
&nbsp;
<span class="br0">&#40;</span><span style="color: #0080ff;">funcall</span> test3<span class="br0">&#41;</span> <span style="color: #808080;">; &eacute;tape 1 / affichera &quot;d&eacute;but&quot; puis &quot;0&quot; </span>
<span class="br0">&#40;</span><span style="color: #0080ff;">funcall</span> test3<span class="br0">&#41;</span> <span style="color: #808080;">; &eacute;tape 2 / affichera &quot;1&quot; </span>
<span class="br0">&#40;</span><span style="color: #0080ff;">funcall</span> test3<span class="br0">&#41;</span> <span style="color: #808080;">; &eacute;tape 3 / affichera &quot;2&quot; </span>
<span style="color: #808080;">; un appel suppl&eacute;mentaire provoquera une erreur (la coroutine a termin&eacute;e)</span></pre></td></tr></table></pre>
</div><br />
Édition, même jour : la même version, à cette différence que la coroutine est enregistrée dans une variable globale et dont l'avancement se fait via une fonction qui a pour argument le nom de la coroutine voulue. L'intérêt à terme étant d'avoir une boucle unique des coroutines, afin de les gérer collectivement. Attention, une fonction bloquante reste bloquante... pour l'ensemble. <br />
<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 lisp :</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 /></div></td><td valign="top"><pre style="margin: 0">#!/usr/bin/sbcl --script 
&nbsp;
<span class="br0">&#40;</span><span style="color: #0000ff;">defparameter</span> *coroutines* <span class="br0">&#40;</span><span style="color: #0080ff;">make-hash-table</span> <span style="color: #339933;">:test</span> <span style="color: #339933;">'equal</span><span class="br0">&#41;</span><span class="br0">&#41;</span> 
&nbsp;
<span class="br0">&#40;</span><span style="color: #0000ff;">define-condition</span> coroutine-terminee <span class="br0">&#40;</span><span style="color: #0000ff;"><span style="color: #0080ff;">error</span></span><span class="br0">&#41;</span>
	<span class="br0">&#40;</span> <span class="br0">&#40;</span>message <span style="color: #339933;">:initarg</span> <span style="color: #339933;">:message</span><span class="br0">&#41;</span> <span class="br0">&#41;</span>
<span class="br0">&#41;</span> 
&nbsp;
<span class="br0">&#40;</span><span style="color: #0000ff;">defmacro</span> coroutiner-simple <span class="br0">&#40;</span>nom corps<span class="br0">&#41;</span> 
	`<span class="br0">&#40;</span><span style="color: #0000ff;">let</span> 
		<span class="br0">&#40;</span> <span class="br0">&#40;</span>corps ,corps<span class="br0">&#41;</span> <span class="br0">&#40;</span>etape <span style="color: #0080ff;">nil</span><span class="br0">&#41;</span> <span class="br0">&#40;</span>clos <span style="color: #0080ff;">nil</span><span class="br0">&#41;</span> <span class="br0">&#41;</span> 
		<span class="br0">&#40;</span><span style="color: #0000ff;">setf</span> 
			clos 
			<span class="br0">&#40;</span>lambda <span class="br0">&#40;</span><span class="br0">&#41;</span> 
				<span class="br0">&#40;</span><span style="color: #0000ff;">setf</span> etape <span class="br0">&#40;</span><span style="color: #0080ff;">car</span> corps<span class="br0">&#41;</span><span class="br0">&#41;</span> 
				<span class="br0">&#40;</span><span style="color: #0000ff;">setf</span> corps <span class="br0">&#40;</span><span style="color: #0080ff;">cdr</span> corps<span class="br0">&#41;</span><span class="br0">&#41;</span> 
				<span class="br0">&#40;</span><span style="color: #0000ff;">if</span> <span class="br0">&#40;</span><span style="color: #0080ff;">eq</span> etape <span style="color: #0080ff;">nil</span><span class="br0">&#41;</span> 
					<span class="br0">&#40;</span><span style="color: #0000ff;"><span style="color: #0080ff;">error</span></span> 
						<span style="color: #339933;">'coroutine-terminee</span> 
						<span style="color: #339933;">:message</span> <span style="color: #FF0000;">&quot;coroutine termin&eacute;e&quot;</span>
					<span class="br0">&#41;</span> 
					<span class="br0">&#40;</span><span style="color: #0000ff;">progn</span> 
						<span class="br0">&#40;</span><span style="color: #0080ff;">eval</span> etape<span class="br0">&#41;</span> 
						<span class="br0">&#40;</span>force-output<span class="br0">&#41;</span> <span style="color: #808080;">; &eacute;vite un arr&ecirc;t du script avant l'affichage dans notre cas </span>
					<span class="br0">&#41;</span> 
				<span class="br0">&#41;</span> 
			<span class="br0">&#41;</span> 
		<span class="br0">&#41;</span> 
		<span class="br0">&#40;</span><span style="color: #0000ff;">setf</span> <span class="br0">&#40;</span><span style="color: #0080ff;">gethash</span> ,nom *coroutines*<span class="br0">&#41;</span> clos<span class="br0">&#41;</span> 
	<span class="br0">&#41;</span> 
<span class="br0">&#41;</span> 
&nbsp;
<span class="br0">&#40;</span><span style="color: #0000ff;">defun</span> coroutine-avancer <span class="br0">&#40;</span>nom<span class="br0">&#41;</span> 
	<span class="br0">&#40;</span><span style="color: #0080ff;">funcall</span> <span class="br0">&#40;</span><span style="color: #0080ff;">gethash</span> nom *coroutines*<span class="br0">&#41;</span><span class="br0">&#41;</span> 
<span class="br0">&#41;</span> 
&nbsp;
<span class="br0">&#40;</span>coroutiner-simple <span style="color: #FF0000;">&quot;test&quot;</span> '<span class="br0">&#40;</span> 
	<span class="br0">&#40;</span><span style="color: #0080ff;">print</span> <span style="color: #FF0000;">&quot;ok&quot;</span><span class="br0">&#41;</span> 
	<span class="br0">&#40;</span><span style="color: #0080ff;">print</span> <span style="color: #FF0000;">&quot;ko&quot;</span><span class="br0">&#41;</span>
<span class="br0">&#41;</span><span class="br0">&#41;</span> 
&nbsp;
<span class="br0">&#40;</span>coroutine-avancer <span style="color: #FF0000;">&quot;test&quot;</span><span class="br0">&#41;</span> <span style="color: #808080;">; &eacute;tape 1 / afficher &quot;ok&quot; </span>
<span style="color: #808080;">; (coroutine-avancer &quot;test&quot;) ; &eacute;tape 2 / afficher &quot;ko&quot;</span></pre></td></tr></table></pre>
</div><br />
Un exemple avec une variable &quot;interne&quot; : <br />
<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 lisp :</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 class="br0">&#40;</span>coroutiner-simple <span style="color: #FF0000;">&quot;test2&quot;</span> '<span class="br0">&#40;</span> 
	<span class="br0">&#40;</span><span style="color: #0080ff;">print</span> <span style="color: #FF0000;">&quot;d&eacute;but&quot;</span><span class="br0">&#41;</span> 
	<span class="br0">&#40;</span><span style="color: #0000ff;">defvar</span> i <span style="color: #cc66cc;">0</span><span class="br0">&#41;</span>
	<span class="br0">&#40;</span><span style="color: #0080ff;">print</span> i<span class="br0">&#41;</span> 
	<span class="br0">&#40;</span><span style="color: #0000ff;">setf</span> i <span style="color: #cc66cc;">1</span><span class="br0">&#41;</span> 
	<span class="br0">&#40;</span><span style="color: #0080ff;">print</span> i<span class="br0">&#41;</span> 
	<span class="br0">&#40;</span><span style="color: #0080ff;">print</span> <span style="color: #FF0000;">&quot;fin&quot;</span><span class="br0">&#41;</span> 
<span class="br0">&#41;</span><span class="br0">&#41;</span> 
&nbsp;
<span class="br0">&#40;</span>coroutine-avancer <span style="color: #FF0000;">&quot;test2&quot;</span><span class="br0">&#41;</span> <span style="color: #808080;">; &quot;d&eacute;but&quot;</span>
<span class="br0">&#40;</span>coroutine-avancer <span style="color: #FF0000;">&quot;test2&quot;</span><span class="br0">&#41;</span> <span style="color: #808080;">; (rien) </span>
<span class="br0">&#40;</span>coroutine-avancer <span style="color: #FF0000;">&quot;test2&quot;</span><span class="br0">&#41;</span> <span style="color: #808080;">; 0 </span>
<span class="br0">&#40;</span>coroutine-avancer <span style="color: #FF0000;">&quot;test2&quot;</span><span class="br0">&#41;</span> <span style="color: #808080;">; (rien) </span>
<span class="br0">&#40;</span>coroutine-avancer <span style="color: #FF0000;">&quot;test2&quot;</span><span class="br0">&#41;</span> <span style="color: #808080;">; &quot;1&quot; </span>
<span class="br0">&#40;</span>coroutine-avancer <span style="color: #FF0000;">&quot;test2&quot;</span><span class="br0">&#41;</span> <span style="color: #808080;">; &quot;fin&quot;</span></pre></td></tr></table></pre>
</div><br />
Bon code à tous !</blockquote>

]]></content:encoded>
			<dc:creator>Nothus</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/318041-nothus/b7302/lisp-coroutines-simples-sbcl/</guid>
		</item>
		<item>
			<title><![CDATA[[Python] Script pour un service mandataire TCP asynchrone avec TLS]]></title>
			<link>https://www.developpez.net/forums/blogs/318041-nothus/b7181/python-script-service-mandataire-tcp-asynchrone-tls/</link>
			<pubDate>Tue, 26 Mar 2019 09:15:05 GMT</pubDate>
			<description>Bonjour,  
 
Pour ceux que ça...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">Bonjour, <br />
<br />
Pour ceux que ça intéresse, un petit script fonctionnel pour disposer d'un mandataire TCP. <br />
<ul><li style=""> Le port en écoute vers l'extérieur peut être chiffré (TLS).</li><li style=""> Le port en écoute vers le service est en clair (et en local). </li></ul><br />
<br />
Deux tâches asynchrones sont lancées pour transmettre à l'un ou l'autre le contenu (sans attendre un échange formalisé ou &quot;protocolisé&quot;). Ce mandataire fonctionne avec HTTP et d'autres protocoles. <br />
<br />
Le script est à retrouver ici : <br />
<a href="https://github.com/JGarderon/Mandat/blob/master/mandat.py" target="_blank">https://github.com/JGarderon/Mandat/...ster/mandat.py</a> <br />
<br />
N'hésitez pas à me signaler toute erreur de programmation / anomalie ! <br />
<br />
Julien.</blockquote>

]]></content:encoded>
			<dc:creator>Nothus</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/318041-nothus/b7181/python-script-service-mandataire-tcp-asynchrone-tls/</guid>
		</item>
		<item>
			<title><![CDATA[[LISP] Récupérer les informations sur une structure puis parcourir les slots de ses instances]]></title>
			<link>https://www.developpez.net/forums/blogs/318041-nothus/b7089/lisp-recuperer-informations-structure-puis-parcourir-slots-instances/</link>
			<pubDate>Mon, 04 Mar 2019 15:03:07 GMT</pubDate>
			<description>Lorsque vous utilisez des...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">Lorsque vous utilisez des structures sous LISP, il peut ne pas être évident de savoir quels slots sont définis, notamment lors de la reprise d'une image. Ou simplement pour renvoyer de manière la plus simple et rapide possible, la liste dans un flux. <br />
<br />
Pour réaliser ceci, je me suis penché <a href="https://github.com/sbcl/sbcl/blob/master/src/code/describe.lisp" target="_blank">sur le fonctionnement de <i>describe</i></a>, que je vous invite fortement à découvrir dans le détail. <br />
<font size="1">-&gt; Voir tout particulièrement <i>(defmethod describe-object ((symbol symbol) stream) ... </i></font> <br />
<br />
Admettons que vous ayez une structure &quot;triplet&quot; définie ainsi : <br />
<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 lisp :</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:144px;"><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 />8<br />9<br /></div></td><td valign="top"><pre style="margin: 0"><span class="br0">&#40;</span><span style="color: #0000ff;">defstruct</span> triplet 
    <span class="br0">&#40;</span>groupe <span style="color: #cc66cc;">0</span><span class="br0">&#41;</span> 
    <span class="br0">&#40;</span>etat <span style="color: #cc66cc;">0</span><span class="br0">&#41;</span> 
    <span class="br0">&#40;</span>date <span class="br0">&#40;</span><span style="color: #0080ff;">get-universal-time</span><span class="br0">&#41;</span><span class="br0">&#41;</span> 
    <span class="br0">&#40;</span>poids <span style="color: #cc66cc;">0</span><span class="br0">&#41;</span> 
    <span class="br0">&#40;</span>sujet <span style="color: #FF0000;">&quot;&quot;</span><span class="br0">&#41;</span> 
    <span class="br0">&#40;</span>pr&eacute;dicat <span style="color: #FF0000;">&quot;&quot;</span><span class="br0">&#41;</span> 
    <span class="br0">&#40;</span>objet <span style="color: #FF0000;">&quot;&quot;</span><span class="br0">&#41;</span> 
<span class="br0">&#41;</span></pre></td></tr></table></pre>
</div><br />
Grâce au package &quot;sb-impl&quot; - pour le cas de SBCL -, vous pouvez retrouver l'ensemble de ces slots et leur composition assez facilement en jonglant un peu  : <br />
<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 lisp :</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:192px;"><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 /></div></td><td valign="top"><pre style="margin: 0"><span class="br0">&#40;</span><span style="color: #0000ff;"><span style="color: #0080ff;">in-package</span></span> <span style="color: #FF0000;">&quot;SB-IMPL&quot;</span><span class="br0">&#41;</span> 
&nbsp;
<span class="br0">&#40;</span><span style="color: #0000ff;">defun</span> extraire-slots <span class="br0">&#40;</span>objet<span class="br0">&#41;</span> 
    <span class="br0">&#40;</span><span style="color: #0000ff;">let</span> 
        <span class="br0">&#40;</span> 
            <span class="br0">&#40;</span>structuration <span class="br0">&#40;</span>find-defstruct-description objet<span class="br0">&#41;</span><span class="br0">&#41;</span> <span style="color: #808080;">; structuration de la structure </span>
            <span class="br0">&#40;</span>slots <span style="color: #0080ff;">nil</span><span class="br0">&#41;</span> 
        <span class="br0">&#41;</span> 
        <span class="br0">&#40;</span><span style="color: #0000ff;">setf</span> slots <span class="br0">&#40;</span>sb-impl:<span style="color: #339933;">:dd-slots</span> structuration<span class="br0">&#41;</span><span class="br0">&#41;</span> <span style="color: #808080;">; la liste ici, des slots &agrave; partir de la structuration </span>
        <span class="br0">&#40;</span><span style="color: #0000ff;">loop</span> <span style="color: #0000ff;">for</span> slot <span style="color: #0000ff;">in</span> slots 
            <span style="color: #0000ff;"><span style="color: #0080ff;">collect</span></span> <span class="br0">&#40;</span>dsd-name slot<span class="br0">&#41;</span> <span style="color: #808080;">; on collecte les noms, mais nous pourrions aussi avoir le type (-type), les valeurs par d&eacute;faut (-default), si le slot est en lecture seule (-read-only), etc. </span>
        <span class="br0">&#41;</span> 
    <span class="br0">&#41;</span> 
<span class="br0">&#41;</span></pre></td></tr></table></pre>
</div><br />
Vous pouvez ainsi à tout moment définir la liste des slots d'une structure et vous servir de cette liste, par exemple : <br />
<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 lisp :</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:192px;"><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 /></div></td><td valign="top"><pre style="margin: 0"><span class="br0">&#40;</span><span style="color: #0000ff;">defparameter</span> 
    *triplets-attributs* 
    <span class="br0">&#40;</span>extraire-slots <span style="color: #339933;">'triplet</span><span class="br0">&#41;</span> 
<span class="br0">&#41;</span> 
&nbsp;
<span class="br0">&#40;</span><span style="color: #0000ff;">defvar</span> montriplet <span class="br0">&#40;</span>make-triplet<span class="br0">&#41;</span><span class="br0">&#41;</span> 
&nbsp;
<span class="br0">&#40;</span><span style="color: #0000ff;">loop</span> <span style="color: #0000ff;">for</span> slot <span style="color: #0000ff;">in</span> *triplets-attributs* <span style="color: #0000ff;"><span style="color: #0000ff;">do</span></span> 
    <span class="br0">&#40;</span><span style="color: #0080ff;">format</span> <span style="color: #0000ff;"><span style="color: #0080ff;">t</span></span> <span style="color: #FF0000;">&quot;~s : ~s~%&quot;</span> 
        slot 
        <span class="br0">&#40;</span><span style="color: #0080ff;">slot-value</span> montriplet slot<span class="br0">&#41;</span>
    <span class="br0">&#41;</span> 
<span class="br0">&#41;</span></pre></td></tr></table></pre>
</div><br />
Ce qui renverra en console, un retour comme suivant : <br />
<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 lisp :</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">GROUPE : <span style="color: #cc66cc;">0</span>
ETAT : <span style="color: #cc66cc;">0</span>
DATE : <span style="color: #cc66cc;">3760699737</span>
POIDS : <span style="color: #cc66cc;">0</span>
SUJET : <span style="color: #FF0000;">&quot;&quot;</span>
PR&Eacute;DICAT : <span style="color: #FF0000;">&quot;&quot;</span>
OBJET : <span style="color: #FF0000;">&quot;&quot;</span></pre></td></tr></table></pre>
</div><br />
Pratique !</blockquote>

]]></content:encoded>
			<dc:creator>Nothus</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/318041-nothus/b7089/lisp-recuperer-informations-structure-puis-parcourir-slots-instances/</guid>
		</item>
		<item>
			<title><![CDATA[[LISP] Disposer d'un décorateur de fonction]]></title>
			<link>https://www.developpez.net/forums/blogs/318041-nothus/b6975/lisp-disposer-d-decorateur-fonction/</link>
			<pubDate>Sun, 10 Feb 2019 21:27:15 GMT</pubDate>
			<description>Bonjour à tous,  
 
Pour ceux...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">Bonjour à tous, <br />
<br />
Pour ceux qui apprécient la souplesse des décorateurs comme on les connaît sous Python : <br />
<a href="http://sametmax.com/comprendre-les-decorateurs-python-pas-a-pas-partie-1/" target="_blank">http://sametmax.com/comprendre-les-d...-pas-partie-1/</a> (et articles suivants) <br />
<br />
... Et qui débutent en LISP ; n'ont pas masse de documentation française ; aiment bien retrouver des habitudes de confort (pour le log ou autre)... <br />
<br />
... Vous avez bien évidemment la possibilité de retrouver cela sous Lisp. Ayant cherché un moment, voici un exemple utilisable conçu pour mes besoins propres (à adapter) : <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 lisp :</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 /></div></td><td valign="top"><pre style="margin: 0"><span class="br0">&#40;</span><span style="color: #0000ff;">defun</span> 
	additionner 
	<span class="br0">&#40;</span>a b<span class="br0">&#41;</span> 
	<span class="br0">&#40;</span>+ a b<span class="br0">&#41;</span> 
<span class="br0">&#41;</span> 
&nbsp;
<span class="br0">&#40;</span><span style="color: #0000ff;">defun</span> logger 
	<span class="br0">&#40;</span>fct args<span class="br0">&#41;</span> 
	<span class="br0">&#40;</span><span style="color: #0080ff;">print</span> <span style="color: #FF0000;">&quot;on me demande :&quot;</span><span class="br0">&#41;</span> 
	<span class="br0">&#40;</span><span style="color: #0080ff;">apply</span> fct args<span class="br0">&#41;</span> 
<span class="br0">&#41;</span> 
&nbsp;
<span class="br0">&#40;</span><span style="color: #0000ff;">defmacro</span> decorer <span class="br0">&#40;</span>fct avec deco nom fctDeco<span class="br0">&#41;</span> 
	<span style="color: #FF0000;">&quot;d&eacute;corer une fonction avec une autre&quot;</span> 
	`<span class="br0">&#40;</span><span style="color: #0000ff;">setf</span> 
		<span class="br0">&#40;</span><span style="color: #0080ff;">fdefinition</span> ,fctDeco<span class="br0">&#41;</span> 
		<span class="br0">&#40;</span>lambda 
			<span class="br0">&#40;</span>&amp;<span style="color: #0080ff;">rest</span> args<span class="br0">&#41;</span> 
			<span class="br0">&#40;</span><span style="color: #0080ff;">funcall</span> 
				<span class="br0">&#40;</span><span style="color: #0000ff;">function</span> ,deco<span class="br0">&#41;</span> 
				<span class="br0">&#40;</span><span style="color: #0000ff;">function</span> ,fct<span class="br0">&#41;</span> 
				args 
			<span class="br0">&#41;</span> 
	 	<span class="br0">&#41;</span> 
	<span class="br0">&#41;</span> 
<span class="br0">&#41;</span> 
&nbsp;
<span class="br0">&#40;</span>decorer 
	additionner 
avec 
	logger 
nom 
	<span style="color: #339933;">'add_et_log</span> 
<span class="br0">&#41;</span> 
&nbsp;
<span class="br0">&#40;</span><span style="color: #0080ff;">print</span> <span class="br0">&#40;</span>additionner <span style="color: #cc66cc;">1</span> <span style="color: #cc66cc;">2</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span style="color: #808080;">; 3 </span>
&nbsp;
<span class="br0">&#40;</span><span style="color: #0080ff;">print</span> <span class="br0">&#40;</span>add_et_log <span style="color: #cc66cc;">3</span> <span style="color: #cc66cc;">4</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span style="color: #808080;">; on me demande : 7</span></pre></td></tr></table></pre>
</div><br />
L'intérêt est de produire une <b>nouvelle</b> fonction qui utilisera en arguments la fonction initiale qui doit être décorée  ainsi que les arguments lors de l'appel. Charge à la fonction qui décore - <i>wrap</i>, soit &quot;emballage&quot; - de savoir quoi faire. N'oubliez pas que vous pouvez écraser la fonction appelée via son symbole, provoquant potentiellement (et même certainement) une succession d'appels sans fin si la fonction décoratrice appelle une fonction décorée qui est alors en réalité... la fonction décoratrice elle-même. <br />
<br />
Pour davantage d'informations, et la possibilité d'utiliser des signes directement dans le code, comme l'évoque cet échange glané : <br />
<a href="https://softwareengineering.stackexchange.com/a/214201" target="_blank">https://softwareengineering.stackexchange.com/a/214201</a><br />
<br />
Bon code ! <br />
<br />
PS : SBCL.</blockquote>

]]></content:encoded>
			<dc:creator>Nothus</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/318041-nothus/b6975/lisp-disposer-d-decorateur-fonction/</guid>
		</item>
		<item>
			<title><![CDATA[[Javascript] Extraction d'informations d'une URL]]></title>
			<link>https://www.developpez.net/forums/blogs/318041-nothus/b6055/javascript-extraction-d-informations-d-url/</link>
			<pubDate>Wed, 29 Aug 2018 14:38:16 GMT</pubDate>
			<description><![CDATA[L'exemple nécessite la...]]></description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">L'exemple nécessite la compatibilité ECMAScript 6. Sinon ne garde que l'expression régulière. <br />
<br />
— <br />
<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 javascript :</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;
<span class="br0">&#91;</span> 
	<span style="color: #FF0000;">&quot;https://www.truc.com/&quot;</span>, 
	<span style="color: #FF0000;">&quot;https://www.truc.com&quot;</span>, 
	<span style="color: #FF0000;">&quot;https://truc.com/&quot;</span>, 
	<span style="color: #FF0000;">&quot;https://truc.com/truc&quot;</span>, 
	<span style="color: #FF0000;">&quot;http://truc.fr&quot;</span>, 
	<span style="color: #FF0000;">&quot;https://www.bidule.truc.com&quot;</span>
<span class="br0">&#93;</span>.<span style="color: #0080ff;">forEach</span><span class="br0">&#40;</span> 
	url =&gt; <span class="br0">&#123;</span> 
		<span class="br0">&#91;</span>tout, SSL, sousdomaine, domaine<span class="br0">&#93;</span> = url.<span style="color: #0080ff;">match</span><span class="br0">&#40;</span> 
			<span style="color: #808080;">/^http(s)?\:\/\/([a-z0-9\-\_\.]+\.)?([a-z0-9\-\_]+\.[a-z]+)/i</span> 
		<span class="br0">&#41;</span>; 
		console.<span style="color: #0080ff;">log</span><span class="br0">&#40;</span> 
			url, 
			<span class="br0">&#40;</span>SSL===<span style="color: #339933;">undefined</span><span class="br0">&#41;</span>?<span style="color: #800000;">false</span>:<span style="color: #339933;">true</span>, 
			sousdomaine, 
			domaine 
		<span class="br0">&#41;</span>; 
	<span class="br0">&#125;</span> 
<span class="br0">&#41;</span>;</pre></td></tr></table></pre>
</div></blockquote>

]]></content:encoded>
			<dc:creator>Nothus</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/318041-nothus/b6055/javascript-extraction-d-informations-d-url/</guid>
		</item>
		<item>
			<title>Halte au JSON et aux frameworks : vive les transformations XML pour les sites !</title>
			<link>https://www.developpez.net/forums/blogs/318041-nothus/b4789/halte-json-aux-frameworks-vive-transformations-xml-sites/</link>
			<pubDate>Wed, 28 Feb 2018 13:32:21 GMT</pubDate>
			<description>N.B. Cet article est en...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore"><i>N.B. Cet article est en partie un billet « d'humeur », destiné à provoquer le débat et n’est pas dénué de second degré et est donc réservé à ceux qui en disposent. Si par ailleurs vous connaissez déjà des déploiements pour le type d’orientation que je développe, merci de me l'indiquer en commentaire par un lien, ça m’intéresse. D’avance merci :)</i><br />
<br />
– <br />
<br />
Vous êtes à l’affût des dernières tendances de Vue.js ? Vous êtes incollable sur Angular ? Vous trouvez que vraiment, les applications XML c’est juste bon pour de vieux engins et quelques rares applications métier ? Le JSON est votre meilleur ami ? <br />
<br />
À tort ! Les <i>frameworks</i> JavaScript c’est le mal – ou au moins l’utilisation bien souvent abusive des jQuery et autres ReactJS… Et le JSON – <i>pardonnez-moi par avance si je heurte votre intelligence et vos pratiques</i> – c’est gentil, mais c’est juste pour gérer quelques variables simples : un vrai jouet pour bambins. <br />
<br />
— <br />
<br />
Spoiler : j’en rajoute (beaucoup) dans mon introduction certes. Pour autant le propos de fond n’est pas éloigné de ma pensée et il y a parfois confusion entre les possibles et l’intérêt des outils entre eux. <br />
Ainsi lorsque je vois un code avec du HTML « formaté » en JSON et dans l’attente d’être généré, je me dis que le monde est moche, vraiment. Car JSON est l’équivalent d’un dictionnaire : une paire clé/valeur. Pas d’attributs. Un manque, car vous devez passer du moins riche au plus riche en termes de données. Les astuces, avec l’utilisation de clés particulières renvoyant à des objets faisant office d’attributs, restent crades et peu pratiques (soyez de bonne foi !). <br />
<br />
Alors pourquoi ne pas directement utiliser du XML dont hérite le HTML fut-il de version 4 ou 5... ? D’où vient cette manie de séparer la richesse du XML de nos si chères pages Web ? Une Web Application est-elle condamnée à (virtuellement) ne pas les utiliser ?! <br />
<br />
Ne touche-t-on plutôt pas ici aux pratiques des développeurs, aux modes et à – peut-être – une forme de paresse, voire de méconnaissance de certains développeurs web qui ne jurent que par les plaquettes com’ de certaines firmes et écoles ? Je crois sincèrement l’heure venue d’avoir un débat, car, progressivement, les choses se décantent pour le web, son inusable JS et indirectement pour la pratique du XML sur le Web. <br />
<br />
Tout d’abord un tour d’horizon de ce qu’apportent les Workers au doux et riche monde du XML, à l’heure où, pour le monde du Web mutualisé dans les grands opérateurs d’hébergement, le PHP devient ringard, dépassé et NodeJS toujours aussi instable… en nous demandant si parfois, l’orientation de pages disponibles hors ligne – base des applications Web – n’était pas la pierre qui manquait dans le mur du XML moderne. <br />
<br />
<b><i>Ce qui change tout : les Workers </i></b><br />
<br />
Vous connaissez cette astuce qui prévoit de mettre du HTML dans une balise <i>style</i> au sein de votre <i>body</i> ? Une fois récupéré par le biais d’un <i>querySelector</i>, mais jamais pris en compte dans le HTML de la page, cela permet de faire des transformations locales (<i>replace + parse</i>)  puis de réintégrer les éléments générés dans une page. <br />
<br />
Plus propre qu’un <i>display : none</i>, la pratique séduit par sa relative réutilisation – pour la génération de listes complexes par exemple. <br />
<br />
Pour autant le web se heurte à plusieurs inconnues/problématiques majeures qui dominent toujours les forums et nos pensées. En voici un résumé très personnel : <br />
– la séparation données/présentation ou comment le JS s’est orienté vers MCV à défaut de pouvoir parfois continuer à générer des pages « toutes prêtes » et personnalisées côté serveur ;<br />
– l’organisation de la page elle-même : représenter du HTML et sa richesse (attributs notamment) autrement que par du HTML, ce n’est pas si facile (et propre). Sauf si l’on utilise son parent le XML ;<br />
– disposer d’un DOM facilement manipulable avant qu’il soit disponible et affiché par le navigateur, pour disposer des écouteurs d’événements ou faire des manipulations diverses et variées. Cela donnera, pour le cas de rafraîchissements très fréquents (et très bloquants pour l’usage de la page…), le cas des DOM virtuels. Des DOM virtuels qui doivent être plutôt détachés de l’exécution de la page elle-même, pour éviter d’être bloquants par <i>effet de bord</i>. <br />
<br />
C’est là où intervient un nouveau venu : un travailleur JS. Corvéable à merci, il est un parfait esclave de nos exigences numériques (rien de répréhensible hein !). <br />
<br />
Les <i>Workers</i> disposent de trois principales familles (voir <a href="https://developer.mozilla.org/en-US/docs/Web/API/AbstractWorker" target="_blank">ici</a> et <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS" target="_blank">ici</a>), héritées d’un même prototype d’objet et disponible par JavaScript. Tout d'abord un <i>Web Worker</i> de base (d’où le nom de <i>Web Worker</i>) simple et efficace, limité à la page qui l’appelle, qui dialogue avec elle et ne dispose pas d’accès au DOM du document. Pour du calcul bloquant,  ou gérer certains appels, c’est parfait. C’est un « processus » à la sauce <i>thread</i> en Python par exemple. <br />
<br />
Le <i>Worker</i> « au-dessus », c’est la même chose, mais il peut être partagé avec d’autres fenêtres/onglets : le <i>Shared Worker</i>. Une forme de <i>multiprocessing</i> dont les <i>pipes</i> sont limités en accès et qui répond toujours au domaine appelant (limitations CORS), et tourne en fond de tâche tant qu’il n’est pas tué ou qu’il reste au moins un onglet ouvert quelque part et qui fait appel à lui. <br />
<br />
Enfin il y a le <i>Service Worker</i>, qui lui aussi répond à un domaine appelant (même s’il peut, sous condition et avec pas mal de restrictions, faire appel à des ressources hors des limites théoriques du CORS). La différence notable c’est qu’il ne tourne pas en fond de tâche : il est appelé pour un temps court (et sera tué s’il ne respecte pas certaines règles de bienséance numérique), pour « traiter » un lien appelé par une page. Il existe en dehors de l’existence des pages (sa création le rend indépendant des pages présentes et futures). Il a accès et lui seul, à un espace réservé qui est un cache local, pouvant charger moult fichiers en tout genre (CSS, JS, images, textes, HTML, JSON, XML, MP4, ZIP, que sais-je…). En interceptant les requêtes, il peut les modifier (un peu) et répondre par autre chose s’il le veut (souvent). <br />
<br />
L’intérêt c’est qu’il peut servir de « préserveur » en stockant localement des fichiers. Ceux-ci peuvent être disponibles de lui seul (le fameux cache local) ou au travers d’<i>IndexedDB</i> (le pire truc que la terre ait jamais enfanté depuis le comportement effroyable de mon ex-voisine du haut). Il peut aussi servir du HTML généré… ou du XML… <br />
<br />
Et si c’est trop lourd à transformer, un <i>Shared Worker</i> ou un <i>Web Worker</i> peuvent traiter des tâches pour lui… <br />
<br />
Et une requête POST (sur une URL fantôme, interceptée, type <i>/void</i>) a un corps de requête qui peut contenir des données à mettre en cache pour resservir après… <br />
<br />
Hum hum… <br />
<br />
<b><i>La trame que je propose (attention, étape aspirine) </i></b><br />
<br />
De ces réflexions que je travaille ces deux dernières semaines, en voici le schéma général : <br />
– réception de la requête par le serveur, en fonction de règles de redirection ; <br />
– importation d’un premier XML, transformé par un XSL, produisant un code HTML5 valide &#8594; un cadre global adapté ;<br />
– le navigateur exécute la page HTML produite et le JavaScript contenu inscrit un Service Worker qui procède dès que possible au téléchargement de tous les XSL disponibles en les intégrant dans une base locale, qui gérera par ailleurs les appels directs vers le serveur (le cache est une sorte préAPI de redirection) ;<br />
– toute nouvelle ressource appelée par le biais d’un lien (renvoyant vers un XML) passera par le cache au travers du <i>Shared Worker</i> (SW) sans nouvel appel au serveur pour les XSL (étant déjà disponibles en cache). Ce ne sera donc pas directement la page qui procède à la transformation, mais un SW, qui communiquera le cas échéant au cache une ressource transformée à garder pour la suite (requête interceptée POST) ; <br />
– les transformations par JavaScript permettent de ne pas avoir à rafraîchir toute une page, en modifiant à la volée certaines parties du HTML produit par la transformation. Soit le parcours suivant : appel de la page vers le SW =&gt; le SW fait une demande éventuelle auprès du cache =&gt; le cache vérifie s’il doit le télécharger =&gt; le SW fait éventuellement les transformations nécessaires de la réponse du cache et renvoie à la page le résultat =&gt; le JS de la page dispose d’un nouveau document – <i>fragment</i> – où piocher les éléments DOM à intégrer (<i>remove</i> simple ou par <i>clone</i>).<br />
<br />
… Vous trouvez mon orientation, ma trame un poil compliquée ? Avez-vous déjà vu le fonctionnement théorique d’un DOM virtuel ? Le casse-tête des appels asynchrones que les Promises tendent de résoudre, des problématiques de portée de variables ? La sécurité des sessions pour des requêtes HTTP nécessairement <i>stateless</i> à l’heure où augmente le nombre de scripts extérieurs au site… ? <br />
<br />
Si vous n’êtes toujours pas convaincu que cette solution n’est pas ni la pire ni la plus complexe au regard de toutes les autres (Churchill…) et répond à certaines problématiques bien actuelles, je vous conseille de lire rapidement la documentation d’implémentation du <i>WebAssembly</i> – particulièrement si vous n’avez jamais développé avec des langages de plus bas niveau… voilà ce qui vous attend. <br />
<br />
Bref.<br />
<br />
Dans la trame que je présente, le serveur distant pour la « lecture » seule des données se comporte comme un simple fournisseur de fichiers. Évidemment cela ne vaut pas dans deux cas non exclusifs l’un de l’autre :<br />
– pour l’enregistrement des logs qui se fait également lors de l’appel des ressources indépendamment du logiciel de serveur (par exemple, avoir d’autres logs que seulement ceux d’Apache, Lighttpd, etc.) ;<br />
– pour la vérification des droits d’accès au XSL/XML/… ou de certaines mises à jour (mon XML est-il à jour ?). <br />
<br />
Un tel schéma d’échanges de XML/XSL est bien évidemment compatible côté serveur avec des bases NoSQL – particulièrement celles qui ont des orientations documents ou tous les systèmes distribués en règle générale –, mais plus surprenant (inusité ?), aussi avec certains systèmes SQL comme MariaDB qui supporte des colonnes au format texte/XML (au travers de fonctions disponibles telles que <i>ExtractValue</i> ou <i>UpdateXML</i>). <br />
<br />
Quelques limitations cependant : si le site dispose de nombreux XSL ou que les données sont variées en structure, le cache localement peut être important, voire difficile à « résolver » (résoudre) totalement côté serveur. Cependant même pour des sites aussi « lourds » que peuvent être par exemple ceux des GAFA, la rationalisation des éléments affichés peut produire des portions de XSL faciles à maintenir et à intégrer dans une page (principe des gabarits/« <i>template</i> »). <br />
<br />
<b><i>Quand utiliser les uns ou les autres ? </i></b><br />
<br />
Une conclusion en ouverture : quand savoir <u>raisonnablement</u> utiliser les différentes technologies utiles à votre projet et à vos ambitions ? Tout d’abord savoir où vous êtes à l’aise : le débogage, les vérifications de sécurité sont toujours plus simples, moins fastidieux, plus efficaces lorsque les outils utilisés sont connus. Le développement lui-même est plus aisé et rapide – ce qui réduit de manière non négligeable le coût. <br />
<br />
Le schéma que je propose ici est particulièrement adapté lorsque le niveau d’exigence en termes de rafraîchissement reste raisonnable et que les transformations XSL sont correctement développées, comprises, gérables. De plus cela ne résout pas le problème de mise à jour « permanente » du contenu, des événements (<i>scroll</i>, etc.) comme du <i>feed-back</i> plus généralement : dans ce cas, l’utilisation de JS et des facilités offertes par les frameworks est particulièrement évidente et totalement indéniable. Bref pas le choix ! <br />
<br />
Pour un site « Internet » ou en intranet, qui se rapproche d’une utilisation type blog ou wiki, qui reste « relativement » statique, la « gabarisation » – car c’en est une – grâce à XML est probablement la meilleure approche (la moins coûteuse en termes de matériel, particulièrement si vous êtes sur des serveurs mutualisés où la ressource logicielle est rare). Idem si vous disposez déjà de ressources XML considérables (ouvrages, fichiers de configuration, de données, génération provenant des capteurs, etc.). <br />
<br />
Reste qu’une telle méthodologie, approche, orientation – appelez cela comme vous le souhaitez – est compatible avec d’autres pratiques récentes comme les <i>JSON Web Token</i> (JWT), dont vous trouverez d’excellents exposés un peu partout –, et son orientation plus « tendance » et sécurisée (et disponible) que nos éternels cookies de session, qui obligent à un <i>load balancer</i> très efficace ou un cache de sessions distribué lorsque l’on dépasse un unique serveur.<br />
<br />
Preuve que la modération et l’ouverture d’esprit dans le domaine technique comme dans d’autres, est souvent la meilleure manière d’être le plus efficient : XML+XSL représente, transforme et organise des données complexes ; le couple JS+JSON traite des variables, des appels et des requêtes désormais majoritairement de manière asynchrone. <br />
<br />
Chacun chez soi et Linux pour tous.<br />
<br />
<b>Et vous&nbsp;?</b><br />
<br />
:fleche: Qu'en pensez-vous&nbsp;?</blockquote>

]]></content:encoded>
			<dc:creator>Nothus</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/318041-nothus/b4789/halte-json-aux-frameworks-vive-transformations-xml-sites/</guid>
		</item>
		<item>
			<title><![CDATA[[Javascript] WebEx : Ajouter des boutons d'actions à un site tiers (ici Twitter)]]></title>
			<link>https://www.developpez.net/forums/blogs/318041-nothus/b4654/javascript-webex-ajouter-boutons-d-actions-site-tiers-twitter/</link>
			<pubDate>Sat, 03 Feb 2018 15:53:15 GMT</pubDate>
			<description><![CDATA[Attention : l'ajout de...]]></description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore"><i>Attention : l'ajout de méthodes automatiques ou semi-automatiques sur des sites sans leur consentement n'est pas autorisé, particulièrement lorsque la finalité s'apparente à un crawling (cf droits de la propriété et droits voisins). </i><br />
<br />
<b><u>Objectifs</u></b> <br />
<br />
Dans le cadre de ma <a href="https://addons.mozilla.org/fr/android/addon/nothus-veille/" target="_blank">WebExtension</a>, je cherche à ajouter des flux à la sauce XML (notamment RSS) et non-XML aux items, de manière automatique (surveillance de page et de ressources), comme de récupération manuelle par action de l'utilisateur (capture du tweet, etc). <br />
<br />
Il est important, pour la pérennité de l'outil, que l'impact de la WebExtension soit la plus mineure possible : pas de ralentissements, pas de détérioration des sites visités et, dans mon cas, pas d'impact sur la vie privée ou d'utilisation d'API distante. <br />
<br />
<b><u>Méthode et Performances</u></b> <br />
<br />
Pour l'ajout d'un bouton sur Twitter par exemple, sans l'utilisation de son API, cela impose : <br />
- l'injection d'un script sur le domaine Twitter.com, avant l'exécution de la page (en prenant garde à certains changements dans l'environnement : par exemple <i>console.log</i> fonctionne différemment sur Twitter et <b>ne doit pas</b> être utilisé), <br />
- l'insertion de nouveaux menus d'actions aux tweets au démarrage de la page, <br />
- optionnellement, l'affichage des nouveaux tweets disponibles (un lien est généré pour se faire, qui serait &quot;virtuellement&quot; cliqué), <br />
- l'insertion de nouveaux menus d'actions aux tweets ainsi ajoutés. <br />
<br />
L'utilisation des <i>Events</i> (et particulièrement les <a href="https://developer.mozilla.org/en-US/docs/DOM/Mutation_events" target="_blank">Mutations Events</a>, par <i>addEventListener</i> détériore fortement les performances, particulièrement lorsque le site utilise un affichage dynamique intensif, tel Facebook ou Twitter, ou simplement l'utilisation d'outils comme Vue.js qui permettent des rafraîchissements performants mais intensifs. <br />
<br />
En lieu et place des événements, le MDN propose le constructeur <a href="https://developer.mozilla.org/fr/docs/Web/API/MutationObserver" target="_blank">MutationObserver</a>, qui permet de créer des &quot;observatoires&quot; pouvant surveiller des éléments, sélectionnés auparavant dans le DOM par les méthodes traditionnelles (dont la fonction <i>querySelector</i>). <br />
<br />
La navigateur transmet à l'observatoire la série sélectionnée d'éléments modifiés et leurs modifications à écouter, par le biais de l'observatoire, qui en sort un objet spécifique à la recommandation du script par le biais des événements classiques. Cela évite donc une étape longue et fastidieuse comme le bouillonnement et l'exécution de fonctions de rappel par <i>addEventListener</i>. <br />
<br />
L'utilisation de <i>MutationObserver</i> peut donc être jugée mineure - et la plus adaptée - sur des pages où la fréquence de rafraîchissement des informations contenues est importante. <br />
<br />
<b><u>Exemple</u></b> <br />
<br />
Ci-dessous un exemple à exécuter sur une page Twitter grâce à la console ou à l'ardoise Javascript : chaque tweet verra au-dessus un petit &quot;coucou&quot; s'afficher. <br />
<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 javascript :</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 /></div></td><td valign="top"><pre style="margin: 0">&nbsp;
<span style="color: #0080ff;">window</span>.ajout = <span style="color: #0080ff;">document</span>.<span style="color: #0080ff;">createElement</span><span class="br0">&#40;</span><span style="color: #FF0000;">&quot;p&quot;</span><span class="br0">&#41;</span>; 
<span style="color: #0080ff;">window</span>.ajout.<span style="color: #0080ff;">appendChild</span><span class="br0">&#40;</span> 
  <span style="color: #0080ff;">document</span>.<span style="color: #0080ff;">createTextNode</span><span class="br0">&#40;</span> 
    <span style="color: #FF0000;">&quot;coucou&quot;</span>
  <span class="br0">&#41;</span>
<span class="br0">&#41;</span>; 
&nbsp;
<span style="color: #0000ff;">var</span> observateur = <span style="color: #0000ff;">new</span> <span style="color: #0080ff;">MutationObserver</span><span class="br0">&#40;</span>
  <span class="br0">&#40;</span>mutations<span class="br0">&#41;</span> =&gt; <span class="br0">&#123;</span>
    mutations.<span style="color: #0080ff;">forEach</span><span class="br0">&#40;</span>
      <span class="br0">&#40;</span>mutation<span class="br0">&#41;</span> =&gt; <span class="br0">&#123;</span> 
        <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span>mutation.type!=<span style="color: #FF0000;">&quot;childList&quot;</span><span class="br0">&#41;</span> 
          <span style="color: #0000ff;">return</span>; 
        mutation.addedNodes.<span style="color: #0080ff;">forEach</span><span class="br0">&#40;</span>
          <span class="br0">&#40;</span><span style="color: #0080ff;">element</span><span class="br0">&#41;</span> =&gt; <span class="br0">&#123;</span> 
            <span style="color: #0080ff;">element</span>.<span style="color: #0080ff;">insertBefore</span><span class="br0">&#40;</span> 
              <span style="color: #0080ff;">window</span>.ajout.<span style="color: #0080ff;">cloneNode</span><span class="br0">&#40;</span><span style="color: #339933;">true</span><span class="br0">&#41;</span>, 
              <span style="color: #0080ff;">element</span>.firstElementChild 
            <span class="br0">&#41;</span>; 
          <span class="br0">&#125;</span> 
        <span class="br0">&#41;</span>; 
      <span class="br0">&#125;</span> 
    <span class="br0">&#41;</span>; 
  <span class="br0">&#125;</span> 
<span class="br0">&#41;</span>;
&nbsp;
observateur.<span style="color: #0080ff;">observe</span><span class="br0">&#40;</span> 
  <span style="color: #0080ff;">document</span>.<span style="color: #0080ff;">querySelector</span><span class="br0">&#40;</span><span style="color: #FF0000;">'#stream-items-id'</span><span class="br0">&#41;</span>, 
  <span class="br0">&#123;</span> 
  	<span style="color: #800000;">childList</span>: <span style="color: #339933;">true</span> 
  <span class="br0">&#125;</span>
<span class="br0">&#41;</span>;
&nbsp;
<span style="color: #808080;">/*setTimeout( </span>
<span style="color: #808080;">&nbsp; observer.disconnect(), </span>
<span style="color: #808080;">&nbsp; 1000000 </span>
<span style="color: #808080;">&nbsp;); */</span></pre></td></tr></table></pre>
</div><br />
<img src="https://www.developpez.net/forums/attachments/p348208d1517672676/autres-langages/general-visual-basic-6-vbscript/vb-6-anterieur/vb6-interface-combobox-plusieurs-colonnes/capture-2018-02-03-12-54-56.png/" border="0" alt="Nom : Capture du 2018-02-03 12-54-56.png
Affichages : 373
Taille : 416,9 Ko"  style="float: CONFIG" /><br />
<br />
<b><i>A noter </i></b> <br />
<br />
Le menu par défaut des actions de Tweet est un élément &quot;liste&quot; <i>ul</i> sous le format suivant, où l'on peut également insérer ses boutons, sans &quot;détériorer&quot; l'interface habituelle de Twitter, renforçant la discrétion des modifications : <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:132px;"><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 />8<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #339933;"><span style="color: #0000ff;">&lt;</span><span style="color: #0000ff;">ul</span> <span style="color: #0080ff;">tabindex</span><span style="color: #0000ff;">=</span><span style="color: #FF0000;">&quot;-1&quot;</span> <span style="color: #0080ff;">role</span><span style="color: #0000ff;">=</span><span style="color: #FF0000;">&quot;menu&quot;</span> aria-labelledby<span style="color: #0000ff;">=</span><span style="color: #FF0000;">&quot;menu-0&quot;</span> aria-hidden<span style="color: #0000ff;">=</span><span style="color: #FF0000;">&quot;false&quot;</span><span style="color: #0000ff;">&gt;</span></span>
      <span style="color: #339933;"><span style="color: #0000ff;">&lt;</span><span style="color: #0000ff;">li</span> <span style="color: #0080ff;">class</span><span style="color: #0000ff;">=</span><span style="color: #FF0000;">&quot;copy-link-to-tweet js-actionCopyLinkToTweet&quot;</span> <span style="color: #0080ff;">role</span><span style="color: #0000ff;">=</span><span style="color: #FF0000;">&quot;presentation&quot;</span><span style="color: #0000ff;">&gt;</span></span>
        <span style="color: #339933;"><span style="color: #0000ff;">&lt;</span><span style="color: #0000ff;">button</span> <span style="color: #0080ff;">type</span><span style="color: #0000ff;">=</span><span style="color: #FF0000;">&quot;button&quot;</span> <span style="color: #0080ff;">class</span><span style="color: #0000ff;">=</span><span style="color: #FF0000;">&quot;dropdown-link&quot;</span> <span style="color: #0080ff;">role</span><span style="color: #0000ff;">=</span><span style="color: #FF0000;">&quot;menuitem&quot;</span><span style="color: #0000ff;">&gt;</span></span>Copier le lien du Tweet<span style="color: #339933;"><span style="color: #0000ff;">&lt;/</span><span style="color: #0000ff;">button</span><span style="color: #0000ff;">&gt;</span></span>
      <span style="color: #339933;"><span style="color: #0000ff;">&lt;/</span><span style="color: #0000ff;">li</span><span style="color: #0000ff;">&gt;</span></span>
      <span style="color: #339933;"><span style="color: #0000ff;">&lt;</span><span style="color: #0000ff;">li</span> <span style="color: #0080ff;">class</span><span style="color: #0000ff;">=</span><span style="color: #FF0000;">&quot;embed-link js-actionEmbedTweet&quot;</span> data-nav<span style="color: #0000ff;">=</span><span style="color: #FF0000;">&quot;embed_tweet&quot;</span> <span style="color: #0080ff;">role</span><span style="color: #0000ff;">=</span><span style="color: #FF0000;">&quot;presentation&quot;</span><span style="color: #0000ff;">&gt;</span></span>
        <span style="color: #339933;"><span style="color: #0000ff;">&lt;</span><span style="color: #0000ff;">button</span> <span style="color: #0080ff;">type</span><span style="color: #0000ff;">=</span><span style="color: #FF0000;">&quot;button&quot;</span> <span style="color: #0080ff;">class</span><span style="color: #0000ff;">=</span><span style="color: #FF0000;">&quot;dropdown-link&quot;</span> <span style="color: #0080ff;">role</span><span style="color: #0000ff;">=</span><span style="color: #FF0000;">&quot;menuitem&quot;</span><span style="color: #0000ff;">&gt;</span></span>Int&eacute;grer le Tweet<span style="color: #339933;"><span style="color: #0000ff;">&lt;/</span><span style="color: #0000ff;">button</span><span style="color: #0000ff;">&gt;</span></span>
      <span style="color: #339933;"><span style="color: #0000ff;">&lt;/</span><span style="color: #0000ff;">li</span><span style="color: #0000ff;">&gt;</span></span>
(...)</pre></td></tr></table></pre>
</div></blockquote>

]]></content:encoded>
			<dc:creator>Nothus</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/318041-nothus/b4654/javascript-webex-ajouter-boutons-d-actions-site-tiers-twitter/</guid>
		</item>
		<item>
			<title><![CDATA[[Javascript] IndexedDB : être certain de son schéma de base au détriment de son numéro de version]]></title>
			<link>https://www.developpez.net/forums/blogs/318041-nothus/b4638/javascript-indexeddb-etre-certain-schema-base-detriment-numero-version/</link>
			<pubDate>Tue, 30 Jan 2018 15:12:18 GMT</pubDate>
			<description>Ce article, écrit à la...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore"><i>Ce article, écrit à la va-vite, s'adresse à des développeurs plutôt avancés. Comme d'ordinaire : <b>si vous n'êtes pas sûr de ce que vous faites et que vous n'êtes pas dans un &quot;bac à sable&quot;, ne le faites pas !</b> Particulièrement lorsqu'il s'agit de copier-coller des bouts de code dans la console de votre navigateur...</i> <br />
<br />
--- <br />
<br />
M'étant cassé la tête quelque temps (deux semaines pour être précis !) sur des conflits de base, et <a href="https://developer.mozilla.org/en-US/docs/Web/API/IDBDatabase#setVersion" target="_blank">la nature d'IndexedDB</a> - surtout ses limites en réalité - étant par des fonctions de rappel, voici une petite classe toute bête. <br />
<br />
Attention : cette méthode <b>dénature</b> toute votre base si vous vous appuyez impérativement sur un numéro de version spécifique. Ce qui est / était mon cas jusqu'à présent : chaque nouvelle version de <a href="https://addons.mozilla.org/fr/android/addon/nothus-veille/" target="_blank">ma webExtension</a> était liée à un numéro de base de données. <br />
<br />
Ainsi il faut choisir entre : <br />
<ul><li style="">le cas n°1 où vous êtes certains de l'ordre de vos appels et de la prise en charge de votre mise à jour de base (ce qui, en réalité, est quasi-impossible et conduit trop souvent à un nouveau numéro de version SANS mise à jour et occasionne des difficultés à la chaîne, lorsque les webExtensions sont chargées),</li><li style="">... et le cas n°2 qui bloque votre script dans l'attente d'avoir la main et, lorsqu'il l'a, procède à la mise à jour, en incrémentant autant que nécessaire le numéro de version. </li></ul><br />
<br />
L'utilisation de ce script, tant dans vos WebWorkers que dans vos <i>back-</i> et <i> front- ground</i> dans les webExtension, impose une ouverture par cet objet systématique et de limiter vos références à votre base. <br />
<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 javascript :</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 /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">function</span> <span style="color: #0080ff;">OuvertureSure</span><span class="br0">&#40;</span>nom_bdd<span class="br0">&#41;</span> <span class="br0">&#123;</span> 
  <span style="color: #0000ff;">this</span>._log = <span class="br0">&#40;</span>m<span class="br0">&#41;</span> =&gt; <span class="br0">&#123;</span> 
    console.<span style="color: #0080ff;">log</span><span class="br0">&#40;</span>m<span class="br0">&#41;</span>; 
  <span class="br0">&#125;</span>; 
  <span style="color: #0000ff;">this</span>.schema_bdd = <span class="br0">&#123;</span><span class="br0">&#125;</span>; 
  <span style="color: #0000ff;">this</span>.nom_bdd = nom_bdd; 
  <span style="color: #0000ff;">this</span>.version = <span style="color: #339933;">undefined</span>; 
  <span style="color: #0000ff;">this</span>.installer = <span class="br0">&#40;</span>db<span class="br0">&#41;</span> =&gt; <span class="br0">&#123;</span> 
    <span style="color: #0000ff;">for</span><span class="br0">&#40;</span><span style="color: #0000ff;">var</span> table <span style="color: #0000ff;">in</span> <span style="color: #0000ff;">this</span>.schema_bdd<span class="br0">&#41;</span> <span class="br0">&#123;</span> 
      <span style="color: #0000ff;">this</span>.<span style="color: #0080ff;">_log</span><span class="br0">&#40;</span><span style="color: #FF0000;">`cr&eacute;ation de <span style="color: #800000;">${table}</span>`</span><span class="br0">&#41;</span>; 
      db.<span style="color: #0080ff;">createObjectStore</span><span class="br0">&#40;</span>table, <span style="color: #0000ff;">this</span>.schema_bdd<span class="br0">&#91;</span>table<span class="br0">&#93;</span><span class="br0">&#41;</span>; 
    <span class="br0">&#125;</span> 
  <span class="br0">&#125;</span>; 
  <span style="color: #0000ff;">this</span>.poursuivre = <span class="br0">&#40;</span>db<span class="br0">&#41;</span> =&gt; <span class="br0">&#123;</span> 
    <span style="color: #0000ff;">this</span>.<span style="color: #0080ff;">_log</span><span class="br0">&#40;</span><span style="color: #FF0000;">`tentative de poursuite`</span><span class="br0">&#41;</span>; 
    <span style="color: #0000ff;">try</span> <span class="br0">&#123;</span> 
      <span style="color: #0000ff;">for</span><span class="br0">&#40;</span><span style="color: #0000ff;">var</span> table <span style="color: #0000ff;">in</span> <span style="color: #0000ff;">this</span>.schema_bdd<span class="br0">&#41;</span> <span class="br0">&#123;</span> 
        db.<span style="color: #0080ff;">transaction</span><span class="br0">&#40;</span>table, <span style="color: #FF0000;">&quot;readonly&quot;</span><span class="br0">&#41;</span>; 
      <span class="br0">&#125;</span> 
      console.<span style="color: #0080ff;">log</span><span class="br0">&#40;</span><span style="color: #FF0000;">&quot;-- OK --&quot;</span><span class="br0">&#41;</span>; 
    <span class="br0">&#125;</span> <span style="color: #0000ff;">catch</span><span class="br0">&#40;</span>e<span class="br0">&#41;</span> <span class="br0">&#123;</span> 
      <span style="color: #0000ff;">this</span>.<span style="color: #0080ff;">_log</span><span class="br0">&#40;</span> 
        <span style="color: #FF0000;">`le sch&eacute;ma n'est pas correct ; </span>
<span style="color: #FF0000;">         tentative de mise &agrave; jour`</span>
      <span class="br0">&#41;</span>; 
      db.<span style="color: #0080ff;">close</span><span class="br0">&#40;</span><span class="br0">&#41;</span>; 
      <span style="color: #0000ff;">this</span>.version++; 
      <span style="color: #0080ff;">setTimeout</span><span class="br0">&#40;</span> 
        <span style="color: #0000ff;">this</span>.ouvrir 
      <span class="br0">&#41;</span>; 
    <span class="br0">&#125;</span> 
  <span class="br0">&#125;</span>; 
  <span style="color: #0000ff;">this</span>.ouvrir = <span class="br0">&#40;</span><span class="br0">&#41;</span> =&gt; <span class="br0">&#123;</span> 
    <span style="color: #0000ff;">this</span>.<span style="color: #0080ff;">_log</span><span class="br0">&#40;</span><span style="color: #FF0000;">`ouverture de <span style="color: #800000;">${this.nom_bdd}</span> - version <span style="color: #800000;">${this.version}</span>`</span><span class="br0">&#41;</span>; 
    <span style="color: #0000ff;">var</span> r = <span style="color: #0080ff;">window</span>.indexedDB.<span style="color: #0080ff;">open</span><span class="br0">&#40;</span><span style="color: #0000ff;">this</span>.nom_bdd, <span style="color: #0000ff;">this</span>.version<span class="br0">&#41;</span>; 
    r.onupgradeneeded = <span class="br0">&#40;</span>evt<span class="br0">&#41;</span> =&gt; <span class="br0">&#123;</span> 
      <span style="color: #0000ff;">this</span>.<span style="color: #0080ff;">installer</span><span class="br0">&#40;</span>evt.target.result<span class="br0">&#41;</span>; 
    <span class="br0">&#125;</span>; 
    r.onblocked = <span class="br0">&#40;</span>evt<span class="br0">&#41;</span> =&gt; <span class="br0">&#123;</span> 
      <span style="color: #0000ff;">this</span>.<span style="color: #0080ff;">_log</span><span class="br0">&#40;</span> 
        <span style="color: #FF0000;">`Une mise &agrave; jour de la base est n&eacute;cessaire </span>
<span style="color: #FF0000;">          pour utiliser cette fonctionnalit&eacute;. Vous </span>
<span style="color: #FF0000;">          devez fermer toutes les pages ouvertes du module et red&eacute;marrer votre </span>
<span style="color: #FF0000;">          navigateur. Si le probl&egrave;me persiste, vous devriez r&eacute;installer le module.`</span> 
      <span class="br0">&#41;</span>; 
    <span class="br0">&#125;</span>; 
    r.onsuccess = <span class="br0">&#40;</span>evt<span class="br0">&#41;</span> =&gt; <span class="br0">&#123;</span> 
      <span style="color: #0000ff;">this</span>.version =  <span style="color: #0080ff;">parseInt</span><span class="br0">&#40;</span>evt.target.result.version<span class="br0">&#41;</span>; 
      <span style="color: #0000ff;">return</span> <span style="color: #0000ff;">this</span>.<span style="color: #0080ff;">poursuivre</span><span class="br0">&#40;</span> 
        evt.target.result
      <span class="br0">&#41;</span>; 
    <span class="br0">&#125;</span>; 
  <span class="br0">&#125;</span> 
<span class="br0">&#125;</span>; 
&nbsp;
<span style="color: #0000ff;">var</span> objR = <span style="color: #0000ff;">new</span> <span style="color: #0080ff;">OuvertureSure</span><span class="br0">&#40;</span>
  <span style="color: #FF0000;">&quot;Tests&quot;</span>
<span class="br0">&#41;</span>; 
&nbsp;
objR.schema_bdd = <span class="br0">&#123;</span> 
  <span style="color: #FF0000;">&quot;saluts&quot;</span> : <span class="br0">&#123;</span><span class="br0">&#125;</span> 
<span class="br0">&#125;</span>; 
&nbsp;
objR.<span style="color: #0080ff;">ouvrir</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</pre></td></tr></table></pre>
</div><br />
<i>PS : quel dommage de ne pas avoir le choix entre SQL et NoSQL dans le développement web. D'autant que les deux supportent des promesses et des fonctions de rappel pour la récursivité des résultats ! </i></blockquote>

]]></content:encoded>
			<dc:creator>Nothus</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/318041-nothus/b4638/javascript-indexeddb-etre-certain-schema-base-detriment-numero-version/</guid>
		</item>
		<item>
			<title>Implanter en quelques lignes Javascript un extracteur de contenus pertinents</title>
			<link>https://www.developpez.net/forums/blogs/318041-nothus/b4460/implanter-quelques-lignes-javascript-extracteur-contenus-pertinents/</link>
			<pubDate>Tue, 26 Dec 2017 11:11:35 GMT</pubDate>
			<description>A l’occasion de l’édition de...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">A l’occasion de l’édition de mon <a href="https://addons.mozilla.org/fr/firefox/addon/nothus-veille/" target="_blank"> nouveau module de gestion RSS (seulement) pour Firefox</a> (pour l’instant) grâce aux possibilités des Web Extension, je me suis retrouvé confronté à un besoin : comment extraire le contenu d’une page HTML dont la profusion et la diversité du net, a le secret ?<br />
<br />
<i>(nb : j'ai publié <a href="https://github.com/JGarderon/Nothus-Veille/" target="_blank">mon code source sur gitHub</a> pour ceux qui sont intéressés et le mot-clé sur Twitter est #NothusVeille) </i><br />
<br />
Ce besoin est un impératif pour produire un bouton « <i>lire un résumé de la page</i> » pour chaque item des flux récupérés. Ou, pour ceux qui l’utilisent déjà, la fonction « lecture » de votre navigateur libre préféré, celui à tête de renard… <br />
<br />
Bref ne garder que la partie visible et intéressante d’un document HTML tel que l’utilisateur voudrait l’avoir. Et si possible en moins d’une centaine de lignes, car l’objectif n’est pas de produire un énième usine à gaz : tant pis si l’outil n’est pas totalement efficace, s’il l’est déjà sur la majorité des sites. Certes il existe déjà des services web qui le font : cependant mon objectif est d’avoir <b>0 traceur</b> pour l’utilisateur du module et <b>pas de dépendance à un service</b> sinon au module lui-même. <br />
<br />
Un bon développeur web dira que c’est assez facile : un élément du DOM dispose de l’attribut en lecture seul « innerText » qui retourne le texte réellement affiché à l’écran. <i>Oui mais</i> : comment savoir dans l’arbre quel nœud ou élément, et bien évidemment quel élément parent car le contenu pertinent est rarement dans un seul, qui puisse nous intéresser ? Le poids / l’intérêt / la répétition des liens, l’aspect général de la page sont autant d’indices… pour un humain. Pour un script, rien ne ressemble plus à un nœud qu’un autre nœud, et un élément à un élément. <br />
<br />
Et le web est, une fois encore, une jungle, qui change rapidement. Cependant quelques fondamentaux demeurent. <br />
<br />
Désespéré (instant dramatique!), il m’a fallu le repas de Noël pour trouver la solution : l’oie rôtie est toujours de bon conseil. Résumé. <br />
<br />
Procédure :<br />
1. Il faut déterminer les éléments qui sont les plus susceptibles de contenir du texte intéressant. <br />
2. Il faut les récupérer et vérifier s’ils existent dans la page.<br />
3. Il  faut trier par ordre d’importance et renvoyer le tout <b>par catégorie d'éléments</b> (il y a donc une priorité principale puis secondaire). <br />
<br />
Variables principales : <br />
- un tableau de tableaux de la manière de déterminer si le contenu doit être gardé, comme la place dans les « priorités » (le chiffre le plus bas est le plus pertinent : l’index numérique du tableau sert de référence) ;<br />
- un objet de « déterminants » les plus probables : comment et quoi récupérer.<br />
<br />
Question subsidiaire : comment sont trouvés les déterminants ? Par l’expérience et une recherche rapide des attributs les plus utilisés pour gérer l’affichage d’une page web dans l’espace francophone. <br />
<br />
En Javascript, cela nous donne : <br />
<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 javascript :</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 /></div></td><td valign="top"><pre style="margin: 0">&nbsp;
<span style="color: #0000ff;">function</span> <span style="color: #0080ff;">ExtraireContenuPertinent</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span> 
	<span style="color: #0000ff;">var</span> priorites = <span class="br0">&#91;</span> 
		<span class="br0">&#91;</span> 
			<span style="color: #FF0000;">&quot;getElementsByTagName&quot;</span>,
			<span class="br0">&#40;</span><span style="color: #0080ff;">element</span><span class="br0">&#41;</span> =&gt; <span class="br0">&#123;</span> <span style="color: #0000ff;">return</span> <span class="br0">&#40;</span><span style="color: #0080ff;">element</span>.length&gt;<span style="color: #cc66cc;">0</span><span class="br0">&#41;</span>?<span style="color: #800000;">true</span>:<span style="color: #339933;">false</span>; <span class="br0">&#125;</span>
		<span class="br0">&#93;</span>,
		<span class="br0">&#91;</span> 
			<span style="color: #FF0000;">&quot;#id&quot;</span>,
			<span class="br0">&#40;</span><span style="color: #0080ff;">element</span><span class="br0">&#41;</span> =&gt; <span class="br0">&#123;</span> <span style="color: #0000ff;">return</span> <span class="br0">&#40;</span><span style="color: #0080ff;">element</span>!=<span style="color: #339933;">null</span><span class="br0">&#41;</span>?<span style="color: #800000;">true</span>:<span style="color: #339933;">false</span>; <span class="br0">&#125;</span>
		<span class="br0">&#93;</span>,
		<span class="br0">&#91;</span> 
			<span style="color: #FF0000;">&quot;getElementsByClassName&quot;</span>,
			<span class="br0">&#40;</span><span style="color: #0080ff;">element</span><span class="br0">&#41;</span> =&gt; <span class="br0">&#123;</span> <span style="color: #0000ff;">return</span> <span class="br0">&#40;</span><span style="color: #0080ff;">element</span>.length&gt;<span style="color: #cc66cc;">0</span><span class="br0">&#41;</span>?<span style="color: #800000;">true</span>:<span style="color: #339933;">false</span>; <span class="br0">&#125;</span>
		<span class="br0">&#93;</span> 
	<span class="br0">&#93;</span>; 
	<span style="color: #0000ff;">var</span> determinants = <span class="br0">&#123;</span>
		<span style="color: #FF0000;">&quot;getElementsByTagName&quot;</span>: <span class="br0">&#91;</span><span style="color: #FF0000;">&quot;article&quot;</span>, <span style="color: #FF0000;">&quot;content&quot;</span><span class="br0">&#93;</span>, 
		<span style="color: #FF0000;">&quot;#id&quot;</span>: <span class="br0">&#91;</span><span style="color: #FF0000;">&quot;page&quot;</span>, <span style="color: #FF0000;">&quot;blog&quot;</span>, <span style="color: #FF0000;">&quot;story&quot;</span>, <span style="color: #FF0000;">&quot;content&quot;</span>, <span style="color: #FF0000;">&quot;page-root&quot;</span>, <span style="color: #FF0000;">&quot;page_root&quot;</span><span class="br0">&#93;</span>, 
		<span style="color: #FF0000;">&quot;getElementsByClassName&quot;</span>: <span class="br0">&#91;</span><span style="color: #FF0000;">&quot;story&quot;</span>, <span style="color: #FF0000;">&quot;blog&quot;</span>, <span style="color: #FF0000;">&quot;article&quot;</span>, <span style="color: #FF0000;">&quot;content&quot;</span>, <span style="color: #FF0000;">&quot;contenu&quot;</span>, <span style="color: #FF0000;">&quot;content&quot;</span>, <span style="color: #FF0000;">&quot;page_content&quot;</span>, <span style="color: #FF0000;">&quot;page_article&quot;</span>, <span style="color: #FF0000;">&quot;page_root&quot;</span>, <span style="color: #FF0000;">&quot;post&quot;</span><span class="br0">&#93;</span> 
	<span class="br0">&#125;</span>
	<span style="color: #0000ff;">var</span> r = <span class="br0">&#123;</span><span class="br0">&#125;</span>; 
	<span style="color: #0000ff;">for</span><span class="br0">&#40;</span><span style="color: #0000ff;">var</span> fct <span style="color: #0000ff;">in</span> determinants<span class="br0">&#41;</span> <span class="br0">&#123;</span> 
		items = determinants<span class="br0">&#91;</span>fct<span class="br0">&#93;</span>; 
		r<span class="br0">&#91;</span>fct<span class="br0">&#93;</span> = items.<span style="color: #0080ff;">map</span><span class="br0">&#40;</span> 
			<span class="br0">&#40;</span>el_cherche, index, els_cherche<span class="br0">&#41;</span> =&gt; <span class="br0">&#123;</span> 
				<span style="color: #0000ff;">if</span> <span class="br0">&#40;</span>fct!=<span style="color: #FF0000;">&quot;#id&quot;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span> 
					<span style="color: #0000ff;">return</span> <span style="color: #0080ff;">document</span>.body<span class="br0">&#91;</span>fct<span class="br0">&#93;</span><span class="br0">&#40;</span>el_cherche<span class="br0">&#41;</span>; 
				<span class="br0">&#125;</span> <span style="color: #0000ff;">else</span> <span class="br0">&#123;</span> 
					<span style="color: #0000ff;">return</span> <span style="color: #0080ff;">document</span>.<span style="color: #0080ff;">getElementById</span><span class="br0">&#40;</span>el_cherche<span class="br0">&#41;</span>; 
				<span class="br0">&#125;</span> 
			<span class="br0">&#125;</span> 
		<span class="br0">&#41;</span>; 
	<span class="br0">&#125;</span> 
	<span style="color: #0000ff;">for</span> <span class="br0">&#40;</span><span style="color: #0000ff;">var</span> i=<span style="color: #cc66cc;">0</span>; i&lt;priorites.<span style="color: #0080ff;">length</span>; i++<span class="br0">&#41;</span> <span class="br0">&#123;</span> 
		<span style="color: #0000ff;">var</span> _r = r<span class="br0">&#91;</span>priorites<span class="br0">&#91;</span>i<span class="br0">&#93;</span><span class="br0">&#91;</span><span style="color: #cc66cc;">0</span><span class="br0">&#93;</span><span class="br0">&#93;</span>.<span style="color: #0080ff;">filter</span><span class="br0">&#40;</span> 
			priorites<span class="br0">&#91;</span>i<span class="br0">&#93;</span><span class="br0">&#91;</span><span style="color: #cc66cc;">1</span><span class="br0">&#93;</span> 
		<span class="br0">&#41;</span>; 
		<span style="color: #0000ff;">if</span> <span class="br0">&#40;</span>_r.length&gt;<span style="color: #cc66cc;">0</span><span class="br0">&#41;</span> 
			<span style="color: #0000ff;">return</span> <span class="br0">&#91;</span>priorites<span class="br0">&#91;</span>i<span class="br0">&#93;</span><span class="br0">&#91;</span><span style="color: #cc66cc;">0</span><span class="br0">&#93;</span>, _r<span class="br0">&#93;</span>; 
	<span class="br0">&#125;</span> 
	<span style="color: #0000ff;">return</span> <span style="color: #339933;">false</span>; 
<span class="br0">&#125;</span>; 
&nbsp;
<span style="color: #0000ff;">var</span> elC = <span style="color: #0080ff;">ExtraireContenuPertinent</span><span class="br0">&#40;</span><span class="br0">&#41;</span>; 
<span style="color: #0000ff;">if</span> <span class="br0">&#40;</span>elC!=<span style="color: #339933;">false</span><span class="br0">&#41;</span> 
	console.<span style="color: #0080ff;">log</span><span class="br0">&#40;</span> 
		elC
	<span class="br0">&#41;</span>;</pre></td></tr></table></pre>
</div><br />
Ce code, exécuté dans une page, renverra la liste des éléments trouvés les plus pertinents (pas tous!). <br />
<br />
Ainsi ce script exécuté <a href="http://www.lemonde.fr/afrique/article/2017/12/26/au-liberia-george-weah-favori-du-second-tour-de-l-election-presidentielle_5234481_3212.html" target="_blank">sur cette page</a>, dispose d'un rendu conforme à ce qui est attendu - même s’il reste quelques portions incongrues -, au travers d’un collection HTML dont le premier élément est la balise <i>article</i> : <br />
<br />
<div style="margin-left:40px">COMPTE RENDU<br />
<br />
Au Liberia, George Weah favori du second tour de l’élection présidentielle<br />
<br />
Le scrutin oppose l’ex-star du football, arrivée en tête au premier tour, au vice-président sortant, Joseph Boakai.<br />
<br />
Le Monde.fr avec AFP Le 26.12.2017 à 09h44 • Mis à jour le 26.12.2017 à 10h05<br />
<br />
S'abonner dès 1 €<br />
 Réagir<br />
 Ajouter<br />
<br />
Partager (86)<br />
Tweeter<br />
<br />
Au lendemain de festivités de Noël plus sobres que d’habitude, les Libériens votent, mardi 26 décembre, pour élire leur nouveau président lors d’un second tour qui oppose une légende du football, George Weah, au vice-président sortant, Joseph Boakai. (...)</div></blockquote>

]]></content:encoded>
			<dc:creator>Nothus</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/318041-nothus/b4460/implanter-quelques-lignes-javascript-extracteur-contenus-pertinents/</guid>
		</item>
		<item>
			<title><![CDATA[[Python] Chiffrement symétrique par portion]]></title>
			<link>https://www.developpez.net/forums/blogs/318041-nothus/b3610/python-chiffrement-symetrique-portion/</link>
			<pubDate>Wed, 23 Aug 2017 11:00:37 GMT</pubDate>
			<description>Principes et état d’esprit 
...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore"><font size="3"><font color="#FF8C00">Principes et état d’esprit</font></font><br />
<br />
Rappel&nbsp;: <i>un <u>signe</u> est un élément d’<u>imprimerie</u>. Les signes correspondent à l’ensemble des caractères imprimables ainsi que les espaces et les caractères spéciaux.</i><br />
<br />
Il s’agit d'observer aujourd’hui une méthode de chiffrement symétrique à transposition&nbsp;: on modifie mathématiquement l’ordre du contenu, sans en changer les symboles représentés. Elle utilise un principe similaire à celui utilisé par le chiffrement AES. Ce type de chiffrement symétrique n’augmente pas la taille totale transférée du message, en dehors de la clé utilisée (qui peut être utilisée à plusieurs reprises, même si ce n'est pas conseillé...).<br />
<br />
Cette méthode semble indéchiffrable (le contenu est temporairement «&nbsp;perdu&nbsp;»)  à une condition&nbsp;: que ladite clé reste secrète. C’est pour cette raison que l’utilisation sur Internet n’est pas possible – tout du moins sans utiliser d&#146;’abord un chiffrement asymétrique à clés publiques&nbsp;! Dans ce cas, la sécurité totale du système d’échange repose sur la fiabilité du chiffrement asymétrique&nbsp;: l’interception de la clé symétrique sur une connexion chiffrée asymétriquement mais écoutée et piratée, fait perdre toute la confidentialité. Le couple symétrique/asymétrique n’a donc  intérêt (sauf saucuneous certaines conditions trop particulières, comme sur des lignes optiques polarisées) car la fiabilité du chiffrement asymétrique suffit à garantir la sécurité du message.<br />
<br />
Il existe de nombreuses raisons de chiffrer symétriquement ses messages&nbsp;: la confidentialité bien sûr, mais parfois aussi des raisons techniques, en obligeant à des opérations sur le message qui permet d’en garantir «&nbsp;totalement&nbsp;» le contenu. Ne rentrons pas ici sur les limites juridiques ainsi que les questions illégales que peuvent cacher le chiffrement&nbsp;: <b>il s’agit d’un outil,</b> comme un couteau - qui peut aider l’homme à manger et à se défendre, comme à tuer son prochain ou à agresser. <b>C’est moins la fonction de l’outil que l’usage qui en détermine une forme de moralité…</b><br />
<br />
Dans mon exemple, un texte (long) et une phrase «&nbsp;passe&nbsp;» (donc la longueur doit être raisonnable, au moins égale au quart de la taille de la matrice utilisée et où cette matrice est dimensionnée au paquet de signes à traiter à un instant <i>t</i>), seront utilisés conjointement.<br />
<br />
L’intérêt de la phrase «&nbsp;passe&nbsp;» est d’en retenir une suite de chiffres – ça tombe bien, Python utilise ce principe pour gérer ses strings -, qui sera associée à des opérations (en réalité à des fonctions bêtes). Ces opérations peuvent être potentiellement publiques&nbsp;: c’est leur ordre et leur fréquence qui comptent. La connaissance de l’opération individuelle (où même d’une partie) <b>ne permet pas</b> de connaître le chiffrement général. Le code source de cet outil peut être diffusé sans restriction. <br />
<br />
La phrase «&nbsp;passe&nbsp;» est donc la recette du chiffrement&nbsp;: elle donne à la fois l’ordre et le nombre d’opérations  à effectuer une matrice de caractères/signes, eux aussi convertis en nombre. Ainsi, tel que les noms de domaine sur le web, on retient une phrase humainement compréhensible (donc plus facile à retenir) qu’une suite de chiffres ou d'expédients / d'indications…<br />
<br />
Exemple&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">&gt;&gt;&gt; list<span class="br0">&#40;</span>map<span class="br0">&#40;</span>ord,list<span class="br0">&#40;</span><span style="color: #FF0000;">&quot;toto va au march&eacute;&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span style="color: #808080;"># ---&gt; la fonction native de Python &quot;ord&quot;, donne la repr&eacute;sentation le code Unicode</span>
<span class="br0">&#91;</span><span style="color: #cc66cc;">116</span>, <span style="color: #cc66cc;">111</span>, <span style="color: #cc66cc;">116</span>, <span style="color: #cc66cc;">111</span>, <span style="color: #cc66cc;">32</span>, <span style="color: #cc66cc;">118</span>, <span style="color: #cc66cc;">97</span>, <span style="color: #cc66cc;">32</span>, <span style="color: #cc66cc;">97</span>, <span style="color: #cc66cc;">117</span>, <span style="color: #cc66cc;">32</span>, <span style="color: #cc66cc;">109</span>, <span style="color: #cc66cc;">97</span>, <span style="color: #cc66cc;">114</span>, <span style="color: #cc66cc;">99</span>, <span style="color: #cc66cc;">104</span>, <span style="color: #cc66cc;">233</span><span class="br0">&#93;</span>
<span class="br0">&#123;</span> effectuer l&#146;op&eacute;ration <span style="color: #cc66cc;">116</span> puis <span style="color: #cc66cc;">111</span> puis <span style="color: #cc66cc;">116</span> puis <span style="color: #cc66cc;">111</span> puis <span style="color: #cc66cc;">32</span> &#133; <span class="br0">&#125;</span></pre></td></tr></table></pre>
</div><br />
Pour simplifier, nous utiliserons seulement trois caractères différents, qui resteront des caractères, correspondant à une opération «&nbsp;simple&nbsp;» de matrice sous Numpy&nbsp;:<br />
<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:192px;"><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 /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">def</span> operation_A<span class="br0">&#40;</span>npArray<span class="br0">&#41;</span>:
    <span style="color: #0000ff;">return</span> np.roll<span class="br0">&#40;</span>npArray,<span style="color: #cc66cc;">1</span><span class="br0">&#41;</span>  
&nbsp;
<span style="color: #0000ff;">def</span> operation_B<span class="br0">&#40;</span>npArray<span class="br0">&#41;</span>:
    <span style="color: #0000ff;">return</span> np.rot90<span class="br0">&#40;</span>npArray<span class="br0">&#41;</span>
&nbsp;
<span style="color: #0000ff;">def</span> operation_C<span class="br0">&#40;</span>npArray<span class="br0">&#41;</span>:
    <span style="color: #0000ff;">return</span> np.flip<span class="br0">&#40;</span>npArray,<span style="color: #cc66cc;">1</span><span class="br0">&#41;</span>
&nbsp;
OPERATIONS = <span class="br0">&#123;</span>
    <span style="color: #FF0000;">&quot;a&quot;</span>&nbsp;: operation_A,
    <span style="color: #FF0000;">&quot;b&quot;</span>&nbsp;: operation_B,
    <span style="color: #FF0000;">&quot;c&quot;</span>&nbsp;: operation_C
<span class="br0">&#125;</span></pre></td></tr></table></pre>
</div><br />
<font color="#FF8C00"><font size="3">Fonctionnement</font></font><br />
<br />
Nous allons tout d’abord créer une matrice avec Numpy, en veillant à ne pas dépasser une certaine taille de matrice, qui correspond à une portion arbitraire du texte à chiffrer. Si la portion est trop petite, on ajoute à DROITE le nombre de signes nécessaires par un signe pris au hasard DANS L’ENSEMBLE du texte à chiffre. Gardons à l'esprit que ce signe ajouté se doit d'être plutôt dans une fréquence d’apparition basse. <br />
<br />
Création de la matrice&nbsp;:<br />
<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 /></div></td><td valign="top"><pre style="margin: 0">MATRICES_taille = <span class="br0">&#40;</span><span style="color: #cc66cc;">5</span>,<span style="color: #cc66cc;">5</span><span class="br0">&#41;</span>
MATRICES_nbre = MATRICES_taille<span class="br0">&#91;</span><span style="color: #cc66cc;">0</span><span class="br0">&#93;</span> * MATRICES_taille<span class="br0">&#91;</span><span style="color: #cc66cc;">1</span><span class="br0">&#93;</span> 
&nbsp;
<span style="color: #0000ff;">import</span> numpy <span style="color: #0000ff;">as</span> np
&nbsp;
<span style="color: #0000ff;">def</span> matrice_creer<span class="br0">&#40;</span>texte_portion,ajout=<span style="color: #FF0000;">&quot;*&quot;</span><span class="br0">&#41;</span>:
    <span style="color: #0000ff;">if</span> len<span class="br0">&#40;</span>texte_portion<span class="br0">&#41;</span>&lt;MATRICES_nbre:
        texte_portion = texte_portion.rjust<span class="br0">&#40;</span>MATRICES_nbre, ajout<span class="br0">&#41;</span>
    <span style="color: #0000ff;">elif</span> len<span class="br0">&#40;</span>texte_portion<span class="br0">&#41;</span>&gt;MATRICES_nbre:
        <span style="color: #0000ff;">raise</span> ValueError<span class="br0">&#40;</span>
            <span style="color: #FF0000;">&quot;la portion de texte ne peut exc&eacute;dent&nbsp;%s signes&quot;</span>&nbsp;% MATRICES_nbre
        <span class="br0">&#41;</span>
    texte_portion = np.asarray<span class="br0">&#40;</span>
        list<span class="br0">&#40;</span>map<span class="br0">&#40;</span>ord,list<span class="br0">&#40;</span>texte_portion<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
    <span class="br0">&#41;</span>
    texte_portion = np.reshape<span class="br0">&#40;</span>
        texte_portion,
        MATRICES_taille
    <span class="br0">&#41;</span>
    <span style="color: #0000ff;">return</span> texte_portion</pre></td></tr></table></pre>
</div><br />
Au choix, trouver l’ajout&nbsp;:<br />
<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:192px;"><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 /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">def</span> occurences_chgt_frequence<span class="br0">&#40;</span>texte<span class="br0">&#41;</span>: <span style="color: #808080;"># ---&gt; &laquo;&nbsp;hasard&nbsp;&raquo; total</span>
    <span style="color: #0000ff;">return</span> <span style="color: #FF0000;">''</span>.join<span class="br0">&#40;</span>random.choice<span class="br0">&#40;</span>list<span class="br0">&#40;</span>texte<span class="br0">&#41;</span><span class="br0">&#41;</span> <span style="color: #0000ff;">for</span> _ <span style="color: #0000ff;">in</span> range<span class="br0">&#40;</span><span style="color: #cc66cc;">1</span><span class="br0">&#41;</span><span class="br0">&#41;</span>
&nbsp;
<span style="color: #0000ff;">def</span> occurences_chgt_frequence<span class="br0">&#40;</span>texte<span class="br0">&#41;</span>: <span style="color: #808080;"># ---&gt; le premier des signes les moins fr&eacute;quents</span>
    frequence = list<span class="br0">&#40;</span>
        <span class="br0">&#40;</span>
            lettre, texte.count<span class="br0">&#40;</span>lettre<span class="br0">&#41;</span>
        <span class="br0">&#41;</span> <span style="color: #0000ff;">for</span> lettre <span style="color: #0000ff;">in</span> list<span class="br0">&#40;</span>texte<span class="br0">&#41;</span>
    <span class="br0">&#41;</span>
    <span style="color: #0000ff;">return</span> sorted<span class="br0">&#40;</span>
        frequence,
        key = <span style="color: #0000ff;">lambda</span> couple: couple<span class="br0">&#91;</span><span style="color: #cc66cc;">1</span><span class="br0">&#93;</span>
    <span class="br0">&#41;</span><span class="br0">&#91;</span><span style="color: #cc66cc;">0</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span style="color: #cc66cc;">0</span><span class="br0">&#93;</span></pre></td></tr></table></pre>
</div><br />
Le corps du script, ici pour seulement les 20 premiers caractères afin de garder de se placer dans un cas un peu spécial&nbsp;:<br />
<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 /></div></td><td valign="top"><pre style="margin: 0">phrase = <span style="color: #FF0000;">&quot;abcaabacaabacccaba&quot;</span>
&nbsp;
texte_original = <span style="color: #FF0000;">&quot;Ceci est un message totalement confidentiel: \</span>
<span style="color: #FF0000;">les coordonn&eacute;es du paquet de cookies sont au placard haut, \</span>
<span style="color: #FF0000;">&eacute;tag&egrave;re de droite. Stop.&quot;</span>
&nbsp;
ajout = occurences_chgt_frequence<span class="br0">&#40;</span>
    texte_original
<span class="br0">&#41;</span>
&nbsp;
texte_np = matrice_creer<span class="br0">&#40;</span>
    texte_original<span class="br0">&#91;</span><span style="color: #cc66cc;">0</span>:<span style="color: #cc66cc;">20</span><span class="br0">&#93;</span>,
    ajout
<span class="br0">&#41;</span>
&nbsp;
<span style="color: #0000ff;">for</span> signe <span style="color: #0000ff;">in</span> phrase:
    texte_np = OPERATIONS<span class="br0">&#91;</span>signe<span class="br0">&#93;</span><span class="br0">&#40;</span>
        texte_np
    <span class="br0">&#41;</span>
&nbsp;
texte_np = np.reshape<span class="br0">&#40;</span>
    texte_np,
    <span class="br0">&#40;</span><span style="color: #cc66cc;">1</span>, MATRICES_nbre<span class="br0">&#41;</span>
<span class="br0">&#41;</span>
&nbsp;
<span style="color: #0000ff;">print</span><span class="br0">&#40;</span><span style="color: #FF0000;">&quot;&quot;</span>.join<span class="br0">&#40;</span>list<span class="br0">&#40;</span>map<span class="br0">&#40;</span>chr,texte_np.tolist<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#91;</span><span style="color: #cc66cc;">0</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span></pre></td></tr></table></pre>
</div><br />
Lorsque j’exécute le script, en laissant le signe d’ajout à l’opérateur étoile («&nbsp;*&nbsp;»), voici ce que cela donne pour la portion 0:20&nbsp;:<br />
<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: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">Phrase &quot;abcaabacaabacccaba&quot; &#8594; <b>****** ic*Cu t*e***ens **</b>

Phrase &quot;abcaabacaabaccaba&quot; &#8594; <b>eu t*e ic*C***** ***sn***</b></pre></td></tr></table></pre>
</div>… donc le changement d’un seul caractère dans la phrase «&nbsp;passe&nbsp;» a profondément changé la portion chiffrée.<br />
<br />
Voici pour la totalité du message&nbsp;:<br />
<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: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">Phrase &quot;abcaabacaabacccaba&quot; &#8594; <b>uot egaCttnemel tedifnos l&nbsp;:leiandrooc ced seéntoteuqapsukooc en tnos s icalp ud tuah dearègatéa,ord edreotS .e ise ice pt.sem n</b>

Phrase &quot;abcaabacaabaccaba&quot; &#8594;  <b>otS .e iord edrerègatéa,tuah deacalp ud tnos s ikooc en teuqapsud seéntodrooc cel&nbsp;:leianedifnos tnemel tot egaCt.sem nutpse ice</b></pre></td></tr></table></pre>
</div><font size="3"><font color="#FF8C00">Principales observations </font></font><br />
<br />
– Il est possible d’associer plusieurs phrases «&nbsp;passe&nbsp;», en fonction du nombre de relais&nbsp;: chacun peut ainsi avoir un «&nbsp;maillon de la chaîne&nbsp;» (principe du <i>block-chain</i>) lisible et le reste du contenu indéchiffrable. Utile pour avoir un relais sans confiance (il n’a pas la possibilité de connaître le contenu) ou par exemple donner des indications (envoyer le reste du contenu à tel relais si on envoie des paquets, effectuer un traitement / une vérification, etc).<br />
<br />
– Le travail non directement sur des nombres sous Numpy, mais des matrices de&nbsp;bits, change l’ordre du contenu et aussi la représentation envoyées&nbsp;: en effet, chaque bit étant rangé dans un ordre différent, la matrice revenue à une seule dimension, donnera des signes RADICALEMENT différents.<br />
<br />
– Rendre publiques les opérations (et notamment la taille générique de la matrice), pour ne transférer secrètement que les phrases «&nbsp;passe&nbsp;» et le texte chiffré, économise BEAUCOUP de données transférées.<br />
<br />
– Utiliser tous les signes usuels de l’alphabet, pour n’envoyer que des indications de ressources entre deux personnes, qui échangeront ensuite numériquement&nbsp;: ainsi la page 112 de telle édition de tel ouvrage sert de phrase «&nbsp;passe&nbsp;»… D’ailleurs la phrase peut être envoyée généralement par tout moyen sécurisé (connexion TSL, liaison optique polarisée, pigeon avec un entraînement militaire, bouteille à la mer… ah non pas la bouteille).<br />
<br />
– Avoir un jeu de plusieurs alternatives pour une même opération et en avoir, à l’avance, déterminé l’usage&nbsp;: ainsi l’opération 1-1 est utilisée une fois, puis si elle est appelée à nouveau (pour une nouvelle portion) l’opération 1-2, puis si elle est appelée à nouveau l'opération 1-3, puis on revient à 1-1, etc. L’intérêt est de rajouter un (gros) grain de sable et de rendre pratiquement impossible à déterminer une série d’opérations, pourtant toutes connues par le potentiel espion...<br />
<br />
– Une telle méthode est idéale pour «&nbsp;couper&nbsp;» le chiffrement d’un contenu très important en une multitude de portions, permettant l’usage facilité de l’asynchronisme. <br />
<br />
<font size="3"><font color="#FF8C00">Edition - ajout d'un exemple plus complet</font></font><br />
<br />
Voici un exemple complet, asynchrone, qui n'utilise pas Numpy et à vocation pédagogique&nbsp;: <br />
<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="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 />221<br />222<br />223<br />224<br />225<br />226<br />227<br />228<br />229<br />230<br />231<br />232<br />233<br />234<br />235<br />236<br />237<br />238<br />239<br />240<br />241<br />242<br />243<br />244<br />245<br />246<br />247<br />248<br />249<br />250<br />251<br />252<br />253<br />254<br />255<br />256<br />257<br />258<br />259<br />260<br />261<br />262<br />263<br />264<br />265<br />266<br />267<br />268<br />269<br />270<br />271<br />272<br />273<br />274<br />275<br />276<br />277<br />278<br />279<br />280<br />281<br />282<br />283<br />284<br />285<br />286<br />287<br />288<br /></div></td><td valign="top"><pre style="margin: 0">&nbsp;
<span style="color: #0000ff;">import</span> re 
&nbsp;
<span style="color: #0000ff;">class</span> MatriceSimple:
&nbsp;
    debug = <span style="color: #339933;">False</span> 
&nbsp;
    MATRICE_taille_colonne = <span style="color: #cc66cc;">8</span>  
    OPERATIONS = <span class="br0">&#123;</span><span class="br0">&#125;</span> 
&nbsp;
    operations_binaires = <span style="color: #339933;">False</span> 
&nbsp;
    <span style="color: #0000ff;">def</span> <span style="color: #0080ff;">__init__</span><span class="br0">&#40;</span>self, contenu_original, binaire=<span style="color: #339933;">False</span> <span class="br0">&#41;</span>:
        self.contenu_original = contenu_original
        self.matriceComplexe = <span style="color: #339933;">False</span>
        self.operations_binaires = <span style="color: #339933;">True</span> <span style="color: #0000ff;">if</span> binaire <span style="color: #0000ff;">is</span> <span style="color: #339933;">True</span> <span style="color: #0000ff;">else</span> <span style="color: #339933;">False</span> 
&nbsp;
    <span style="color: #0000ff;">def</span> __log__<span class="br0">&#40;</span>self, *args<span class="br0">&#41;</span>:
        <span style="color: #FF0000;">&quot;&quot;&quot;m&eacute;thode de log interne&nbsp;; &agrave; surcharger&quot;&quot;&quot;</span>
        <span style="color: #0000ff;">if</span> self.debug:
            <span style="color: #0000ff;">print</span><span class="br0">&#40;</span>*args<span class="br0">&#41;</span>
&nbsp;
    <span style="color: #0000ff;">def</span> peupler<span class="br0">&#40;</span>self<span class="br0">&#41;</span>:
        <span style="color: #0000ff;">if</span> self.operations_binaires: 
            matriceSimple = list<span class="br0">&#40;</span>
                <span style="color: #FF0000;">&quot;&quot;</span>.join<span class="br0">&#40;</span>
                    <span class="br0">&#40;</span>
                        bin<span class="br0">&#40;</span>ord<span class="br0">&#40;</span>signe<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#91;</span><span style="color: #cc66cc;">2</span>:<span class="br0">&#93;</span>
                    <span class="br0">&#41;</span>.rjust<span class="br0">&#40;</span><span style="color: #cc66cc;">8</span>,<span style="color: #FF0000;">&quot;0&quot;</span><span class="br0">&#41;</span> <span style="color: #0000ff;">for</span> signe <span style="color: #0000ff;">in</span> self.contenu_original 
                <span class="br0">&#41;</span>
            <span class="br0">&#41;</span> 
        <span style="color: #0000ff;">else</span>:
            matriceSimple = list<span class="br0">&#40;</span>self.contenu_original<span class="br0">&#41;</span>
        <span style="color: #0000ff;">yield</span>
        self.matriceComplexe = <span class="br0">&#91;</span>
            <span class="br0">&#91;</span><span class="br0">&#93;</span> 
        <span class="br0">&#93;</span> 
        y = <span style="color: #cc66cc;">0</span> 
        <span style="color: #0000ff;">for</span> bit <span style="color: #0000ff;">in</span> matriceSimple: 
            <span style="color: #0000ff;">if</span> len<span class="br0">&#40;</span>self.matriceComplexe<span class="br0">&#91;</span>y<span class="br0">&#93;</span><span class="br0">&#41;</span> &gt;= self.MATRICE_taille_colonne:
                self.matriceComplexe.append<span class="br0">&#40;</span> 
                    <span class="br0">&#91;</span><span class="br0">&#93;</span> 
                <span class="br0">&#41;</span>
                y += <span style="color: #cc66cc;">1</span> 
            self.matriceComplexe<span class="br0">&#91;</span>y<span class="br0">&#93;</span>.append<span class="br0">&#40;</span> 
                bit
            <span class="br0">&#41;</span>
            <span style="color: #0000ff;">yield</span> 
&nbsp;
    <span style="color: #0000ff;">def</span> crypter<span class="br0">&#40;</span>self, phrase, inverse=<span style="color: #339933;">False</span><span class="br0">&#41;</span>: 
        <span style="color: #0000ff;">yield</span> <span style="color: #0000ff;">from</span> self.__matrice_transformer__<span class="br0">&#40;</span>
            phrase <span style="color: #0000ff;">if</span> inverse <span style="color: #0000ff;">is</span> <span style="color: #339933;">False</span> <span style="color: #0000ff;">else</span> phrase<span class="br0">&#91;</span>::-<span style="color: #cc66cc;">1</span><span class="br0">&#93;</span>,
            inverse 
        <span class="br0">&#41;</span> 
&nbsp;
    <span style="color: #0000ff;">def</span> decrypter<span class="br0">&#40;</span>self, phrase<span class="br0">&#41;</span>:
        <span style="color: #0000ff;">yield</span> <span style="color: #0000ff;">from</span> self.crypter<span class="br0">&#40;</span> 
            phrase,
            <span style="color: #339933;">True</span>  
        <span class="br0">&#41;</span> 
&nbsp;
    <span style="color: #0000ff;">def</span> __matrice_creer__<span class="br0">&#40;</span>self<span class="br0">&#41;</span>: 
        <span style="color: #0000ff;">yield</span>
        matriceSimple = list<span class="br0">&#40;</span>
            <span style="color: #FF0000;">&quot;&quot;</span>.join<span class="br0">&#40;</span>
                <span class="br0">&#40;</span> 
                    bin<span class="br0">&#40;</span>ord<span class="br0">&#40;</span>signe<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#91;</span><span style="color: #cc66cc;">2</span>:<span class="br0">&#93;</span>
                <span class="br0">&#41;</span>.rjust<span class="br0">&#40;</span><span style="color: #cc66cc;">8</span>,<span style="color: #FF0000;">&quot;0&quot;</span><span class="br0">&#41;</span> <span style="color: #0000ff;">for</span> signe <span style="color: #0000ff;">in</span> self.contenu_original 
            <span class="br0">&#41;</span>
        <span class="br0">&#41;</span> 
        <span style="color: #0000ff;">yield</span>
        self.matriceComplexe = <span class="br0">&#91;</span>
            <span class="br0">&#91;</span><span class="br0">&#93;</span> 
        <span class="br0">&#93;</span> 
        y = <span style="color: #cc66cc;">0</span> 
        <span style="color: #0000ff;">for</span> bit <span style="color: #0000ff;">in</span> matriceSimple: 
            <span style="color: #0000ff;">if</span> len<span class="br0">&#40;</span>self.matriceComplexe<span class="br0">&#91;</span>y<span class="br0">&#93;</span><span class="br0">&#41;</span> &gt; self.MATRICES_taille<span class="br0">&#91;</span><span style="color: #cc66cc;">1</span><span class="br0">&#93;</span>:
                self.matriceComplexe.append<span class="br0">&#40;</span>
                    <span class="br0">&#91;</span><span class="br0">&#93;</span> 
                <span class="br0">&#41;</span>
                y += <span style="color: #cc66cc;">1</span> 
            self.matriceComplexe<span class="br0">&#91;</span>y<span class="br0">&#93;</span>.append<span class="br0">&#40;</span> 
                bit
            <span class="br0">&#41;</span>
            <span style="color: #0000ff;">yield</span> 
&nbsp;
    <span style="color: #0000ff;">def</span> __matrice_transformer__<span class="br0">&#40;</span>self, phrase, inverse<span class="br0">&#41;</span>:
        <span style="color: #0000ff;">for</span> op_id <span style="color: #0000ff;">in</span> phrase:
            <span style="color: #0000ff;">try</span>:
                fct = getattr<span class="br0">&#40;</span> 
                    self, 
                    <span style="color: #FF0000;">&quot;operation_%s&quot;</span>&nbsp;% op_id
                <span class="br0">&#41;</span> 
                self.__log__<span class="br0">&#40;</span>
                    <span style="color: #FF0000;">&quot;op&eacute;ration '%s' demand&eacute;e&nbsp;:&nbsp;%s &quot;</span>&nbsp;% <span class="br0">&#40;</span>
                        op_id,
                        fct.<span style="color: #0080ff;">__doc__</span>
                    <span class="br0">&#41;</span>
                <span class="br0">&#41;</span>
                <span style="color: #0000ff;">yield</span> <span style="color: #0000ff;">from</span> fct<span class="br0">&#40;</span> 
                    op_id, 
                    inverse 
                <span class="br0">&#41;</span>
            <span style="color: #0000ff;">except</span>:
                <span style="color: #0000ff;">raise</span> ValueError<span class="br0">&#40;</span><span style="color: #FF0000;">&quot;cette op&eacute;ration '%s' n'existe pas&quot;</span>&nbsp;% op_id<span class="br0">&#41;</span> 
&nbsp;
    <span style="color: #0000ff;">def</span> extraire<span class="br0">&#40;</span>self<span class="br0">&#41;</span>:
        matrice = <span style="color: #0000ff;">yield</span> <span style="color: #0000ff;">from</span> self.__matrice_reduire__<span class="br0">&#40;</span><span class="br0">&#41;</span> 
        message = <span style="color: #0000ff;">yield</span> <span style="color: #0000ff;">from</span> self.__matrice_traduire__<span class="br0">&#40;</span>
            matrice  
        <span class="br0">&#41;</span>
        <span style="color: #0000ff;">return</span> message 
&nbsp;
    <span style="color: #0000ff;">def</span> __matrice_reduire__<span class="br0">&#40;</span>self<span class="br0">&#41;</span>: 
        <span style="color: #0000ff;">if</span> self.matriceComplexe <span style="color: #0000ff;">is</span> <span style="color: #339933;">False</span>:
            <span style="color: #0000ff;">raise</span> Exception<span class="br0">&#40;</span> 
                <span style="color: #FF0000;">&quot;aucun contenu encore crypt&eacute;&quot;</span>
            <span class="br0">&#41;</span> 
       &nbsp;bits_modifies = <span class="br0">&#91;</span><span class="br0">&#93;</span> 
        <span style="color: #0000ff;">for</span> ligne <span style="color: #0000ff;">in</span> self.matriceComplexe: 
            <span style="color: #0000ff;">for</span> bit <span style="color: #0000ff;">in</span> ligne:
               &nbsp;bits_modifies.append<span class="br0">&#40;</span>bit<span class="br0">&#41;</span> 
                <span style="color: #0000ff;">yield</span>
        <span style="color: #0000ff;">return</span>&nbsp;bits_modifies
&nbsp;
    <span style="color: #0000ff;">def</span> __matrice_traduire__<span class="br0">&#40;</span>self, matriceSimple<span class="br0">&#41;</span>: 
        message = <span class="br0">&#91;</span><span class="br0">&#93;</span> 
        <span style="color: #0000ff;">if</span> self.operations_binaires:
            <span style="color: #0000ff;">for</span> bit <span style="color: #0000ff;">in</span> re.finditer<span class="br0">&#40;</span>
                <span style="color: #FF0000;">&quot;([01]{8})&quot;</span>,
                <span style="color: #FF0000;">&quot;&quot;</span>.join<span class="br0">&#40;</span>matriceSimple<span class="br0">&#41;</span>
            <span class="br0">&#41;</span>: 
                    message.append<span class="br0">&#40;</span>
                        chr<span class="br0">&#40;</span>
                            int<span class="br0">&#40;</span>
                                bit.group<span class="br0">&#40;</span><span style="color: #cc66cc;">0</span><span class="br0">&#41;</span>,
                                <span style="color: #cc66cc;">2</span>
                            <span class="br0">&#41;</span>
                        <span class="br0">&#41;</span> 
                    <span class="br0">&#41;</span>
                    <span style="color: #0000ff;">yield</span>
        <span style="color: #0000ff;">else</span>:
            <span style="color: #0000ff;">for</span> signe <span style="color: #0000ff;">in</span> matriceSimple: 
                message.append<span class="br0">&#40;</span>
                    signe  
                <span class="br0">&#41;</span>
                <span style="color: #0000ff;">yield</span>  
        <span style="color: #0000ff;">return</span> <span style="color: #FF0000;">&quot;&quot;</span>.join<span class="br0">&#40;</span>message<span class="br0">&#41;</span>
&nbsp;
<span style="color: #0000ff;">class</span> CryptRapide<span class="br0">&#40;</span>MatriceSimple<span class="br0">&#41;</span>:
&nbsp;
    <span style="color: #0000ff;">def</span> operation_A<span class="br0">&#40;</span>self, op_id, inverse=<span style="color: #339933;">False</span><span class="br0">&#41;</span>:
        <span style="color: #FF0000;">&quot;&quot;&quot;d&eacute;calage d'une ligne&quot;&quot;&quot;</span>
        ancienne_matrice = self.matriceComplexe<span class="br0">&#91;</span>:<span class="br0">&#93;</span>
        <span style="color: #0000ff;">yield</span>
        <span style="color: #0000ff;">if</span> inverse:
            self.matriceComplexe = <span class="br0">&#91;</span>ancienne_matrice<span class="br0">&#91;</span>-<span style="color: #cc66cc;">1</span><span class="br0">&#93;</span>,<span class="br0">&#93;</span>+ancienne_matrice<span class="br0">&#91;</span><span style="color: #cc66cc;">0</span>:-<span style="color: #cc66cc;">1</span><span class="br0">&#93;</span> 
        <span style="color: #0000ff;">else</span>: 
            self.matriceComplexe = ancienne_matrice<span class="br0">&#91;</span><span style="color: #cc66cc;">1</span>:<span class="br0">&#93;</span>+<span class="br0">&#91;</span>ancienne_matrice<span class="br0">&#91;</span><span style="color: #cc66cc;">0</span><span class="br0">&#93;</span>,<span class="br0">&#93;</span> 
&nbsp;
    <span style="color: #0000ff;">def</span> operation_B<span class="br0">&#40;</span>self, op_id, inverse=<span style="color: #339933;">False</span><span class="br0">&#41;</span>:
        <span style="color: #FF0000;">&quot;&quot;&quot;d&eacute;calage d'une colonne dans chaque ligne&quot;&quot;&quot;</span> 
        ancienne_matrice = self.matriceComplexe<span class="br0">&#91;</span>:<span class="br0">&#93;</span> 
        <span style="color: #0000ff;">yield</span>
        nouvelle_matrice = <span class="br0">&#91;</span><span class="br0">&#93;</span> 
        <span style="color: #0000ff;">if</span> inverse:
            <span style="color: #0000ff;">for</span> ligne <span style="color: #0000ff;">in</span> ancienne_matrice:
                ligne = ligne<span class="br0">&#91;</span>:<span class="br0">&#93;</span>
                nouvelle_matrice.append<span class="br0">&#40;</span>
                    <span class="br0">&#91;</span>ligne<span class="br0">&#91;</span>-<span style="color: #cc66cc;">1</span><span class="br0">&#93;</span>,<span class="br0">&#93;</span> + ligne<span class="br0">&#91;</span><span style="color: #cc66cc;">0</span>:-<span style="color: #cc66cc;">1</span><span class="br0">&#93;</span> 
                <span class="br0">&#41;</span> 
                <span style="color: #0000ff;">yield</span>
        <span style="color: #0000ff;">else</span>: 
            <span style="color: #0000ff;">for</span> ligne <span style="color: #0000ff;">in</span> ancienne_matrice:
                ligne = ligne<span class="br0">&#91;</span>:<span class="br0">&#93;</span>
                nouvelle_matrice.append<span class="br0">&#40;</span>
                    <span class="br0">&#91;</span>*ligne<span class="br0">&#91;</span><span style="color: #cc66cc;">1</span>:<span class="br0">&#93;</span>, ligne<span class="br0">&#91;</span><span style="color: #cc66cc;">0</span><span class="br0">&#93;</span><span class="br0">&#93;</span> 
                <span class="br0">&#41;</span> 
                <span style="color: #0000ff;">yield</span>
        self.matriceComplexe = nouvelle_matrice 
&nbsp;
    <span style="color: #0000ff;">def</span> operation_C<span class="br0">&#40;</span>self, op_id, inverse=<span style="color: #339933;">False</span><span class="br0">&#41;</span>:
        <span style="color: #FF0000;">&quot;&quot;&quot;inversion des lignes&quot;&quot;&quot;</span> 
        ancienne_matrice = self.matriceComplexe<span class="br0">&#91;</span>:<span class="br0">&#93;</span> 
        <span style="color: #0000ff;">yield</span>
        nouvelle_matrice = <span class="br0">&#91;</span><span class="br0">&#93;</span> 
        <span style="color: #0000ff;">for</span> ligne <span style="color: #0000ff;">in</span> ancienne_matrice:
            nouvelle_matrice.append<span class="br0">&#40;</span>
                ligne<span class="br0">&#91;</span>::-<span style="color: #cc66cc;">1</span><span class="br0">&#93;</span>
            <span class="br0">&#41;</span>
            <span style="color: #0000ff;">yield</span> 
        self.matriceComplexe = nouvelle_matrice  
&nbsp;
<span style="color: #0000ff;">def</span> auto<span class="br0">&#40;</span>binaire, phrase_id, phrase, texte_original<span class="br0">&#41;</span>:
    <span style="color: #0000ff;">global</span> verrou_affichage 
    ma_matrice = CryptRapide<span class="br0">&#40;</span>
        texte_original
    <span class="br0">&#41;</span> 
    ma_matrice.operations_binaires = binaire
&nbsp;
    <span style="color: #0000ff;">yield</span> <span style="color: #0000ff;">from</span> ma_matrice.peupler<span class="br0">&#40;</span><span class="br0">&#41;</span>
    <span style="color: #0000ff;">print</span><span class="br0">&#40;</span><span style="color: #FF0000;">&quot;! log (%s)&nbsp;: La matrice du contenu a &eacute;t&eacute; cr&eacute;&eacute;e&quot;</span>&nbsp;% phrase_id<span class="br0">&#41;</span>
&nbsp;
    <span style="color: #0000ff;">yield</span> <span style="color: #0000ff;">from</span> ma_matrice.crypter<span class="br0">&#40;</span>
        phrase 
    <span class="br0">&#41;</span> 
    <span style="color: #0000ff;">print</span><span class="br0">&#40;</span><span style="color: #FF0000;">&quot;! log (%s)&nbsp;: le contenu a &eacute;t&eacute; crypt&eacute;&quot;</span>&nbsp;% phrase_id<span class="br0">&#41;</span> 
&nbsp;
    valeur_message = <span style="color: #0000ff;">yield</span> <span style="color: #0000ff;">from</span> ma_matrice.extraire<span class="br0">&#40;</span><span class="br0">&#41;</span> 
    <span style="color: #0000ff;">print</span><span class="br0">&#40;</span><span style="color: #FF0000;">&quot;! log (%s)&nbsp;: message crypt&eacute;&nbsp;:&quot;</span>&nbsp;% phrase_id, valeur_message<span class="br0">&#41;</span>
&nbsp;
    <span style="color: #0000ff;">yield</span> <span style="color: #0000ff;">from</span> ma_matrice.decrypter<span class="br0">&#40;</span>
        phrase 
    <span class="br0">&#41;</span> 
    <span style="color: #0000ff;">print</span><span class="br0">&#40;</span><span style="color: #FF0000;">&quot;! log (%s)&nbsp;: message d&eacute;crypt&eacute;&nbsp;:&quot;</span>&nbsp;% phrase_id<span class="br0">&#41;</span>
&nbsp;
    valeur_message = <span style="color: #0000ff;">yield</span> <span style="color: #0000ff;">from</span> ma_matrice.extraire<span class="br0">&#40;</span><span class="br0">&#41;</span> 
    <span style="color: #0000ff;">print</span><span class="br0">&#40;</span><span style="color: #FF0000;">&quot;! log (%s)&nbsp;: message d&eacute;crypt&eacute;&nbsp;:&quot;</span>&nbsp;% phrase_id, valeur_message<span class="br0">&#41;</span>
&nbsp;
    <span style="color: #0000ff;">return</span> <span style="color: #FF0000;">&quot;Fin de la tache&nbsp;%s&quot;</span>&nbsp;% phrase_id 
&nbsp;
<span style="color: #0000ff;">def</span> boucle_asynchrone<span class="br0">&#40;</span>listes_taches<span class="br0">&#41;</span>:
    taches_generateurs = <span class="br0">&#91;</span><span class="br0">&#93;</span> 
    <span style="color: #0000ff;">for</span> tache <span style="color: #0000ff;">in</span> listes_taches:
        fct, *args = tache 
        taches_generateurs.append<span class="br0">&#40;</span>
            fct<span class="br0">&#40;</span>*args<span class="br0">&#41;</span>
        <span class="br0">&#41;</span> 
    <span style="color: #0000ff;">while</span> <span style="color: #339933;">True</span>:
        <span style="color: #0000ff;">try</span>:
            tache = taches_generateurs.pop<span class="br0">&#40;</span><span style="color: #cc66cc;">0</span><span class="br0">&#41;</span>
            next<span class="br0">&#40;</span>tache<span class="br0">&#41;</span>
            taches_generateurs.append<span class="br0">&#40;</span>
                tache
            <span class="br0">&#41;</span> 
        <span style="color: #0000ff;">except</span> StopIteration <span style="color: #0000ff;">as</span> err:
            <span style="color: #0000ff;">print</span><span class="br0">&#40;</span><span style="color: #FF0000;">&quot;&gt;&gt;&gt; Le g&eacute;n&eacute;rateur a termin&eacute; et dit&nbsp;: &quot;</span>, err<span class="br0">&#41;</span> 
        <span style="color: #0000ff;">if</span> len<span class="br0">&#40;</span>taches_generateurs<span class="br0">&#41;</span>==<span style="color: #cc66cc;">0</span>:
            <span style="color: #0000ff;">break</span> 
&nbsp;
<span style="color: #0000ff;">if</span> <span style="color: #0080ff;">__name__</span>==<span style="color: #FF0000;">&quot;__main__&quot;</span>: 
&nbsp;
&nbsp;
    <span style="color: #808080;">#VERSION NON-BINAIRE -&gt; moins efficace </span>
    boucle_asynchrone<span class="br0">&#40;</span>
        <span class="br0">&#91;</span>
            <span class="br0">&#40;</span>
                auto, <span style="color: #808080;"># fct appel&eacute;e dans la boucle &eacute;v&eacute;nementielle </span>
                <span style="color: #339933;">False</span>, <span style="color: #808080;"># ne sera pas traitement binairement </span>
                <span style="color: #cc66cc;">1</span>, <span style="color: #808080;"># id de la tache </span>
                <span style="color: #FF0000;">&quot;AAACBABCBCABACBBB&quot;</span>, <span style="color: #808080;"># phrase passe </span>
                <span style="color: #FF0000;">&quot;Ceci est un super message secret, plus long \</span>
<span style="color: #FF0000;">mais proportionnellement il y a moins de traitements, \</span>
<span style="color: #FF0000;">c'est bizarre hein&nbsp;? Mais c'est comme &ccedil;a, il fallait un exemple...&quot;</span> <span style="color: #808080;"># contenu du message </span>
            <span class="br0">&#41;</span>, 
            <span class="br0">&#40;</span>
                auto,
                <span style="color: #339933;">False</span>,
                <span style="color: #cc66cc;">2</span>,
                <span style="color: #FF0000;">&quot;AAACBABCBCABACBACBBCAAABBBB&quot;</span>, 
                <span style="color: #FF0000;">&quot;Ceci est un message secret de Nothus (Julien Garderon, ao&ucirc;t 2017).&quot;</span> 
            <span class="br0">&#41;</span> 
        <span class="br0">&#93;</span>
    <span class="br0">&#41;</span> 
&nbsp;
    <span style="color: #0000ff;">print</span><span class="br0">&#40;</span><span style="color: #FF0000;">&quot;- - - - - - - - - - - - - - -&quot;</span><span class="br0">&#41;</span>
&nbsp;
    <span style="color: #808080;">#VERSION BINAIRE -&gt; plus efficace (car la matrice g&eacute;n&eacute;r&eacute;e est plus grande&nbsp;; plus de dimensions (3, 4, ... au lieu de 2D utilis&eacute;es dans cet exemple) ou une taille de phrase plus grande = plus de s&eacute;curit&eacute;) </span>
    boucle_asynchrone<span class="br0">&#40;</span>
        <span class="br0">&#91;</span>
            <span class="br0">&#40;</span>
                auto,
                <span style="color: #339933;">True</span>, 
                <span style="color: #cc66cc;">1</span>,
                <span style="color: #FF0000;">&quot;AAACBABCBCABACBBB&quot;</span>, 
                <span style="color: #FF0000;">&quot;Ceci est un super message secret, plus long \</span>
<span style="color: #FF0000;">mais proportionnellement il y a moins de traitements, \</span>
<span style="color: #FF0000;">c'est bizarre hein&nbsp;? Mais c'est comme &ccedil;a, il fallait un exemple...&quot;</span> 
            <span class="br0">&#41;</span>, 
            <span class="br0">&#40;</span>
                auto,
                <span style="color: #339933;">True</span>, 
                <span style="color: #cc66cc;">2</span>,
                <span style="color: #FF0000;">&quot;AAACBABCBCABACBACBBCAAABBBB&quot;</span>, 
                <span style="color: #FF0000;">&quot;Ceci est un message secret de Nothus (Julien Garderon, ao&ucirc;t 2017).&quot;</span> 
            <span class="br0">&#41;</span> 
        <span class="br0">&#93;</span>
    <span class="br0">&#41;</span></pre></td></tr></table></pre>
</div></blockquote>

]]></content:encoded>
			<dc:creator>Nothus</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/318041-nothus/b3610/python-chiffrement-symetrique-portion/</guid>
		</item>
		<item>
			<title><![CDATA[Un moteur "naïf" IFTTT]]></title>
			<link>https://www.developpez.net/forums/blogs/318041-nothus/b3399/moteur-naif-ifttt/</link>
			<pubDate>Fri, 21 Jul 2017 14:50:24 GMT</pubDate>
			<description>Bonjour à tous,  
 
Dans la...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">Bonjour à tous, <br />
<br />
Dans la continuité d'un article précédent sur les nombres premiers, je me suis amusé à chercher ce qui serait possible de faire des résultats. Et pourquoi pas un IFTTT - <i><b>I</b>f <b>T</b>his <b>T</b>hen <b>T</b>hat</i> ? En bon français, la traduction serait une <i>Programmation à Déclenchement Conditionnel</i>. <br />
<br />
<a href="https://ifttt.com/" target="_blank">Un site très connu existe</a> pour une première approche opérationnelle et la mise en œuvre de ce type de moteur s'accorde très bien avec un concept d'imbrication de micro-services (rapidité + facilité). <br />
<br />
<b><font color="#FF0000">IFTTT : Principe de base </font></b> <br />
<br />
La logique est facile : Si (If) un Evenement (This) survient alors (Then) on fait ça (That). Un outil IFTTT ne prend pas nécessairement une seule condition en compte, mais une cardinalité de 1 à n condition(s). Graphiquement, cela se représente ainsi : <br />
<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:96px;"><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 /></div></td><td valign="top"><pre style="margin: 0">cond1 	|
  (+) 	|==(test)==&gt; résultat
cond2 	|
  (+) 	|
  ... 	|</pre></td></tr></table></pre>
</div>Il est aussi possible de panacher les conditions non avec des valeurs mais aussi <b>des actions</b>, que l'on représente sous la forme de fonctions appelées au moment de la vérification de la valeur. Idem pour le test lui-même, qui peut-être une fonction (<i>que l'on peut qualifier de call back car elle s'exécute après, dans une liaison avec l'étape précédente / imbriquée</i>). <br />
<br />
L'ensemble est hérité de <a href="https://fr.wikipedia.org/wiki/Algèbre_de_Boole_(logique)" target="_blank">l'algèbre de Boole</a>. Je n'évoque pas directement les tenants qui permettent de produire l'approche que j'évoque ici, qui n'est ni plus ni moins qu'une table de vérité par produit (<i>c'est-à-dire où toutes les conditions doivent être réunies pour que le résultat soit Vrai</i>). <br />
<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 /></div></td><td valign="top"><pre style="margin: 0">

--- EXEMPLE 1 --- 
action1() 	|
   (+)   	|==(test)==&gt; résultat
cond2    	|
   (+)   	|
  ...    	|

--- EXEMPLE 2 --- 
action1() 	|
   (+)    	|==( action2() )==&gt; résultat
cond2     	|
   (+)    	|
  ...     	|

--- EXEMPLE 3 --- 
action1() 	|
   (+)    	|==( action2() )==&gt; résultat2
resultat1 	|
   (+)    	|
  ...     	|</pre></td></tr></table></pre>
</div>L'imbrication action / condition (<i>le premier était considéré comme une condition dont la valeur est fixé par son retour</i>) est ici optimale car transparente pour celui qui utilisera la classe. <br />
<br />
<b><font color="#FF0000">Le &quot;poids&quot; d'une variable</font></b><br />
<br />
Rappelez-vous votre premier cours : le binaire se &quot;traduit&quot; (du moins la conversion vers d'autres bases se fait) grâce au poids qu'acquière un bit donné. Un octet, c'est finalement &quot;un série de bits signés&quot; au sens où ils sont ensembles significatifs individuellement et collectivement (<i>je sais que le mot signé est ici malheureux car se rapproche d'un autre concept, mais je manque de synonymes...</i>). <br />
<br />
Exemple : <br />
<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:108px;"><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 /></div></td><td valign="top"><pre style="margin: 0">BIT   --&gt;   POIDS    --&gt;    VARIABLE
1     --&gt;   1        --&gt;    a
2     --&gt;   2        --&gt;    b
3     --&gt;   4        --&gt;    c
4     --&gt;   8        --&gt;    d
(etc)</pre></td></tr></table></pre>
</div>Ainsi sur 4 bits, nous pouvons former le nombre : 1+2+4+8 = 15. Pour avoir le chiffre 17, il faut créer un 5e bit et mettre le bit 1 et 5 (qui a un poids à 16) à la valeur &quot;Vrai&quot; (1+16). Hexadécimal, décimal, binaire ou même votre horloge : tout fonctionne sur ce principe. <br />
<br />
Si je désire le nombre 5, il me faut donc mettre à Vrai les bits 1 et 3 (soit 1+4). En algèbre, cela représente donc : <br />
8 = (a * 1) + (b * 0) + (c * 1) + (d * 0)<br />
<br />
<font color="#FF0000"><b>Problème : que faire si une condition est optionnelle ? </b></font><br />
<br />
C'est là où rentre en jeu les nombres premiers ! Car les produits/multiplications permettent bien des astuces, que Python saura exploiter pleinement et sans difficulté particulière de programmation. <br />
<br />
En reprenant mon tableau précédent, un poil modifié : <br />
<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:96px;"><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 /></div></td><td valign="top"><pre style="margin: 0">BIT   --&gt;   POIDS    --&gt;    VARIABLE
1     --&gt;   0        --&gt;    a
2     --&gt;   1        --&gt;    b
3     --&gt;   2        --&gt;    c
4     --&gt;   4        --&gt;    d</pre></td></tr></table></pre>
</div>Vous me direz que c'est idiot : pour le même nombre de bits, je ne peux &quot;représenter&quot; que moins de nombres entiers. C'est vrai, <s>mais la valeur que j'ai fixé au premier bit annule systématiquement les autres. En somme, le tableau ci-dessous, quelque soit l'état des bits, est égal à... 0. Ce tableau ne représente donc pas plusieurs entiers mais un seul ! </s> [ édition : Quelle erreur... une relecture trop rapide ! évidemment cela ne fait qu'annuler le premier bit et non tous, systématiquement, si l'on reprend l'exemple plus haut l Mon enchaînement était malheureux ]<br />
<br />
Si maintenant je ne raisonne plus pour des bits mais comme une unique variable dont c'est la table des états possibles (avec 0 OU 1 OU X - où X est un nombre premier), et que je fais le produit avec plusieurs de ses congénères : <br />
<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: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">VAR &quot;A&quot; =&gt; (0, 1, 2) 
VAR &quot;B&quot; =&gt; (0, 1, 3) 
VAR &quot;C&quot; =&gt; (0, 1, 5)</pre></td></tr></table></pre>
</div>Alors je peux avoir les 9 combinaisons suivantes : <br />
<ul><li style="">0 (car 1 ou n VAR est/sont à 0)</li><li style="">1 (car toutes les VAR sont à 1)</li><li style="">2 ou 3 ou 5 (la valeur d'une VAR alors que les autres sont à 1)</li><li style="">6 (A x B et C à 1)</li><li style="">15 (B x C et A à 1)</li><li style="">10 (A x C et B à 1)</li><li style="">30 (toutes les VAR sont à leur valeur)</li></ul><br />
<br />
Si j'ajoute d'autres états possibles pour les VAR, toujours en respectant les nombres premiers comme état possible, je peux donc démultiplier les possibilités de mon état de sortie... <br />
<br />
En quelque sorte, le résultat est un &quot;contexte&quot; unique, à un moment donné, où chaque appel le mettra à jour. La valeur 0 annule tout ; la valeur 1 rend l'état de la VAR indifférente au reste du produit (la VAR est donc devenue &quot;optionnelle&quot;) et sinon c'est un nombre différent car la multiplication des nombres premiers rend unique le résultat. <br />
<br />
<b><font color="#FF0000">En terme de programmation... </font></b><br />
<br />
C'est d'une facilité assez enfantine : j'ai mes conditions stockées dans un tableau, sous la forme d'une référence à une fonction. Des paramètres peuvent être ajoutés. La vérification de l'état de sortie de la condition, déclenche la fonction et retourne un nombre non-premier. <br />
<br />
J'ai déterminé mon action en fonction du résultat total. Par facilité, j'ai permis de déclarer une action avec un segment de valeur (range). Mon Schéma une fois initié, peut être essayé et l'objet Schéma représente &quot;humainement&quot; une séquence de possibles, d'actions, de contextes... <br />
<br />
Enfin j'autorise la liaison entre plusieurs séquences car la classe Schéma détecte, lors de l'essai, si la référence qui lui est transmise est la même classe qu'elle-même : un résultat de séquence peut donc servir comme condition à une autre et sans préjuger de son état au préalable ! <br />
<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 />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 /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">class</span> Schema: 
&nbsp;
    <span style="color: #0000ff;">def</span> <span style="color: #0080ff;">__init__</span><span class="br0">&#40;</span>self<span class="br0">&#41;</span>:
        self.__conditions__ =  <span class="br0">&#91;</span><span class="br0">&#93;</span>
        self.__actions__ = <span class="br0">&#123;</span><span class="br0">&#125;</span> 
&nbsp;
    <span style="color: #0000ff;">def</span> condition<span class="br0">&#40;</span>self, ref, params=list<span class="br0">&#40;</span><span class="br0">&#41;</span>, oui=<span style="color: #cc66cc;">3</span>, non=<span style="color: #cc66cc;">2</span>, erreur=<span style="color: #cc66cc;">0</span><span class="br0">&#41;</span>: <span style="color: #808080;"># /!\ Mettre non=1 lors de l'appel pour rendre la condition optionnelle ! </span>
        self.__conditions__.append<span class="br0">&#40;</span><span class="br0">&#40;</span>
            ref,
            params,
            oui,
            non,
            erreur 
        <span class="br0">&#41;</span><span class="br0">&#41;</span> 
&nbsp;
    <span style="color: #0000ff;">def</span> action<span class="br0">&#40;</span>self, etat, ref, params=list<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>:
        <span style="color: #0000ff;">if</span> isinstance<span class="br0">&#40;</span>etat, int<span class="br0">&#41;</span>:
            etat = <span class="br0">&#40;</span>etat,<span class="br0">&#41;</span>
        <span style="color: #0000ff;">for</span> e <span style="color: #0000ff;">in</span> etat: 
            self.__actions__<span class="br0">&#91;</span>e<span class="br0">&#93;</span> = <span class="br0">&#40;</span>
                ref,
                params
            <span class="br0">&#41;</span> 
&nbsp;
    <span style="color: #0000ff;">def</span> essayer<span class="br0">&#40;</span>self, oui=<span style="color: #339933;">True</span>, non=<span style="color: #339933;">False</span>, erreur=<span style="color: #339933;">False</span><span class="br0">&#41;</span>:
        i = <span style="color: #cc66cc;">1</span>
        <span style="color: #0000ff;">for</span> condition <span style="color: #0000ff;">in</span> self.__conditions__:
            <span style="color: #0000ff;">try</span>:
&nbsp;
                i *= self.__executer__<span class="br0">&#40;</span>condition<span class="br0">&#41;</span> 
            <span style="color: #0000ff;">except</span> Exception <span style="color: #0000ff;">as</span> err: 
                i *= int<span class="br0">&#40;</span>
                    condition<span class="br0">&#91;</span><span style="color: #cc66cc;">4</span><span class="br0">&#93;</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span style="color: #0000ff;">if</span> callable<span class="br0">&#40;</span>condition<span class="br0">&#91;</span><span style="color: #cc66cc;">4</span><span class="br0">&#93;</span><span class="br0">&#41;</span> <span style="color: #0000ff;">else</span> condition<span class="br0">&#91;</span><span style="color: #cc66cc;">4</span><span class="br0">&#93;</span>
                <span class="br0">&#41;</span> 
        <span style="color: #0000ff;">try</span>: 
            action = self.__actions__<span class="br0">&#91;</span>i<span class="br0">&#93;</span>
            <span style="color: #0000ff;">if</span> action<span class="br0">&#91;</span><span style="color: #cc66cc;">0</span><span class="br0">&#93;</span><span class="br0">&#40;</span>i, *action<span class="br0">&#91;</span><span style="color: #cc66cc;">1</span><span class="br0">&#93;</span><span class="br0">&#41;</span>: 
                <span style="color: #0000ff;">return</span> oui<span class="br0">&#40;</span>self, i<span class="br0">&#41;</span> <span style="color: #0000ff;">if</span> callable<span class="br0">&#40;</span>oui<span class="br0">&#41;</span> <span style="color: #0000ff;">else</span> oui 
            <span style="color: #0000ff;">else</span>: 
                <span style="color: #0000ff;">return</span> non<span class="br0">&#40;</span>self,i<span class="br0">&#41;</span> <span style="color: #0000ff;">if</span> callable<span class="br0">&#40;</span>non<span class="br0">&#41;</span> <span style="color: #0000ff;">else</span> non 
        <span style="color: #0000ff;">except</span>:
            <span style="color: #0000ff;">return</span> erreur<span class="br0">&#40;</span>self,i<span class="br0">&#41;</span> <span style="color: #0000ff;">if</span> callable<span class="br0">&#40;</span>erreur<span class="br0">&#41;</span> <span style="color: #0000ff;">else</span> erreur
&nbsp;
    <span style="color: #0000ff;">def</span> __executer__<span class="br0">&#40;</span>self,condition<span class="br0">&#41;</span>:
        <span style="color: #0000ff;">if</span> condition<span class="br0">&#91;</span><span style="color: #cc66cc;">0</span><span class="br0">&#93;</span>.<span style="color: #0080ff;">__class__</span> <span style="color: #0000ff;">is</span> self.<span style="color: #0080ff;">__class__</span>:
            condition = list<span class="br0">&#40;</span>condition<span class="br0">&#41;</span> 
            condition<span class="br0">&#91;</span><span style="color: #cc66cc;">0</span><span class="br0">&#93;</span> = condition<span class="br0">&#91;</span><span style="color: #cc66cc;">0</span><span class="br0">&#93;</span>.essayer
        <span style="color: #0000ff;">return</span> <span class="br0">&#40;</span>
            condition<span class="br0">&#91;</span><span style="color: #cc66cc;">2</span><span class="br0">&#93;</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span style="color: #0000ff;">if</span> callable<span class="br0">&#40;</span>condition<span class="br0">&#91;</span><span style="color: #cc66cc;">2</span><span class="br0">&#93;</span><span class="br0">&#41;</span> <span style="color: #0000ff;">else</span> condition<span class="br0">&#91;</span><span style="color: #cc66cc;">2</span><span class="br0">&#93;</span> 
        <span class="br0">&#41;</span> <span style="color: #0000ff;">if</span> condition<span class="br0">&#91;</span><span style="color: #cc66cc;">0</span><span class="br0">&#93;</span><span class="br0">&#40;</span>*condition<span class="br0">&#91;</span><span style="color: #cc66cc;">1</span><span class="br0">&#93;</span><span class="br0">&#41;</span> <span style="color: #0000ff;">is</span> <span style="color: #339933;">True</span> <span style="color: #0000ff;">else</span> <span class="br0">&#40;</span>
            condition<span class="br0">&#91;</span><span style="color: #cc66cc;">3</span><span class="br0">&#93;</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span style="color: #0000ff;">if</span> callable<span class="br0">&#40;</span>condition<span class="br0">&#91;</span><span style="color: #cc66cc;">3</span><span class="br0">&#93;</span><span class="br0">&#41;</span> <span style="color: #0000ff;">else</span> condition<span class="br0">&#91;</span><span style="color: #cc66cc;">3</span><span class="br0">&#93;</span>
        <span class="br0">&#41;</span></pre></td></tr></table></pre>
</div><br />
<br />
Voici un code de démonstration à ajouter : <br />
<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 />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 /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">from</span> time <span style="color: #0000ff;">import</span> gmtime, strftime
&nbsp;
<span style="color: #0000ff;">def</span> Calendrier<span class="br0">&#40;</span>jours = <span class="br0">&#123;</span> <span style="color: #808080;"># Si la valeur d'aujourd'hui est sur False, le retour de la condition sera &agrave; 2 (non par d&eacute;faut) ou sinon 3 (oui par d&eacute;faut) </span>
    <span style="color: #cc66cc;">0</span>: <span style="color: #339933;">False</span>, 
    <span style="color: #cc66cc;">1</span>: <span style="color: #339933;">False</span>, 
    <span style="color: #cc66cc;">2</span>: <span style="color: #339933;">True</span>, 
    <span style="color: #cc66cc;">3</span>: <span style="color: #339933;">True</span>, 
    <span style="color: #cc66cc;">4</span>: <span style="color: #339933;">True</span>, 
    <span style="color: #cc66cc;">5</span>: <span style="color: #339933;">True</span>, 
    <span style="color: #cc66cc;">6</span>: <span style="color: #339933;">True</span>
<span class="br0">&#125;</span><span class="br0">&#41;</span>:
    <span style="color: #0000ff;">print</span><span class="br0">&#40;</span><span style="color: #FF0000;">&quot;Calendrier : &quot;</span>, jours<span class="br0">&#91;</span>int<span class="br0">&#40;</span>strftime<span class="br0">&#40;</span><span style="color: #FF0000;">&quot;%w&quot;</span>, gmtime<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#93;</span><span class="br0">&#41;</span> 
    <span style="color: #0000ff;">return</span> jours<span class="br0">&#91;</span>int<span class="br0">&#40;</span>strftime<span class="br0">&#40;</span><span style="color: #FF0000;">&quot;%w&quot;</span>, gmtime<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#93;</span>
&nbsp;
<span style="color: #0000ff;">def</span> Rien<span class="br0">&#40;</span>i, echo=<span style="color: #339933;">None</span><span class="br0">&#41;</span>: 
    <span style="color: #0000ff;">print</span><span class="br0">&#40;</span><span style="color: #FF0000;">&quot;---<span style="color: #800000;">\n</span>i =&quot;</span>, i, <span style="color: #FF0000;">&quot;<span style="color: #800000;">\n</span>&quot;</span>, type<span class="br0">&#40;</span>echo<span class="br0">&#41;</span>, echo,<span style="color: #FF0000;">&quot;<span style="color: #800000;">\n</span>---&quot;</span><span class="br0">&#41;</span> 
    <span style="color: #0000ff;">return</span> <span style="color: #339933;">True</span>  
&nbsp;
<span style="color: #0000ff;">if</span> <span style="color: #0080ff;">__name__</span>==<span style="color: #FF0000;">&quot;__main__&quot;</span>: 
&nbsp;
    Sequence1 = ifttt.Schema<span class="br0">&#40;</span><span class="br0">&#41;</span> 
&nbsp;
    Sequence1.condition<span class="br0">&#40;</span>
        Calendrier 
    <span class="br0">&#41;</span> 
    Sequence1.action<span class="br0">&#40;</span> 
        <span style="color: #cc66cc;">0</span>, 
        Rien,
        <span class="br0">&#40;</span><span style="color: #FF0000;">&quot;Oups ! (1)&quot;</span>,<span class="br0">&#41;</span> 
    <span class="br0">&#41;</span> 
    Sequence1.action<span class="br0">&#40;</span> 
        <span class="br0">&#40;</span><span style="color: #cc66cc;">2</span>, <span style="color: #cc66cc;">3</span><span class="br0">&#41;</span>, 
        Rien,
        <span class="br0">&#40;</span><span style="color: #FF0000;">&quot;Une premi&egrave;re &eacute;tape de franchie !&quot;</span>,<span class="br0">&#41;</span> 
    <span class="br0">&#41;</span> 
&nbsp;
    Sequence2 = ifttt.Schema<span class="br0">&#40;</span><span class="br0">&#41;</span> 
&nbsp;
    Sequence2.condition<span class="br0">&#40;</span>
        Sequence1 
    <span class="br0">&#41;</span> 
    Sequence2.action<span class="br0">&#40;</span> 
        <span style="color: #cc66cc;">0</span>, 
        Rien,
        <span class="br0">&#40;</span><span style="color: #FF0000;">&quot;Oups ! (2)&quot;</span>,<span class="br0">&#41;</span> 
    <span class="br0">&#41;</span> 
    Sequence2.action<span class="br0">&#40;</span> 
        <span class="br0">&#40;</span><span style="color: #cc66cc;">2</span>,<span style="color: #cc66cc;">3</span><span class="br0">&#41;</span>, 
        Rien,
        <span class="br0">&#40;</span><span style="color: #FF0000;">&quot;La seconde &eacute;tape tant attendue...&quot;</span>,<span class="br0">&#41;</span> 
    <span class="br0">&#41;</span> 
&nbsp;
    Sequence2.essayer<span class="br0">&#40;</span><span class="br0">&#41;</span></pre></td></tr></table></pre>
</div><br />
<br />
Ce code est d'une inutilité crasse mais peu importe : elle démontre que l'on peut avoir des conditions optionnelles ou d'autres au contraire impératives simplement et dont le résultat est donné par une simple multiplication. <br />
<br />
<b><font color="#FF0000">Exemple de cas d'IFTTT </font></b><br />
<br />
Si je suis connecté à ma boîte courriel, qu'il est entre 8h du matin et 18h, et que j'ai pas mis <u><i><b>SPÉCIFIQUEMENT</b></i></u> mon profil en pause, alors m'envoyer une alerte si j'ai un courriel... <br />
<br />
Soit : <br />
- connexion courriel + nouveau courriel arrivé = 2 (ou 0)<br />
- horaire = 3 (ou 0)<br />
- profil = 5 (ou 1 ou 0 -&gt; c'est-à-dire la troisième valeur qu'est l'erreur)<br />
--&gt; j'émets une alerte si le résultat est 6 ou 30, indiquant un &quot;contexte&quot; différent (<i>l'état de mon profil</i>). Les autres valeurs sont ignorées et n'ont pas besoin d'être déclarées (2, 3, 15 ou 10). Je peux augmenter le nombre de conditions facilement (<i>toujours renvoyant 0, 1 ou un nombre premier non-encore utilisé dans la séquence</i>) et obtenir de nouveaux contextes uniques et prédéterminés ainsi créés. <br />
<br />
Bon code à tous, <br />
<br />
Julien.</blockquote>

]]></content:encoded>
			<dc:creator>Nothus</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/318041-nothus/b3399/moteur-naif-ifttt/</guid>
		</item>
	</channel>
</rss>
