<?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/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Je hack donc je suis &#187; web</title>
	<atom:link href="http://frederic.logier.org/category/web/feed/" rel="self" type="application/rss+xml" />
	<link>http://frederic.logier.org</link>
	<description>pour une écologie numérique</description>
	<lastBuildDate>Wed, 21 Jul 2010 19:19:13 +0000</lastBuildDate>
	<language>fr</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='frederic.logier.org' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://1.gravatar.com/blavatar/1f06d42ecd282c7191503daa4ec60e0c?s=96&#038;d=http://s2.wp.com/i/buttonw-com.png</url>
		<title>Je hack donc je suis &#187; web</title>
		<link>http://frederic.logier.org</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://frederic.logier.org/osd.xml" title="Je hack donc je suis" />
	<atom:link rel='hub' href='http://frederic.logier.org/?pushpress=hub'/>
		<item>
		<title>Nodecast : architecture d&#8217;une application web</title>
		<link>http://frederic.logier.org/2010/07/21/nodecast-architecture-dune-application-web/</link>
		<comments>http://frederic.logier.org/2010/07/21/nodecast-architecture-dune-application-web/#comments</comments>
		<pubDate>Wed, 21 Jul 2010 15:20:07 +0000</pubDate>
		<dc:creator>fredix</dc:creator>
				<category><![CDATA[rails]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[gearman]]></category>
		<category><![CDATA[mongodb]]></category>
		<category><![CDATA[nodecast]]></category>
		<category><![CDATA[sinatra]]></category>

		<guid isPermaLink="false">http://frederic.logier.org/?p=300</guid>
		<description><![CDATA[Certains le savent peut-être, je travaille depuis quelques mois sur mon projet personnel Nodecast. Pour résumer, ce projet a l&#8217;ambition de proposer un outil de monitoring simple à mettre en œuvre mais aussi un outil de recensement façon Linux counter. Il n&#8217;a cependant pas pour objectif de concurrencer un logiciel de type Nagios. Outre le [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=frederic.logier.org&amp;blog=3098224&amp;post=300&amp;subd=fredix&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Certains le savent peut-être, je travaille depuis quelques mois sur mon projet personnel <a href="http://www.nodecast.net" target="_blank">Nodecast</a>. Pour résumer, ce projet a l&#8217;ambition de proposer un outil de monitoring simple à mettre en œuvre mais aussi un outil de recensement façon <a href="http://counter.li.org/" target="_blank">Linux counter</a>. Il n&#8217;a cependant pas pour objectif de concurrencer un logiciel de type Nagios. Outre le challenge du développement de la partie web, il y a également celui du client desktop en Qt, mais qui fera peut-être l&#8217;objet d&#8217;un futur billet.</p>
<p><span id="more-300"></span></p>
<p>Lors d&#8217;une précédente expérience professionnelle en 2007 (<a href="http://www.af83.com/" target="_blank">AF83</a>) j&#8217;avais mis en oeuvre des techniques de <a href="http://dev.af83.com/ruby/de-la-repartition-de-charge-en-ruby-on-rails-12/2008/01/22" target="_blank">répartition de charge </a>via des <a href="http://dev.af83.com/ruby/de-la-repartition-de-charge-en-ruby-on-rails-22/2008/01/22" target="_blank">traitements asynchrones </a>pour le développement d&#8217;un microblog/chat web. Je cherchais depuis à réutiliser ces technologies, ce qui m&#8217;a poussé au développement de Nodecast.</p>
<p>Or si à l&#8217;époque le domaine des serveurs de message queues était encore balbutiant, il a nettement évolué depuis. En effet à l&#8217;époque après en avoir testé quelques uns, j&#8217;avais fini par me résoudre à utiliser le protocole XMPP via un serveur Jabber. Il faut bien avouer que la mise en œuvre a été plutôt ardu. XMPP est un bon protocole mais il est au final peu adapté pour un simple système de file d&#8217;attente, trop verbeux et la librairie Ruby XMPP4R faiblarde, à l&#8217;époque en tout cas.</p>
<p>Depuis les serveurs de file d&#8217;attente ont poussé comme des champignons, et certains sont même dérivés de serveur type clé/valeur.  J&#8217;ai pour ma part choisi <a href="http://gearman.org" target="_blank">Gearman</a> qui me parait une bonne technologie depuis sa réécriture en C, et c&#8217;est un bon compromis fonctionnalités / simplicité / performances. Avant d&#8217;aller plus loin je préfère présenter le schéma de l&#8217;architecture du site, ce qui rendra plus aisé les explications.</p>
<h2>Architecture</h2>
<p><a href="http://fredix.files.wordpress.com/2010/07/architecture.png"><img class="alignnone size-full wp-image-302" title="architecture" src="http://fredix.files.wordpress.com/2010/07/architecture.png?w=600&#038;h=400" alt="" width="600" height="400" /></a></p>
<p>La partie droite en orange représente le site web. Nginx transmet les requêtes HTTP vers un pool de services <a href="http://code.macournoyer.com/thin/" target="_blank">Thin</a> qui est un serveur web applicatif, il est en charge d&#8217;exécuter l&#8217;application en Ruby on Rails. Pour des raisons de performances et efficacité, j&#8217;ai choisi d&#8217;utiliser une base de données NoSQL, <a href="http://www.mongodb.org/" target="_blank">mongoDB</a>.</p>
<p>La partie intéressante est celle à gauche représentée par le nuage gris. En effet il représente les services en charge de l&#8217;API.</p>
<h2>API asynchrone</h2>
<p>L&#8217;API est ici une API REST. Le client en Qt effectue donc simplement des requêtes HTTP afin de communiquer avec le service web. Il fait des POST pour l&#8217;ajout de données, des PUT pour la modification et des GET pour la consultation.</p>
<p>Plus le client envoi des données sur un court délai, plus les statistiques seront détaillées. Le problème est que cela génère une multitude de connexions et donc de traitement. Et plus il y en a, plus la réponse au client sera longue, ce qui va dégrader la qualité de service. Bien entendu la solution est de rendre asynchrone les traitements afin que la réponse au client soit la plus rapide possible.</p>
<p>Cela est représenté par l&#8217;échange 1 et 2 entre le serveur Nginx et le serveur thin.</p>
<h3>Client &lt;-&gt; serveur</h3>
<p>Lors d&#8217;un POST, le client va demander la création d&#8217;une donnée au service. Ici il s&#8217;agit de la création d&#8217;une nouvelle machine (host) à monitorer. Le workflow est le suivant :</p>
<ol>
<li>client Qt POST les datas</li>
<li>serveur sinatra authentifie le client</li>
<li>serveur sinatra génère un identifiant unique (UUID)</li>
<li>serveur sinatra sérialize les datas, et transmet la charge à Gearman dans la file d&#8217;attente du dispatcher</li>
<li>serveur sinatra renvoi au client un XML contenant l&#8217;identifiant unique</li>
<li>le client stocke cet identifiant et l&#8217;utilisera pour tous les prochains échanges</li>
</ol>
<p>Le principe ici est que le serveur sinatra ne fasse que le strict minimum, afin de répondre le plus rapidement et d&#8217;être disponible pour une prochaine requête. Ainsi même sous une charge importante, les requêtes transmises par les clients Qt, seront empilé et mise en attente au chaud dans le serveur de file Gearman.</p>
<p>Pour une requête PUT le workflow est plus simple puisque l&#8217;étape 3 est supprimée. Le serveur sinatra renvoi dans tous les cas un XML contenant le status &laquo;&nbsp;proceed&nbsp;&raquo; afin de signaler au client que sa requête a été prise en compte.</p>
<p>L&#8217;intérêt de Sinatra est qu&#8217;il est très simple à mettre en oeuvre ce qui en fait à mon avis un candidat idéal pour servir une API. Le code du serveur tiens d&#8217;ailleurs dans un seul fichier :</p>
<pre>#!/usr/bin/env ruby
require 'rubygems'

require 'gearman'

require "bundler"
Bundler.setup
Bundler.require(:default)

RAILS_ENV="production"

#Gearman::Util.debug = true
SERVERS = ['localhost:4730']

@@logger = Logger.new('log/server.log', 'daily')
@@logger.debug("Created logger")

File.open(File.join('../config/database.mongo.yml'), 'r') do |f|
 @settings = YAML.load(f)[RAILS_ENV]
end

Mongoid.configure do |config|
 name = @settings["database"]
 host = @settings["host"]
 config.use_object_ids = @settings["use_object_ids"]
 @@logger.info "database : #{name}"
 @@logger.info "host : #{host}"
 config.master = Mongo::Connection.new.db(name)
 # config.slaves = [
 #                Mongo::Connection.new(host, @settings["slave_one"]["port"], :slave_ok =&gt; true).db(name)
 #               ]
end

require 'models_mongoid/user.rb'
require 'models_mongoid/profil.rb'
require 'models_mongoid/host.rb' 

set :logging, true

helpers do
 def protected!
 unless authorized?
 response['WWW-Authenticate'] = %(Basic realm="Nodecast HTTP Auth")
 throw(:halt, [401, "Not authorized\n"])
 end
 end

 def authorized?
 @auth ||=  Rack::Auth::Basic::Request.new(request.env)
 @current_user = User.where(:email =&gt; @auth.credentials.first, :authentication_token =&gt; @auth.credentials.last).first
 @auth.provided? &amp;&amp; @auth.basic? &amp;&amp; @current_user
 end
end

post '/hosts.xml' do
 protected!
 xml = Crack::XML.parse(request.body.read)
 @@logger.info("#{Time.now} : RECEIVE CREATE")

 uuid = UUIDTools::UUID.timestamp_create.to_s

 host = {
 :user =&gt; @current_user.email,
 :uuid =&gt; uuid,
 :timestamp =&gt; Time.now.utc,
 :datas =&gt; xml
 }

 payload('dispatcher_add', host)

 builder do |xml|
 xml.instruct!
 xml.host do
 xml.uuid host[:uuid]
 end
 end
end

put '/host/update/:id' do
 protected!
 xml = Crack::XML.parse(request.body.read)
 @@logger.info("#{Time.now} : RECEIVE UPDATE")

 host = {
 :user =&gt; @current_user.email,
 :uuid =&gt; params[:id],
 :timestamp =&gt; Time.now.utc,
 :datas =&gt; xml
 }

 payload('dispatcher_update', host)

 builder do |xml|
 xml.instruct!
 xml.host do
 xml.status "proceed"
 end
 end
end

private

def payload(worker, data)

 client = Gearman::Client.new(SERVERS)
 taskset = Gearman::TaskSet.new(client)

 #task = Gearman::Task.new('update', Marshal.dump(host), :background =&gt; true, :poll_status_interval =&gt; 1)
 task = Gearman::Task.new(worker, Marshal.dump(data))
 task.on_complete {|d| @@logger.info "complete : #{d}" }  

 task.on_warning {|w| @@logger.info "[client] warn: #{w}" }
 task.on_fail {|f| @@logger.info "[client] calculation failed : #{f}" }
 taskset.add_task(task)  
end</pre>
<p>On voit bien ici que &laquo;&nbsp;post &#8216;/hosts.xml&#8217; do&nbsp;&raquo; et &#8216;put &#8216;/host/update/:id&#8217; do&nbsp;&raquo; permettent de répondre très simplement aux requêtes POST et PUT des clients. Pour le reste on voit bien que le serveur ne fait que préparer un Hash avec l&#8217;XML transmis par le client, un timestamp, l&#8217;uuid du host et l&#8217;id de l&#8217;utilisateur. Ce Hast est ensuite sérialisé puis la charge est envoyée dans la file d&#8217;attente du dispatcher.</p>
<h3>Dispatcher &lt;-&gt; workers</h3>
<p>Comme on le voit dans le code les traitements sont envoyés dans la file d&#8217;attente sur 2 canaux : &laquo;&nbsp;dispatcher_update&nbsp;&raquo; et &laquo;&nbsp;dispatcher_add&nbsp;&raquo;. Il y a donc un processus Ruby qui attend des traitements sur ces canaux afin de les préparer puis les transmettre à chaque worker. J&#8217;avais tout d&#8217;abord un seul worker, mais il est beaucoup plus intéressant de le découper en plusieurs workers spécifiques à une tâche. En effet des utilisateurs peuvent décider de ne pas envoyer les informations relatives au CPU ou bien au réseau. De fait les worker auront la charge qui correspond au contenu des requêtes transmises.</p>
<p>Le dispatcher ne dépend pas des traitements à effectuer, son rôle est de découper le traitement en de multiples sous-traitement qu&#8217;il transmet dans le canal de chaque worker. Si les traitements sont lourds il peut malgré tout continuer à les répartir dans chacun des canaux, quelque soit la charge en cours.</p>
<p>Les traitements se font réellement dans chaque worker. Ils désérialisent les données reçues de leur file d&#8217;attente, puis les stocke dans mongodb. Voici un des workers dédié au traitement des load :</p>
<pre>#!/usr/bin/env ruby
require 'rubygems'

gem 'mongoid', '1.9.0'

require 'mongoid'
gem 'gearman-ruby', '3.0.1'
require 'gearman'
require 'uuidtools'

require 'logger'
require 'yaml'
require 'optparse'
require "pp"

options = {}

optparse = OptionParser.new do |opts|
 opts.on('-w', '--work WORK', 'path to the work directory') do |work|                                        
 options[:work] = work
 end
 opts.on('-m', '--mongo MONGO', 'path to the mongo file') do |mongo|                                        
 options[:mongo] = mongo
 end
 opts.on('-e', '--env ENV', 'rails environment') do |env|                                        
 options[:env] = env
 end
end

begin
 optparse.parse!
 mandatory = [:work, :mongo, :env]
 missing = mandatory.select{ |param| options[param].nil? }
 if not missing.empty?
 puts "Missing options: #{missing.join(', ')}"
 puts optparse
 exit
 end
rescue OptionParser::InvalidOption, OptionParser::MissingArgument
 puts $!.to_s
 puts optparse
 exit
end

puts "Performing task with options: #{options.inspect}"            

#Gearman::Util.debug = true if options[:env] == "development"

servers = ['localhost:4730']
@@worker = Gearman::Worker.new(servers)

logger = Logger.new("#{options[:work]}/log/worker_stats_load.log", 'daily')
logger.debug("Created logger")

File.open(File.join("#{options[:mongo]}/database.mongo.yml"), 'r') do |f|
 @settings = YAML.load(f)[options[:env]]
end

Mongoid.configure do |config|
 name = @settings["database"]
 host = @settings["host"]
 config.use_object_ids = @settings["use_object_ids"]
 logger.info "database : #{name}"
 logger.info "host : #{host}"
 config.master = Mongo::Connection.new.db(name)
 # config.slaves = [
 #                Mongo::Connection.new(host, @settings["slave_one"]["port"], :slave_ok =&gt; true).db(name)
 #               ]
end

require "#{options[:work]}/models_mongoid/user.rb"
require "#{options[:work]}/models_mongoid/profil.rb"
require "#{options[:work]}/models_mongoid/host.rb"
require "#{options[:work]}/models_mongoid/osystem.rb" 

require "#{options[:work]}/models_mongoid/host_ram.rb"
require "#{options[:work]}/models_mongoid/host_cpu.rb"
require "#{options[:work]}/models_mongoid/host_network.rb"
require "#{options[:work]}/models_mongoid/host_last_comment.rb"
require "#{options[:work]}/models_mongoid/host_stats_uptime.rb"
require "#{options[:work]}/models_mongoid/host_stats_load.rb"
require "#{options[:work]}/models_mongoid/host_stats_network.rb"
require "#{options[:work]}/models_mongoid/host_stats_cpu.rb"
require "#{options[:work]}/models_mongoid/host_stats_memory.rb" 

require "#{options[:work]}/models_mongoid/load_statistic.rb" 

########## JOB UPDATE STAT ############
@@worker.add_ability('update_load') do |data,job|

 dump = Marshal.load(data)

 xml = dump[:push]
 host = Host.where(:uuid =&gt; dump[:uuid]).first

 host_load = {
 :created_at =&gt; dump[:timestamp],
 :updated_at =&gt; dump[:timestamp],
 :loadavg0 =&gt; xml[:loadavg0],
 :loadavg1 =&gt; xml[:loadavg1],
 :loadavg2 =&gt; xml[:loadavg2]
 }    

 begin

 ls = host.load_statistics.create(host_load)
 logger.info "LOAD stats created"

 loadavg0 = 0.0
 loadavg1 = 0.0
 loadavg2 = 0.0

 host.load_statistics.each do |stat|
 loadavg0 += stat.loadavg0
 loadavg1 += stat.loadavg1
 loadavg2 += stat.loadavg2
 end

 if !host.stats_load
 host.create_stats_load(
 :created_at =&gt; dump[:timestamp],
 :updated_at =&gt; dump[:timestamp],
 :number =&gt; 1,
 :loadavg0 =&gt; ls.loadavg0,
 :loadavg1 =&gt; ls.loadavg1,
 :loadavg2 =&gt; ls.loadavg2,
 :max0 =&gt; ls.loadavg0,
 :max1 =&gt; ls.loadavg1,
 :max2 =&gt; ls.loadavg2
 )
 else      
 host.stats_load.updated_at = dump[:timestamp]
 host.stats_load.number += 1

 host.stats_load.max0 = ls.loadavg0 if ls.loadavg0 &gt; host.stats_load.max0
 host.stats_load.max1 = ls.loadavg1 if ls.loadavg1 &gt; host.stats_load.max1
 host.stats_load.max2 = ls.loadavg2 if ls.loadavg2 &gt; host.stats_load.max2

 host.stats_load.average0 = loadavg0 / host.stats_load.number
 host.stats_load.average1 = loadavg1 / host.stats_load.number
 host.stats_load.average2 = loadavg2 / host.stats_load.number

 host.stats_load.loadavg0 = ls.loadavg0
 host.stats_load.loadavg1 = ls.loadavg1
 host.stats_load.loadavg2 = ls.loadavg2

 host.save
 end

 logger.info "Embedded host load stats updated"

 rescue =&gt; e
 logger.info "failed on update : #{e}"
 raise Exception.new("failed on update : #{e}")
 end

end

loop do
 @@worker.work
end</pre>
<h2>Avantages</h2>
<p>En cas de soucis sur les workers, ceux-ci pourront être stoppé sans problème même en production. Grâce au découplage mis en place, les traitements sont tous simplement en attente dans leur file d&#8217;attente. Il y a intérêt à avoir un serveur d&#8217;API très basique (ici le code dans Sinatra) afin d&#8217;éviter au maximum les éventuels plantages ou corruption des données, et de plus cela le rend, comme je l&#8217;ai déjà dis, plus rapide.</p>
<h2>Evolution</h2>
<p>Cette architecture est encore basique car ne tourne que sur une seule machine. Cependant les technologies employées permettront de la répartir sur plusieurs machines très simplement. Tout d&#8217;abord au niveau de mongoDB via des slaves. Puis en démarrant plusieurs démons Gearman. Les workers pourront ainsi dépiler leurs jobs sur l&#8217;un des serveurs Gearman du cluster.</p>
<p>Ensuite il pourra être intéressant que chaque worker log dans mongoDB ses tâches et ses temps de traitement afin de détecter les éventuels bottleneck. Gearman possède également une multitude d&#8217;options comme pouvoir rendre prioritaire un job.</p>
<p>Enfin il est bien entendu approprié que le front web puisse utiliser l&#8217;API afin d&#8217;effectuer des traitements lourds demandés par l&#8217;utilisateur.</p>
<br />Filed under: <a href='http://frederic.logier.org/category/rails/'>rails</a>, <a href='http://frederic.logier.org/category/web/'>web</a> Tagged: <a href='http://frederic.logier.org/tag/gearman/'>gearman</a>, <a href='http://frederic.logier.org/tag/mongodb/'>mongodb</a>, <a href='http://frederic.logier.org/tag/nodecast/'>nodecast</a>, <a href='http://frederic.logier.org/tag/sinatra/'>sinatra</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/fredix.wordpress.com/300/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/fredix.wordpress.com/300/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/fredix.wordpress.com/300/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/fredix.wordpress.com/300/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/fredix.wordpress.com/300/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/fredix.wordpress.com/300/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/fredix.wordpress.com/300/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/fredix.wordpress.com/300/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/fredix.wordpress.com/300/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/fredix.wordpress.com/300/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/fredix.wordpress.com/300/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/fredix.wordpress.com/300/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/fredix.wordpress.com/300/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/fredix.wordpress.com/300/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=frederic.logier.org&amp;blog=3098224&amp;post=300&amp;subd=fredix&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://frederic.logier.org/2010/07/21/nodecast-architecture-dune-application-web/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/0fc8e5d51ed3c0726b2826e8caeb8017?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">fredix</media:title>
		</media:content>

		<media:content url="http://fredix.files.wordpress.com/2010/07/architecture.png" medium="image">
			<media:title type="html">architecture</media:title>
		</media:content>
	</item>
		<item>
		<title>Desktop 2.0</title>
		<link>http://frederic.logier.org/2010/06/25/desktop-2-0/</link>
		<comments>http://frederic.logier.org/2010/06/25/desktop-2-0/#comments</comments>
		<pubDate>Fri, 25 Jun 2010 19:55:35 +0000</pubDate>
		<dc:creator>fredix</dc:creator>
				<category><![CDATA[Internet]]></category>
		<category><![CDATA[MondeLibre]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://frederic.logier.org/?p=243</guid>
		<description><![CDATA[Suite à cet article sur ownCloud je souhaite à nouveau écrire sur ce sujet qui me tient à coeur, l&#8217;avenir du Desktop. Par ce titre ironiquo-buzzien je souhaite présenter ce que cela me représente. Qu&#8217;est-ce que le desktop 2.0 ? Historiquement le desktop est composé de logiciels installés sur une machine et qui au mieux [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=frederic.logier.org&amp;blog=3098224&amp;post=243&amp;subd=fredix&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Suite à cet article sur <a href="http://linuxfr.org/2010/06/24/27055.html" target="_blank">ownCloud</a> je souhaite à nouveau écrire sur ce sujet qui me tient à coeur, l&#8217;avenir du Desktop. Par ce titre ironiquo-buzzien je souhaite présenter ce que cela me représente.</p>
<p><span id="more-243"></span></p>
<h2>Qu&#8217;est-ce que le desktop 2.0 ?</h2>
<p>Historiquement le desktop est composé de logiciels installés sur une machine et qui au mieux dans certains cas communiquent entre eux. On télécharge le logiciel, on l&#8217;installe, on le paramètre si nécessaire et on l&#8217;utilise. Cette description n&#8217;a pas changé depuis environ 25 ans. Pour une mise en perspective, le web qui est venu bien après, qui est complexe à faire évoluer techniquement et administrativement, a régulièrement évolué et fait un bond en avant avec HTML5 : <a href="http://slides.html5rocks.com/#slide3">http://slides.html5rocks.com/#slide3</a></p>
<p>Le desktop 2.0 pourrait être un desktop qui utilise Internet afin de proposer des fonctionnalités supplémentaires. A priori ca existe déjà, par exemple iTunes qui permet de consulter le store d&#8217;Apple et d&#8217;y faire des achats depuis une interface native. Sauf que iTunes n&#8217;est qu&#8217;un logiciel qui intègre le moteur d&#8217;un navigateur web afin de présenter de manière un peu mieux intégré au desktop le store et surtout de gérer les DRM sur les fichiers achetés&#8230;</p>
<p>L&#8217;intérêt d&#8217;Internet est essentiellement de pouvoir partager et communiquer, consommer n&#8217;étant qu&#8217;une forme particulière de partage sous contrainte.</p>
<p>Mais pour moi il ne représente en aucun cas un but final. Dans les années 2000 on disait &laquo;&nbsp;il FAUT être sur Internet&nbsp;&raquo;. C&#8217;est une perception complètement erronée de l&#8217;outil ce qui a à mon avis complètement pervertie notre conscience. En effet, à l&#8217;époque le contexte était qu&#8217;il fallait y être en ayant un site web. Maintenant en 2010 il FAUT y être en ayant des suites bureautiques en web, des systèmes d&#8217;exploitation en web, et toute une suite de logiciels, en web &#8230;</p>
<p><a href="http://www.joost.com/" target="_blank">Joost</a> le fameux logiciel de vidéo en P2P par les créateurs de Kazaa est mort soit disant car il fallait installer un logiciel&#8230; Bullshit !!! La version full web est tout aussi morte. Joost est mort car il n&#8217;y avait pas de contenu. Et il y en avait pas car le seul contenu autorisé venait que des partenaires &#8230; Ca s&#8217;appelle la télévision ça, ce n&#8217;est pas Internet.</p>
<p>De fait la vision que nous avons d&#8217;Internet n&#8217;a pas changé depuis ses premiers pas ! Une vision très restrictive de l&#8217;outil.</p>
<p>Si le desktop 2.0 ne ressemble pas aux iTunes like, si ce n&#8217;est pas des applications web, qu&#8217;est-ce qu&#8217;il est ?</p>
<h2>Le desktop 2.0 existe déjà</h2>
<p>Plutôt que de décrire la chose avec des métaphores et des descriptions techniques autant prendre l&#8217;exemple parlant du seul gars qui a compris ce que c&#8217;était, qui l&#8217;a même pratiquement inventé et industrialisé à grande échelle : Steve Jobs.</p>
<p>Quoi encore lui ! bin oui &#8230; l&#8217;iPhone c&#8217;est quoi ? C&#8217;est un <strong>ordinateur</strong> (de poche) capable d&#8217;aller sur <strong>Internet</strong> (comme un ordinateur avec un abonnement Internet), et un <strong>kit de développement,</strong> le tout suffisamment bien conçu pour rendre n&#8217;importe quelle application web2 ridicule.</p>
<p>Attention tous les mots de cette phrase ont leur importance, notez d&#8217;ailleurs l&#8217;absence du mot téléphonie, car ne m&#8217;intéresse pas dans le contexte de ce billet. Et d&#8217;ailleurs le <strong>succès</strong> de l&#8217;iPad en rajoute une couche puisqu&#8217;il ne fait pas téléphone &#8230;</p>
<p>l&#8217;iPhone et maintenant l&#8217;iPad implémententent le desktop 2.0, car :</p>
<ul>
<li>Les applications sont <strong>natives</strong>. Ce qui rend &laquo;&nbsp;l&#8217;expérience utilisateur&nbsp;&raquo; (comme on dit), beaucoup plus fun, car cela apporte :
<ul>
<li>La réactivité</li>
<li>L&#8217;intégration au bureau</li>
<li>L&#8217;accès aux extensions matériel actuelles et à venir (3D, GPS, gyroscope, accéléromètre, &#8230;)</li>
</ul>
</li>
</ul>
<p>Et qui dit fun, dit j&#8217;utilise plus facilement qu&#8217;une application web qui ne peut pas avoir ces avantages. Qui dit j&#8217;utilise dit je suis potentiellement prêt à payer.</p>
<ul>
<li>Les applications utilisent <strong>Internet</strong>. Et je parle bien des applications pas uniquement du navigateur web !</li>
<li>Les applications sont faciles à trouver, à installer et à mettre à jour grâce à <strong>l&#8217;AppStore</strong>.</li>
</ul>
<h2>NATIF, INTERNET, STORE</h2>
<p>Ces 3 termes définissent bien la chose. On peut faire un paquet de reproches justifiés à Jobs, par contre on ne peut pas lui enlever la vision qu&#8217;il a eu. Car il ne suffit pas de dire je vais faire un téléphone qui peut aller sur Internet, ca existait déjà avant l&#8217;iPhone. Il faut imaginer ces 3 concepts, faire fabriquer le matériel qui tient la route, développer les logiciels et les services, et intégrer le tout de manière cohérente.</p>
<p>Google a d&#8217;ailleurs bien compris la leçon, et le confirme avec le succès d&#8217;Android.</p>
<h2>Et le PC ?</h2>
<h3>NATIF ?</h3>
<p>De manière historique les applications sont natives, mais pour diverses fausses bonnes raisons (déploiement et mise à jour) beaucoup d&#8217;applications &laquo;&nbsp;professionnelles&nbsp;&raquo; sont uniquement en web (IE6).</p>
<h3>INTERNET ?</h3>
<p>Depuis le début d&#8217;Internet les PC y accèdent. Sauf qu&#8217;ici dans la description du desktop 2.0 je parle des applications. Or il faut bien avouer qu&#8217;à part le navigateur web il n&#8217;y a pas beaucoup d&#8217;applications qui exploitent Internet, même en 2010 !!!</p>
<h3>STORE ?</h3>
<p>Gros point d&#8217;avance pour Linux qui possédait un &laquo;&nbsp;store&nbsp;&raquo; depuis la naissance de Debian au moins, dans les années 90 (et voui). Nous parlons de dépôts. De nos jours toutes les distributions en possèdent un et il permet de plus de mettre à jour tout le système et pas uniquement les applications utilisateurs !</p>
<p>Hormis Linux point de salut du côté de Windows et MacOS, même si des rumeurs d&#8217;appstore pour MacOS X ont circulé.</p>
<h2>Arguments</h2>
<h3>NATIF !</h3>
<p>Parmi les arguments en faveur d&#8217;une application native qui aboutissent à une &laquo;&nbsp;expérience utilisateur&nbsp;&raquo; agréable, il y en a une autre loin d&#8217;être négligeable pour le développeur, la facilité de développement. Il faut certes maitriser la technologie nécessaire à développer une application native, mais d&#8217;une part le choix est vaste sur un PC, et d&#8217;autres part une application web &laquo;&nbsp;équivalente&nbsp;&raquo; va nécessiter la maitrise d&#8217;un paquet de technologies côté client (Javascript, HTML, XML, CSS) pour un résultat bien inférieur et la maîtrise de plusieurs boites à outils nécessaires à débuger tout ça.</p>
<p>Pourquoi est-ce si pénible ? Tout simplement parce que le web n&#8217;a jamais été prévu pour développer des applications mais simplement pour afficher des pages &#8230; Bien sûr l&#8217;HTML5 vise à remédier à ces lacunes, mais cela restera malgré tout en deçà de n&#8217;importe qu&#8217;elle application native correctement développé et intégré. Et ne parlons même pas de l&#8217;exploitation de périphériques matériel ou même de la 3D, webgl commence à peine à être intégré à certains navigateurs web, en 2010 &#8230;</p>
<p>Enfin une botte secrète du web est la compatibilité de l&#8217;application quel que soit l&#8217;OS. Je balaie cela d&#8217;un revers de la main, car du coup on a renvoyé vers le développeur la complexité de la chose ainsi que vers le navigateur, on se rappelle tous des années de lutte à faire respecter les standards afin d&#8217;afficher et pouvoir utiliser correctement une application web&#8230; De plus une bibliothèque comme Qt est multi-plateforme, il n&#8217;y a qu&#8217;à voir Skype ou Opera. Et bien entendu Java (Eclipse, &#8230;)</p>
<p>Pour en revenir au faux exemple de Joost, devoir installer une application n&#8217;est pas une contrainte. Les succès de <a href="http://www.skype.com" target="_blank">Skype</a>, <a href="https://www.dropbox.com" target="_blank">Dropbox</a>, <a href="http://www.spotify.com" target="_blank">Spotify</a>, <a href="http://www.apple.com/fr/itunes/download/" target="_blank">iTunes</a>, &#8230; le prouvent. Le frein est simplement la nullité d&#8217;une mauvaise application.</p>
<h3>INTERNET !</h3>
<p>Un des avantages d&#8217;une application web et ce qui a entre autre expliqué leur explosion est le fait de pouvoir tout stocker côté serveur. L&#8217;utilisateur a ainsi qu&#8217;à se rappeler de son login et mot de passe pour retrouver toutes ses données. Or rien empêche une application native de faire de même ! Elle peut même faire en sorte de stocker en local si une coupure au réseau survient.  C&#8217;est précisément ce que vient combler l&#8217;HTML5 pour les applications web &#8230;..</p>
<p>Les développeurs d&#8217;applications natives pour iPhone ont eux bien compris l&#8217;intérêt et ne s&#8217;en prive pas. Internet devient de fait ce pour quoi il est bon : <strong>stocker, présenter et partager des données</strong>. L&#8217;application native se contente elle de faire ce pour quoi elle est bonne : faire l&#8217;acquisition des données via l&#8217;utilisateur et/ou des extensions matériels (GPS, accéléromètre, gyroscope, &#8230;) et rendre cela agréable en exploitant au maximum les capacités du matériel.</p>
<p>Alors peut être qu&#8217;il y aura un jour une version d&#8217;HTML qui va permettre d&#8217;accéder au GPS &#8230; laule&#8230;</p>
<p>Un exemple concret de l&#8217;intérêt d&#8217;Internet ? Prenons un logiciel natif comme un client mail qui propose des fonctionnalités complémentaires comme la lecture de flux RSS. La personnalisation de ces flux comme l&#8217;ajout et leur catégorisation nécessite un certain temps. Or si vous avez un laptop comme ordinateur secondaire, ou bien celui du boulot, vous devrez refaire ce travail redondant de paramétrage, et je ne parle même pas qu&#8217;un article lu depuis son travail sera marqué non lu chez soi&#8230; Si ce logiciel pouvait sauvegarder sa configuration et ses données sur Internet, il suffirait d&#8217;une simple synchronisation pour se faciliter là vie.</p>
<p>A remarquer que la Mozilla Fondation a très bien compris cela puisque qu&#8217;elle propose l&#8217;extension Firefox sync, ainsi que Google chrome qui gère ça nativement. A leur avantage ces 2 entités ont de très forte compétences en développement client et serveur, ce que n&#8217;a pas forcément le développeur d&#8217;une application desktop lambda. Remarque importante pour la suite de cet article.</p>
<p><strong>STORE !</strong></p>
<p>L&#8217;autre avantage d&#8217;une application web était sur les déploiements et les mises à jour. Cependant grâce aux stores cet argument s&#8217;efface, et pour les OS préhistorique qui ne gère pas encore cette fonctionnalité, il parait trivial d&#8217;ajouter cela au sein même de l&#8217;application &#8230;</p>
<p>De plus un store permet de faciliter la vente de son application, ce qui est loin d&#8217;être négligeable. Côté Linux seul Canonical semble le comprendre et faire un pas dans ce sens. Il semble que le &laquo;&nbsp;petit&nbsp;&raquo; milliard de dollars reversé par Apple aux développeurs iPhone, ait fini par convaincre, il était temps !</p>
<h2>QUEL AVENIR</h2>
<h3>du Desktop</h3>
<p>D&#8217;un côté il va y avoir le fameux Chrome OS qui est là pour renforcer la présence des applications Google. Le truc drôle c&#8217;est qu&#8217;eux ont bien compris les limitations du web, aussi compétent soient-ils, et aussi bien HTML5 soit-il. Donc afin de rendre les applications web plus agréable et pour pouvoir développer tout type d&#8217;application, ce qui est important lorsqu&#8217;on a la prétention de faire un OS grand public, ils proposent le plugin <a href="http://code.google.com/p/nativeclient/" target="_blank">Chrome nativeclient</a> qui va permettre de développer des applications &#8230; natives &#8230; à l&#8217;intérieur de Chrome ! On marche sur la tête ?!</p>
<p>Ou quand le web réinvente le natif afin de combler ses propres lacune tout adaptant à son monde ce qui fait le succès d&#8217;Apple&#8230; Et bien entendu Google étant loin d&#8217;être bête va proposer son &laquo;&nbsp;store&nbsp;&raquo; market pour son OS.</p>
<p>De l&#8217;autre, il est heureux de constater certains réveil, encore une fois via Canonical avec son <a href="https://one.ubuntu.com/" target="_blank">Ubuntu One</a>. Ce service permet de stocker et synchroniser ses données sur Internet via les programmes qui supporte <a href="http://www.freedesktop.org/wiki/Specifications/desktopcouch" target="_blank">desktopcouch</a>. Et ceci est la réponse aux programmeurs qui n&#8217;ont pas les compétences ou l&#8217;envie de développer eux mêmes ces fonctionnalités. Il était temps qu&#8217;un éditeur d&#8217;OS propose ce type d&#8217;API à ses développeurs !</p>
<p>Pour pousser le concept un peu plus loin, je rêverais d&#8217;un OS qui me permette, suite à son installation, de télécharger automatiquement tous les logiciels que j&#8217;utilise sur mon PC principal ainsi que toutes les préférences associées à ces logiciels.</p>
<p>Ces informations personnelles mais pas vraiment critique, pourrait même être partagée via un réseau social si l&#8217;utilisateur le souhaite.</p>
<h3>du Réseau Social</h3>
<p>Ce secteur à la mode a ceci de particulier qu&#8217;il est le révélateur flagrant de cette dualité web / desktop. Par exemple, au départ ces applications web de type Facebook étaient complètement fermées et uniquement accessible depuis un navigateur web. Avec la mode web2, ils se sont ouvert via des API ce qui a permis de faire émerger une multitudes d&#8217;applications natives pour mobile, puis pour PC.</p>
<p>Quand le web redécouvre l&#8217;intérêt du bon vieux client natif&#8230; Cependant on en est toujours sur du vertical, une application dédié à un service.</p>
<p>C&#8217;est ici que débarque le très intéressant <a href="http://socialdesktop.org" target="_blank">social desktop</a> et son <a href="http://socialdesktop.org/ocs/" target="_blank">OCS API</a>, une API qui doit permettre l&#8217;accès des applications natives à des réseaux sociaux. En effet il est complètement aberrant qu&#8217;il faille utiliser une application en particulier pour faire du social ! Cette pratique est complètement transverse est de fait n&#8217;importe quelle application est capable de présenter un intérêt social ! Que cela soit d&#8217;intégrer le service Gitorious dans un IDE, comme QtCreator qui le fait, ou bien intégrer l&#8217;API d&#8217;un site de recettes de cuisine à des logiciels de gestion des courses&#8230;.</p>
<p>Le social est transverse, il est ridicule de devoir utiliser un client dédié ou bien même un serveur en particulier&#8230; Côté serveur le très intéressant microblog décentralisé <a href="http://status.net/" target="_blank">statusnet</a> montre le voie, ainsi que la plateforme sociale décentralisée <a href="http://www.movim.eu/" target="_blank">movim</a>.</p>
<p>A moins que l&#8217;on souhaite que le futur du desktop ne tourne que dans l&#8217;onglet d&#8217;un navigateur web, ce qui est déjà le cas avec Chrome OS, Jolicloud, etc, il reste aux éditeurs d&#8217;OS et de bureaux de proposer des services web décentralisés et des API, afin que n&#8217;importe application desktop puisse enfin sortir des années 1990&#8230;</p>
<p>Pour finir je tiens à poser une question qui peut résumer ce débat.</p>
<p>Les acteurs et organisations du web travaillent à faire évoluer leurs technologies afin de proposer des fonctionnalités les plus proches d&#8217;une application native. Les éditeurs de logiciels natifs et développeurs d&#8217;environnement de bureau travaillent à proposer des fonctionnalités permettant le développement d&#8217;applications qui exploitent les capacités offertes par Internet (web services, cloud, &#8230;).</p>
<p>Entre ces 2 visions quelle est celle qui a le plus court chemin à faire et laquelle est la plus à même de répondre aux <del datetime="2010-06-26T15:10:29+00:00">besoins</del> envies des utilisateurs ? <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<br />Filed under: <a href='http://frederic.logier.org/category/internet/'>Internet</a>, <a href='http://frederic.logier.org/category/mondelibre/'>MondeLibre</a>, <a href='http://frederic.logier.org/category/web/'>web</a>  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/fredix.wordpress.com/243/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/fredix.wordpress.com/243/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/fredix.wordpress.com/243/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/fredix.wordpress.com/243/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/fredix.wordpress.com/243/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/fredix.wordpress.com/243/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/fredix.wordpress.com/243/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/fredix.wordpress.com/243/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/fredix.wordpress.com/243/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/fredix.wordpress.com/243/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/fredix.wordpress.com/243/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/fredix.wordpress.com/243/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/fredix.wordpress.com/243/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/fredix.wordpress.com/243/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=frederic.logier.org&amp;blog=3098224&amp;post=243&amp;subd=fredix&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://frederic.logier.org/2010/06/25/desktop-2-0/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/0fc8e5d51ed3c0726b2826e8caeb8017?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">fredix</media:title>
		</media:content>
	</item>
		<item>
		<title>Du modèle économique du libre : status.net wordpress.com shapado.com</title>
		<link>http://frederic.logier.org/2010/06/10/du-modele-economique-du-libre-status-net-wordpress-com-shapado-com/</link>
		<comments>http://frederic.logier.org/2010/06/10/du-modele-economique-du-libre-status-net-wordpress-com-shapado-com/#comments</comments>
		<pubDate>Thu, 10 Jun 2010 22:23:25 +0000</pubDate>
		<dc:creator>fredix</dc:creator>
				<category><![CDATA[MondeLibre]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://frederic.logier.org/?p=203</guid>
		<description><![CDATA[Lors de mes pérégrinations récentes à chercher un microblog libre sans limitation du nombre de caractères, on me fit découvrir http://unlimited.status.net/. J&#8217;ai bien sûr un compte http://identi.ca/ mais la mode de la limitation de caractères lancées par Twitter m&#8217;exaspère au plus au point (c&#8217;est plutôt stressant de limiter sa prose pour gagner 3 caractères afin [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=frederic.logier.org&amp;blog=3098224&amp;post=203&amp;subd=fredix&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Lors de mes pérégrinations récentes à chercher un microblog libre sans limitation du nombre de caractères, on me fit découvrir <a href="http://unlimited.status.net/" target="_blank">http://unlimited.status.net/</a>. J&#8217;ai bien sûr un compte <a href="http://identi.ca/" target="_blank">http://identi.ca/</a> mais la mode de la limitation de caractères lancées par Twitter m&#8217;exaspère au plus au point (c&#8217;est plutôt stressant de limiter sa prose pour gagner 3 caractères afin de pouvoir poster&#8230;). Bien que répondant à mon besoin, ce sous-domaine est plutôt laid, et les autres sites utilisant le moteur de status.net plus joli comme <a href="http://brainbird.net/" target="_blank">http://brainbird.net/</a> limitent malgré tout à 300 caractères&#8230;</p>
<p>C&#8217;est alors que la lumière fut lorsque je découvris l&#8217;offre de &laquo;&nbsp;cloud&nbsp;&raquo; de StatusNet <a href="http://status.net/signup" target="_blank">http://status.net/signup</a> En effet nul besoin de s&#8217;auto-héberger (mon temps est précieux), cette offre me permet d&#8217;avoir mon propre sous-domaine chez status.net et de l&#8217;administrer selon mon bon vouloir, notamment de faire sauter cette stupide limitation de caractères : <a href="http://fredix.status.net/" target="_blank">http://fredix.status.net/</a></p>
<p>Elle permet aussi d&#8217;héberger sa propre communauté <a href="http://status.net/whos-using-statusnet" target="_blank">http://status.net/whos-using-statusnet</a>, ouverte ou pas, Mozilla ne s&#8217;en est d&#8217;ailleurs pas privé : <a href="http://mozilla.status.net/" target="_blank">http://mozilla.status.net/</a> On dépasse largement avec tout ça le peu que propose Twitter. Cependant si je souhaite des services complémentaires comme les SMS ou XMPP, Status.net va proposer ce mois-ci une offre premium ajoutant un certain nombre d&#8217;options : <a href="http://status.net/cloud" target="_blank">http://status.net/cloud</a> (SMS, XMPP, fichiers, &#8230;) J&#8217;espère que le prix sera abordable !</p>
<p>Je trouve cela très intelligent de leur part, et c&#8217;est une copie du modèle de <a href="http://wordpress.com/" target="_blank">http://wordpress.com/</a>. Un logiciel que l&#8217;on peut s&#8217;installer et héberger soit même, ou bien simplement utiliser la version gratuite, ou la version avec des options payantes. Tout cela avec la garantie de pouvoir récupérer et exploiter ses données à tout instant grâce au code libre téléchargeable.</p>
<p>Cette 3ème voie me semble parfaite pour les logiciels libres qui souhaitent trouver un modèle économique. Il est dommage que pas mal de libristes feignent de l&#8217;ignorer, et préfèrent sacrifier le soutient financier du libre sur l&#8217;autel de l&#8217;auto-hébergement &laquo;&nbsp;pure et pas minitel 2.0&#8243; &#8230;..</p>
<p>J&#8217;estime d&#8217;ailleurs que certaines organisations à but non lucratif devraient s&#8217;en inspirer afin de financer leurs actions et pourquoi pas même leurs développeurs &#8230; Et bien même soyons fou pour financer le développement de services concurrentiels à Google, l&#8217;éthique et la confiance accordées à des organisations type <a href="http://www.fsf.org/" target="_blank">FSF</a> , <a href="http://www.eff.org/" target="_blank">EFF</a> ou <a href="http://foundation.gnome.org/" target="_blank">GNOME Foundation</a> sont d&#8217;une valeur inestimable face à n&#8217;importe quelle entreprise suspecte par définition. Mais ceci est un autre débat <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Pour terminer, en plus de status.net et wordpress.com il existe aussi l&#8217;excellent <a href="http://shapado.com/plans" target="_blank">http://shapado.com/</a> logiciel libre de question/réponse qui propose un hébergement avec des options payantes (plutôt chères <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' />   )  : <a href="http://shapado.com/plans" target="_blank">http://shapado.com/plans</a> Voici un exemple avec un shapado consacré à android : <a href="http://android.shapado.com/" target="_blank">http://android.shapado.com/</a></p>
<br />Filed under: <a href='http://frederic.logier.org/category/mondelibre/'>MondeLibre</a>, <a href='http://frederic.logier.org/category/web/'>web</a>  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/fredix.wordpress.com/203/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/fredix.wordpress.com/203/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/fredix.wordpress.com/203/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/fredix.wordpress.com/203/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/fredix.wordpress.com/203/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/fredix.wordpress.com/203/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/fredix.wordpress.com/203/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/fredix.wordpress.com/203/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/fredix.wordpress.com/203/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/fredix.wordpress.com/203/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/fredix.wordpress.com/203/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/fredix.wordpress.com/203/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/fredix.wordpress.com/203/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/fredix.wordpress.com/203/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=frederic.logier.org&amp;blog=3098224&amp;post=203&amp;subd=fredix&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://frederic.logier.org/2010/06/10/du-modele-economique-du-libre-status-net-wordpress-com-shapado-com/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/0fc8e5d51ed3c0726b2826e8caeb8017?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">fredix</media:title>
		</media:content>
	</item>
		<item>
		<title>Juick</title>
		<link>http://frederic.logier.org/2009/08/09/juick/</link>
		<comments>http://frederic.logier.org/2009/08/09/juick/#comments</comments>
		<pubDate>Sun, 09 Aug 2009 11:31:10 +0000</pubDate>
		<dc:creator>fredix</dc:creator>
				<category><![CDATA[Internet]]></category>
		<category><![CDATA[web]]></category>
		<category><![CDATA[jabber]]></category>
		<category><![CDATA[juick]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://frederic.logier.org/?p=105</guid>
		<description><![CDATA[Après avoir lu l&#8217;article de Nÿco sur Juick j&#8217;ai couru tester ce surprenant service de blogging (et non pas micro). Et là surprise c&#8217;est exactement ce que j&#8217;avais imaginé comme alternative à Twitter. En effet pas de stupide limitation à 140 caractères, Juick peut donc faire office de blog. Support des photos intégré et non [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=frederic.logier.org&amp;blog=3098224&amp;post=105&amp;subd=fredix&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Après avoir lu l&#8217;<a href="http://nyco.wordpress.com/2009/08/05/juick-com-reseau-social-temps-reel-xmpp/" target="_blank">article de Nÿco sur Juick</a> j&#8217;ai couru tester ce surprenant service de blogging (et non pas micro). Et là surprise c&#8217;est exactement ce que j&#8217;avais imaginé comme alternative à Twitter. En effet pas de stupide limitation à 140 caractères, Juick peut donc faire office de blog. Support des photos intégré et non pas via un autre site (twitterpic). Et surtout support complet du service par Jabber : inscription et post.</p>
<p>Pour compléter l&#8217;article de Nÿco je trouve qu&#8217;il manque juste une passerelle vers les salons Jabber. Cela serait tout simplement énorme qu&#8217;un salon jabber puisse être associé à un groupe Juick. On aurait ainsi tout l&#8217;historique du salon sur le groupe. Par contre il manque pour gérer cela, le support des groupes dans Juick et le fait de pouvoir poster via l&#8217;interface web. J&#8217;avais pensé à ce type de fonctionnalité pour Noumba, mais le profil des utilisateurs ne permettait pas de l&#8217;envisager. Le site est très jeune mais comme il est complètement pensé autour de Jabber cela serait stupide de ne pas implémenter les salons.</p>
<p>Autre surprise, le business model. Enfin un site qui ne se base pas sur la pub ! Il est nécessaire de payer 9.95$ afin de pouvoir poster plus d&#8217;une image par 24 heures. On espère le support de la vidéo bien sûr. Comme l&#8217;indique Nÿco il suffit d&#8217;envoyer l&#8217;image au bot Juick depuis son client Jabber. Par contre les proxy de transfert par défaut dans Gajim ne fonctionnent pas et j&#8217;ai du ajouter celui de jabberfr (proxy.jabberfr.org). Une fonctionnalité qui permet de remplacer <a href="http://imageshack.us/" target="_blank">imageshack</a> !</p>
<p>A propos de Jabber on peut constater que cela va limiter le service aux connaisseurs. Pour y remédier il faudrait a mon avis pouvoir poster via l&#8217;interface web et <span style="text-decoration:line-through;">ouvrir une API</span> (UPDATE : l&#8217;<a href="http://juick.com/help/api/xmpp/" target="_blank">API existe bien ici</a> décrite en Russe :p , et on me signale l&#8217;existence d&#8217;un <a href="http://juick.rubyforge.org/" target="_blank">client Juick</a> ,  il n&#8217;utilise pas une API mais parse simplement un <a href="http://api.juick.com/messages.xml" target="_blank">XML des derniers messages</a>, ). Quant aux tags appelés hash tags sur Twitter, ils servent à compenser l&#8217;absence flagrante des groupes. J&#8217;y vois personnellement  l&#8217;intérêt que sur  des termes génériques. Exemple un groupe juick au lieu d&#8217;un simple tag, par contre un tag pour définir une humeur ou décrire un média. De plus sur un groupe ou un salon à la jabber on peut y définir des droits d&#8217;accès et de multiples propriétés qu&#8217;on ne peut envisager avec un simple tag. De la même manière dans un blog les tags et les catégories sont complémentaires.</p>
<p>D&#8217;après Nÿco, Juick est écrit en Perl/C++ et cela se ressent à la réactivité immédiate du bot et du site. Certes le nombre d&#8217;inscrit est encore très faible, cela sera à confirmer. Je regrette juste l&#8217;aspect propriétaire du site.</p>
<p>Pour résumer, voilà donc un site très prometteur où l&#8217;on sent que l&#8217;auteur a un peu plus de 2 de QI, car il faut vraiment être stupide pour avoir laissé des services tiers compléter les manques flagrants de Twitter&#8230; Pour l&#8217;avenir de ce type de service, je me demande juste si Google Wave ne mettra pas tout le monde d&#8217;accord, car outre des fonctionnalités étonnantes, il sera OpenSource et permettra à chacun d&#8217;utiliser son propre serveur à la manière de Jabber.</p>
<br />Publié dans Internet, web Tagged: jabber, juick, twitter <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/fredix.wordpress.com/105/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/fredix.wordpress.com/105/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/fredix.wordpress.com/105/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/fredix.wordpress.com/105/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/fredix.wordpress.com/105/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/fredix.wordpress.com/105/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/fredix.wordpress.com/105/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/fredix.wordpress.com/105/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/fredix.wordpress.com/105/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/fredix.wordpress.com/105/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/fredix.wordpress.com/105/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/fredix.wordpress.com/105/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/fredix.wordpress.com/105/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/fredix.wordpress.com/105/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=frederic.logier.org&amp;blog=3098224&amp;post=105&amp;subd=fredix&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://frederic.logier.org/2009/08/09/juick/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/0fc8e5d51ed3c0726b2826e8caeb8017?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">fredix</media:title>
		</media:content>
	</item>
		<item>
		<title>Le big switch 2</title>
		<link>http://frederic.logier.org/2009/07/02/le-big-switch-2/</link>
		<comments>http://frederic.logier.org/2009/07/02/le-big-switch-2/#comments</comments>
		<pubDate>Thu, 02 Jul 2009 16:46:32 +0000</pubDate>
		<dc:creator>fredix</dc:creator>
				<category><![CDATA[MondeLibre]]></category>
		<category><![CDATA[fredix]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://frederic.logier.org/?p=99</guid>
		<description><![CDATA[11 jours après avoir migré mon blog de mon serveur Typo vers Blogger je viens à nouveau de switcher cette fois-ci vers WordPress.com ! Je parle bien d&#8217;un hébergement chez WordPress.com, il ne s&#8217;agit pas pour moi de revenir vers un auto-hébergement&#8230; Voici les différentes raisons : WordPress fait parti des blogs les plus avancés [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=frederic.logier.org&amp;blog=3098224&amp;post=99&amp;subd=fredix&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>11 jours après avoir migré mon blog de mon serveur <a href="http://typosphere.org">Typo</a> vers <a href="http://www.blogger.com">Blogger</a> je viens à nouveau de switcher cette fois-ci vers <a href="http://fr.wordpress.com/">WordPress.com</a> ! Je parle bien d&#8217;un hébergement chez WordPress.com, il ne s&#8217;agit pas pour moi de revenir vers un auto-hébergement&#8230; Voici les différentes raisons :</p>
<ol>
<li>WordPress fait parti des blogs les plus avancés techniquement, et il dépasse de loin le service Blogger qui ne gère toujours pas les pages et le menu par onglet sans bricoler la CSS&#8230;</li>
<li>Il est Opensource : <a href="http://wordpress.org/">WordPress.org</a></li>
<li>L&#8217;hébergement chez WordPress.com me permet de m&#8217;affranchir de l&#8217;administration et des mises à jour.</li>
<li>L&#8217;import  (articles, commentaires et catégories) d&#8217;un blog Blogger en 2 clics.</li>
<li>L&#8217;export XML.</li>
<li>3 Go d&#8217;espace disque gratuit.</li>
<li>widgets.</li>
<li>Statistiques de blog sans passer par un service tiers à la Google Analytics.</li>
<li>Leurs services payant propose le <a href="http://support.wordpress.com/domain-mapping/">Domain mapping</a> pour un coût extrêmement modique (9.97$ /an ce qui revient à 7.27€ /an) ce qui me permet d&#8217;utiliser mon propre domaine.</li>
<li>Le paiement via ce type de service est un excellent moyen de financer le libre. Ce dernier point est pour moi prioritaire car il est à mes yeux indispensable d&#8217;encourager les business modèles Opensource d&#8217;autant plus lorsqu&#8217;ils atteignent ce niveau de qualité technique.</li>
</ol>
<p>Dans de précédent billets j&#8217;ai critiqué le fait que le Libre se focalisait sur le logiciel sans penser à fournir de services. J&#8217;avoue avoir sauté chez Google sans penser à regarder mon vieux compte WordPress. La faute est réparée.</p>
<br />Publié dans fredix, MondeLibre, web  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/fredix.wordpress.com/99/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/fredix.wordpress.com/99/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/fredix.wordpress.com/99/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/fredix.wordpress.com/99/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/fredix.wordpress.com/99/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/fredix.wordpress.com/99/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/fredix.wordpress.com/99/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/fredix.wordpress.com/99/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/fredix.wordpress.com/99/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/fredix.wordpress.com/99/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/fredix.wordpress.com/99/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/fredix.wordpress.com/99/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/fredix.wordpress.com/99/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/fredix.wordpress.com/99/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=frederic.logier.org&amp;blog=3098224&amp;post=99&amp;subd=fredix&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://frederic.logier.org/2009/07/02/le-big-switch-2/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/0fc8e5d51ed3c0726b2826e8caeb8017?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">fredix</media:title>
		</media:content>
	</item>
		<item>
		<title>Répartition de charge avec une architecture asynchrone</title>
		<link>http://frederic.logier.org/2009/02/28/repartition-de-charge-avec-une-architecture-asynchrone/</link>
		<comments>http://frederic.logier.org/2009/02/28/repartition-de-charge-avec-une-architecture-asynchrone/#comments</comments>
		<pubDate>Sat, 28 Feb 2009 13:49:00 +0000</pubDate>
		<dc:creator>fredix</dc:creator>
				<category><![CDATA[MondeLibre]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://fredix.wordpress.com/2009/02/28/repartition-de-charge-avec-une-architecture-asynchrone/</guid>
		<description><![CDATA[Avec ce titre pompeux je voulais depuis longtemps écrire un article sur ce thème. Je l’avais un peu abordé avec ce billet sur beanstalkd, cependant je désirais en parler de manière plus généraliste. Finalement le Grand Ternet a encore une fois encouragé ma feignantise car j’ai trouvé cette suite de 3 petits excellents articles sur [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=frederic.logier.org&amp;blog=3098224&amp;post=90&amp;subd=fredix&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<div class="post-body">
<p>Avec ce titre pompeux je voulais depuis longtemps écrire un article sur ce thème. Je l’avais un peu abordé avec ce billet sur <a href="http://frederic.logier.org/2008/05/05/beanstalkd-premiere-approche">beanstalkd</a>, cependant je désirais en parler de manière plus généraliste.</p>
<p>Finalement le Grand Ternet a encore une fois encouragé ma feignantise car j’ai trouvé cette suite de 3 petits excellents articles sur <a href="http://haute-disponibilite.net/">haute-disponibilite.net</a> qui expliquent très bien ce domaine :</p>
<ul>
<li><a href="http://www.haute-disponibilite.net/2009/01/16/communiquer-par-file-de-message-1/">Communiquer via une file d’attente de message, 1</a></li>
<li><a href="http://www.haute-disponibilite.net/2009/01/19/communiquer-par-file-de-message-2/">Communiquer via une file d’attente de message, 2</a></li>
<li><a href="http://www.haute-disponibilite.net/2009/01/31/communiquer-via-une-file-attente-de-message-3/">Communiquer via une file d’attente de message, 3</a></li>
</ul>
<p>A compléter avec cet article très riche d’un co-fondateur de <a href="http://last.fm/">last.fm</a> : <a href="http://www.metabrew.com/article/anti-rdbms-a-list-of-distributed-key-value-stores/">Anti-RDBMS: A list of distributed key-value stores</a>. Il faut ajouter à cette liste déjà imposante l’étonnant <a href="http://tokyocabinet.sourceforge.net/index.html">Tokyo cabinet</a> ainsi que <a href="http://github.com/ezmobius/nanite/tree/master">nanite</a> basé sur RabbitMQ et cela démontrera aux plus incrédules l’importance d’un bon backend asynchrone et les énormes avantages que cela apporte en terme de réactivité pour l’utilisateur.</p>
<p>Cependant la tentation sera certainement de plus en plus grande d’utiliser les technologies clés en main de cloud computing offertes par Google et Amazon… A quand un <strong>service</strong> de cloud computing opensource à disposition uniquement, bien sûr, des sites opensource ? <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> <br />Pour finir, à lire également l’excellent article de Greg, <a href="http://www.algorithmique.net/2009/02/19/key-value/">{key, value}</a> qui comporte des détails techniques et des exemples (attention par contre sur la partie memcached, car <a href="http://memcachedb.org/">memcachedb</a> ou <a href="http://memcachedb.org/memcacheq/">memcacheq</a> seront plus pertinent pour cet usage).</p>
</p></div>
<br />Publié dans MondeLibre, web  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/fredix.wordpress.com/90/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/fredix.wordpress.com/90/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/fredix.wordpress.com/90/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/fredix.wordpress.com/90/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/fredix.wordpress.com/90/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/fredix.wordpress.com/90/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/fredix.wordpress.com/90/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/fredix.wordpress.com/90/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/fredix.wordpress.com/90/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/fredix.wordpress.com/90/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/fredix.wordpress.com/90/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/fredix.wordpress.com/90/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/fredix.wordpress.com/90/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/fredix.wordpress.com/90/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=frederic.logier.org&amp;blog=3098224&amp;post=90&amp;subd=fredix&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://frederic.logier.org/2009/02/28/repartition-de-charge-avec-une-architecture-asynchrone/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/0fc8e5d51ed3c0726b2826e8caeb8017?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">fredix</media:title>
		</media:content>
	</item>
		<item>
		<title>Le libre et les services web</title>
		<link>http://frederic.logier.org/2008/06/06/le-libre-et-les-services-web/</link>
		<comments>http://frederic.logier.org/2008/06/06/le-libre-et-les-services-web/#comments</comments>
		<pubDate>Fri, 06 Jun 2008 14:01:00 +0000</pubDate>
		<dc:creator>fredix</dc:creator>
				<category><![CDATA[MondeLibre]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://fredix.wordpress.com/2008/06/06/le-libre-et-les-services-web/</guid>
		<description><![CDATA[Je suis très fan de l’interaction Web Desktop, qui représente à mon sens l’avenir du Desktop. Même si le sujet est redondant avec de précédents billets, voici de la nouvelle matière, On constate depuis un moment de plus en plus d’outils à installer sur son bureau ou son navigateur, qui sont en liaison avec des [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=frederic.logier.org&amp;blog=3098224&amp;post=71&amp;subd=fredix&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<div class="post-body">
<p>Je suis très fan de l’interaction Web Desktop, qui représente à mon sens l’avenir du Desktop. Même si le sujet est redondant avec de précédents billets, voici de la nouvelle matière,</p>
<p>On constate depuis un moment de plus en plus d’outils à installer sur son bureau ou son navigateur, qui sont en liaison avec des services web. Que ce soit les widgets de Vista, Apple, Adobe Air, ou ceux de Google disponibles depuis peu sur Linux (<a href="http://code.google.com/p/google-gadgets-for-linux/">Google Gadgets for Linux</a>). Mais <span class="caps">QUID</span> du Libre ?</p>
<p>Tout d’abord <a href="http://labs.mozilla.com/2007/12/introducing-weave/">Weave</a>, le <a href="http://www.google.com/tools/firefox/browsersync/">Google Browser Sync</a> de la Fondation Mozilla. Il permet de synchroniser en temps réel ses bookmarks, son historique, et surtout depuis la dernière version ses mots de passe vers un serveur Mozilla, le tout chiffré bien entendu.</p>
<p>Quand on possède un PC de bureau et un laptop, c’est vraiment la première extension à installer. Celle de Google est intéressante mais stocker chez eux des infos aussi privées est à mon avis très inquiétant, il y a des limites que je n’ai pas envie de franchir surtout s’il existe une alternative libre.<br />Pour la petite anecdote <a href="http://frederic.logier.org/articles/2007/10/24/jdll-2007">j’avais demandé</a> à Tristan Nitot aux <span class="caps">JDLL 2007</span> si la MoFo pensait un jour proposer un Google sync like. Il ne s’est pas étendu sur le sujet trouvant l’idée intéressante, alors qu’il avait cité Weave à sa conférence sans fournir de détail. J’aime bien les surprises de ce genre moi <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Ensuite sur le desktop, RedHat sponsorise le réseau social <a href="http://mugshot.org/">Mugshot</a> (un <a href="http://friendfeed.com/">friendfeed</a> avant l’heure) et propose le client natif éponyme disponible dans Fedora (oui j’ai migré ! next billet peut être). Ce client se fait discret dans la barre de tâche <span class="caps">GNOME</span> et affiche dans une popup les news de ses contacts. Le site est en lien direct avec <a href="http://online.gnome.org/">GnomeOnline</a> , il suffit d’y créer un compte pour se connecter ensuite sur MugShot. Ce site surfe sur la vague réseau social web2, donc l’intérêt est limité aux adeptes, mais il inaugure l’avenir du desktop libre connecté à des services web.</p>
<p>J’attends cependant plus utile et je pense que Jabber a toute sa place dans la compétition. D’ailleurs pour faire suite au précédent billet, j’ai ajouté sur le wiki de jabberfr.org une <a href="http://wiki.jabberfr.org/Portail:Utilisateur/ServicesWeb">page</a> qui recense quelques sites utilisables depuis son client Jabber. Sachant que Jabber commence à être implémenté à l’intérieur de client desktop (abiword, &#8230;) la boucle sera bouclée <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>On parle souvent du modèle économique du libre, qui tourne essentiellement autour du service. Proposer des services web payant est à mon avis un excellent modèle d’avenir pour financer le développement du logiciel libre. Personnellement si j’ai le choix entre des services web payant mais libres et hébergés par une communauté en qui j’ai confiance, et des équivalents propriétaires même gratuits mon choix est vite fait.</p>
<p>Aussi je suis ravi que le libre commence à suivre cette voie, et c’est sans nul doute la prochain défi qu’il faudra réussir.</p>
</div>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/fredix.wordpress.com/71/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/fredix.wordpress.com/71/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/fredix.wordpress.com/71/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/fredix.wordpress.com/71/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/fredix.wordpress.com/71/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/fredix.wordpress.com/71/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/fredix.wordpress.com/71/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/fredix.wordpress.com/71/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/fredix.wordpress.com/71/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/fredix.wordpress.com/71/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/fredix.wordpress.com/71/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/fredix.wordpress.com/71/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/fredix.wordpress.com/71/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/fredix.wordpress.com/71/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/fredix.wordpress.com/71/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/fredix.wordpress.com/71/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=frederic.logier.org&amp;blog=3098224&amp;post=71&amp;subd=fredix&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://frederic.logier.org/2008/06/06/le-libre-et-les-services-web/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/0fc8e5d51ed3c0726b2826e8caeb8017?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">fredix</media:title>
		</media:content>
	</item>
		<item>
		<title>De la répartition de charge en Ruby on Rails</title>
		<link>http://frederic.logier.org/2008/01/22/de-la-repartition-de-charge-en-ruby-on-rails/</link>
		<comments>http://frederic.logier.org/2008/01/22/de-la-repartition-de-charge-en-ruby-on-rails/#comments</comments>
		<pubDate>Tue, 22 Jan 2008 14:56:00 +0000</pubDate>
		<dc:creator>fredix</dc:creator>
				<category><![CDATA[MondeLibre]]></category>
		<category><![CDATA[XMPP]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://fredix.wordpress.com/2008/01/22/de-la-repartition-de-charge-en-ruby-on-rails/</guid>
		<description><![CDATA[Je viens de publier un article en 2 parties sur le blog d’AF83 : De la répartition de charge en Ruby on Rails 1/2 De la répartition de charge en Ruby on Rails 2/2 C’est plutôt technique, et présente une solution parmi tant d’autres dans ce domaine très particulier.<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=frederic.logier.org&amp;blog=3098224&amp;post=64&amp;subd=fredix&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<div class="post-body">
<p>Je viens de publier un article en 2 parties sur le blog d’AF83 :</p>
<p><a href="http://dev.af83.com/ruby/de-la-repartition-de-charge-en-ruby-on-rails-12/2008/01/22/">De la répartition de charge en Ruby on Rails 1/2</a></p>
<p><a href="http://dev.af83.com/ruby/de-la-repartition-de-charge-en-ruby-on-rails-22/2008/01/22/">De la répartition de charge en Ruby on Rails 2/2</a></p>
<p>C’est plutôt technique, et présente une solution parmi tant d’autres dans ce domaine très particulier.</p>
</div>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/fredix.wordpress.com/64/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/fredix.wordpress.com/64/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/fredix.wordpress.com/64/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/fredix.wordpress.com/64/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/fredix.wordpress.com/64/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/fredix.wordpress.com/64/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/fredix.wordpress.com/64/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/fredix.wordpress.com/64/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/fredix.wordpress.com/64/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/fredix.wordpress.com/64/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/fredix.wordpress.com/64/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/fredix.wordpress.com/64/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/fredix.wordpress.com/64/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/fredix.wordpress.com/64/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/fredix.wordpress.com/64/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/fredix.wordpress.com/64/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=frederic.logier.org&amp;blog=3098224&amp;post=64&amp;subd=fredix&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://frederic.logier.org/2008/01/22/de-la-repartition-de-charge-en-ruby-on-rails/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/0fc8e5d51ed3c0726b2826e8caeb8017?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">fredix</media:title>
		</media:content>
	</item>
		<item>
		<title>De la répartition de charge en Ruby on Rails 2/2</title>
		<link>http://frederic.logier.org/2008/01/22/de-la-repartition-de-charge-en-ruby-on-rails-22/</link>
		<comments>http://frederic.logier.org/2008/01/22/de-la-repartition-de-charge-en-ruby-on-rails-22/#comments</comments>
		<pubDate>Tue, 22 Jan 2008 14:49:00 +0000</pubDate>
		<dc:creator>fredix</dc:creator>
				<category><![CDATA[MondeLibre]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[texte]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://fredix.wordpress.com/2008/01/22/de-la-repartition-de-charge-en-ruby-on-rails-22/</guid>
		<description><![CDATA[Article publié initialement sur le site d&#8217;AF83 L&#8217;architecture. Les bots Il ne reste qu&#8217;à exploiter les capacités de Rails et de XMPP afin de développer les bots qui vont effectuer les traitements. Exemple : PLAIN TEXT RUBY: #!/usr/bin/env ruby # # MonBot save message through ActiveRecord require &#8216;rubygems&#8217; require &#8216;xmpp4r-simple&#8217; require &#8216;daemons&#8217; require &#8216;yaml&#8217; require [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=frederic.logier.org&amp;blog=3098224&amp;post=63&amp;subd=fredix&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Article publié initialement sur le <a href="http://dev.af83.com/ruby/de-la-repartition-de-charge-en-ruby-on-rails-22/2008/01/22/">site d&#8217;AF83</a></p>
<p><strong>L&#8217;architecture.</strong></p>
<p><em>Les bots</em></p>
<p>Il ne reste qu&#8217;à  exploiter les capacités de Rails et de XMPP afin de développer les bots qui vont effectuer les traitements.</p>
<p>Exemple :</p>
<div class="igBar"><span><a href="http://dev.af83.com/ruby/de-la-repartition-de-charge-en-ruby-on-rails-22/2008/01/22/#">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">RUBY:</span>
<div id="ruby-1">
<div class="ruby" style="font-family:monospace;">
<ol>
<li>
<div style="font-family:'Courier New',Courier,monospace;font-weight:normal;"><span style="color:rgb(0,128,0);font-style:italic;">#!/usr/bin/env ruby</span></div>
</li>
<li>
<div style="font-family:'Courier New',Courier,monospace;font-weight:normal;"><span style="color:rgb(0,128,0);font-style:italic;">#</span></div>
</li>
<li>
<div style="font-family:'Courier New',Courier,monospace;font-weight:normal;"><span style="color:rgb(0,128,0);font-style:italic;"># MonBot save message through ActiveRecord</span></div>
</li>
<li>
<div style="font-family:'Courier New',Courier,monospace;font-weight:normal;"> </div>
</li>
<li>
<div style="font-family:'Courier New',Courier,monospace;font-weight:normal;"><span style="color:rgb(204,0,102);font-weight:bold;">require</span> <span style="color:rgb(153,102,0);">&#8216;rubygems&#8217;</span></div>
</li>
<li>
<div style="font-family:'Courier New',Courier,monospace;font-weight:normal;"><span style="color:rgb(204,0,102);font-weight:bold;">require</span> <span style="color:rgb(153,102,0);">&#8216;xmpp4r-simple&#8217;</span></div>
</li>
<li>
<div style="font-family:'Courier New',Courier,monospace;font-weight:normal;"><span style="color:rgb(204,0,102);font-weight:bold;">require</span> <span style="color:rgb(153,102,0);">&#8216;daemons&#8217;</span></div>
</li>
<li>
<div style="font-family:'Courier New',Courier,monospace;font-weight:normal;"><span style="color:rgb(204,0,102);font-weight:bold;">require</span> <span style="color:rgb(153,102,0);">&#8216;yaml&#8217;</span></div>
</li>
<li>
<div style="font-family:'Courier New',Courier,monospace;font-weight:normal;"><span style="color:rgb(204,0,102);font-weight:bold;">require</span> <span style="color:rgb(153,102,0);">&#8216;logger&#8217;</span></div>
</li>
<li>
<div style="font-family:'Courier New',Courier,monospace;font-weight:normal;"> </div>
</li>
<li>
<div style="font-family:'Courier New',Courier,monospace;font-weight:normal;">RAILS_ENV = ARGV<span style="color:rgb(0,102,0);font-weight:bold;">[</span><span style="color:rgb(128,0,0);">0</span><span style="color:rgb(0,102,0);font-weight:bold;">]</span> || <span style="color:rgb(153,102,0);">&#8216;development&#8217;</span></div>
</li>
<li>
<div style="font-family:'Courier New',Courier,monospace;font-weight:normal;"><span style="color:rgb(204,0,102);font-weight:bold;">require</span> <span style="color:rgb(204,0,255);font-weight:bold;">File</span>.<span style="color:rgb(153,0,204);">dirname</span><span style="color:rgb(0,102,0);font-weight:bold;">(</span><span style="color:rgb(0,0,255);font-weight:bold;">__FILE__</span><span style="color:rgb(0,102,0);font-weight:bold;">)</span> + <span style="color:rgb(153,102,0);">&#8216;/../config/environment&#8217;</span></div>
</li>
<li>
<div style="font-family:'Courier New',Courier,monospace;font-weight:normal;"> </div>
</li>
<li>
<div style="font-family:'Courier New',Courier,monospace;font-weight:normal;"><span style="color:rgb(204,0,102);font-weight:bold;">require</span> <span style="color:rgb(153,102,0);">&#8216;mysql_retry_lost_connection&#8217;</span></div>
</li>
<li>
<div style="font-family:'Courier New',Courier,monospace;font-weight:normal;"> </div>
</li>
<li>
<div style="font-family:'Courier New',Courier,monospace;font-weight:normal;"><span style="color:rgb(153,102,204);font-weight:bold;">class</span> MonBot</div>
</li>
<li>
<div style="font-family:'Courier New',Courier,monospace;font-weight:normal;">@@bot_jid = <span style="color:rgb(153,102,0);">&laquo;&nbsp;monbot@jabber.toto.com/1&#8243;</span></div>
</li>
<li>
<div style="font-family:'Courier New',Courier,monospace;font-weight:normal;">@@bot_password = <span style="color:rgb(153,102,0);">&#8217;123&#8242;</span></div>
</li>
<li>
<div style="font-family:'Courier New',Courier,monospace;font-weight:normal;">@@logger = <span style="color:rgb(204,0,255);font-weight:bold;">Logger</span>.<span style="color:rgb(153,0,204);">new</span><span style="color:rgb(0,102,0);font-weight:bold;">(</span><span style="color:rgb(153,102,0);">&laquo;&nbsp;monbot.log&nbsp;&raquo;</span><span style="color:rgb(0,102,0);font-weight:bold;">)</span></div>
</li>
<li>
<div style="font-family:'Courier New',Courier,monospace;font-weight:normal;"> </div>
</li>
<li>
<div style="font-family:'Courier New',Courier,monospace;font-weight:normal;"><span style="color:rgb(153,102,204);font-weight:bold;">def</span> initialize</div>
</li>
<li>
<div style="font-family:'Courier New',Courier,monospace;font-weight:normal;">@@logger.<span style="color:rgb(153,0,204);">info</span><span style="color:rgb(0,102,0);font-weight:bold;">(</span><span style="color:rgb(153,102,0);">&#8216;initialize&#8217;</span><span style="color:rgb(0,102,0);font-weight:bold;">)</span> <span style="color:rgb(0,102,0);font-weight:bold;">{</span> <span style="color:rgb(153,102,0);">&laquo;&nbsp;Initializing in #{RAILS_ENV} mode &#8230;&nbsp;&raquo;</span> <span style="color:rgb(0,102,0);font-weight:bold;">}</span></div>
</li>
<li>
<div style="font-family:'Courier New',Courier,monospace;font-weight:normal;"><span style="color:rgb(0,102,255);font-weight:bold;">@jabber</span> = <span style="color:rgb(102,102,255);font-weight:bold;">Jabber::Simple</span>.<span style="color:rgb(153,0,204);">new</span><span style="color:rgb(0,102,0);font-weight:bold;">(</span>@@bot_jid, @@bot_password<span style="color:rgb(0,102,0);font-weight:bold;">)</span></div>
</li>
<li>
<div style="font-family:'Courier New',Courier,monospace;font-weight:normal;"><span style="color:rgb(153,102,204);font-weight:bold;">end</span></div>
</li>
<li>
<div style="font-family:'Courier New',Courier,monospace;font-weight:normal;"> </div>
</li>
<li>
<div style="font-family:'Courier New',Courier,monospace;font-weight:normal;"><span style="color:rgb(153,102,204);font-weight:bold;">def</span> receive_msg</div>
</li>
<li>
<div style="font-family:'Courier New',Courier,monospace;font-weight:normal;"><span style="color:rgb(204,0,102);font-weight:bold;">loop</span> <span style="color:rgb(153,102,204);font-weight:bold;">do</span></div>
</li>
<li>
<div style="font-family:'Courier New',Courier,monospace;font-weight:normal;"><span style="color:rgb(0,102,255);font-weight:bold;">@jabber</span>.<span style="color:rgb(153,0,204);">received_messages</span> <span style="color:rgb(153,102,204);font-weight:bold;">do</span> |message|</div>
</li>
<li>
<div style="font-family:'Courier New',Courier,monospace;font-weight:normal;"> </div>
</li>
<li>
<div style="font-family:'Courier New',Courier,monospace;font-weight:normal;"><span style="color:rgb(0,128,0);font-style:italic;"># on dÃ©sÃ©rialise le message s&#8217;il a Ã©tÃ© transmis de la sorte</span></div>
</li>
<li>
<div style="font-family:'Courier New',Courier,monospace;font-weight:normal;">obj = <span style="color:rgb(204,0,255);font-weight:bold;">YAML</span>.<span style="color:rgb(204,0,102);font-weight:bold;">load</span><span style="color:rgb(0,102,0);font-weight:bold;">(</span>message.<span style="color:rgb(153,0,204);">body</span><span style="color:rgb(0,102,0);font-weight:bold;">)</span></div>
</li>
<li>
<div style="font-family:'Courier New',Courier,monospace;font-weight:normal;"> </div>
</li>
<li>
<div style="font-family:'Courier New',Courier,monospace;font-weight:normal;">mon_traitement<span style="color:rgb(0,102,0);font-weight:bold;">(</span>obj<span style="color:rgb(0,102,0);font-weight:bold;">)</span></div>
</li>
<li>
<div style="font-family:'Courier New',Courier,monospace;font-weight:normal;"> </div>
</li>
<li>
<div style="font-family:'Courier New',Courier,monospace;font-weight:normal;"><span style="color:rgb(153,102,204);font-weight:bold;">end</span></div>
</li>
<li>
<div style="font-family:'Courier New',Courier,monospace;font-weight:normal;"><span style="color:rgb(204,0,102);font-weight:bold;">sleep</span> <span style="color:rgb(128,0,0);">0.5</span></div>
</li>
<li>
<div style="font-family:'Courier New',Courier,monospace;font-weight:normal;"><span style="color:rgb(153,102,204);font-weight:bold;">end</span></div>
</li>
<li>
<div style="font-family:'Courier New',Courier,monospace;font-weight:normal;"><span style="color:rgb(153,102,204);font-weight:bold;">end</span></div>
</li>
<li>
<div style="font-family:'Courier New',Courier,monospace;font-weight:normal;"> </div>
</li>
<li>
<div style="font-family:'Courier New',Courier,monospace;font-weight:normal;">private</div>
</li>
<li>
<div style="font-family:'Courier New',Courier,monospace;font-weight:normal;"> </div>
</li>
<li>
<div style="font-family:'Courier New',Courier,monospace;font-weight:normal;"><span style="color:rgb(153,102,204);font-weight:bold;">def</span> mon_traitement<span style="color:rgb(0,102,0);font-weight:bold;">(</span>obj<span style="color:rgb(0,102,0);font-weight:bold;">)</span></div>
</li>
<li>
<div style="font-family:'Courier New',Courier,monospace;font-weight:normal;">obj.<span style="color:rgb(153,0,204);">find_by_login</span><span style="color:rgb(0,102,0);font-weight:bold;">(</span><span style="color:rgb(153,102,0);">&laquo;&nbsp;toto&nbsp;&raquo;</span><span style="color:rgb(0,102,0);font-weight:bold;">)</span></div>
</li>
<li>
<div style="font-family:'Courier New',Courier,monospace;font-weight:normal;"><span style="color:rgb(153,102,204);font-weight:bold;">end</span></div>
</li>
<li>
<div style="font-family:'Courier New',Courier,monospace;font-weight:normal;"> </div>
</li>
<li>
<div style="font-family:'Courier New',Courier,monospace;font-weight:normal;"><span style="color:rgb(153,102,204);font-weight:bold;">end</span></div>
</li>
<li>
<div style="font-family:'Courier New',Courier,monospace;font-weight:normal;"> </div>
</li>
<li>
<div style="font-family:'Courier New',Courier,monospace;font-weight:normal;">bot = MonBot.<span style="color:rgb(153,0,204);">new</span></div>
</li>
<li>
<div style="font-family:'Courier New',Courier,monospace;font-weight:normal;">bot.<span style="color:rgb(153,0,204);">receive_msg</span></div>
</li>
</ol></div>
</p></div>
</p></div>
<div class="igBar"><span><a href="http://dev.af83.com/ruby/de-la-repartition-de-charge-en-ruby-on-rails-22/2008/01/22/#">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">RUBY:</span>
<div id="ruby-2">
<div class="ruby" style="font-family:monospace;">
<ol>
<li>
<div style="font-family:'Courier New',Courier,monospace;font-weight:normal;">RAILS_ENV = ARGV<span style="color:rgb(0,102,0);font-weight:bold;">[</span><span style="color:rgb(128,0,0);">0</span><span style="color:rgb(0,102,0);font-weight:bold;">]</span></div>
</li>
<li>
<div style="font-family:'Courier New',Courier,monospace;font-weight:normal;"><span style="color:rgb(204,0,102);font-weight:bold;">require</span> <span style="color:rgb(204,0,255);font-weight:bold;">File</span>.<span style="color:rgb(153,0,204);">dirname</span><span style="color:rgb(0,102,0);font-weight:bold;">(</span><span style="color:rgb(0,0,255);font-weight:bold;">__FILE__</span><span style="color:rgb(0,102,0);font-weight:bold;">)</span> + <span style="color:rgb(153,102,0);">&#8216;/../config/environment&#8217;</span></div>
</li>
</ol></div>
</p></div>
</p></div>
<p> Ces lignes permettent à un script Ruby de charger l&#8217;environnement Rails du projet. Le bot est alors capable d&#8217;attaquer notre modèle de données via ActiveRecord.</p>
<div class="igBar"><span><a href="http://dev.af83.com/ruby/de-la-repartition-de-charge-en-ruby-on-rails-22/2008/01/22/#">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">RUBY:</span>
<div id="ruby-3">
<div class="ruby" style="font-family:monospace;">
<ol>
<li>
<div style="font-family:'Courier New',Courier,monospace;font-weight:normal;"><span style="color:rgb(204,0,102);font-weight:bold;">require</span> <span style="color:rgb(153,102,0);">&#8216;xmpp4r-simple&#8217;</span></div>
</li>
</ol></div>
</p></div>
</p></div>
<p> Ce gem nous permet de communiquer vers le compte Jabber du bot. Il peut donc dÃ©piler les objets qui lui sont destinÃ© et les dÃ©sÃ©rialiser pour les traiter.</p>
<div class="igBar"><span><a href="http://dev.af83.com/ruby/de-la-repartition-de-charge-en-ruby-on-rails-22/2008/01/22/#">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">RUBY:</span>
<div id="ruby-4">
<div class="ruby" style="font-family:monospace;">
<ol>
<li>
<div style="font-family:'Courier New',Courier,monospace;font-weight:normal;"><span style="color:rgb(204,0,102);font-weight:bold;">require</span> <span style="color:rgb(153,102,0);">&#8216;daemons&#8217;</span></div>
</li>
</ol></div>
</p></div>
</p></div>
<p>Ce gem permet de gérer le bot en tant que service (stop/start/restart).</p>
<div class="igBar"><span><a href="http://dev.af83.com/ruby/de-la-repartition-de-charge-en-ruby-on-rails-22/2008/01/22/#">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">RUBY:</span>
<div id="ruby-5">
<div class="ruby" style="font-family:monospace;">
<ol>
<li>
<div style="font-family:'Courier New',Courier,monospace;font-weight:normal;"><span style="color:rgb(204,0,102);font-weight:bold;">require</span> <span style="color:rgb(153,102,0);">&#8216;yaml&#8217;</span></div>
</li>
</ol></div>
</p></div>
</p></div>
<p> Pour sérialiser/désérialiser vos objets Ruby / Rails.</p>
<div class="igBar"><span><a href="http://dev.af83.com/ruby/de-la-repartition-de-charge-en-ruby-on-rails-22/2008/01/22/#">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">RUBY:</span>
<div id="ruby-6">
<div class="ruby" style="font-family:monospace;">
<ol>
<li>
<div style="font-family:'Courier New',Courier,monospace;font-weight:normal;"><span style="color:rgb(204,0,102);font-weight:bold;">require</span> <span style="color:rgb(153,102,0);">&#8216;mysql_retry_lost_connection&#8217;</span></div>
</li>
</ol></div>
</p></div>
</p></div>
<p>Ce gem sert à intercepter une coupure de la connexion vers MySQL. Il surcharge ActiveRecord afin de renégocier une connexion.</p>
<p>Avec ces outils nous avons la capacité de créer des services exploitant une file d&#8217;attente Jabber et fonctionnant en parallèle. Ainsi, si la charge vient à augmenter, les messages en attente de traitement ne seront pas perdus, puisqu&#8217;en attente dans les comptes Jabber stockés par ejabberd. De plus il est possible de multiplier un même bot en exploitant les ressources du protocole Jabber, chaque bot écoutant sur sa propre ressource (bot@monserveurjabber.com/1, bot@monserveurjabber.com/2, &#8230;).</p>
<p><strong>Résumé</strong></p>
<p>Pour Noumba, nous avons développé un projet en Rails, le Hub, qui gère la file d&#8217;attente Jabber, et communique en REST avec le frontal Noumba. Si cette architecture est sur-dimensionnée pour votre projet, nul besoin d&#8217;un backend. Votre site et des bots suffisent amplement. De même quelques comptes Gmail suffisent si vos ne souhaitez pas déployer votre propre serveur Jabber.</p>
<p>Si un backend en Rails s&#8217;avère nécessaire il n&#8217;est pas conseillé de dupliquer les modèles de votre site principal vers celui-ci. Cela fonctionne mais le principe DRY est de fait supprimé. Cependant un outil tel que <a href="http://blog.teksol.info/2007/4/20/sharing-models-between-two-rails-applications-using-piston">Piston</a> permet de temporiser cette affirmation.</p>
<p><strong>Les autres</strong></p>
<p>Après divers essais Twitter a fini par développer son propre serveur de file qui exploite memcached, <a href="http://blog.twitter.com/2008/01/twitters-starling-released-as-open.html">starling</a></p>
<p>Un développeur de <a href="http://seesmic.com/">Seesmic</a> indique utiliser ActiveMQ et RabbitMQ mais semble vouloir migrer vers une solution XMPP : <a href="http://code-bear.com/bearlog/2008/01/18/scaling-questions-and-issues">scaling-questions-and-issues</a></p>
<p>Il existe un grand nombre d&#8217;alternatives, on peut citer :</p>
<ul>
<li><a href="http://xph.us/software/beanstalkd/">Beanstalkd</a> , <a href="http://nubyonrails.com/articles/about-this-blog-beanstalk-messaging-queue">about-this-blog-beanstalk-messaging-queue</a></li>
</ul>
<ul>
<li><a href="http://code.google.com/p/sparrow/">Sparrow</a></li>
</ul>
<ul>
<li><a href="http://ap4r.rubyforge.org/wiki/wiki.pl?HomePage">AP4R</a></li>
</ul>
<p>Les deux premiers utilisent le twisted like <a href="https://rubyforge.org/projects/eventmachine/">eventmachine</a></p>
<p><strong>Bémol</strong></p>
<p>Une telle architecture implique la gestion d&#8217;un serveur Jabber, ce qui peut s&#8217;avérer une tâche plus complexe et lourde qu&#8217;un réel MoM dédié. De plus la stabilité de la bibliothèque xmpp4r ainsi que le plugin ActionMessenger est à surveiller de près. Pour ce dernier, il a été nécessaire de le patcher afin qu&#8217;il puisse supporter plusieurs instances Rails.</p>
<p><strong>Avenir</strong></p>
<p>XMPP est un protocole standard et ouvert très répandu ce qui en fait un candidat idéal si l&#8217;on souhaite une architecture pérenne et évolutive. L&#8217;architecture décentralisée de Jabber et ses capacités à se connecter à des services externes tel que OpenID (<a href="http://xmppid.net/">xmppid.net</a>) ouvre la porte à une multitude de possibilités.</p>
<p>Ses nombreuses fonctionnalités dédiés au chat (room, pub/sub, voIP, &#8230;) sont toutes indiquées pour des sites communautaires et sociaux à tel point que le projet <a href="http://diso-project.org/">DiSo</a> souhaite l&#8217;utiliser en son coeur, mais ceci est un autre sujet.</p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/fredix.wordpress.com/63/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/fredix.wordpress.com/63/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/fredix.wordpress.com/63/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/fredix.wordpress.com/63/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/fredix.wordpress.com/63/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/fredix.wordpress.com/63/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/fredix.wordpress.com/63/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/fredix.wordpress.com/63/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/fredix.wordpress.com/63/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/fredix.wordpress.com/63/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/fredix.wordpress.com/63/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/fredix.wordpress.com/63/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/fredix.wordpress.com/63/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/fredix.wordpress.com/63/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/fredix.wordpress.com/63/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/fredix.wordpress.com/63/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=frederic.logier.org&amp;blog=3098224&amp;post=63&amp;subd=fredix&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://frederic.logier.org/2008/01/22/de-la-repartition-de-charge-en-ruby-on-rails-22/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/0fc8e5d51ed3c0726b2826e8caeb8017?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">fredix</media:title>
		</media:content>
	</item>
		<item>
		<title>Twitter</title>
		<link>http://frederic.logier.org/2007/08/05/twitter/</link>
		<comments>http://frederic.logier.org/2007/08/05/twitter/#comments</comments>
		<pubDate>Sun, 05 Aug 2007 14:20:00 +0000</pubDate>
		<dc:creator>fredix</dc:creator>
				<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://fredix.wordpress.com/2007/08/05/twitter/</guid>
		<description><![CDATA[Twitter est ce nouveau service web qui déclenche pas mal de troll, voir de mépris depuis quelques temps sur le web. En effet l’idée de raconter ce qu’on fait à chaque instant paraît ridicule, exemple “Je fais popo” intéressera sans doute pas grand monde, hormis votre médecin si vous êtes suivi Bref, si on s’arrête [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=frederic.logier.org&amp;blog=3098224&amp;post=61&amp;subd=fredix&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<div class="post-body">
<p><a href="http://twitter.com/">Twitter</a> est ce nouveau service web qui déclenche pas mal de troll, voir de mépris depuis quelques temps sur le web.</p>
<p>En effet l’idée de raconter ce qu’on fait à chaque instant paraît ridicule, exemple “Je fais popo” intéressera sans doute pas grand monde, hormis votre médecin si vous êtes suivi <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Bref, si on s’arrête là sans creuser plus loin ça paraît sans intérêt. Pourtant il suffit de chercher pas bien longtemps pour découvrir qu’une idée génial sort presque tous les jours autour de Twitter.</p>
<p>Tout d’abord sur le contenu. Le dernier en date vu sur le <a href="http://twitter.com/blog/2007/08/pc-world-la-fire-department-all.html">blog de Twitter</a> explique comment les pompiers de Los Angeles <a href="http://twitter.com/LAFD">l’utilise</a> pour informer sur les interventions en cours. Qui oserait dire que c’est une information inutile ?. En tout cas elle l’est moins que “je fais popo”.</p>
<p>Twitter subit le même mépris que les blogs à leur début : “Mais c’est nul de raconter sa vie à tout le monde ! Ca va intéresser qui ?!” La réponse est connue depuis longtemps car les blogs sont entrés dans les moeurs : Cela va intéresser ceux qui s’intéresse à ta personne et/ou à ton contenu. <span class="caps">CQFD</span>.</p>
<p>Et bien Twitter c’est la même chose, sauf que là s’agissant d’un micro-contenu, la forme et l’objectif sont complètement différent. Pour une personne il s’agit de transmettre une humeur, ou une information mais pas suffisamment importante pour en faire un billet dans un blog. Autre cas, transmettre une info par <span class="caps">SMS</span> en n’ayant que son <span class="caps">GSM</span> sous la main.</p>
<p>Pour un service comme les pompiers un blog n’est que de peu d’appui pour le travail quotidien. Twitter permet de transmettre une information importante et concise à un nombre quelconque de personnes : les personnes concernées. Ici tous les services travaillant avec eux, ou simplement les usagers désirant être informé rapidement en temps réel.</p>
<p>Car la force de Twitter est d’utiliser un service de transmission qui semblait réservé à une génération analphabète de “KIKOO <span class="caps">LOL</span>” : le <span class="caps">SMS</span>.</p>
<p>On peut donc recevoir en temps réel sur son téléphone portable les interventions en cours des pompiers de LA. Et ceci n’est qu’un exemple parmi d’autres :</p>
<ul>
<li>Une association désirant informer en temps réel ses membres sur l’humeur du stand à Solution Linux par exemple.</li>
<li>Une entreprise désirant informer ses clients des dernières promotions, exemple <a href="http://twitter.com/DellOutlet">Dell</a></li>
<li>Une <span class="caps">ONG</span> souhaitant communiquer chaque évènement sur le terrain, exemple <a href="http://twitter.com/oceandoctor">oceandoctor</a>.</li>
<li>Une radio web indiquant le titre en cours, exemple (l’excellente) <a href="http://twitter.com/groovesalad">Groove salad</a> de <a href="http://somafm.com/">soma fm</a>. D’ailleurs intégrer l’API twitter à <a href="http://www.gnome.org/projects/rhythmbox/">Rhythmbox</a> ,par exemple, serait très pratique car permettrait d’activer les notifications IM de cette radio que si on l’écoute.</li>
<li>etc, etc.</li>
</ul>
<p>Twitter peut évidement servir aux <span class="caps">VIP</span> souhaitant informer leurs fans au quotidien, exemple avec <a href="http://noumba.net/dida">Dida</a> et <a href="http://noumba.net/vitaa">Vitaa</a> sur <a href="http://noumba.net/">Noumba</a>, le petit clone français (<a href="http://sokborey.blogspot.com/2007/07/la-chanteuse-rnb-vitaa-utilise-noumba.html">source</a>). D’aucun diront qu’ils ne s’intéressent pas à ces stars, mais rien empêche <span class="caps">RMS</span> ou Linus de poster à propos d’un hack en cours intéressant <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  D’ailleurs <a href="http://tirania.org/blog">Miguel De Icaza</a> <a href="http://twitter.com/migueldeicaza">utilise Twitter</a>.</p>
<p>Ensuite les services annexes. Un certain nombre d’entreprise (ou futur) ont vu le potentiel de Twitter et proposent des services permettant de l’étendre. Comme <a href="http://retweet.com/">retweet</a> qui propose :</p>
<ul>
<li><a href="http://twittercal.com/">twittercal</a> qui fait le lien entre Twitter et Google calendar. Après inscription un simple <span class="caps">SMS</span> à <a href="http://twitter.com/twittercal">twittercal</a> permet de mettre à jour son agenda. Énorme.</li>
<li><a href="http://twitter.com/fonf">Fonf</a> qui sur un simple <span class="caps">SMS</span> indique le point Wifi <span class="caps">FON</span> le plus proche.</li>
<li><a href="http://retweet.com/timer">Timer</a> un réveil programmable.</li>
<li>etc, etc.</li>
</ul>
<p>Autre exemple étonnant avec le <a href="http://www.multimap.com/twitterbot/">bot multimap</a> qui permet d’indiquer par <span class="caps">SMS</span> les lieux intéressant à l’endroit où l’on se trouve, ou bien comment aller d’un point A à un point B.</p>
<p>L’envoi et la réception des messages ne se limite pas aux <span class="caps">SMS</span> bien sûr, mais web (bof) et messagerie instantanée. Inutile donc de consulter sa page. Twitter ne gérant pas l’envoi et la réception depuis les mails et <span class="caps">MSN</span>, cela a été étendu depuis des services extérieur <a href="http://twittermail.com/">twittermail</a> et <a href="http://twittermsn.com/">twittermsn</a>.<br />Quand vous fournissez une <span class="caps">API</span> vous pouvez toujours compter sur quelqu’un pour ajouter ce à quoi vous n’avez pas pensé ou n’avez pas eu le temps d’implémenter <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>En résumé le succès de Twitter vient de son <span class="caps">API</span> et de l’usage (gratuit!) des <span class="caps">SMS</span>. Le reste vient de l’imagination des usagers qui est sans limite ; plus que celle de certains blogueurs en tout cas <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
</div>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/fredix.wordpress.com/61/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/fredix.wordpress.com/61/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/fredix.wordpress.com/61/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/fredix.wordpress.com/61/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/fredix.wordpress.com/61/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/fredix.wordpress.com/61/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/fredix.wordpress.com/61/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/fredix.wordpress.com/61/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/fredix.wordpress.com/61/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/fredix.wordpress.com/61/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/fredix.wordpress.com/61/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/fredix.wordpress.com/61/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/fredix.wordpress.com/61/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/fredix.wordpress.com/61/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/fredix.wordpress.com/61/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/fredix.wordpress.com/61/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=frederic.logier.org&amp;blog=3098224&amp;post=61&amp;subd=fredix&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://frederic.logier.org/2007/08/05/twitter/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/0fc8e5d51ed3c0726b2826e8caeb8017?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">fredix</media:title>
		</media:content>
	</item>
	</channel>
</rss>