C'est l'histoire du développeur COBOL qui a fait fortune avec les maintenances liées au passage à l'an 2000. Avec son argent, il décide de se faire cryogéniser (congeler) et de tomber dans un sommeil (presque) éternel.
Un jour quelqu'un le met au micro-onde et le réveille. Le développeur COBOL ouvre les yeux et demande: pourquoi vous me réveillez ? . L'autre lui répond: on est en l'an 9999 , on fait comment pour le COBOL ?
Cette blague est issu d'un article ici qui traite de l'avenir d'un nouveau langage appelé COBOL.
Python, Ruby, javascript, node.js, cloud ,NoSQL bref que des bonnes choses
Contacter le robot germanlinux: german.eric AT gmail.com
lundi 4 août 2014
dimanche 27 juillet 2014
Des robots pour les humains et pour les chats
Samedi 26 Juillet, c'était le NodeBots day (Journée internationale) .
Le groupe des NodeBots de Paris avait organisé un atelier à la cité des sciences de la Villette (Carrefour Numerique)
Quelques photos
----
Mais ce n'est pas la bonne manière vraiment utiliser la combinaison javascript / arduino. L'idée est de piloter en temps réel l'arduino au travers d'une interface web. La pile est donc: express, mqqt pour la partie web et johnny-five et mqqt pour la partie robot.
A tester !
Des microcontrôleurs (Arduino ?) pilotés en javascript dont Node.js
Le groupe des NodeBots de Paris avait organisé un atelier à la cité des sciences de la Villette (Carrefour Numerique)
Quelques photos
C'est ici un 'catbot' : robots pour amuser les chats
Ce robot utilise 2 servo-moteur et 1 laser.
Ici toutes les ressources nécessaires.
Les projets évoqués: cylon.js
Et son homologue en Ruby:Artoo
Ces deux projets proposent une implémentation en couche un peu à la mode MVC à destination des microcontroleurs
Nous avons parlé aussi du protocole MQQT qui permet de construire des dialogues de machine à machine. Ce protocole est basé sur le mode publish-subscribe et il est utilisé aussi pour les programmes de 'chat' (exemple facebook messenger)
Le projet mosca implemente un serveur MQQT:
Les clients existent en Javascript et en ruby.
La partie codage:
ici mon code pour piloter le robot:
-----
----
Mais ce n'est pas la bonne manière vraiment utiliser la combinaison javascript / arduino. L'idée est de piloter en temps réel l'arduino au travers d'une interface web. La pile est donc: express, mqqt pour la partie web et johnny-five et mqqt pour la partie robot.
A tester !
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:
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:
Peut-être bientôt sur vos tablettes:
Ce que reste à faire: passer du prototype mode puzzle à un vrai projet qui fonctionne.
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 |
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.
voir toutes les bases : shows dbs
voir toutes les collections d'une base: show collections
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.
db.stations.distinct('arrondissement')
distinct retourne un array (tableau) , aussi pour connaitre le nombre d élément:
db.stations.distinct('arrondissement').length
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})
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
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 } ]
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:
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
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.
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:
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.
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.
Inscription à :
Articles (Atom)






















