Le concept du deuxième

Si il est premier c'est le meilleur !

Hier je me disais que, dans notre société, le choix du premier n'est pas forcément le meilleur, ni même le plus représentatif.

Par exemple pour choisir notre représentant ultime, le président, nous votons pour une personne.
A mon sens c'est une aberration. Certes il en ressort une personne qui est apprécié du plus grand nombre mais quid des autres ?

La démocratie n'est ce pas justement l'art du compromis ?
Celui qui consiste à en représenter le plus grand nombre et ne laisser personne sur la touche ?

Un exemple démocratique

Prenons l'exemple d'une élection présidentielle justement.
Imaginons un président élu avec 50% des suffrages, mais que 45% ne voudrait surtout pas comme président (toute ressemblance avec la vérité est fortuite).
Est ce démocratique ? Est ce représentatif ?

Comment faire mieux : une idée chiffrée

Pour améliorer ce système je me suis dit qu'il serait plus intelligent lors d'une élection de faire un classement plutôt que de voter pour une seule personne.
Imaginons un panel de 1 000 personnes avec une représentation des votes suivante :

Candidat Position 1 Position 2 Position 3
Ségolène Royal 300 250 450
François Bayrou 200 700 100
Nicolas Sarkozy 500 50 450

On le voit, c'est le candidat Sarkozy qui apparait en tête. Paradoxalement c'est aussi celui qui est le moins en second : et ça compte.
Dans mon idée, pour faire un classement juste il nous faut faire la moyenne des résultats et prendre la personne dont la position moyenne se rapproche le plus de 1.

Si on effectue les calculs on obtient ceci :

Candidat Calcul Position moyenne
Ségolène Royal (300 * 1 + 250 * 2 + 450 * 3) / 1000 2,15
François Bayrou (200 * 1 + 700 * 2 + 100 * 3) / 1000 1.9
Nicolas Sarkozy (500 * 1 + 50 * 2 + 450 *3) / 1000 1.95

La lecture des chiffres montre que, moyennement, les résultats sont plus serrés que ne le laisse supposer une simple lecture du tableau.
Et bien sûr l'autre fait marquant c'est que le résultat n'est plus du tout le même.

Avec plus de candidats et un nombre de votants plus élevés je suppose que les résultats pourraient être assez surprenants.

Si j'imagine assez mal ce concept atterrir dans nos bureaux de votes, je pense que ça peut être un système d'ascension judicieux dans une entreprise ; dans le cadre d'une promotion par exemple.

Vivre avec Rails Edge #18

Traduction de la news #18

Le rapport de cette semaine couvre les changement du 21 Avril 2008 au 27 Avril 2008 (Jour correspondant à l'enregistrement de Rails Envy podcast).

Très peu de chose interressant dans le rapport de cette semaine. Il y a eu principalement un paquet de résolutions de bug et des commits pour la compatibilité avec Ruby 1.8.7.

Introduction d'ActiveResource::Base.timeout et récupération de Timeout::Error dans ActionResource::Connection

I y a 2 changements qui ont été expliqué par Chu Yeow la semaine dernière et ne seront donc pas détaillé. Lisez donc l'article ActiveResource timeouts and why it matters (en)

Le type entier inteligent pour l'adaptater MySQL dans les migrations

L'adaptater MySQL dans Rails fait correspondre la colonne de type integer dans vos migrations aux type smalling, int ou biging dépendant de l'option :limit.

Cela signifie qu'une migration comme ceci:

def self.up
  create_table :searches do |t|
    t.integer :foo, :limit => 2
  end
end

Créera la colonne foo comme un type smallint(2) dans votre base de donnée MySQL (au lieu de int(2) précédement). (Plus d'information sur les types numériques MySQL

Ce path a été réalisé par DHH.

Révision concernant cette fonctionnalité: http://github.com/rails/rails/commit/a37546517dad9f6d9a7de6e1dba4d960909d71e8

Comme toujours, vous pouvez laissez tout suggestion pour améliorer cette série de Vive avec Rails.

La culture générale ça s’entretient

culture-generale.fr est un site qu’il faut mettre dans son agrégateur absolument ! Connaître l’origine du lapin de Pâques ou du mot FUCK, avoir des réponses détaillées à des questions que l’on pourrait se poser. Et bien là même pas le temps de se les poser que Culture Générale y répond déjà.

Je trouve ce site très utile car on ne va plus chercher la culture sur des sites comme Wikipédia mais c’est la culture qui arrive directement dans l’agrégateur tous les matins. C’est rare, il faut donc le souligner. Et c’est écrit par des gens consciencieux et qui vont bien vérifier leurs sources, pas de dérives possibles comme les sites Web 2.0 actuels (je ne dis pas que ça arrive souvent, mais ça arrive).

Tout ça pour en venir à un mail que je reçois ce matin qui me dit que les résultats du concours de culture Générale du mois d’Avril sont arrivés. Je clique vite sur le lien et là je regarde les noms des gagnants et qui je vois en 5eme position…. moi ! Merci la question subsidiaire (en Mars il y avait 140 bonnes réponses, je me suis dit qu’il devrait y avoir une 100aine de réponses en plus pour Avril, je ne me suis pas trompé).

C’est très amusant de jouer le détective pour trouver la réponse au concours à partir des indices, mais en fait j’ai tout de suite pensé à la Statue de la Liberté ce mois-ci, ce fût un peu trop facile (par contre le mois dernier où c’était plutôt compliqué). Je me demande pourquoi on a pas ce genre de choses à l’école pour nous permettre d’apprendre à chercher sur Internet d’une manière amusante et en découvrant des choses. Avouons que c’est plus fun d’apprendre la provenance de FUCK que de passer ses journées à faire des intégrales.

Découvrez vite culture-generale.fr si ce n’est déjà fait, c’est un bon moyen d’apprendre, de se détendre et de faire autre chose que de l’informatique pendant quelques minutes.

Pensées autour de Qt::JRuby

Etat des lieux

Depuis le début du projet j’ai fait beaucoup d’avancées et la plupart des éléments de base fonctionnent très bien. Pour preuve le nouvel exemple que j’ai mis en ligne qui est un Atom Reader. J’ai réalisé cette application en environ 1h en comptant quelques petites corrections dans Qt::JRuby. Par contre Qt Jambi 4.4 preview ne semblant pas fonctionner avec Ubuntu (et peut-être d’autres versions de Linux) j’ai un peu arrêté le développement en attendant la version finale (et puis aussi parce que j’ai beaucoup de travail).

Pourquoi se limiter à Qt ?

Au fil du développement j’ai eu à modifier en profondeur le code et à ajouter de nouvelles fonctionnalités pour que l’ajout de nouveaux widgets aille plus vite. Et j’arrive à un point où je me demande si je ne pourrais pas carrément faire de Qt::JRuby une librairie Toolkit-agnostic et qui permettrait donc d’utiliser Qt Jambi, SWT ou bien encore Swing.

Mon intention première était juste d’utiliser Qt parce qu’il existe d’autres librairies pour utiliser SWT ou Swing avec Ruby. Mais aucune d’entre elles ne me satisfait. Par contre Qt est un peu lourd pour une toute petite application et j’aimerais donc utiliser un autre toolkit mais je n’aime aucune des propositions actuelles.

On aurait le même langage pour tous les toolkits et une librairie pour chacun des toolkits pour leurs spécificités. Ce n’est pour l’instant qu’une pensée mais ça pourrait bien devenir une réalité.

Futur

La première chose va être d’attendre la sortie de Qt Jambi 4.4. Je ferais à ce moment un bundle JRuby + Qt Jambi + Qt::JRuby pour vous permettre de développer des applications dès la fin du téléchargement d’un seul et même fichier.

Je lancerais aussi sûrement le développement d’une application open source basée sur Qt::JRuby permettant de faire connaître la librairie. Et bien sûr de la documentation qui viendra un de ces jours.

Ruby à l’Université

Screencast de presentation rails

Il y a quelques jours, j'ai réalisé un premier screencast en français de démonstration sur la création d'une application Ruby on Rails. Quelque semaine avant, j'ai soumis à la liste de RailsFR, une série de slide pour présenter Ruby on Rails auprès de développeur Java. Après quelques modification, j'ai obtenu une version quasi définitive. J'ai ainsi réalisé hier un screencast faisant défiler ces slides avec mes commentaires. Tous commentaires est encore une fois le bienvenue.

Download du screencast

Download des slides

Vivre avec Rails Edge #17

Depuis le début, je suis les news de Chu Yeow concernant les nouveautés intégrés à Rails dans sa version de développement. J'ai décidé d'essayer de vous les traduire régulièrement ici.

Traduction de la news #17

Peu de chose se sont passé cette semaine sur Edge Rails. Il semblerait que nous aillons un nouveau membre dans le Rails core, Joshua Peek. Le nouveau bug tracking de Rails sur Lighthouse est pret à utiliser, donc vous pouvez y soumettre vos patchs et rapport de bug dessus.

Le rapport de cette semaine couvre les changements entre le 14 Avril 2008 et le 20 Avril 2008 (Jour correspondant à l'enregistrement de Rails Envy podcast).

caches_page conditionel

The caches_pages peuvent prendre une option :if pour indiquer quand une pave peux être vraiment caché via une Proc. Vous pouvez maintenant faire ceci par exemple:

caches_page :index, :if => Proc.new { |c| !c.request.format.json? }

Cela met votre index en cache uniquement si le format de la requête n'est pas du JSON.

Cette fonctionnalité a été ajouté par Paul Horsfall.

Révision concernant cette fonctionnalité: http://github.com/rails/rails/commit/14a40804a29a57ad05ca6bffbe1e5334089593a9

Nouvelle ActionView::TestCase pour tester les helpers des vues

Rappelez vous comment vous pouvez actuellement utiliser les classes TestCase spécialisé pour tester les classes Controllers et ActionMailer (en)? Désormai s vous pourrez faire la même chose pour vos helpers de vues Rails avec la nouvelle classe ActionView::TestCase.

Voici un petit exemple:

module PeopleHelper
  def title(text)
    content_tag(:h1, text)
  end
                  
  def homepage_path
    people_path
  end
end
                                               
class PeopleHelperTest > ActionView::TestCase
def setup                                       
  ActionController::Routing::Routes.draw do |map|                        
    map.people 'people', :controller => 'people', :action => 'index'
    map.connect ':controller/:action/:id'
  end
end
              
def test_title                         
  assert_equal "<h1>Ruby on Rails</h1>", title("Ruby on Rails")
end

def test_homepage_path
  assert_equal "/people", homepage_path
end

Remercions Josh Peek pour cette jolie petite amélioration..

mem_cache_store de ActiveSupport::Cache accepte des options

Même si Memcache-client a été ajouté récement à ActiveSupport, on ne pouvait pas spécifié toutes les options de configuration derrière l'ip du serveur memcache. Maintenant vous pouvez passer beaucoup plus d'options comme ceci:

config.action_controller.fragment_cache_store = :mem_cache_store, 'localhost', { :compression => true, :debug => true, :namespace => 'foo' }

Ce patch est de Jonathan Weiss.

Révision concernant cette fonctionnalité: http://github.com/rails/rails/commit/9e1d506a8cfedef2fdd605e4cbf4bf53651ad214

Migration basée sur l’heure utc et plus incremental

Depuis la revision r9122, les migrations de Ruby on rails ne sont plus incrémentale comme précédemment. En effet, elles sont désormais basé sur le temps UTC. Cette évolution a comme principale intérêt d'éviter les problèmes de conflits entre différentes branches de développement grâce à un prefix unique.

Désormais lors de la création d'un fichier de migration vous aurez ainsi ceci :

$ ./script/generate migration create_user
      create  db/migrate/20080422122512_create_user.rb

Pour compléter cette évolution, il y a eu l'ajout de 2 nouvelles tâches rake. rake db:migrate:up et rake db:migrate:down. Il faut adjoindre à ces tâche la la variable VERSION étant le numero de la VERSION a ajouter(up) ou enlever(down). Les versions peuvent ainsi être ajoutées ou supprimées indépendamments.

On pouvait avoir cette fonctionnalité dans la version 2.0 de rails avec le plugin enhanced migrations plugin

Mongrel, Thin et mod_rails : Consommation mémoire

Quand on parle déploiement et donc à un moment serveurs de backend, on aborde la vitesse, la fiabilité mais beaucoup plus rarement la consommation de la mémoire. Ok c’est parce qu’ils ont tous des serveurs dédiés ou des VPS pour faire tourner 1 seule application avec 3 visiteurs par jour. Mais si on est plus limité ?

Moi par exemple sur mon serveur dédié que je partage avec plusieurs personnes, il y a 6-7 applications Rails avec les Mongrels qui sont donc toujours là à manger de la mémoire et PHP en FastCGI qui pulvérise la RAM (à cause d’un site à fort trafic). J’ai réduit le nombre Mongrels aujourd’hui encore un peu mais PHP a vite fait de reprendre encore plus de RAM, mais il ne tombe plus au moins.

Mongrel

Mongrel est le plus gourmand, il faut compter au moins 30 Mo par instance au démarrage.

Thin

Thin prend environ 15% de mémoire de moins que Mongrel. J’ai testé ça cet après-midi et c’est véridique (10% au lancement et 15% par la suite).

mod_rails

Je n’ai pas fait de tests pour mod_rails mais d’après ce qu’on peut voir sur Internet, la consommation est similaire aux 2 autres. Par contre quand un processus est en idle, une partie de la mémoire est désallouée ce qui est plutôt bien (pour des sites à faible trafic). Mais en même temps l’obligation d’utiliser Apache fait que l’on perd de la RAM (Nginx est vraiment bien mieux foutu pour ça).

Switchpipe

Switchpipe kill les processus de Thin ou de Mongrel quand ils ne servent plus, ce qui est plutôt pratique. Par contre forcément le redémarrage d’une instance prend un peu de temps.

Mongrel avec JRuby

Là c’est l’horreur niveau mémoire avec une consommation qui double (voire plus). L’avantage de la vitesse de JRuby 1.1 est là, par contre armez-vous de RAM sinon vous pouvez oublier.

64 bits

Je n’ai pas choisi d’installer une Debian 64 bits sur le serveur et je le regrette bien puisque les instances ont une consommation mémoire 2 fois supérieure à un OS 32 bits. Je me retrouve donc avec des Mongrel à 60 Mo dès le début.

Que prendre alors ?

Dans toutes ces solutions je serais plutôt partisan d’un couple Nginx côté frontend pour ne pas avoir la lourdeur d’Apache et Thin côté backend. Sur des 10aines d’instances, on va avoir une empreinte bien moins importante avec Thin qu’avec Mongrel. Et pour les performances, on peut utiliser Thin avec Swiftiply et les sockets Unix, ce qui le rend number 1. Enfin on peut rajouter Switchpipe pour la gestion dynamique du nombre d’instances et/ou la mise en place simplifiée.

Je trouve que mod_rails n’apporte pas grand chose. La consommation mémoire reste inchangée (ou utiliser leur solution très certainement payante), on doit utiliser Apache 2, l’argument du Virtual Host plus simple à créer n’est pas vraiment valable (tu crées ton script une fois et puis c’est tout) et pour les autres avantages on peut les avoir en plus ou moins bien avec les solutions que j’ai cité dans l’article. Oui il peut avoir un intérêt pour ceux qui utilisent FastCGI et Apache (lisez l’article de Frédéric si vous êtes dans ce cas). J’attends de voir comment le projet évolue.

Je me dis que la solution viendra peut-être de Rubinius et du mod_rubinius (qui j’espère sera porté pour Nginx) qui parait avoir de sérieux atouts à tous les niveaux.

Article dans GLMF #105

Je ne l’ai pas encore eu entre les mains, mais vous trouverez un nouvel article sur Ruby dans le GNU Linux Magazine France #105 du mois de mai.

Cette fois-ci, je vous explique comment créer un mini moteur de recherche avec Ferret et Mongrel.

L’idée n’est pas tant de rentrer dans les détails de ces deux librairies, mais surtout de montrer qu’avec peu de lignes nous pouvons faire de belles choses…

Bonne lecture à tous et surtout n’hésitez pas à faire vos remarques ici ou par mail.