IE c’est pas écologique :p

Uncategorized 2 Comments »

Avec ce titre racoleur (et surtout dans l’air du temps), je tenais a pousser un coup de gueule contre le navigateur de Microsoft. Pourquoi tant de haine ? Et bien tout simplement car celui ci n’implémente pas encore la possibilité de gérer des arrondis, des ombres portées directement via la feuille de style.

Voici un exemple de ce que l’on peut faire facilement avec un navigateur à base de webkit (safari4 ou google chrome), Mozilla gère les arrondis mais pas encore l’ombre portée. (Cela sera supporté à partir de  firefox 3.1)

Exemple webkit

-moz-border-radius: 5px;
-webkit-border-radius: 5px;
border-radius: 5px;
-webkit-box-shadow: 0px 0px 5px #555;
-moz-box-shadow: 0px 0px 5px #555;
box-shadow: 0px 0px 5px #555;

Tout cela est bien beau mais ne fonctionne pas sous Internet Explorer (même en version 8). Il faut donc créer des images, les découper faire en sorte que cela ait le même rendu mais au final sera beacoup moins souple. Imaginez que l’on souhaite modifier la courbe de l’arrondi …

Cela ne fait pas économiser non plus le temps nécessaire lors du téléchargements de ces images … Vous me direz, ok maintenant avec nos grosses connexions ADSL, quelques images à télécharger pour avoir un visuel agréable c’est pas bien grave … Oui mais imaginez le nombre d’internautes qui téléchargent toutes ces images sur tous les sites internets … Cela fait un temps énorme, un transfert énorme, et finalement, demande pas mal de traitement / traffic pour gérer tout ça.

Maintenant vous avez une bonne raison d’abandonner IE. A nous développeurs Web, designers de forcer les choses … Les arrondis et ombres portées seulement via les feuille de styles. Au pire les utilisateurs d’IE n’auront pas les effet visuels, au mieux ils migreront vers des navgateurs respectant mieux les standards du W3C

Ubuntu 8.04 : Installer couchdb 0.9.0

Uncategorized No Comments »

Depuis quelques temps je m’intéresse à la base de données couchdb pour réaliser des applications qui supporteront une montée en charge facilement.

Voici comment installer couchdb 0.9.0 pour un ubuntu server 8.04 :

Je vais commencer une série de posts concernant la mise en place d’une solution fiable et robuste autour de Ruby on Rails et couchdb.

Nouveau gem pour utiliser l’API Paypal NVP

Ruby, Ruby on Rails No Comments »

J’ai eu à travailler avec l’API de Paypal. J’avais tout d’abord essayé de chercher un plugin ou un gem qui me permettrait de faire facilement ce dont j’avais besoin. Finalement, j’ai créé mon premier gem. C’est pratique et celà peut servir à d’autres développeurs.

Vous trouverez toutes les infos ainsi que le code source à l’adresse suivante :
http://github.com/solisoft/paypal_nvp/tree/master

Surveiller son application Ruby on Rails

Ruby on Rails 4 Comments »

Un des problèmes avec une application Ruby on Rails est que lorsque pour une raison ou une autre, votre grappe de serveur mongrel part en vrille, il faut relancer le serveurs, en effaçant éventuellement les fichiers pids qui sont resté coincés ou en tuant les processus zombie dont le fichier pid ne se situe plus dans le dossier tmp/pids

Il existe pour cela le gem « god»  : http://god.rubyforge.org/ – Seulement après un test sur un de nos serveurs, cela n’a pas été concluant car pour une obscure raison, le process god tombait et du coup je n’avais plus de monitoring pour mon application Ruby on Rails.

Créer un script qui surveille god qui lui même surveille notre application me semblait un peu étrange… Du coup j’ai décidé d’écrire un petit script qui vérifiera le status de l’application et redémarrera l’application en effaçant les pids et en tuant les process mongrels.

environment = "www"
mongrel_rails = "/usr/local/bin/mongrel_rails"
result = `cd #{environment}/current && #{mongrel_rails} cluster::status`.split("\n")
result = result.map{|r| r unless r == ""}.compact
check = result.map{|r| r =~ /^found/}.compact
pids = []
ports= []
result.each do |r|
pid = r.scan /pid (\d+)$/
pids << pid.to_s.to_i if pid.size > 0
port= r.scan /port (\d+)/
ports << port.to_s.to_i if port.size > 0
end
if check.size == result.size
puts "Server OK"
else
puts "Restarting mongrel Server"
`kill -9 #{pids.join(" ")}` if pids.size > 0
ports.each do |port|
pid = `pgrep -f #{port}`
`kill -9 #{pid}` if pid != ""
end
`rm #{environment}/current/tmp/pids/*`
`cd #{environment}/current && #{mongrel_rails} cluster::restart`
file = File.new("checkapp.log", "a")
file.write("Restarting mongrel serveur\n")
file.write("==========================\n")
file.write("#{Time.now}\n")
file.write("#{result.inspect}\n")
file.write("#{ports.inspect}\n")
file.write("#{pids.inspect}\n\n")
file.close
end

Vous pouvez le voir bien formaté sur github : http://gist.github.com/86819

Ajouter l’Ajax au plugin will_paginate

Ruby on Rails 2 Comments »

Voici un petit hack pour ajouter Ajax au plugin will_paginate :

Dans le fichier /lib/will_paginate/view_helpers.rb ajoutez/modifiez les lignes suivantes :

module ViewHelpers
# default options that can be overridden on the global level
@@pagination_options = {
:class          => 'pagination',
:previous_label => '« Previous',
:next_label     => 'Next »',
:inner_window   => 4, # links around the current page
:o uter_window   => 1, # links around beginning and end
:separator      => ' ', # single space is friendly to spiders and non-graphic browsers
:param_name     => :page,
:params         => nil,
:renderer       => 'WillPaginate::LinkRenderer',
:page_links     => true,
:container      => true,
# Ligne a ajouter
:update         => nil # DOM element to update
}
mattr_reader :pagination_options
# suite du code ...

Puis plus bas, on modifie la fonction page_link
def page_link(page, text, attributes = {})
if @options[:update].nil?
@template.link_to text, url_for(page), attributes
else
# Ajax update
@template.link_to_remote text, {:url => url_for(page), :update => @options[:update]}, :html => attributes
end
end

Et voilà maintenant vous n’avez plus qu’à utiliser
will_paginate @collections, :update => "mon_id"
dans vos vues.

Bien sûr si vous ne spécifiez pas l’attribut :update, will_paginate fonctionnera comme avant.

Voici un lien vers le fork de will_paginate que j’ai créé :
http://github.com/solisoft/will_paginate/tree/master

Enjoy.

[Firefox] Suppression de tous les mots de passe stockés

Linux, Logiciel 4 Comments »

Ce billet est une alerte pour tous ceux qui veulent faire une mise à jour de Firefox sous ubuntu. En effet cette dernière mise à jour m’a complètement effacé tous mes mots de passe enregistrés.

Même si je garde toujours une trace de mes différents comptes quelque part, je trouve cela assez ennuyeux et même carrément incompréhensible …

Voilà en attendant mon futur iMac … je patiente sous ubuntu …

Sinatra – Le micro framework Ruby

Ruby, web2.0 No Comments »

Je dois l’avouer Ruby on Rails est un pur bonheur mais des fois surdimentionné par rapport aux besoins. Grâce à RubyInside j’ai découvert un petit framework tout léger nommé Sinatra !

gem install sinatra

Je ne vais pas vous paraphraser ce que vous allez lire comme informations sur le site officiel mais ce mini framework est vraiment bien pensé. Par défaut il est Restful, on peut également avoir du MVC si on le souhaite et on a le choix dans l’ORM. Par exemple il est possible de le coupler avec DataMapper en lieu et place d’ActiveRecord.

Pour les vues, #haml est de la partie !

La chose qu’il me reste à voir est comment héberger un site fonctionnant avec Sinatra …

Consultant Ruby on Rails pour Direct Interactive – NYC

Ruby on Rails, SoliSoft 3 Comments »

Direct Interactive

Cela fait maintenant plusieurs mois que je travaille pour la société Direct Interactive située à Manhattan, NYC. Je suis donc consultant en développement Ruby on Rails pour cette entreprise.

Depuis quelques jours j’ai signé mon premier contrat avec eux, ce qui officialise notre collaboration.

Je tiens vraiment à remercier toute l’équipe de Direct Interactive pour leur accueil lors de notre visite, moi et ma petite famille, à NYC. J’y ai rencontré des personnes passionnées et qui donnent vraiment envie de se démener à 200%.

Direct Interactive est spécialisée dans l’expérience utilisateur. Leur logiciel ChiliSales est un produit unique en son genre.

Pour info, voici où ils se situent : Google maps

Donc voilà … Champagne :)

Capistrano Multi-Stage et Git

Bloc Note, Capistrano, Ruby on Rails 1 Comment »

Je suis passé à Git pour ma gestion de révision de fichiers en abandonnant peu à peu SVN. Je vous le conseille fortement d’ailleurs… La gestion des branches est beaucoup plus facile et intuitive que SVN.

Pour mes projets Rails j’ai besoin au minimum d’avoir 2 branches : Une pour ma version de production et une pour ma version de développement.

Ma version de développement sera dans une branche dev, et ma version de prod dans master.

Mais voilà… pour pouvoir déployer ma version de dev il faut que la branche se situe également sur le serveur et pas seulement en local sur ma machine.

La solution est de créer une remote branche :
$ git push origin origin:refs/heads/dev
$ git fetch
$ git branch -r

Voilà, notre branche a été créé sur le dépôt.

Maintenant créons une branche en local qui permet de travailler directement sur la remote branch précédemment créée :
$ git checkout --track -b dev origin/dev

Nous voilà donc avec 2 branches.

Note : Pour pouvoir fair un push de ma branche dev, un simple git push ne semble pas fonctionner lorsque l’on est dans la branche dev. Je fais donc :
$ git push origin dev

Déploiement

Nous allons utiliser le plugin capistrano-ext :
gem install capistrano-ext

voici mon deploy.rb se situant dans config/
set :stages, %w(prod dev)
set :default_stage, "dev"
require 'capistrano/ext/multistage'
require 'mongrel_cluster/recipes'
default_run_options[:pty] = true

Je vais créer le dossier config/deploy/ dans lequel se situera mes fichiers dev.rb et prod.rb

Me voilà donc prêt à déployer mes applications
$ cap dev deploy:setup
// Paramétrages des fichiers de config database.yml et mongrel_cluster_(dev)(prod).yml
$ cap dev deploy:cold
$ cap dev deploy (pour le déploiement normal)

Pour déployer la version en production, rien de plus simple :
$ cap prod deploy:setup
$ cap prod deploy:cold
$ cap prod deploy (pour le déploiement normal)

Il m’est maintenant plus aisé d’avoir ma version stable et de développement. Lorsque ma version de développement est validée, je la merge dans mon master :
(master) $ git merge dev

Rails 2.1

Ruby, Ruby on Rails 3 Comments »

La dernière version du fameux framework Ruby on Rails est sortit avec son lot de nouveautées (source linuxfr):

  • Gestion des fuseaux horaires:
    Cela permet plus facilement à une application de personnaliser par utilisateur le fuseau horaire des enregistrements en base. Pour cela il suffit de sauvegarder les enregistrements en UTC (Temps universel coordonné) et une variable globale à l’application « Time.zone»  change à la volée le fuseau horaire lors de l’affichage des variables.
  • Dirty Tracking (mis à jour partielle):
    ActiveRecord subit une évolution importante et remarquée, on peut enfin détecter les changements d’un modèle lors d’une mise à jour (par un formulaire par exemple). Cela permet de connaître facilement dans le code l’ancienne et la nouvelle valeur d’un champ précis seulement si celui-ci a changé et n’est pas encore sauvegardé.
  • Périmètre nommé (named scope):
    Sans doute LA grosse nouveauté de cette version, la fonction recherche (select) d’ActiveRecord devient extensible à l’infini. C’est en fait le plugin has_finder qui est inclus dans ActiveRecord et permet de définir des méthodes qui ajoutent à la volée des conditions à la requête SQL générée, avec possibilité de les imbriquer.
    Un exemple vaut mieux qu’un long discours:
    class User < ActiveRecord::Base
    named_scope :active, :conditions => {:active => true}
    named_scope :inactive, :conditions => {:active => false}
    named_scope :recent, lambda { { :conditions => ['created_at > ?', 1.week.ago] } }
    end
    # Usage standard
    User.active # pareil que User.find(:all, :conditions => {:active => true})
    User.inactive # pareil que User.find(:all, :conditions => {:active => false})
    User.recent # pareil que User.find(:all, :conditions => ['created_at > ?', 1.week.ago])
    # Imbrication possible
    User.active.recent
    # pareil que:
    # User.with_scope(:conditions => {:active => true}) do
    # User.find(:all, :conditions => ['created_at > ?', 1.week.ago])
    # end
  • Migrations basée sur une référence temporelle:
    En travail collaboratif, la gestion des migrations (script qui permet de faire évoluer le schéma de la base en ajoutant/modifiant/supprimant table, colonne, index, …) avec un compteur incrémenté devenait rapidement un calvaire: si 2 personnes faisait une migration avant leur prochain commit, les migrations avaient le même numéro. Maintenant, un timestamp (référence temporelle) est utilisée pour le nommage des migrations afin d’éviter toute « collision» .
  • Dépendances des Gem (paquets ruby):
    On peut maintenant configurer la liste des paquets Gem requis pour l’application avec une version exacte ou minimale requise. Une nouvelle tâche à la commande « rake»  permet d’installer les paquets manquants ou de les mettre à jour si besoin:
    rake gems:install
  • Meilleure mise en cache:
    C’est essentiellement la flexibilité de la mise en cache qui a été améliorée, on peut dorénavant facilement implémenter une nouvelle classe de gestion de cache personnalisée et l’utiliser dans les vues.

Comme toujours pour l’installer :
gem install rails

Bref que du bien :)

WP Theme & Icons by N.Design Studio
Entries RSS Comments RSS Connexion