<?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 - dclink</title>
		<link>https://www.developpez.net/forums/blogs/337598-dclink/</link>
		<description>Developpez.com, le Club des Développeurs et IT Pro</description>
		<language>fr</language>
		<lastBuildDate>Fri, 31 Jul 2026 17:11:23 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 - dclink</title>
			<link>https://www.developpez.net/forums/blogs/337598-dclink/</link>
		</image>
		<item>
			<title>Nodejs et FreeBSD</title>
			<link>https://www.developpez.net/forums/blogs/337598-dclink/b477/nodejs-freebsd/</link>
			<pubDate>Sat, 02 May 2015 05:41:17 GMT</pubDate>
			<description>Hello, 
 
Un article...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">Hello,<br />
<br />
Un article récemment paru sur <a href="http://bsdmag.org/download/nodejs-and-freebsd/" target="_blank">BSDMag</a> à propos de NodeJS et FreeBSD. Cette première partie est consacrée à la compilation à partir des sources. Intéressant pour ceux qui veulent se lancer dans l'écriture d'applications NodeJS !</blockquote>

]]></content:encoded>
			<dc:creator>dclink</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/337598-dclink/b477/nodejs-freebsd/</guid>
		</item>
		<item>
			<title><![CDATA[Analyse de l'User-Agent]]></title>
			<link>https://www.developpez.net/forums/blogs/337598-dclink/b293/analyse-l-user-agent/</link>
			<pubDate>Wed, 04 Mar 2015 21:51:33 GMT</pubDate>
			<description><![CDATA[L'User-Agent est une chaine...]]></description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">L'User-Agent est une chaine de caractères qui donne au serveur web l'identification du client qui le requête, ce qui fait que le dit serveur sélectionne le bon contenu a délivrer. Cette information est cruciale pour être sûr que les sites webs s'afficheront proprement pour chaque navigateur et appareil (mobile ou non). Donc, comment on analyse un User-Agent ?<br />
<br />
<u>1/ Pourquoi l'analyse d'un User-Agent est difficile ?</u><br />
<br />
Les vendeurs d'applications ont souvent masqué la vérité au sujet des appareils ou navigateurs pour améliorer l'expérience utilisateur et remporter les objectifs marketing. Dans certains cas, l'User-Agent contient des informations qui ne sont pas forcément en adéquation, comme 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  :</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:60px;"><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 /></div></td><td valign="top"><pre style="margin: 0">
Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.111 Safari/537.36</pre></td></tr></table></pre>
</div>Bien que cela vienne d'un laptop Windows 7 utilisant un navigateur Chrome, il contient les mots clés &quot;Mozilla&quot; et &quot;Safari&quot;.<br />
<br />
<u>2/ &quot;Spoofing&quot; d'User-Agent</u><br />
<br />
Cette technique a démarré dans les premiéres années de la navigation internet. Regardons de plus prés quelques User-Agent issue des années 90 :<br />
<br />
<ul><li style="">Netscape Navigator 2: Mozilla/Version [Language] (Platform; Encryption)</li><li style="">Internet Explorer 3: Mozilla/2.0 (compatible; MSIE Version; Operating System)</li></ul><br />
<br />
Netscape (nom de code Mozilla) était le navigateur dominant qui offrait plus de possibilités que IE 3. Au lieu de s'adapter aux limitations d'IE 3, les dévloppeurs web les bloquaient simplement.<br />
<br />
En réponse à cela, Microsoft décida que les pré versions d'Internet Explorer se feront passer pour Mozilla pour s'assurer que les utilisateurs puissent voir les contenus et pour aider le navigateur à améliorer sa part de marché.<br />
<br />
Intéressant, encore quelque parties des User-Agent utilisées a cette époque sont encore utilisées de nos jours. Pour se convaincre, jetons un oeil sur cette bréve analyse des User-Agents actuels :<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:60px;"><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 /></div></td><td valign="top"><pre style="margin: 0">
<ul><li style=""><b>Mozilla</b> - ce qui signifie compatible Mozilla</li><li style=""><b>Windows NT 6.1</b> - référence au systéme d'exploitation</li><li style=""><b>WoW64</b> - signifie une application Win 32 bits tournant sous Win 64 bits</li><li style=""><b>AppleWebKit/537.36</b> - le moteur de rendu</li><li style=""><b>KHTML, like Gecko</b> - le moteur HTML</li><li style=""><b>Chrome/40.0.2214.111</b> - version de chrome</li><li style=""><b>Safari/537.36</b> - compatible Safari</li></ul></pre></td></tr></table></pre>
</div>Les User-Agents pour les appareils mobiles induisent en erreur. Par exemple celui-ci, envoyé par le navigateur Palmer Pre l'un des rares à tenir la dragée haute avec les iPhone 3G et 3Gs en 2009<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:60px;"><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 /></div></td><td valign="top"><pre style="margin: 0">
Mozilla/5.0 (iPhone; U; en)(webOS/1.3.5.1; U; en-US) AppleWebKit/525.27.1 Version/1.0 Safari/525.27.1 Pre/1.0 -CET</pre></td></tr></table></pre>
</div>Le mot-clé iPhone a été introduit dans l'user-agent afin de s'assurer qu'ils puissent accéder aux services en ligne auquel ils ne pourraient pas sinon.<br />
<br />
<u>3/ Les détections d'appareils mobiles ou non passent par l'User-Agent et d'autres en-têtes HTTP</u><br />
<br />
Une stratégie d'adaption de contenu incluant smartphones et tablettes implique d'analyser l'User-Agent.<br />
Bien qu'analyser certains mot-clés semblent une approche raisonnable, cela ne donnera pourtant pas de résultats très précis pour les raisons expliquées ci-dessus<br />
<br />
Comme par exemple, comme on l'a vu, le fait que l'User-Agent contienne iphone ne signifie pas que l'appareil en est réellement un. Pour analyser précisément, il est important d'analyser chaque aspect de l'User-Agent ainsi que les autres en-têtes HTTP et non pas juste les mots-clés. C'est spécialement important si on veut faire une recherche fine, comme les langues et les locales.<br />
<br />
Source <a href="https://deviceatlas.com/blog/user-agent-string-analysis?utm_source=twitter&amp;utm_medium=tweet&amp;utm_campaign=user%20agent%20string" target="_blank">DeviceAtlas</a></blockquote>

]]></content:encoded>
			<dc:creator>dclink</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/337598-dclink/b293/analyse-l-user-agent/</guid>
		</item>
		<item>
			<title>Detection des appareils mobiles</title>
			<link>https://www.developpez.net/forums/blogs/337598-dclink/b238/detection-appareils-mobiles/</link>
			<pubDate>Sat, 28 Feb 2015 19:41:02 GMT</pubDate>
			<description>Bonjour tout le monde. 
 
La...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">Bonjour tout le monde.<br />
<br />
La détection des appareils mobiles se situe principalement autour des en-têtes HTTP comme l'user-agent. De nos jours, adaptez une application web selon la nature du client devient de plus en plus important.<br />
Si vous vous souciez de la différenciation sur vos serveurs du traffic entre clients de type &quot;desktop&quot; et clients de type &quot;mobile&quot;, je vais tenter de vous parler des principales solutions du marché que je connais, à savoir :<br />
<br />
1/ <a href="https://51degrees.com/products/device-detection" target="_blank">51 Degrees</a><br />
<br />
Plusieurs versions pour différents langages de programmations et packaging sont proposés <a href="https://51degrees.com/resources/downloads/open-source-apis" target="_blank">ici</a>. Deux principaux types d'API sont proposés, &quot;trie&quot; et &quot;pattern&quot;, le premier étant le plus rapide, le second privilégiant la précision dans la détection. A choisir selon son usage détection en temps réel ou utilisation locale en mode &quot;batch&quot;. Pour avoir testé la version pour le langage C, multiplateforme (testé sous différents unixes mais doit marcher aussi bien sous win32), la version &quot;trie&quot; est en effet l'une des plus rapides du marché au prix d'une consommation mémoire plutôt conséquente. La version &quot;pattern&quot; est bien plus économe en terme de consommation mémoire bien que la différence dans la précision se fait bien sentir.<br />
<br />
Les différents appels de l'API sont assez simples d'accès :<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 c :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br /></div></td><td valign="top"><pre style="margin: 0">Example de l<span style="color: #FF0000;">'</span>API C version <span style="color: #FF0000;">&quot;trie&quot;</span>
<span style="color: #339933;">#include</span><span style="color: #FF0000;"> &lt;51Degrees.h&gt;</span>
...
DataSetInitStatus status;
<span style="color: #0000ff;">int</span> device;
<span style="color: #0000ff;">int</span> ismobilepropindex;
<span style="color: #0000ff;">char</span> *ismobilevalue;
...
<span style="color: #0000ff;">if</span> <span style="color: black;">&#40;</span><span style="color: black;">&#40;</span>status = init<span style="color: black;">&#40;</span><span style="color: #FF0000;">&quot;/tmp/51Degrees-Lite.trie&quot;</span>, <span style="color: #0080ff;">NULL</span><span style="color: black;">&#41;</span> == DATA_SET_INIT_STATUS_SUCCESS<span style="color: black;">&#41;</span> <span style="color: black;">&#123;</span>
   <span style="color: #0000ff;">if</span> <span style="color: black;">&#40;</span><span style="color: black;">&#40;</span>device = getDeviceOffset<span style="color: black;">&#40;</span>argv<span style="color: black;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span> != <span style="color: #cc66cc;">-1</span><span style="color: black;">&#41;</span> <span style="color: black;">&#123;</span>
       ismobilepropindex = getPropertyIndex<span style="color: black;">&#40;</span><span style="color: #FF0000;">&quot;IsMobile&quot;</span><span style="color: black;">&#41;</span>;
       ismobilevalue = getValue<span style="color: black;">&#40;</span>ismobilepropindex<span style="color: black;">&#41;</span>;
       ...
   <span style="color: black;">&#125;</span>
   destroy<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>;
<span style="color: black;">&#125;</span></pre></td></tr></table></pre>
</div><br />
2/ <a href="https://deviceatlas.com/resources/download-enterprise-api" target="_blank">DeviceAtlas</a><br />
<br />
Il y a là également plusieurs versions pour différents langages, la version C++ (aussi multiplateforme) a, en plus, un module Apache, Nginx et IIS. Cette fois une seule et unique API unifiée qui allie plutôt bien pure performance et précision dans la détection. La consommation mémoire est plutôt raisonnable. <br />
<br />
Les différents appels sont assez facile d'accés là également.<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 c :</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: #339933;">#include</span><span style="color: #FF0000;"> &lt;mtld/devatlas.h&gt;</span>
<span style="color: #0000ff;">using</span> <span style="color: #0000ff;">namespace</span> Mobi::Mtld;
<span style="color: #0000ff;">using</span> <span style="color: #0000ff;">namespace</span> std;
...
Da::DeviceAtlas atlas;
Da::HeaderMap map;
&nbsp;
<span style="color: #0000ff;">try</span> <span style="color: black;">&#123;</span>
    atlas.loadDataFromFile<span style="color: black;">&#40;</span><span style="color: #FF0000;">&quot;/tmp/20150228.json&quot;</span><span style="color: black;">&#41;</span>;
    map<span style="color: black;">&#91;</span><span style="color: #FF0000;">&quot;user-agent&quot;</span><span style="color: black;">&#93;</span> = argv<span style="color: black;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: black;">&#93;</span>;
    map<span style="color: black;">&#91;</span><span style="color: #FF0000;">&quot;x-device-useragent&quot;</span><span style="color: black;">&#93;</span> = argv<span style="color: black;">&#91;</span><span style="color: #cc66cc;">2</span><span style="color: black;">&#93;</span>;
    ...
    Da::HttpHeaders headers<span style="color: black;">&#40;</span>map<span style="color: black;">&#41;</span>;
    Da::DeliveryContext device<span style="color: black;">&#40;</span>atlas, headers<span style="color: black;">&#41;</span>;
    <span style="color: #0000ff;">for</span> <span style="color: black;">&#40;</span>Da::DeliveryContext::const_iterator it = device.begin<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>; it != device.end<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>; ++it<span style="color: black;">&#41;</span> <span style="color: black;">&#123;</span>
        <span style="color: #0000ff;">const</span> Da::Property *prop = it-&gt;first;
        <span style="color: #0000ff;">const</span> Da::Value *val = it-&gt;second;
        std::cout &lt;&lt; prop-&gt;name &lt;&lt; <span style="color: #FF0000;">&quot;=&quot;</span> &lt;&lt; *val &lt;&lt; <span style="color: #FF0000;">&quot;<span style="color: #800000;">\n</span>&quot;</span>;
    <span style="color: black;">&#125;</span>
    ...
<span style="color: black;">&#125;</span>
<span style="color: black;">&#125;</span> <span style="color: #0000ff;">catch</span> <span style="color: black;">&#40;</span>exception &amp;e<span style="color: black;">&#41;</span> <span style="color: black;">&#123;</span>
...
<span style="color: black;">&#125;</span></pre></td></tr></table></pre>
</div><br />
Ce sont bien sûr des solutions plutôt adaptées aux entreprises mais la problématique de la détection des divers appareils mobiles (tablettes et maintenant montres &quot;intelligentes&quot; ... etc) devenant de plus en plus complexe mais au vu de la plus grande diversité de ceux ci leur distinction étant plus que jamais nécessaire, une API de détection est un atout majeur.</blockquote>

]]></content:encoded>
			<dc:creator>dclink</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/337598-dclink/b238/detection-appareils-mobiles/</guid>
		</item>
	</channel>
</rss>
