lundi 22 décembre 2008

One Time Password , 3 secrets et compagnie avec yubikey La firme yubico

La firme yubico produit une clé USB délivrant à chaque utilisation un mot de passe jetable (OTP).
L'utilisateur ne paye que la clé, le service d'authentification est gratuit , les librairies sont libres.

Et en plus, on peut s'en servir de porte-clé !




Lorsque la yubikey est sollicitée , elle génère un token de 44 octets qui prennent la forme d'une chaine de caractère qui serait 'tapée' sur le clavier de l'ordinateur. Cette pseudo clé USB simule la frappe de 44 caractères sur votre clavier. cette séquence est chaque fois différente mais présente toujours la structure suivante :

* secret ID :(6 octets)
* session counter: (2 octets)
* horodatage: (3 oct)
* compteur de session :(1 oct)
* valeur aleatoire :(2 oct)
* Controle CRC : (2 oct)


Le tout encodé en AES 128 bits puis protegé par l'encodage MODHEX

La firme propose un service de validation en ligne des OTP. Mais il est possible de monter soit même un service de validation interne à son entreprise.

Le cout de cette clé : de 10 $ à 25 $ en fonction du volume.

La liste des services ou logiciels compatibles s'allonge tous les jours :

* Login sous Windows
* PAM
* SSH
* openID
* VPN
* Rails
* openSSO
* APACHE
* et ... Mandriva.



Déroulement d'une connexion:

* L'utilisateur glisse sa clé dans un port USB
* Le formulaire web lui demande son OTP.
* L'utilisateur presse le bouton de la clé ou 2 fois la touche verrouillage du pavé numérique.
* La clé inscrit les 44 caractères dans le champs du formulaire.
* Apres vérification auprès du fournisseur d'identité un autre formulaire est envoyé demandant le nom d'utilisateur et le mot de passe.
* L'utilisateur complète le formulaire et est accepté par le service.

REMARQUE IMPORTANTE: il serait possible de mettre les 3 secrets dans la même page, mais cela serait moins sécurisé car un pirate pourrait capturer les 3 secrets dans un seul échange (revoir ou relire le 'seigneur des anneaux' pour les questions de secret partagé) .

dimanche 21 décembre 2008

Validation des données par Rails (ActiveRecord)

Rails propose trois modes de validation des données :

A) Le mode standard
On ajoute une serie de methodes predifinies pour vérifier la présence d'un champs ,sa longueur ou encore sa composition (forme validates.._of :attribut )

* validates_acceptance_of
* validates_associated
* validates_confirmation_of
* validates_each
* validates_exclusion_of
* validates_format_of
* validates_inclusion_of
* validates_length_of
* validates_numericality_of
* validates_presence_of
* validates_size_of
* validates_uniqueness_of




B) Les callbacks.
Rails propose 18 points d'accroche de fonction de vérification (avant/apres sauvegarde, apres recherche etc.) Il suffit d'ecrire la methode de callback propre à une classe.
(extrait)

* (-) save
* (-) valid
* (1) before_validation
* (2) before_validation_on_create
* (-) validate
* (-) validate_on_create
* (3) after_validation
* (4) after_validation_on_create
* (5) before_save
* (6) before_create
* (-) create
* (7) after_create
* (8) after_save




C) Les observateurs.
Ces objets 'observent' le cycle de vie des autres objets. L'avantage est la totale indépendance de l'observateur et de la classe à surveiller et aussi le fait que la classe scrutée n'a pas à etre modifiée pour supporter des observateurs.

samedi 20 décembre 2008

Fedora Directory Server une alternative à openldap

Fedora Directory server est l'évolution de l'ancien server LDAP de Netscape lui même issu de la même souche de l'Université du Michigan (Umich) qu'openldap.

FDS et openldap sont donc des cousins. Une visite sur le site de Fedora Directory server vous démontrera que les gars de Red Hat ont fait fructifier l'héritage de Netscape.

Jugez plutot :

1. Multimaster replication
2. aci
3. directory server gateway : offre un service SOAP d'annuaire et une interface WEB
4. Organigramme : plugin pour fournir un vrai organigramme d'entreprise
5. etc...


Tous les composants de FDS sont open Source.

Administrer un cluster de serveur avec ssh

Il est possible de mutualiser des configurations de serveur avec rsync et monit. Il suffit de modifier sur une machine 'maitre' un fichier pour qu'après un délais programmé les services rsync et monit diffusent le fichier aux autres noeuds du cluster. Le service monit sur les noeuds 'esclaves' detectera la reception et donc la modification du fichier et déclachera alors une action définie (ex: redemarrer un service Apache) . Par contre il est parfois necessaire dde lancer une même serie de commandes sur chaque noeud du cluster. Il existe un outils qui va soulager bien des administrateurs de cluster: Cluster ssh. Ce programme basé sur du Tcl/Tk propose une fenetre qui diffuse les commandes sur chaque noeud (en bas à droite) . Il est aussi possible de gerer individuellement chaque noeud.

Voici une copie d'écran:

lundi 15 décembre 2008

Jeux en javascript

Le top des 25 jeux en javascript ici et encore ici
Certains jeux sont des bijoux de programmation

Une copie d'écran:










Ce n'est ni plus ni moins qu'une course sur une google map. Organisez un rodéo dans votre quartier !

Nouveau projet

Je lance un nouveau projet :

http://code.google.com/p/lemonid/

Sa description :

Lemon-id is digital identity manager integrator based on Rails , Database and LDAP

Ses objectifs:

Lemon-id n'est pas un nouveau projet de gestion d'identité numérique. Il a pour but d'intégrer les autres projets de web SSO ,d'authentification dans un framework fournisseur d'identité. Lemon-id servira de base d'authentification à d'autres composants et pour cela il proposera plusieurs interfaces.

Ses principes :

* Une base de données pour les Meta-données
* Fichiers de configuration au format YAML
* Format JSON pour les échanges entre les composants
* Interface graphique en Rails

dimanche 14 décembre 2008

SSO CAS exemple de servlet

Utiliser la librairie client CAS de Yale dans le cadre d'un servlet est très simple :
Une fois récupéré le ticket , le servlet doit le faire valider par le serveur CAS de cette facon :


/* contact CAS and validate */
sv.validate();

/* if we want to look at the raw response, we can use getResponse() */
xmlResponse = sv.getResponse();

/* read the response */

// Yes, this method is misspelled in this way
// in the ServiceTicketValidator implementation.
// Sorry.
if(sv.isAuthenticationSuccesful()) {
user = sv.getUser();
} else {
errorCode = sv.getErrorCode();
errorMessage = sv.getErrorMessage();
/* handle the error */
}

Il reste un problème : Le client CAS standard n'accepte de valider un ticket qu'en utilisant le protocole HTTPS. Or pour les tests, il est parfois plus facile d'utiliser HTTP pour faciliter la capture des trames réseaux.

J'ai donc adapté le client CAS de cette façon :

Attention le code semble complexe mais il est une série de copier/coller



import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import edu.yale.its.tp.cas.client.*;
import org.xml.sax.*;
import java.net.URL;
import java.net.URLConnection;
import java.util.regex.*;

public class MyServlet extends HttpServlet {

public void init() {
}
public void doGet(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {

String CASLogin = "http://cas.demo.net/cas/login" ;
String CASValidate = "http://cas.demo.net/cas/serviceValidate/" ;
String UrlMonService = "http://serviceprovider.demo.net:8080/servlets- examples/servlet/myservlet";

String ticket = req.getParameter( "ticket");
if (ticket == null )
{
res.sendRedirect( CASLogin + "?service=" +UrlMonService);
} else {
res.setContentType("text/html");
PrintWriter out = res.getWriter();


edu.yale.its.tp.cas.client.ServiceTicketValidator st = new edu.yale.its.tp.cas.client.ServiceTicketValidator();
st.setCasValidateUrl(CASValidate);
st.setServiceTicket( ticket );
st.setService( UrlMonService );
StringBuffer sb = new StringBuffer();
sb.append(CASValidate);
if (CASValidate.indexOf('?') == -1)
sb.append('?');
else
sb.append('&');
sb.append("service=" + UrlMonService + "&ticket=" + ticket);
String url = sb.toString();
BufferedReader r = null;
String response="" ;

try {
URL u = new URL(url);
URLConnection uc = u.openConnection();
uc.setRequestProperty("Connection", "close");
r = new BufferedReader(new InputStreamReader(uc.getInputStream()));
String line;
StringBuffer buf = new StringBuffer();
while ((line = r.readLine()) != null)
buf.append(line + "\n");
response = buf.toString();
} finally {
try {
if (r != null)
r.close();
} catch (IOException ex) {
// ignore
}


}
Integer result =0;
String user="";
/* reponse negative */
if (response.indexOf("authenticationFailure") >= 0 )
{
result =0 ;
} else
{
result =1 ;
Pattern p = Pattern.compile("(.+)");
Matcher m = p.matcher(response);
if (m.find()) {
// recup du user
user= m.group(1) ;
}
}

out.println("");
out.println(" Titre ");
out.println("");
out.println("Ma première servlet v5 CAS Client ");
if (result == 1 )
{
out.println("connexion reussie pour l\'utilisateur:" + user );
out.println("Avec le ticket " + ticket);
} else {
out.println("ERREUR de connexion" );
out.println("ticket " + ticket);
}
out.println("");
out.println("");
out.close();
}
}





}


Good hacking


dimanche 30 novembre 2008

Le meilleur jeu du monde: pong


Afin mon jeux préferé arrive sur le web 2.0 !
Ici sur ce site : un jeux de PONG en javascript (voir copie d'écran).

Je vous conseille d'aller voir les autres projets du site , les idées , le graphisme :tout est superbe.

Je suis un homme (pas totalement)

Une expérience intéressante à faire sur le site ici.
Ce site est capable de déterminer votre sexe en fonction des sites visités (moteur de recherche, blog, réseaux sociaux). Il utilise une technique simple et astucieuse: L'affichage différencié des liens déjà visités.
Vous avez déjà sûrement remarqué que les liens déjà visités sur une page sont affichés dans une couleur différente. Ce site vous envoi en arrière plan une sélection de site. Chaque site est pondéré par un coefficient. Exemple:

Si je suis allé sur mozilla.org le coefficient sera > 1 (homme ) 1.33 pour etre précis.
Si je suis allé sur facebook : le coefficient va chuter à 0.83

Pour simplifier, si je vais sur un site 'pour tekos' je suis un homme , si je vais sur un site de cuisine je suis une femme.

Voici mes résultats :

Likelihood of you being FEMALE is 22%
Likelihood of you being MALE is 78%


SiteMale-Female Ratio
google.com
0.98
facebook.com
0.83
blogger.com
1.06
flickr.com
1.15
digg.com
1.56
dailymotion.com
1.3
reddit.com
1.33
mozilla.org
1.33

Ouf j'ai reussi à préserver une part de féminité en moi.

Mais d'une manière plus sérieuse l'auteur cherche à nous mettre en garde contre les traces 'visibles' ou 'invisibles' que l'on laisse sur Internet.

samedi 29 novembre 2008

Fresque des langages

Sur ce site (oui ici) , l'auteur propose une vaste fresque des langages informatiques (50 sur 2500) . Un rectangle de sélection permet de voir les détails de la fresque.

Voici un extrait :

Le FORTRAN reste un peu le doyen des langages (1954)

dimanche 23 novembre 2008

Un moment intense, grave mais digne (sans alcool) .

Mardi soir (le 18/11) , Arnaud,casimir,jp,alex et moi même étions de sortie. Sortie particuliaire car elle était destinée à immortalider la fin d'une belle aventure de plusieurs années. JPR était présent en tant que membre honoraire. Que dire ? , Il y eu des rires, de la bière (beaucoup de biere) et surtout de l'émotion. Notre virée devait commencer au Frog de Bercy Village , pour se continuer au restaurant. Finalement on est resté au Frog. Je souhaite à tous de connaitre une soirée comme ca et des amis comme ca , le reste n'est que blabla.

Voici quelques photos :




dscn0674

dscn0675

dscn0676

dscn0677

dscn0678

dscn0679

dscn0680

dscn0681

dscn0682

dscn0683

mardi 11 novembre 2008

Google comme moteur de recherche mp3

Il possible de se faire aider par Google pour trouver des fichiers MP3. Attention ce n'est pas du Peeer2Peer , c'est simplement pour trouver des serveurs web qui hébergent des fichiers mp3.


Trouvé sur le blog http://www.haywirehacking.com

Il suffit de faire un copié/coller de cette ligne dans la fenetre de recherche de google.

-inurl:(htm|html|php) intitle:"index of" +"last modified" +"parent directory" +description +size +(wma|mp3) ""

doit etre remplacé par votre critère de recherche exemple:

-inurl:(htm|html|php) intitle:"index of" +"last modified" +"parent directory" +description +size +(wma|mp3) "BRASSENS"

Donnera les resultats suivants

Résultats 1 - 10 sur un total d'environ 70 pour -inurl:(htm|html|php) intitle:"index of" +"last modified" +"parent directory" +description +size +(wma|mp3) "BRASSENS" (0,16 secondes)

Résultats de recherche

  1. Index of /Brassens chante encore

    - 2 nov
    [DIR] Parent Directory 18-Nov-2007 19:14 - [SND] +2h-2n---stances a v..> 30-Oct- 2006 09:10 4.3M [IMG] Brassens.gif 30-Oct-2006 10:52 727k [IMG] ...
    plus2hmoins2n.free.fr/Brassens%20chante%20encore/ - 4k - En cache - Pages similaires - À noter
  2. Index of /mp3/Copie De Kylie Minogue /

    Index of /mp3/Copie De Kylie Minogue /. Name. Last modified. Size. Description. Parent Directory. Copie De - Coyote Girls.mp3 ...
    vmp3.eu/mp3/Copie%20De%20Kylie%20Mino... - 67k - En cache - Pages similaires - À noter
  3. Index of /mp3/Renaud/

    Index of /mp3/Renaud/. Name. Last modified. Size. Description. Parent Directory. Renaud - Morgane De Toi.mp3 ... Renaud Chante Brassens - Le Vieux Leon.mp3 ...
    vmp3.eu/mp3/Renaud/ - 23k - En cache - Pages similaires - À noter
    Autres résultats, domaine vmp3.eu »
  4. Index of /histoire/2003-2004/equip39/pages/Chansons

    - 2 nov
    Parent Directory, -. [ ], Edit Piaf, paroles, site.doc, 15-Feb-2007 10:57, 47K. [ ], Georges Brassens, paroles, site.doc, 15-Feb-2007 10:57, 55K ...
    www.recitus.qc.ca/histoire/2003-2004/equip39/pages/Chansons/ - 3k - En cache - Pages similaires - À noter

vendredi 7 novembre 2008

Les APIs LDAP pour Ruby

J'ai recensé 3 APIs LDAP pour Ruby :

Net-ldap c'est l'équivalent au Net::LDAP de Perl .
activeldap: Cette librairie émule activerecord qui au lieu d'utiliser une base de données va se connecter à un annuaire LDAP.
ruby-ldap: Ca ressemble un peu à l'ancinne librairie perl-ldap.

Dans mes recherches , je veux recuperer le schémas de l'annuaire.

Seule ruby-ldap permet de réaliser cette opération facilement.
Le programme suivant est donné en exemple:

require 'ldap'
require 'ldap/schema'

#conn = LDAP::Conn.new( 'localhost', 389 )
#conn.bind( '', '' )
$HOST ='localhost'
$PORT=389


conn = LDAP::Conn.new($HOST, $PORT)
conn.set_option( LDAP::LDAP_OPT_PROTOCOL_VERSION, 3 )

conn.bind{
schema = conn.schema()
p schema.must("person")
p schema.attr("person", "MUST")
p schema.may("person")
p schema.attr("person", "MAY")
p schema.sup("person")
p schema.attr("person", "SUP")
schema.each{|key,vals|
vals.each{|val|
print("#{key}: #{val}\n")
}
}
}

La construction est particuliaire et je vais chercher à l'améliorer.

Par contre la librairie ruby-ldap n'est pas compatible avec les dernieres versions de ruby , j'ai du appliquer le patch suivant sur le fichier schema.rb



--- schema.rb 2008-11-07 15:30:23.000000000 +0100
+++ /usr/local/lib/site_ruby/1.8/ldap/schema.rb 2008-11-07 14:48:58.000000000 +0100
@@ -35,7 +35,7 @@
self['objectClasses'].each{|s|
if( s =~ /NAME\s+'#{oc}'/ )
case s
- when /#{at}\s+\(([\w\d_-\s\$]+)\)/i
+ when /#{at}\s+\(([\w\s\$-]+)\)/i
return $1.split("$").collect{|attr| attr.strip}
when /#{at}\s+([\w\d_-]+)/i
return $1.split("$").collect{|attr| attr.strip}

jeudi 6 novembre 2008

Récupération du schéma d'un annuaire LDAP

Pour interroger le schéma d'un annuaire ldap il faut lancer la commande suivante:

ldapsearch -h localhost -b "cn=subschema" -s base "objectclass=*" + -x

Qui donnera quelque chose comme ceci :

# LDAPv3
# base with scope baseObject
# filter: objectclass=*
# requesting: +
#

# Subschema
dn: cn=Subschema
structuralObjectClass: subentry
createTimestamp: 20081106155906Z
modifyTimestamp: 20081106155906Z
ldapSyntaxes: ( 1.3.6.1.4.1.1466.115.121.1.4 DESC 'Audio' X-NOT-HUMAN-READABLE
'TRUE' )
ldapSyntaxes: ( 1.3.6.1.4.1.1466.115.121.1.5 DESC 'Binary' X-NOT-HUMAN-READABL
E 'TRUE' )
ldapSyntaxes: ( 1.3.6.1.4.1.1466.115.121.1.6 DESC 'Bit String' )
...........


Si la commande ne donne rien, cela provient souvent d'un problème d'ACL :
Vérifiez d'avoir ceci dans son fichier de configuration :

access to dn.base="cn=Subschema" by * read

Fichier amorce pour un annuaire LDAP

Pour créer un annuaire ldap voici un fichier amorce.ldif

dn: dc=demo,dc=net
objectclass: top
objectclass: organization
objectclass: dcobject
o: demo
dc: demo
description: Top level LDAP for demo ldap


Il ne reste plus qu'a l'injecter avec la commande :

slapadd -f /usr/local/openldap/etc/openldap/slapd.conf -l amorce.ldif

lundi 3 novembre 2008

Console ssh dans un navigateur

Ajax term permet d'avoir une console dans un navigateur.

Voici un exemple :



Dans linux magazine numero 110 - Nov 2008 un article complet sur l'installation.

Un lien : ici et là

samedi 1 novembre 2008

Je suis un super héros

Grace au site : make me super devenez en un clic de souris un super Héros :

Ce générateur à partir d'une photo du visage fabrique un mini film vantant vos exploits.





Avec en prime un lien pour vos amis ici et ici

Et un poster :

Dream team : game over MAIS same player shoot again

Après des années de collaboration et d'efficacité hors normes, Le dream team se disperse.
Ainsi je suis allé avec avec arnaud en salle machine installer une machine une dernière fois.

Nous avons travaillé avec une console improvisée :


Photo655

Arnaud


p1000034

C'est la fin d'une époque, une page qui se tourne , je pourrais aligner comme ca des formules toutes faites. C'est surtout la fin d'une période riche en partage, en joie et en rire dans le travail. Mais il ne faut pas oublier ce que répète Sinoué l'égyptien : « Qui a bu l’eau du Nil reviendra toujours s’y désaltérer ». Cette phrase pleine d'espérance remplace avantageusement la formulaire lapidaire 'au revoir'.

mercredi 29 octobre 2008

Le traducteur du shell google (goosh)

Apres lancement de goosh.org sur le prompt /web , il est possible de fixer le service par défaut pour éviter de taper le suffixe de la commande .

(exemple ici : translate ou trans)

Loading local settings...

guest@goosh.org:/web> translate

On se retrouve dans le service de traduction:
La syntaxe est la suivante : 'langue de départ' 'langue cible' phrase ou mot

Ici d'anglais en francais :
guest@goosh.org:/translate> fr en poulpe
translating "poulpe" from french to english:

"octopus"

Et réciproquement :

guest@goosh.org:/translate> en fr star
translating "star" from english to french:

"étoile"


Pour une phrase entiere :


guest@goosh.org:/translate> fr en les sanglots longs des violons
translating "les sanglots longs des violons" from french to english:

"the long sobs of violins"

Pour revenir au mode de recherche web : cd ..


enjoy ("apprécier")

mardi 28 octobre 2008

Test cerveau hèmisphere droit ou gauche.

Test cerveau droit contre gauche

(d'après le couriermail.com)
Dans quel sens voyez vous tourner la danseuse ?

Dans le sens des aiguilles d'une montre : Vous êtes plutôt hémisphère droit
Dans le sens inverse : vous êtes plutôt hémisphère gauche




Fonctions hémisphère gauche
Fonctions hémisphère droit
Logique
Sentiments
vision du détail
Vision d'ensemble
Réaliste
imaginatif
mot et langage
image et symbole
tourné vers le passé
tourné vers le futur
maths et sciences philosophie et religion
savoir
comprendre
Précision
Fonctionnel
prudent
risque


Générateur de photo

Un autre site de de génération de photo : ici ou ici.

Bien sur il y a les classiques :




Ou encore ceci :





Mais mon préféré reste celle la :

Cette photo soulève plein de mystère .

Qui sont ces gens? , pourquoi des masques à gaz ? Sont ils des conspirateurs ou une police secrète.



vendredi 24 octobre 2008

Le shell non officiel de google

Voici à quoi ressemble le shell non officiel de google !
Site goosh.org

Goosh goosh.org 0.5.0-beta #1 Mon, 23 Jun 08 12:32:53 UTC Google/Ajax


Welcome to goosh.org - the unofficial google shell.

This google-interface behaves similar to a unix-shell.
You type commands and the results are shown on this page.

goosh is powered by google.

goosh is written by Stefan Grothkopp <grothkopp@gmail.com><grothkopp@gmail.com>
it is NOT an official google product!

Enter help or h for a list of commands.

Loading local settings...

guest@goosh.org:/web> help
help

commandaliasesparametersfunction
web(search,s,w)[keywords]google web search
news(n)[keywords]google news search
more(m)
get more results
blogs(blog,b)[keywords]google blog search
read(rss,r)read feed of url
feeds(feed,f)[keywords]google feed search
place(places,map,p)[address]google maps search
translate(trans,t)[lang1] [lang2] google translation
images(image,i)[keywords]google image search
video(videos,v)[keywords]google video search
clear(c)
clear the screen
wiki(wikipedia)[keywords]wikipedia search
help(man,h,?)[command]displays help text
cd
change mode
site(in) search in a specific website
open(o)open url in new window
go(g)open url
lucky(l)[keywords]go directly to first result
ls
[command]lists commands
addengine

add goosh to firefox search box
load
load an extension
settings(set)[name] [value]edit settings
gmail(mail)[compose]read & write mail in gmail *
login

login with your google account *
logout

log out of goosh *

- Enter green commands without parameters to change default mode.
- Anything that's not a command will search in current default mode.
- Aliases will expand to commands. Numbers will expand to corresponding search results.
- Use cursor up and down for command history.
- Enter keyword and hit the tab-key for tab-completion.
- Commands marked with * are experimental, use them with care and please report any bugs.


mercredi 22 octobre 2008

iptables et le NAT

Linux est livré avec un pare-feu intégré au noyau IPTABLES

Ce pare-feu est plus qu'une simple protection , il permet de faire du NAT ou du PAT.

Concernant le NAT :

Prenons l'exemple d'une machine devant servir de passerelle d'un réseau vers un autre .

CAS 1: Plusieurs machine doivent partager la même adresse IP de sortie.

On désire 'deguiser' (masquerading) une adresse entrante pour la mettre en conformité avec le réseau destinataire . On utilisera la syntaxe suivante:

iptables -A POSTROUTING -s 192.168.204.56 -o eth0 -j SNAT --to-source 10.200.2.99

(vérification par iptables -L -t nat )

CAS 2: Une machine veut sortir sur le réseau sur des adresses IP differentes en fonction de critères divers .

# Si connexion à l'application X (10.1.1.1) => NAT Source 10.10.10.10 (eth0:0)
iptables -t nat -A POSTROUTING -d 10.1.1.1/32 -o eth0 -j SNAT --to 10.10.10.10

# Si connexion à l'application Y (10.1.1.2) => NAT Source 10.10.10.11 (eth0:1)
iptables -t nat -A POSTROUTING -d 10.1.1.2/32 -o eth0 -j SNAT --to 10.10.10.11

dimanche 19 octobre 2008

Message d'erreur Rails en francais

Rails est un framework jeune (2004) et l'internalisation n'est pas la préoccupation première de l'équipe projet.
Voici un fichier à ajouter dans le réperoire config/initializer/

fichier : french_errors_localization.rb

module ActiveRecord
class Errors
@@default_error_messages.update( {
:inclusion => "n'est pas inclut dans la liste",
:exclusion => "est réservé",
:invalid => "est invalide",
:confirmation => "ne correspond pas à la confirmation",
:accepted => "doit être accepté",
:empty => "ne peut pas être vide",
:blank => "est requis",
:too_long => "est trop long (%d caractères maximum)",
:too_short => "est trop court(%d caractères minimum)",
:wrong_length => "n'est pas de la bonne longueur (devrait être de %d caractères)",
:taken => "est déjà prit",
:not_a_number => "n'est pas un nombre",
})

def full_messages
full_messages = []

@errors.each_key do |attr|
@errors[attr].each do |msg|
next if msg.nil?

if attr == "base"
full_messages << msg
else
full_messages << @base.class.localized_human_attribute_name(attr) + " " + msg
end
end
end

full_messages
end
end

class Base
class << self
def localized_human_attribute_name(attr) #:nodoc:
attr.humanize
end
end
end
end

module ActionView #nodoc
module Helpers
module ActiveRecordHelper
def error_messages_for(object_name, options = {})
options = options.symbolize_keys
object = instance_variable_get("@#{object_name}")

unless object.errors.empty?
content_tag("div",
content_tag(
options[:header_tag] || "h2",
"#{pluralize(object.errors.count, "erreurs")} empêche(nt) cette forme d'être sauvegardée"
) +
content_tag("p", "Veuillez vérifier les informations et apporter les modifications aux champs suivants :"
) +
content_tag("ul", object.errors.full_messages.collect { |msg| content_tag("li", "Le champ " + msg) }),
"id" => options[:id] || "errorExplanation", "class" => options[:class] || "errorExplanation"
)
end
end
end
end
end

mercredi 8 octobre 2008

Lego, record du monde

Avis aux petits joueurs de lego :
DSCN0439

Un record vient d'etre battu : 460 000 briques , 30 metres de haut.
3000 personnes ont participé à cette construction en Australie.


mardi 30 septembre 2008

Configuration facile pour asus eee pc

Un utilitaire tres sympa pour l'asus eeepc : TweakEEE

Il permet de configurer toute l'interface graphique et les programmes : il est à telecharger ici et ici.


Quelques photos



Les 12 mots grecs à savoir

Un article sur www.dailywritingtips.com dresse la liste des mots grecs à connaitre :
Voici :
  • Acme : (Point extrême)
  • Acropolis
  • Agora
  • Anathema
  • Anemia
  • Ethos:(disposition)
  • Dogma
  • Eureka
  • Genesis
  • Phobia
  • Plethora
  • Kudos (La gloire)

samedi 27 septembre 2008

Vos portraits de 1950 à 2000

Voici un site très amusant 'yearbook' ici ou bien ici , à partir de votre photo ,il vous fabrique un album photo année après année

Des exemples :


années 70 ou bien années 2000: je suis toujours beau .



Testez votre QI de coloriste

Ici sur ce lien , un test de couleur , il s'agit de reconstituer un dégradé.
Pas facile !

samedi 20 septembre 2008

Debug en Ruby

En perl , il suffit de faire perl -d nom_programme

En ruby , il faut préalablement installer le gemme ruby-debug par :

gem install ruby-debug

Puis lancer

rdebug nom_programme

Good hacking

La doc est ici.

La nuit du pruriel : la chasse au bug

J'ai commencé une application rails avec une classe ruby 'eleve' . Rails doit normalement créer une table sqlite nommée 'eleves' . Pour passer du pruriel au singulier , Rails utilise un 'inflector' (fichier inflections.rb dans config/initializers).

Aprés avoir généré l'echaffaudage de la table par :
./script/generate scaffold eleve nom:string prenom:string

Puis réalisé la migration par :
rake db:migrate

J'avais une systématiquement une erreur d'exécution :
ActionView::TemplateError (undefined method `eleve_path' for
#) on line #13 of eleves/index.html.erb:

J'ai commencé à chercher sur les forums un eventuel bug de la version 2.0 de Rails , la seule indication d'un problème similaire était relatif à l'opération de transformation singulier vers pluriel de Rails. J'ai recommencé l'opération avec la classe ruby 'Foo' et là pas de problème.

Puis j'ai lancé la console de Rails et réalisé l'essai suivant :

/home/user/Premappli> ./script/console
Loading development environment (Rails 2.1.1)
>> "eleve".pluralize
=> "eleves"
>> "eleves".singularize
=> "elefe"

Et oui , si la transformation singulier => pluriel fonctionne , par contre la fonction réciproque donne un résultat incorrect.
Rails fait iune mélange des règles anglaises avec du vocabulaire francais (rappel :leaf donne leaves ) .

Pour contourner le problème il y a deux solutions :

Demander à Rails d'utiliser une nom de table bien précis puis établir une relation manuelle entre la classe et le nom de la table par l'ajout dans model/bar.rb
de la ligne : set_table_name "foos" comme par exemple :

class Bar < ActiveRecord::Base
set_table_name "foos"
end

J'ai généré une application 'gestion' et ajouté
set_table_name "eleves" dans models/gestion.rb


.L'autre solution plus élégante est surcharger la classe responsable de la transformation singulier/pluriel : inflections.rb
Comme ceci
ActiveSupport::Inflector.inflections do |inflect|
inflect.irregular 'eleve' ,'eleves'
# inflect.plural /^(ox)$/i, '\1en'
# inflect.singular /^(ox)en/i, '\1'
# inflect.irregular 'person', 'people'
# inflect.uncountable %w( fish sheep )
end

Voila comment on passe une nuit à chercher un bug.

vendredi 19 septembre 2008

Installation de rubygem

Pour Debian

Normalement sur une debian l'installation se fait par :
apt-get install libyaml-ruby
apt-get install libzlib-ruby

Puis apt-get install rubygems

Installation manuelle


Pour une installation manuelle depuis le repertoire de l'archive faire :

ruby setup.rb

Si le répertoire d'installation n'est pas standard (/usr/local/lib/ruby)
L'installation se lancera de la manière suivante:
(/home/monrep et /home/mondepot )

export GEM_HOME= /home/mondepot
ruby setup.rb config --prefix=/home/monrep
ruby setup.rb setup
ruby setup.rb install

La mise à jour de gem se fait par la commande :
gem update --system

En cas de message d'erreur de type :

/usr/bin/gem:23 uninitialized constant Gem::GemRunner
Recherche le programme gem (sous /usr/bin)
Et ajouter la ligne :
require 'rubygems/gem_runner'

jeudi 18 septembre 2008

10 astuces pour survivre en Rails

Voici les 10 gestes de survie pour Rails.

1 ) Installer Rails :
gem install rails

2 ) Lister les gemmes
gem list -r

3 ) Creer une application Rails
rails monappli -d mysql/oracle/postgresql/sqlite2/sqlite3

4 ) Les sept actions d'une application RESTFull
index - show - new - create - edit - update - destroy
La page d'accueil est : index.html dans le repertoire public
Modification possible par :
map.connect '', :controller => "controller_you_want_as_a_default"

5) Générer une application CRUD
./script/generate scaffold Demo name:string surname:string

ou bien générer le modèle et le contrôleur et venir mettre dans le fichier contrôleur :
scaffold : nom_classe

6) Gérer les tables par Rake
rake db:migrate
rake db:reset (suppression)

7 ) Tester la sortie HTML et XML
(a tester)
respond_to
format.html
format.xml
end

8 ) Le rendu
Trois niveaux : Layout , Template , Partial
Layout (views/layout defaut application.rhtml)
Template (views//.rhtml)
Partial (views//_.rhtml

9) Lien entre l'action et le rendu
Le lien entre l'action et le rendu se fait par la clause render_action

10) Les helpers
Ils sont dans le repertoire helpers/_helper.rb (defaut application_helper.rb)

Recherche sur le cheesecake chez amandine

Je continue mes recherches sur la confection du cheesecake :
J'ai essayé la préparation suivante pour la pâte :

120 g de biscuit spéculos
120 g de biscuit thé brun
120 g de beurre

Mixer tout les ingrédients, étaler la préparation dans le moule , mettre au frigo 10 minutes puis passer au four 10 minutes (th 180).
Verser la préparation au fromage blanc et faire cuire.

Conclusions :

Je n'ai pas eu assez de pâte. (prévoir 270 g de biscuit)
Je pense augmenter la proportion de spéculos (meilleur gout).
Mireille et amandine m'ont offert un moule à charnière pour pouvoir démouler le gâteau.

La photo :








DSCN0659



La photo a été prise chez sébastien et amandine :
Voici des toilettes RATP :


DSCN0650


Son clavier:DSCN0654

Article ajouté le 2008-09-18 , consulté 1 fois

lundi 15 septembre 2008

Il y a plus malheureux que nous

Parfois j'ai tendance à m'apitoyer sur mon travail, alors je regarde cette photos et je me dis que vraiment je n'ai pas à me plaindre.
(source digg)

jeudi 11 septembre 2008

Google face aux architectes astronautes

On a assisté avec la sortie de google Chrome à un gros buzz pour pas grand chose .

Google n'a jamais caché son désir de contrôler toute la chaine utilisateur <==> ressources web.
Pour goolge le réseau EST la machine, le réseau n'est pas une application. C'est dans cette optique que google lance un navigateur.
Ce navigateur est remarquable sur deux points :
L'exécution dans des fenêtres indépendantes des rendus des pages web. Cela laisse présager un environnement multitâche.
La possibilité de consulter ses documents en ligne et hors ligne pour ensuite les resynchroniser.

C'est sur ce dernier point que que Microsoft se sent le plus attaqué , car les prochains systèmes d'exploitation de la firme de Seattle mettront en l'accent sur cette fonctionnalité.
Et c'est là qu'intervient le gourou Joel Spolsky du site http://www.joelonsoftware.com . Ce blog est l'un des plus intéressant qui soit . Son auteur est un ancien 'superprogrammeur' de chez Microsoft et a une vision clairvoyante sur ce qui agite le microcosme du web.

Ce qui fait la force des gens de Google c'est qu'ils n'écoutent pas forcement les architectes astronautes. Un architecte astronaute c'est quelqu'un qui a force de s'élever dans l'abstraction finis par atteindre des couches ou l'oxygène est trop rare pour respirer. Ces architectes ne raisonnent qu'en terme de 'pattern' (modèle) . Si on veut se rendre d'un point à un autre , ces architectes vont pensez en 'pattrern' et vont construire un modèle en 10 couches ,alors que vous ne désirez que vous rendre d'un point à un autre. Tout ceci est illustré par l'antagonisme entre le modèle DOD Tcp/IP (4 couches) et le modèle ISO de l'OSI en 7 couches. Les quatre couches ont gagnées.

Pour le reste le nom 'chrome' fait directement référence à Firefox dont google est un gros contributeur financier.

Voici un exemple de modèle saml / sso de chez google :





Puis chez un concurrent :




Lequel est le plus clair ?

lundi 8 septembre 2008

Nouvelle technique de reverse proxy

Le reverse proxy du portail dgfip https://portail.cp.finances.gouv.fr ou https://portail.dgfip.finances.gouv.fr (pour le ranking) est basé sur un serveur https qui analyse la suite de l'url
Exemple :
nom_du_serveur/foo correspond à une location 'foo' qui a ses propres regles de gestion. La présence de 'foo' dans l'url permet au serveur de choisir la bonne application cible. Toutes les applications ne travaillent pas sur une location, pour celles-ci il faut 'chrooter' l'application au niveau du serveur reverse proxy. Cette opération lourde nécessite un travail fastidieux de rééecriture dynamique des liens.
Ce processus est complété par une bonne dose de mod_rewrite pour les derniers ajustements.
Ainsi il serait plus simple d'abriter les applications derrière le reverse proxy.
Pour cela je serai tenté d'essayer la solution suivante:
Une page menu des applications qui au lieu de proposer un lien , provoquerait la pose d'un cookie contenant le nom de l'application à activer.
Le tout serait peut être à compléter avec mod_rewrite et des tests sur le referer.
Le système ne permettrait pas d'avoir plusieurs applications ouvertes simultanément et il faudrait repasser par le menu pour ouvrir une autre application.
Il faut avoir non pas une page menu mais une application menu. Les liens sont remplacés par des boutons de formulaires qui par un POST provoquent la génération d'un cookie au nom de l'application et la sélection de celle-ci.
L'url de la page menu doit être traitée de manière particulière : elle n'appartient pas à une application. Je ne suis pas certain qu'apache soir capable de travailler de cette façon (sans véritable location) .

dimanche 7 septembre 2008

Les dignes fils d'Apache

Bien apache soit un des projets historiques de serveur WEB, il se trouve concurrencé par deux nouveaux projets: Lighttpd et nginx

le détails des parts de marché sont sur le site news.netcraft.com

Apache : 50 %
Microsoft : 35 %
Google : 6 %
Lighttpd :1,6 %
nginx : 1,5 %

Aprés comparaison de lighttpd et nginx , mon choix se porterai sur nginx .


Sur le wiki de nginx se trouve un tableau comparant les modules d'apache, lighttpd et nginx.
Nginx a été ecrit à l'origine pour faire du proxy ,reverse proxy et du load balancing.
Un squelette est disponible pour écrire ses propres modules en c.

mardi 2 septembre 2008

Alerte rouge

Première version du jeu 'alerte rouge' disponible gratuitement sur le site de Electronics Arts .

Pour faire du bruit autour du lancement du troisième volet de ce jeu descendant légitime de Command & Conquer , l'éditeur vous offre à télécharger le premier épisode (2 iso CD de 500 mo).

Ici alerte rouge :




Ici command and conquer


Enfin l'ancêtre de cette série : Dunes 2.

Les protocoles du web 3.0

Alors que le web 2.0 n'est pas encore bien mature , des papiers sortent sur le web 3.0 .

Voici quelques exemples de protocoles :
Le RDF(a) ou RDFS : Resource Description Framework : ce langage de descrition permet de mettre à disposition de robot des informations. C'est un système qui permet de mettre dans une seule ressource (page html) une partie destinée aux lecteurs humain , une autre destinée aux flux RSS une autre destiné aux robots d'indexation.

Le FOAF : Friend Of A Friend : ce protocole permet de decrire un réseau social basé sur les amis de mes amis .
Ical : C'est un protocole deja ancien qui standardise les échanges pour des dates ou des évènements.
Vcard : système de description de carte professionnelle.
DC: Dublin Core permet de decrire un document (auteur, titre)
RSS : désigne deux protocoles :Rich Site Summary (v1) puis Really Simple Syndication (v2)
Permet la syndication des sites (blog) sous la forme de nouvelles , on parle de format ATOM.
OWL : web ontologie Language
SPARQL : Langage de requête pour le RDF.

Trouvé sur le blog de fred cavazza www.fredcavazza.net

Visite au CNAM

Hier j'étais jury au CNAM , où denis présentait le fruit de 6 ans d'étude.
Les jardins du CNAM



La buvette au fond


Le jury :






A l'issu d'une brillante présentation , denis a reçu le titre d'ingénieur avec mention BIEN.