vendredi 31 décembre 2010

activeRecord sans Rails et métaprogrammation

Dans un post précédant, je détaillais le chargement d'une base NoSQL à partir d'une base de données relationnelle en mentionnant l'usage d'Active record sans Rails.
ActiveRecord et maintenant ActiveRelation sont des ORM qui s'utilisent indépendamment des autres composants de Rails.
Il suffit pour cela d'instancier un objet Base en lui fournissant les éléments de connexion à la base de données.


(clic pour agrandir)




J'utilise par la suite ActiveRecord en métaprogrammation :

def _create_class(tclass)

uftclass = "Tempo_" + tclass

eval "

class #{uftclass} < ActiveRecord::Base

set_table_name \"#{tclass}\"

end

"

fields= eval "#{uftclass}.column_names"



end



Ainsi je crée des classes à la volée qui héritent d'Activerecord. Cette opération dynamique se fait par une clause 'eval'.

L'instanciation se fait plus loin dans le code par là aussi un éval:


(clic pour agrandir)

Les photos trop bavardes


Une photo sur Internet ou qui circule de portable en portable c'est tout d'abord une image (ce que nous voyons) mais aussi des informations cachées. Ces informations sont stockées dans le fichier de la photo, mais ne sont pas interprétées comme de l'information visuelle par l'afficheur.
On appelle ca des méta-données (de la données sur la donnée). Ces métadonnées servent généralement à conserver avec l'image certaines informations liées à cette image. Par exemple :
La date de prise de vue , l'heure, l'appareil numérique ou encore l'ouverture de l'objectif. Il existe un standard pour ces informations le EXIF.

Le danger actuel vient de l'utilisation d'un smartphone comme appareil photo. Pourquoi ? .
Simplement un smartphone est doté d'un GPS et il accès à plein d'information sur vous.
La fonction GPS permet de géolocaliser la photographie: à 10 metres près il est possible de savoir où a été prise la photo. Le smartphone a accès à la carte sim et à des informations générales. Il très possible que la photo contienne le numéro de série de l'appareil et pourquoi pas le numéro du téléphone. Aussi, il faut respecter quelques précautions, la première étant de ne jamais utiliser des applications modifiées (tierces) pour prendre des photos. Tester aussi le contenu de vos photo avec un plugin firefox https://addons.mozilla.org/fr/firefox/addon/3905/.

Un clic droit sur l'image ouvrira une fenêtre d'information :




Dessous un exemple tiré d'un fait réel.
............
The original photo the woman uploaded was taken on an Apple iPhone 3GS and it encoded a series of EXIF data (extended data such as the date and time), as well as her GPS (global positioning system) co-ordinates.

Extracting the exact latitude and longitude of her location took around three minutes so, by 3:50 the 4chan community, feeling robbed of a free peep show had used Google Maps to convert the GPS data to photos of her house from Google Street View, which provided her address in a charming sea side town in Britain.

Using public computer databases they determined which school she attended and began searching Facebook to find a photo which matched the original. With ~350 students in the school, ~175 female it took less than 5 minutes to visually identify her from the photos.

By 4:00 pm, they’d order hundreds of pizzas to her home.

By 4:05, they’d called her mom.

By 4:15, they’d emailed photo edits of her to an email account purported to be used by her father at work.

By 4:30, they’d gotten bored and moved onto another thread and another person.

..........

jeudi 30 décembre 2010

2010 année du NoSQL


Dans cette présentation , Kevin Weil responsable du secteur analyse des données chez twitter (lien ici ) détaille comment l'architecture de twitter a évolué pour faire face à l'accroissement des volumes.

Le conférencier use d'un argument massue : Le volume quotidien de donnée sur twitter est de 12 TB. Sachant qu'un disque ne peut traiter que 80 MB/s , il faudrait 41 Heures pour traiter les données d'un journée.
Conclusion : il a été nécessaire de paralléliser les traitements et le stockage des données.
Aussi twitter utilise l'infrastructure distribuée HADOOP d'Apache avec tous les produits dérivés dont le langage 'PIG'.
PIG permet de réduire considérablement la quantité de code à écrire et le temps d'exécution

Ce qui est nouveau dans la démarche , c'est l'hétérogénéité des solutions employées.
Une entreprise cherche normalement à réduire au maximum le nombre de composant de son SI (un seul type de base données, un seul framework etc) . Twitter ou facebook utilisent une kyrielle de produits souvent concurrents (Ruby on Rails , scala , cassandra, HBase, FLockDB).
Alors pourquoi ces choix ? Et comment les assumer au sein de l'entreprise ?.

mercredi 29 décembre 2010

Cadeaux de Noel : pourquoi m'as tu offert ca ?

C'est parfois la question que l'on se pose. Il existe un site où vous pouvez poster la photo de l'objet et son contexte: lien ici : http://whydidyoubuymethat.com/

Mon podium est le suivant :
1) La photo de david Hasselhoff



2) La boite de mouchoir décorée


3) Le coussin



Pour ma part, j'ai recu un superbe cadeau cette année: un livre sur 'la route 66' et ca, c'était une sacrée bonne idée.



Lien ici: http://www.lerepairedesmotards.com/actualites/2010/actu_101029-route-66-livre-route-mythique.php

mardi 28 décembre 2010

idée cadeau: des armes en lego


Voici une idée de cadeau : un livre qui détaille la construction de 5 armes en Lego.
Chaque modèle fonctionne vraiment et grace à des élastiques, vous pouvez VRAIMENT tirer des projectiles de briques Lego ou des élastiques.

Une bonne alternative au paint-ball

Lien ici : http://www.nostarch.com/legoguns.htm

mardi 14 décembre 2010

Justin Bieber est il un geek ? Test du rubik's cube

Justin Bieber est un jeune chanteur canadien qui provoque chez les jeunes une forte hystérie.

Justin Bieber et lady GAGA sont les deux icônes 'hype' du moment. (ici le lien vers wikipédia)
Conscient du caractère irréductible de la domination du monde par les geeks, Justin Bieber s'est dévoilé: c'est un geek. Aussi, ce jeune homme a lancer deux signaux forts:

1) Il est capable de résoudre un rubik's cube dans des très bons délais.
Ici on peut voir la vidéo :


2) Il s'est vengé d'une personne qui avait tenté de pirater le compte twitter d'un de ses potes.
Justin Bieber demandé à ses fans sur twitter de lui envoyer des SMS.
Il a simplement donner le numéro de portable du pirate à la place du sien.

Résultat : le portable a été bombardé. (Justin Bieber est à la tête d'une armée de 4,4 millions de followers)

Respect pour le gamin.

En revanche , cela déclenche une série d'interrogation. Il ne rentre pas dans le cadre normal de la définition des geeks.




Plusieurs hypothèses:
1) C'est un cyborg
2) C'est un mutant
3) C'est un alien

Il est peut être issu d'un croisement entre un geek profond et un top model ? C'est un hybride.

Le papa:



La maman

dimanche 12 décembre 2010

Pourquoi la Trabant était la meilleure voiture au monde ?

A cause du soin apporté aux finitions:

dimanche 5 décembre 2010

django, rail3 comment démarrer



On va s'amuser avec les deux frameworks champions: django / python d'un coté et Rails3 / Ruby de l'autre.

Installation de django.

Avec django, il est est plus prudent d'utiliser la dernière version du logiciel. django se présente sous la forme d'une archive standard. Il s'installe en tapant dans le répertoire de l'archive:
python ./setup.py install

Installation de Rails3


L'utilisation de rvm est hautement recommandée.
La commande classique d'installation d'un gem:
rvm gem install rails
(j'ai utilisé la version 1.9.2 de Ruby sous rvm)
L'avantage de Rails est qu'il utilise le gem 'bundler' . Au démarrage d'une application, le fichier Gemfile listant les dépendances est lu et les gems manquants sont installés.



Création d'une application avec django

Django manipule la notion de projet et d'application. Un projet regroupe plusieurs applications.

La création du projet se fait par la commande :

/usr/local/bin/django-admin.py startproject djgolfare


Cette commande crée un répertoire au nom du projet. Ce répertoire contient un programme manage.py qui permet d'ajouter des applications par:

python ./manage.py startapp tableboard

L'arborescence sera de la forme :




Création d'une application avec Rails3

La commande à passer est :
rails new r3golfare

Une série de fichier et de répertoire est générée:



Configuration de la base de donnée pour django

Toute la configuration est contenue dans le fichier settings.py. C'est donc de la syntaxe python.


12 DATABASES = {
13 'default': {
14 'ENGINE': 'sqlite3', # Add 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'.
15 'NAME': '/usr/local/djgolfare/essai', # Or path to database file if using sqlite3.
16 'USER': '', # Not used with sqlite3.
17 'PASSWORD': '', # Not used with sqlite3.
18 'HOST': '', # Set to empty string for localhost. Not used with sqlite3.
19 'PORT': '', # Set to empty string for default. Not used with sqlite3.
20 }
21 }
22

Configuration de la base de donnée pour Rails


Un fichier database.yml se trouve dans le répertoire 'config'
Rails utilise le format YAML pour ces fichiers de configuration


 1 # SQLite version 3.x
2 # gem install sqlite3-ruby (not necessary on OS X Leopard)
3 development:
4 adapter: sqlite3
5 database: db/development.sqlite3
6 pool: 5
7 timeout: 5000
8
9 # Warning: The database defined as "test" will be erased and
10 # re-generated from your development database when you run "rake".
11 # Do not set this db to the same as development or production.
12 test:
13 adapter: sqlite3
14 database: db/test.sqlite3
15 pool: 5
16 timeout: 5000
17
18 production:
19 adapter: sqlite3
20 database: db/production.sqlite3
21 pool: 5
22 timeout: 5000


La base est déclinée en trois instance, une pour chaque environnement.


Le détail du répertoire config est ici :



Lancement de l'application django

 1 >python ./manage.py syncdb
2 No fixtures found.
3 >python ./manage.py runserver
4 Validating models...
5 0 errors found
6
7 Django version 1.2.3, using settings 'djgolfare.settings'
8 Development server is running at http://127.0.0.1:8000/
9 Quit the server with CONTROL-C.
10


Lancement d'un application Rails3


32 root@eric-1001PX:/usr/local/r3golfare# rails s
33 => Booting WEBrick
34 => Rails 3.0.3 application starting in development on http://0.0.0.0:3000
35 => Call with -d to detach
36 => Ctrl-C to shutdown server
37 [2010-12-04 17:21:17] INFO WEBrick 1.3.1
38 [2010-12-04 17:21:17] INFO ruby 1.8.7 (2010-08-16) [i686-linux]
39 [2010-12-04 17:21:22] INFO WEBrick::HTTPServer#start: pid=2639 port=3000
40

Dans un autre post, je détaillerai la mise en place d'un patron CRUD dans ces deux frameworks.

dimanche 21 novembre 2010

La transition entre les SGBDR et les bases NoSQL



Le contenu des bases NoSQL (Not Only SQL ) n'est pas issu d'une génération spontanée. Une grande partie des informations provient des base de données 'traditionnelles'. Comment passer d'un modèle à un autre ?. Des interfaces vont devoir être développées, voici ma contribution : le module nosql.rb disponible sur Lemon-labs (github).

Ce module rassemble des informations d'une base de données (Postgresql , oracle , mysql etc ) et injecte les données dans une base NoSQL (ici couchdb).

Configuration

Le programme utilise un fichier de syntaxe YaML qui va décrire les sources, les filtres à utiliser et la cible.

Datasource:
adapter: sqlite3
database: db/development.sqlite3
poll: 5
timeout : 5000
Tables:
table_fact: projets
primarykey: id
table_dimension:
filieres:
primarykey: id
foreignkey: filiere_id
technos:
primarykey: id
foreignkey: techno_id
filters:
attributes: id
regexp: create,_id,update
append:
attribute: type,ROW
options:
NoNil: 1
target:
# output: 1
couchdb: http://localhost:5984/projets
Avec les paragraphes suivants:
  • Datasource : c'est l'accès à la base de données relationnelle. Sa syntaxe est celle ActiveRecord de Rails.
  • Table : la première partie décrit la table principale (ou table de fait) . La suivante liste toutes les tables de détails (dimension) et les champs utilisés pour les liens.
  • Filter: le programme constitue un tableau associatif pour la ligne à créer. Les filtres servent à supprimer des champs (exemple : les champs des clés primaires ou étrangères)
  • Append: Cet option ajoute des attributs fixes (exemple : type de ligne)
  • Options : fixe les règles de gestion des champs vides.
  • Target : précise la base NoSQL à charger.

Le programme va récupérer les informations sur les tables, les champs et les liens entre les tables.
Ligne par ligne, le module va entièrement dénormaliser la base pour ensuite l'injecter dans une base NoSQL.


API REST
Le module nosql.rb est associé avec un module nosqlonweb.rb qui lui ajoute un format d'API REST.



Le menu delete_row permet de supprimer toutes les entrées d'une base NoSQL sauf les documents de restitutions.

Le lancement du module web se fait par la commande :
ruby nosqlonweb.rb . Le framework utilisé est 'sinatra'.
L'API retourne ses résultats au format JSON.

Bases supportées
L'utilisation d'active record rend le programme compatible avec la majorité des bases de données. PostgreSQL, Oracle , SQLite, Mysql etc.

Les conséquences de l'annonce d'apple d'inclure une carte SIM dans ses produits


Apple travaille pour doter ses produits (surtout l'iphone) d'une carte SIM native et scellée (non amovible et non modifiable). Cette annonce à déclenchée des gros remous pas seulement dans le monde de la téléphonie. Actuellement un téléphone mobile c'est un portable et un carte SIM délivrée par un opérateur (SFR, Orange etc.) . Cette carte SIM contient deux types d'information: un numéro d'identification international unique (IMSI) et des informations de chiffrement.
Les premiers caractères d IMSI correspondent à l'identifiant de l'opérateur (comme une adresse MAC) .
Quand vous vous rendez à l'étranger:
Votre portable (SFR) se connecte à un relais (VODAFONE) et présente le IMSI , L'opérateur VODAFONE interroge un centre SFR pour savoir si vous avez l'autorisation de SFR d'utiliser votre portable à l'étranger. Si c'est le cas des accords de réciprocité existants entre les opérateurs font que vous pouvez utiliser les réseaux des autres opérateurs à l'étranger sans aucunes formalités.

Que veut faire APPLE :

Apple veux être référencé comme un opérateur téléphonique et que l'APPLE STORE serve d'intermédiaire entre vous et les opérateurs locaux.
Ainsi,il vous sera possible de choisir par le biais de l'APPLE STORE une formule de téléphone (à la journée, semaine , année etc.). Votre mobile sera considéré comme un mobile 'etranger'.

D'autant APPLE n'est pas obligé d'être un vrai opérateur. La firme peut acheter un ilot du pacifique et y mettre une antenne relais et ainsi accéder au statut d'opérateur et bénéficier des accords de réciprocités.

On comprend que cela risque de bouleverser le marché de la téléphonie. D'autant que la carte SIM intégrée permettrait d'être utilisée dans le cadre d'un réseau WIFI ou de mobile à mobile (M2M) et toujours en passant par l'APPLE STORE....
Les opérateurs traditionnels seront relégués à de simples tuyaux.

La stratégie de APPLE passe par le tiroir caisse de l'APPLE Store
Pour Google , l'objectif est plus simple: indexer du contenu et vendre des mots clés aux enchères.
Cela implique l'utilisation de leur OS android sur les mobiles, de la géolocalisation et de la segmentation des utilisateurs. Google travaille surement sur l'indexation des flux vocaux (conversation téléphonique).

jeudi 18 novembre 2010

Le web au bout des doigts:htty




Pour faire du web en ligne de commande il y a le client vintage 'lynx' , la petite commande 'wget'. Le produit le plus puissant du moment est 'curl' qui est devenu le client incontournable des API REST. Il existe maintenant un produit hybride 'htty'. Ce programme permet de faire du web en ligne de commande de manière interactive. Il fonctionne de la même manière qu'un telnet :

ex :

root@eric-1001PX:~# htty google.fr
*** Welcome to htty , the HTTP TTY. Heck To The Yeah!
http://google.fr/> cd images
http://google.fr/images> get
*** Type fol[low] to follow the 'Location' header received in the response
301 Moved Permanently -- 8 headers -- 224-character body
http://google.fr/images> body

301 Moved

301 Moved


The document has moved
here.

http://google.fr/images>



htty reconnait les commandes : cd , get body
Il permet d'examiner les entetes, les réponses, les cookies etc.





En cas d'erreur au lancement de la commande htty :
'require no such file to load -- readline (LoadError)'


faire

cd //ext/readline
2 ruby extconf.rb
3 make
4 sudo make install

jeudi 4 novembre 2010

Le grand retour du 33 tours


Je me suis rendu hier dans une FNAC et à mon grand étonnement, j'ai constaté un agrandissement important du rayon des disques vinyles 33 tours. Tous les week-end, des brocantes spécialisées sur ce thème, offrent aux nostalgiques de quoi assouvir leur passion.
(a signaler : Parc Brassens (15eme) jeudi 11/11 :5ème Marché du disque de collection)

C'est vraiment un phénomène étrange. Alors pourquoi ce renouveau ?

Pour l'objet en tant que tel :
  • Une pochette de 33 tours offre une surface et support agréable à opposer à la taille d'un CD.
  • Un disque vinyle doit se manipuler avec précaution et inspire le respect.
  • Il est facile d'établir un rapport direct entre le disque et la musique qu'il embarque. On 'voit ' la musique, l'avancement du bras de lecture sur le sillon.

Sur le mode d'écoute.
Il y a tout un rituel pour écouter un disque, il faut être patient, pas moyen de zapper facilement d'un morceau à l'autre.

ET pour les jeunes: les DJ sont restés accrochés à leurs bonnes vieilles platines , vive le scratching, geste technique sans aucune signification sur un lecteur de CD.

Les 33 tours qui sont toujours édités représentent des valeurs "sures", le ménage a été fait, il ne reste que les piliers de la musique.

Alors tous à vos platines:



dimanche 31 octobre 2010

Comment créer des vues dans couchdb

Chaque base de données de couchdb propose un répertoire '_design' qui hébergera les vues et les listes liées à votre base.
Les vues sont destinées à restituer les données sans formatage. Les 'shows' et les 'lists' mettent en forme les données. Le 'show' ne s'applique qu'a une entrée à l'inverse de la 'list' qui porte sur un groupe de données.

Concrètement le source des vues est un document JSON. Il faut a chaque fois, récupérer le document source, le modifier et le recharger sur couchdb.



{"_id":"_design/tablefait","_rev":"12-bf5c8cb0de5d7c352af03cb8ea45e8b6",
"language":"javascript",
"views":{
"cam-an-mois":{"map":"function(doc)
{if (doc.TYPE ==\"RAW\") {emit ([doc.campagne,doc.annee,doc.mois], doc); } }"}},
"lists":
{"indexml":"function (head, req)
{ var row;
start({ \"headers\":{\"Content-Type\" : \"application/xml\" }
});
send(\"<entries>\");
while(row = getRow())
{
var xml= new XML (\"<entry/>\");
xml.campagne=row.value.campagne; xml.annee=row.value.annee;
xml.mois=row.value.mois; send(xml);
}
send(\"</entries>\");
}"
}
}



Ici 'tablefait' est le nom du groupe de restitution, 'cam-an-mois' est le nom de la vue qui va servir à restituer les entrées suivant des clés d'index. Enfin 'indexml' est la fonction javascript à appliquer pour formater les résultats.





Utilisation d'une vue sans formatage particulier :
Par un navigateur : http.... 5984/db/_design/tablefait/_view/cam-an-mois?[2010,2010,09]


Avec le formatage XML

Par un navigateur : http.... 5984/db/_design/tablefait/_list/indexml/cam-an-mois?[2010,2010,09]


Attention la construction de l'url est fonction de la version de couchDB.


Les difficultés d'écriture d'une fonction de formatage sont les suivantes:

  • Le javascript de la fonction de formatage sera stocké dans une chaine de caractère. Les quotes sont à protéger par des '\'.
  • A chaque mise au point, le numéro de révision sera à ajuster.

Pour gérer ces problèmes plusieurs solutions sont possibles et seront présentées prochainement.

samedi 30 octobre 2010

Pour aller plus loin avec couchdb: la compilation

J'avais fait quelques ( posts sur le sujet) . Très vite, la manipulation de couchdb nécessite des bouts de javascript et du JSON. Je veux par exemple produire des données sous forme XML, ou proposer des vues avec des mises en page. Pour cela il faudra modifier les listes ou les vues dans couchdb.

La première précaution à prendre est de travailler avec la dernière version de couchdB. La gestion des listes et des vues a évolué d'une version à l'autre.
Pour installer une version récente de couchdb , il faudra probablement mettre à jour votre version de Erlang.


Le lancement de la commande ./configure dans l'archive de couchdb doit produire les erreurs suivantes:
La compilation de couchdb va chercher à résoudre les dépendances dont celle ci :
Is the Mozilla SpiderMonkey library installed?

spidermonkey est le moteur javascript de Firefox. Son installation complète se teste par la commande 'js' (librairie et l'interpréteur) .
Son installation se fait par:
apt-get install libmozjs-dev
Puis vient le tour de la librairie 'international character'
apt-get install libicu-dev

Enfin l'utilitaire 'curl' : c'est avec lui que se fait les premiers essais avec couchdb

apt-get install libcurl4-openssl-dev

Tout ca pour arriver au message :
configure: error: The installed Erlang version is less than 5.6.5 (R12B05).

Vous allez devoir vous payer une petite compilation du langage Erlang.

Rien de bien compliqué , juste un configure , make , make install dans le repertoire otp_src_Rnn

Puis revenir à la compilation de couchdb en précisant :
./configure --with-erlang=/usr/local/bin

Ok tout est bon le make et make install terminent l'opération. Le répertoire /usr/local/bin doit contenir au minimum erl et couchdb.





jeudi 21 octobre 2010

Ceci est un post sur la recursion dans un post sur la recursion


On distingue deux formes de récursion : La recursion directe ou indirecte.

Dans la récursion directe (exemple en ruby) la fonction s'appelle directement.

def facdir(n)
return 1 if n==1
return (n * facdir(n-1))
end


La fonction fac s'appelle en se transmettant le paremetre n-1

Dans la méthode indirecte , la fonction s'appelle aussi , mais elle va se transmettre son contexte
en plus de son parametre normal.
Pour une fonction simple , le contexte sera limité à une variable destinée à accueillir le résultat.


Exemple :


def facind_r(n,prod)
return prod if n==1
return facind_r(n-1,n*prod)
end


La variable 'prod' est le 'contexte'.

L'appel de la fonction se fera par :

def facind(n)
facind_r(n,1)
end



La méthode indirecte est meilleure que la méthode directe.
A l'appel d'une itération le système n'a pas besoin de mettre
dans la pile l'appel de la fonction CAR AUCUNE opération ne sera à réaliser à son retour.







En Haskell :


module Main where

facdir :: Int -> Int
facdir 1 = 1
facdir n = n * facdir(n-1)


facind :: Int ->Int
facind n = facind_r (n,1)

facind_r :: (Int,Int) -> Int
facind_r (1,prod) = prod
facind_r (n,prod) = facind_r( n-1, n* prod )




En Erlang:


-module (fac2).
- export([facdir/1,facind/1]).

facdir(1) -> 1;
facdir(N) -> N * facdir(N-1).

facind(N) -> facind_r(N,1).
facind_r(1,Prod) -> Prod;
facind_r(N,Prod) -> facind_r(N-1,N*Prod).


dimanche 10 octobre 2010

Change the equation : quand une goutte fait deborder le vase

Sur Arte le samedi : la série breaking bad : une des meilleures du moment.

Cette série est aux antipodes de big bang theory et les deux sont excellentes



samedi 9 octobre 2010

Après java ? Lava !


Alors que java devrait normalement s'intégrer dans les nuages (cloud) , c'est l'inverse qui se passe : des nuages sombres penetrent dans les cieux de Java.

La grand messe JavaOne qui est d'habitude l'occasion d'annoncer des nouvelles promesses technologies et des nouveaux Everest à gravir, etait placée sous le signe de la morosité cette année. RCLE a un peu foiré sur cet évènement. A tel point que les accros de java se posent des questions. Avec comme illustration le post suivant :
Is it time to fork Java? (il est temps de créer une nouvelle branche java)

L'auteur propose un nom 'lava' (la lave). Il a assité à la javaOne et il reparti avec le sentiment que dans un avenir porche , RCLE va faire en sorte d'avoir un JDK basique gratuit mais limité , et un JAVA/JDK optimisé destiné aux entreprises ou aux fabriquants de mobile. Cette version serait payante. Les menaces de développement d'un JDK et d'un java entièrement libre de droit , portés par une fondation (comme mozilla) sont les moyens les plus surs d'infléchir la tendance.

Toute cette agitation a fait dire à un des créateurs de java (James Gosling ) :The shit finally hits the fan.... (la merde a atteint le ventilateur) lire ici. Avec en prime des motifs pour des t-shirts


Le débat se poursuit sur des groupes de discussion google... http://groups.google.com/group/javaposse/browse_thread/thread/21b313a55ca4511e#
et sur http://sacha.labourey.com/2010/10/04/time-to-fork-java-si-vis-pacem-para-bellum/ (Si tu veux la paix prépare la guerre)

mercredi 6 octobre 2010

postgreSQL : de plus en plus fort

La CNAF a terminé ses migrations de base de données vers du Postgresql sur linux. Cela représente 168 bases pour 4 To de données. L'architecture répond à 1 milliard de transaction SQL / jour. Cette opération vient à la suite de celle de Méteo France qui possède des bases Postgresql de près de 3,5 To.

Pendant ce temps Oracle continue sa diversification et provoque des vagues dans toutes le communautés héritées de Sun , jugez plutôt:
* Mysql : le responsable du projet commence à forker (créer une nouvelle branche) vers une version libre du moteur de Mysql : Maria.
* Openoffice: La communauté a pris ses distances en créant une fondation : Libreoffice
* Java : quel sera le Java de demain ? Oracle se veut rassurant mais sans plus. Alors qu'il y avait qu'un Java, on pourrait voir émerger plusieurs déclinaisons de java avec leur propre machine virtuelle.
* Le socle Linux: oracle lance son socle propriétaire Linux
* Abandon du projet opensolaris


A signaler : le numero d'octobre 2010 (131) de linux magazine détaille la mise en place de la réplication Postgresql.

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.