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.
Posted in planet on April 30th, 2008 | Comments Off
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.
Posted in planet on April 29th, 2008 | Comments Off
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.
Posted in planet on April 29th, 2008 | Comments Off
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.
Posted in planet on April 28th, 2008 | Comments Off
Posted in planet on April 28th, 2008 | Comments Off
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
Posted in planet on April 25th, 2008 | Comments Off
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
Posted in planet on April 24th, 2008 | Comments Off
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
Posted in planet on April 23rd, 2008 | Comments Off
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.
Posted in planet on April 22nd, 2008 | Comments Off
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.
Posted in planet on April 22nd, 2008 | Comments Off