<?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>Proj3ct</title>
	<atom:link href="http://proj3ct.org/blog/feed/" rel="self" type="application/rss+xml" />
	<link>http://proj3ct.org/blog</link>
	<description>Web development</description>
	<lastBuildDate>Sun, 07 Nov 2010 17:55:24 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Créer son propre repository Yum</title>
		<link>http://proj3ct.org/blog/2010/11/07/creer-son-propre-repository-yum/</link>
		<comments>http://proj3ct.org/blog/2010/11/07/creer-son-propre-repository-yum/#comments</comments>
		<pubDate>Sun, 07 Nov 2010 17:53:17 +0000</pubDate>
		<dc:creator>aer0</dc:creator>
				<category><![CDATA[dev]]></category>

		<guid isPermaLink="false">http://proj3ct.org/blog/?p=209</guid>
		<description><![CDATA[Récemment, je cherchais un moyen pour déployer rapidement des appli web et leurs mises à jours. J&#8217;avais écarté un peu rapidement Yum et les Rpm. Or il s&#8217;avère qu&#8217;on peut mettre ça en place assez rapidement et que c&#8217;est trés efficace. Dans un premier temps je vais montrer comment mettre en place le repository et [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://proj3ct.org/blog/wp-content/uploads/2010/11/yum_l.png"><img src="http://proj3ct.org/blog/wp-content/uploads/2010/11/yum_l.png" alt="" width="300" height="250" class="alignleft size-full wp-image-232" /></a>Récemment, je cherchais un moyen pour déployer rapidement des appli web et leurs mises à jours. J&#8217;avais écarté un peu rapidement Yum et les Rpm. Or il s&#8217;avère qu&#8217;on peut mettre ça en place assez rapidement et que c&#8217;est trés efficace. Dans un premier temps je vais montrer comment mettre en place le repository et dans un second temps je ferai un tuto pour créer des Rpm <strong>noarch</strong> (tout aussi facilement).<br />
<br />
J&#8217;ai effectué tout cela sur Fedora 11 (i386) et Centos 5.5 (x64).</p>
<h3>1. L&#8217;arborescence</h3>
<p>J&#8217;utilise &#8216;/var/www/html/&#8217; comme répertoire de travail.<br />
Ci-dessous une arbo type, il s&#8217;agit surtout de conventions, libre à vous de l&#8217;adapter.</p>
<pre>
yum
├── base
│   └── [Distrib_version]
│       └── [arch]
│           ├── mydemo-1.0-1.noarch.rpm
│           └── repodata
│               ├── filelists.xml.gz
│               ├── other.xml.gz
│               ├── primary.xml.gz
│               └── repomd.xml
└── updates
    └── [Distrib_version]
        └── [arch]
            ├── mydemo-1.0-2.noarch.rpm
            └── repodata
                ├── filelists.xml.gz
                ├── other.xml.gz
                ├── primary.xml.gz
                └── repomd.xml
</pre>
<p>&nbsp;<br />
Création de l&#8217;arborescence sour Fedora 11 pour les packages &#8216;noarch&#8217; :</p>
<pre>mkdir -p /var/www/html/yum/{base,updates}/11/noarch</pre>
<p>C&#8217;est tout, le répertoire <strong>repodata</strong> sera généré automatiquement plus tard.</p>
<h3>2. Initialisation du repository</h3>
<p>Il faut d&#8217;abord copier les Rpm que vous souhaitez mettre à dispo dans le répertoire &#8216;/var/www/html/yum/base/11/noarch/&#8217; par exemple puis éxécuter l&#8217;utilitaire <strong>createrepo</strong>:</p>
<pre>
createrepo /var/www/html/yum/base/11/noarch
createrepo /var/www/html/yum/updates/11/noarch
</pre>
<p>&nbsp;<br />
La mise à jour se fera en lançant :</p>
<pre>createrepo --update /var/www/html/yum/updates/11/noarch</pre>
<p>&nbsp;</p>
<p><em>La création des Rpm noarch fera l&#8217;objet d&#8217;un autre post.</em></p>
<h3>3. Configuration d&#8217;Apache</h3>
<p>Ci-dessous vous trouverez un exemple de virtual host.<br />
cat /etc/httpd/conf.d/repo.conf </p>
<pre>
&lt;VirtualHost _default_:80&gt;
    DocumentRoot /var/www/html/yum/
    ServerName repo.mydomain.tld
    ErrorLog logs/repo.l-error_log
    CustomLog logs/repo.l-access_log common
&lt;/VirtualHost&gt;

&lt;Directory /var/www/html/yum/&gt;
  AllowOverride FileInfo AuthConfig Limit
  Options Indexes SymLinksIfOwnerMatch IncludesNoExec
&lt;/Directory&gt;
</pre>
<p>&nbsp;<br />
Relancer Apache.</p>
<h3>4. Configuration côté client</h3>
<p>Pour utiliser notre nouveau repository côté client, il faut définir un fichier decripteur dans <strong>/etc/yum.repos.d/</strong><br />
Par exemple &#8216;my_fresh.repo&#8217; :</p>
<pre>
[base-fresh]
name= Fedora $releasever - noarch - Base
baseurl=http://repo.mydomain.tld/base/$releasever/noarch/
enabled=1
gpgcheck=0

[updates-fresh]
name=Fedora $releasever - noarch - Updates
baseurl=http://repo.mydomain.tld/updates/$releasever/noarch/
enabled=1
gpgcheck=0
</pre>
<p>&nbsp;<br />
Voilà, nous sommes fin prêt à déployer nos web app ! Dans un prochain poste je montrerai comment créér des Rpm.</p>
<h3>5. Pour aller plus loin</h3>
<p>Avoir son repo peut être aussi pratique pour se faire un mirroir de la distrib officielle. <br />
Il peut être utile de signer le repo pour plus de sécurité.</p>
<h3>Sources</h3>
<ul>
<li><a href="http://yum.baseurl.org/">Yum</a></li>
<li><a href="http://www.charlescurley.com/yum/repository.html">Building a Yum Repository</a></li>
<li><a href="http://sathyasays.com/2008/06/22/creating-your-own-yum-repository/">Creating your own yum repository</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://proj3ct.org/blog/2010/11/07/creer-son-propre-repository-yum/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Installation de Teambox sur Centos</title>
		<link>http://proj3ct.org/blog/2010/08/06/installation-de-teambox-sur-centos/</link>
		<comments>http://proj3ct.org/blog/2010/08/06/installation-de-teambox-sur-centos/#comments</comments>
		<pubDate>Fri, 06 Aug 2010 09:54:27 +0000</pubDate>
		<dc:creator>aer0</dc:creator>
				<category><![CDATA[dev]]></category>
		<category><![CDATA[collaboration]]></category>
		<category><![CDATA[gestion de projet]]></category>
		<category><![CDATA[howto]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://proj3ct.org/blog/?p=181</guid>
		<description><![CDATA[Toujours à la recherche d&#8217;un outils de collaboration et de gestion de projet qui me convienne, j&#8217;ai entendu parler de Teambox (merci Twitter au passage :p). Leur screencast m&#8217;a mis l&#8217;eau à la bouche et j&#8217;ai décidé d&#8217;essayer. Bien qu&#8217;il y ai une souscription gratuite dans leur offre, j&#8217;ai préféré tenter l&#8217;aventure en installant le [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://proj3ct.org/blog/wp-content/uploads/2010/08/teambox.png"><img src="http://proj3ct.org/blog/wp-content/uploads/2010/08/teambox.png" alt="Teambox.com" width="300" height="250" class="alignleft size-full wp-image-182" /></a> Toujours à la recherche d&#8217;un outils de collaboration et de gestion de projet qui me convienne, j&#8217;ai entendu parler de <a href="http://teambox.com/">Teambox</a> (merci Twitter au passage :p). Leur screencast m&#8217;a mis l&#8217;eau à la bouche et j&#8217;ai décidé d&#8217;essayer.</p>
<p>Bien qu&#8217;il y ai une souscription gratuite dans leur offre, j&#8217;ai préféré tenter l&#8217;aventure en installant le tout sur un serveur. J&#8217;aime bien voir l&#8217;envers du décors <img src='http://proj3ct.org/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> . Et bien l&#8217;envers du décors, on peut dire que je l&#8217;ai vu de près <img src='http://proj3ct.org/blog/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> .<br />Ne connaissant rien à <a href="http://ruby-lang.org/">Ruby</a> et son éco-système, l&#8217;installation à été un peu laborieuse. Il a fallu jongler avec les différentes versions de ruby et ses outils. Centos n&#8217;étant pas à la page niveau version de ruby, j&#8217;ai du passer par les sources.<br />Au final, ça tourne bien.</p>
<p>Pour les curieux, voilà les différentes étapes par lesquelles je suis passé. Pour info, l&#8217;OS du serveur sur lequel j&#8217;ai travaillé et Centos 5.4 64bits.</p>
<h3>Installation</h3>
<p>On commence par installé les sources des dépendance nécessaire à la compilation :<br />
<code style="font-size: small"><br />
yum install ImageMagick<br />
yum install libxml2-devel libxslt-devel<br />
yum install mysql-devel postgresql-devel sqlite-devel<br />
</code><br />
Compilation de Ruby :<br />
<code style="font-size: small"><br />
wget http://ftp.ruby-lang.org/pub/ruby/1.8/ruby-1.8.7.tar.gz<br />
tar -zxvf ruby-1.8.7.tar.gz<br />
cd ruby-1.8.7<br />
./configure --with-openssl-dir=/usr/lib64/openssl<br />
make<br />
make install<br />
</code><br />
<code style="font-size: small"><br />
wget http://rubyforge.org/frs/download.php/69365/rubygems-1.3.7.tgz<br />
tar -zxvf rubygems-1.3.7.tgz<br />
cd rubygems-1.3.7<br />
ruby setup.rb<br />
</code><br />
<code style="font-size: small"><br />
gem install bundler -v '~&gt; 1.0.0.rc'<br />
</code><br />
Download de Teambox et installation :<br />
<code style="font-size: small"><br />
git clone git://github.com/teambox/teambox.git /opt/teambox<br />
cd /opt/teambox<br />
bundle install<br />
</code><br />
Installation du framework Rails, le fameux RoR.<br />
<code style="font-size: small"><br />
gem install rails<br />
</code><br />
Création de la base de donnée, et configuration :<br />
<code style="font-size: small"><br />
vi teambox/config/database.yml<br />
rake db:create db:schema:load RAILS_ENV=production<br />
</code><br />
Lancement de teambox sur le port 3000 :<br />
<code style="font-size: small"><br />
script/server -e production<br />
</code><br />
A partir de là, j&#8217;ai eu un problème de chargement des fichiers javascript et css. Les requêtes sur ces fichiers se faisaient sur le port 80. Dans le cas ou l&#8217;on souhaite utiliser Apache, la modification suivante n&#8217;a pas lieu d&#8217;être. J&#8217;ai quand même modifier provisoirement la ligne 30 du fichier &#8216;config/environments/production.rb&#8217; en ajoutant le port 3000 après le domaine. Ce n&#8217;est certainement pas la meilleur façon de faire mais pour mes tests cela a suffit.<br />La prochaine étape consiste à utiliser le mod_passenger d&#8217;apache.</p>
<h3>Configuration d&#8217;apache</h3>
<p>Installation du mode passenger. Il suffit de suivre les instruction affichées.<br />
<code style="font-size: small"><br />
gem install passenger<br />
passenger-install-apache2-module<br />
</code><br />
Activer le mod_passenger en créant par exemple un fichier &#8216;/etc/httpd/conf.d/passenger.conf&#8217; et en ajoutant la ligne suivante.<br />
<code style="font-size: small"><br />
LoadModule passenger_module /usr/lib/ruby/gems/1.8/gems/passenger-2.2.11/ext/apache2/mod_passenger.so<br />
</code><br />
Créer un virtual host &#8216;/etc/httpd/conf.d/teambox.conf&#8217;.<br />
<code style="font-size: small"><br />
&lt;VirtualHost *:80&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;Options +Indexes<br />
&nbsp;&nbsp;&nbsp;&nbsp;ServerAdmin me@mydomain.com<br />
&nbsp;&nbsp;&nbsp;&nbsp;ServerName teambox.mydomain.com<br />
&nbsp;&nbsp;&nbsp;&nbsp;DocumentRoot /opt/teambox/public<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;Directory /opt/teambox/public&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;Options Indexes FollowSymLinks<br />
&nbsp;&nbsp;&nbsp;&nbsp;AllowOverride All<br />
&nbsp;&nbsp;&nbsp;&nbsp;Order allow,deny<br />
&nbsp;&nbsp;&nbsp;&nbsp;Allow from all<br />
&nbsp;&nbsp;&nbsp;&nbsp;Options -MultiViews<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/Directory&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;RailsEnv production<br />
&lt;/VirtualHost&gt;<br />
</code></p>
<p>Après un restart d&#8217;Apache le sous domaine &#8216;teambox.mydomain.com&#8217; devrait être accessible. En ce qui me concerne j&#8217;avais une belle erreur de Passenger, joliment habillé, avec le traceback et tout et tout&#8230; dont voici le détails :<br />
<code style="font-size: small"><br />
Ruby on Rails application could not be started<br />
git://github.com/mislav/tolk.git (at master) is not checked out. Please run `bundle install` (Bundler::PathError)<br />
PhusionPassenger::UnknownError<br />
...<br />
</code></p>
<p>En cherchant un peu sur le net j&#8217;ai trouvé un workaround. Dans &#8216;/opt/teambox&#8217; éxécuter les deux commandes suivantes :<br />
<code style="font-size: small"><br />
bundle install --production<br />
chmod -R 777 vendor/bundle<br />
</code></p>
<p>Et voilà !</p>
<h3>Ressources</h3>
<p><a href="http://teambox.com/public/teambox/installing">Teambox community</a> qui référence les guides d&#8217;installation.<br />
Un <a href="http://wiki.mediatemple.net/w/Nginx_on_thin_rails">guide d&#8217;installation de Ruby</a> sous Centos<br />
Un <a href="http://wiki.mediatemple.net/index.php/Installing_Teambox">guide d&#8217;installation de Teambox</a><br />
Le <a href="http://blog.teambox.com/">blog officiel</a></p>
]]></content:encoded>
			<wfw:commentRss>http://proj3ct.org/blog/2010/08/06/installation-de-teambox-sur-centos/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Wikileaks</title>
		<link>http://proj3ct.org/blog/2010/08/03/wikileaks/</link>
		<comments>http://proj3ct.org/blog/2010/08/03/wikileaks/#comments</comments>
		<pubDate>Mon, 02 Aug 2010 23:25:39 +0000</pubDate>
		<dc:creator>aer0</dc:creator>
				<category><![CDATA[internet]]></category>
		<category><![CDATA[interview]]></category>

		<guid isPermaLink="false">http://proj3ct.org/blog/?p=158</guid>
		<description><![CDATA[Une interview de Julian Assange rédacteur en chef de wikileaks.com afin de mieux saisir la portée de leurs actions.]]></description>
			<content:encoded><![CDATA[<p>Une interview de <a href="http://en.wikipedia.org/wiki/Julian_Assange">Julian Assange</a> rédacteur en chef de <a href="http://www.wikileaks.com/">wikileaks.com</a> afin de mieux saisir la portée de leurs actions. </p>
<p><object width="446" height="326"><param name="movie" value="http://video.ted.com/assets/player/swf/EmbedPlayer.swf"></param><param name="allowFullScreen" value="true" /><param name="allowScriptAccess" value="always"/><param name="wmode" value="transparent"></param><param name="bgColor" value="#ffffff"></param><param name="flashvars" value="vu=http://video.ted.com/talks/dynamic/JulianAssange_2010G-medium.flv&#038;su=http://images.ted.com/images/ted/tedindex/embed-posters/JulianAssange-2010G.embed_thumbnail.jpg&#038;vw=432&#038;vh=240&#038;ap=0&#038;ti=918&#038;introDuration=15330&#038;adDuration=4000&#038;postAdDuration=830&#038;adKeys=talk=julian_assange_why_the_world_needs_wikileaks;year=2010;theme=a_taste_of_tedglobal_2010;theme=media_that_matters;theme=war_and_peace;theme=new_on_ted_com;event=TEDGlobal+2010;&#038;preAdTag=tconf.ted/embed;tile=1;sz=512x288;" /><embed src="http://video.ted.com/assets/player/swf/EmbedPlayer.swf" pluginspace="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" wmode="transparent" bgColor="#ffffff" width="446" height="326" allowFullScreen="true" allowScriptAccess="always" flashvars="vu=http://video.ted.com/talks/dynamic/JulianAssange_2010G-medium.flv&#038;su=http://images.ted.com/images/ted/tedindex/embed-posters/JulianAssange-2010G.embed_thumbnail.jpg&#038;vw=432&#038;vh=240&#038;ap=0&#038;ti=918&#038;introDuration=15330&#038;adDuration=4000&#038;postAdDuration=830&#038;adKeys=talk=julian_assange_why_the_world_needs_wikileaks;year=2010;theme=a_taste_of_tedglobal_2010;theme=media_that_matters;theme=war_and_peace;theme=new_on_ted_com;event=TEDGlobal+2010;"></embed></object></p>
]]></content:encoded>
			<wfw:commentRss>http://proj3ct.org/blog/2010/08/03/wikileaks/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Php stream pour parser un fichier un compressé</title>
		<link>http://proj3ct.org/blog/2010/07/08/php-stream-pour-parser-un-fichier-un-compresse/</link>
		<comments>http://proj3ct.org/blog/2010/07/08/php-stream-pour-parser-un-fichier-un-compresse/#comments</comments>
		<pubDate>Wed, 07 Jul 2010 22:18:11 +0000</pubDate>
		<dc:creator>aer0</dc:creator>
				<category><![CDATA[dev]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[archive]]></category>
		<category><![CDATA[command line]]></category>
		<category><![CDATA[shell]]></category>

		<guid isPermaLink="false">http://proj3ct.org/blog/?p=93</guid>
		<description><![CDATA[J&#8217;ai été récemment ammené à parser un nombre important de fichiers de log compressés avec Gzip. Je voulais traiter chaque fichier à la volée, ne pas avoir à écrire chaque fichier décompressé. Pour ce dernier point, rien de plus simple, il suffit d&#8217;utiliser les options &#8220;-cd&#8221; de gzip qui permettent de décompresser et de rediriger [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://proj3ct.org/blog/wp-content/uploads/2010/07/php_code.gif"><img class="alignleft size-full wp-image-94" src="http://proj3ct.org/blog/wp-content/uploads/2010/07/php_code.gif" alt="" width="300" height="250" /></a>J&#8217;ai été récemment ammené à parser un nombre important de fichiers de log compressés avec <a title="wikipedia" href="http://en.wikipedia.org/wiki/Gzip">Gzip</a>.</p>
<p>Je voulais traiter chaque fichier à la volée, ne pas avoir à écrire chaque fichier décompressé. Pour ce dernier point, rien de plus simple, il suffit d&#8217;utiliser les options &#8220;-cd&#8221; de gzip qui permettent de décompresser et de rediriger vers la sortie standard.</p>
<p>Voici ce à quoi je voulais arriver :<br />
<code style="font-size: small;">user@hostname$ gzip -cd mon_fichier_de_log.gz | ./parser.php</code></p>
<p>Concernant le parser PHP, j&#8217;ai utilisé les <a title="php.net" href="http://php.net/manual/en/wrappers.php.php">streams</a> qui permettent notament de récupérer ce qui est écrit sur la sortie standard (comme ça tombre bien, n&#8217;est ce pas <img src='http://proj3ct.org/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> ).</p>
<h3>La version simple</h3>
<p></p>
<h4>1. Le traitement du flux</h4>
<p><code style="font-size: small;"><br />
<span style="color: #000000"><br />
<span style="color: #0000BB">&lt;?php&nbsp;<br />$input&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">fopen</span><span style="color: #007700">(</span><span style="color: #DD0000">'php://stdin'</span><span style="color: #007700">,&nbsp;</span><span style="color: #DD0000">'r'</span><span style="color: #007700">);&nbsp;</span><span style="color: #FF8000">//&nbsp;ouverture&nbsp;du&nbsp;flux<br /></span><span style="color: #007700">while&nbsp;(!</span><span style="color: #0000BB">feof</span><span style="color: #007700">(</span><span style="color: #0000BB">$input</span><span style="color: #007700">))&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">$line&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">fgets</span><span style="color: #007700">(</span><span style="color: #0000BB">$input</span><span style="color: #007700">);&nbsp;</span><span style="color: #FF8000">//&nbsp;lecture&nbsp;ligne&nbsp;par&nbsp;ligne<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">parse</span><span style="color: #007700">(</span><span style="color: #0000BB">$line</span><span style="color: #007700">);&nbsp;</span><span style="color: #FF8000">//&nbsp;ma&nbsp;fonction&nbsp;pour&nbsp;parser&nbsp;<br /></span><span style="color: #007700">}<br /></span><span style="color: #0000BB">fclose</span><span style="color: #007700">(</span><span style="color: #0000BB">$input</span><span style="color: #007700">);&nbsp;</span><span style="color: #FF8000">//&nbsp;fermeture&nbsp;du&nbsp;flux</span><br />
</span><br />
</code></p>
<h4>2. Rendre le script php exécutable</h4>
<p>Définir le bang dans le script PHP :<br />
<code style="font-size: small;"><span style="color: #000000;"><br />
<span style="color: #0000bb;">#!/usr/bin/php<br />
&lt;?php </span></span><br />
</code><br />
Fixer l&#8217;attribut exécutable :<br />
<code style="font-size: small;">user@hostname$ chmod +x parser.php</code></p>
<h4>3. L&#8217;exécution</h4>
<p><code style="font-size: small;">user@hostname$ gzip -cd mon_fichier_de_log.gz | ./parser.php</code></p>
<h3>Une version plus complète</h3>
<p>
CI-dessous une version plus structurée, facilement extensible dans laquelle il est possible d&#8217;appliquer plusieurs traitement.<br />
<code style="font-size: small;"><span style="color: #000000"><span style="color: #0000BB">&lt;?php</p>
<p></span><span style="color: #007700">interface&nbsp;</span><span style="color: #0000BB">ICommandBuilder&nbsp;</span><span style="color: #007700">{<br />&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;function&nbsp;</span><span style="color: #0000BB">addCommand</span><span style="color: #007700">(</span><span style="color: #0000BB">ICommand&nbsp;$command</span><span style="color: #007700">);<br />}</p>
<p>interface&nbsp;</span><span style="color: #0000BB">ICommand&nbsp;</span><span style="color: #007700">{<br />&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;function&nbsp;</span><span style="color: #0000BB">run</span><span style="color: #007700">(</span><span style="color: #0000BB">$str</span><span style="color: #007700">);<br />&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;function&nbsp;</span><span style="color: #0000BB">finalize</span><span style="color: #007700">();<br />}</p>
<p></span><span style="color: #FF8000">/**<br />&nbsp;*&nbsp;Read&nbsp;input&nbsp;on&nbsp;stdin&nbsp;and&nbsp;call&nbsp;a&nbsp;list&nbsp;of&nbsp;ICommand&nbsp;on&nbsp;each&nbsp;readed&nbsp;line.<br />&nbsp;*/<br /></span><span style="color: #007700">class&nbsp;</span><span style="color: #0000BB">Phpipe&nbsp;</span><span style="color: #007700">implements&nbsp;</span><span style="color: #0000BB">ICommandBuilder&nbsp;</span><span style="color: #007700">{<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">/**<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Worker&nbsp;list,&nbsp;all&nbsp;workers&nbsp;are&nbsp;called&nbsp;for&nbsp;each&nbsp;readed&nbsp;line.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@var&nbsp;array&nbsp;of&nbsp;ICommand&nbsp;object<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #007700">protected&nbsp;</span><span style="color: #0000BB">$worker&nbsp;</span><span style="color: #007700">=&nbsp;array();<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;function&nbsp;</span><span style="color: #0000BB">__contruct</span><span style="color: #007700">()&nbsp;{}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">/**<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Append&nbsp;a&nbsp;new&nbsp;worker<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;ICommand&nbsp;$command<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@return&nbsp;self<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #007700">public&nbsp;function&nbsp;</span><span style="color: #0000BB">addCommand</span><span style="color: #007700">(</span><span style="color: #0000BB">ICommand&nbsp;$command</span><span style="color: #007700">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">array_push</span><span style="color: #007700">(</span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">worker</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">$command</span><span style="color: #007700">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;</span><span style="color: #0000BB">$this</span><span style="color: #007700">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">/**<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Read&nbsp;stdin&nbsp;until&nbsp;feof<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #007700">public&nbsp;function&nbsp;</span><span style="color: #0000BB">read</span><span style="color: #007700">()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">$input&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">fopen</span><span style="color: #007700">(</span><span style="color: #DD0000">'php://stdin'</span><span style="color: #007700">,&nbsp;</span><span style="color: #DD0000">'r'</span><span style="color: #007700">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">$exclude&nbsp;</span><span style="color: #007700">=&nbsp;array();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;(!</span><span style="color: #0000BB">feof</span><span style="color: #007700">(</span><span style="color: #0000BB">$input</span><span style="color: #007700">))&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">$line&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">fgets</span><span style="color: #007700">(</span><span style="color: #0000BB">$input</span><span style="color: #007700">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foreach(</span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">worker&nbsp;</span><span style="color: #007700">as&nbsp;</span><span style="color: #0000BB">$worker</span><span style="color: #007700">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">$worker</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">run</span><span style="color: #007700">(</span><span style="color: #0000BB">$line</span><span style="color: #007700">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">fclose</span><span style="color: #007700">(</span><span style="color: #0000BB">$input</span><span style="color: #007700">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">finalize</span><span style="color: #007700">();<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #FF8000">/**<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Call&nbsp;all&nbsp;ICommand::finalize<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #007700">protected&nbsp;function&nbsp;</span><span style="color: #0000BB">finalize</span><span style="color: #007700">()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foreach(</span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">worker&nbsp;</span><span style="color: #007700">as&nbsp;</span><span style="color: #0000BB">$worker</span><span style="color: #007700">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">$worker</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">finalize</span><span style="color: #007700">();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />}</p>
<p></span><span style="color: #FF8000">/**<br />&nbsp;*&nbsp;ICommand&nbsp;Null&nbsp;pattern<br />&nbsp;*/<br /></span><span style="color: #007700">class&nbsp;</span><span style="color: #0000BB">LineNull&nbsp;</span><span style="color: #007700">implements&nbsp;</span><span style="color: #0000BB">ICommand&nbsp;</span><span style="color: #007700">{<br />&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;function&nbsp;</span><span style="color: #0000BB">run</span><span style="color: #007700">(</span><span style="color: #0000BB">$str</span><span style="color: #007700">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;function&nbsp;</span><span style="color: #0000BB">finalize</span><span style="color: #007700">()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}&nbsp;</p>
<p></span><span style="color: #FF8000">/**<br />&nbsp;*&nbsp;ICommand&nbsp;Set&nbsp;line&nbsp;number&nbsp;and&nbsp;echo&nbsp;line.<br />&nbsp;*/<br /></span><span style="color: #007700">class&nbsp;</span><span style="color: #0000BB">LineEcho&nbsp;</span><span style="color: #007700">implements&nbsp;</span><span style="color: #0000BB">ICommand&nbsp;</span><span style="color: #007700">{<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;function&nbsp;</span><span style="color: #0000BB">run</span><span style="color: #007700">(</span><span style="color: #0000BB">$str</span><span style="color: #007700">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;!isset(</span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">i</span><span style="color: #007700">)&nbsp;?&nbsp;&nbsp;</span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">i&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #0000BB">0&nbsp;</span><span style="color: #007700">:&nbsp;</span><span style="color: #0000BB">null</span><span style="color: #007700">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;++</span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">i</span><span style="color: #007700">,&nbsp;</span><span style="color: #DD0000">':&nbsp;'</span><span style="color: #007700">,&nbsp;</span><span style="color: #0000BB">$str</span><span style="color: #007700">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;function&nbsp;</span><span style="color: #0000BB">finalize</span><span style="color: #007700">()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;</span><span style="color: #DD0000">"\n"</span><span style="color: #007700">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />}&nbsp;</p>
<p></span><span style="color: #FF8000">/**<br />&nbsp;*&nbsp;ICommand&nbsp;Echo&nbsp;each&nbsp;line&nbsp;reversed.<br />&nbsp;*/<br /></span><span style="color: #007700">class&nbsp;</span><span style="color: #0000BB">LineReverse&nbsp;</span><span style="color: #007700">implements&nbsp;</span><span style="color: #0000BB">ICommand&nbsp;</span><span style="color: #007700">{<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;function&nbsp;</span><span style="color: #0000BB">run</span><span style="color: #007700">(</span><span style="color: #0000BB">$str</span><span style="color: #007700">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;</span><span style="color: #0000BB">strrev</span><span style="color: #007700">(</span><span style="color: #0000BB">trim</span><span style="color: #007700">(</span><span style="color: #0000BB">$str</span><span style="color: #007700">)).</span><span style="color: #DD0000">"\n"</span><span style="color: #007700">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;function&nbsp;</span><span style="color: #0000BB">finalize</span><span style="color: #007700">()&nbsp;{}<br />}</p>
<p></span><span style="color: #FF8000">/**<br />&nbsp;*&nbsp;ICommand&nbsp;Append&nbsp;each&nbsp;line&nbsp;in&nbsp;a&nbsp;buffer.&nbsp;Buffer&nbsp;is&nbsp;echoed&nbsp;on&nbsp;finalieze()&nbsp;call.&nbsp;<br />&nbsp;*/<br /></span><span style="color: #007700">class&nbsp;</span><span style="color: #0000BB">LineBuffer&nbsp;</span><span style="color: #007700">implements&nbsp;</span><span style="color: #0000BB">ICommand&nbsp;</span><span style="color: #007700">{<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;</span><span style="color: #0000BB">$buffer&nbsp;</span><span style="color: #007700">=&nbsp;</span><span style="color: #DD0000">''</span><span style="color: #007700">;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;function&nbsp;</span><span style="color: #0000BB">run</span><span style="color: #007700">(</span><span style="color: #0000BB">$str</span><span style="color: #007700">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">buffer&nbsp;</span><span style="color: #007700">.=&nbsp;</span><span style="color: #0000BB">$str</span><span style="color: #007700">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;function&nbsp;</span><span style="color: #0000BB">finalize</span><span style="color: #007700">()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;</span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">buffer</span><span style="color: #007700">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}</p>
<p></span><span style="color: #0000BB">$worker&nbsp;</span><span style="color: #007700">=&nbsp;new&nbsp;</span><span style="color: #0000BB">LineEcho</span><span style="color: #007700">;</p>
<p></span><span style="color: #0000BB">$phpipe&nbsp;</span><span style="color: #007700">=&nbsp;new&nbsp;</span><span style="color: #0000BB">Phpipe</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$phpipe</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">addCommand</span><span style="color: #007700">(new&nbsp;</span><span style="color: #0000BB">LineNull</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;-&gt;</span><span style="color: #0000BB">addCommand</span><span style="color: #007700">(</span><span style="color: #0000BB">$worker</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;-&gt;</span><span style="color: #0000BB">addCommand</span><span style="color: #007700">(new&nbsp;</span><span style="color: #0000BB">LineReverse</span><span style="color: #007700">)<br />&nbsp;&nbsp;&nbsp;&nbsp;-&gt;</span><span style="color: #0000BB">addCommand</span><span style="color: #007700">(new&nbsp;</span><span style="color: #0000BB">LineBuffer</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">$phpipe</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">read</span><span style="color: #007700">();</p>
<p>echo&nbsp;</span><span style="color: #DD0000">"terminated\n"</span><span style="color: #007700">;<br /></span><br />
</span></code></p>
<h3>Pour aller plus loin</h3>
<ul>
<li>Permettre la sélection du flux en entrée</li>
<li>Utiliser les stream de filtrage</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://proj3ct.org/blog/2010/07/08/php-stream-pour-parser-un-fichier-un-compresse/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>J&#8217;héberge mon compte OpenID en 5 minutes</title>
		<link>http://proj3ct.org/blog/2010/06/06/jheberge-mon-compte-openid-en-5-minutes/</link>
		<comments>http://proj3ct.org/blog/2010/06/06/jheberge-mon-compte-openid-en-5-minutes/#comments</comments>
		<pubDate>Sun, 06 Jun 2010 19:19:19 +0000</pubDate>
		<dc:creator>aer0</dc:creator>
				<category><![CDATA[dev]]></category>
		<category><![CDATA[internet]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[howto]]></category>
		<category><![CDATA[openid]]></category>

		<guid isPermaLink="false">http://proj3ct.org/blog/?p=45</guid>
		<description><![CDATA[OpenID permet d&#8217;utiliser le même crédential pour s&#8217;authentifier sur des sites différents. Plus besoin de créer un compte sur chaque service en ligne que l&#8217;on souhaite utiliser. Autre avantage, OpenId fonctionne de manière décentralisée et n&#8217;importe qui peut devenir son propre &#8220;hébergeur&#8221;. Et ça tombe plutôt bien, c&#8217;est ce qu&#8217;on va mettre en place grâce [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://proj3ct.org/blog/wp-content/uploads/2010/06/openid-large.png"><img class="alignleft size-full wp-image-49" src="http://proj3ct.org/blog/wp-content/uploads/2010/06/openid-large.png" alt="OpenID-large" width="300" height="250" /></a>OpenID permet d&#8217;utiliser le même crédential pour s&#8217;authentifier sur des sites différents. Plus besoin de créer un compte sur chaque service en ligne que l&#8217;on souhaite utiliser. Autre avantage, OpenId fonctionne de manière décentralisée et n&#8217;importe qui peut devenir son propre &#8220;hébergeur&#8221;. Et ça tombe plutôt bien, c&#8217;est ce qu&#8217;on va mettre en place grâce à la librairie <a href="http://siege.org/projects/phpMyID">phpMyId</a>.</p>
<p>Premièrement, récupérer les fichier MyID.config.php et MyID.php sur <a href="http://github.com/sionide21/phpMyId">github</a>, seul le premier fichier sera à éditer.</p>
<h4>1. Modifier le fichier de configuration</h4>
<p>Ci-dessous les 4 champs à personnaliser.<br />
<code style="font-size:small"><br />
'auth_username' =&gt; 'votre_login',<br />
'auth_password' =&gt; 'hash',<br />
'auth_realm'    =&gt; 'phpMyID',<br />
'idp_url'       =&gt; 'http://monblog.tld/openid/',<br />
</code></p>
<ul>
<li><strong>auth_username</strong> correspond simplement au login que vous souhiatez utiliser.</li>
<li><strong>auth_password</strong> correpsond au hash (md5) du tuple : &#8216;login:realm:votre_password&#8217;. Voilà comment le créer sous linux :</li>
</ul>
<p><code style="font-size:small">echo -n 'votre_login:phpMyID:votre_password' | openssl md5</code></p>
<p>C&#8217;est donc le hash généré par la commande précédente qui est renseigné dans &#8216;<strong>auth_password</strong>&#8216;.</p>
<ul>
<li><strong>auth_realm</strong> est utilisé dans la génération du hash. Libre à vous de le modifier ou de le laisser tel quel.<br />
<strong>idp_url</strong> est l&#8217;url dans lesquels nous avons déposé les scripts.</li>
</ul>
<h4>2. Upload</h4>
<p>Pour notre exemple, nous avons spécifié &#8216;http://monblog.tld/openid/&#8217; comme url. Nous uploadons donc dans le répertoire &#8216;openid&#8217; les deux fichiers. Nous pouvons renommer &#8216;MyID.config.php&#8217; afin de simplifier l&#8217;url d&#8217;accès.</p>
<p>Nous avons donc :<br />
<code style="font-size:small"><br />
/openid/index.php<br />
/openid/MyID.php<br />
</code></p>
<h4>3. Récupérer son identité</h4>
<p>Arrivé à cette étape, vous pouvez utiliser &#8216;http://monblog.tld/openid/&#8217; comme url  de login. C&#8217;est bien, mais c&#8217;est pas top <img src='http://proj3ct.org/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> . Nous allons modifiez une page existente, afin de la faire pointer vers l&#8217;authentification OpenID. Outre le fait qu&#8217;on peut choisir une url plus simple, cette manipulation a l&#8217;avantage de découpler l&#8217;url que l&#8217;on donne de celle qui fait réellement le boulot.<br />
Cela permettra par exemple de changer de provider OpenID de manière totalement transparente.</p>
<p>Voici les deux lignes à ajouter en header de votre blog par exemple :<br />
<code style="font-size:small">&lt;link rel="openid.server" href="<strong>http://monblog.tld/openid/</strong>" /&gt;<br />
&lt;link rel="openid.delegate" href="<strong><strong>http://monblog.tld/openid/</strong></strong>" /&gt;<br />
</code></p>
<p>Voilà, vous pouvez utiliser &#8216;http://monblog.tld/&#8217; pour vous authentifier sur les sites supportant OpenID.</p>
<h4>4. Pour aller plus loin</h4>
<p>Nous n&#8217;avons fait que survoler les grands principes d&#8217;OpenID, je vous invite à consulter le site <a href="http://openid.net">officiel [en]</a> pour une description détaillée des processus sous-jacents et des possiblités offertes.<br />
Il est par exemple possible de rattacher un profile ou encore un avatar à votre compte.</p>
<h4>5. Sources et liens utiles</h4>
<ul>
<li>Le site officiel <a href="http://openid.net/get-an-openid/">OpenId [en]</a> pour comprendre en détails les mécanismes.</li>
<li>Une liste de <a href="http://openid.net/developers/libraries/">librairies OpenID</a>.</li>
<li>Le tutoriel <a href="http://www.intertwingly.net/blog/2007/01/03/OpenID-for-non-SuperUsers">&#8220;OpenID-for-non-SuperUsers&#8221; [en]</a> sur lequel je me suis appuyé.</li>
<li> Le site officiel du projet <a href="http://siege.org/projects/phpMyID">phpMyId</a> (plus mis à jour).</li>
<li> Le <a href="http://github.com/sionide21/phpMyId">code source phpMyId</a> hébergée sur github</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://proj3ct.org/blog/2010/06/06/jheberge-mon-compte-openid-en-5-minutes/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Premiers pas avec le HTC Dream</title>
		<link>http://proj3ct.org/blog/2009/04/06/premiers-pas-avec-le-htc-dream/</link>
		<comments>http://proj3ct.org/blog/2009/04/06/premiers-pas-avec-le-htc-dream/#comments</comments>
		<pubDate>Sun, 05 Apr 2009 23:01:11 +0000</pubDate>
		<dc:creator>aer0</dc:creator>
				<category><![CDATA[android]]></category>
		<category><![CDATA[mobile]]></category>
		<category><![CDATA[google]]></category>

		<guid isPermaLink="false">http://proj3ct.org/blog/?p=36</guid>
		<description><![CDATA[Que de chemin parcouru depuis l&#8217;Android Developer Challenge. Aprés avoir passé tant de temps sur l&#8217;émulateur, il est plutôt agréable de voir enfin tourner Android sur un vrai terminal. Ca ne fait que quelques jours que je l&#8217;ai entre les mains, et malgrés les quelques défauts (introduits par Orange ?) comme l&#8217;apostrophe manquante ou la [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-medium wp-image-37" src="http://proj3ct.org/blog/wp-content/uploads/2009/04/htc-dream-300x250.jpg" alt="htc-dream" width="300" height="250" />Que de chemin parcouru depuis l&#8217;<a href="http://android-developers.blogspot.com/search/label/Android%20Developer%20Challenge" target="_blank">Android Developer Challenge</a>. Aprés avoir passé tant de temps sur l&#8217;émulateur, il est plutôt agréable de voir enfin tourner Android sur un vrai terminal. Ca ne fait que quelques jours que je l&#8217;ai entre les mains, et malgrés les quelques défauts (introduits par Orange ?) comme l&#8217;<a href="http://www.frandroid.com/1745/rajouter-lapostrophe-sans-attendre-quorange-se-bouge" target="_blank">apostrophe manquante</a> ou la <a href="http://www.frandroid.com/1642/orange-fait-nimporte-quoi-avec-android" target="_blank">synchronisation bridée</a> (provisoirement semble t il), j&#8217;en suis assez satisfait.</p>
<p>Comme je le disais, j&#8217;avais participé au concours Android, mais après la remise de l&#8217;application j&#8217;avais coupé les ponts. Trop frustrant sans téléphone sous la main :p.</p>
<p>Désormais, plus d&#8217;excuses, il est temps de reprendre le développement sur la platform mobile de Google. Téléchargement d&#8217;<a href="http://www.eclipse.org/downloads/" target="_blank">éclipse</a> (la version J2ee pour disposer des composants requis), installation du dernier <a href="http://developer.android.com/sdk/1.1_r1/index.html" target="_blank">SDK</a> et c&#8217;est parti. Premier changement visible, il y a maintenant un apperçu des layout (gain de temps en perspective <img src='http://proj3ct.org/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  ). Je laisse la configuration par défaut, crée un premier package.</p>
<p>Petit contre temps, la connection avec le G1 en USB sur ma Fedora ne marche pas. Bon, pas le temps de chercher, je récupère le mime type des .apk, upload de l&#8217;application sur le net et 1ère tentative d&#8217;installation. Echec <img src='http://proj3ct.org/blog/wp-includes/images/smilies/icon_neutral.gif' alt=':|' class='wp-smiley' />  Damned j&#8217;ai oublié de <a href="http://developer.android.com/guide/publishing/app-signing.html">signer l&#8217;application</a>. C&#8217;est assez simple, en deux lignes de commandes c&#8217;est réglé (je n&#8217;ai pas encore vu l&#8217;intégration dans éclipse). Upload à nouveau, installation réussie ! Et voilà, un beau &#8220;hello world&#8221; sur mon mobile.</p>
<p>Prochaines étapes, mise à niveau de l&#8217;application développée pour l&#8217;ADC et création de nouvelles applications.</p>
<p>To be continued&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://proj3ct.org/blog/2009/04/06/premiers-pas-avec-le-htc-dream/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Hadopi passée comme une lettre à la poste</title>
		<link>http://proj3ct.org/blog/2009/04/03/hadopi-passee-comme-une-lettre-a-la-poste/</link>
		<comments>http://proj3ct.org/blog/2009/04/03/hadopi-passee-comme-une-lettre-a-la-poste/#comments</comments>
		<pubDate>Thu, 02 Apr 2009 23:54:54 +0000</pubDate>
		<dc:creator>aer0</dc:creator>
				<category><![CDATA[internet]]></category>
		<category><![CDATA[démocratie]]></category>
		<category><![CDATA[hadopi]]></category>
		<category><![CDATA[liberté]]></category>
		<category><![CDATA[neutralité]]></category>

		<guid isPermaLink="false">http://proj3ct.org/blog/?p=29</guid>
		<description><![CDATA[Et voilà, c&#8217;en est fini de cette mascarade à l&#8217;Assemblée Nationale.  J&#8217;ai pu assister à quelques séances via les flux vidéos fournis sur le site de l&#8217;AN et ce qu&#8217;il en ressort n&#8217;est pas trés glorieux. Sur l&#8217;attitude du gouvernement et du rapporteur tout d&#8217;abord, mensonges éhontés (cf les pays étrangers qui ont soit disant [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.laquadrature.net/"><img class="alignleft size-full wp-image-30" src="http://proj3ct.org/blog/wp-content/uploads/2009/04/quadrature_black-out_hadopi_300x250px_fixed.gif" alt="quadrature_black-out_hadopi_300x250px_fixed" width="300" height="250" /></a> Et voilà, c&#8217;en est fini de cette mascarade à l&#8217;Assemblée Nationale.  J&#8217;ai pu assister à quelques séances via les flux vidéos fournis sur le site de l&#8217;AN et ce qu&#8217;il en ressort n&#8217;est pas trés glorieux.</p>
<p>Sur l&#8217;attitude du gouvernement et du rapporteur tout d&#8217;abord, mensonges éhontés (cf les pays étrangers qui ont soit disant adopté la riposte graduée), affirmations farfelues (cf France championne du monde du piratage, loi soutenue par tout le secteur des Télécom&#8230;), refus de répondre aux questions souvent précises et pertinentes. Méconnaissance totale des technologies informatiques (cf la gestion du spam, les pare feu etc). FUD à n&#8217;en plus finir sur internet, amalgame entre internautes, &#8220;pirates&#8221;, pédophiles, terroristes, amalgame entre p2p et pornographie et j&#8217;en passe. Politique de l&#8217;autruche face aux prises de position répétées de l&#8217;Europe. Et de manière générale l&#8217;autisme face aux rapports de toutes les autorités, que ce soit la CNIL ou d&#8217;autres. Petite note au passage, tous les députés UMP ne sont pas à mettre dans le même lôt.</p>
<p>Pour l&#8217;opposition, j&#8217;ai été surpris (en bien) par la maitrise de certains députés. Autre fait intérréssant, c&#8217;est le dialogue qui s&#8217;est instauré entre les internautes et certains députés (entre autres M. Brard pour ne pas le nommer). Ce dernier a lancé quelques appels en direct aux internautes pour les inciter à faire connaitre leur opinion au gouvernement. Il a également enrichi ses arguments à l&#8217;aide des correspondances qu&#8217;il a reçu ou des articles publiés sur les sites spécialisés. Cet aspect participatif est plutôt interressant à mon avis. Tout n&#8217;est pas rose pour autant, j&#8217;aurais aimé en voir plus d&#8217;une dizaine&#8230; D&#8217;ailleurs, c&#8217;etait bien vide, je ne parle même pas des 16 députés présent pour le vote final. C&#8217;est l&#8217;occasion de revenir aussi sur la prise de position plutôt flou du PS et leur manque d&#8217;engagement.</p>
<p>En parlant de site spécialisé, il n&#8217;y a semble t il qu&#8217;eux qui aient suivi de prés les débats. D&#8217;aprés les échos que j&#8217;ai eu les média traditionnels brillaient par leur absence. Parmis les sites qui ont fait un suivi soutenu, j&#8217;ai particulièrement utilisé <a title="PCInpact" href="http://www.pcinpact.com/s/hadopi.htm" target="_blank">PCInpact</a> et <a title="Numerama" href="http://hadopi.numerama.com/" target="_blank">Numerama</a>.</p>
<p>Et maintenant ? Et bien, la loi est votée, il ne reste plus qu&#8217;a la passer dans mains de la comission mixte paritaire (totalement vérouillée au passage). Celle ci devrait se faire un plaisir de durcir un peu plus le texte.</p>
<p>On attend donc le Conseil Constitutionel avec anxiété et l&#8217;Europe en dernier recours.</p>
<p>En attendant, keep cool and relakks <img src='http://proj3ct.org/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://proj3ct.org/blog/2009/04/03/hadopi-passee-comme-une-lettre-a-la-poste/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Hadopi un coup de boost pour les FAI ?</title>
		<link>http://proj3ct.org/blog/2009/03/21/hadopi-un-coup-de-boost-pour-les-fai/</link>
		<comments>http://proj3ct.org/blog/2009/03/21/hadopi-un-coup-de-boost-pour-les-fai/#comments</comments>
		<pubDate>Sat, 21 Mar 2009 18:40:35 +0000</pubDate>
		<dc:creator>aer0</dc:creator>
				<category><![CDATA[internet]]></category>
		<category><![CDATA[hadopi]]></category>

		<guid isPermaLink="false">http://proj3ct.org/blog/?p=20</guid>
		<description><![CDATA[C&#8217;est le week end, laissons nous divaguer. Une idée vient de me traverser l&#8217;esprit au sujet du projet loi &#8220;Création et Internet&#8221;. Je ne vais pas insister sur le fait que ce projet de loi est une mauvaise réponse à un faux problème, mais plutôt sur un effet de bord &#8220;rigolo&#8221;. Elle concerne les distinctions [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-full wp-image-21" src="http://proj3ct.org/blog/wp-content/uploads/2009/03/web.jpg" alt="web" width="286" height="300" />C&#8217;est le week end, laissons nous divaguer. Une idée vient de me traverser l&#8217;esprit au sujet du projet loi &#8220;Création et Internet&#8221;. Je ne vais pas insister sur le fait que ce projet de loi est une mauvaise réponse à un faux problème, mais plutôt sur un effet de bord &#8220;rigolo&#8221;. Elle concerne les distinctions entre titulaire de la ligne, la personne qui la paye et les utilisateurs.</p>
<p>Imaginons que mon IP soit relevée sur un tracker, au hasard sur <a title="TPB" href="http://thepiratebay.org/" target="_blank">The pirate bay</a>, je vous rappelle que vous n&#8217;avez pas besoin de télécharger pour vous retrouvez dans cette situation. Vous pouvez lire cet article sur <a title="Numerama" href="http://www.numerama.com/magazine/10885-The-Pirate-Bay-rend-la-riposte-graduee-dangereuse-pour-tous.html" target="_blank">Numerama</a> pour plus d&#8217;info.</p>
<p>Je disais donc, je suis pris en &#8220;flagrant délit&#8221;, je suis le titulaire de la ligne, on me coupe donc ma connection pour défaut de sécurisation ! Que faire ? Je me sert d&#8217;Internet pour mon job, pour m&#8217;informer, pour payer mes impôts (les mêmes qui vont payer Hadopi \o/) etc. L&#8217;accés au réseau des réseaux m&#8217;est indispensable.</p>
<p>Je formule donc une hypothèse, dans le cas où un changement de titulaire de ligne est possible : la solution sera de prendre un abo au nom de ma grand mère <img src='http://proj3ct.org/blog/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' />  en espérant avoir plus de chance la prochaine fois&#8230;</p>
<p>Je ne suis pas sur que cela pose problème au FAI. En effet, il est prévu que l&#8217;on continue de payer notre abonnement le temps de la suspension, mais allons nous être obliger de garder cette ligne ?  Pour prendre ma situation en exemple, ma période d&#8217;engagement est terminée, serais je lié à ce contrat durant toute la durée de la sanction ?</p>
<p>Nous allons peut être avoir bientôt plus d&#8217;abonnement que de ligne téléphonique en france.</p>
<p>Trève de plaisanterie, restons mobilisé pour la reprise des &#8220;débats&#8221; à l&#8217;Assemblée Nationale le 31 Mars prochain.</p>
<p>Et pour se tenir au courant, vous pouvez lire le suivi fait par la <a href="http://www.laquadrature.net/HADOPI">Quadrature du net</a>, <a href="http://hadopi.numerama.com/">Numerama</a> ou encore <a href="http://www.pcinpact.com/">PC Impact</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://proj3ct.org/blog/2009/03/21/hadopi-un-coup-de-boost-pour-les-fai/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mon Lenovo SL300</title>
		<link>http://proj3ct.org/blog/2009/03/19/mon-lenovo-sl300/</link>
		<comments>http://proj3ct.org/blog/2009/03/19/mon-lenovo-sl300/#comments</comments>
		<pubDate>Thu, 19 Mar 2009 21:34:44 +0000</pubDate>
		<dc:creator>aer0</dc:creator>
				<category><![CDATA[hardware]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[notebook]]></category>

		<guid isPermaLink="false">http://proj3ct.org/blog/?p=3</guid>
		<description><![CDATA[J&#8217;ai depuis quelques temps un SL300 sur lequel j&#8217;ai installé Fedora 10, exit donc Vista. C&#8217;est l&#8217;occasion de faire un point plus ou moins régulièrement sur ce qui marche et sur ce qui coince. Tout d&#8217;abord les présentations, c&#8217;est un Lenovo / IBM ThinkPad SL300 2738 &#8211; T5870 (NS68YFR). Il embarque un Core 2 Duo [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-medium wp-image-8" src="http://proj3ct.org/blog/wp-content/uploads/2009/03/thinkpad-sl300-286x300.gif" alt="thinkpad-sl300" width="286" height="300" />J&#8217;ai depuis quelques temps un SL300 sur lequel j&#8217;ai installé <a title="fedora" href="http://fedoraproject.org/" target="_blank">Fedora 10</a>, exit donc Vista. C&#8217;est l&#8217;occasion de faire un point plus ou moins régulièrement sur ce qui marche et sur ce qui coince.</p>
<p>Tout d&#8217;abord les présentations, c&#8217;est un Lenovo / IBM ThinkPad SL300 2738 &#8211; T5870 (NS68YFR). Il embarque un Core 2 Duo T5870 2 GHz et 2 Go de ram. L&#8217;écran TFT a une diagonale de 13.3&#8243;. Le tout pèse 2,2 Kg.</p>
<p>La distribution Linux que je utilise régulièrement, que ce soit au taf ou chez moi est Fedora. C&#8217;est donc tout naturellement que j&#8217;ai installé la dernière version stable en date, à savoir la 10. Je précise que le sytème est à jour et c&#8217;est la version  32bit.</p>
<h3>L&#8217;affichage</h3>
<p>Commençons par l&#8217;affichage, aucun problème, la carte graphique est correctement reconnu, l&#8217;installation graphique fonctionne bien. Le réglage de la luminosité est opérationnel, le problème d&#8217;inversion des touches de contrôle a été fixé par une mise à jour. La gestion la luminosité en cas d&#8217;inactivité fonctionne également.</p>
<p>La gestion des effets fonctionne bien aussi (cube + Wobble effect). Tout comme le boot graphique, même si une modification dans grub.conf est nécessaire. Cela résoudra notament l&#8217;effet de flash lors du shutdown.</p>
<h3>Le clavier</h3>
<p>Le clavier, toutes les touches de fonction ne sont pas accéssible, du moins par défaut. La mise en veille et le réglage de luminosité marchent mais la gestion du volume non. Le touchpad est trés lent mais la fonction scrolling est Ok. Pas de problème avec les boutons de &#8220;souris&#8221;. Le trackpoint marche bien, j&#8217;adore <img src='http://proj3ct.org/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .</p>
<h3>La connectivité</h3>
<p>Connectons nous ! En ethernet pas de soucis, il faudra que je test que je suis bien en gigabit. Pour le wifi, l&#8217;authentification  en WEP marche bien, en WPA il faut wpa_supplicant. J&#8217;ai pas encore eu l&#8217;occassion de tester la 3G, ça va se faire trés bientôt.</p>
<p>Le bluetooth, la detection et la négociation a marché avec un N95, je ferai quelques tests avec <a title="Wammu" href="http://wammu.eu/" target="_blank">Wammu</a> ou <a title="Gnokii" href="http://www.gnokii.org/" target="_blank">Gnokii</a>.</p>
<p>Concernant le son, rien à dire, tout est Ok, que ce soit les enceintes ou la prise casque.</p>
<h3>Les voyants</h3>
<p>Les voyants wifi, bluetooth, batterie etc font bien leur job. En mobilité, la gauge de la batterie et les notifications de l&#8217;OS fonctionnent.</p>
<h3>A venir</h3>
<p>Voilà donc ce qui marche avec un système à jour et sans bidouille. Je completerai au fur à mesure en fonction de mes besoins.</p>
<p>Les points que j&#8217;explorerai prochainement :</p>
<ul>
<li>La connexion 3G</li>
<li>La communication avec un mobile et le partage de connection</li>
<li>Le wifi, qui a dit aircrack ?</li>
<li>La webcam, enfin peut être</li>
</ul>
<p>Pour en savoir plus et lire une revue détaillée des possibilités du SL300 je vous conseille <a title="notebookcheck" href="http://www.notebookcheck.net/Review-Lenovo-Thinkpad-SL300-Notebook.11972.0.html" target="_blank">www.netbookcheck.net</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://proj3ct.org/blog/2009/03/19/mon-lenovo-sl300/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

