<?xml 
version="1.0" encoding="utf-8"?>
<rss version="2.0" 
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
>

<channel xml:lang="fr">
	<title>Mon p'tit coin du web</title>
	<link>http://nicolas.weeger.org/</link>
	
	<language>fr</language>
	<generator>SPIP - www.spip.net</generator>




<item xml:lang="fr">
		<title>M&#233;thodes d'entr&#233;e sous Qt</title>
		<link>http://nicolas.weeger.org/spip.php?article71</link>
		<guid isPermaLink="true">http://nicolas.weeger.org/spip.php?article71</guid>
		<dc:date>2009-01-04T14:38:20Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Nicolas</dc:creator>



		<description>Pour permettre de saisir du japonais sous un dialogue Qt , j'ai trouv&#233; une solution &#224; base de QInputContextFactory, classe donnant acc&#232;s aux m&#233;thodes d'entr&#233;e disponibles. Et tant qu'&#224; faire j'ai mis un menu contextuel dans la zone de saisie pour changer de m&#233;thode de saisie. Conventions : widget est la zone de saisie sur laquelle on veut permettre la saisie en japonais MyDialog est la classe de dialogue qui contient widget Le dialogue doit avoir les slots suivants : class MyDialog : public (...)

-
&lt;a href="http://nicolas.weeger.org/spip.php?rubrique2" rel="directory"&gt;Code&lt;/a&gt;


		</description>


 <content:encoded>&lt;div class='rss_texte'&gt;&lt;p&gt;Pour permettre de saisir du japonais [&lt;a href='#nb1' class='spip_note' rel='footnote' title='En pratique, cette solution permettra de saisir n'importe quelle langue (...)' id='nh1'&gt;1&lt;/a&gt;] sous un dialogue Qt [&lt;a href='#nb2' class='spip_note' rel='footnote' title='J'utilise la version 4.4.2 sous Linux, mais j'imagine que ce n'est pas trop (...)' id='nh2'&gt;2&lt;/a&gt;], j'ai trouv&#233; une solution &#224; base de &lt;code class='spip_code' dir='ltr'&gt;QInputContextFactory&lt;/code&gt;, classe donnant acc&#232;s aux m&#233;thodes d'entr&#233;e [&lt;a href='#nb3' class='spip_note' rel='footnote' title='Sous Linux, une &#171; m&#233;thode d'entr&#233;e &#187; est une fa&#231;on d'entrer du texte. Pour de (...)' id='nh3'&gt;3&lt;/a&gt;] disponibles.&lt;/p&gt; &lt;p&gt;Et tant qu'&#224; faire j'ai mis un menu contextuel dans la zone de saisie pour changer de m&#233;thode de saisie.&lt;/p&gt; &lt;p&gt;Conventions :
&lt;br /&gt;&lt;img src=&quot;http://nicolas.weeger.org/local/cache-vignettes/L8xH11/puce-32883.gif&quot; width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; &lt;code class='spip_code' dir='ltr'&gt;widget&lt;/code&gt; est la zone de saisie sur laquelle on veut permettre la saisie en japonais
&lt;br /&gt;&lt;img src=&quot;http://nicolas.weeger.org/local/cache-vignettes/L8xH11/puce-32883.gif&quot; width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; &lt;code class='spip_code' dir='ltr'&gt;MyDialog&lt;/code&gt; est la classe de dialogue qui contient &lt;code class='spip_code' dir='ltr'&gt;widget&lt;/code&gt;&lt;/p&gt; &lt;p&gt;Le dialogue doit avoir les slots suivants :&lt;/p&gt;
&lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;class MyDialog : public QDialog&lt;br /&gt; {&lt;br /&gt; ...&lt;br /&gt; &lt;br /&gt; protected slots:&lt;br /&gt; void onWidgetContextMenu(const QPoint&amp; pos);&lt;br /&gt; void onInputContextChange(QAction* action);&lt;br /&gt; }&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;Quand on construit le dialogue et ses zones de saisie, il faut rajouter les lignes suivantes (dans une fonction de &lt;code class='spip_code' dir='ltr'&gt;MyDialog&lt;/code&gt; :&lt;/p&gt;
&lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;widget-&gt;setContextMenuPolicy(Qt::CustomContextMenu);&lt;br /&gt; connect(widget, SIGNAL(customContextMenuRequested(const QPoint&amp;)), this, SLOT(onWidgetContextMenu(const QPoint&amp;)));&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;L'impl&#233;mentation du menu contextuel, affichant la liste des m&#233;thodes d'entr&#233;e, est assez simple :&lt;/p&gt;
&lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;void MyDialog::onWidgetContextMenu(const QPoint&amp; pos)&lt;br /&gt; {&lt;br /&gt; QWidget* edit = getMyCurrentWidget(); /** &#224; nous de savoir quelle zone est concern&#233;e */&lt;br /&gt; &lt;br /&gt; QMenu popup(tr(&quot;Propri&#233;t&#233;s&quot;));&lt;br /&gt; QMenu* context = popup.addMenu(tr(&quot;M&#233;thode d'entr&#233;e&quot;));&lt;br /&gt; &lt;br /&gt; QAction* def = context-&gt;addAction(tr(&quot;(d&#233;faut: %1)&quot;).arg(QInputContextFactory::displayName(qApp-&gt;inputContext()-&gt;identifierName())));&lt;br /&gt; def-&gt;setCheckable(true);&lt;br /&gt; if (edit-&gt;inputContext()-&gt;identifierName() == qApp-&gt;inputContext()-&gt;identifierName())&lt;br /&gt; {&lt;br /&gt; def-&gt;setChecked(true);&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; foreach(QString key, QInputContextFactory::keys())&lt;br /&gt; {&lt;br /&gt; if (key == qApp-&gt;inputContext()-&gt;identifierName())&lt;br /&gt; continue;&lt;br /&gt; &lt;br /&gt; QAction* action = context-&gt;addAction(QInputContextFactory::displayName(key));&lt;br /&gt; action-&gt;setCheckable(true);&lt;br /&gt; action-&gt;setData(key);&lt;br /&gt; if (edit-&gt;inputContext()-&gt;identifierName() == key)&lt;br /&gt; {&lt;br /&gt; action-&gt;setChecked(true);&lt;br /&gt; }&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; connect(&amp;popup, SIGNAL(triggered(QAction*)), this, SLOT(onInputContextChange(QAction*)));&lt;br /&gt; popup.exec(edit-&gt;mapToGlobal(pos));&lt;br /&gt; }&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;Et enfin la gestion du changement de m&#233;thode d'entr&#233;e n'a plus grand-chose &#224; faire :&lt;/p&gt;
&lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt;void MyDialog::onInputContextChange(QAction* action)&lt;br /&gt; {&lt;br /&gt; QString input = action-&gt;data().toString();&lt;br /&gt; QWidget* edit = getMyCurrentWidget();&lt;br /&gt; if (edit-&gt;inputContext()-&gt;identifierName() == input || (input.isEmpty() &amp;&amp; edit-&gt;inputContext()-&gt;identifierName() == qApp-&gt;inputContext()-&gt;identifierName()))&lt;br /&gt; // pas la peine de changer pour rien&lt;br /&gt; return;&lt;br /&gt; &lt;br /&gt; if (input.isEmpty())&lt;br /&gt; {&lt;br /&gt; edit-&gt;setInputContext(QInputContextFactory::create(qApp-&gt;inputContext()-&gt;identifierName(), edit));&lt;br /&gt; }&lt;br /&gt; else&lt;br /&gt; {&lt;br /&gt; QInputContext* context = QInputContextFactory::create(input, edit);&lt;br /&gt; if (context)&lt;br /&gt; edit-&gt;setInputContext(context);&lt;br /&gt; }&lt;br /&gt; // pour une raison inconnue, il y a des probl&#232;mes de saisie, en solution de contournement on joue avec le focus&lt;br /&gt; edit-&gt;nextInFocusChain()-&gt;setFocus();&lt;br /&gt; edit-&gt;setFocus();&lt;br /&gt; }&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;Et voici le r&#233;sultat :
&lt;span class='spip_document_91 spip_documents spip_documents_center'&gt;
&lt;img src='http://nicolas.weeger.org/local/cache-vignettes/L328xH74/kanji-62581.png' width='328' height='74' alt=&quot;&quot; style='height:74px;width:328px;' /&gt;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;
		&lt;hr /&gt;
		&lt;div class='rss_notes'&gt;&lt;p&gt;[&lt;a href='#nh1' id='nb1' class='spip_note' title='Notes 1' rev='footnote'&gt;1&lt;/a&gt;] En pratique, cette solution permettra de saisir n'importe quelle langue pourvu que le support soit disponible sur le syst&#232;me.&lt;/p&gt; &lt;p&gt;[&lt;a href='#nh2' id='nb2' class='spip_note' title='Notes 2' rev='footnote'&gt;2&lt;/a&gt;] J'utilise la version 4.4.2 sous Linux, mais j'imagine que ce n'est pas trop diff&#233;rent pour les autres versions.&lt;/p&gt; &lt;p&gt;[&lt;a href='#nh3' id='nb3' class='spip_note' title='Notes 3' rev='footnote'&gt;3&lt;/a&gt;] Sous Linux, une &#171; m&#233;thode d'entr&#233;e &#187; est une fa&#231;on d'entrer du texte. Pour de l'alphabet romain, il n'y a rien de sp&#233;cial &#224; faire, mais pour entrer des kanjis, il faut pouvoir par exemple entrer la phon&#233;tique et choisir les caract&#232;res voulus.&lt;/p&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>Les surprises du Javascript</title>
		<link>http://nicolas.weeger.org/spip.php?article39</link>
		<guid isPermaLink="true">http://nicolas.weeger.org/spip.php?article39</guid>
		<dc:date>2007-03-04T19:54:51Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Nicolas</dc:creator>



		<description>Pour r&#233;pondre aux besoins d'un client, j'ai derni&#232;rement &#233;t&#233; amen&#233; &#224; m'int&#233;resser de pr&#232;s au Javascript, et je dois dire que j'ai &#233;t&#233; agr&#233;ablement surpris. Qu'est-ce que c'est que Javascript ? C'est un langage de programmation, principalement utilis&#233; dans les pages Web. D&#232;s que vous voyez un calendrier qui s'ouvre quand on clique dessus, une liste qui propose des noms selon votre saisie, des menus se d&#233;roulant quand la souris passe dessus, etc., c'est quasiment toujours du Javascript. Il est au c&#339;ur du &#171; Web (...)

-
&lt;a href="http://nicolas.weeger.org/spip.php?rubrique2" rel="directory"&gt;Code&lt;/a&gt;


		</description>


 <content:encoded>&lt;div class='rss_texte'&gt;&lt;p&gt;Pour r&#233;pondre aux besoins d'un client, j'ai derni&#232;rement &#233;t&#233; amen&#233; &#224; m'int&#233;resser de pr&#232;s au Javascript, et je dois dire que j'ai &#233;t&#233; agr&#233;ablement surpris.&lt;/p&gt; &lt;h3 class=&quot;spip&quot;&gt;Qu'est-ce que c'est que Javascript ?&lt;/h3&gt;
&lt;p&gt;C'est un langage de programmation, principalement utilis&#233; dans les pages Web. D&#232;s que vous voyez un calendrier qui s'ouvre quand on clique dessus, une liste qui propose des noms selon votre saisie, des menus se d&#233;roulant quand la souris passe dessus, etc., c'est quasiment toujours du Javascript.&lt;/p&gt; &lt;p&gt;Il est au c&#339;ur du &#171; Web 2.0 &#187;, pour faire simple une association entre collaboration entre utilisateurs et sites tr&#232;s dynamiques.&lt;/p&gt; &lt;p&gt;Revers de la m&#233;daille, il est aussi utilis&#233; pour ouvrir des fen&#234;tres popup intempestives, ou autres choses peu agr&#233;ables.&lt;/p&gt; &lt;p&gt;Des exemples de sites utilisant Javascript incluent &lt;a href='http://www.ratp.fr/' class='spip_out' rel='external'&gt;La RATP&lt;/a&gt; (pour le choix des stations), &lt;a href='http://www.gmail.com/' class='spip_out' rel='external'&gt;Gmail&lt;/a&gt; (pour l'&#233;dition des messages, le retour &#224; la bo&#238;te de r&#233;ception, ...), &lt;a href='http://maps.google.com/' class='spip_out' rel='external'&gt;Google Maps&lt;/a&gt; et de nombreux autres sites.&lt;/p&gt; &lt;h3 class=&quot;spip&quot;&gt;Particularit&#233;s du langage&lt;/h3&gt;
&lt;p&gt;J'avais quelques notions de Javascript de base (petits effets comme afficher / cacher des &#233;l&#233;ments en r&#233;ponse &#224; des clics de souris sur des boutons, ce genre de chose), mais j'ai eu l'occasion de me plonger plus en d&#233;tail, et l&#224; suite de bonnes surprises.&lt;/p&gt; &lt;p&gt;C'est un &lt;a href='http://fr.wikipedia.org/wiki/Langage_de_script' class='spip_out' rel='external'&gt;langage de script&lt;/a&gt; orient&#233; &lt;a href='http://fr.wikipedia.org/wiki/Programmation_orient&#233;e_objet' class='spip_out' rel='external'&gt;objet&lt;/a&gt;, avec ce qu'il faut de polymorphisme, h&#233;ritage, encapsulation.&lt;/p&gt; &lt;p&gt;Il n'a pas de typage fort, c'est-&#224;-dire qu'il est par exemple possible d'&#171; additionner &#187; un nombre et un caract&#232;re, le script faisant en sorte de se d&#233;brouiller pour convertir tout seul.&lt;/p&gt; &lt;p&gt;Il comporte de nombreuses fonctions de base, pour lire du XML, effectuer des requ&#234;tes au serveur en arri&#232;re-plan, effectuer des &#233;v&#232;nements apr&#232;s un certain d&#233;lai, ...&lt;/p&gt; &lt;h3 class=&quot;spip&quot;&gt;Bref&lt;/h3&gt;
&lt;p&gt;&#192; mon sens Javascript est un tr&#232;s bon langage, qui souffre de quelques faiblesses :
&lt;br /&gt;&lt;img src=&quot;http://nicolas.weeger.org/local/cache-vignettes/L8xH11/puce-32883.gif&quot; width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; pas de compilateur, ce qui permettrait de voir rapidement les erreurs comme variables non d&#233;clar&#233;es, mauvais appels de fonctions, etc. Il existe cependant de bon d&#233;boggeurs, &#224; travers Firefox ou Internet Explorer.
&lt;br /&gt;&lt;img src=&quot;http://nicolas.weeger.org/local/cache-vignettes/L8xH11/puce-32883.gif&quot; width='8' height='11' class='puce' alt=&quot;-&quot; style='height:11px;width:8px;' /&gt; il existe des diff&#233;rences notables entre l'impl&#233;mentation des diff&#233;rents navigateurs. Des champs n'ont pas le m&#234;me nom (&lt;tt&gt;innerText&lt;/tt&gt; versus &lt;tt&gt;text&lt;/tt&gt;), les objets n'ont pas tout &#224; fait les m&#234;mes m&#233;thodes, la gestion de la souris est tr&#232;s diff&#233;rente, etc. Cependant il existe plusieurs libraries d'abstraction, et ce n'est pas trop difficile &#224; faire si besoin, il y a beaucoup d'exemples sur Internet.&lt;/p&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>
<item xml:lang="fr">
		<title>Interpr&#233;teur Python dans du code C, avec variables s&#233;par&#233;es</title>
		<link>http://nicolas.weeger.org/spip.php?article2</link>
		<guid isPermaLink="true">http://nicolas.weeger.org/spip.php?article2</guid>
		<dc:date>2006-03-26T11:02:52Z</dc:date>
		<dc:format>text/html</dc:format>
		<dc:language>fr</dc:language>
		<dc:creator>Nicolas</dc:creator>


		<dc:subject>C/C++</dc:subject>
		<dc:subject>Python</dc:subject>

		<description>Crossfire comporte un plugin permettant d'ex&#233;cuter des scripts Python. Un des probl&#232;mes pos&#233;s &#233;tait que les variables Python persistaient entre les ex&#233;cutions de scripts. Apr&#232;s un passage sur #python, la solution suivante est apparue. dict = PyDict_New(); PyDict_SetItemString(dict, &quot;__builtins__&quot;, PyEval_GetBuiltins()); ret = PyRun_File(scriptfile, scriptname, Py_file_input, dict, dict); if (PyErr_Occurred()) PyErr_Print(); Py_XDECREF(ret); (...)

-
&lt;a href="http://nicolas.weeger.org/spip.php?rubrique2" rel="directory"&gt;Code&lt;/a&gt;

/ 
&lt;a href="http://nicolas.weeger.org/spip.php?mot1" rel="tag"&gt;C/C++&lt;/a&gt;, 
&lt;a href="http://nicolas.weeger.org/spip.php?mot2" rel="tag"&gt;Python&lt;/a&gt;

		</description>


 <content:encoded>&lt;div class='rss_texte'&gt;&lt;p&gt;Crossfire comporte un plugin permettant d'ex&#233;cuter des scripts Python. Un des probl&#232;mes pos&#233;s &#233;tait que les variables Python persistaient entre les ex&#233;cutions de scripts. Apr&#232;s un passage sur #python, la solution suivante est apparue.&lt;/p&gt; &lt;div style='text-align: left;' class='spip_code' dir='ltr'&gt;&lt;code&gt; dict = PyDict_New();&lt;br /&gt; PyDict_SetItemString(dict, &quot;__builtins__&quot;, PyEval_GetBuiltins());&lt;br /&gt; ret = PyRun_File(scriptfile, scriptname, Py_file_input, dict, dict);&lt;br /&gt; if (PyErr_Occurred()) {&lt;br /&gt; PyErr_Print();&lt;br /&gt; }&lt;br /&gt; Py_XDECREF(ret);&lt;br /&gt; Py_DECREF(dict);&lt;/code&gt;&lt;/div&gt;
&lt;p&gt;En l'occurrence l'utilisation de la fonction &lt;code class='spip_code' dir='ltr'&gt;PyEval_GetBuiltins&lt;/code&gt;.&lt;/p&gt; &lt;p&gt;Cela fonctionne, peut-&#234;tre qu'il reste des r&#233;f&#233;rences pas lib&#233;r&#233;es, difficile &#224; dire...&lt;/p&gt; &lt;p&gt;De plus la fonction n'est pas document&#233;e, donc changera peut-&#234;tre sur une prochaine version de Python.&lt;/p&gt;&lt;/div&gt;
		
		</content:encoded>


		

	</item>



</channel>

</rss>
