15 mars 2008

fonzz.com

Un message uniquement pour dire à quel point je suis content d'avoir des retour bons et moins sur un service que nous (7theories) avons lancé.
C'est le cas pour fonZz qui a été le sujet de 3 posts cette semaine:
Et nous allons faire en sorte que ce ne soit que le début.

11 mars 2008

jquery et protect_from_forgery

protect_from_forgery est parfait pour protéger des attaques CSRF, mais il n'est pas possible d'utiliser les verbes POST, PUT, DELETE sans donner la clé au serveur.
Dans une implémentation rails classique c'est à dire avec prototype, c'est plutôt facile de faire des actions Ajax, car link_to_remote n'est autre qu'un formulaire avec la clé inclue.

Voici la solution que j'utilise avec jquery:
J'utilise des classes css sur mes liens pour dire quel verbe http utiliser. par exemple:
link_to 'toto', post_path(@post), :class => 'delete remote'

Mon code jquery pour géré le lien est les suivant:
$('a.remote.delete').bind('click',function(){
var _href = this.getAttribute('href')
$.ajax({
url: _href, data: {_method: "delete"},
beforeSend: function(xhr) {
xhr.setRequestHeader("Accept", "text/javascript")},
dataType: 'script',
type: 'DELETE'})
return false })


Jusqu'ici tout va bien... Malheureusement quand on essaie de cliquer sur le lien on aura une erreur, la clé n'est pas présente.
Donc je soumet la clé (form_authenticity_token) directement dans le lien. voici le petit helper qui m'aide à faire ça :
def secure_link_to(name, options = {}, html_options = nil, *parameters_for_method_reference)
options += (options.include?('?') ? '&' : '?') +
"#{request_forgery_protection_token.to_s}=#{form_authenticity_token}"
link_to(name, options, html_options)
end


Il suffit maintenant d'appeler:
secure_link_to 'toto', post_path(@post), :class => 'delete remote'
et le tour est joué.

10 mars 2008

4 beta invites pour github

S'il y en a que ça intéresse j'ai 4 invitations pour github, ça vous évitera d'attendre le délai de quelques jours. mailez moi à cette adresse:
ruby>> "jney@%s.com" % "7theories"

9 mars 2008

Des contraintes jusqu'à 127 caractères sous postgresql

Si vous voulez des noms de contraintes (et autres dont colonnes, fonctions,...) sous postgresql qui soient limités à 127 caractères au lieu de 63, il faut:
  • Télécharger les sources de postgresql:
    wget http://wwwmaster.postgresql.org/download/mirrors-ftp?file=%2Fsource%2Fv8.2.6%2Fpostgresql-8.2.6.tar.gz

  • Décompresser les sources:
    tar xzvf postgresql-8.2.6.tar.gz
    cd postgresql-8.2.6

  • Modifier la valeur NAMEDATALEN dans le fichier src/include/postgres_ext.h, la passer à 128 à la place de 64

  • Ensuite compiler postgresql:
    ./configure --prefix=/usr/local && make && make install



Voila, vous n'avez plus qu'à configurer normalement votre base de données préférée et vous pourrez utiliser des noms beaucoup parlant!

8 mars 2008

namespacing avec jquery

A un moment donné j'avais besoin de "namespacé" mes fonctions et plugins avec jquery donc j'avais posé la question sur le groupe jquery.

Voici le code permettant d'avoir la fonction namespace:
$.namespace = function(ns, functions){
$.fn[ns] = function() {return this.extend(functions)}
}
$.namespace('$', $.fn) // the default namespace


Une fois, cette fonction déclarée vous pouvez déclarer les namespaces que vous desirez.

exemple:
$.namespace('mon_namespace', {
ma_fonction: function(){
$(this).each(function(){alert($(this).attr('id'))})
}
})

que vous appelerez comme ceci:
$('#mon_div').mon_namespace().ma_fonction()

importer les contacts avec ruby on rails

Il est toujours intéressant de proposer à l'utilisateur d'importer les contacts de ces différents réseaux, aussi bien pour lui que pour agrandir votre propre réseau.

Importer les contacts avec rails n'a pas été si facile la seule librairie disponible été contacts. Très facile d'utilisation mais les seuls comptes fonctionnant était les comptes gmail. Ceci étant dis cette librairie a été remise à jour récemment. Donc j'imagine qu'elle doit marcher normalement maintenant.

Il y a quelques mois de ça, est sortie la librairie Blackbook, simple et fiable. Pour importer les contacts pas besoin de selectionner le réseau (hotmail, gmail, yahoo etc...), simplement login et le mot de passe et la Blackbook se débrouille :
@contacts = Blackbook.get :username => params[:email], :password => params[:password]

Ceci retournera un Array de Hash. Le soucis c'est que selon le reseau les Hash renvoyés n'auront pas les mêmes clés.
sous gmail:
{:name=>"johnny", :email=> "johnny.h@fakemail.fr"}
sous hotmail/live:
{:name=>"johnny", :email=>"", :"Windows Live ID"=>"johnny.h@fakemail.fr"}
sous yahoo:
{:name=>"mail: johnny.h@fakemail.fr ", :email=>"@yahoo.com"}

Donc le seul moyen est de parser l'Array et d'en extraire nom et email:

@contacts = @contacts.collect do |contact|
email = nil # doit être initialiser
# initialalisation du nom du contact
name = contact[:name] if !contact[:name].include?('@')
# recherche de l'email dans toutes clés du hash
contact.each_value do |e|
# on regarde avec une expression regulière
# si on trouve qqchose qui ressemble a un email
# si on trouve on passe à l'élément suivant
(email = e.match(/([_\w\d-]+(\.[_\w\d-]+)*@[\w\d-]+(\.[\w\d-]{2,})+)|(^$)/i)[0] rescue nil) && break
end
{:name => name, :email => email} if !email.blank? && !current_user.email?(email)
end.compact


Voilà, le tour est joué on se retrouve avec un array de hash bien organisé, du style:
{:name=>"johnny", :email=> "johnny.h@fakemail.fr"}
quelque soit le compte sur lequel on se connecte.

à noter que les noms ne seront pas obligatoirement bon mais le principal est d'avoir les emails pour envoyer les invitations.