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:

Installing ruby on Ubuntu

I know there is plenty of those post everywhere but with so much FUD.
The way I see it (and worked best):
  • sudo apt-get install ruby
  • sudo apt-get install rubygems
  • export RUBYOPT=rubygems (see rubygem doc for more details)
  • sudo gem install httpclient (only use "gem install" for ruby lib)
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: