<?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>Web, je vous dis web</title>
	<atom:link href="http://blog.o2sources.com/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.o2sources.com</link>
	<description>le blog d'O2Sources</description>
	<lastBuildDate>Thu, 04 Feb 2010 10:17:01 +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>Une image avec des angles arrondis</title>
		<link>http://blog.o2sources.com/2010/02/04/une-image-avec-des-angles-arrondis.html</link>
		<comments>http://blog.o2sources.com/2010/02/04/une-image-avec-des-angles-arrondis.html#comments</comments>
		<pubDate>Thu, 04 Feb 2010 10:13:18 +0000</pubDate>
		<dc:creator>Floriane</dc:creator>
				<category><![CDATA[Design]]></category>

		<guid isPermaLink="false">http://blog.o2sources.com/?p=541</guid>
		<description><![CDATA[Bienvenue sur le premier tutoriel de la Source dédicacé tout spécialement à Jean-Sébastien et à Thanh  
Etape # 01

Ouvrez Photoshop, le meilleur ami des designers puis ouvrez votre image.
Etape # 02

Sélectionnez l&#8217;outil &#171;&#160;rectangle arrondi&#160;&#187; sur votre barre d&#8217;outils et créer votre rectangle par dessus votre photo.
Etape # 03

L&#8217;image est en &#171;&#160;arrière plan&#160;&#187;, double cliquer [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: left;">Bienvenue sur le premier tutoriel de la Source dédicacé tout spécialement à Jean-Sébastien et à Thanh <img src='http://blog.o2sources.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<h3 style="text-align: left;"><strong>Etape # 01</strong></h3>
<p style="text-align: center;"><img class="aligncenter size-full wp-image-544" title="ouverture" src="http://blog.o2sources.com/wp-content/uploads/2010/02/ouverture1.jpg" alt="ouverture" width="446" height="360" /></p>
<p style="text-align: center;">Ouvrez Photoshop, le meilleur ami des designers puis ouvrez votre image.</p>
<h3 style="text-align: left;"><strong>Etape # 02</strong></h3>
<p style="text-align: center;"><img class="aligncenter size-full wp-image-547" title="rec-arrondi" src="http://blog.o2sources.com/wp-content/uploads/2010/02/rec-arrondi.jpg" alt="rec-arrondi" width="495" height="400" /></p>
<p style="text-align: center;">Sélectionnez l&#8217;outil &laquo;&nbsp;rectangle arrondi&nbsp;&raquo; sur votre barre d&#8217;outils et créer votre rectangle par dessus votre photo.</p>
<h3 style="text-align: left;"><strong>Etape # 03</strong></h3>
<p style="text-align: center;"><img class="aligncenter size-full wp-image-552" title="position-calque" src="http://blog.o2sources.com/wp-content/uploads/2010/02/position-calque1.jpg" alt="position-calque" width="533" height="286" /></p>
<p style="text-align: center;">L&#8217;image est en &laquo;&nbsp;arrière plan&nbsp;&raquo;, double cliquer sur le calque pour la déverrouiller. Ensuite déplacez le calque avec le rectangle en dessous de votre image.</p>
<p style="text-align: center;">
<h3 style="text-align: left;"><strong>Etape # 04</strong></h3>
<p style="text-align: center;"><img class="aligncenter size-full wp-image-553" title="masque" src="http://blog.o2sources.com/wp-content/uploads/2010/02/masque.jpg" alt="masque" width="495" height="400" /></p>
<p style="text-align: center;">
<p style="text-align: center;">Dans la fenêtre des calques, positionnez vous sur le calque de l&#8217;image, faire un &laquo;&nbsp;clic droit&nbsp;&raquo; et sélectionner &laquo;&nbsp;créer un masque d&#8217; écrêtage&nbsp;&raquo;.</p>
<p style="text-align: center;">***********<br />
Un autre moyen d&#8217;arriver au même résultat est de positionner le curseur de la souris entre les deux calques, d&#8217;appuyer sur la touche &laquo;&nbsp;alt&nbsp;&raquo; (un symbole avec deux ronds et une flèche apparait) et de cliquer.</p>
<h3 style="text-align: left;">Etape # 05</h3>
<p style="text-align: center;"><img class="aligncenter size-full wp-image-554" title="resultat" src="http://blog.o2sources.com/wp-content/uploads/2010/02/resultat.jpg" alt="resultat" width="495" height="400" />Et voilà le travail ! Vous avez une magnifique image avec des jolis angles ronds et ça ne vous a prit que 2 minutes !</p>
<p style="text-align: center;"><strong>***********<br />
Photoshop étant un outil formidable, il y a bien sûre d&#8217;autres manières de faire. Alexandra par exemple utilise le système des &laquo;&nbsp;<span style="text-decoration: underline;">masques de fusion</span>&laquo;&nbsp;.</strong></p>
<p style="text-align: center;"><strong>***********</strong></p>
<h3 style="text-align: left;">Etape #01</h3>
<p style="text-align: center;">Ouverture de votre image. Je vous fais grâce de la capture d&#8217;écran. <img src='http://blog.o2sources.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<h3 style="text-align: left;">Etape # 02</h3>
<p style="text-align: center;"><img class="aligncenter size-full wp-image-555" title="Etape02" src="http://blog.o2sources.com/wp-content/uploads/2010/02/Etape02.jpg" alt="Etape02" width="519" height="48" /></p>
<p style="text-align: center;"><img class="aligncenter size-full wp-image-556" title="Etape02bis" src="http://blog.o2sources.com/wp-content/uploads/2010/02/Etape02bis.jpg" alt="Etape02bis" width="462" height="282" /></p>
<p style="text-align: center;">Vous allez répéter quasiment la même opération que l&#8217;étape # 02 précédente à un détail près.<br />
Dans la barre horizontale, sélectionner la forme vectorielle avec la plume au centre. Ainsi, vous obtiendrez seulement le tracé de votre rectangle arrondi.</p>
<p style="text-align: center;">
<h3 style="text-align: left;">Etape # 03</h3>
<p style="text-align: center;"><img class="aligncenter size-full wp-image-557" title="definirselection01" src="http://blog.o2sources.com/wp-content/uploads/2010/02/definirselection01.jpg" alt="definirselection01" width="462" height="282" /></p>
<p style="text-align: center;">&laquo;&nbsp;Clic droit&nbsp;&raquo; sur l&#8217;image et sélectionner &laquo;&nbsp;définir une sélection&nbsp;&raquo;.</p>
<p style="text-align: center;"><img class="aligncenter size-full wp-image-558" title="definirselection02" src="http://blog.o2sources.com/wp-content/uploads/2010/02/definirselection02.jpg" alt="definirselection02" width="462" height="282" /></p>
<p style="text-align: center;">Sélectionner les options telles qu&#8217;affichées sur la capture et valider.</p>
<p style="text-align: center;"><img class="aligncenter size-full wp-image-559" title="definirselection03" src="http://blog.o2sources.com/wp-content/uploads/2010/02/definirselection03.jpg" alt="definirselection03" width="462" height="282" /></p>
<p style="text-align: center;">Résultat : vous avez une sélection et toujours un seul et unique calque.</p>
<p style="text-align: center;">
<h3 style="text-align: left;">Etape # 04</h3>
<p style="text-align: center;"><img class="size-full wp-image-560 alignnone" title="masque" src="http://blog.o2sources.com/wp-content/uploads/2010/02/masque1.jpg" alt="masque" width="370" height="248" /></p>
<p style="text-align: center;">Dans votre barre d&#8217;outils, vérifier que le noir est au dessus du blanc, puis en bas du bloc des calques, cliquez sur &laquo;&nbsp;ajouter un masque vectorielle&nbsp;&raquo;.</p>
<h3 style="text-align: left;">Etape # 05</h3>
<p style="text-align: center;"><img class="aligncenter size-full wp-image-561" title="final02" src="http://blog.o2sources.com/wp-content/uploads/2010/02/final02.jpg" alt="final02" width="462" height="282" /></p>
<p style="text-align: center;">Résultat : Tout pareil que ci-dessus, une belle image aux angles arrondis !</p>
<p style="text-align: center;">
<p style="text-align: center;"><strong>***********<br />
That&#8217;s all folks !</strong></p>
<p style="text-align: center;"><strong>***********</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.o2sources.com/2010/02/04/une-image-avec-des-angles-arrondis.html/feed</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Meilleurs voeux 2010</title>
		<link>http://blog.o2sources.com/2010/01/11/meilleurs-voeux-2010.html</link>
		<comments>http://blog.o2sources.com/2010/01/11/meilleurs-voeux-2010.html#comments</comments>
		<pubDate>Mon, 11 Jan 2010 06:30:40 +0000</pubDate>
		<dc:creator>Xuan</dc:creator>
				<category><![CDATA[Communication]]></category>
		<category><![CDATA[O2Sources]]></category>
		<category><![CDATA[2010]]></category>
		<category><![CDATA[Cartes de voeux]]></category>
		<category><![CDATA[Collage]]></category>
		<category><![CDATA[Impression]]></category>
		<category><![CDATA[Nouvel année]]></category>
		<category><![CDATA[PDF]]></category>
		<category><![CDATA[Pliage]]></category>
		<category><![CDATA[Poupée]]></category>
		<category><![CDATA[Téléchargement]]></category>

		<guid isPermaLink="false">http://blog.o2sources.com/?p=528</guid>
		<description><![CDATA[
Avec une dizaine de jours de retard, toute l&#8217;équipe d&#8217;O2Sources vous souhaite ses meilleurs voeux pour cette nouvelle année  .
Pour vous accompagner en cette année 2010, vous pourrez choisir de télécharger un des membres de l&#8217;équipe, et avec un peu d&#8217;habilité (et aussi de ciseaux et de colle), nous serons toujours à vos côtés [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.o2sources.com/mailing/1001_voeux/" title="Cliquez pour voir la carte de voeux"><img src="http://www.o2sources.com/mailing/1001_voeux/photo.png" alt="" /></a></p>
<p>Avec une dizaine de jours de retard, toute l&#8217;équipe d&#8217;O2Sources vous souhaite ses meilleurs voeux pour cette nouvelle année <img src='http://blog.o2sources.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .</p>
<p>Pour vous accompagner en cette année 2010, vous pourrez choisir de <a href="http://www.o2sources.com/mailing/1001_voeux/">télécharger un des membres de l&#8217;équipe</a>, et avec un peu d&#8217;habilité (et aussi de ciseaux et de colle), nous serons toujours à vos côtés sur un coin de votre bureau (ou pas).</p>
<p>Et comme disait l&#8217;autre, soyez gentil de ne pas tenter de magie voudou quand même u_u.</p>
<p><img src="http://www.o2sources.com/mailing/1001_voeux/th/IMG_8160.jpg" alt="Aperçu des maquettes #1" /></p>
<p><img src="http://www.o2sources.com/mailing/1001_voeux/th/IMG_8171.jpg" alt="Aperçu des maquettes #2" /></p>
<p><img src="http://www.o2sources.com/mailing/1001_voeux/th/IMG_8176.jpg" alt="Aperçu des maquettes #3" /></p>
<p><img src="http://www.o2sources.com/mailing/1001_voeux/th/IMG_8182.jpg" alt="Aperçu des maquettes #4" /></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.o2sources.com/2010/01/11/meilleurs-voeux-2010.html/feed</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Géolocaliser des utilisateurs sur l&#8217;IP en Python</title>
		<link>http://blog.o2sources.com/2009/10/14/geolocaliser-des-utilisateurs-sur-lip-en-python.html</link>
		<comments>http://blog.o2sources.com/2009/10/14/geolocaliser-des-utilisateurs-sur-lip-en-python.html#comments</comments>
		<pubDate>Wed, 14 Oct 2009 13:43:28 +0000</pubDate>
		<dc:creator>Damien</dc:creator>
				<category><![CDATA[développement]]></category>
		<category><![CDATA[django]]></category>
		<category><![CDATA[geolite]]></category>
		<category><![CDATA[geolocalisation]]></category>
		<category><![CDATA[google maps]]></category>
		<category><![CDATA[maxmind]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://blog.o2sources.com/?p=520</guid>
		<description><![CDATA[Depuis quelques temps, plusieurs clients nous demandent de pouvoir géolocaliser leurs visiteurs de manière plus ou moins précise.
La plupart du temps, leur but est simplement d&#8217;afficher une carte centrée sur la localisation (approximative) de l&#8217;utilisateur.
Pour mener cela à bien, nous avons décidé d&#8217;utiliser Geolite Country.
Celui-ci permet de géolocaliser l&#8217;utilisateur en fonction de son ip sur [...]]]></description>
			<content:encoded><![CDATA[<p>Depuis quelques temps, plusieurs clients nous demandent de pouvoir géolocaliser leurs visiteurs de manière plus ou moins précise.<br />
La plupart du temps, leur but est simplement d&#8217;afficher une carte centrée sur la localisation (approximative) de l&#8217;utilisateur.</p>
<p>Pour mener cela à bien, nous avons décidé d&#8217;utiliser <a href="http://www.maxmind.com/app/geolitecountry">Geolite Country</a>.<br />
Celui-ci permet de géolocaliser l&#8217;utilisateur en fonction de son ip sur la base du Pays. Pour une recherche plus affinée, les services sont payants. Mais le client désire uniquement centrer sur le pays de l&#8217;utilisateur. L&#8217;offre gratuite est donc amplement suffisante.</p>
<p>L&#8217;application étant en Python et ayant décidé d&#8217;utiliser la base binaire, j&#8217;ai donc installé la librairie <a href="http://code.google.com/p/pygeoip/">pygeoip</a>.<br />
Son utilisation est particulièrement simple.</p>
<pre class="brush: python;">gmaps = urllib.urlopen('http://maps.google.com/maps/geo?q=%s&amp;output=csv' % urllib.quote(country)).read().rsplit(',')</pre>
<p>Le fichier GeoIP.dat est la base de données binaire, accessible sur GeoLite via ce <a href="http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz">lien direct</a>.<br />
Ainsi notre variable &laquo;&nbsp;country&nbsp;&raquo; est un string contenant le nom du pays. Ici &laquo;&nbsp;France&nbsp;&raquo;.</p>
<p>Il faut par la suite obtenir la latitude et la longitude de ce pays. Pour cela, <a href="http://code.google.com/apis/maps/">Google Maps API</a> est particulièrement utile.</p>
<pre class="brush: python;">gi = pygeoip.GeoIP('lib/GeoIP.dat')&lt;br /&gt;
country = gi.country_name_by_name('o2sources.com')</pre>
<p>Notre variable &laquo;&nbsp;gmaps&nbsp;&raquo; contiendra ainsi un tableau pour lequel les deux derniers éléments sont respectivement la latitude et la longitude.<br />
Il n&#8217;y a plus qu&#8217;à afficher notre carte Google Maps centrée sur des données <img src='http://blog.o2sources.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Et puisque du code sans son contexte est d&#8217;une utilité moyenne, voici la vue permettant d&#8217;obtenir ces données</p>
<pre class="brush: python;">from django.shortcuts import render_to_response
from django.template import RequestContext

import pygeoip
import urllib

def home(request):
  gi = pygeoip.GeoIP('lib/GeoIP.dat')
  country = gi.country_name_by_name(request.META['REMOTE_ADDR'])
  gmaps = urllib.urlopen('http://maps.google.com/maps/geo?q=%s&amp;output=csv' % urllib.quote(country)).read().rsplit(',')
  return render_to_response('centers/home.html', { 'country': country, 'latitude': gmaps[2], 'longitude': gmaps[3] }, context_instance=RequestContext(request))</pre>
<p>Et dans notre template nous n&#8217;avons plus qu&#8217;à traiter ces données comme nous le désirons. Dans mon cas en affichant une carte Google Maps.<br />
Mais vos besoins peuvent varier et les possibilitées sont quasiment illimitées.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.o2sources.com/2009/10/14/geolocaliser-des-utilisateurs-sur-lip-en-python.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>A Loft story&#8230;</title>
		<link>http://blog.o2sources.com/2009/10/05/a-loft-story.html</link>
		<comments>http://blog.o2sources.com/2009/10/05/a-loft-story.html#comments</comments>
		<pubDate>Mon, 05 Oct 2009 09:52:01 +0000</pubDate>
		<dc:creator>Floriane</dc:creator>
				<category><![CDATA[Communication]]></category>
		<category><![CDATA[Design]]></category>
		<category><![CDATA[Focus]]></category>
		<category><![CDATA[O2Sources]]></category>
		<category><![CDATA[Portfolio]]></category>
		<category><![CDATA[Chambre d’hôte]]></category>
		<category><![CDATA[Lyon]]></category>
		<category><![CDATA[PME]]></category>
		<category><![CDATA[Webdesign]]></category>

		<guid isPermaLink="false">http://blog.o2sources.com/?p=505</guid>
		<description><![CDATA[Si Thérèse affirme que ses visiteurs prendront autant de plaisir à séjourner dans ses chambres d&#8217;hôtes qu&#8217;elle en a eu à les concevoir pour eux, de notre côté, à la Source, nous espérons sincèrement que ce plaisir sera équivalent à celui que nous avons eu à concevoir ce site.
Les petits doigts de fée des O2sourciens [...]]]></description>
			<content:encoded><![CDATA[<p>Si Thérèse affirme que ses visiteurs prendront autant de plaisir à séjourner dans ses <a href="http://www.evasion-loft.com/chambres.php">chambres d&#8217;hôtes</a> qu&#8217;elle en a eu à les concevoir pour eux, de notre côté, à la Source, nous espérons sincèrement que ce plaisir sera équivalent à celui que nous avons eu à concevoir ce site.<br />
Les petits doigts de fée des O2sourciens se sont activés autour de ce projet pour donner naissance à <a href="http://www.evasion-loft.com/">evasion-loft</a> un site dans lequel vous naviguerez en vous sentant  un peu comme si vous  étiez déjà dans ce cocon spacieux et design <a href="http://www.evasion-loft.com/acces.php">au cœur du 6eme arrondissement de Lyon</a>.</p>
<p>Toute l&#8217;équipe est très heureuse de la mise en ligne de ce dernier bébé et nous souhaitons beaucoup de succès à l&#8217; hôte des futurs &laquo;&nbsp;lofteurs&nbsp;&raquo;.</p>
<p><a href="http://www.evasion-loft.com/"><img class="aligncenter size-large wp-image-516" title="loft" src="http://blog.o2sources.com/wp-content/uploads/2009/10/loft2-1024x226.png" alt="Evasion Loft, chambre d'hôte à Lyon" width="585" height="129" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.o2sources.com/2009/10/05/a-loft-story.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Paris Web : nous y serons</title>
		<link>http://blog.o2sources.com/2009/09/14/paris-web-nous-y-serons.html</link>
		<comments>http://blog.o2sources.com/2009/09/14/paris-web-nous-y-serons.html#comments</comments>
		<pubDate>Mon, 14 Sep 2009 09:37:44 +0000</pubDate>
		<dc:creator>Damien</dc:creator>
				<category><![CDATA[Non classé]]></category>

		<guid isPermaLink="false">http://blog.o2sources.com/?p=497</guid>
		<description><![CDATA[Thanh annonçait en mai dernier les dates de Paris Web 2009.
Et les 8, 9 et 10 octobre ça arrive rapidement.
Nous serons donc bien présent à Paris Web. Et pas seulement pour assister à l&#8217;évènement.
En effet Florent fera une intervention Webdesign et qualité en compagnie de Benjamin de Cock.
Quant à moi j&#8217;animerai un atelier Test automatisé [...]]]></description>
			<content:encoded><![CDATA[<p>Thanh annonçait en mai dernier les <a href="http://blog.o2sources.com/2009/05/07/paris-web-2009-les-dates-et-lieux-sont-connues.html">dates de Paris Web 2009</a>.<br />
Et les <strong>8, 9 et 10 octobre</strong> ça arrive rapidement.</p>
<p>Nous serons donc bien présent à Paris Web. Et pas seulement pour assister à l&#8217;évènement.<br />
En effet <a href="http://www.o2sources.com/people/florent">Florent</a> fera une intervention <a href="http://www.paris-web.fr/2009/+-Verschelde-+">Webdesign et qualité</a> en compagnie de Benjamin de Cock.</p>
<p>Quant à <a href="http://www.o2sources.com/people/damien">moi</a> j&#8217;animerai un atelier <a href="http://www.paris-web.fr/2009/+-Mathieu-+">Test automatisé d’applications JavaScript avec Qunit et Selenium</a>.</p>
<p>Thanh sera également présent probablement derrière un objectif d&#8217;appareil photo.<br />
Alors nous vous attendons à Paris début octobre !</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.o2sources.com/2009/09/14/paris-web-nous-y-serons.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Déployer une application Django avec Capistrano</title>
		<link>http://blog.o2sources.com/2009/08/26/deployer-une-application-django-avec-capistrano.html</link>
		<comments>http://blog.o2sources.com/2009/08/26/deployer-une-application-django-avec-capistrano.html#comments</comments>
		<pubDate>Wed, 26 Aug 2009 10:03:45 +0000</pubDate>
		<dc:creator>Damien</dc:creator>
				<category><![CDATA[développement]]></category>
		<category><![CDATA[agile]]></category>
		<category><![CDATA[capistrano]]></category>
		<category><![CDATA[déploiement]]></category>
		<category><![CDATA[django]]></category>
		<category><![CDATA[dry]]></category>
		<category><![CDATA[optimisation]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://blog.o2sources.com/?p=491</guid>
		<description><![CDATA[Chez O2Sources on aime tout ce qui permet d&#8217;améliorer la productivité. Et si en prime ça permet d&#8217;éviter des erreurs, on adore !
Malheureusement jusqu&#8217;à maintenant, nous déployions toutes nos applications &#171;&#160;à la main&#160;&#187;, en FTP.
Mais grâce à Capistrano, nous remédions maintenant à cela en automatisant le déploiement de nos applications, afin de gagner du temps [...]]]></description>
			<content:encoded><![CDATA[<p>Chez O2Sources on aime tout ce qui permet d&#8217;améliorer la productivité. Et si en prime ça permet d&#8217;éviter des erreurs, on adore !<br />
Malheureusement jusqu&#8217;à maintenant, nous déployions toutes nos applications &laquo;&nbsp;à la main&nbsp;&raquo;, en FTP.<br />
Mais grâce à <a href="http://capify.org">Capistrano</a>, nous remédions maintenant à cela en automatisant le déploiement de nos applications, afin de gagner du temps et surtout, d&#8217;éviter les erreurs ou les oublis.</p>
<p>Capistrano est un outil permettant d&#8217;automatiser le déploiement des applications développé en Ruby.<br />
Mais il est utilisable avec toutes vos applications. Qu&#8217;elles soient développées en Ruby, en PHP, en Python et même, si vous êtes un peu fou, en Java.<br />
Dans l&#8217;exemple que je vais donner ci-dessous, l&#8217;application est développée en Python avec Django. Et nous avions une problématique majeure : nous désirons pouvoir déployer sur le serveur de développement et/ou sur le serveur de production sans avoir deux tâches différentes (afin d&#8217;être DRY évidemment).</p>
<p>Dans un dossier nommé <em>deployment</em> à la base de notre application, j&#8217;ai créé deux fichiers.<br />
<strong>deploy</strong><br />
Il s&#8217;agit d&#8217;un script bash, qui permettra d&#8217;exécuter le processus sans avoir à taper &laquo;&nbsp;cap &#8230;&nbsp;&raquo;.<br />
En voici le contenu.<br />
<code>#!/bin/bash<br />
ENV=$1 cap deploy -f deployment/deploy.rb</code></p>
<p>Vous pouvez noter que avant d&#8217;exécuter le script, je définis une variable d&#8217;environnement à la valeur du premier argument passé en paramètres.<br />
Cela nous permettra de choisir si nous désirons pousser en développement ou en production.</p>
<p>Puis un fichier <strong>deploy.rb</strong>.<br />
Vous pouvez en <a href="http://gist.github.com/175416">voir le contenu complet</a>. Mais je vais également le détailler dans la suite de cet article.</p>
<p>Nous définissons plusieurs valeurs de configuration.<br />
<code>set :deploy_to, {'dev' => '/chemin/vers/le/site/en/developpement', 'prod' => '/chemin/vers/le/site/en/production'}<br />
set :domain, {'dev' => 'host.developpement', 'prod' => 'host.production'}</code></p>
<p>La première variable contient le chemin de notre application, en développement et en production.<br />
Le second contient les hosts de nos serveurs de développement et de production.</p>
<p>Puis nous définissons le serveur sur lequel nous voulons déployer.<br />
<code>ENV['ENV'] = 'dev' if domain[ENV['ENV']].nil?<br />
role :web, domain[ENV['ENV']], :master => true</code></p>
<p>Si le paramètre &laquo;&nbsp;ENV&nbsp;&raquo; est à la valeur &laquo;&nbsp;prod&nbsp;&raquo;, nous déployons en production. Sinon, nous déployons en développement.</p>
<p>Ainsi pour déployer en développement, vous n&#8217;aurez qu&#8217;à appeller votre script bash :<br />
<code>deployment/deploy</code><br />
Et en production, il faudra préciser le paramètre.<br />
<code>deployment/deploy prod</code></p>
<p>Notre tâche capistrano contient ensuite les directives de déploiement.<br />
La tâche deploy:default est appellée automatiquement. Elle fait un svn update, mettant ainsi à jour les fichiers de l&#8217;application.<br />
<code>desc "Updating the repository files in " + ENV['ENV'] + " environment"<br />
task :default do<br />
&nbsp;&nbsp;stream "cd #{deploy_to[ENV['ENV']]}; svn update"<br />
end</code></p>
<p>Nous avons ensuite une seconde tâche qui supprime tous les fichiers .pyc de notre application, afin d&#8217;éviter un quelconque problème de cache avec ceux-ci (ils sont générés automatiquement par Python).<br />
<code>desc "Remove *.pyc files"<br />
task :delpyc do<br />
&nbsp;&nbsp;stream 'cd ' + deploy_to[ENV['ENV']] + ';find . -type f -name "*.pyc" -exec rm -fv {} \;'<br />
end</code></p>
<p>Puis nous mettons à jour la base de données de notre application en faisant un syncdb.<br />
<code>desc "Make sure database is in sync with models"<br />
task :syncdb do<br />
&nbsp;&nbsp;stream "cd #{deploy_to[ENV['ENV']]}; python manage.py syncdb"<br />
end</code></p>
<p>Et enfin, puisque c&#8217;est un projet Django, il faut, afin que les modifications soient prises en compte, recharger Apache.<br />
<code>desc "We reload apache"<br />
task :restart do<br />
&nbsp;&nbsp;stream "/etc/init.d/apache2 reload"<br />
end</code></p>
<p>Nous avons maintenant défini nos tâches. Et comme dit précédemment, la tâche default est exécutée automatiquement.<br />
Mais il faut tout de même définir l&#8217;ordre d&#8217;exécution des tâches. C&#8217;est la que viennent les instructions &laquo;&nbsp;after&nbsp;&raquo;.<br />
<code>after 'deploy', 'deploy:delpyc'<br />
after 'deploy:delpyc', 'deploy:syncdb'<br />
after 'deploy:syncdb', 'deploy:restart'</code></p>
<p>Notre tâche Capistrano fera donc, dans l&#8217;ordre :</p>
<ol>
<li>Un SVN update afin de récupérer la dernière version du projet</li>
<li>Une suppression de tous les fichiers .pyc</li>
<li>Une remise à jour de la base de données</li>
<li>Un rechargement du serveur</li>
</ol>
<p>Pour rappel, vous pouvez <a href="http://gist.github.com/175416">voir la tâche complète et colorisée sur github</a>.</p>
<p>Votre application est à jour. Ici, ça prends 2 minutes chrono. Et on est sur que ça fonctionne (et si ça ne fonctionne pas quand même, cela nous prévient) <img src='http://blog.o2sources.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /><br />
Et vous, vous déployez vos applications comment ?</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.o2sources.com/2009/08/26/deployer-une-application-django-avec-capistrano.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Browser War : Trailer</title>
		<link>http://blog.o2sources.com/2009/07/06/browser-war-trailer.html</link>
		<comments>http://blog.o2sources.com/2009/07/06/browser-war-trailer.html#comments</comments>
		<pubDate>Mon, 06 Jul 2009 15:16:09 +0000</pubDate>
		<dc:creator>Thanh</dc:creator>
				<category><![CDATA[Communication]]></category>
		<category><![CDATA[Le vendredi c'est permis]]></category>
		<category><![CDATA[O2Sources]]></category>
		<category><![CDATA[Standards and co]]></category>
		<category><![CDATA[Buzz]]></category>
		<category><![CDATA[chrome]]></category>
		<category><![CDATA[Firefox]]></category>
		<category><![CDATA[Internet Explorer]]></category>
		<category><![CDATA[Mozilla]]></category>
		<category><![CDATA[Netscape]]></category>
		<category><![CDATA[Opera]]></category>
		<category><![CDATA[Vendredi c'est permis]]></category>
		<category><![CDATA[Vidéo]]></category>
		<category><![CDATA[Vimeo]]></category>

		<guid isPermaLink="false">http://blog.o2sources.com/?p=485</guid>
		<description><![CDATA[Le temps d&#8217;un Vendredi c&#8217;est permis, nous avons pris grand plaisir à réaliser quelques vidéos pour célébrer la sortie de Firefox 3.5. Nous avons certes un peu de retard, mais mieux vaut tard que jamais.
C&#8217;est Philippe, le développeur ROR, spécialiste en méthode de développement Agile, qui s&#8217;est collé au montage. Je vous invite à regarder [...]]]></description>
			<content:encoded><![CDATA[<p>Le temps d&#8217;un Vendredi c&#8217;est permis, nous avons pris grand plaisir à réaliser quelques vidéos pour célébrer la sortie de Firefox 3.5. Nous avons certes un peu de retard, mais mieux vaut tard que jamais.</p>
<p>C&#8217;est <a href="http://eggsonbread.com/">Philippe, le développeur <abbr title="Ruby on Rails">ROR</abbr>, spécialiste en méthode de développement Agile</a>, qui s&#8217;est collé au montage. Je vous invite à regarder le trailer suivant, et vous pouvez mettre les Watts !</p>
<div class="video"><object width="400" height="300"><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=5474120&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" /><embed src="http://vimeo.com/moogaloop.swf?clip_id=5474120&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=0&amp;color=&amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="400" height="300"></embed></object>
<p>Browser War : Best Of from <a href="http://vimeo.com/thanh">Thanh</a> on <a href="http://vimeo.com">Vimeo</a>.</p>
</div>
<p>Casting :</p>
<ul>
<li>Firefox (Florent)</li>
<li>Internet Explorer (Camille)</li>
<li>Netscape (Philippe)</li>
<li>Opera dit &laquo;&nbsp;Opera Mini Cooper&nbsp;&raquo; (Xuan)</li>
<li>Camino (Damien)</li>
<li>Chrome (Thanh)</li>
</ul>
<p>A voir également :</p>
<ul>
<li>Browser War : <a href="http://www.vimeo.com/5439953">The Chrome Menace</a></li>
<li>Browser War : <a href="http://www.vimeo.com/5438091">Firefox, a new hope</a></li>
</ul>
<p>Et très prochainement :</p>
<ul>
<li>Browser War : Internet Explorer strikes back</li>
<li>Browser War : Netscape Begins</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.o2sources.com/2009/07/06/browser-war-trailer.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>INSA ♡ O2Sources</title>
		<link>http://blog.o2sources.com/2009/06/30/insa-loves-o2sources.html</link>
		<comments>http://blog.o2sources.com/2009/06/30/insa-loves-o2sources.html#comments</comments>
		<pubDate>Tue, 30 Jun 2009 20:44:16 +0000</pubDate>
		<dc:creator>Philippe</dc:creator>
				<category><![CDATA[Evènement]]></category>
		<category><![CDATA[Stage]]></category>
		<category><![CDATA[développement]]></category>
		<category><![CDATA[IF]]></category>
		<category><![CDATA[INSA]]></category>
		<category><![CDATA[PFE]]></category>
		<category><![CDATA[Townce]]></category>

		<guid isPermaLink="false">http://blog.o2sources.com/?p=477</guid>
		<description><![CDATA[O2Sources a gagné le prix du meilleur Projet de Fin d&#8217;Étude Informatique 2009 de l&#8217;INSA de Lyon.
Depuis quelques mois, je travaille avec Florent, Camille et Lucien à l&#8217;élaboration d&#8217;une application de travail collaboratif répondant au doux nom de &#171;&#160;Townce&#160;&#187;. En partant du simple constat que l&#8217;email n&#8217;est pas adapté au partage de documents et informations [...]]]></description>
			<content:encoded><![CDATA[<p>O2Sources a gagné le prix du meilleur Projet de Fin d&#8217;Étude Informatique 2009 de l&#8217;INSA de Lyon.</p>
<p>Depuis quelques mois, je travaille avec <a href="http://fvsch.com/">Florent</a>, <a href="http://bibinou.com/">Camille</a> et <a href="http://twitter.com/lboix">Lucien </a>à l&#8217;élaboration d&#8217;une application de travail collaboratif répondant au doux nom de &laquo;&nbsp;Townce&nbsp;&raquo;. En partant du simple constat que l&#8217;email n&#8217;est pas adapté au partage de documents et informations de références, O2Sources m&#8217;a proposé de prendre en main la réalisation d&#8217;une application web de travail collaboratif. J&#8217;en profite donc pour expérimenter la méthodologie de développement Agile Scrum associée à du <a href="http://fr.wikipedia.org/wiki/Scrum">Behaviour Driven Development</a> (BDD) ainsi que le framework web <a href="http://rubyonrails.org/">Ruby on Rails</a> et les frameworks BDD <a href="http://cukes.info/">Cucumber</a> et <a href="http://rspec.info/">RSpec</a>.</p>
<p>Le développement par itération nous permet par le déploiement d&#8217;une nouvelle version de Townce chaque semaine de préciser les fonctionnalités et déceler des incohérences ergonomiques. En Mai-Juin 2009, Camille et Lucien nous rejoignent et donnent ainsi un coup de fouet au développement de Townce ce qui nous permet de commencer à utiliser Townce pour des projets où le partage d&#8217;informations par email est peu efficace et l&#8217;utilisation d&#8217;un SVN est inutilement complexe.</p>
<p>J&#8217;ai soutenu ce projet à l&#8217;INSA mardi dernier et ai participé au concours des Projet de Fin d&#8217;Étude INSA Informatique 2009 deux jours après. Le jury a désigné ce projet comme vainqueur du concours pour les aspects novateurs du sujet, des méthodes et des technologies employées. Je continue le développement de Townce jusqu&#8217;au 31 Juillet avant de quitter la Source pour partir travailler à Montréal. Le reste de l&#8217;équipe prendra la suite, histoire de continuer le développement deTownce:  L&#8217;Application de travail collaboratif qui poutre!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.o2sources.com/2009/06/30/insa-loves-o2sources.html/feed</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>O2Tweet : afficher vos derniers tweets sur votre blog Wordpress</title>
		<link>http://blog.o2sources.com/2009/06/19/o2tweet-afficher-vos-derniers-tweets-sur-votre-blog-wordpress.html</link>
		<comments>http://blog.o2sources.com/2009/06/19/o2tweet-afficher-vos-derniers-tweets-sur-votre-blog-wordpress.html#comments</comments>
		<pubDate>Fri, 19 Jun 2009 13:49:18 +0000</pubDate>
		<dc:creator>Damien</dc:creator>
				<category><![CDATA[Logiciel Libre]]></category>
		<category><![CDATA[O2Sources]]></category>
		<category><![CDATA[développement]]></category>
		<category><![CDATA[o2tweet]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[twitter]]></category>
		<category><![CDATA[Wordpress]]></category>

		<guid isPermaLink="false">http://blog.o2sources.com/?p=474</guid>
		<description><![CDATA[Chez O2Sources quand on trouve qu&#8217;il manque quelque chose pour rendre le web encore mieux qu&#8217;il ne l&#8217;est déjà, on a pas peur de prendre un peu de temps pour palier à ce manque.
Et vu qu&#8217;on est pas fermés on partage ce qu&#8217;on fait 
C&#8217;est le cas pour O2Tweet, un tout nouveau plugin wordpress qui [...]]]></description>
			<content:encoded><![CDATA[<p>Chez O2Sources quand on trouve qu&#8217;il manque quelque chose pour rendre le web encore mieux qu&#8217;il ne l&#8217;est déjà, on a pas peur de prendre un peu de temps pour palier à ce manque.<br />
Et vu qu&#8217;on est pas fermés on partage ce qu&#8217;on fait <img src='http://blog.o2sources.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /><br />
C&#8217;est le cas pour <a href="http://wordpress.org/extend/plugins/o2tweet/">O2Tweet</a>, un tout nouveau plugin wordpress qui faisait défaut à tout ce qui existe déjà.</p>
<p>Vous vous en douterez au nom, ce plugin interargit avec Twitter !<br />
Il ajoute un widget à la sidebar de votre blog wordpress, vous permettant d&#8217;afficher les derniers tweets postés sur votre compte.<br />
Vous pouvez même ignorer les @reply et ne placer que les tweets qui contiennent un ou plusieurs termes.</p>
<p>Et pour éviter de surcharger votre machine, c&#8217;est vous qui décidez toutes les combien de minutes les tweets sont rechargés, voir placer une crontab qui vous permettra d&#8217;éviter de ralentir le chargement d&#8217;une page utilisateur toutes les x minutes.</p>
<p>Alors à vous de tester <a href="http://wordpress.org/extend/plugins/o2tweet/">O2Tweet</a>.<br />
Et si vous avez des remarques ou suggestions, on vous écoute <img src='http://blog.o2sources.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.o2sources.com/2009/06/19/o2tweet-afficher-vos-derniers-tweets-sur-votre-blog-wordpress.html/feed</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>24 heures de l&#8217;INSA &#8211; Les 12 heures d&#8217;impro</title>
		<link>http://blog.o2sources.com/2009/05/15/24-heures-de-linsa-les-12-heures-dimpro.html</link>
		<comments>http://blog.o2sources.com/2009/05/15/24-heures-de-linsa-les-12-heures-dimpro.html#comments</comments>
		<pubDate>Fri, 15 May 2009 14:20:52 +0000</pubDate>
		<dc:creator>Philippe</dc:creator>
				<category><![CDATA[Projet perso]]></category>

		<guid isPermaLink="false">http://blog.o2sources.com/?p=466</guid>
		<description><![CDATA[Le week-end du 15 au 17 mai a lieu à Lyon le festival des 24 heures de l&#8217;INSA. Au programme: un mélange de sport, d’animations et de concerts réputés.
J&#8217;organise avec la Troupe Théâtrale de l&#8217;INSA les 12 heures d&#8217;impro. Nous avons cette année l’honneur et le plaisir d’accueillir huit équipes d’improvisation théâtrale qui vont s’afffronter [...]]]></description>
			<content:encoded><![CDATA[<p>Le week-end du 15 au 17 mai a lieu à Lyon le festival des <em><a href="http://www.24heures.org/">24 heures de l&#8217;INSA</a></em>. Au programme: un mélange de sport, d’animations et de concerts réputés.<br />
J&#8217;organise avec la <em><a href="http://tti.insa-lyon.fr/">Troupe Théâtrale de l&#8217;INSA</a></em> les <em><a href="http://tti.insa-lyon.fr/category/12-heures/">12 heures d&#8217;impro</a></em>. Nous avons cette année l’honneur et le plaisir d’accueillir huit équipes d’improvisation théâtrale qui vont s’afffronter lors de matchs d’impro de 45 minutes les samedi et dimanche après-midi.</p>
<p><a href="http://www.o2sources.com/people/damien">Damien</a> et <a href="http://www.o2sources.com/people/florent">Florent</a> convriront cet évènement en tant que photographes. <a href="http://www.o2sources.com/people/philippe">Je</a> serais pour ma part sur scène pour coacher / jouer / animer des matchs.</p>
<p>Rendez-vous les <strong>samedi 16 et dimanche 17 mai 2009 de 14h à 20h à la Rotonde de l’INSA</strong> pour les <em><strong>12 heures d&#8217;impro</strong></em> et tout le week-end sur le campus de l&#8217;INSA de Lyon pour le festival des <em>24 heures</em>!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.o2sources.com/2009/05/15/24-heures-de-linsa-les-12-heures-dimpro.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
