jeudi 26 juin 2014

Retour sur Hackathon impots.gouv.fr

Il y avait du monde pour répondre à l'appel de la DGFiP pour imaginer le futur portail des impôts.


La team en pleine action. Les idées ne manquaient pas:


Notre proposition: une plate-forme de distribution:

Coté architecture , il ne faut pas hésiter à se faire plaisir quand c'est openbar:



Nous nous sommes amusé avec: 
parse.com : un frontal REST à une base NoSQL (pour stocker les informations de la timeline)



Et kafka 



Un petit tour sur bitbucket

Avec bien sur une dose d'angularJS



Un peu de D3 JS  (a essayer dimple.js plus tard )





Je me suis fait des nouveaux amis:






































j'ai visité un atelier d'impression 3D:





Et le codage pendant ce temps ? 


Heureusement les gars d'altic ont assurés.


Le graphiste de wcie  etait le top du top:


Peut-être bientôt sur vos tablettes:
image wcie
Ce que reste à faire: passer du prototype mode puzzle à un vrai projet qui fonctionne.





samedi 21 juin 2014

Opérations avancées avec MongoDB

Dans une video, j'avais présenté une introduction à MongoDB.

Pour faire une suite voici quelques manipulations avec le client mongo ou  l'API Ruby.



Pour commencer: 

Avec le client mongo :
voir toutes les bases : shows dbs 
voir toutes les collections d'une base: show collections

Pour les recherches :


Rechercher à l'aide d'une expression régulière :ATTENTION à réserver que pour les champs 'string'
Toutes les stations de velib dont l'adresse contient le mot 'filles' (ex filles du calvaire )
db.stations.find({address :/.+filles.+/i}).count()

ou en version moins compacte :
db.stations.find({address : $regex :{/.+filles.+/i}}).count()

Pour inverser la sélection : $regex :{/(?!.+filles.+)/i}

Avec l'API Ruby:
rech = @stations.find({:address => /#{Regexp.quote(arr)}/}).each { |p| ...


Rechercher les entrées avec qui n'ont pas un champs précis:
db.stations.find({rem: {$exists : false}})

ou 

db.stations.find({rem: null})  # cette forme ne fonctionne pas si un champs contient la valeur null

Avec l'API Ruby:

rech = @stations.find({:arrondissement => nil})....

Afficher que certain champs en sortie:

db.stations.find({arrondissement: 75001},{'state.total_slots' : 1})

Avec Ruby : utiliser le symbole :fields :


@pgm = @db['jcl'].find({'source' => {'$exists' => true}},{:fields => {'jcl' => 1 , 'source' => 1, '_id' => 0}} ).to_a

(le champs id ou _id est special ,c'est l'identifiant des entrées.  il est toujours retourné sauf si , la valeur de sa clé est mise  à zero.)

Une recherche avec une  condition qui porte sur  deux champs de l'entrée (utilisation de $where et this.
(API Ruby)

@alerte = @coll.find('$where'  => "this.reel['total moe'] >= this.valide['total moe']" , 'semaine' => semaine )

Enfin: un tri
db.stations.find({},{address:1}).sort({'state.total_slots' :-1 }).limit(1)
Ici , le tri combiné à   limit(1) permet de récupérer la valeur la plus grande.

Regroupement d'entrée: 


  • Le plus simple est l'opérateur distinct:

db.stations.distinct('arrondissement')

distinct retourne un array (tableau) , aussi pour connaitre le nombre d élément:
db.stations.distinct('arrondissement').length  



  • L'operateur group:


Un autre manière de déterminer le maxima d'une série

@arr = @coll.group( :initial => {cmax:0} ,:reduce =>  "function(obj,prev) { if(prev.cmax < obj.semaine) prev.cmax = obj.semaine; }" )

un autre exemple avec le client mongo
db.stations.group({initial : {cmax : 0 } ,reduce : function(obj,prev) { if (obj.state.total_slots > prev.cmax) prev.cmax = obj.state.total_slots }})

[ { "cmax" : 72 } ]

Enfin un exemple de regroupement avec cumul intermédiaire et condition :

esi  =@coll.group(:key => :esi ,
                       :reduce => "function(obj,res) {res.pr.push({projet :obj['projet'],v: obj['valide']          ['moed'], r:obj['reel']['moed']  });
                                    res.valideESI += obj['valide']['moed'] ;  
                                    res.reelESI += obj['reel']['moed'] ; }",
                        :initial => {  :pr =>  [],
                                       :valideESI => 0,
                                       :reelESI   => 0 
                         },
                       :cond => {:semaine => max})


vendredi 20 juin 2014

Les vues avec angularjs

Dans cette video et dans les slides , une présentation de la gestion des vues dans angularjs.
C'est la technique de base pour réaliser des SPA (application d'une seule page)


Pour cela , il faut récupérer l'extension  angular-route sur le site d'angularJS.

Le code est simple:

Une video est associée à la présentation (disponible ici)


Le serveur web est porté par Sinatra:


Quelques lectures:



samedi 14 juin 2014

Suite et fin de la vidéo de présentation d'angularJS

Je termine ma présentation d'AngularJS par une application minimaliste.


Au passage je fais une petite démonstration de l'IDE  Brackets.

Pour bien commencer : 2 livres gratuits consacrés à AngularJS


Les slides de support de la video sont :




La video est sur youtube: lien ici



lundi 9 juin 2014

Une introduction à angularJS et aux Single Page Application

J'étais parti pour faire une video sur AngularJS mais j'ai éprouvé la nécessité de remettre cette technologie dans un cadre plus général de développement des applications.

J'expose le système courant du templating coté serveur et coté client.
Templates coté client 

Avec ici la synthèse:


Mais le plus important est de replacer le phénomene des SPA: Single Page Application dans le contexte. REST , MVVM (angularJS ) , SPA et NoSQL sont autant des pièces d'un même puzzle.

Pourquoi des applications de ce type:

  • Pour des raisons Economiques: les coûts sont partagés , elles sont scalables, elles sont simples.
  • Pour la simplicité des solutions misent en oeuvre.

 Au premier abord toutes ces notions semblent très compliquées, mais en commençant doucement par des exemples simples, tout devient possible.

En conclusion: ce n'est pas un simple mouvement de mode. Ces évolutions touchent la manière de faire des applications, de conduire des projets.

Le support des slides de la video est ici:lien



Sur youtube : la video est diffusée a cette adresse.