lundi 27 septembre 2010

Le cross domain authentification ou comment envoyer un cookie d'un domaine à l'autre

Pour maintenir une session le protocole du web (HTTP) ne prévoit pas vraiment de mécanisme. Il faut pour cela utiliser les cookies (RFC 2109). Mais un cookie par mesure de sécurité ne relève que d'un seul domaine. Le client (navigateur) ne doit accepter des cookies que pour le domaine de l'url consultée. Et il ne doit les présenter que sur le domaine en question.

Alors comment passer un cookie d'un domaine à l'autre ?. Cette opération peut etre 'légale' dans un but de propagation d'information (authentification ou autre) ou illégale afin de capturer les cookies.
Dans les deux cas la technique est un peu similaire.

Le serveur web sur le domaine appli.domainA qui veut récupérer le cookie déposé par appli.domainB (donc un domaine diffèrent) va dans une des pages de l'appli.domainA inserer un lien vers une ressource de appli.domainB. Pour que le processus soit invisible pour l'utilisateur on utilise souvent un lien vers une image de taille de 1 pixel. Le gestionnaire de l'appli.domainA doit évidemment avoir accès à la location sur domainB qui héberge cette image pour enregistrer les cookies.

L'autre méthode utilisée pour propager la session d'un domaine à un autre est le cross domain authentification: Le site domainA qui veut passer la valeur de son cookie à domainB va réaliser une redirection de domainA vers domainB en passant en paramètre la valeur de son cookie , comme par exemple :
get http://appli.domainB/service?cookiesurdomainA=valeur.

Cette technique pose plusieurs problèmes:

Quel est le nom du paramètre, de l'url du service , du mode d'encodage et sur quelle url rebrancher l'utilisateur.

Les protocoles Oauth , openID servent à normaliser tout ceci.

Temps d'inactivité.

Dans un système où un utilisateur travaille sur 5 domaines, on peut imaginer un dispositif de controle du timeout (temps d'inactivité ) de la session.
Chaque domaine dépose un cookie mis à jour à chaque sollicitation.
En ca de timeout détecté par un domain , il interroge successivement les autres domaines pour collecter l'état du compteur inactivité. En fonction du résultat collecté , le serveur valide ou invalide le timeout. L'url servant de support aux interrogations serait de la forme : get http://serveur.domainSuivant/timeout?cookiedomainA=30min&cookiedomainB=0 etc.
Il est plus facile de réaliser ce montage en définissant un domaine maitre et des domaines esclaves.

Le processus de connexion pourrait etre le suivant :



dans l'implementation du Lemonldap le CDA est construit sous la forme d'une redirection:
print CGI::redirect($controlslave."?op=$session_id&url=".$urlc);

Qui va donner : http://serveur.domaine?op=valeur_cookie&url=url_de_retour

vendredi 24 septembre 2010

Distribution ubuntu sur un ASUS eeePC



En voulant installer Erlang OPT sur un asus eeepc/xandros , j'ai saturé le système de fichier racine. J'ai commencé par ré-installer la distribution d'origine xandros. Cette distribution est maintenant bien vieillotte.

J'ai tenté l'expérience d' une version ubuntu pour eeepc.

Pour cela il faut préparer une clé USB : la rendre bootable et y installer une image du système.

Préparation
Pour preparer la clé : linux live USB creator.


Cette étape peut etre réalisée sous Linux ou windows.
La clé doit faire 1 go.
Le programme vous demande de choisir l'image iso du système.

J'ai utilisé l'image : ubuntu-10.04.1-desktop-i386-fr.iso
(à télécharger sur le site ubuntu)

Boot sur la clé.

Pour booter sur la clé, il faut qu'elle soit détectée comme telle.
Dans l'assus eeepc : mettre la clé, allumer la machine et maintenir la touche F2 enfoncée.
Aller dans l'option Boot => Hard disk Drives: mettre la clé (usb:nnn) en disque 1.
Aller dans l'option Boot => Boot Device Priority et mettre en 1 la cle usb.

Appliquer les changements et démarrer.....
C'est tout !

Après l'installation du système, il faudra retourner dans le bios pour enlever le boot sur la clé USB.

Il est possible d'utiliser UBUNTU à partir de la clé sans l'installer sur son asus eepc.

Conclusion ... c'est de la bombe.

jeudi 23 septembre 2010

Nouvelle version 9.0 de postgresql


La nouvelle version majeure de postgresql 9.0 propose :

* Authentification par un annuaire LDAP ou par serveur RADIUS
* Réplication interne en continu
* Reprise à chaud des données (cette fonctionnalité se chiffre en milliers de dollar chez les produits propriétaires)
* Extension des procedures stockées Perl et Python pour le PS/SQL.
* Nouveaux points de trigger

Et des optimisations à tous les étages.

samedi 18 septembre 2010

#rails vs #java : video



Cette video reprise par le blog http://www.geeek.org/post/2007/05/20/Ruby-on-Rails-vs-Java

Illustre la complexité d'une architecture java JEE.

Dans les commentaires du post quelques perle dont une très plaisante :

comparer par exemple php (et rails) à java c'est comme comparer une twingo à une mercedes classe S.

Ruby ne rend pas forcement vos développements meilleurs , il rend VOS DEVELLOPEURS meilleurs (AMHO je crois qu'ils les rend plus intelligents)

lectures , romans

J'ai profité des vacances pour lire des romans. J'ai particulièrement apprécié deux livres:


The blonde de Duane Swierczynski: Une belle blonde empoisonne un homme et lui propose le marché suivant: elle lui donne l'antidote s' il s'engage à ne pas s'éloigner d'elle de plus de 10 mètres. Ca ressemble au style de Pulp Fiction.



Enfant 44 de Tom Rob Smith : Un un ex-policier du MGB, police d'Etat chargée du contre-espionnage, se lance sur la piste d'un serial killer dans la russie du temps de staline.


Mais je vous rassure, j'ai également aimé :

CouchDB : Beginning CouchDB



Nginx : Nginx HTTP Server

mercredi 15 septembre 2010

O'Reilly Free to Choose Your Cookbook: a real cookbook


cooking
Mise en ligne par germanlinux
features:
This book is an excellent and intriguing resource for anyone who wants to experiment with cooking, even if you don't consider yourself a geek.

* Initialize your kitchen and calibrate your tools
* Learn about the important reactions in cooking, such as protein denaturation, Maillard reactions, and caramelization, and how they impact the foods we cook
* Play with your food using hydrocolloids and sous vide cooking
* Gain firsthand insights from interviews with researchers, food scientists, knife experts, chefs, writers, and more, including author Harold McGee, TV personality Adam Savage, chemist Hervé This, and xkcd

Good Hacking and feeding

lundi 13 septembre 2010

Jongler avec les versions de #ruby: rvm et bundler


La gestion de version des machines virtuelles Java, Python ou autre est un exercice difficile. Il en est de même pour les versions des librairies.
Dans l'écosystème Ruby des solutions existent : RVM et Bundler
Ces deux projets sont l'illustration du dynamisme de la communauté Ruby.

RVM

Ruby Version Manager, il permet d'avoir differents interpréteurs Ruby (RMI, Rubinius, Maglev, Jruby) avec pour chacun des versions différentes.
J'utilise habituellement la version 1.8.7 sous Debian , j'ai envie de tester la version 1.9.2 sans mettre en l'air mes programmes. Pas de problème avec rvm !
La commande rvm me permet de basculer à la fois l'interpréteur mais aussi le lien vers le dépot des gemmes.

ex :
Pour obtenir la liste de mes interpréteurs:

rvm list

rvm rubies

ruby-1.8.7-p302 [ i386 ]
ruby-1.9.2-p0 [ i386 ]
Pour basculer d'un à l'autre:

rvm 1.8.7 ou rvm 1.9.2


Tous mes liens ruby (/usr/bin/ruby) et gems pointent vers la bonne version.

Pour installer un interpréteur :
 rvm install ruby-1.9.2

Installing Ruby from source to: /usr/local/rvm/rubies/ruby-1.9.2-p0, this may take a while depending on your cpu(s)...

#fetching ruby-1.9.2-p0
#downloading ruby-1.9.2-p0, this may take a while depending on your connection...
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 8296k 100 8296k 0 0 101k 0 0:01:21 0:01:21 --:--:-- 4210
#extracting ruby-1.9.2-p0 to /usr/local/rvm/src/ruby-1.9.2-p0
#configuring ruby-1.9.2-p0
#compiling ruby-1.9.2-p0
#installing ruby-1.9.2-p0
#rubygems update for /usr/local/rvm/gems/ruby-1.9.2-p0@global
#rubygems update for /usr/local/rvm/gems/ruby-1.9.2-p0
#shebangs adjustment for ruby-1.9.2-p0 (gem irb erb ri rdoc testrb rake).
#importing initial gems
#complete install of ruby-1.9.2-p0

rvm implémente la notion de dépot de gemme mutualisé ou spécifique. Un gemme peut etre installé et partagé pour tous les interpréteurs.

J'ai réussi à faire fonctionner mon Rails 2.3.4 sur ruby 1.8.2 et récupérer une version de Rails 3.0 sans perturber ma machine. On peut ainsi lancer à la fois une application Rails 2.n et un Rails 3.n.

L'installation de rvm se fait sous forme d'archive et en tant qu'utilisateur root, la ligne :

[[ -s "/usr/local/rvm/scripts/rvm" ]] && . "/usr/local/rvm/scripts/rvm"
doit etre ajoutée au lancement du shell.

Pour avoir la certitude que rvm fonctionne, la commande :

type rvm | head -n1

Doit retourner : rvm is a function

Bundler


Cet utilitaire permet de fixer les dépendance et les versions utilisées par un projet. Si celles ci ne sont pas installées, Bundler ira les chercher et les installer.


Good hacking

mercredi 8 septembre 2010

Où trouver une bonne réponse technique : #stackoverflow et #web_applications

Joel Spolsky tient un blog sur le développement qui fait référence dans ce domaine.

Avec son ami Jeff Atwood ils ont lancé avec succès le site de question/réponse : stackoverflow

L'idée directrice est la suivante: quand un développeur est face à un problème comment trouver la bonne solution. Le premier réflexe est de demander à google, mais en cas de réponse multiple, comment choisir la plus pertinente ?

Ainsi le site stackoverflow est une sorte de FAQ géante où il est possible de noter la justesse des réponses.

(copie d'écran du site)



L'auteur à lancé récemment un site analogue pour les applications web (lien ici).
Les sujets ouverts concernent facebook, youtube, google, google-aps etc.






Ces sites sont très utiles, le dernier né propose une charte graphique originale :



ou encore

mardi 7 septembre 2010

Moteurs de recherche #duckduckgo et #blekko

Des alternatives à Google commencent à se mettre en place. Je ne parlerai pas de bing , mais de deux autres moteurs DuckDuckGo et blekko

DuckDuckGO.

(lien ici).

Il met l'accent sur le respect de l'anonymat et sur la fourniture d'astuce pour des recherches plus rapides et plus pertinentes.




La combinaison du caractère '!' suivi d'un mot clé permet de spécifier le domaine de recherche:
!ruby class pour lancer une recherche sur une déclinaison (class) du sujet principal ( ruby) .
Ce moteur est en Perl , hébergé par des serveurs NGINX et du cache avec memcached.


blekko.

Lien ici.

c'est un nouveau moteur de recherche où une authentification est nécessaire (invitation sur demande) . Il permet d'utiliser des '/' slashtag pour affiner les recherches.
Ex : echec /jeux remontera les liens relatifs au jeu d'échec.

Chaque utilisateur maintient ses /shashtag (un peu comme dans twitter)

Mais le point extrèment interressant est la transparence appliquée au moteur de classement. L'algorithme est en opensource et pour mot donné , il sera possible de comprendre le classement des liens.

lundi 6 septembre 2010

#python , #ruby : c'est presque pareil

En relisant un tutorial python en francais , j'ai été frappé par la ressemblance entre Ruby et Python.


Exemple en Ruby


#!/usr/bin/ruby

def dupont
print "dupont\n"
end
def suite(v)
puts v
end
def encore(param1,param2)
puts param1,param2

end
# appel de la fonction
dupont

En Python :



#!/usr/bin/python

def
dupond() :
 print "dupond"

def suite(chaine) :
print chaine

def encore(param1,param2) :
print param1,param2

# appel de la fonction
dupond()



L'obligation d'utiliser les parenthèses dans l'appel d'une methode ou fonction Python a des conséquences étonnantes.

En Python , comme en 'c' , il est possible d'assigner une variable à une fonction
ex : data= suite # sans les parenthèses !

Et de demander data('exemple') pour appeler en coulisse la fonction suite avec le parametre 'exemple'.

La même chose en Ruby est plus compliquée à faire :

data= self.method(:suite)
data.call("coucou")

Ces mécanismes ne doivent pas être confondus avec le currying qui est un procédé qui permet de
transformer une fonction qui a plusieurs parametre en une fonction qui ne prend qu'un paramètre.

Exemple en Haskell :


module Main where
prod x y = x * y
double= prod 2
triple = prod 3


Prelude> :load currying.hs
[1 of 1] Compiling Main             ( currying.hs, interpreted )
Ok, modules loaded: Main.
*Main> double(6)
12
*Main> triple(4)
12

La signature de la fonction prod reflète ce phénomène
*Main> :t prod
prod :: (Num a) => a -> a -> a

(prod 2)4
Un appel à prod retourne une fonction lambda \y = 2 * y
Puis un deuxième appel finalise le calcul en remplacant y par 4 => 8

C'est un système extrêmement important en programmation fonctionnelle.




dimanche 5 septembre 2010

Sicile

Souvenirs de Sicile en 4 photos:


Le site:

dscn2100

Les granites:

dscn2187

Le volcan ETNA:

dscn2220

Un cube au soleil:

dscn2265

samedi 4 septembre 2010

jeux pc :audiosurf et pacman


Pendant que les jeunes passent des heures sur le nouveau jeu à la mode : audiosurf . Les vieux comme moi préfèrent un bon vieux PacMan sur plateau.
source (fluctuat.net)

Dioparama (Lien ici).

Le jeu audiosurf vous propose une course d'obstacle sur vos musiques. Ici la bande son ne sert pas qu'à rythmer ou à souligner l'action, elle est l'élément principal du jeu. Ce petit jeu à deux balles ( 9,9 dollars) connait un succès énorme et rivalise avec les poids lourds des éditeurs.
(Lien du jeu ici.)