mardi, décembre 18, 2007

Nouvelle Skin 2008

Pour finir l'année en beauté, j'ai changé la skin du site: rubyscube :)

Plus précisément je suis passé au nouveau système de template de blogger et j'ai cherché (difficilement) des skins (pour une liste de sites de template gratuit, allez voir mon del.icio.us à ce sujet).

J'ai essayé de repassé dans tous les posts (147 quand même!) pour vérifier qu'ils s'affichent à peu près correctement... mais c'est tout à fait possible que j'en ai raté.

J'en ai profité pour supprimer ma version "custom" de Syntax Highlighter avec la syntax Ruby (de toute façon je ne l'utilisais plus dans mes nouveaux posts).

Je ne fais pas trop d'illusion, la plupart des personnes que je connais utilisent des aggrégateurs (style google reader) et ne voit jamais le site... mais bon c'est pour me faire plaisir ;)

D'ailleurs à ce sujet j'ai peur de me lasser assez vite de cette nouvelle skin, seulement le changement a été suffisament long pour me disuader de recommencer de si tôt ;)

Ma deuxième inquiétude concernent les images qui pointent vers un site extérieur, si celui-ci est "down", ou pire, si les images sont supprimées, ma skin risque de ne pas être très jolie. On verra...


Technorati tags:

Nouveau projet "Natural Sort"

Suite à un article sur Coding Horror sur le fait que les tri par défaut (ASCII) ne sont pas très "human friendly" et après quelques recherches sur Google assez infructueuses sur le sujet en ruby... Je me suis amusé à créer un projet rubyforge pour implémenter ce type de tri :) Ca donne quelque chose comme ça:
['a1', 'a11', 'a12', 'a2', 'a21'].natural_sort => ['a1', 'a2', 'a11', 'a12','a21']
Si vous voulez en savoir plus: J'aimerai avoir votre avis sur le fait d'avoir fait plein de méthodes "alias" avec des noms différents pour contenter tout le monde... J'ai fait ça pour 2 raisons:
  1. plus de mots clef sous google pour trouver le projet
  2. moins à réfléchir quand on tape
A vos commentaires :)

Remarques:
  • Je me suis loupé dans la version 1.0.0 (un bug avec la méthode static), donc utilisez la version 1.0.1
  • Le gem met environ 1 jour avant d'apparaître dans la liste lorsqu'on fait "gem list naturalsort --remote"... soyez patient ;)
  • C'est loin d'être parfait mais ça fait déjà l'essentiel, si vous voyez des améliorations possible n'hésitez pas à utiliser le Tracker de rubyforge, j'ai aussi quelques tests unitaires marqués TODO ou FIXME qui ne demande qu'à être corrigés ;)

    Update: La version 1.0.1 est dispo maintenant :)
Technorati tags:

vendredi, décembre 14, 2007

Double Pipes

Sans jeux de mot scabreux hein ;)
Je me suis amusé un peu avec les || qui permet de sélectionner la première valeur en partant de la gauche qui n'est pas nil. Bien pratique pour initaliser des variables sans if/else
hash = {"b" => "bbb", "c" => "ccc"}
test1 = hash["a"] || hash["b"] 
puts "test1: #{test1}"

test2 = ENV['FAKE'] || ENV['JAVA_HOME']
puts "test2: #{test2}"

v1, v2 = "aaa", "bb"
test3 = v1.size || v2.size
puts "test3: #{test3}"

test4 = [1, 2].max
puts "test4: #{test4}"

Résultat:
test1: bbb
test2: C:\Program Files\Java\jdk1.5.0_10
test3: 3
test4: 2
Le plus intéressant d'après moi est le test n°2.
Technorati tags:

[RDoc] Paramètres de retour d'une fonction et exemple de code

Juste un petit post pour donner 2 astuces pour améliorer sa rdoc (alias ruby doc).
Comment faire une jolie rdoc comme celle de Enumerable par exemple:
Le code:
 # call-seq:
 #     class.new_method(string)                    => array
 #
 # Description.
 #     MyClass.new.new_method("hello")         #=> [1, 2, 3]
 def new_method(str)
   ...
 end
Deux points à remarquer:
  • Le call-seq (+ 1 ligne vide) pour désigner le type d'objet retourné et les paramètres
  • les 5 espaces (whitespace) devant l'exemple d'utilisation pour le faire apparaitre sous forme de code. (rem: <tt>code</tt> marche aussi)
Technorati tags:

mercredi, novembre 14, 2007

Variables d'environements N°2

Dans ma "quête" des variables d'environements en ruby (cf épisode n°1), je cherchais une manière "élégante" de trouver toujours une valeur quelque soit les variables d'environnement configurées et même l'OS (windows ou linux).

J'ai trouvé cette manière de faire qui ma foi me plaît bien :)
[ENV['PUBLIC'], ENV['APPDATA'], "/tmp"].compact.first
Imaginons qu'on se trouve sous linux, après évaluation des ENV ca donnera:
[nil, nil, "/tmp"].compact.first
"compact" va enlever les nil, donc on aura:
["/tmp"].first
et voilà!

d'autres idées ?

Technorati tags:

lundi, novembre 12, 2007

Variables d'environements

Comment récupérer la valeur d'une variable d'environement du système ?
Et bien c'est très simple ruby contient une variable ENV qui permet de récuper n'importe quelle valeur:
puts ENV['CLASSPATH']
Pour voir toutes les variables de votre système:
ENV.to_hash.each do |k, v|
 puts "#{k}\t => #{v}"
end
Technorati tags:

dimanche, septembre 23, 2007

Un peu d'humour... dans un monde de blog

Petit "comics" qui résume bien la situation sur la petite guerre entre Gavin King (Hibernate) et Obie Fernandez (Ruby) et plus globalement anti-Java/anti-Ruby. (le plus marrant c'est que Obie ressemble beaucoup)

Dès que j'ai vu le post de Gavin (que j'estimais beaucoup pour hibernate mais qui me décoit beaucoup depuis plusieurs posts), j'ai vu que ça allait partir en "cacahuètes" et ça n'a pas loupé!

Je crois qu'on va pouvoir ranger ce genre de troll (discussion sans fin où tout le monde reste sur ses positions avec comme argument "mon truc il est mieux que le tiens et puis c'est tout !") avec les autres:
  • vi(m) vs emacs
  • java vs .net
  • windows vs linux (vs mac)
  • langage compilé vs non compilé
  • postgres vs mysql
  • etc...

Technorati tags:

mercredi, septembre 12, 2007

Ruby net/https and invalid server certificate

Again in English since there is so few documentation. Here's the code to connect to a https server using ssl and certificate (using net/https standard lib):
def get_url(url, &block)
 puts "Getting url: #{url}"

 uri = URI.parse(url)
 http = Net::HTTP.new(uri.host, uri.port)
 http.use_ssl = true
 http.verify_mode = OpenSSL::SSL::VERIFY_PEER
 http.ca_file = 'ca.server.domain.com.crt'
 pem_file = 'certificate-privateKey.pem'
 http.cert = OpenSSL::X509::Certificate.new(File.open(pem_file).read)
 http.key = OpenSSL::PKey::RSA.new(File.open(pem_file).read)

 http.start {
   http.request_get(uri.path) {|res|
     @page.response = res
     yield
   }
 }
end
end
For the pem format see my other article: Https, Ssl and Ruby
If the server ca is "strange" (I don't know in which way I'm not an ssl expert), you will get those kind of error messages:
.../http.rb:586:in `connect': certificate verify failed (OpenSSL::SSL::SSLError)
http.verify_mode = OpenSSL::SSL::VERIFY_PEER
http.ca_file = 'ca.server.domain.com.crt'
can be replace with
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
Technorati tags:

jeudi, septembre 06, 2007

Ecrire une bonne API en Ruby

Une fois passée la phase d'apprentissage du language (quelque soit le language d'ailleurs), on passe à l'étape suivante "Comment écrire du bon/beau code ?" (bon ou beau pour moi sont synonymes, plus d'info : "Code like a girl").

Le plus dur pour moi a été de dé-apprendre la manière de faire des api en Java ;)
Je vous conseille de lire le post de Chad Fowler: "Writing APIs to Wrap APIs", je trouve la partie sur l'utilisation des "method_missing" très intéressante.

I love the tricks you can do with Ruby. method_missing, const_missing, autoloading, and their friends make really powerful things possible.

But they do so at a price. When something goes wrong in a piece of code that relies heavily on one of these tricks, it can be much much harder to track down. So the decision to use such a tool shouldn’t be taken lightly. These are power tools. Used effectively, really cool things can happen. Used incorrectly, you can easily find yourself limb-less and bloody. So when you decide to use one of these power tools, you have to ask yourself: is it worth the risk?


Technorati tags:

Un exemple plus simple de "retry"

Un exemple d'utilisation de "retry" plus simple que mon post précédent:
i = 0
MAX = 3
begin
  puts "foo"
  raise "bar"
rescue
  i += 1
  retry if (i < MAX)
end

Résultat:
foo
foo
foo

Technorati tags:

Le mot clef "retry"

J'ai eu une drole de suprise quand j'ai voulu appeller une variable "retry", il existe un mot clef "retry"!
Ni une, ni deux je fonce voir la doc dans le "pickaxe": retry.
Devinez quoi ? Ca fait exactement ce que je voulais faire mais en mieux ;)
Je voulais implémenter un système de retry quand j'appelle un url qui me retourne un timeout.
Donc voilà le code:
require 'httpclient'

client = HTTPClient.new
url = "http://localhost:3000/foo"

i = 0
begin
 puts url
 resp = client.get(url)
rescue Timeout::Error
 i += 1
 $stderr.print "Timeout error: " + $!
 retry if (i < 2)
end
Ca a l'air de bien marcher :)
J'en ai découvert un autre en lisant la doc "redo"! Faut que je regarde la différence avec "retry"...
Sinon j'ai trouvé une petite list des mots clefs en ruby.
Technorati tags:

mardi, août 21, 2007

How to use HTTPS/SSL in Ruby

For once I will write this post in english since I found really few documentation / pages in google about this subject.

I made a simple tutorial to explain how to do get / post request using https/ssl, pem files and ruby, go check it out at: http://benjamin.francisoud.googlepages.com/howtodogetorpostrequestinhttpssslandruby

You can leave comments in this post :)


Technorati tags:

jeudi, juin 14, 2007

[ANN] Plugin Skinnable

Un peu d'auto promotion ;)

Le pitch:
Skinnable permet d'ajouter une skin à votre appli rails rapidement.
Ca fait un moment que j'ai ce plugin dans les cartons, je l'ai utilisé pour moi sur 2 projets (pour lesquels je ferais une annonce séparé). Mais je n'avais pas eu le temps de faire un jolie screencast.
Maintenant c'est chose faite :)

Si vous voulez que j'ajoute 2 ou 3 skins de plus; vous pouvez laisser un commentaire et je m'en occuperais quand j'aurai du temps :)

Technorati tags:

mercredi, juin 06, 2007

Aptana

Petit rappel pour ceux qui ne suivent pas dans le fond de la classe: Les développements sur RadRails (l'IDE pour rails basée sur eclipse) se sont arrêtés et que tout a été déplacé dans Aptana.

J'ai téléchargé la dernière version et je suis très agréablement surpris la plus part des fonctionnalités bien pratique dans l'équivalent pour Java sont présentes:
  • Completion
  • Rappel de l'assignation de la variable quand on laisse la souris dessus
  • Rdoc de la classe...

Quelques captures d'écran tiré du blog:




Pour plus de "tips & tricks" sur aptana jetez un coup d'oeil à leur blog.

Technorati tags:

DRb alias Distributed Ruby

Je viens de découvrir DRb (Distributed Ruby), une librairie incluse par défaut dans la distribution ruby (pas besoin de gem) pour faire du client/serveur.
Et alors me direz-vous ? Et bien c'est super simple !
Le mieux c'est un petit exemple:
Serveur:
require 'drb'

class MyServer
  def say
    "hello world"
  end
end

DRb.start_service("druby://:7777", MyServer.new)
DRb.thread.join
Client:
require 'drb'

DRb.start_service
remote_object = DRbObject.new(nil, 'druby://localhost:7777')
puts remote_object.say
Résultat dans la console du client:
hello world
Quand je pense aux EJB en java et que je vois ça...
Petit bémole, il faut redémarrer le serveur si on modifie la classe MyServer... mais si on utilise des blocks on peut éviter une partie de ce désagrément, exemple:
class MyServer
  def say(&block)
    yield
  end
end
puts remote_object.say {"hello world"}
Rem: on coupe un peu les cheveux en quatre pour dire "hello world" mais bon c'est pour la démo hein ;)

Pour en savoir plus quelques liens sur drb.
Attention l'exemple du tutorial de chad fowler sur les "songname" ne marche pas, il faut remplacer druby://hal9k:2001 par druby://localhost:7777.

Technorati tags:

mardi, mai 22, 2007

Ruby/Java comparaison

C'est un peu facile, je vous l'accorde, mais ça m'a fait bien rire ;)

Java
new Date(new Date().getTime() - 20 * 60 * 1000)

Ruby
20.minutes.ago

A prendre au second degré pour ne pas vous facher avec vos collègues de bureau :D
Technorati tags:

Ruby en entreprise (Parts de marché, JRuby et .Net)

Je suis content de voir que mon guru préféré, dans son analyse sur l'évolution de ruby/rails a les même opinions que moi ;)
This year my sense is that this morphed into something much more important. Success is not just being an outbreak of sanity in the IT world, but actually leading that world. There seems an excellent chance that Ruby and Rails could become a significant platform for IT develop over the next few years. We're already seeing signs of this at ThoughtWorks - 40% of our new business this year in the US is Ruby work.
Tout comme julien dans son commentaire, je pense que JRuby est LA réponse pour amener ruby/rails dans les entreprises. D'un seul coup, à chaque endroit où il y a une jvm, on peu "potentiellement" mettre du ruby, c'est génial.
With a young technology there's lots of new and important pieces appearing, but for me the most important of these is JRuby. Now in its final cycle of release candidates, JRuby offers a full implementation of the Ruby Platform on the Java JVM, as well as providing a scripting language for the JVM. For what we do at ThoughtWorks, and for many Ruby/Rails developers this matters a great deal even if you never "include java".
Je pense que pour l'instant il y a une grande excitation dans la communauté mais que dans 2 ou 3 ans, Ruby fera partie intégrante de la boite à outil du développeur comme XML l'est actuellement et qu'on ne le remarquera plus du tout.

Autre point important, je savais que les développeurs java et php s'interessaient à ruby... mais je m'apperçoit que les développeurs qui font du .Net aussi. Je suis content car je n'ai jamais fait de distinctions entre un développeur java, php ou .net. Pour moi on est tous dans le même bateau et le but est juste de trouver la solution la plus simple pour régler les problèmes auxquels on doit faire face.
"Welcome onboard!"

Technorati tags:

RailsConf 2007

Il y a un "je ne sais quoi" de différent dans ces conférences Rails par rapport à JavaOne ou ApacheCon ;)
ps: Un petit troll pour le plaisir :D
ps2: N'empeche j'aurai bien aimé être à l'une de ces conf, je dois être jaloux ;)
Technorati tags:

dimanche, mai 20, 2007

Tutorial sur les Caches dans Rails (où on apprend que IBM se met à Ruby)

Un bon article sur l'utilisation des différents caches dans Rails. Concernant l'article, l'auteur ne se limite pas qu'à Rails mais couvre aussi l'utilisation d'Apache pour ne pas servir certains fichiers et délester le server Mongrel d'un certains nombres de requêtes. C'est plutôt une vue d'ensemble mais ca permet de se faire une petite idée des optimisations possibles...

Mais ce que je trouve intéressant c'est que IBM s'interesse à Rails. J'entend souvent l'argument que Rails va remplacer Php. Je trouve que c'est réducteur, au contraire Rails a également pour cible et utilisateurs tous les "déçus" de Java dans les entreprises qui trouvent que pour faire des choses simples il faut trop souvent sortir l'artillerie lourde....

IBM est l'entreprise typique qui cible les sociétés plus ou moins grosses, que des articles apparaissent sur son site à propos de rails montre 2 choses d'après moi:
  • plus de "décideurs" vont entrendre parler de rails
  • IBM doit penser qu'il y a de l'argent à se faire dans ce secteur
Ruby/Rails ne remplacera surement pas Java dans l'entreprise mais je pense qu'il y a une petite place au soleil à se faire ;)

Technorati tags:

jeudi, mai 10, 2007

SAP4Rails

Si ça: sap4rails, c'est pas "entreprisey" ;)
Pour une explication plus complète et intéressante de "entreprisey", je conseille l'article de Martin Fowler (Le guru barbu).
disclaimer: je ne connais rien a S.A.P
Technorati tags:

mardi, mai 08, 2007

Les ventes de livres toujours à la hausse

O'Reilly avait déjà plublié un état des ventes de livres (notamment concertant Ruby) l'année dernière, voilà une petite mise à jour pour l'année en cours... et ça continue :)

lundi, avril 23, 2007

Lightweight people vs Diligent people

Au début on se dit "tiens encore une de ces videos/présentation power point" et puis en fait elle est assez drôle...
Technorati tags:

jeudi, mars 08, 2007

Créer un classpath automatiquement

# generate env.bat with all lib/*.jar

classpath=""
Dir["lib/*.jar"].each do |filename|
  classpath << filename + ';'
end
classpath << "bin"

File.open("env.bat", File::CREAT|File::RDWR) do |aFile|
  aFile << "SET CLASSPATH=" + classpath
end
Technorati tags: