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.