<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss 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/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>La Geek Attitude</title>
	
	<link>http://blog.kevingomez.fr</link>
	<description>Et vous, vous l'avez ?</description>
	<lastBuildDate>Sun, 24 Apr 2011 07:56:49 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/LaGeekAttitude" /><feedburner:info uri="lageekattitude" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:emailServiceId>LaGeekAttitude</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><item>
		<title>Mes fichiers de conf (Vim, Zsh, xmonad et git)</title>
		<link>http://feedproxy.google.com/~r/LaGeekAttitude/~3/VuHrGZvmEUg/</link>
		<comments>http://blog.kevingomez.fr/2011/04/23/mes-fichiers-de-conf-vim-zsh-xmonad-et-git/#comments</comments>
		<pubDate>Sat, 23 Apr 2011 20:42:25 +0000</pubDate>
		<dc:creator>Kévin G.</dc:creator>
				<category><![CDATA[Geekeries]]></category>
		<category><![CDATA[config]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[vim]]></category>
		<category><![CDATA[xmonad]]></category>
		<category><![CDATA[zsh]]></category>

		<guid isPermaLink="false">http://blog.kevingomez.fr/?p=786</guid>
		<description><![CDATA[Ayant récemment dépoussiéré mes quelques fichiers de configuration, c&#8217;est l&#8217;occasion pour moi d&#8217;en parler ici. Au programme : vim, zsh, xmonad et git ! Pour les détails des conf, je vous renvoie au README du repo Github. Parce que oui, tout est sur un repo : easier to share . Vous retrouverez en gros du [...]]]></description>
			<content:encoded><![CDATA[<p>Ayant récemment dépoussiéré mes quelques fichiers de configuration, c&#8217;est l&#8217;occasion pour moi d&#8217;en parler ici. Au programme : vim, zsh, xmonad et git !<br />
Pour les détails des conf, je vous renvoie au README du <a href="https://github.com/K-Phoen/Config">repo Github</a>. Parce que oui, tout est sur un repo : easier to share .<br />
Vous retrouverez en gros du oh-my-zsh, du xmonad intégré à Gnome et un Vim aux petits oignons.</p>
<p>En ce qui concerne mes sources d&#8217;inspiration, voici les principales :</p>
<ul>
<li><a href="https://github.com/willdurand/vim-config">William Durand</a></li>
<li><a href="http://www.carpe-hora.com/">Carpe Hora</a> (j&#8217;y fait mon stage de DUT et nos bureaux sont occupés par quelques bons barbus <img src='http://blog.kevingomez.fr/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> )</li>
<li><a href="http://phollow.fr/2010/11/5-themes-vim-pour-frimer-devant-les-filles/">Phollow</a></li>
<li><a href="http://www.reddit.com/r/vim/comments/gexi6/a_smarter_statusline_code_in_comments/">Reddit</a></li>
<li><a href="http://www.vi-improved.org/vimrc.php">Vi-Improved</a></li>
<li><a href="http://www.google.com/">Google</a></li>
</ul>
<p>Comme d&#8217;habitude, feel free to comment &amp; hack <img src='http://blog.kevingomez.fr/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<img src="http://feeds.feedburner.com/~r/LaGeekAttitude/~4/VuHrGZvmEUg" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.kevingomez.fr/2011/04/23/mes-fichiers-de-conf-vim-zsh-xmonad-et-git/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.kevingomez.fr/2011/04/23/mes-fichiers-de-conf-vim-zsh-xmonad-et-git/</feedburner:origLink></item>
		<item>
		<title>Intelligence artificielle et jeux</title>
		<link>http://feedproxy.google.com/~r/LaGeekAttitude/~3/3n6Fzgrh9Jk/</link>
		<comments>http://blog.kevingomez.fr/2011/03/13/intelligence-artificielle-et-jeux/#comments</comments>
		<pubDate>Sun, 13 Mar 2011 14:42:51 +0000</pubDate>
		<dc:creator>Kévin G.</dc:creator>
				<category><![CDATA[Geekeries]]></category>

		<guid isPermaLink="false">http://blog.kevingomez.fr/?p=781</guid>
		<description><![CDATA[Dans le cadre du cours de graphes et jeux proposé dans mon IUT, j&#8217;ai eu l&#8217;occasion de découvrir un nouveau domaine : celui des intelligences artificielles. En utilisant comme support un jeu réalisé par nos prédécesseurs, le Jungle (aka Dou Sou Qi), nous avons mis en pratique nos connaissances sur les IA. Nous en avons [...]]]></description>
			<content:encoded><![CDATA[<p>Dans le cadre du cours de graphes et jeux proposé dans mon IUT, j&#8217;ai eu l&#8217;occasion de découvrir un nouveau domaine : celui des intelligences artificielles.</p>
<p>En utilisant comme support un jeu réalisé par nos prédécesseurs, le <a href="http://en.wikipedia.org/wiki/Jungle_(board_game)">Jungle</a> (aka Dou Sou Qi), nous avons mis en pratique nos connaissances sur les IA. Nous en avons profité pour écrire un rapport (en anglais) sur le travail réalisé lors des TP et sur les techniques utilisées dans nos IAs.<br />
Vous trouverez dans ce rapport des explications sur les techniques les plus communes de construction d&#8217;IA pour un jeu simple (deux adversaires, pas de hasard), ainsi que quelques pistes pour améliorer ces algorithmes en les couplant à l&#8217;intelligence humaine (en partant du principe qu&#8217;elle existe :-°).</p>
<p>Si selon vous les termes Minimax, Alpha-Beta et un rapport en anglais ne font pas mauvais ménage, alors <a href="http://blog.kevingomez.fr/wp-content/uploads/2011/03/Rapport.pdf">téléchargez mon rapport sur la création d&#8217;une intelligence artificielle</a> !</p>
<img src="http://feeds.feedburner.com/~r/LaGeekAttitude/~4/3n6Fzgrh9Jk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.kevingomez.fr/2011/03/13/intelligence-artificielle-et-jeux/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.kevingomez.fr/2011/03/13/intelligence-artificielle-et-jeux/</feedburner:origLink></item>
		<item>
		<title>Projet tutoré : un saut dans la programmation logique</title>
		<link>http://feedproxy.google.com/~r/LaGeekAttitude/~3/_OYfPKXg5ws/</link>
		<comments>http://blog.kevingomez.fr/2010/11/08/775/#comments</comments>
		<pubDate>Mon, 08 Nov 2010 20:21:30 +0000</pubDate>
		<dc:creator>Kévin G.</dc:creator>
				<category><![CDATA[Projets]]></category>
		<category><![CDATA[IUT]]></category>
		<category><![CDATA[logique]]></category>
		<category><![CDATA[Programmation]]></category>
		<category><![CDATA[projet tut]]></category>
		<category><![CDATA[prolog]]></category>

		<guid isPermaLink="false">http://blog.kevingomez.fr/?p=775</guid>
		<description><![CDATA[Vendredi dernier nous ont été attribués &#171;&#160;équitablement&#160;&#187; (ie : au hasard) nos sujets de projet tutoré de seconde année d&#8217;IUT Informatique. Je dois avouer qu&#8217;après avoir eu vent de certains des sujets, j&#8217;étais un peu inquiet quant à l&#8217;intérêt de ce sur quoi j&#8217;allais devoir travailler &#8230; Faire un site web pour une association de [...]]]></description>
			<content:encoded><![CDATA[<p>Vendredi dernier nous ont été attribués &laquo;&nbsp;équitablement&nbsp;&raquo; (ie : au hasard) nos sujets de projet tutoré de seconde année d&#8217;IUT Informatique.</p>
<p>Je dois avouer qu&#8217;après avoir eu vent de certains des sujets, j&#8217;étais un peu inquiet quant à l&#8217;intérêt de ce sur quoi j&#8217;allais devoir travailler &#8230; Faire un site web pour une association de jeu vidéo relève pour moi plus d&#8217;un petit job que ferait un étudiant pour payer ses études que d&#8217;un réel sujet de projet.<br />
Heureusement pour moi et mes partenaires, le sort en a décidé autrement !</p>
<p>En effet, le projet que nous devrons réaliser dans les prochaines semaines consiste tout bonnement à créer un langage de programmation. Et pas n&#8217;importe quel type de langage : un langage de programmation logique.  Deux de mes profs semblent être des amateurs de Prolog, et comptent bien nous faire partager leur penchant pour ce langage.<br />
Ça tombe bien, ce sujet nous a tout de suite emballé ! Il faut aussi prendre en compte le fait qu&#8217;entre créer un langage et faire du Windev, y a pas photo ! ;p</p>
<p>Ce projet est donc pour mes partenaires et moi l&#8217;occasion de découvrir à la fois les dessous d&#8217;un langage et le monde de la programmation logique. Et que ce soit l&#8217;un ou l&#8217;autre, on a de quoi faire \o/</p>
<p>Nous avons ce matin même commencé à nous intéresser à Prolog et à écrire nos premiers faits, règles et prédicats prologuiens. Sont aussi apparus devant nos yeux les BNF (nécessaires pour décrire la grammaire d&#8217;un langage), des termes barbares tels que clauses de Horn, SLD-résolution, l&#8217;unification, le backtracking, le pattern-matching et j&#8217;en oublie surement des plus tordus.</p>
<p>Tout ça pour dire que le grand saut dans la programmation logique que nous venons de faire nous enthousiasme beaucoup, mais qu&#8217;étant donnée l&#8217;étendue du problème qui nous est posé nous risquons très vite de déchanter &#8230;</p>
<p>Quoi qu&#8217;il en soit, l&#8217;heure est encore à l&#8217;apprentissage de Prolog et des notions qui lui sont liées, viendra ensuite l&#8217;heure de l&#8217;écriture d&#8217;une BNF et il sera vraiment temps de se documenter en profondeur sur les notions que j&#8217;ai décrites pour commencer à réfléchir à notre moteur d&#8217;inférence (et voilà, déjà un barbarisme que j&#8217;ai oublié de citer dans le paragraphe précédent).</p>
<p>L&#8217;aventure commence, stay tuned !</p>
<p>P.S : vous n&#8217;avez pas réussi à trouver la moindre logique entre mes paragraphes, ne vous inquiétez pas, il n&#8217;y en a tout simplement aucune !</p>
<img src="http://feeds.feedburner.com/~r/LaGeekAttitude/~4/_OYfPKXg5ws" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.kevingomez.fr/2010/11/08/775/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://blog.kevingomez.fr/2010/11/08/775/</feedburner:origLink></item>
		<item>
		<title>Convertir du HTML en PDF avec Qt</title>
		<link>http://feedproxy.google.com/~r/LaGeekAttitude/~3/arx3uBJC44o/</link>
		<comments>http://blog.kevingomez.fr/2010/10/09/convertir-du-html-en-pdf-avec-qt/#comments</comments>
		<pubDate>Sat, 09 Oct 2010 08:55:45 +0000</pubDate>
		<dc:creator>Kévin G.</dc:creator>
				<category><![CDATA[Dev']]></category>
		<category><![CDATA[CPP]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[PDF]]></category>
		<category><![CDATA[Qt]]></category>

		<guid isPermaLink="false">http://blog.kevingomez.fr/?p=769</guid>
		<description><![CDATA[Dans le cadre d&#8217;un projet en C++ utilisant Qt pour la partie GUI, il s&#8217;est posé la question de savoir comment générer à partir de code HTML et CSS un jôôli PDF. Voici la solution retenue : Et voilà, nous avons très simplement généré notre PDF ! Nous pouvons bien évidemment utiliser l&#8217;URL d&#8217;une page [...]]]></description>
			<content:encoded><![CDATA[<p>Dans le cadre d&#8217;un projet en C++ utilisant Qt pour la partie GUI, il s&#8217;est posé la question de savoir comment générer à partir de code HTML et CSS un jôôli PDF.</p>
<p>Voici la solution retenue :</p>
<pre class="brush: cpp; title: ; notranslate">
QWebView view; // sera chargé de rendre le code HTML
QPrinter printer; // et lui s'occupera de l'impression du rendu

// configuration du printer : format A4, rendu en PDF
printer.setPageSize(QPrinter::A4);
printer.setOutputFormat(QPrinter::PdfFormat);
printer.setOutputFileName(&quot;mon_super.pdf&quot;); // nom par défaut, changez le ! =)

// on donne au QWebView le code HTML à interpréter
view.setHtml(&quot;&lt;head&gt;&lt;title&gt;test titre&lt;/title&gt;&lt;/head&gt;&lt;body&gt;&lt;h1&gt;titre&lt;/h1&gt;&lt;p&gt;contenu&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;&quot;);

// si on veut imprimer une page web
// view.load(new QUrl(&quot;http://www.kevingomez.fr&quot;));

// affichage d'une boite de dialogue pour donner quelques options à l'utilisateur
// il peut par exemple changer le nom du fichier, définir quelles pages seront imprimées, etc.
QPrintDialog printDialog(&amp;printer, this);
if(printDialog.exec() == QDialog::Accepted) {
    view.print(&amp;printer); // impression de la page en utilisant le printer
}
</pre>
<p>Et voilà, nous avons très simplement généré notre PDF ! Nous pouvons bien évidemment utiliser l&#8217;URL d&#8217;une page pour générer le fichier en utilisant la méthode load(url) de QWebView.</p>
<img src="http://feeds.feedburner.com/~r/LaGeekAttitude/~4/arx3uBJC44o" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.kevingomez.fr/2010/10/09/convertir-du-html-en-pdf-avec-qt/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.kevingomez.fr/2010/10/09/convertir-du-html-en-pdf-avec-qt/</feedburner:origLink></item>
		<item>
		<title>Animes-Live.fr ouvre ses portes !</title>
		<link>http://feedproxy.google.com/~r/LaGeekAttitude/~3/35FZXCM67A0/</link>
		<comments>http://blog.kevingomez.fr/2010/08/02/animes-live-fr-ouvre-ses-portes/#comments</comments>
		<pubDate>Mon, 02 Aug 2010 13:56:38 +0000</pubDate>
		<dc:creator>Kévin G.</dc:creator>
				<category><![CDATA[Dev']]></category>
		<category><![CDATA[Projets]]></category>
		<category><![CDATA[animes]]></category>
		<category><![CDATA[gratuit]]></category>
		<category><![CDATA[site]]></category>
		<category><![CDATA[streaming]]></category>

		<guid isPermaLink="false">http://blog.kevingomez.fr/?p=756</guid>
		<description><![CDATA[Pour faire court, Animes Live est un site de streaming gratuit d&#8217;animes comme il en existe beaucoup. Mais même si ce genre de site se rencontre à la pelle sur le net, on est souvent déçu par la qualité des vidéos, des sous-titrages ou alors notre navigation est gênée par d&#8217;immondes publicités ou tchats en flash qui [...]]]></description>
			<content:encoded><![CDATA[<p>Pour faire court, <a href="http://www.animes-live.fr/">Animes Live</a> est un site de streaming gratuit d&#8217;animes comme il en existe beaucoup. Mais même si ce genre de site se rencontre à la pelle sur le net, on est souvent déçu par la qualité des vidéos, des sous-titrages ou alors notre navigation est gênée par d&#8217;immondes publicités ou tchats en flash qui brillent et font du bruit.</p>
<p>Pour toutes ces raisons j&#8217;ai décidé d&#8217;ouvrir mon propre site. N’apparaîtront sur <a href="http://www.animes-live.fr/">Animes Live</a> que des animes de qualité, pour notre plus grand plaisir !</p>
<p>Pour plus d&#8217;informations, je vous renvoie à <a href="http://www.animes-live.fr/news/ouverture-d-animes-live/">la news</a> que j&#8217;ai (rapidement :&#8211;°) rédigé sur ledit site.</p>
<img src="http://feeds.feedburner.com/~r/LaGeekAttitude/~4/35FZXCM67A0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.kevingomez.fr/2010/08/02/animes-live-fr-ouvre-ses-portes/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://blog.kevingomez.fr/2010/08/02/animes-live-fr-ouvre-ses-portes/</feedburner:origLink></item>
		<item>
		<title>Mettre à jour son Acer Liquid vers Eclair (Android 2.1)</title>
		<link>http://feedproxy.google.com/~r/LaGeekAttitude/~3/qFbKncOLZGs/</link>
		<comments>http://blog.kevingomez.fr/2010/07/30/mettre-a-jour-son-acer-liquid-vers-eclair-android-2-1/#comments</comments>
		<pubDate>Fri, 30 Jul 2010 16:23:29 +0000</pubDate>
		<dc:creator>Kévin G.</dc:creator>
				<category><![CDATA[Geekeries]]></category>
		<category><![CDATA[android]]></category>
		<category><![CDATA[eclair]]></category>
		<category><![CDATA[update]]></category>

		<guid isPermaLink="false">http://blog.kevingomez.fr/?p=753</guid>
		<description><![CDATA[Acer a récemment ajouté sur son centre de téléchargement une ROM officielle d&#8217;Android 2.1, ou plus communément Eclair. L&#8217;installation de cette dernière est simple. Le tout se présente sous la forme d&#8217;une archive dans laquelle se trouve un exécutable qu&#8217;il suffit de lancer pour voir apparaître à une série instructions qu&#8217;il suffira de suivre pour installer la [...]]]></description>
			<content:encoded><![CDATA[<p>Acer a récemment ajouté sur son <a href="http://www.acer.fr/acer/service.do?LanguageISOCtxParam=fr&amp;miu10einu24.current.attN2B2F2EEF=291&amp;sp=page15e&amp;ctx2.c2att1=8&amp;miu10ekcond13.attN2B2F2EEF=291&amp;CountryISOCtxParam=FR&amp;ctx1g.c2att92=957&amp;ctx1.att21k=1&amp;CRC=518311093">centre de téléchargement</a> une <a href="http://global-download.acer.com/GDFiles/OS/OS/OS_Acer_1.100.39.EMEA.GEN1_A21E_A.zip?acerid=634141753863220077&amp;Step1=Smart%20Handheld&amp;Step2=Liquid&amp;Step3=Liquid&amp;OS=a02&amp;LC=it&amp;BC=Acer&amp;SC=EMEA_17">ROM officielle d&#8217;Android 2.1</a>, ou plus communément Eclair.</p>
<p>L&#8217;installation de cette dernière est simple. Le tout se présente sous la forme d&#8217;une archive dans laquelle se trouve un exécutable qu&#8217;il suffit de lancer pour voir apparaître à une série instructions qu&#8217;il suffira de suivre pour installer la ROM. Tout est automatique et vous n&#8217;aurez aucune commande obscure à entrer =P</p>
<p>Vous serez prévenus durant l&#8217;installation mais autant vous avertir maintenant : <strong>l&#8217;utilisation de cet exécutable causera la perte de vos données personnelles stockées dans votre mobile !</strong><br />
Pensez donc à réaliser les sauvegardes qui s&#8217;imposent <img src='http://blog.kevingomez.fr/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<img src="http://feeds.feedburner.com/~r/LaGeekAttitude/~4/qFbKncOLZGs" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.kevingomez.fr/2010/07/30/mettre-a-jour-son-acer-liquid-vers-eclair-android-2-1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.kevingomez.fr/2010/07/30/mettre-a-jour-son-acer-liquid-vers-eclair-android-2-1/</feedburner:origLink></item>
		<item>
		<title>Django via Nginx et FastCGI</title>
		<link>http://feedproxy.google.com/~r/LaGeekAttitude/~3/YY7WXCuwiG8/</link>
		<comments>http://blog.kevingomez.fr/2010/07/18/django-via-nginx-et-fastcgi/#comments</comments>
		<pubDate>Sun, 18 Jul 2010 17:58:32 +0000</pubDate>
		<dc:creator>Kévin G.</dc:creator>
				<category><![CDATA[Geekeries]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[django]]></category>
		<category><![CDATA[fastcgi]]></category>
		<category><![CDATA[nginx]]></category>
		<category><![CDATA[serveur]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://blog.kevingomez.fr/?p=748</guid>
		<description><![CDATA[Maintenant que Nginx est correctement configuré pour servir Redmine, c&#8217;est au tour de Django de passer à la casserole (bah ouais, Python ou Ruby, s&#8217;pas un troll qui m&#8217;affecte des masses :&#8211;°) Comme pour Redmine, Nginx fera office de reverse proxy, mais cette fois ce sera via FastCGI que sera servi le contenu. Je suppose [...]]]></description>
			<content:encoded><![CDATA[<p>Maintenant que <a href="http://blog.kevingomez.fr/2010/07/18/installer-redmine-sous-nginx/">Nginx est correctement configuré pour servir Redmine</a>, c&#8217;est au tour de Django de passer à la casserole (bah ouais, Python ou Ruby, s&#8217;pas un troll qui m&#8217;affecte des masses :&#8211;°)</p>
<p>Comme pour Redmine, Nginx fera office de reverse proxy, mais cette fois ce sera via FastCGI que sera servi le contenu.</p>
<p>Je suppose toujours que vous avez un Nginx opérationnel et Ubuntu 10.4, les manips doivent ici aussi être les mêmes pour tous les dérivés Debian. Mais cette fois j&#8217;ajouterai un pré-requis supplémentaire : un projet django fonctionnel (bawé, cay kewl si on veut tester =P)</p>
<h3>Installation des .deb</h3>
<pre class="brush: bash; title: ; notranslate">sudo aptitude install python-django python-flup</pre>
<p>Et voilà, on a une install&#8217; de Django fonctionnelle, et de quoi faire tourner un serveur FastCGI.</p>
<h3>Automatisation du lancement des projets Django</h3>
<p>Parce qu&#8217;il peut être sympa de pouvoir lancer/stopper/relancer automatiquement tous les projets django que l&#8217;on sert, je vous mets à disposition un script à placer dans /etc/init.d/django_fastcgi et à rendre exécutable via le traditionnel :</p>
<pre class="brush: bash; title: ; notranslate">sudo chmod +x /etc/init.d/django_fastcgi</pre>
<p><strong>N.B</strong> : prenez bien soin de correctement renseigner la variable DJANGO_SITES. Elle doit contenir les chemins <strong>sans le slash final</strong> vers les projets, séparés par des espaces. Chaque path présent dans DJANGO_SITES doit permettre d&#8217;accéder au fichier manage.py qui correspond au projet, ce fichier permettant dans notre cas de lancer le serveur FastCGI.</p>
<pre class="brush: bash; title: ; notranslate">
#! /bin/sh
### BEGIN INIT INFO
# Provides:          FastCGI servers for Django
# Required-Start:    networking
# Required-Stop:     networking
# Default-Start:     2 3 4 5
# Default-Stop:      S 0 1 6
# Short-Description: Start FastCGI servers with Django.
# Description:       Django, in order to operate with FastCGI, must be started
#                    in a very specific way with manage.py. This must be done
#                    for each Django web server that has to run.
### END INIT INFO
#
# Authors:  Guillermo Fernandez Castellanos
#           &lt;guillermo.fernandez.castellanos AT gmail.com&gt;.
#
#           Kévin Gomez
#           &lt;geek63 AT gmail.com&gt;.
#
# Version: @(#)fastcgi 0.1 18-Jul-2010 geek63 AT gmail.com
#          @(#)fastcgi 0.1 11-Jan-2007 guillermo.fernandez.castellanos AT gmail.com
#

#### SERVER SPECIFIC CONFIGURATION
DJANGO_SITES=&quot;/home/kevin/project_foo /home/bar/project_foo&quot;
RUNFILES_PATH=/tmp
HOST=127.0.0.1
PORT_START=3030
RUN_AS=www-data
FCGI_METHOD=prefork
#### DO NOT CHANGE ANYTHING AFTER THIS LINE!

set -e

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
DESC=&quot;FastCGI servers&quot;
NAME=$0
SCRIPTNAME=/etc/init.d/$NAME

#
#       Function that starts the daemon/service.
#
d_start()
{
    # Starting all Django FastCGI processes
    PORT=$PORT_START
    for SITE in $DJANGO_SITES
    do
        PID_FILE=`echo $SITE | sed -e 's#/#_#g'`

        if [ -f $RUNFILES_PATH/$PID_FILE.pid ]; then
            echo &quot;$SITE already running&quot;
        else
            start-stop-daemon --start --pidfile $RUNFILES_PATH/$PID_FILE.pid \
                              --startas /usr/bin/python $SITES_PATH/$SITE/manage.py runfcgi \
                              method=$FCGI_METHOD socket=$RUNFILES_PATH/$PID_FILE.socket \
                              pidfile=$RUNFILES_PATH/$PID_FILE.pid
            chmod 400 $RUNFILES_PATH/$PID_FILE.pid
            chmod 777 $RUNFILES_PATH/$PID_FILE.socket

            echo &quot;$SITE started&quot;
        fi
        PORT=$(($PORT + 1))
    done
}

#
#       Function that stops the daemon/service.
#
d_stop() {
    # Killing all Django FastCGI processes running
    for SITE in $DJANGO_SITES
    do
        PID_FILE=`echo $SITE | sed -e 's#/#_#g'`

        start-stop-daemon --stop --quiet --pidfile $RUNFILES_PATH/$PID_FILE.pid &amp;&amp; echo &quot;$SITE stopped&quot; \
                          || echo -n &quot;$SITE not running&quot;
        if [ -f $RUNFILES_PATH/$PID_FILE.pid ]; then
           rm $RUNFILES_PATH/$PID_FILE.pid
        fi
    done
}

ACTION=&quot;$1&quot;
case &quot;$ACTION&quot; in
    start)
        echo &quot;Starting $DESC:&quot;
        d_start
        ;;

    stop)
        echo &quot;Stopping $DESC:&quot;
        d_stop
        ;;

    restart|force-reload)
        echo &quot;Restarting $DESC:&quot;
        d_stop
        sleep 1
        d_start
        ;;

    *)
        echo &quot;Usage: $NAME {start|stop|restart|force-reload}&quot; &gt;&amp;2
        exit 3
        ;;
esac

exit 0
</pre>
<p>On peut aussi faire en sorte que les projets soient automatiquement lancés dès le boot du serveur via un :</p>
<pre class="brush: bash; title: ; notranslate">sudo update-rc.d django_fastcgi defaults</pre>
<h3>Configuration de Nginx</h3>
<p>Un exemple de virtualhost vaut mieux qu&#8217;un long discours, donc le voici :</p>
<pre class="brush: plain; title: ; notranslate">
server {
    listen      80;
    server_name domain.tld;

    location / {
        fastcgi_pass unix:/tmp/_home_bar_project_foo.socket;

        # à vous de voir si vous avez besoin de plus de choses
        fastcgi_param PATH_INFO         $fastcgi_script_name;
        fastcgi_param SERVER_PORT       $server_port;
        fastcgi_param SERVER_PROTOCOL   $server_protocol;
        fastcgi_param SERVER_NAME       $server_name;
        fastcgi_param REQUEST_METHOD    $request_method;
        fastcgi_param CONTENT_TYPE      $content_type;
        fastcgi_param CONTENT_LENGTH    $content_length;
    }

    # on sert directement les fichiers statiques de l'administration
    location /media {
        root /usr/lib/python2.5/site-packages/django/contrib/admin/media;
    }

   # quelques fichiers statiques liés à l'application (css, images, js)
    location /static {
        root /home/bar/project_foo;
    }
}
</pre>
<p>L&#8217;adresse du socket peut est connue via la méthode suivante :</p>
<ul>
<li>$RUNFILES_PATH : définie dans /etc/init.d/django_fastcgi</li>
<li>$PROJECT_PATH : correspond à l&#8217;adresse du projet dans laquelle on a remplacé les &laquo;&nbsp;/&nbsp;&raquo; par des &laquo;&nbsp;_&nbsp;&raquo;</li>
<li>l&#8217;adresse du socket est : $RUNFILES_PATH/$PROJECT_PATH.socket</li>
</ul>
<p>Une fonction très basique en bash permet d&#8217;automatiser la douloureuse et complexe conversion de chemin :</p>
<pre class="brush: bash; title: ; notranslate">
# elle prend en paramètre le path à convertir, et si aucun paramètre n'est fourni elle utilise le répertoire courant
fastcgi_sockfile() {
    if [ &quot;$1&quot; = &quot;&quot; ]; then
        SITE=`pwd`
    else
        SITE=$1
    fi

    echo &quot;/tmp/`echo $SITE | sed -e 's#/#_#g'`.sock&quot;
}
</pre>
<img src="http://feeds.feedburner.com/~r/LaGeekAttitude/~4/YY7WXCuwiG8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.kevingomez.fr/2010/07/18/django-via-nginx-et-fastcgi/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://blog.kevingomez.fr/2010/07/18/django-via-nginx-et-fastcgi/</feedburner:origLink></item>
		<item>
		<title>Installer Redmine sous Nginx</title>
		<link>http://feedproxy.google.com/~r/LaGeekAttitude/~3/CL61w2wp8Jc/</link>
		<comments>http://blog.kevingomez.fr/2010/07/18/installer-redmine-sous-nginx/#comments</comments>
		<pubDate>Sun, 18 Jul 2010 12:10:19 +0000</pubDate>
		<dc:creator>Kévin G.</dc:creator>
				<category><![CDATA[Geekeries]]></category>
		<category><![CDATA[mongrel]]></category>
		<category><![CDATA[nginx]]></category>
		<category><![CDATA[redmine]]></category>
		<category><![CDATA[serveur]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://blog.kevingomez.fr/?p=739</guid>
		<description><![CDATA[Ayant eu envie de me la jouer geek, j&#8217;ai très récemment remplacé mon Apache par le très bon Nginx. Enfin, quand je dis « remplacé », ce n&#8217;est pas exactement vrai, voyez plutôt : Comme le montre le schéma ci-dessus, toutes les requêtes arrivant sur le serveur sont transmises à Nginx qui va ensuite décider [...]]]></description>
			<content:encoded><![CDATA[<p>Ayant eu envie de me la jouer geek, j&#8217;ai très récemment remplacé mon Apache par le très bon Nginx. Enfin, quand je dis « remplacé », ce n&#8217;est pas exactement vrai, voyez plutôt :</p>
<p style="text-align: center;"><a href="http://blog.kevingomez.fr/wp-content/uploads/2010/07/serveurs.png"><img class="size-medium wp-image-741 aligncenter" title="serveurs" src="http://blog.kevingomez.fr/wp-content/uploads/2010/07/serveurs-300x238.png" alt="" width="300" height="238" /></a></p>
<p>Comme le montre le schéma ci-dessus, toutes les requêtes arrivant sur le serveur sont transmises à Nginx qui va ensuite décider en fonction de leur type s&#8217;il va les traiter ou pas. Apache n&#8217;est donc plus là que pour traiter les pages PHP, et Mongrel s&#8217;occupe quant à lui du Ruby.</p>
<p>Bon, maintenant que vous savez comment mon serveur marche sous le capot, je vais vous expliquer comment mettre en place la partie Nginx + Mongrel, dans l&#8217;optique de faire tourner Redmine derrière tout ça.<br />
<span id="more-739"></span><br />
Je suppose que vous avez un Nginx opérationnel et Ubuntu 10.4 (version serveur ou pas, peu importe), en sachant que les manipulations devraient être sensiblement les mêmes sur les autres dérivés de Debian et sur Debian elle-même.</p>
<h3>Installation des .deb</h3>
<p>Notre OS fourni des .deb de Mongrel ET de Redmine, donc autant les utiliser :</p>
<pre class="brush: bash; title: ; notranslate">
sudo aptitude install redmine redmine-mysql mongrel
</pre>
<p>La seule &laquo;&nbsp;difficulté&nbsp;&raquo; ici étant de correctement renseigner les logins de base de données, je pars du principe que vous saurez vous débrouiller sans moi =3</p>
<h3>Automatisation du lancement de Redmine</h3>
<p>L&#8217;installation des .deb de Redmine et de Mongrel ne nous donne aucun moyen de gérer automatiquement le lancement et l&#8217;arrêt de Redmine. Qu&#8217;à cela ne tienne, nous allons créer notre propre /etc/init.d/redmine pour gérer tout ça !</p>
<pre class="brush: bash; title: ; notranslate">
#!/bin/sh
set -e

REDMINE_PATH=/usr/share/redmine/
REDMINE_PID=/tmp/mongrel.pid
REDMINE_LOG=/tmp/mongrel.log
REDMINE_PORT=3000

if [ -x /usr/bin/mongrel_rails ] ; then
    HAVE_MONGREL=1
else
    echo &quot;Mongrel not installed.&quot;
    exit 0
fi

. /lib/lsb/init-functions

case &quot;$1&quot; in
  start)
    log_action_begin_msg &quot;Starting Redmine server&quot;
    mongrel_rails start -c $REDMINE_PATH -d -e production -p $REDMINE_PORT -P $REDMINE_PID -l $REDMINE_LOG
    log_action_end_msg $?
    ;;
  stop)
    log_action_begin_msg &quot;Stopping Redmine server&quot;
    mongrel_rails stop -c $REDMINE_PATH -P $REDMINE_PID
    log_action_end_msg $?
    ;;
  force-reload|restart)
    $0 stop
    $0 start
    ;;
  *)
    echo &quot;Usage: /etc/init.d/redmine {start|stop|restart|force-reload}&quot;
    exit 1
    ;;
esac

exit 0
</pre>
<p>Sans oublier de rendre le script exécutable :</p>
<pre class="brush: bash; title: ; notranslate">sudo chmod +x /etc/init.d/redmine</pre>
<p>On peut aussi faire en sorte que Redmine soit automatiquement lancé dès le boot du serveur via un :</p>
<pre class="brush: bash; title: ; notranslate">sudo update-rc.d redmine defaults</pre>
<h3>Configuration de Nginx</h3>
<p>On dispose maintenant d&#8217;un Redmine fonctionnel et théoriquement servi en local par Mongrel, il ne reste donc plus qu&#8217;à le rendre accessible depuis l&#8217;extérieur. Pour cela nous allons utiliser les fonctionnalités de proxy de Nginx comme le fait le virtualhost suivant :</p>
<pre class="brush: plain; title: ; notranslate">
# redmine.kevingomez.fr
server {
    listen      80;
    server_name redmine.kevingomez.fr;

    location / {
        root /usr/share/redmine/public;
        
        # le port 3000 est celui indiqué dans le fichier /etc/init.d/redmine
        proxy_pass http://127.0.0.1:3000;
    }
}
</pre>
<p>Notez qu&#8217;ici on configure Redmine pour être accessible via un domaine. Si Redmine est dans un sous-répertoire, veillez à ajouter la ligne suivante à la fin du fichier /usr/share/redmine/config/environment.rb :</p>
<pre class="brush: ruby; title: ; notranslate">ActionController::AbstractRequest.relative_url_root = &quot;/redmine&quot;</pre>
<h3>Autres pistes possibles</h3>
<p>Le Redmine étant ici destiné à être utilisé par peu de personnes (pas plus de 4 ou 5), Mongrel devrait se la couler douce un moment.</p>
<p>Si vous souhaitez accueillir un peu plus de monde que moi sur votre installation, je vous suggère de vous documenter sur <a href="http://www.google.fr/search?q=mongrel_cluster+nginx">mongrel_cluster</a> (Nginx sert en fait de load balancer sur plusieurs serveurs Mongrel)</p>
<p>Il est aussi possible d&#8217;utiliser Redmine non pas dans un cluster de serveurs Mongrel, mais dans un <a href="http://www.redmine.org/wiki/redmine/HowTo_configure_Nginx_to_run_Redmine">cluster de serveurs Thin</a>.</p>
<p>Dernière petite piste : <a href="http://www.google.fr/search?q=passenger+nginx+redmine">Phusion Passenger</a>.</p>
<img src="http://feeds.feedburner.com/~r/LaGeekAttitude/~4/CL61w2wp8Jc" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.kevingomez.fr/2010/07/18/installer-redmine-sous-nginx/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://blog.kevingomez.fr/2010/07/18/installer-redmine-sous-nginx/</feedburner:origLink></item>
		<item>
		<title>Joe Satriani – Redshift Riders</title>
		<link>http://feedproxy.google.com/~r/LaGeekAttitude/~3/whLUTKc8aZw/</link>
		<comments>http://blog.kevingomez.fr/2010/06/11/joe-satriani-redshift-riders/#comments</comments>
		<pubDate>Fri, 11 Jun 2010 21:07:37 +0000</pubDate>
		<dc:creator>Kévin G.</dc:creator>
				<category><![CDATA[Musik Box]]></category>
		<category><![CDATA[joe satriani]]></category>
		<category><![CDATA[musique]]></category>

		<guid isPermaLink="false">http://blog.kevingomez.fr/?p=734</guid>
		<description><![CDATA[Divarvel m&#8217;ayant récemment fait découvrir ce dieu qu&#8217;est Satriani, je profite de mon blog afin de ramener les quelques brebis égarées ne connaissant pas le talent de ce guitariste sur le droit chemin. On commence d&#8217;ailleurs tout de suite avec Redshift Riders : Et voici Crowd Chant, parce que c&#8217;est du génial, fabuleux et presque [...]]]></description>
			<content:encoded><![CDATA[<p>Divarvel m&#8217;ayant récemment fait découvrir ce dieu qu&#8217;est Satriani, je profite de mon blog afin de ramener les quelques brebis égarées ne connaissant pas le talent de ce guitariste sur le droit chemin.</p>
<p>On commence d&#8217;ailleurs tout de suite avec Redshift Riders :</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="480" height="385" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://www.youtube-nocookie.com/v/xdbGL0Yf5iM&amp;hl=fr_FR&amp;fs=1&amp;" /><param name="allowfullscreen" value="true" /><embed type="application/x-shockwave-flash" width="480" height="385" src="http://www.youtube-nocookie.com/v/xdbGL0Yf5iM&amp;hl=fr_FR&amp;fs=1&amp;" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<p>Et voici Crowd Chant, parce que c&#8217;est du génial, fabuleux et presque jouissif.</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="640" height="385" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://www.youtube-nocookie.com/v/wtu5OLCjsA0&amp;hl=fr_FR&amp;fs=1&amp;" /><param name="allowfullscreen" value="true" /><embed type="application/x-shockwave-flash" width="640" height="385" src="http://www.youtube-nocookie.com/v/wtu5OLCjsA0&amp;hl=fr_FR&amp;fs=1&amp;" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<p>Et pour terminer on se fait un petit Surfing With The Alien.<br />
<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="480" height="385" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://www.youtube-nocookie.com/v/e-OK7sS855M&amp;hl=fr_FR&amp;fs=1&amp;" /><param name="allowfullscreen" value="true" /><embed type="application/x-shockwave-flash" width="480" height="385" src="http://www.youtube-nocookie.com/v/e-OK7sS855M&amp;hl=fr_FR&amp;fs=1&amp;" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<p>N&#8217;est-ce pas que ça fait du bien ?</p>
<img src="http://feeds.feedburner.com/~r/LaGeekAttitude/~4/whLUTKc8aZw" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.kevingomez.fr/2010/06/11/joe-satriani-redshift-riders/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.kevingomez.fr/2010/06/11/joe-satriani-redshift-riders/</feedburner:origLink></item>
		<item>
		<title>Un peu de moi</title>
		<link>http://feedproxy.google.com/~r/LaGeekAttitude/~3/PGaUH-r_f0E/</link>
		<comments>http://blog.kevingomez.fr/2010/03/03/un-peu-de-moi/#comments</comments>
		<pubDate>Tue, 02 Mar 2010 23:01:25 +0000</pubDate>
		<dc:creator>Kévin G.</dc:creator>
				<category><![CDATA[Moi moi & moi]]></category>
		<category><![CDATA[eklablog]]></category>
		<category><![CDATA[IUT]]></category>
		<category><![CDATA[projet]]></category>
		<category><![CDATA[stage]]></category>

		<guid isPermaLink="false">http://blog.kevingomez.fr.nf/?p=714</guid>
		<description><![CDATA[Rassurez vous, malgré ce titre quelque peu &#8230; tendancieux dira-t-on, je ne me livrerai pas dans cet article aux proxénètes de passage sur le net. Non, je laisse les utilisateurs de chatroulette.com s&#8217;occuper de ça. J&#8217;en profiterai par contre pour vous donner des informations sur ce qui fait mon quotidien à présent, point de vue [...]]]></description>
			<content:encoded><![CDATA[<p>Rassurez vous, malgré ce titre quelque peu &#8230; tendancieux dira-t-on, je ne me livrerai pas dans cet article aux proxénètes de passage sur le net. Non, je laisse les utilisateurs de chatroulette.com s&#8217;occuper de ça.</p>
<p>J&#8217;en profiterai par contre pour vous donner des informations sur ce qui fait mon quotidien à présent, point de vue informatique j&#8217;entends. Car ouais, le fait que je sois en première année de DUT (et qu&#8217;en plus je ne m&#8217;en sorte pas trop mal &#8230; hahaha) n&#8217;implique pas que je me la coule douce, c&#8217;est même le contraire.<br />
Si vous suivez mes repos Bitbucket par exemple, vous avez pu voir que j&#8217;en ai créé trois nouveaux :</p>
<ul>
<li> <a href="http://bitbucket.org/kphoen/php_url_dispatcher/overview/">php_url_dispatcher</a> :: pour faire court, c&#8217;est une class de gestion d&#8217;URL rewriting reprenant le principe de celle de Django (possibilité de lier une ou plusieurs URLs à un fichier à inclure/exécuter ou à un callback)</li>
<li><a href="http://bitbucket.org/kphoen/class_upload/overview/">class_upload</a> :: yet another upload class, sauf que celle-ci elle rox.</li>
<li><a href="http://bitbucket.org/kphoen/jpdt/overview/">jPdT</a> :: sur une idée originale de <a href="http://clement.delafargue.name/fr/">Divarvel</a>, jPdT est un script python capable de générer du code Java et le diagramme des class UML correspondant, et ce en se basant sur le contenu d&#8217;un fichier Yaml décrivant les class à construire.<br />
Je n&#8217;ai pas été claire dans ma phrase précédente, j&#8217;en ai parfaitement conscience et j&#8217;ai pourtant la flemme de la remanier. Qu&#8217;à cela ne tienne, je n&#8217;ai qu&#8217;à vous rediriger vers <a href="http://bitbucket.org/kphoen/jpdt/wiki/Home">le wiki de jPdT</a> !</li>
</ul>
<p>À côté de tout ça, je suis en train d&#8217;entièrement recoder mon portfolio. Il va roxer, puis son contenu aussi parce que d&#8217;ici que j&#8217;ai le temps de le finir, j&#8217;aurai des tonnes de trucs en tout genre à y mettre.</p>
<p>Autre news : la migration de l&#8217;intégralité de mes sites de mon hébergement mutualisé Dinhosting vers un VPS loué sur <a href="http://tonbnc.fr/">TonBnc.fr</a> (que je ne peux que recommander !). Vous aurez peut-être remarqué que l&#8217;adresse du blog à changé &#8230; classe non ?</p>
<p>Et puis ouais, j&#8217;ai comme on dit gardé le meilleur pour la fin : je suis, pour 6 mois et en plus des cours de l&#8217;IUT, en stage chez <a href="http://www.eklablog.com/">EklaBlog</a>/<a href="http://www.eklaweb.com/">EklaWeb</a>. Et ça, ça roxx carrément !<br />
Je vous passerai les détails ce soir, mais sachez qu&#8217;on a pas mal de trucs sympas à dév et que je vous en parlerai certainement incessamment sous peu <img src='http://blog.kevingomez.fr/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<img src="http://feeds.feedburner.com/~r/LaGeekAttitude/~4/PGaUH-r_f0E" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.kevingomez.fr/2010/03/03/un-peu-de-moi/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		<feedburner:origLink>http://blog.kevingomez.fr/2010/03/03/un-peu-de-moi/</feedburner:origLink></item>
	</channel>
</rss>

