<?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; fredix</title>
	<atom:link href="http://frederic.logier.org/author/fredix/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; fredix</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>Une API asynchrone avec Gearman, Sinatra et mongoID</title>
		<link>http://frederic.logier.org/2010/06/22/une-api-asynchrone-avec-gearman-sinatra-et-mongoid/</link>
		<comments>http://frederic.logier.org/2010/06/22/une-api-asynchrone-avec-gearman-sinatra-et-mongoid/#comments</comments>
		<pubDate>Tue, 22 Jun 2010 08:17:32 +0000</pubDate>
		<dc:creator>fredix</dc:creator>
				<category><![CDATA[rails]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[gearman]]></category>
		<category><![CDATA[mongodb]]></category>
		<category><![CDATA[sinatra]]></category>

		<guid isPermaLink="false">http://frederic.logier.org/?p=222</guid>
		<description><![CDATA[Même si Ruby on Rails facilite énormément la création d&#8217;une API REST il y a un grand intérêt à séparer le site frontal de l&#8217;API. Le site peut subir des montées en charge ou une coupure de maintenance qui occasionnerait de fait une interruption de l&#8217;API. Or s&#8217;il peut être gênant que le frontal soit interrompu, ça [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=frederic.logier.org&amp;blog=3098224&amp;post=222&amp;subd=fredix&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Même si Ruby on Rails facilite énormément la création d&#8217;une API REST il y a un grand intérêt à séparer le site frontal de l&#8217;API. Le site peut subir des montées en charge ou une coupure de maintenance qui occasionnerait de fait une interruption de l&#8217;API. Or s&#8217;il peut être gênant que le frontal soit interrompu, ça l&#8217;est encore plus pour l&#8217;API qui permet de mettre à jour des données ou de les fournir à une multitude de clients tiers. Dans ce billet je présente sans aller trop loin dans les détails, la création de cette API.<span id="more-222"></span><a href="http://www.sinatrarb.com" target="_blank"></a></p>
<p><a href="http://www.sinatrarb.com" target="_blank">Sinatra</a> est un framework web léger non MVC qui permet via son DSL de répondre à toutes les méthodes HTTP (DELETE, PUT,POST,GET) simplement et en utilisant un seul fichier Ruby. <a href="http://www.sinatrarb.com/intro" target="_blank">L&#8217;introduction</a> démontre la plupart de ses capacités. C&#8217;est à mon avis idéal pour servir une API plutôt que de sortir l&#8217;artillerie lourde Rails.</p>
<p><a href="http://mongoid.org/" target="_blank">MongoID</a> est un driver Ruby pour la base NoSQL <a href="http://www.mongodb.org/" target="_blank">mongoDB</a>. Il est en concurrence avec <a href="http://mongomapper.com/" target="_blank">MongoMapper</a>.</p>
<p><a href="http://gearman.org/" target="_blank">Gearman</a> est un serveur qui fait parti des innombrables serveur de job. En effet depuis ces dernières années un nouveau serveur sort tous les 6 mois ou presque avec plus ou moins de succès. Parmi ceux-ci on peut citer <a href="http://kr.github.com/beanstalkd/" target="_blank">Beanstalkd</a> ou <a href="http://www.rabbitmq.com/" target="_blank">RabbitMQ</a>, il existe un &laquo;&nbsp;vieux&nbsp;&raquo; (1 an) comparatif non exhaustif de quelques serveurs de job <a href="http://www.darkcoding.net/software/choosing-a-message-queue-for-python-on-ubuntu-on-a-vps/" target="_blank">Choosing a message queue for Python on Ubuntu on a VPS</a>. Pour ajouter au trouble on peut trouver parmi eux des serveurs NoSQL type clé/valeur comme redis avec le plugin <a href="http://github.com/defunkt/resque" target="_blank">Resque</a>.</p>
<p>Je travaille depuis quelques mois sur mon projet <a href="http://www.nodecast.net" target="_blank">Nodecast</a> et je souhaitais rendre l&#8217;API asynchrone. Le principe du projet est qu&#8217;un client desktop extrait régulièrement des informations systèmes et les transmet au site web. Un serveur <a href="http://www.sinatrarb.com/" target="_blank">Sinatra</a> expose l&#8217;API et enregistre les données dans MongoDB. Le problème est que si de plus en plus clients viennent pusher leurs données sur le serveur Sinatra, celui-ci aura forcément de plus en plus de mal à encaisser la charge. Avec une architecture de ce type entre la requête HTTP POST du client et la réponse du serveur, tout fonctionne de manière synchrone, de fait si le serveur Sinatra atteins son pallier il ne sera plus en mesure de répondre à de nouvelles requêtes. Il est nécessaire que l&#8217;échange entre le client et le serveur Sinatra soit le plus rapide possible.</p>
<p>Pour cela il est essentiel de découpler l&#8217;interaction entre le serveur et le travail effectué. Pour comprendre cela imaginons que le client ne transmette pas d&#8217;informations systèmes mais carrément une vidéo que le serveur devra par exemple ré-encoder. Il n&#8217;est pas concevable que lorsque le client (desktop ou browser) a fini de poster la vidéo, l&#8217;utilisateur doive encore attendre la fin du réencodage du film avant d&#8217;avoir la main. Ce travail de ré-encodage doit s&#8217;effectuer dans un 2ème temps.</p>
<p>La première règle à définir est que l&#8217;échange entre le client et le serveur doit s&#8217;effectuer le plus vite possible, c&#8217;est un échange du type &laquo;&nbsp;fire and forget&nbsp;&raquo;. Pour cela lorsque le client desktop poste les informations, le serveur ne doit renvoyer qu&#8217;un acknowledge et aucune autre information permettant au client de savoir si le travail s&#8217;est bien effectué. Car si c&#8217;était le cas on reviendrait à un fonctionnement synchrone &#8230; Cependant rien empêche le serveur de renvoyer au client un identifiant unique afin de lui permettre par la suite de connaitre via une autre requête l&#8217;état de du travail envoyé.</p>
<p>Pour rendre cela possible il est nécessaire de séparer le code qui réceptionne la requête du code qui va traiter la demande. Il manque un tampon entre les deux, car le code qui va traiter la demande, le worker, peut être justement occupé à en traiter une. L&#8217;intérêt d&#8217;un serveur de job (appelé aussi serveur de file de message) est de stocker le job et le transmettre au worker lorsque celui-ci en fait la demande. Dans l&#8217;industrie il existe le protocole <a href="http://www.amqp.org" target="_blank">AMQP</a> que RabbitMQ implémente. Je n&#8217;ai malheureusement pas réussi à faire lancer ce dernier sur mon serveur Ubuntu 10.04. J&#8217;ai découvert Gearman qui est presque aussi simple d&#8217;usage sur Beanstalkd tout en proposant des capacités de montée en charge, un worker pouvant s&#8217;abonner à plusieurs serveurs Gearman. De plus cet outil est développé par <a href="http://www.danga.com/gearman/" target="_blank">Danga</a> pour LiveJournal, voir leur présentation sur le backend de LiveJournal : <a href="http://www.slideshare.net/SergeyChernyshev/behind-the-scenes-at-livejournal-scaling-storytime-158352" target="_blank">Behind the Scenes at LiveJournal: Scaling Storytime</a>.</p>
<p>Sinatra expose l&#8217;API, réceptionne les demandes des clients, les transmet aussitôt à Gearman dans une file nommée en fonction du job (update,insert,&#8230;) puis renvoie aussitôt un ack au client desktop pour lui confirmer que sa requête est prise en compte. Sinatra est donc rapidement disponible à réceptionner une nouvelle requête. Le worker est abonné aux files d&#8217;attente dont il a la charge, il supprime le job du serveur afin de le traiter. Enfin Gearman offre la possibilité au worker de retourner au client l&#8217;état du travail effectué. Le client, ici Sinatra, dispose de ces 3 méthodes :</p>
<div id="_mcePaste">task.on_complete {|d| logger.info &laquo;&nbsp;complete : #{d}&nbsp;&raquo; }</div>
<div id="_mcePaste">task.on_warning {|w| logger.info &laquo;&nbsp;[client] warn: #{w}&nbsp;&raquo; }</div>
<div id="_mcePaste">task.on_fail {|f| logger.info &laquo;&nbsp;[client] failed : #{f}&nbsp;&raquo; }</div>
<p>Il peut ainsi stocker dans un fichier de log le statut du worker.</p>
<p>Voici le code du client Sinatra lancé par Thin :</p>
<pre>#!/usr/bin/env ruby
require 'rubygems'

require 'gearman'

require "bundler"

Bundler.setup

Bundler.require(:default)

RAILS_ENV="development"

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)

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)

# logger.info "AUTH = #{@auth.inspect}"

@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("POST")

uuid = UUIDTools::UUID.timestamp_create.to_s

host = {

:user =&gt; @current_user.email,

:uuid =&gt; uuid,

:datas =&gt; xml

}

client = Gearman::Client.new(SERVERS)

taskset = Gearman::Taskset.new

# task = Gearman::Task.new('add', Marshal.dump(xml), :background =&gt; true, :poll_status_interval =&gt; 1)

task = Gearman::Task.new('add', Marshal.dump(host))

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 &lt;&lt; task

client.run(taskset)

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)

host = {

:user =&gt; @current_user.email,

:uuid =&gt; params[:id],

:datas =&gt; xml

}

logger.info("UPDATE")

client = Gearman::Client.new(SERVERS)

taskset = Gearman::Taskset.new

#task = Gearman::Task.new('update', Marshal.dump(host), :background =&gt; true, :poll_status_interval =&gt; 1)

task = Gearman::Task.new('update', Marshal.dump(host))

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 &lt;&lt; task

client.run(taskset)

builder do |xml|

xml.instruct!

xml.host do

xml.status "proceed"

end

end

end</pre>
<p>et le code du worker lancé par un script daemons</p>
<pre>#!/usr/bin/env ruby
require 'rubygems'

gem 'mongoid', '1.9.0'
require 'mongoid'
gem 'gearman-ruby', '2.0.0'
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.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)
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/load_statistic.rb"
require "#{options[:work]}/models_mongoid/memory_statistic.rb"
require "#{options[:work]}/models_mongoid/uptime_statistic.rb"
require "#{options[:work]}/models_mongoid/network_statistic.rb"
require "#{options[:work]}/models_mongoid/cpu_statistic.rb" 

########## JOB ADD HOST ############
@@worker.add_ability('add') do |data,job|

  dump = Marshal.load(data)
  xml = dump[:datas]

  @current_user = User.where(:email =&gt; dump[:user]).first

  p "user = #{@current_user.inspect}"

  push_host = {
    :uuid =&gt; dump[:uuid],
    :public =&gt; xml['host']['public'],
    <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_surprised.gif' alt=':o' class='wp-smiley' /> s_version =&gt; xml['host']['version'],
    :patch_level =&gt; xml['host']['patch_level'].nil? ? "" : xml['host']['patch_level'].downcase,
    :cpu_vendor =&gt; xml['host']['cpu_vendor'],
    :architecture =&gt; xml['host']['architecture'],
    :cpu_model =&gt; xml['host']['cpu_model'],
    :cpu_mhz =&gt; xml['host']['cpu_mhz'],
    :cpu_cache_size =&gt; xml['host']['cpu_cache_size'],
    :cpu_number =&gt; xml['host']['cpu_number'],
    :cpu_total_cores =&gt; xml['host']['cpu_total_cores'],
    :cpu_total_sockets =&gt; xml['host']['cpu_total_sockets'],
    :cpu_cores_per_socket =&gt; xml['host']['cpu_cores_per_socket'],
    :mem_ram =&gt; xml['host']['mem_ram'],
    :mem_total =&gt; xml['host']['mem_total'],
    :hostname =&gt; xml['host']['hostname'],
    :domain_name =&gt; xml['host']['domain_name'],
    :default_gateway =&gt; xml['host']['default_gateway'],
    :primary_dns =&gt; xml['host']['primary_dns'],
    :secondary_dns =&gt; xml['host']['secondary_dns'],
    :primary_interface =&gt; xml['host']['primary_interface'],
    :primary_addr =&gt; xml['host']['primary_addr'],
    :user_id =&gt; @current_user.id
  }

  host_uptime = {
    :time =&gt; xml['host']['uptime_time'],
    :days =&gt; xml['host']['uptime_days']
  }

  host_load = {
    :loadavg0 =&gt; xml['host']['loadavg0'],
    :loadavg1 =&gt; xml['host']['loadavg1'],
    :loadavg2 =&gt; xml['host']['loadavg2']
  }

  host_mem = {
    :mem_used =&gt; xml['host']['mem_used'],
    :mem_free =&gt; xml['host']['mem_free'],
    :mem_actual_free =&gt; xml['host']['mem_actual_free'],
    :mem_actual_used =&gt; xml['host']['mem_actual_used'],
    :mem_actual_free_percent =&gt; xml['host']['mem_actual_free_percent'],
    :mem_actual_used_percent =&gt; xml['host']['mem_actual_used_percent'],
    :swap_total =&gt; xml['host']['swap_total'],
    :swap_used =&gt; xml['host']['swap_used'],
    :swap_free =&gt; xml['host']['swap_free'],
    :swap_page_in =&gt; xml['host']['swap_page_in'],
    :swap_page_out =&gt; xml['host']['swap_page_out']
    }

  host_network = {
    :rx_rate =&gt; xml['host']['rx_rate'],
    :tx_rate =&gt; xml['host']['tx_rate']
  }

  host_cpu = {
    :user =&gt; xml['host']['cpu_user'],
    :sys =&gt; xml['host']['cpu_sys'],
    :nice =&gt; xml['host']['cpu_nice'],
    :idle =&gt; xml['host']['cpu_idle'],
    :wait =&gt; xml['host']['cpu_wait'],
    :irq =&gt; xml['host']['cpu_irq'],
    :soft_irq =&gt; xml['host']['cpu_soft_irq'],
    :stolen =&gt; xml['host']['cpu_stolen'],
    :combined =&gt; xml['host']['cpu_combined'],
    :total =&gt; xml['host']['cpu_total']
  }

  begin
    profil = @current_user.profils.where(:context =&gt; xml['host']['profil']).first

    if !profil
      profil = @current_user.profils.create(:context  =&gt; xml['host']['profil'])
    end

    @host = profil.hosts.create(push_host)

    osystem = Osystem.where(:vendor =&gt; xml['host']['vendor'].downcase, :vendor_version =&gt; xml['host']['vendor_version'].downcase).first

    if !osystem
      osystem = Osystem.create(
                               :name =&gt; xml['host']['name'].downcase,
                               :vendor =&gt; xml['host']['vendor'].downcase,
                               :vendor_version =&gt; xml['host']['vendor_version'].downcase,
                               :vendor_code_name =&gt; xml['host']['vendor_code_name'].nil? ? "" : xml['host']['vendor_code_name'].downcase,
                               :description =&gt; xml['host']['description'],
                               <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_surprised.gif' alt=':o' class='wp-smiley' /> s_base =&gt; xml['host']['os_base'],
                               <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_surprised.gif' alt=':o' class='wp-smiley' /> s_type =&gt; xml['host']['os_type']
                               )
    end

    @host.osystem_id = osystem.id
    osystem.hosts_number += 1
    osystem.save
    @host.save

    if xml['host']['activated_memory'] == "true"
      @host.memory_statistics.create(host_mem)
    end

    if xml['host']['activated_load'] == "true"
      @host.load_statistics.create(host_load)
    end

    if xml['host']['activated_uptime'] == "true"
      @host.uptime_statistics.create(host_uptime)
    end

    if xml['host']['activated_network'] == "true"
      @host.network_statistics.create(host_network)
    end

    if xml['host']['activated_cpu'] == "true"
      @host.cpu_statistics.create(host_cpu)
    end

  rescue =&gt; e
    logger.info "error on create host : #{e}"
  end

  @current_user.hosts_number += 1
  @current_user.save

logger.info "created"
end

########## JOB UPDATE HOST ############
@@worker.add_ability('update') do |data,job|

  dump = Marshal.load(data)
  xml = dump[:datas]

  @current_user = User.where(:email =&gt; dump[:user]).first
  @host = Host.where(:uuid =&gt; dump[:uuid], :blocked =&gt; false).first

  if !@host
logger.info "host unknown"

  elsif @current_user.hosts.include?(@host)
    # os = Osystem.find(:all, :conditions =&gt; "lower(name) = '#{xml['host'][:os_name].downcase}' AND lower(codename) LIKE '%#{xml['host'][:os_codename].downcase}%' AND version = '#{xml['host'][:os_release]}' AND computer_architecture = '#{xml['host'][:architecture]}'")

    host_uptime = {
      :time =&gt; xml['host']['uptime_time'],
      :days =&gt; xml['host']['uptime_days']
    }

    host_load = {
      :loadavg0 =&gt; xml['host']['loadavg0'],
      :loadavg1 =&gt; xml['host']['loadavg1'],
      :loadavg2 =&gt; xml['host']['loadavg2']
    }

    host_mem = {
      :mem_used =&gt; xml['host']['mem_used'],
      :mem_free =&gt; xml['host']['mem_free'],
      :mem_actual_free =&gt; xml['host']['mem_actual_free'],
      :mem_actual_used =&gt; xml['host']['mem_actual_used'],
      :mem_actual_free_percent =&gt; xml['host']['mem_actual_free_percent'],
      :mem_actual_used_percent =&gt; xml['host']['mem_actual_used_percent'],
      :swap_total =&gt; xml['host']['swap_total'],
      :swap_used =&gt; xml['host']['swap_used'],
      :swap_free =&gt; xml['host']['swap_free'],
      :swap_page_in =&gt; xml['host']['swap_page_in'],
      :swap_page_out =&gt; xml['host']['swap_page_out']
    }

    host_network = {
      :rx_rate =&gt; xml['host']['rx_rate'],
      :tx_rate =&gt; xml['host']['tx_rate']
    }

    host_cpu = {
      :user =&gt; xml['host']['cpu_user'],
      :sys =&gt; xml['host']['cpu_sys'],
      :nice =&gt; xml['host']['cpu_nice'],
      :idle =&gt; xml['host']['cpu_idle'],
      :wait =&gt; xml['host']['cpu_wait'],
      :irq =&gt; xml['host']['cpu_irq'],
      :soft_irq =&gt; xml['host']['cpu_soft_irq'],
      :stolen =&gt; xml['host']['cpu_stolen'],
      :combined =&gt; xml['host']['cpu_combined'],
      :total =&gt; xml['host']['cpu_total']
    }

    begin

      if xml['host']['profil'] != @host.profil.context
        profil = @current_user.profils.where(:context =&gt; xml['host']['profil']).first
        if !profil
          profil = @current_user.profils.create(:context  =&gt; xml['host']['profil'])
        end
        @host.profil = profil
        @host.save
      end

         if xml['host']['activated_memory'] == "true"
           mem = @host.memory_statistics.create(host_mem)
         end

         if xml['host']['activated_load'] == "true"
           @host.load_statistics.create(host_load)
         end

         if xml['host']['activated_uptime'] == "true"
           @host.uptime_statistics.create(host_uptime)
         end

         if xml['host']['activated_network'] == "true"
           @host.network_statistics.create(host_network)
         end

         if xml['host']['activated_cpu'] == "true"
           @host.cpu_statistics.create(host_cpu)
         end

         logger.info "updated"

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

  else
    logger.info "unauthorized update"
    raise Exception.new("unauthorized update")
  end
end

@@worker.work</pre>
<br />Filed under: <a href='http://frederic.logier.org/category/rails/'>rails</a>, <a href='http://frederic.logier.org/category/ruby/'>ruby</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/sinatra/'>sinatra</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/fredix.wordpress.com/222/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/fredix.wordpress.com/222/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/fredix.wordpress.com/222/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/fredix.wordpress.com/222/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/fredix.wordpress.com/222/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/fredix.wordpress.com/222/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/fredix.wordpress.com/222/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/fredix.wordpress.com/222/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/fredix.wordpress.com/222/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/fredix.wordpress.com/222/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/fredix.wordpress.com/222/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/fredix.wordpress.com/222/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/fredix.wordpress.com/222/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/fredix.wordpress.com/222/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=frederic.logier.org&amp;blog=3098224&amp;post=222&amp;subd=fredix&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://frederic.logier.org/2010/06/22/une-api-asynchrone-avec-gearman-sinatra-et-mongoid/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>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>Samsung Spica &amp; Android</title>
		<link>http://frederic.logier.org/2010/04/04/samsung-spica-android/</link>
		<comments>http://frederic.logier.org/2010/04/04/samsung-spica-android/#comments</comments>
		<pubDate>Sun, 04 Apr 2010 19:18:31 +0000</pubDate>
		<dc:creator>fredix</dc:creator>
				<category><![CDATA[android]]></category>
		<category><![CDATA[spica]]></category>

		<guid isPermaLink="false">http://frederic.logier.org/?p=176</guid>
		<description><![CDATA[Update : voici un tutoriel complet sur la mise à jour via Odin Il y a quelques mois j&#8217;ai fais l&#8217;acquisition d&#8217;un Samsung Spica, l&#8217;un des smartphone sous Android le moins cher à ce jour. J&#8217;ai profité d&#8217;une offre de reprise de mon HTC touch en windows mobile daubé, chez Rueducommerce, avec qui j&#8217;ai d&#8217;ailleurs [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=frederic.logier.org&amp;blog=3098224&amp;post=176&amp;subd=fredix&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><strong><em>Update :</em></strong><em> voici un </em><a href="http://www.frandroid.com/forum/viewtopic.php?id=10431" target="_blank"><em>tutoriel complet sur la mise à jour via Odin</em></a></p>
<p>Il y a quelques mois j&#8217;ai fais l&#8217;acquisition d&#8217;un <a href="http://fr.samsungmobile.com/pid47-cell_idGT-I5700/samsung-gt-i5700.html" target="_blank">Samsung Spica</a>, l&#8217;un des smartphone sous Android le moins cher à ce jour. J&#8217;ai profité d&#8217;une <a href="http://rueducommerce.regenerationmobile.fr/" target="_blank">offre de reprise</a> de mon HTC touch en windows mobile daubé, chez Rueducommerce, avec qui j&#8217;ai d&#8217;ailleurs du échanger quelques mails pour pouvoir utiliser le code promo. Petite surprise ensuite à la réception en voyant que le tel démarrait en néerlandais, problème confirmé par la doc papier. Heureusement dès la connexion réseau Android a basculé seul en français.</p>
<p>Bref, depuis j&#8217;attendais patiemment la mise à jour de Samsung du Spica en Android 2.1 Eclair prévue fin mars. Et là je dois dire que ca a été l&#8217;enfer. L&#8217;outil officiel de samsung, New PC Studio, est une vraie merde des années 90, mais en plus une merde en plusieurs exemplaires selon la source. 1.2 sur le CD, 1.3 sur le site FR, 1.4 sur le sous domaine ma.samsungmobile.com et enfin 1.5 béta fournie par une source sur twitter (<a href="http://twitter.com/SamsungFirmware">twitter.com/SamsungFirmware</a>). J&#8217;ai passé des heures à installer, ré-installer chaque version, et les quelques fois ou le soft NPS ne plantait pas, et où les serveurs samsung répondaient, aucune mise à jour de dispo pour mon tel ou plutôt si, une qui m&#8217;a ré-installé Android 1.5 !</p>
<p>Mon Spica était censé être acheté nu (sans abonnement) mais j&#8217;ai fini par en douter, car j&#8217;ai appris entre temps que cette mise à jour ne concernait que les Spica nus &#8230; Finalement j&#8217;ai fini par utiliser l&#8217;outil non officiel des mises à jour, Odin, après avoir récupéré la ROM qui va bien, quitte à perdre la garantie. A savoir afin de ne pas perdre à nouveau quelques heures (sic) qu&#8217;il est nécessaire de désactiver l&#8217;antivirus, sous peine qu&#8217;Odin ne voit pas le Spica sur l&#8217;USB ! Bonjour la Windowserie &#8230; Ah oui j&#8217;ai du faire la mise à jour sur un Windows natif car l&#8217;accès USB depuis VirtualBox a fait planter le kernel 2.6.32 de Fedora, aie. Et bien entendu l&#8217;outil ou plutôt la bouse de mise à jour NPS ne fonctionne que sur Windows, t&#8217;es sur Linux ou MacOS -&gt; DTC. Idem pour Odin d&#8217;ailleurs, mais c&#8217;est pardonnable puisque ce n&#8217;est pas l&#8217;outil de Samsung.</p>
<p>Au final la 2.1 donne l&#8217;accès à certaines applications du market qui n&#8217;étaient pas disponible pour Android 1.5. Par contre pas de wallpaper animé même après en avoir installé. Sinon il est clair qu&#8217;Android est un vrai danger pour l&#8217;iPphone. Enfin un smartphone réactif (contrairement à windows mobile) avec un OS étudié pour, un market digne de ce nom, efficace et qui propose des mises à jour des logiciels installés. Bien entendu une synchronisation avec son compte Google (contacts, mails, calendrier), et la possibilité avec la 2.1 d&#8217;utiliser plusieurs comptes Google , très pratique quand son compte principal est sur Google apps car il ne donne accès qu&#8217;à un nombre restreint d&#8217;applications web Google. Et le tout en code libre.</p>
<p>Dans une industrie des télécoms figée, habituée à gratter les consommateurs,  Samsung essaye bien de fournir une mise à jour en trainant les pieds, mais a malgré tout sorti un nouveau modèle quasi identique en Android 2.1&#8230; J&#8217;ai d&#8217;ailleurs lu (perdu la source) que Google souhaiterait proposer lui même les mises à jour du système, évidement afin de passer outre les freins et l&#8217;incompétence des constructeurs et des opérateurs. On aurait ainsi ce que l&#8217;on vie avec bonheur depuis des années sur n&#8217;importe quel PC / Linux. On peut remercier Google pour cela, arriver à désenclaver cette industrie avec du libre, où Internet n&#8217;est pas Internet (et en plus s&#8217;en vanter).</p>
<p>Certes Google c&#8217;est Big Brother, boooooou, mais à défaut d&#8217;alternative équivalente (sérieuse et libre) je leur accorde ma confiance. Et d&#8217;ailleurs une telle alternative est possible puisque l&#8217;<a href="http://www.archos.com" target="_blank">Archos</a> utilise Android et son propre market <a href="http://appslib.com" target="_blank">AppsLib</a>.</p>
<p>Les sources :</p>
<p>Le <a href="http://www.frandroid.com/forum/viewforum.php?id=40" target="_blank">forum Frandroid</a> dédié au Spica avec pas mal de bruits malheureusement.</p>
<p><a href="http://www.sosandroid.fr/forumAndroid/topic198.html" target="_blank">Un tuto de mise à jour via Odin</a> , j&#8217;ai par contre paramétré l&#8217;archive .tar sur &laquo;&nbsp;PDA&nbsp;&raquo; comme indiqué sur certains forums et non &laquo;&nbsp;One Package&nbsp;&raquo;</p>
<p>Les <a href="http://samsung-firmware.webs.com/WEBPROTECT-samsungandroidi5700.htm" target="_blank">firmwares Android pour Spica</a> avec l&#8217;outil Odin et un <a href="http://samsung-firmware.webs.com/I5700_Flash_Tutorial_French.pdf" target="_blank">PDF de mise à jour</a> (attention erroné puisqu&#8217;il faut appuyer sur le bouton caméra et non la touche OK pour basculer en mode mise à jour du firmware). J&#8217;ai installé le I570EXXJCF dernier à ce jour.</p>
<p><a href="http://twitter.com/SamsungFirmware" target="_blank">@SamsungFirmware</a> le twitter du site.</p>
<br />Filed under: <a href='http://frederic.logier.org/category/android/'>android</a> Tagged: <a href='http://frederic.logier.org/tag/spica/'>spica</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/fredix.wordpress.com/176/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/fredix.wordpress.com/176/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/fredix.wordpress.com/176/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/fredix.wordpress.com/176/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/fredix.wordpress.com/176/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/fredix.wordpress.com/176/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/fredix.wordpress.com/176/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/fredix.wordpress.com/176/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/fredix.wordpress.com/176/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/fredix.wordpress.com/176/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/fredix.wordpress.com/176/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/fredix.wordpress.com/176/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/fredix.wordpress.com/176/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/fredix.wordpress.com/176/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=frederic.logier.org&amp;blog=3098224&amp;post=176&amp;subd=fredix&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://frederic.logier.org/2010/04/04/samsung-spica-android/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>RMS à Lyon</title>
		<link>http://frederic.logier.org/2010/01/14/rms-a-lyon/</link>
		<comments>http://frederic.logier.org/2010/01/14/rms-a-lyon/#comments</comments>
		<pubDate>Thu, 14 Jan 2010 01:19:03 +0000</pubDate>
		<dc:creator>fredix</dc:creator>
				<category><![CDATA[MondeLibre]]></category>

		<guid isPermaLink="false">http://frederic.logier.org/?p=146</guid>
		<description><![CDATA[Après presque 12 ans d&#8217;utilisation de logiciel libre, je viens enfin de rencontrer le gourou de tous les GNU/Linuxiens, RMS bien sûr. Cette rencontre a été organisée par L&#8217;ALDIL et L&#8217;université Lyon2 (http://www.colibre.org/module-Actus-display-sid-84.html ) donc merci beaucoup à eux. J&#8217;avais bien sûr visionné des vidéos de ses conférences et lu quelques comptes rendus, aussi ai-je [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=frederic.logier.org&amp;blog=3098224&amp;post=146&amp;subd=fredix&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Après presque 12 ans d&#8217;utilisation de logiciel libre, je viens enfin de rencontrer le gourou de tous les GNU/Linuxiens, RMS bien sûr. Cette rencontre a été organisée par L&#8217;ALDIL et L&#8217;université Lyon2 (<a href="http://www.colibre.org/module-Actus-display-sid-84.html" target="_blank">http://www.colibre.org/module-Actus-display-sid-84.html</a> ) donc merci beaucoup à eux.</p>
<p>J&#8217;avais bien sûr visionné des vidéos de ses conférences et lu quelques comptes rendus, aussi ai-je eu un sentiment de déjà vu tout le long de son discours qui s&#8217;est bien entendu terminé par une transformation en <a href="http://stallman.org/saint.html" target="_blank">Saint IGNUcius</a>.</p>
<p>Le discours et sa structure ne semble ne pas avoir changé depuis de nombreuses années, et son show a laissé malheureusement très peu de temps aux questions. Dommage car j&#8217;aurais voulu creuser sa position négative sur les &laquo;&nbsp;logiciels comme service&nbsp;&raquo; (Software As A Service) notamment par des entités comme la <a href="https://services.mozilla.com/" target="_blank">Mozilla Fondation</a> , <a href="http://wordpress.com/" target="_blank">WordPress.com</a> ou pourquoi pas la FSF. En effet l&#8217;avenir se dirige nettement vers ce type de services où même les systèmes d&#8217;exploitations y seront fortement liés (Google Chrome OS, JoliCloud, Android, iPhone, &#8230;) ou complètement déployé (<a href="http://eyeos.org/" target="_blank">eyeOS</a>). Il y aura donc de moins en moins la nécessité d&#8217;installer du logiciel, libre ou pas, mais certainement d&#8217;avoir des alternatives libres et éthiques aux SaaS.</p>
<p>Une question a été posé sur le modèle économique du libre. Il est intéressant de constater que RMS bote en touche en répondant que c&#8217;est comme de vouloir parler du modèle économique de la Liberté. Cependant il est curieux de constater que d&#8217;un côté il refuse à imaginer un modèle économique et de l&#8217;autre il exige via la GPL que n&#8217;importe qui puisse commercialiser les logiciels libres. J&#8217;en conclu que ce qui lui importe surtout, c&#8217;est laisser la liberté aux autres, quelle qu&#8217;elle soit, même si pour lui cela revient pour lui à vendre un bol d&#8217;air.</p>
<p>C&#8217;est à mon avis, exactement cette contradiction qui est à l&#8217;origine du mouvement qu&#8217;il réprouve, l&#8217;OpenSource. Or même si l&#8217;OpenSource présente le logiciel libre de manière pragmatique sans tong ni barbe, ce mouvement respecte bien entendu les licences libres et a permis sans aucun doute l&#8217;implication dans le mouvement, des entreprises. A contrario il est d&#8217;autant plus curieux de constater sa tolérance envers les licences libres BSD qui pourtant autorisent l&#8217;intégration de leurs codes dans du logiciel propriétaire, l&#8217;inverse ou presque de la GPL &#8230; <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Quant aux attaques envers Linus, on a grâce à lui la possibilité d&#8217;utiliser des systèmes libres depuis les années 1990, car on attend toujours le <a href="http://www.gnu.org/software/hurd/hurd.html" target="_blank">GNU Hurd</a> &#8230;</p>
<p>En tous les cas, très content d&#8217;avoir pu rencontrer cet emblème vivant des logiciels libres. Très content aussi d&#8217;avoir rencontré un fan d&#8217;Amiga visiblement touché par le personnage. En tant qu&#8217;ancien fan on peut dire que cette communauté est resté active, et a fini par comprendre l&#8217;intérêt des licences libres (voir <a href="http://aros.sourceforge.net/" target="_blank">AROS</a> et <a href="http://www.haiku-os.org/" target="_blank">Haiku)</a> car Libre is NOT UNIX <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Pour finir  j&#8217;ai eu la chance d&#8217;acheter en avant première sa <a href="http://www.eyrolles.com/Accueil/Livre/richard-stallman-et-la-revolution-des-logiciels-libres-9782212126099" target="_blank">biographie autorisée </a>et la faire dédicacer ! <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  (voir aussi <a href="http://www.couchet.org/blog/index.php5?post/2010/01/13/Richard-Stallman-%C3%A0-Paris-petite-revue-de-presse" target="_blank">Richard Stallman à Paris &#8211; petite revue de presse</a>)</p>
<p><a href="http://fredix.files.wordpress.com/2010/01/rms_livre.png"><img class="alignnone size-medium wp-image-148" title="RMS une biographie autorisée" src="http://fredix.files.wordpress.com/2010/01/rms_livre.png?w=232&#038;h=300" alt="" width="232" height="300" /></a></p>
<div id="attachment_145" class="wp-caption alignnone" style="width: 310px"><a href="http://fredix.files.wordpress.com/2010/01/00021.jpg"><img class="size-medium wp-image-145" title="00021" src="http://fredix.files.wordpress.com/2010/01/00021.jpg?w=300&#038;h=225" alt="" width="300" height="225" /></a><p class="wp-caption-text">RMS à Lyon le 13.01.2010</p></div>
<br />Publié dans MondeLibre  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/fredix.wordpress.com/146/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/fredix.wordpress.com/146/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/fredix.wordpress.com/146/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/fredix.wordpress.com/146/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/fredix.wordpress.com/146/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/fredix.wordpress.com/146/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/fredix.wordpress.com/146/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/fredix.wordpress.com/146/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/fredix.wordpress.com/146/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/fredix.wordpress.com/146/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/fredix.wordpress.com/146/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/fredix.wordpress.com/146/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/fredix.wordpress.com/146/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/fredix.wordpress.com/146/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=frederic.logier.org&amp;blog=3098224&amp;post=146&amp;subd=fredix&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://frederic.logier.org/2010/01/14/rms-a-lyon/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>

		<media:content url="http://fredix.files.wordpress.com/2010/01/rms_livre.png?w=232" medium="image">
			<media:title type="html">RMS une biographie autorisée</media:title>
		</media:content>

		<media:content url="http://fredix.files.wordpress.com/2010/01/00021.jpg?w=300" medium="image">
			<media:title type="html">00021</media:title>
		</media:content>
	</item>
		<item>
		<title>tip pour Emacs</title>
		<link>http://frederic.logier.org/2009/10/25/tip-pour-emacs/</link>
		<comments>http://frederic.logier.org/2009/10/25/tip-pour-emacs/#comments</comments>
		<pubDate>Sun, 25 Oct 2009 13:28:24 +0000</pubDate>
		<dc:creator>fredix</dc:creator>
				<category><![CDATA[config]]></category>
		<category><![CDATA[emacs]]></category>

		<guid isPermaLink="false">http://frederic.logier.org/2009/10/25/tip-pour-emacs/</guid>
		<description><![CDATA[Pour avoir un thème de couleur vert reposant les yeux dans emacs il suffit de mettre ceci dans un fichier .Xresources puis relancer sa session X : emacs*Background: DarkSlateGray emacs*Foreground: Wheat emacs*pointerColor: Orchid emacs*cursorColor: Orchid emacs*bitmapIcon: on #emacs*font: -adobe-helvetica-*-r-*-*-14-*-*-*-*-*-*-* emacs*font: -*-fixed-bold-r-*-*-15-*-*-*-*-*-*-* emacs.geometry: 125x40 Publié dans config Tagged: emacs<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=frederic.logier.org&amp;blog=3098224&amp;post=118&amp;subd=fredix&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Pour avoir un thème de couleur vert reposant les yeux dans emacs il suffit de mettre ceci dans un fichier .Xresources puis relancer sa session X :</p>
<pre>emacs*Background: DarkSlateGray
emacs*Foreground: Wheat
emacs*pointerColor: Orchid
emacs*cursorColor: Orchid
emacs*bitmapIcon: on
#emacs*font: -adobe-helvetica-*-r-*-*-14-*-*-*-*-*-*-*
emacs*font: -*-fixed-bold-r-*-*-15-*-*-*-*-*-*-*
emacs.geometry: 125x40

<a href="http://fredix.files.wordpress.com/2009/10/capture-emacs1.png"><img class="alignnone size-medium wp-image-126" title="Capture-emacs" src="http://fredix.files.wordpress.com/2009/10/capture-emacs1.png?w=300&#038;h=178" alt="Capture-emacs" width="300" height="178" /></a></pre>
<br />Publié dans config Tagged: emacs <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/fredix.wordpress.com/118/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/fredix.wordpress.com/118/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/fredix.wordpress.com/118/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/fredix.wordpress.com/118/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/fredix.wordpress.com/118/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/fredix.wordpress.com/118/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/fredix.wordpress.com/118/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/fredix.wordpress.com/118/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/fredix.wordpress.com/118/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/fredix.wordpress.com/118/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/fredix.wordpress.com/118/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/fredix.wordpress.com/118/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/fredix.wordpress.com/118/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/fredix.wordpress.com/118/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=frederic.logier.org&amp;blog=3098224&amp;post=118&amp;subd=fredix&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://frederic.logier.org/2009/10/25/tip-pour-emacs/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>

		<media:content url="http://fredix.files.wordpress.com/2009/10/capture-emacs1.png?w=300" medium="image">
			<media:title type="html">Capture-emacs</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>Le big switch</title>
		<link>http://frederic.logier.org/2009/06/21/le-big-switch/</link>
		<comments>http://frederic.logier.org/2009/06/21/le-big-switch/#comments</comments>
		<pubDate>Sun, 21 Jun 2009 15:12:00 +0000</pubDate>
		<dc:creator>fredix</dc:creator>
				<category><![CDATA[fredix]]></category>

		<guid isPermaLink="false">http://fredix.wordpress.com/2009/06/21/le-big-switch/</guid>
		<description><![CDATA[Suite à un problème lors d&#8217;une manipulation sur mon serveur, mon blog en typo a refusé de repartir.Ce qui me démangeais depuis un moment a été fait, j&#8217;ai donc migré mon blog sur la plateforme de Google, blogger.J&#8217;assume complètement le fait de céder aux sirènes du Minitel 2.0, je n&#8217;ai plus l&#8217;énergie ni l&#8217;envie de [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=frederic.logier.org&amp;blog=3098224&amp;post=94&amp;subd=fredix&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Suite à un problème lors d&#8217;une manipulation sur mon serveur, mon blog en <a href="http://typosphere.org/">typo</a> a refusé de repartir.<br />Ce qui me démangeais depuis un moment a été fait, j&#8217;ai donc migré mon blog sur la plateforme de Google, <a href="http://www.blogger.com/">blogger</a>.<br />J&#8217;assume complètement le fait de céder aux sirènes du Minitel 2.0,  je n&#8217;ai plus l&#8217;énergie ni l&#8217;envie de maintenir mon blog comme avant, afin de mon concentrer exclusivement sur mes projets.</p>
<p>Blogger a 2 avantages qui compensent le fait d&#8217;être hébergé chez le &laquo;&nbsp;Mal absolu&nbsp;&raquo; :
<ol>
<li>il permet d&#8217;exporter ses données au format XML</li>
<li>il permet d&#8217;utiliser son <a href="http://help.blogger.com/bin/answer.py?answer=55373">propre nom de domaine</a></li>
</ol>
<p>Je blogue depuis 2004 ce qui constitue 264 articles de valeur très inégale. Ayant eu la flemme de faire un script d&#8217;export vers Blogger j&#8217;ai réinjecté manuellement quelques articles, les autres suivront peut être.</p>
<p><a href="http://typosphere.org/">Typo</a> reste néanmoins un excellent blog opensource. Cependant les nouvelles plateformes de micro-blogging comme <a href="http://twitter.com/fredix">Twitter</a> ou <a href="http://identi.ca/fredix">Identi.ca</a> poussent à limiter l&#8217;usage des blogs et les rendent moins incontournable.</p>
<br />Publié dans fredix  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/fredix.wordpress.com/94/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/fredix.wordpress.com/94/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/fredix.wordpress.com/94/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/fredix.wordpress.com/94/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/fredix.wordpress.com/94/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/fredix.wordpress.com/94/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/fredix.wordpress.com/94/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/fredix.wordpress.com/94/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/fredix.wordpress.com/94/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/fredix.wordpress.com/94/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/fredix.wordpress.com/94/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/fredix.wordpress.com/94/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/fredix.wordpress.com/94/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/fredix.wordpress.com/94/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=frederic.logier.org&amp;blog=3098224&amp;post=94&amp;subd=fredix&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://frederic.logier.org/2009/06/21/le-big-switch/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>