<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>blog ntic de revolunet &#187; developpement</title>
	<atom:link href="http://blog.revolunet.com/index.php/conseil.intranet/developpement/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.revolunet.com</link>
	<description>Blog des Nouvelles Technologies de l'Information et de la Communication</description>
	<lastBuildDate>Mon, 08 Feb 2010 11:23:26 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Astuces Django</title>
		<link>http://blog.revolunet.com/index.php/developpement/astuces-django</link>
		<comments>http://blog.revolunet.com/index.php/developpement/astuces-django#comments</comments>
		<pubDate>Fri, 11 Dec 2009 00:46:07 +0000</pubDate>
		<dc:creator>Juju</dc:creator>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[developpement]]></category>
		<category><![CDATA[django]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://blog.revolunet.com/?p=393</guid>
		<description><![CDATA[Suite à mon quickstart Django, me revoici avec quelques astuces pour continuer.
Pour tester/développer avec Django, je rappelle qu&#8217;il vaut mieux utiliser le serveur de dev intégré, puis passer à Apache, nginx ou autre pour la production par la suite.
Il est important de lire pour commencer les principes de la philosophie Django ainsi que le &#8216;django coding style&#8217;
Ne [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-full wp-image-396" title="tips" src="http://blog.revolunet.com/wp-content/uploads/2009/12/tips.jpg" alt="tips" width="150" height="152" />Suite à mon <a href="http://blog.revolunet.com/index.php/general/bien-demarrer-avec-django" target="_blank">quickstart Django</a>, me revoici avec quelques astuces pour continuer.</p>
<p>Pour tester/développer avec Django, je rappelle qu&#8217;il vaut mieux utiliser le serveur de dev intégré, puis passer à Apache, nginx ou autre pour la production par la suite.</p>
<p>Il est important de lire pour commencer les principes de la <strong><a href="http://docs.djangoproject.com/en/dev/misc/design-philosophies/" target="_blank">philosophie Django</a> </strong>ainsi que le <a href="http://docs.djangoproject.com/en/dev/internals/contributing/#coding-style" target="_blank">&#8216;django coding style&#8217;</a></p>
<p><strong>Ne hardcodez pas vos paths</strong></p>
<ul>
<li>dans votre settings.py :</li>
<li>
<div class="codesnip-container" >BASE_DIR = os.path.dirname(__file__)</div>
</li>
<li>utilisez ensuite os.path.join avec settings.BASE_DIR ailleurs si besoin</li>
<li>Pour importer les settings de votre projet, utilisez toujours
<div class="codesnip-container" >from django.conf import settings</div>
</li>
</ul>
<p><strong>Utilisez un fichier local_settings.py</strong></p>
<ul>
<li>Créez un fichier local_settings.py qui contiendra uniquement les settings relatifs au déploiment de votre application : settings de base de données, smtp, debug&#8230; Vous n&#8217;aurez plus que celui la à modifier pour un nouveau déploiement.</li>
</ul>
<p><strong>Mettre en production avec Apache</strong></p>
<ul>
<li>Pour une installation classique avec <strong>Apache</strong>, utilisez de préférence <strong><a href="http://code.google.com/p/modwsgi/wiki/IntegrationWithDjango" target="_blank">mod_wsgi</a>. <span style="color: #ff0000;">N&#8217;utilisez pas le serveur de dev intégré en production!</span></strong></li>
</ul>
<p><strong>Debug AJAX plus pratique</strong></p>
<ul>
<li>Si vous faites de l&#8217;Ajax, utilisez <strong><a href="https://addons.mozilla.org/fr/firefox/addon/1843" target="_blank">Firebug</a> et le middleware </strong><a href="http://www.djangosnippets.org/snippets/650/" target="_blank"><strong>AJAXSimpleExceptionResponse</strong></a></li>
</ul>
<p><strong>Queysets : filters et excludes dynamiques</strong></p>
<ul>
<li>Utilisez les dictionnaires pour filtrer dynamiquement vos querysets :</li>
</ul>
<div class="codesnip-container" >filtres = {}<br />
filtres['date__gte'] = datetime.datetime.today() &#8211; datetime.timedelta(dasy=7)<br />
filtres['titre__icontains'] = &#8216;python&#8217;<br />
excludes={}<br />
excludes['epuise'] = True<br />
qs = model.Livres.objects.exclude(**excludes).filter(**filtres)</div>
<p><strong>Créez des applications modulaires</strong></p>
<ul>
<li>Placez vos app dans un sous dossier &#8216;apps&#8217;</li>
<li>Utiliser des objets génériques : le <a href="http://docs.djangoproject.com/en/dev/ref/contrib/contenttypes/" target="_blank">ContentType framework</a></li>
</ul>
<p><strong>Utilisez un script pour mettre à jour vos modèles</strong></p>
<ul>
<li>Django ne gérant pas nativement les ALTER sur votre base de données, vous devez sauvegarder (manage.py dumpdata), reset votre base (manage.py reset) puis recréer votre base (manage.py syncdb) et recharger les données (manage.py loaddata).</li>
<li>Utilisez plutot un <a href="http://www.chrisdpratt.com/2008/02/27/a-django-snippet-to-refresh-your-database/" target="_blank">script qui automatisera cette tache</a></li>
</ul>
<p><strong>Utilisez des décorateurs dans vos vues</strong></p>
<ul>
<li><strong>@login_required </strong>pour restreindre la vue aux utilisateurs loggés</li>
<li><strong>@user_passes_test(lambda u: u.has_perm(&#8217;polls.can_vote&#8217;)) </strong>pour restreindre la vue selon un test particulier</li>
<li>créez vos propres décorateurs</li>
</ul>
<p><strong>Ne définissez qu&#8217;une fois vos urls</strong></p>
<ul>
<li>Utilisez les <a href="{% url arch-summary 1945 %}" target="_blank">named-urls</a> pour ne plus harcoder vos urls
<ul>
<li>Dans urls.py :  
<div class="codesnip-container" >(r&#8217;^articles/list/(\d)+&#8217;, apps.main.list, name=&#8221;list-view&#8221;)</div>
</li>
<li>Dans une vue :
<div class="codesnip-container" >return HttpResponseRedirect(reverse(&#8217;list-view&#8217;, args=[2007]))</div>
</li>
<li>Dans un template :
<div class="codesnip-container" >&lt;a href=&#8221;{% url list-view 2007 %}&#8221;&gt;ma vue&lt;/a&gt;</div>
</li>
</ul>
</li>
<li>Utilisez <a href="http://docs.djangoproject.com/en/dev/ref/models/instances/#django.db.models.Model.get_absolute_url" target="_blank">get_absolute_url()</a> sur vos modèles pour affecter une url à chacun de vos objets</li>
</ul>
<p><strong>Des questions que vous vous posez surement :</strong></p>
<ul>
<li><a href="http://www.b-list.org/weblog/2006/jun/28/django-tips-difference-between-blank-and-null/" target="_blank">La différence entre null et blank</a> dans vos modèles</li>
<li>Comment toujours passer des variables à mes templates : les <a href="http://docs.djangoproject.com/en/dev/ref/templates/api/#id1" target="_blank">template contexts</a></li>
</ul>
<p><strong>De bons examples de coding-styles : </strong></p>
<ul>
<li><a href="http://code.google.com/p/django-basic-apps/" target="_blank">http://code.google.com/p/django-basic-apps/</a></li>
<li><a href="http://groups.google.com/group/django-hotclub" target="_blank">http://groups.google.com/group/django-hotclub</a></li>
</ul>
<p><strong>Différents cas de figures sur les formulaires Django</strong> : <a href="http://uswaretech.com/blog/2010/01/doing-things-with-django-forms/">http://uswaretech.com/blog/2010/01/doing-things-with-django-forms/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.revolunet.com/index.php/developpement/astuces-django/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Bien démarrer avec django</title>
		<link>http://blog.revolunet.com/index.php/general/bien-demarrer-avec-django</link>
		<comments>http://blog.revolunet.com/index.php/general/bien-demarrer-avec-django#comments</comments>
		<pubDate>Wed, 02 Dec 2009 11:21:53 +0000</pubDate>
		<dc:creator>Juju</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[developpement]]></category>
		<category><![CDATA[django]]></category>

		<guid isPermaLink="false">http://blog.revolunet.com/?p=381</guid>
		<description><![CDATA[Cela fait maintenant presque deux ans que j&#8217;utilise intensivement le framework Django pour toutes mes applications web, et j&#8217;ai enfin réuni assez d&#8217;éléments pour pouvoir vous livrer un petit &#8216;QuickStart&#8217; qui vous permettra de démarrer rapidement.
Contrairement à d&#8217;autres frameworks web, Django n&#8217;est pas orienté CMS ou HTML. Vous pouvez tout autant créer un site HTML/Ajax, une [...]]]></description>
			<content:encoded><![CDATA[<p>Cela fait maintenant presque deux ans que j&#8217;utilise intensivement le framework <a href="http://www.djangoproject.com/" target="_blank">Django</a> pour toutes mes applications web, et j&#8217;ai enfin réuni assez d&#8217;éléments pour pouvoir vous livrer un petit &#8216;QuickStart&#8217; qui vous permettra de démarrer rapidement.</p>
<p>Contrairement à d&#8217;<a href="http://drupal.org/" target="_blank">autres</a> <a href="http://www.zope.org/" target="_blank">frameworks</a> <a href="http://www.symfony-project.org/doc/1_4/" target="_blank">web</a>, Django n&#8217;est pas orienté CMS ou HTML. Vous pouvez tout autant créer un site HTML/Ajax, une API RESTFUL http ou une application en ligne de commande.</p>
<p>Django permet de coder toute la partie serveur de votre application, mais pour la partie &#8216;client&#8217;, c.a.d. le HTML par exemple, vous devrez vous débrouiller tout seul ou utiliser un autre framework, <a href="http://jquery.com/" target="_blank">jQuery</a> par exemple, ou <a href="http://extjs.com/" target="_blank">ExtJs</a>.</p>
<p><img class="alignleft size-full wp-image-389" title="django" src="http://blog.revolunet.com/wp-content/uploads/2009/12/django.jpg" alt="django" width="120" height="177" /></p>
<p style="padding-left: 120px;"><strong> Pourquoi Django ? </strong></p>
<p style="padding-left: 120px;">Open Source<br />
Portable<br />
Langage Python<br />
Prototypage rapide<br />
Evolutivité<br />
Abstration <a href="http://fr.wikipedia.org/wiki/Mapping_objet-relationnel" target="_blank">ORM<br />
</a> Supporté par <a href="http://fr.wikipedia.org/wiki/Google_App_Engine" target="_blank">Google AppEngine</a> (avec restrictions)<br />
Excellente <a href="http://docs.djangoproject.com/en/dev/" target="_blank">documentation</a></p>
<p><strong>Fonctionnalités principales :</strong></p>
<ul>
<li><strong>ORM :</strong> permet une abstraction de la base de données et du SQL, ce qui fait que vos applications peuvent tourner sur : SQLlite, MySQL, SQLserver, Oracle, PostGres&#8230;</li>
<li><strong>Admin automatique : </strong>une fois vos modèles définis, ils sont de suite accessible dans l&#8217;interface d&#8217;admin automatique, et vous pouvez toute de suite créer objets</li>
<li><strong>Templates : </strong>une gestion des templates très poussée, avec gestion des héritages, des filtres et &#8216;customs tags&#8217;.</li>
<li><strong>Shell intégré : </strong>Tout votre code est également accessible directement depuis un shell intégré</li>
<li><strong>Gestion des utilisateurs : </strong>Toute la partie utilisateurs, comptes, login, sécurité et permissions est déjà disponible sans efforts</li>
</ul>
<p><strong>Inconvénients :</strong></p>
<ul>
<li>Peu d&#8217;hébergeurs mais cela évolue : <a href="http://code.djangoproject.com/wiki/DjangoFriendlyWebHosts">http://code.djangoproject.com/wiki/DjangoFriendlyWebHosts</a></li>
<li>C&#8217;est surtout  un avantage, mais le projet évoluant très vite, vous devrez coder avec et pour une version spécifique de Django. Et vous ne mettrez à jour django pour tel projet seulement après avoir consulté cette page : <a href="http://code.djangoproject.com/wiki/BackwardsIncompatibleChanges">http://code.djangoproject.com/wiki/BackwardsIncompatibleChanges</a></li>
</ul>
<p>A noter que Django est une librairie python, vous pouvez n&#8217;utiliser que les fonctions dont vous avez besoin, même en &#8217;standalone&#8217;  (hors du web).  Et vous pouvez tout modifier, étendre et améliorer à souhait.</p>
<p>La première chose à faire avant de se lancer dans Django est déjà de connaitre un minimum le langage python et sa &#8216;magie&#8217;. Le livre &#8216;<a href="http://openbookproject.net//thinkCSpy/" target="_blank">Think like a computer scientist</a>&#8216; est à lire, <a href="http://hetland.org/writing/instant-python.html" target="_blank">Instant Python</a> pour les préssés, et &#8220;<a href="http://www.swaroopch.com/notes/Python_fr:Table_des_Mati%C3%A8res" target="_blank">A byte of python</a>&#8221; (en francais).</p>
<h2><strong>C&#8217;est parti</strong></h2>
<p>Installez <a href="http://python.org/download/" target="_blank">python </a>(2.5 ou 2.6) sur votre machine, et récupérez la <a href="http://www.djangoproject.com/download/" target="_blank">dernière version de Django</a>. Le repertoire &#8216;django&#8217; de cette archive doit se trouver dans le dossier &#8216;lib/site-packages&#8217; de votre installation de Python. Si vous souhaitez utiliser MySQL comme serveur, installez <a href="http://sourceforge.net/projects/mysql-python/" target="_blank">python-mysqldb</a>. Sinon, SQLlite fera très bien l&#8217;affaire pour démarrer !</p>
<p>Pour tester si votre installation de python/django est correcte :</p>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 272px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">juju@devserver:/var/www/django$ python</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 272px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Python 2.5.2 (r252:60911, Jul 31 2008, 17:28:52)</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 272px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">[GCC 4.2.3 (Ubuntu 4.2.3-2ubuntu7)] on linux2</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 272px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Type &#8220;help&#8221;, &#8220;copyright&#8221;, &#8220;credits&#8221; or &#8220;license&#8221; for more information.</div>
<div class="codesnip-container" >juju@xxxxxxx:/home/juju$ python<br />
Python 2.5.2 (r252:60911, Jul 31 2008, 17:28:52)<br />
[GCC 4.2.3 (Ubuntu 4.2.3-2ubuntu7)] on linux2<br />
Type &#8220;help&#8221;, &#8220;copyright&#8221;, &#8220;credits&#8221; or &#8220;license&#8221; for more information.<br />
&gt;&gt;&gt;import django<br />
&gt;&gt;&gt;print django.VERSION<br />
(1, 0, 2, &#8216;final&#8217;, 0)<br />
&gt;&gt;&gt;</div>
<p>Si vous avez une erreur lors de l&#8217;import, alors votre dossier &#8216;django&#8217; n&#8217;est pas dans votre dossier python\lib\site-packages, vérifiez.</p>
<p>Si l&#8217;install est correcte, alors vous pouvez créer votre premier projet django.</p>
<p><strong>Exemple sur windows :</strong></p>
<p>Ouvrez un shell, et placez vous dans votre dossier de travail, puis lancez la commande django-admin.py startproject</p>
<div class="codesnip-container" >cd c:\dev\django<br />
c:\dev\django&gt;c:\Python25\lib\site-packages\django\bin\django-admin.py startproject projet1</div>
<p>Un dossier &#8216;projet1&#8242; a été crée et contient les fichier de base :</p>
<ul>
<li><strong>settings.py :</strong> configuration du projt, base de données, emails&#8230;</li>
<li><strong>urls.py : </strong>la configuration des urls de votre projet</li>
<li><strong>manage.py : </strong>la commande qui permet de lancer le serveur, mettre a jour les bases et effectuer des opérations de maintenance.</li>
<li><strong>__init__.py :</strong> ce fichier permet simplement à Python d&#8217;interpréter le dossier en tant que &#8216;module&#8217;</li>
</ul>
<p>Pour développer un projet Django, utilisez le &#8217;serveur de dev&#8217; intégré (commande manage.py runserver), mais pour la production, vous devrez mettre en place <a href="http://code.djangoproject.com/wiki/django_apache_and_mod_wsgi" target="_blank">Apache+WSGI</a>, <a href="http://www.alrond.com/en/2007/mar/01/start-django-with-nginx/" target="_blank">Nginx</a> ou <a href="http://code.djangoproject.com/wiki/ServerArrangements" target="_blank">un autre serveur</a>.</p>
<p>Lancez le serveur pour vérifier que votre projet est bien crée :</p>
<div class="codesnip-container" >cd c:\dev\django<br />
c:\dev\django&gt;manage.py runserver<br />
Validating models&#8230;<br />
0 errors found<br />
Django version 1.0-alpha-SVN-8225, using settings &#8216;projet1.settings&#8217;<br />
Development server is running at http://127.0.0.1:8000/<br />
Quit the server with CTRL-BREAK.</div>
<p>Maintenant vous pouvez ouvrir votre browser à cette adresse : <a href="http://127.0.0.1:8000/" target="_blank">http://127.0.0.1:8000/</a></p>
<p>Modifiez le fichier settings.py, puis suivez le <a href="http://docs.django-fr.org/intro/tutorial01.html#creation-des-modeles" target="_blank">premier tutorial</a> pour commencer à faire joujou.</p>
<p>Je reviens prochainement  pour la suite.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.revolunet.com/index.php/general/bien-demarrer-avec-django/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>rsync alternative for low cpus</title>
		<link>http://blog.revolunet.com/index.php/geek-style/rsync-alternative-for-low-cpus</link>
		<comments>http://blog.revolunet.com/index.php/geek-style/rsync-alternative-for-low-cpus#comments</comments>
		<pubDate>Thu, 02 Apr 2009 12:11:54 +0000</pubDate>
		<dc:creator>Juju</dc:creator>
				<category><![CDATA[geek style]]></category>
		<category><![CDATA[shell]]></category>

		<guid isPermaLink="false">http://blog.revolunet.com/?p=289</guid>
		<description><![CDATA[I had to transfer some +500Gb of data from an NTFS drive, using my QNAP TS409 PRO Nas external USB connector.
Using the integrated &#8220;hot copy button&#8221; or a simple rsync between the two drives, i only reached 2.5mb/s which is a pitty. In fact its the Qnap Cpu which is a pitty. (yes rsync is [...]]]></description>
			<content:encoded><![CDATA[<p>I had to transfer some +500Gb of data from an NTFS drive, using my QNAP TS409 PRO Nas external USB connector.</p>
<p>Using the integrated &#8220;hot copy button&#8221; or a simple rsync between the two drives, i only reached 2.5mb/s which is a pitty. In fact its the Qnap Cpu which is a pitty. (yes rsync is cpu consuming)</p>
<p>So inspired from <a href="http://discuss.joelonsoftware.com/default.asp?design.4.528600.11">http://discuss.joelonsoftware.com/default.asp?design.4.528600.11</a> i wrote a simple bash script to recursively copy a directory tree, but using cp instead of rsync. I can now reach 6.5mb/s which is 3 times faster.</p>
<p>So here it is : <a href="http://www.revolunet.com/static/download/labo/mysync.sh">http://www.revolunet.com/static/download/labo/mysync.sh</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.revolunet.com/index.php/geek-style/rsync-alternative-for-low-cpus/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Fin de la passerelle MSN de jabber.fr</title>
		<link>http://blog.revolunet.com/index.php/general/fin-de-la-passerelle-msn-de-jabberfr</link>
		<comments>http://blog.revolunet.com/index.php/general/fin-de-la-passerelle-msn-de-jabberfr#comments</comments>
		<pubDate>Fri, 27 Feb 2009 16:22:59 +0000</pubDate>
		<dc:creator>Juju</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Jabber]]></category>
		<category><![CDATA[actu informatique]]></category>

		<guid isPermaLink="false">http://blog.revolunet.com/?p=282</guid>
		<description><![CDATA[A mon grand regret, les admins de jabber.fr ont décidé de mettre fin aux services des passerelles propriétaires sur le serveur jabber.fr.  Cela concerne bien sur MSN, mais aussi ICQ et AIM.
Cette décision, surtout politique, va obliger tous ceux qui ont migré sur jabber à changer de client (pour un client multi-protocoles) ou à s&#8217;inscrire [...]]]></description>
			<content:encoded><![CDATA[<p>A mon grand regret, les admins de jabber.fr ont <a href="http://jabber.apinc.org/news/?p=48" target="_blank">décidé de mettre fin aux services des passerelles propriétaires</a> sur le serveur jabber.fr.  Cela concerne bien sur MSN, mais aussi ICQ et AIM.</p>
<p>Cette décision, surtout politique, va obliger tous ceux qui ont migré sur jabber à changer de client (pour un client multi-protocoles) ou à s&#8217;inscrire sur une autre passerelle.</p>
<p>Si comme moi vous êtes un fan de <a href="http://psi-im.org/" target="_blank">PSI</a> , vous pouvez tout de même utiliser d&#8217;autres passerelles, comme par exemple celle de jabber.gnubox.net tout en gardant votre compte jabber actuel. </p>
<p>La passerelle MSN aura en tous cas rendu de bons et loyaux services pendant plusieurs années, meme s&#8217;il fallait la relancer 1 à 2 fois par semaine, ce qui est tout de meme toujours mieux que de faire tourner Live Messenger.</p>
<p>AMEN</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.revolunet.com/index.php/general/fin-de-la-passerelle-msn-de-jabberfr/feed</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>WPF MediaElement + ASX workaround</title>
		<link>http://blog.revolunet.com/index.php/general/wpf-mediaelement-asx-workaround</link>
		<comments>http://blog.revolunet.com/index.php/general/wpf-mediaelement-asx-workaround#comments</comments>
		<pubDate>Fri, 13 Feb 2009 16:30:35 +0000</pubDate>
		<dc:creator>Juju</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[developpement]]></category>

		<guid isPermaLink="false">http://blog.revolunet.com/?p=272</guid>
		<description><![CDATA[This i my first English post so sorry for the poor english, and feel free to correct me  
I recently had to develop a multimedia XAML application  that plays Asx playlists with customs overlays and i faced to differents annoying, unresolved problems related to the MediaElement ASX handling. I discovered that the MediaElement behaves [...]]]></description>
			<content:encoded><![CDATA[<p>This i my first English post so sorry for the poor english, and feel free to correct me <img src='http://blog.revolunet.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>I recently had to develop a multimedia XAML application  that plays Asx playlists with customs overlays and i faced to differents annoying, unresolved problems related to the MediaElement ASX handling. I discovered that the MediaElement behaves very differently with medias played within an Asx and the same medias played direclty.</p>
<p>My four main problems were  :</p>
<ul>
<li>The MediaElement keeps the first Asx item aspect radio for the whole Asx. (cannot mix 4:3 and 16:9 medias)</li>
<li>If you add some still images in the Asx (jpeg), you cannot add animated overlays over it, because the animated items leave ugly black trails over the image&#8230; </li>
<li>The MediaElement doesnt play correctly WMV files inside an Asx. It stops before the end, and the Audio is a little bit desynchronised.</li>
<li>Maybe related to my last wmv playback problem, sometimes, even with &lt;REPEAT&gt; tags in the Asx, the MediaElement stops during a video.</li>
</ul>
<p>It took weeks to track and identify these problems&#8230;but if you test outside an Asx, all the problems go away, So its clearly related to MediaElement Asx handling. Problem is that MediaElement control is actually very limited.</p>
<p>So i finally decide to create a small AsxController class that simply parse an Asx file and control a specified MediaElement object. Its simple and it works like a charm. Supported Asx items are streams uri, files, but also still images with a specified duration. </p>
<p>Its written in VB.NET but you can easily translate it to C# or something else. It should be compatible with Silverlight.</p>
<p>Grab the source and example code here (rename to .vb) : <a title="AsxController.vb" href="http://blog.revolunet.com/wp-content/uploads/2009/02/asxcontroller.vb" target="_blank">AsxController.vb</a></p>
<p>Enjoy !</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.revolunet.com/index.php/general/wpf-mediaelement-asx-workaround/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>WordPress hacked &amp; spam injections</title>
		<link>http://blog.revolunet.com/index.php/general/wordpress-hacked-spam-injections</link>
		<comments>http://blog.revolunet.com/index.php/general/wordpress-hacked-spam-injections#comments</comments>
		<pubDate>Mon, 19 May 2008 19:52:52 +0000</pubDate>
		<dc:creator>Juju</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[actu informatique]]></category>
		<category><![CDATA[developpement]]></category>

		<guid isPermaLink="false">http://blog.revolunet.com/index.php/general/wordpress-hacked-spam-injections</guid>
		<description><![CDATA[Les spammers n&#8217;ont décidément plus de limite dans leur imagination   C&#8217;est ce que j&#8217;ai découvert en éditant un de mes articles sur ce blog. En regardant de près le code d&#8217;un de mes posts, je me suis rendu compte qu&#8217;a la fin du post, il y avait du spam ajouté en toute discretion&#8230;
Le spammer [...]]]></description>
			<content:encoded><![CDATA[<p>Les spammers n&#8217;ont décidément plus de limite dans leur imagination <img src='http://blog.revolunet.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  C&#8217;est ce que j&#8217;ai découvert en éditant un de mes articles sur ce blog. En regardant de près le code d&#8217;un de mes posts, je me suis rendu compte qu&#8217;a la fin du post, il y avait du spam ajouté en toute discretion&#8230;</p>
<p>Le spammer comence par injecter quelques tags :
<div class="codesnip-container" >&lt;!&#8211;c47fb25734eb9xxxxd6ece85fbe4e7a&#8211;&gt;&lt;!&#8211;88db79567a32a479fxxx69eff41d0&#8211;&gt;</div>
<p> puis insère une div cachée, non visible dans un navigateur :
<div class="codesnip-container" >;&lt;div id=&#8221;wp_internal&#8221; style=&#8221;position: absolute; left: -9112px&#8221;&gt;</div>
<p> puis insère tout un tas de liens sur le vi4gr4 et compagnie&#8230; Ceci est possible grâce à l&#8217;exploitation d&#8217;une <a href="http://secunia.com/search/?search=wordpress">faille de sécurité dans WordPress</a>, qui permet au hacker de se créer facilement un compte administrateur. Cette faille a depuis été corrigée d&#8217;ou l&#8217;importance de toujours <a href="http://codex.wordpress.org/fr:Mise_%C3%A0_jour" target="_blank">bien mettre à jour wordpress </a>et tout logiciel en général.</p>
<p>Si en plus le serveur est mal configuré, le hacker peut alors prendre le controle total de la machine en uploadant le <a onclick="alert('Non%20quand%20meme%20pas%20;')" href="#">parfait kit du pirate PHP</a>. Un outil de crackage a apparemment été développé pour automatiser la tache, polluer  à la chaine des milliers de blogs, certainement pour longtemps, et ainsi gonfler au maximum la popularité des sites cibles aux yeux des moteurs de recherche.</p>
<p>L&#8217;origine de l&#8217;attaque provient apparemment de Pologne et Russie. Le resultat de cette attaque a engendré un blacklistage de l&#8217;index de google et j&#8217;ai donc crée un script Python qui répare les dégats en supprimant les spams :</p>
<div class="codesnip-container" >
<div class="codesnip"><span class="kw1">import</span> <span class="kw3">re</span><br />
<span class="kw1">import</span> MySQLdb<br />
<span class="co1">#example spam tags to remove :</span><br />
<span class="co1"># &#8230;&amp;lt;!&#8211;1f195247aee1eba914f252716a78efba&#8211;&amp;gt;&amp;lt;!&#8211;b845738c6a171d114ceaa35493a4f0dc&#8211;&amp;gt;&amp;lt;div id=wp_internal style=position:absolute;left:-9112px&amp;gt;&amp;lt;a href=http://www.eeeeee/zefzef/wp-content/themes/default/zefezff/eeeeee.html&amp;gt;&#8230; </span><br />
&nbsp;</div>
</div>
<div class="codesnip-container" >
<div class="codesnip">db = MySQLdb.<span class="me1">connect</span><span class="br0">&#40;</span>host=<span class="st0">&#8220;192.168.0.1&#8243;</span>, <span class="kw3">user</span>=<span class="st0">&#8220;wp&#8221;</span>, passwd=<span class="st0">&#8220;passwp&#8221;</span>, db=<span class="st0">&#8220;wordpress_bdd&#8221;</span><span class="br0">&#41;</span><br />
cursor=db.<span class="me1">cursor</span><span class="br0">&#40;</span><span class="br0">&#41;</span><br />
cursor.<span class="me1">execute</span><span class="br0">&#40;</span><span class="st0">&#8220;SELECT ID, POST_CONTENT FROM wp_posts ORDER BY ID DESC&#8221;</span><span class="br0">&#41;</span><br />
posts = cursor.<span class="me1">fetchall</span><span class="br0">&#40;</span><span class="br0">&#41;</span><br />
log=<span class="br0">&#91;</span><span class="br0">&#93;</span><br />
<span class="kw1">for</span> post <span class="kw1">in</span> posts:<br />
    parts = <span class="kw3">re</span>.<span class="me1">split</span><span class="br0">&#40;</span>r<span class="st0">&#8220;&amp;lt;<span class="es0">\!</span>&#8211;<span class="es0">\w</span>{32}&#8211;&amp;gt;&#8221;</span>, post<span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span><span class="br0">&#41;</span><br />
    <span class="kw1">if</span> <span class="kw2">len</span><span class="br0">&#40;</span>parts<span class="br0">&#41;</span>&amp;gt;<span class="nu0">1</span>:<br />
        clean_post = parts<span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span>.<span class="me1">replace</span><span class="br0">&#40;</span><span class="st0">&#8220;&#8216;&#8221;</span>, <span class="st0">&#8220;&#8221;&#8221;</span><span class="br0">&#41;</span><br />
        sql = <span class="st0">&#8220;update wp_posts set POST_CONTENT=&#8217;%s&#8217; where ID=%s;&#8221;</span> % <span class="br0">&#40;</span>clean_post, post<span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span><span class="br0">&#41;</span><br />
        log.<span class="me1">append</span><span class="br0">&#40;</span>sql<span class="br0">&#41;</span><br />
        cursor.<span class="me1">execute</span><span class="br0">&#40;</span>sql<span class="br0">&#41;</span><br />
        <span class="kw1">print</span> <span class="st0">&#8220;updating post %s&#8221;</span> % post<span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span><br />
db.<span class="me1">close</span><span class="br0">&#40;</span><span class="br0">&#41;</span><br />
f=<span class="kw2">open</span><span class="br0">&#40;</span><span class="st0">&#8220;wp_out.sql&#8221;</span>, <span class="st0">&#8220;w&#8221;</span><span class="br0">&#41;</span><br />
f.<span class="me1">write</span><span class="br0">&#40;</span><span class="st0">&#8220;<span class="es0">\n</span>&#8220;</span>.<span class="me1">join</span><span class="br0">&#40;</span>log<span class="br0">&#41;</span><span class="br0">&#41;</span><br />
f.<span class="me1">close</span><span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</div>
<p><strong><span style="color: #ff0000;">Attention à bien sauvegarder votre base de données avant d&#8217;executer ce script ! Si vous ne comprennez pas le script, ne l&#8217;executez pas !</span></strong></p>
<p>J&#8217;attends impatiemment le retour du traffic si google veut bien me réindexer !</p>
<p><strong>EDIT :</strong>Deux jours après application du script + demande de réexamen dans <a href="https://www.google.com/webmasters/tools">Google webmaster tools</a> le traffic est revenu à la normale&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.revolunet.com/index.php/general/wordpress-hacked-spam-injections/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Mise à jour de VLCcontrols</title>
		<link>http://blog.revolunet.com/index.php/developpement/mise-a-jour-de-vlccontrols</link>
		<comments>http://blog.revolunet.com/index.php/developpement/mise-a-jour-de-vlccontrols#comments</comments>
		<pubDate>Wed, 23 Apr 2008 10:43:58 +0000</pubDate>
		<dc:creator>Juju</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[VLC]]></category>
		<category><![CDATA[developpement]]></category>
		<category><![CDATA[geek style]]></category>

		<guid isPermaLink="false">http://blog.revolunet.com/index.php/developpement/mise-a-jour-de-vlccontrols</guid>
		<description><![CDATA[VLCcontrols est une librairie Javascript qui vous permet d&#8217;intégrer le fameux lecteur VLC dans vos pages web et de profiter de toute sa puissance. De nouvelles fonctions ont été ajoutées : possibilité d&#8217;intégrer des sous titres (locaux ou distants), de transcoder/streamer ou enregistrer le flux en cours de lecture sur votre disque dur, tout cela [...]]]></description>
			<content:encoded><![CDATA[<p>VLCcontrols est une librairie Javascript qui vous permet d&#8217;intégrer le fameux lecteur VLC dans vos pages web et de profiter de toute sa puissance. De nouvelles fonctions ont été ajoutées : possibilité d&#8217;intégrer des sous titres (locaux ou distants), de transcoder/streamer ou enregistrer le flux en cours de lecture sur votre disque dur, tout cela depuis une page web.</p>
<p>VLCcontrols is javascript library that allows you to embed the powerful VLC plugin in any webpage; New features have beed added today : you can now embed subtitles (local or remote), transcode and save or stream your contents as if you were in VLC, but from your webpage.</p>
<p>VLCcontrols home : <a href="http://code.revolunet.com/VLCcontrols">http://code.revolunet.com/VLCcontrols</a></p>
<p>VLCcontrols advanced features demo : <a href="http://code.revolunet.com/VLCcontrols/VLCcontrols/advanced.html">http://code.revolunet.com/VLCcontrols/VLCcontrols/advanced.html</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.revolunet.com/index.php/developpement/mise-a-jour-de-vlccontrols/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Google AppEngine revolutionne le développement web</title>
		<link>http://blog.revolunet.com/index.php/general/google-revolutionne-le-developpement-web</link>
		<comments>http://blog.revolunet.com/index.php/general/google-revolutionne-le-developpement-web#comments</comments>
		<pubDate>Thu, 10 Apr 2008 09:35:18 +0000</pubDate>
		<dc:creator>Juju</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[actu informatique]]></category>
		<category><![CDATA[developpement]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://blog.revolunet.com/index.php/general/google-revolutionne-le-developpement-web</guid>
		<description><![CDATA[Durant ces 10 dernières années, Google a révolutionné la recherche, le e-marketing, la cartographie et bien d&#8217;autres services à destination des usagers. Depuis quelques temps, Google s&#8217;est aussi investit dans l&#8217;open source, notamment grâce à code.google.com qui propose de nombreuses librairies open source pour les développeurs, ainsi que des espaces gratuits de gestion de projets a [...]]]></description>
			<content:encoded><![CDATA[<p>Durant ces 10 dernières années, Google a révolutionné la recherche, le e-marketing, la cartographie et bien d&#8217;autres services à destination des usagers. Depuis quelques temps, Google s&#8217;est aussi investit dans l&#8217;open source, notamment grâce à <a target="_blank" href="http://code.google.com">code.google.com</a> qui propose de nombreuses librairies open source pour les développeurs, ainsi que des espaces gratuits de gestion de projets a la <a target="_blank" href="http://www.sourceforge.net">sourceforge</a>.</p>
<p>Aujourd&#8217;hui, Google lance <a target="_blank" href="http://code.google.com/appengine">Google AppEngine</a>, un service à destination des développeurs web, qui va leur faciliter grandement le développement d&#8217;applications web, en leur permettant de se concentrer sur la partie la plus fun de leur metier : le code lui-même. Et tout cela gratuitement (pour l&#8217;instant).</p>
<p>Google AppEngine est en effet un framework qui permet d&#8217;écrire très facilement des applications en Python, sans se soucier ni de la base de données, ni de l&#8217;hebergement, ni de l&#8217;administration système, ni des sauvegardes. Pour ceux qui ne connaissent pas bien Python c&#8217;est un langage très haut niveau, très lisible, très logique, et <a target="_blank" href="http://mail.python.org/pipermail/python-dev/2004-April/044002.html">très performant</a>; Google l&#8217;utilise à de nombreux niveaux de son architecture et a d&#8217;ailleurs <a target="_blank" href="http://blog.revolunet.com/index.php/general/guido-van-rossum-embauche-par-google">embauché son créateur le fameux Guido Von Rossum</a> en 2005. Concrètement, vous définissez vos modèles de données, vos templates graphiques et votre code métier (facon <a target="_blank" href="http://fr.wikipedia.org/wiki/Mod%C3%A8le-Vue-Contr%C3%B4leur">MVC</a>), puis publiez très simplement votre projet directement sur la plate forme Google. Vous avez alors la puissance de Google entre vos doigts, et disposez d&#8217;une extraordinaire flexibilité et extensibilité de votre application, le tout de facon 100% transparente. Votre application est hebergée chez Google, et vos données reparties sur de nombreux serveurs à travers le monde ce qui vous garantit une haute disponibilité et de hautes performances quel que soit le volume de vos données et le traffic que vous générez.</p>
<p>Techniquement, Google vous propose un <a target="_blank" href="http://code.google.com/appengine/downloads.html">SDK</a> (dispo sur Windows, Mac, Linux) qui vous installe un environnement de développement similaire à la version en ligne de AppEngine . Ce framework est open source et basé sur le célèbre framework web en python <a target="_blank" href="http://www.djangoproject.com">Django</a> (Templates, DataModels&#8230;), <a target="_blank" href="http://pythonpaste.org/webob">Webob</a> (Modele objet request/response) et sur plusieurs API fournies par Google pour nous faciliter la vie : <a target="_blank" href="http://code.google.com/appengine/docs/datastore/">Datastore API</a> pour la base de données (basé sur la technologie BigTable de Google), <a target="_blank" href="http://code.google.com/appengine/docs/users/">Users API</a> pour la gestion des utilisateurs et <a target="_blank" href="http://code.google.com/appengine/docs/">autres joyeusetés</a>&#8230; Bien sûr vous pouvez ajouter toutes les librairies Python que vous souhaitez à votre projet.</p>
<p>Ce service n&#8217;est pas destiné aux applications professionnelles car vous êtes trop dépendant de Google et n&#8217;avez aucun contrôle sur de nombreux points (notamment la base de données ou les librairies bas niveau disponibles) mais ce service va certainement faciliter le développement de nombreuses applications web, sociales (ou pas), web 2.0 (ou pas). Ma grand mere va peut etre enfin pouvoir coder l&#8217;application web de bridge dont elle rève depuis toujours et que je n&#8217;ai jamais eu le temps de faire pour son Noël ;)</p>
<p>Le service est encore en beta, pas encore ouvert au quidam pendant une phase de tests de plusieurs mois mais on peut d&#8217;ores et deja installer le SDK et tester la plateforme en local pour faire joujou. Et on s&#8217;amuse. A terme Google proposera surement à la maniere <a href="http://aws.amazon.com/s3">d&#8217;Amazon S3</a> de la location de ressources si vous avez besoin de plus de ressources que ce qui vous est offert.</p>
<p>Démonstrations videos : <a href="http://youtube.com/watch?v=tcbpTQXNwac">http://youtube.com/watch?v=tcbpTQXNwac</a></p>
<p>Le SDK : <a href="http://code.google.com/appengine/downloads.html">http://code.google.com/appengine/downloads.html</a></p>
<p>La Documentation : <a href="http://code.google.com/appengine/docs/">http://code.google.com/appengine/docs/</a></p>
<p>Le groupe de discussion : <a href="http://groups.google.com/group/google-appengine?lnk=sg">http://groups.google.com/group/google-appengine?lnk=sg</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.revolunet.com/index.php/general/google-revolutionne-le-developpement-web/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>VLC 0.8.6e est sorti</title>
		<link>http://blog.revolunet.com/index.php/actu-informatique/vlc-086e-est-sorti</link>
		<comments>http://blog.revolunet.com/index.php/actu-informatique/vlc-086e-est-sorti#comments</comments>
		<pubDate>Thu, 28 Feb 2008 11:02:57 +0000</pubDate>
		<dc:creator>Juju</dc:creator>
				<category><![CDATA[VLC]]></category>
		<category><![CDATA[actu informatique]]></category>
		<category><![CDATA[developpement]]></category>
		<category><![CDATA[hack]]></category>

		<guid isPermaLink="false">http://blog.revolunet.com/index.php/actu-informatique/vlc-086e-est-sorti</guid>
		<description><![CDATA[Une nouvelle version de VLC est disponible sur le site de videolan.org.
Cette mise a jour corrige plusieurs failles de sécurité importantes, et corrige également des bugs dans l&#8217;encodage h264. Vous allez donc enfin pouvoir encoder en mpeg-4 sous windows pour, entre autre, votre iPhone  
Le changelog complet ici : http://trac.videolan.org/vlc/browser/tags/0.8.6e/NEWS
Mettez vite a jour pour [...]]]></description>
			<content:encoded><![CDATA[<p>Une nouvelle version de VLC est disponible sur le site de <a target="_blank" href="http://www.videolan.org/vlc/">videolan.org</a>.</p>
<p>Cette mise a jour corrige plusieurs failles de sécurité importantes, et corrige également des bugs dans l&#8217;encodage h264. Vous allez donc enfin pouvoir encoder en mpeg-4 sous windows pour, entre autre, votre iPhone <img src='http://blog.revolunet.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Le changelog complet ici : <a href="http://trac.videolan.org/vlc/browser/tags/0.8.6e/NEWS">http://trac.videolan.org/vlc/browser/tags/0.8.6e/NEWS</a></p>
<p>Mettez vite a jour pour éviter tout probleme de sécurité. Merci à la <a target="_blank" href="http://wiki.videolan.org/VideoLAN_Team">team VLC</a> !</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.revolunet.com/index.php/actu-informatique/vlc-086e-est-sorti/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>VLCobject, VLC dans votre page web</title>
		<link>http://blog.revolunet.com/index.php/general/vlcobject-vlc-dans-votre-page-web</link>
		<comments>http://blog.revolunet.com/index.php/general/vlcobject-vlc-dans-votre-page-web#comments</comments>
		<pubDate>Fri, 25 Jan 2008 11:44:10 +0000</pubDate>
		<dc:creator>Juju</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[Javascript]]></category>
		<category><![CDATA[VLC]]></category>
		<category><![CDATA[developpement]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://blog.revolunet.com/index.php/general/vlcobject-vlc-dans-votre-page-web</guid>
		<description><![CDATA[Je viens de publier une petite librairie javascript largement inspirée de swfobject et qui vous permet d&#8217;intégrer facilement le  plugin VLC dans vos pages WEB. Le plugin est chargé en pur javascript et si l&#8217;utilisateur n&#8217;a pas de plugin VLC installé, un message lui indiquant un lien de téléchargement lui est indiqué.
Ca s&#8217;appelle VLCobject et c&#8217;est dispo [...]]]></description>
			<content:encoded><![CDATA[<p>Je viens de publier une petite librairie javascript largement inspirée de <a href="http://blog.deconcept.com/swfobject/" target="_blank">swfobject</a> et qui vous permet d&#8217;intégrer facilement le  plugin VLC dans vos pages WEB. Le plugin est chargé en pur javascript et si l&#8217;utilisateur n&#8217;a pas de plugin VLC installé, un message lui indiquant un lien de téléchargement lui est indiqué.</p>
<p>Ca s&#8217;appelle VLCobject et c&#8217;est dispo ici : <a href="http://code.revolunet.com/VLCobject/FR">http://code.revolunet.com/VLCobject/FR</a></p>
<p>Pour ajouter les boutons Play, Pause, Stop, Volume, Seekbar&#8230; regardez du coté de la librairie <a href="http://code.revolunet.com/VLCcontrols/FR">VLCcontrols</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.revolunet.com/index.php/general/vlcobject-vlc-dans-votre-page-web/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>
