Sequel 1.0

Sequel, un Object Relational Mapper (ORM) orienté Datasets, est désormais en version 1.0, depuis le début du mois de janvier. À noter que maintenant il y a 2 gems sequel_core et sequel_model (1 “meta-gem” sequel pour installer les deux en même temps), ce qui permet utiliser sequel_core de manière indépendante. Sequel peut très bien s’utiliser avec le framework web Merb

sudo gem install sequel

D’où vient le monde ?

La réponse.

Macbook & mésaventures …

Les rumeurs

Avant de commencer à utiliser un mac je me suis souvent laisser dire que le matériel d'Apple était de bonne facture et que l'écart de prix se justifiait grâce à cela.
D'autre part les fans de la pomme vous jurerons que le prix excessif du matos n'a d'équivalent que le SAV sans faille.

Les symptômes

Sauf que voilà, moins d'un an et demi après avoir acheté mon macbook (18 septembre 2006), je peux vous confirmer que ce n'est pas pour les composants qu'on choisi un mac.
Il y a une dizaine de jour c'est la batterie qui m'a lachée, sans réels signes précuseurs ; affichant simplement une batterie avec une croix sous OS X.

Ça limite l'intérêt d'un portable quand on se ballade un fil à la pate.

Presque 200€ plus tard me voilà avec une batterie neuve et pimpante et un volume de RAM passé de 512mo à 2go (impossible de bosser sous eclipse avec 512).
Je devenais enfin productif sur mon macbook.

Les symptômes (bis repetita)

Hier c'est le disque dur qui a rendu l'âme, la tête qui se met à claquer, le dossier avec le point d'interrogation au boot, la loose.
Et mon matériel, j'en prends soin.
Ce qui me met en colère c'est qu'après maintes recherche il s'avère que mon disque dur fait parti d'une série noire, celle aux caractéristiques suivantes :

  1. Marque : Seagate
  2. Modèle : ST96812AS
  3. Firmware : 7.01

Alors franchement ça aurait été bien de la part d'Apple :

  1. De reconnaître le problème
  2. De prévenir les utilisateurs ayant acheté ce matériel (ils peuvent retrouver nos coordonnées, au moins pour ceux ayant acheté sur l'Apple store), afin qu'ils anticipent une perte de données
  3. De faire un geste, ou mieux de remplacer le disque

Bilan

Très franchement je ne regrette pas mon achat parce que le design est séduisant et que le système mac OS X s'adresse aussi bien aux débutants qu'aux utilisateurs avancées (pratique pour sa moitié).
Toutefois je voulais casser un peu le mythe du matériel irréprochable par le biais de ce billet.

Un reste d'espoir ?

J'ai contacté Apple afin d'obtenir un remplacement du disque en question. Pas de réponses pour le moment. Je noterai ici le résultat de ma demande.
Stay tuned.

De la rpartition de charge en Ruby on Rails

Je viens de publier un article en 2 parties sur le blog d’AF83 :

De la rpartition de charge en Ruby on Rails 1/2

De la rpartition de charge en Ruby on Rails 2/2

C’est plutt technique, et prsente une solution parmis tant d’autres dans ce domaine trs particulier.

De la répartition de charge en Ruby on Rails

A

Rubinius à fond sur la communauté et les commiters

Alors que je regardais une video sur Rubinius, car je voulais essayer de comprendre un peu ce projet suite au commentaire de Zed Shaw qui indiquait qu'il trouvait l'équipe de Rubinius vraiment impressionnante. J'ai appris que la communauté Rubinius comprenait 57 commiters. En effet, dans leur philosophie, la moindre personne qui a réalisé 1 seul et unique patch a un droit en commit. Ils pensent que du moment que tu as fait un patch qui tient la route alors tu ne pourras que faire progresser la communauté. Au pire un revert sera effectué. Mais après tout le revert est tout à fait logique. Par contre, les tests doivent être complètement béton.

Cette idée est exactement ce que je pense à propos du libre. En effet, je trouve que beaucoup de projets font trop de difficultés pour ajouter des commiters. Effectivement, la philosophie de Rubinius est totalement extrême. Mais je pense que beaucoup de projets auraient à suivre cette exemple. Que ce soit Rails qui n'a que seulement 5 commiters à l'heure actuelle. Alors que des patchs sont ajoutés tous les jours sur le Trac de Rails ou alors Redmine où Jean-Philippe Lang est toujours seul à développer cette application, malgrès les multiples patchs qui lui sont soumis régulièrement.

Je pense qu'une procédure clair et net d'acquisition de droit en commit serait une très bonne chose. Une philosophie un peu comme le fait Debian. Sur mes projets, j'essayerais de faire ceci.

Je recherche une bonne couturière

osx_pillow_dock.jpg

Mon Nabaztag a des chaussures !

require ‘cgi’
require ‘iconv’
require ‘open-uri’
require ‘rexml/document’

NAB_URI = "http://api.nabaztag.com/vl/FR/api.jsp?"

def n_say( s, t, m )
  REXML::XPath.match(
    REXML::Document.new(
      open( NAB_URI +
        "sn=#{s}&token=#{t}&tts=" +
        CGI.escape(
          Iconv.iconv(‘iso-8859-1′, ‘utf-8′, m)[0] )
        ) { |io| io.read }
    ), ‘/rsp/comment’
  ).map{ |n| n.text }
end

Shoes.app :width => 320, :height => 350 do
  background "static/nabaztag.png"

  stack :margin => 40 do
    stack :margin => 10 do
      para "Serial"
      @serial = edit_line
    end
    stack :margin => 10 do
      para "Token"
      @token = edit_line
    end
    stack :margin => 10 do
      para "Message"
      @message = edit_line
    end
    stack :margin => 10 do
      button "Go" do
        @answer.replace n_say( @serial.text, @token.text, @message.text )
      end
    end
   
    stack :margin => 10 do
      @answer = para "Hello!"
    end
  end
end

nabaztag-shoes.png

Pour faire fonctionner cette application, vous aurez besoin de cette image.

Parses ton blog avec Hpricot

Je dois migrer tous les billets et les commentaires du blog Contrechamp vers un Wordpress. Alors on a pas accès à la BDD et puis finalement le copier-coller de chaque post prend beaucoup de temps. Le bon choix serait de parser la page de chaque post pour récupérer le post et les commentaires et ensuite de tout mettre dans un fichier au format WXR (WordPress eXtended RSS) pour ensuite importer toutes les données dans Wordpress.

J’avais totalement oublié Hpricot au début donc je n’avais pas pensé au parsing du HTML. Hpricot est tellement simple pour parser une page que je ne vais pas m’étendre et voilà le petit bout de code pour l’extraction :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
require 'rubygems'
require 'hpricot'
require 'open-uri'

doc = Hpricot(open("http://contrechamp.kaywa.com/cin233ma/top-ten-2007.html"))

post = {}
comments = []

(doc/".post").each do |post|
  post[:title] = post.at(".post-title").at("a").inner_html
  post[:category] = post.at(".post-category").at("a").inner_html
  post[:date] = post.at(".post-title").inner_html[/[0-9]{1,}\/[0-9]{1,}\/[0-9]{1,}/] + " " + post.at(".post-meta").inner_html[/[0-9]{1,2}:[0-9]{1,2}/]
  post[:content] = post.at(".post-content").inner_html
end

(doc/".comment").each do |comment|
  c = {}
  c[:author] = comment.at(".comment-author").inner_html
  c[:date] = comment.at(".comment-published").at("a").inner_html
  c[:content] = comment.at(".comment-content").inner_html
  comments << c
end

Script rudimentaire mais très efficace ! Le site a été aspiré, j’ai donc toutes les pages en local ce sera mieux. Il me reste à générer un permalien avec le titre (grâce au plugin permalink_fu) puis stocker tout dans une BDD SQLite (je préfère tout stocker dans une BDD dans un premier temps avant de générer un fichier WXR) et finalement je mets toutes ces informations dans un fichier WXR et j’importe les données dans le Wordpress.

J’ai juste fait ce petit script parce que je suis en cours mais en gros tout ce que je viens de décrire prend à peine 2h ! J’ai toujours un peu la flemme de faire du parsing parce qu’à chaque fois je dois utiliser les fonctions standardisés du DOM (getElementById…) et ça prend une plombe. Avec Hpricot, c’est simple, rapide et sans prise de tête. Après l’exemple du parsing de feed Atom, celui-là permet encore mieux de voir à quel point Hpricot facilite la vie. Je n’ai qu’une seule chose à dire, mangez-en :)

Natural Sort 1.1.0