25/09/2016

Google Polymer Openfisca Etalab

Un petit tutoriel pour apprendre à utiliser Openfisca de la DGFIP et d'Etalab, à partir de Polymer de Google.

OpenFisca propose une Web Api permettant de calculer prestations sociales, niveau de vie, impôts...
Polymer quand à lui permet de créer de jolies interfaces mobiles ou web à partir de webcomponents.


Prérequis

Nodejs et npm (installé avec nodejs)

Installation de Polymer-cli

npm install -g polymer-cli

Création d'un dossier de travail 

mkdir my-app cd my-app

Création de l'application

polymer init

- choisissez la ligne starter-kit
- l'application polymer doit maintenant être installé, pour vérifier, vous pouvez la lancer en utilisant la commande "polyserve" et elle devrait être accessible à l'adresse http://localhost:8080

Deux dossier nous intéressent maintenant :
- "src", c'est le dossier principal de l'application
- "bower_components", c'est le dossier des éléments de Polymer (webcomponents)

Création de l'élément "openfisca-calcul"

on va se placer dans le dossier "bower_components", créer le dossier de l'élément et créer l'élément encore une fois avec "polymer init".

cd bower_components
mkdir openfisca-calcul
polymer init

et cette fois, on va choisir de créer un élément (a blank template element)

Insertion de l'élément "openfisca-calcul"

Maintenant que notre élément est créé, on peut l'insérer dans notre application.
Allez dans le dossier "src" et ouvrez le fichier "my-view1.html" avec votre éditeur préféré.

Deux étapes sont nécessaire pour insérer un élément : l'import et le positionnement.

L'import :
<link rel="import" href="../bower_components/openfisca-calcul/openfisca-calcul.html">

Le positionnement :
Ajoutez simplement une balise ouvrante fermante représentant l'élément :

<openfisca-calcul></openfisca-calcul>

Profitons en aussi pour supprimer le "<div class="card"> ... </div>" ... on le déplacera dans notre élément

Votre fichier my-view1.html devrait maintenant ressembler à ceci :


 <!--  
 @license  
 Copyright (c) 2016 The Polymer Project Authors. All rights reserved.  
 This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt  
 The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt  
 The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt  
 Code distributed by Google as part of the polymer project is also  
 subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt  
 -->  
 <link rel="import" href="../bower_components/polymer/polymer.html">  
 <link rel="import" href="shared-styles.html">  
 <link rel="import" href="../bower_components/openfisca-calcul/openfisca-calcul.html">  
 <dom-module id="my-view1">  
  <template>  
   <style include="shared-styles">  
    :host {  
     display: block;  
     padding: 10px;  
    }  
   </style>  
      <openfisca-calcul></openfisca-calcul>  
  </template>  
  <script>  
   Polymer({  
    is: 'my-view1'  
   });  
  </script>  
 </dom-module>  


Construction de l'élément "openfisca-calcul"

Avec Polymer, on favorise la réutilisation d'éléments déjà existants.
On va ici avoir besoin de trois éléments différents : 
- un "paper-button" : un bouton pour lancer le calcul,
- un "iron-ajax" qui se chargera d'effectuer la requête vers l'adresse web de l'API d'Openfisca (https://api.openfisca.fr/api/1/calculate)
- un petit "paper-spinner" pour nous indiquer que l'application est en train de traiter la requete.

L'installation de ces trois éléments se fait tout simplement : commencer par vous positionner à la racine de votre application, là où se trouve le fichier "bower.json"

bower install --save paper-button iron-ajax paper-spinner

Maintenant que ces trois éléments sont disponibles pour notre application, il ne nous reste plus qu'à les intégrer... et leur tour est joué... enfin faudra aussi taper un peu de code, on est là pour ça, quand-même...

Pour l'intégration, on opère comme avec le fichier my-view1.html.
Editez le fichier "openfisca-calcul.html" situé dans "my-app/bower_components/openfisca-calcul", et ajoutez au début les lignes suivantes :

<link rel="import" href="../iron-ajax/iron-ajax.html"> <link rel="import" href="../paper-button/paper-button.html"> <link rel="import" href="../paper-spinner/paper-spinner.html">

Ajoutez par la même occasion la ligne suivante qui nous permettra de gérer les styles : 
<link rel="import" href="../../src/shared-styles.html">


Tant qu'on est sur les styles, intégrons les en modifiant la balise <style>...< /style>  ( dans le fichier "my-app/bower_components/openfisca-calcul/openfisca-calcul.html") et en la remplaçant par :

           <style include="shared-styles">  
                :host {  
                display: block;  
                padding: 10px;  
                }  
           </style>  

Après la balise <style> ainsi modifiée, insérée l'élément concernant la requête ajax en utilisant le code suivant :

           <iron-ajax  
           id="ajaxcalculate"  
           url="https://api.openfisca.fr/api/1/calculate"  
           body="{{data2send}}"  
           method="POST"  
           handle-as="json"  
           content-type="application/json"  
           on-response="handleResponse">  
           </iron-ajax>   

Quelques explications s'imposent :

  • <iron-ajax>...</iron-ajax> : nous permet d'insérer l'élément iron-ajax qui s'occupe d'effctuer la requête.
  • id="ajaxcalculate" : un id qui nous permettra d'identifier la requete lors de l'appui sur le bouton "Calcul"
  •  url="https://api.openfisca.fr/api/1/calculate" : l'adresse url vers laquelle la requête va être envoyée
  • body="{{data2send}}" : représente les données qui vont être envoyées à l'adresse url
  • method="POST" : l'API openfisca n'accepte que le requêtes de type "POST"
  • handle-as="json" : le format dans lequel on souhaite récupérer les données
  • content-type="application/json" : le format dans lequel les données sont envoyées à l'API
  • on-response="handleResponse" : la fonction "callback" exécutée lors les résultats arrivent de l'API
Et bien voilà... on a fait le principal, ne reste plus qu'à formater les données à envoyer et traiter les données reçues...

Tant qu'on y est, profitez-en pour insérer deux <div> : un pour le bouton "calcul" et un pour le résultat :

           <div class="card">  
                <div class="circle">0</div>                 
                <paper-button raised on-tap="calcul" value="CALCUL">CALCUL <paper-spinner id="spinner" alt="Calcul en cours"></paper-spinner></paper-button>  
           </div>  
           <div class="card">  
                <div class="circle">10</div>  
                <h1>Résultat</h1>  
                <p>Revenu disponible 2015 : {{revenuDisponible}} </p>  
           </div>  


Données à envoyer et résultat

Pour les données à insérer, il faut avouer que c'est un peu compliqué de communiquer avec l'API Openfisca, mais on y arrive :
Un objet JSON (JSONObject) avec un tableau (JSONArray) nommé "scenarios" et les "variables" que l'on souhaite obtenir en sortie.
Dans le scenario, on trouve un objet "testcase" et un/des "périodes".
Dans le testcase, on défini : "familles", "foyers_fiscaux", "menages" et "individus"...
Pour simplifier ici, on va prendre l'exemple fourni par la documentation d'Openfisca.
On défini les données que l'on va envoyer : "data2send" et les données que l'on aura en résultat : "revenuDisponible"

                     data2send : {  
                          type : Object,  
                          value : {  
                               "scenarios": [  
                               {  
                                    "test_case": {  
                                         "familles": [  
                                         {  
                                              "parents": ["individu0"]  
                                         }  
                                         ],  
                                         "foyers_fiscaux": [  
                                         {  
                                              "declarants": ["individu0"]  
                                         }  
                                         ],  
                                         "individus": [  
                                         {  
                                              "date_naissance": "1980-01-01",  
                                              "id": "individu0"  
                                         }  
                                         ],  
                                         "menages": [  
                                         {  
                                              "personne_de_reference": "individu0"  
                                         }  
                                         ]  
                                    },  
                                    "period": "2015"  
                               }  
                               ],  
                               "variables": ["revdisp","nivvie_net"]  
                          }  
                     },  
                     revenuDisponible : {  
                          type : String,  
                          value : ""  
                     }       


C'est presque terminé : il reste la fonction callback lorsque l'application reçoit le résultat et le bouton pour lancer la requête :

                /**  
                     * recupere et parse la reponse du serveur  
                     */  
                     handleResponse: function(data,error){  
                          var result=data.detail.response.value;  
                          console.log("RESULTATS");  
                          console.log(result);                 
                          this.$.spinner.active=false;  
                          for (var key in result) {  
                               if (result.hasOwnProperty(key)) {  
                                    var valeur=result[key];  
                                    console.log(key+" :");  
                                    console.log(valeur);  
                               }  
                          }                 
                          // entrer ensuite dans result pour avoir les details :   
                          //     console.log(result[0].menages[0].revdisp[2015]);  
                          for (var i in result){  
                               var resultat = result[i];  
                               console.log("Revenu disponible 2015 : "+resultat.menages[0].revdisp[2015]);  
                               console.log("Niveau de vie net 2015 : "+resultat.menages[0].nivvie_net[2015]);  
                               this.revenuDisponible=resultat.menages[0].revdisp[2015];  
                          }  
                     },  


                          calcul : function(){  
                               console.log(this.data2send);  
                               this.$.spinner.active=true;  
                               this.$.ajaxcalculate.generateRequest();       
                          }  


Et voilà... le tour est joué... y'a plus qu'à cliquer sur le bouton "CALCUL"....
Allez ... si j'étais pas très clair, je vous donne le code du fichier "openfisca-calcul"... A vous d'en faire bon usage... comme par exemple un comparateur de prestations en fonction de votre situation ...



 <link rel="import" href="../polymer/polymer.html">  
 <link rel="import" href="../../src/shared-styles.html">  
 <link rel="import" href="../iron-ajax/iron-ajax.html">  
 <link rel="import" href="../paper-button/paper-button.html">  
 <link rel="import" href="../paper-spinner/paper-spinner.html">  
 <!--  
      `openfisca-calcul`  
      @demo demo/index.html   
 -->  
 <dom-module id="openfisca-calcul">  
      <template>  
           <style include="shared-styles">  
                :host {  
                display: block;  
                padding: 10px;  
                }  
           </style>  
           <iron-ajax  
           id="ajaxcalculate"  
           url="https://api.openfisca.fr/api/1/calculate"  
           body="{{data2send}}"  
           method="POST"  
           handle-as="json"  
           content-type="application/json"  
           on-response="handleResponse">  
           </iron-ajax>   
           <div class="card">  
                <div class="circle">0</div>                 
                <paper-button raised on-tap="calcul" value="CALCUL">CALCUL <paper-spinner id="spinner" alt="Calcul en cours"></paper-spinner></paper-button>  
           </div>  
           <div class="card">  
                <div class="circle">10</div>  
                <h1>Résultat</h1>  
                <p>Revenu disponible 2015 : {{revenuDisponible}} </p>  
           </div>  
      </template>  
      <script>  
           Polymer({  
                is: 'openfisca-calcul',  
                properties: {  
                     data2send : {  
                          type : Object,  
                          value : {  
                               "scenarios": [  
                               {  
                                    "test_case": {  
                                         "familles": [  
                                         {  
                                              "parents": ["individu0"]  
                                         }  
                                         ],  
                                         "foyers_fiscaux": [  
                                         {  
                                              "declarants": ["individu0"]  
                                         }  
                                         ],  
                                         "individus": [  
                                         {  
                                              "date_naissance": "1980-01-01",  
                                              "id": "individu0"  
                                         }  
                                         ],  
                                         "menages": [  
                                         {  
                                              "personne_de_reference": "individu0"  
                                         }  
                                         ]  
                                    },  
                                    "period": "2015"  
                               }  
                               ],  
                               "variables": ["revdisp","nivvie_net"]  
                          }  
                     },  
                     revenuDisponible : {  
                          type : String,  
                          value : ""  
                     }       
                },  
                /**  
                     * recupere et parse la reponse du serveur  
                     */  
                     handleResponse: function(data,error){  
                          var result=data.detail.response.value;  
                          console.log("RESULTATS");  
                          console.log(result);                 
                          this.$.spinner.active=false;  
                          for (var key in result) {  
                               if (result.hasOwnProperty(key)) {  
                                    var valeur=result[key];  
                                    console.log(key+" :");  
                                    console.log(valeur);  
                               }  
                          }                 
                          // entrer ensuite dans result pour avoir les details :   
                          //     console.log(result[0].menages[0].revdisp[2015]);  
                          for (var i in result){  
                               var resultat = result[i];  
                               console.log("Revenu disponible 2015 : "+resultat.menages[0].revdisp[2015]);  
                               console.log("Niveau de vie net 2015 : "+resultat.menages[0].nivvie_net[2015]);  
                               this.revenuDisponible=resultat.menages[0].revdisp[2015];  
                          }  
                     },  
                     /**  
                          *  
                          */  
                          calcul : function(){  
                               console.log(this.data2send);  
                               this.$.spinner.active=true;  
                               this.$.ajaxcalculate.generateRequest();       
                          }  
                     });  
                </script>  
           </dom-module>  


Le code source est téléchargeable ici https://github.com/scenaristeur

Des questions ? des erreurs ? utilisez les commentaires ci-dessous ou le forum de l'article

07/09/2016

Sparql update un Polymer element pour mettre a jour un sparql endpoint

Objectif de cet article : Créer un element Polymer pour mettre à jour un sparql endpoint (fuseki)

inspiration : https://www.youtube.com/watch?v=k1eR_3KqJms

premier test : sparql-statements (recupérer les infos RDF sur un serveur sparl / fuseki en utilisant iron-ajax)

serveur fuseki  : http://rdf-smag0.rhcloud.com/

prérequis :
installation de nodejs, yeoman

Polymer propose polymer:seed, un element modèle servant d'exemple pour la création d'elements Polymer.

Au boulot on va créer un element "sparql-update"
sous l'invite de commande dos tapez :

yo polymer:seed sparql-update

complétez avec vos infos -6> un module modèle est créé dans votre repertoire.
Pour le lancer utilisez la commande :  polyserve

Le nouvel element généré est accessible à l'adresse :
http://localhost:8080/components/sparql-update

quelques soucis parfois d'affichage, (un certain temps pour mettre à jour ? allez voir dans le fichier README.RD généré pour avoir différents liens et testez notamment celui-ci : http://localhost:8080/components/sparql-update/test/ ) , une page de tests devrait finir par s'afficher.

Ce qui nous intéresse, Thérèse , ensuite c'est le module lui-même, on utilisera deux pages :

  • la page du module :  http://localhost:8080/components/sparql-update/
  • la page de demo accessible par le bouton "DEMO" en haut à droite
Laisser le terminal ou vous avez lancez polyserve ouvert et ouvrez un autre terminal pour installer l'element "iron-ajax" avec la commande  : 
bower install --save PolymerElements/iron-ajax

et incorperez cet element dans sparql-update.html avec : <link rel="import" href="../iron-ajax/iron-ajax.html"> juste après <link rel="import" href="../polymer/polymer.html">

supprimer les elements inutiles dans le modeles : 
  • dans le fichier  sparql-update.html 
.author dans template/style
et ne garder que "properties" dans la definition js de l'element : 
il ne devrait vous rester plus que ceci : 


<link rel="import" href="../polymer/polymer.html">

<link rel="import" href="../iron-ajax/iron-ajax.html">

<!--
An element providing a solution to update sparql endpoint like Fuseki.
(https://github.com/scenaristeur/sparql-update)

Example:

    <sparql-update></sparql-update>

Example:

    <sparql-update>
      <h2>Hello sparql-update</h2>
    </sparql-update>

@demo demo/index.html
@hero hero.svg
-->

<dom-module id="sparql-update">
  <template>
    <style>
      :host {
        display: block;
        box-sizing: border-box;
      }
    </style>


  </template>

  <script>
    Polymer({
      is: 'sparql-update',

      properties: {
       
      }
    });
  </script>
</dom-module>


Nous avons maintenant un élement propre et on va pouvoir y mettre notre propre (ou sale ?) code

On incorpore maintenant notre element "iron-ajax" qui va se charger d'effectuer la requete POST vers notre serveur Fuseki :

<iron-ajax/iron-ajaxauto
url=""
handle-as="json"
on-response="{{handleResponse}}"></iron-ajax>



le mieux c'est de jeter un oeil au code




26/08/2016

Question reponse avec Polymer Firebase Collection


source https://divshot.com/blog/web-components/building-a-qa-system-with-polymer-and-firebase/
updated to polymer 1.0.0


npm install -g yo
 
npm install -g generator-polymer
 
yo polymer  

gulp serve ( a la place de grunt serve)
 
ne pas supprimer elements.html , mais lui rajouter une ligne : 
<link rel="import" href="qa-app/qa-app.html">
 


creation d'une <qa-app> dans app/elements avec ce code : 
 
 
<link rel="import" href="../../bower_components/polymer/polymer.html">
<link rel="import" href="../../bower_components/paper-styles/typography.html">

<dom-module id="qa-app">
  <template>
    <style include="shared-styles">
      :host {
        display: block;
      }

     <!-- span,
      input {
        @apply(--paper-font-body2);
  }-->
    </style>

  <!-- <h1 class="page-title" tabindex="-1">{{greeting}}</h1>
    <label for="greeting-input">Update text to change the greeting.</label>
    <!-- Listens for "input" event and sets greeting to <input>.value -->
   <!-- <input id="greeting-input" value="{{greeting::input}}"> -->
  </template>

  <script>
    (function() {
      'use strict';

      Polymer({
        is: 'qa-app',

       /* properties: {
          greeting: {
            type: String,
            value: 'Welcome!',
            notify: true
          }
        }*/
      });
    })();
  </script>
</dom-module> 
 
 
insertion dans index.html : 
  <paper-material elevation="1">
    <qa-app></qa-app>
    </paper-material> 


Au lieu de core-components (<0.8) utiliser bower install --save 
en ayant pris soin de corriger le fichier bower.json ainsi : 

{
  "name": "polymer1-qa",
  "authors": [
    "D.FAVERIS"
  ],
  "private": true,
  "dependencies": {
    "iron-elements": "PolymerElements/iron-elements#^1.0.0",
    "neon-elements": "PolymerElements/neon-elements#^1.0.0",
    "page": "visionmedia/page.js#^1.6.4",
    "paper-elements": "PolymerElements/paper-elements#^1.0.1",
    "platinum-elements": "PolymerElements/platinum-elements#^1.1.0",
    "polymer": "Polymer/polymer#^1.6.0"
  }
}

ajustez les imports ainsi : 


<link rel="import" href="../../bower_components/polymer/polymer.html">
<link rel="import" href="../../bower_components/paper-styles/typography.html">

<link rel="import" href="../../bower_components/paper-header-panel/paper-header-panel.html">
<link rel="import" href="../../bower_components/paper-toolbar/paper-toolbar.html">
<link rel="import" href="../../bower_components/iron-icons/social-icons.html">
<link rel="import" href="../../bower_components/paper-menu/paper-menu.html">
<link rel="import" href="../../bower_components/paper-dropdown-menu/paper-dropdown-menu.html">
<link rel="import" href="../../bower_components/paper-icon-button/paper-icon-button.html">
<link rel="import" href="../../bower_components/paper-menu-button/paper-menu-button.html">
<link rel="import" href="../../bower_components/paper-item/paper-item.html">

<dom-module id="qa-app">
  <template>
...


bower install --save firebase/polymerfire a la place de
bower install Polymer/firebase-element --save


Voir avec PolyUp pour upgrader un module Polymer 0.5 en Polymer 1.0



 


03/08/2016

Integration en entreprise du Bigdata, iot, ia, machine learning, robotique

L'intégration de nouvelles technologies telles que Bigdata, objets, robotique, machine learning ou intelligence artificielle dans une entreprise soulève de nombreuses questions.

Les nouvelles technologies nous attirent, donnent envie, proposent dans l'absolu de nouvelles possibilités d'optimisation, une meilleure gestion des ressources, une amélioration des conditions de travail...

Mais quelles sont les technologies dont vous avez réellement besoin ?
Quelles sont les priorités ?
L'investissement en vaut-il la chandelle ?
Et si oui, par quel bout les aborder ?

Ces nouveaux outils sont à considérer comme de nouvelles ressources que peut utiliser l'entreprise, au même titre qu'un véhicule ou qu'un employé.
De part la prise de décision que ces outils proposent, ils sont même plus proche d'un employé, que d'un véhicule ( le déploiement massif des véhicules autonomes n'étant pas encore opérationnel ;-) )

La grosse question est de déterminer le degré d'autonomie que l'on va vouloir attribuer à ces nouveaux outils...

En effet, selon les cas, on souhaitera que tel outil soit une simple aide à la manipulation, ou à la décision, soit une autonomie complète, avec entre les deux tous les degrés possibles d'autonomie...

Parfois, selon le contexte, selon les circonstances, ce degré d'autonomie devra même être modifié.

Le degré d'autonomie d'un outil dépend en grande partie du degré d'intelligence qu'il lui a été attribué, de sa capacité à obtenir des informations de son environnement ( votre entreprise ) , de sa manière de les exploiter, de sa façon de les communiquer...

Un simple capteur thermique ( iot de base ) possède sa propre intelligence, et le choix du matériel à utiliser et son l'intégration dépendront de ses capacités, ses limites...

L'intégration de systèmes plus évolués tels que le machine learning ou l'intelligence artificielle pose de nouvelles questions et se rapproche plus de l'apprentissage comme on pourrait le rencontrer lors des jeunes années d'un enfant.  Ces systèmes ont besoin d'informations au sujet de l'entreprise, selon les cas, il s'agira d'un catalogue de produits, de la structure de l'entreprise ou des compétences des autres ressources disponibles ( compétences d'un employé, disponibilité d'un véhicule... )

La majeur partie de l'intégration consiste donc à élaborer des interfaces permettant l'échange de données structurées entre les ressources, qu'elles soient humaines ( les employés ) ou issues des nouvelles technologies, en prenant bien en considération le rôle de chacun...

Par exemple, un employé de la compta n'aura pas les mêmes besoins d'informations qu'un commercial... L'un souhaitera connaître le kilométrage parcouru par un véhicule, alors que l'autre souhaitera connaître sa disponibilité...

L'intégration de ses nouveaux outils commence par une description des ressources existantes, de leurs capacités, de leur besoins, de leurs rôles, et des autres ressources qu'elles utilisent.

Le format de données RDF (principalement utilisé pour le web-semantique ou les énormes bases de connaissance médicales ) et ses extension est une approche simple, open-source, facile à mettre en oeuvre et peut constituer soit une première marche, soit un complément non negligeable dans l'intégration de ces outils.

Le développement récent de l'interface Dreamcatcher de Smag0 permet déjà d'élaborer de manière simple, collaborative, évolutive, ( et parfois même ludique) des bases de connaissance exploitables par ces nouveaux outils.

De nouvelles interfaces (mobiles, tactiles, basées sur la voix, les mouvements... ) peuvent également être développés en fonction des besoins spécifiques de vos collaborateurs de leur rôle et de leur besoins.

Pour une étude des possibilités applicables à votre entreprise en matière d'intégration et d'exploitation des nouvelles technologies n'hésitez à prendre contact avec nos spécialistes DataScientists :

Service commercial : smag0@outlook.fr
Nous suivre sur twitter, rester informé : @dfaveris
Support : 0671578914

01/08/2016

What would happen if the political and government become " Agile " ?


What would happen if the political and government become " Agile " ?

If they used DreamCatcher - Collaborative for the views of citizens on an issue or a new project?







30/07/2016

Brainstorming anonyme en temps réel

Peut-être connaissez-vous les cartes heuristiques ou carte mentale.
Peut-être pas.
Elles servent notamment pour l'expression d'idées, en posant les informations sous forme d'étoile, en fonction des notions évoquées et de leurs relations.

Problèmes des cartes heuristiques :


  1. la nature des relations est rarement explicite.
  2. il est difficile de relier des branches opposées sur la carte, même si dans la réalité les notions sont proches.

Créer une ontologie avec Dreamcatcher (JavaScript)

L'idée est de créer le graphe RDF, donc l'ontologie d'une partie de la chaîne alimentaire en utilisant l'outil DreamCatcher 

On va s'inspirer de cet extrait de la chaîne alimentaire :


Les informations qu'il faudra tout simplement saisir sont les suivantes :
Mante , mangéPar, Aigle
Criquet, mangéPar, Mante
Chenille, mangéPar, Mante
Paipillon, sameAs, Papillon
Paipillon, estMangéPar, Mante
Plante, estMangéPar, Chenille
Plante, estMangéPar, Papillon
Plante, estMangéPar, Criquet
Plante, estMangéPar, Antilope
Singe, estMangéPar, Leopard
Antilope, estMangéPar, Leopard
Antilope, estMangéPar, Lion
Fruit, estMangéPar, Singe
Fruit, estMangéPar, Lyon
Feuillage, estMangéPar, Elephant
Bouse, estMangéPar, Bousier
Elephant, produit, Bouse
Elephant, estMangéPar, Lyon
Elephant, estMangéPar, Homme
Lion, estMangéPar, Homme
Homme, estMangéPar, Lion

C'est un premier jet et vous remarquerez l'erreur de saisie au niveau des papillons... L'erreur est humaine... La collaboration permettra d'ajuster...







Le résultat de l'export peut être téléchargé ici.

Le code source du projet est téléchargeable ici.
et la documentation complète est .


DreamCatcher Autonome et Collaborative

La dernière version de la documentation de DreamCatcher est disponible .


Dreamcatcher facilite la collaboration lors de la création de graphes RDF ou cartes mentales

29/07/2016

Une politique et une administration AGILE

Que se passerait-il si la politique et les administrations devenaient "Agile" ?
S'ils utilisaient DreamCatcher-Collaborative pour connaître l'opinion des citoyens sur un problème ou un nouveau projet ?

Dreamcatcher... et la vie devint Agile...

SEO Reponse à Lexane Sirac sur sur la disparition du SEO comme on le connait aujourd'hui

Article très intéressant sur la disparition du SEO comme on le connait aujourd'hui.
petit rappel semantique : SEO = celui qui veut toujours être en première place dans les moteurs de recherche.

Un début de réponse sur son devenir pourrait , à mon avis, trouver sa source dans les notions de #littleData ( un petit bigdata représentant les informations qu'une entreprise ou un individu souhaite diffuser à son sujet ) .

Au format #rdf ou équivalent, sous forme de graphes, permettant d'interconnecter ces mini bases de données personnelles, comme le projet Dreamcatcher de Smag0, qui se veut une interface simple pour exprimer, partager ses idées, permettant de collaborer sur des sujets , maîtriser l'information selon différents points de vue, éviter redondances et malentendus...

22/07/2016

28/06/2016

Un serious game RDF/Web Semantique avec Polymer


  • Télécharger le dernier Polymer Starter Kit Light  et le decompresser dans un repertoire sur votre disque (la version Beginner suffit, et on pourra rajouter des elements au besoin)
  • se deplacer dans le repertoire app avec : cd /app, c'est là que ça se passe

Pourquoi Polymer?
-  parce que "Mobile First" et simplicité à prendre en main comparé à Meteor, MenJS, MeanIO...

un petit coup de python pour lancer l'appli et voir si ça fonctionne.



ça devrait vous donner un truc comme ça : 



Et voilà... c'est fini...
..
...
.........
.............
......................
..........................
...................................
..........................................

Enfin non, pas vraiment, mais à partir de là, c'est à vous de bosser, C'est votre imagination ou vos besoin qui vont guider vos choix...


Moi mon objectif est de créer une interface mobile sympa pour créer, partager ses idées sous forme de graphe RDF...
Faut que je vous laisse, je reprend ça demain.

06/06/2016

Notes

https://project-535455501236687403.firebaseapp.com/index.html

En 2016, il faut déjà commencer à oublier la notion de vie privée et prendre conscience que n'importe qui, qu'on ne rencontrera jamais, peut déjà tout connaître sur nous, et même parfois mieux que nous.

03/04/2016

Convertir sqlite, xls ou ods en RDF

L'un des buts du graph http://rdf-smag0.rhcloud.com/smag.html est d'interconnecter les bases de données disparates.

Une amie m'indique qu'elle est en train de monter une base de données sur les robots... intéressant, c'est exactement ce qu'il me faut pour mon projet Smag0, et la gestion des ressources, des objets connectes...
Voyons comment l’intégrer au graph RDF :
1 : qui va mettre à jour cette base ? Cette amie ? les constructeurs ? les utilisateurs ???
-> intégrer les données au serveur Fuseki, ou un lien vers la source de données mise à jour ailleurs ?
2 : la source actuelle est un fichier robot.db
 --> comment la transformer au format RDF ? on a deux tables robots et devices
--> j'avais dejà fait des tests pour transformer XLS et ODS en RDF , donc la première idée est d'extraire les deux tables en csv, de les convertir en ods, puis d'adapter l'outil que j'avais déjà utiliser pour repasser au format rdf... --> pas simple
--> autre option a étudier : sql.js https://github.com/kripken/sql.js 


outil d'extraction ODS vers RDF basé sur Processing 2 ( pas testé avec 3) avec :
[Une librairie permettant de gérer les fichiers ODS : https://incubator.apache.org/odftoolkit/downloads.html]
La librairie Jena Apache

15/03/2016

Rdf Facile - Afficher les informations récupérées sur AppInventor

[ cet article fait partie de la série RDF FACILE - Mon petit BigData ]

Bien dans les articles précédents, nous avons : 
- mis en place un serveur RDF / Fuseki, qui nous fournit un accès à un endpoint pour effectuer des requêtes Sparql.
- développé une application sous AppInventor pour effectuer une requête sur cet endpoint.
- modifié cette application pour ajouter des informations sur ce serveur

Nous allons maintenant reprendre cette application pour formater différemment les informations qui nous sont retournées,

On va repartir de la dernière version, celle qui permet d'ajouter des informations. On peut la récupérer ici : http://ai2.appinventor.mit.edu/?galleryId=5233374557372416

Dans la version précédente, on avait juste affiché le résultat de la requete dans la zone de texte (entre les deux version, j'avais même inséré une page pour mieux les visualiser), mais ce n'est pas ce que nous voulons, c'est illisible... on va donc reformater le résultat de la requete.

Le résultat qui nous est retourné est au format JSON et ressemble à ça :

{
  "head": {
    "vars": [ "s" , "p" , "o" ]
  } ,
  "results": {
    "bindings": [
      {
        "s": { "type": "uri" , "value": "http://example.org/dog1" } ,
        "p": { "type": "uri" , "value": "http://www.w3.org/1999/02/22-rdf-syntax-ns#type" } ,
        "o": { "type": "uri" , "value": "http://example.org/animal" }
      } ,
      {
        "s": { "type": "uri" , "value": "http://example.org/cat1" } ,
        "p": { "type": "uri" , "value": "http://www.w3.org/1999/02/22-rdf-syntax-ns#type" } ,
        "o": { "type": "uri" , "value": "http://example.org/cat" }
      } ,
      {
        "s": { "type": "uri" , "value": "http://example.org/cat" } ,
        "p": { "type": "uri" , "value": "http://www.w3.org/2000/01/rdf-schema#subClassOf" } ,
        "o": { "type": "uri" , "value": "http://example.org/animal" }
      } ,
      {
        "s": { "type": "uri" , "value": "http://example.org/zoo/host" } ,
        "p": { "type": "uri" , "value": "http://www.w3.org/2000/01/rdf-schema#range" } ,
        "o": { "type": "uri" , "value": "http://example.org/animal" }
      } ,
      {
        "s": { "type": "uri" , "value": "http://example.org/zoo1" } ,
        "p": { "type": "uri" , "value": "http://example.org/zoo/host" } ,
        "o": { "type": "uri" , "value": "http://example.org/cat2" }
      } ,
     ...
      {
        "s": { "type": "uri" , "value": "http://example.org/LucileP" } ,
        "p": { "type": "uri" , "value": "http://example.org/participe" } ,
        "o": { "type": "uri" , "value": "http://example.org/AperoboLyon" }
      }
    ]
  }
}


L'objectif étant de récupérer tous les triplets, comme celui-la : 
      {
        "s": { "type": "uri" , "value": "http://example.org/dog1" } ,
        "p": { "type": "uri" , "value": "http://www.w3.org/1999/02/22-rdf-syntax-ns#type" } ,
        "o": { "type": "uri" , "value": "http://example.org/animal" }
      } 

c'est à dire qu'on va prendre tout ce qui se trouve après '"bindings": [' et jusqu'à ']'


Pour mieux visualiser, on va modifier la requête et limiter le nombre de résultat à 3, notre variable "requeteTest" sera donc :
http://rdf-smag0.rhcloud.com/ds/query?query=SELECT+*+WHERE+%7B%3Fs+%3Fp+%3Fo+%7D%0D%0ALIMIT+3&output=json

et on va exporter le travail de formatage dans une fonction que l'on va appeler "formateTexte":
--> créer la fonction "formateTexte", la variable "resultat", et modifiez la fonction "When Web1.GotText" comme ceci :



-> Web1.GotText envoie "responseContent" à "formateTexte" dans la variable "texteAFormater"
-> Pour comprendre la fonction "formateTexte", commencez par la droite :
-> On récupère "texteAFormater", on le split/coupe à "bindings": [, on récupère le 2 ème élément de la liste créée par le split, on resplit à ] , on récupère le premier élément, et on envoie ça dans résultat, on affiche résultat dans TextBox1.

Si vous avez bien modifié la requête pour limiter le nombre de résultat à 3, le texte qui devrait maintenant s'afficher dans TextBox1 est celui-ci (revenez sur la page d'accueil et rouvrez l'écran "Visualisation" pour rafraichir, puisque la requete s'execute à l'initialisation de l'écran ou vous pouvez ajouter un bouton qui reprend le code de "When Visualisation.Initialise" pour actualiser plus vite) :  (Avec le formatage en moins )

 {
        "s": { "type": "uri" , "value": "http://example.org/dog1" } ,
        "p": { "type": "uri" , "value": "http://www.w3.org/1999/02/22-rdf-syntax-ns#type" } ,
        "o": { "type": "uri" , "value": "http://example.org/animal" }
      } ,
      {
        "s": { "type": "uri" , "value": "http://example.org/cat1" } ,
        "p": { "type": "uri" , "value": "http://www.w3.org/1999/02/22-rdf-syntax-ns#type" } ,
        "o": { "type": "uri" , "value": "http://example.org/cat" }
      } ,
      {
        "s": { "type": "uri" , "value": "http://example.org/cat" } ,
        "p": { "type": "uri" , "value": "http://www.w3.org/2000/01/rdf-schema#subClassOf" } ,
        "o": { "type": "uri" , "value": "http://example.org/animal" }
      }

Bien bien bien,
D'abord, on "trim" pour enlever les espaces au début et à la fin, et on va continuer à spliter...
L'élement qui séparent nos triplet, maintenant c'est  '} , {'
mais avec un retour à la ligne (ça fait deux heures que je suis dessus !!! mais ça passe ! )
en fait, le séparateur c'est "je ferme l'acolade, je mets un espace, une virgule, le retour à la ligne formalisé par "\n", ensuite, on a six espaces, en une accolade qui ouvre, ça donne : } ,\n {


Pour voir vraiment ce que ça donne, et où on en est, on va remplacer notre TextBox1 et  afficher nos resultats dans un gestionnaire de liste... là, vous pouvez utilisez celui que vous voulez  :
ListPicker, Spinner, ListView... ça dépend de votre besoin, ou de ce que vous souhaitez faire ensuite...
Pour la démo, j'ai mis les trois, et voilà ce que ça nous donne dans le "Designer" et le code modifié depuis la dernière image (avec le bouton actualise ) :


Et la partie code : 



Le resultat est récupérable ici : http://ai2.appinventor.mit.edu/?galleryId=4834449967022080


Evidemment, on va encore splitter pour avoir l'affichage voulu... et surtout choisir entre ListPicker, Spinner et Listview...
Bon en fait, j'hésite entre ListPicker & Listview, on verra plus tard, ... Hop ! out Spinner...

De plus, on va se refaire une petite fonction pour formater les différents élements de la List comme on le souhaite...
Un petit "Layout Horizontal" mettre notre bouton actualise à côté de "Retour Accueil " (optionnel, mais ça laisse plus de place pour le reste.

Commençons par sortir notre liste en l'envoyant à la fonction "formateItem", et on la renvoie tout de suite dans "listeItem" que l'on affiche dans nos "ListPicker" & "Listview" :


Attention, maintenant, on va spiltter... je ne détaille pas, on split sur le motif du début, on prend le deuxième element, on resplit sur le motif de fin, et on prend le premier élement, et ça pour avoir les trois elements de notre triplet : (Sujet, propriete, Objet )


On a maintenant chaque Item de la liste qui ressemble à un truc comme ça :
 "type": "uri" , "value": "http://example.org/dog1"
 "type": "uri" , "value": "http://www.w3.org/1999/02/22-rdf-syntax-ns#type"
 "type": "uri" , "value": "http://example.org/animal"

un dernier Split pour récupérer seulement les valeurs  :



Après, on peut encore travailler sur les prefix, mais c'est déjà pas mal pour aujourd'hui...
Pour plus de fun, je repasse la limite des résultats à 100, et je vous mets le bouzin ici :
http://ai2.appinventor.mit.edu/?galleryId=4919353954271232

[ cet article fait partie de la série RDF FACILE - Mon petit BigData ]



14/03/2016

Projet, idée, problème... partager sous forme de graphe, collaborer... et bien plus encore...

[ cet article fait partie de la série RDF FACILE - Mon petit BigData ]

Si mes explications ne sont pas claires, y'a toujours Wikipedia : https://fr.wikipedia.org/wiki/Resource_Description_Framework

Parti d'un projet un peu loufoque, il est vrai d'"un robot qui range ma chambre", il m'est très vite apparu que ce projet d'envergure n'était pas simple à partager avec mon entourage, et encore moins avec des inconnus.
Pour ce projet, j'avais imaginé non pas un robot qui rangerait, mais une multitude de robots, d'objets connectés, de modules qui s'entraideraient, collaboreraient.
Ils devaient pour ce faire s'échanger des informations dont la structure devaient être libre de toute modification au cours du temps, et chacun de ces robots aurait la possibilité de compléter, corriger les informations en fonction de ses capacités à capter l'environnement.
Au fil de mes recherches, le format qui me parut le plus adapté fut le RDF et je n'ai rien trouvé de mieux depuis, mais la discussion reste ouverte ;-)
RDF
Le rdf nous permet, en effet, à partir de notions toutes simples que tout le monde peut comprendre, de partager et d'échanger, de décrire tout et n'importe quoi... J'imaginais alors que pour que mes robots puissent comprendre leur environnement, il leur fallait déjà le connaître un petit peu... Mes quelques connaissances sur le Machine Learning en plein boom me laissant supposer que ces différents modules pourraient être dotés d'ici peu d'une quelconque intelligence artificielle répondant aux besoins qui leur seraient demandés : apprentissage, adaptation au contexte, à l'utilisateur...
La première notion essentielle, le triplet, est décrite un peu plus bas, mais avant ça, nous devons parler de l'information...
L'information
Si je vous dis "Voiture", tout le monde ou presque voit à peut près ce que cela représente. Méa Culpa à ceux qui pourraient penser que je les prends pour des ânes, mais les notions que l'ont va aborder ici, même si elles sont simples, imposent d'oublier tout ce que vous savez, ou plutôt de regarder le monde sous un autre angle, avec un peu plus de recul... Et de bien considérer que chacun peut posséder une vision différente de chaque concept, selon son origine, ses habitudes, sa culture...
Si cette fois, je vous dis "La Voiture de David", vous m'accorderez que l'information est plus précise... Dans "La Voiture de David est jaune et c'est une Opel Corsa", on aura encore plus d'informations...

Dans un premier temps, et pour se rapprocher de ce que tout le monde connait, ce que nous allons devoir faire (tant que le Natural Langage Processing n'est pas intégré au site), c'est de découper cette information... c'est un peu comme un tableau à deux lignes, avec dans la première ligne, les champs et dans la deuxième les valeurs.

champ 1 champ 2 champ 3 champ 4 ... ...
Ce que nous voulons décrire valeur 1 valeur 2 valeur 3 valeur 4 ... ...

Par exemple, pour décrire ma voiture, je pourrais utiliser le tableau suivant :
marque modèle couleur vitesse maxi propriétaire position actuelle
Voiture de David Opel Corsa Jaune 128 000 David Lyon

Comme vous avez pu le constater, les propriétés (champs dans le tableau) sont très libres et nous laissent le loisir de décrire tout et n'importe quoi... J'utilise ici le terme "propriété", et ceux qui sont allés voir la page Wikipédia sur le RDF aurons constaté qu'il est mentionné "prédicat"... Et bien les deux sont équivalents... et oui, faudra vous y faire...
Bon allez, je n'y tiens plus... passons au triplet...
Le Triplet
Repartons de l'exemple que nous avons pris précédemment : "La Voiture de David est jaune et c'est une Opel Corsa".
Nous avons découpé les informations de manière atomique dans le tableau à deux lignes... et bien ce tableau que n'importe qui est capable de reproduire, pour décrire n'importe quel concept, objet, procédure..., nous donne tout naturellement les triplets que nous attendions...
Le triplet se matérialise sous la forme de trois éléments :
  • un sujet : c'est la chose que l'on va décrire,
  • un objet : c'est une chose avec laquelle notre sujet est lié,
  • une propriété (ou prédicat) : c'est la nature de la relation entre le sujet et l'objet.

Ainsi notre tableau précédent nous donne les triplets suivants :
(Voiture de David, marque, Opel)
(Voiture de David, modèle, Corsa)
(Voiture de David, couleur, Jaune)
(Voiture de David, vitesse maxi, 128 000) --> enfin seulement dans les bonnes descentes...
(Voiture de David, propriétaire, David)
(Voiture de David, position actuelle, Lyon)
A quoi ça sert ? me direz-vous ? Ouais super... j'ai perdu 10 minutes à lire un truc qui ne sert à rien...
Meuh non, va voir plus bas !
Le Graphe
Bien maintenant que nous avons nos triplets, envoyons-les dans un "graphMaker" tel que http://smag0.meteor.com,

avec quelques exemples de fichiers rdf /ttl /owl (http://smag-smag0.rhcloud.com/dca/ontologies/)


On obtient alors le début d'un graphe : 


Mais les choses deviennent intéressantes lorsque l'on rajoute de nouveaux triplets :

(Voiture de David, type, Voiture)
(David, type, Personne)
(Lyon, type, Ville)
(Voiture, subclassOf, Vehicule)
(David, habite, Lyon)
(Paris, type, Ville)
(Madrid, type, Ville)
(Paris, capitale de, France)
(France, type, Pays)
(Soleil, couleur, Jaune)
(Lyon, sameAs, http://fr.dbpedia.org/page/Lyon)
...
Oulà ! STOP !, c'est quoi cette dernière ligne ??? !!! ce dernier "triplet", comme ils disent ???
Attention ! Là, on rentre dans le vif du sujet
Sur cette dernière ligne (Lyon, sameAs, http://fr.dbpedia.org/page/Lyon), qui et toujours un triplet, y'a un max de nouvelles notions, mais j'imagine que si vous avez tenu jusque là, vous êtes prêt à affronter la suite :
  • sameAs : la propriété "sameAs", comme vous pourrez le constater, si le RDF continue de vous intéresser, nous permet de spécifier que le sujet (Lyon) et l'objet (http://fr.dbpedia.org/page/Lyon) du triplet représentent la même chose.
    Et c'est là, la plus grande qualité du RDF, "it's a kind of magic", c'est là que la magie "s'opère"... C'est là que s'ouvre une infinité de possibilité...
    Vous pouviez déjà grâce au RDF tout décrire, vous pouvez maintenant connecter votre graphe à d'autres graphes, d'autres bases de données RDF crées par d'autres... comme celle de DBPedia, qui reprend les informations contenues dans Wikipedia, et vous les propose au format RDF : allez jeter un œil sur la page en question : http://fr.dbpedia.org/page/Lyon et vous verrez d'autres propriétés apparaître, comme la population, la superficie, les monuments... ainsi que des liens vers d'autres bases de données ou des endpoint sparql
  • http://fr.dbpedia.org/page/Lyon : à décrire...
  • prefix
  • sparql
La suite ?
Bandes d'impatients, commencez par jeter un oeil sur dreamcatcher -> http://dreamcatcher-smag1.rhcloud.com/#!/outils (patientez 30 secondes que le serveur redémarre l'appli)



 vous y trouverez l'aide pour vous balader dans les graphes..., sinon en attendant la suite, vous pouvez également interpeller le fautif, lui posez vos questions, ou faire part de vos attentes, vos idées sur Twitter : @DFaveris
d'autres infos techniques se trouvent sur http://smag0.blogspot.fr

Un bon tendeur...
ça tient bien, tiens, ça tombe bien !

13/03/2016

big data facile - une application pour insérer des données sur un serveur Fuseki

[ cet article fait partie de la série RDF FACILE - Mon petit BigData ]

Repartons de l'application Android faite avec AppInventor pour visualiser les informations de notre serveur Fuseki comme nous l'avons construite ici : http://smag0.blogspot.fr/2016/03/bigdata-facile-une-application-android.html

Si vous avez tout bien suivi, vous avez créé un écran "Saisie", et nous avons sur cette page http://smag0.blogspot.fr/2016/03/un-serveur-fuseki-rdf-bigdata-sur.html  une piste pour construire la requete que nous devons envoyer pour insérer des données :

PREFIX rdf:   <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX rdfs:   <http://www.w3.org/2000/01/rdf-schema#>
PREFIX ex:   <http://example.org/>
PREFIX zoo:   <http://example.org/zoo/>
PREFIX owl: <http://www.w3.org/2002/07/owl#>


INSERT DATA {
GRAPH <http://example/bookStore>
{
ex:dog1    rdf:type         ex:animal .
ex:cat1    rdf:type         ex:cat .
ex:cat     rdfs:subClassOf  ex:animal .
zoo:host   rdfs:range       ex:animal .
ex:zoo1    zoo:host         ex:cat2 .
ex:cat3    owl:sameAs       ex:cat2 .
}
}

Je rappelle que pour les flémards, le code de la première partie (récupération des données) est accessible ici : http://ai2.appinventor.mit.edu/?galleryId=4993525195735040

Les données au format RDF se présentent sous la forme de triplets, si c'est pas clair pour toi, jette un oeil là https://fr.wikipedia.org/wiki/Resource_Description_Framework .
Nous avons donc besoin de trois champs.
Dans App Inventor, passez sur l'écran "Saisie" que nous avons créé dans le tuto précédent, et insérez trois zone de texte ( on va repasser en english, car la traduction en français pose quelques problèmes lors des tests...)
Comme pour la page "Visualisation", insérons un bouton retour accueil, avec le même code que précedemment.
Ainsi que trois zones de texte, profitez-en pour les renommer, passer leur "width" à "Fill Parent" et mettre des Hint selon le contenu que l'on attend : Sujet, propriete, Objet... ça sera plus parlant pour la suite.
Oui , je sais , Sujet et Objet ont droit à la majuscule, mais pas "propriété", c'est un peu comme ça en RDF... alors gardons cette norme, ça ne peut pas faire de mal...
N'oubliez pas aussi d'ajouter un composant Web1 que vous trouverez dans Connectivity, c'est lui qui va nous faire la requête POST, mais pour ça, il va falloir lui donner la bonne requête.
Complétez par une nouvelle zone de texte, que l'on nommera "Résultat", avec Height et Width à "Fill Parent, et "Hint" à "Attente resultat".



Passons maintenant à l'envers du décor, en cliquant sur le bouton "Blocks".
Pour faire au plus simple, considérons que les trois éléments que nous allons insérer avec notre première requête, ont tous le même préfixe :  PREFIX ex:   <http://example.org/>.

Notre application devra donc envoyer la requete :

PREFIX ex:   <http://example.org/>

INSERT DATA {
GRAPH <http://example/bookStore>
{
ex:Sujet    ex:propriete         ex:Objet .
}
}

Et pour ce faire, nous aurons besoin de récupérer les valeurs qui se trouvent dans nos trois zones de texte.

Commençons par la ligne où se trouve notre triplet (ex:Sujet    ex:propriete         ex:Objet .)
Les quelques blocs suivants devraient nous faire apparaître notre ligne dans la zone de texte "Résultat" :
On initialise nos variables Sujet, propriete, Objet, ainsi que la requeteUpdate.
Au click du bouton, on concatène la chaîne "ex:" avec chacune des valeurs récupérées dans nos trois textBox.
On construit ensuite notre requeteUpdate, en joignant nos trois variables, en les séparant d'un espace .
Astuce : pour ajouter une nouvelle ligne dans un "join", cliquez sur la roue sur fond bleu.
Attention, bien mettre un espace dans les deux blocs entre "get  global Sujet " et "get global propriete" ainsi que entre les blocs "get global propriete" et "get global Objet" .
On termine notre "set global requeteUpdate" par un bloc texte qui contient un espace et un point " .", c'est ainsi qu'on termine un triplet simple en rdf.
Et pour finir, on affiche notre "global requeteUpdate" dans la zone texte "Resultat"



Pour tester, utilisez l'appli " compagnon App Inventor", et entrez un triplet rdf, par exemple :
dans Sujet : David
dans propriété : type
et dans Objet : Personne
cliquez ensuite sur "Envoyer"

Si tout se passe bien, vous devriez immédiatement voir apparaître :
ex:David ex:type ex:Personne . 
Si c'est le cas, BRAVO ! on y est presque, il suffit juste d'envoyer tout ça au serveur (http://rdf-smag0.rhcloud.com/) mais avant de pouvoir lui demander d'intégrer ces information, nous devons y mettre les formes...

L'enrobage sauvage...
Pour voir si ça marche, on va juste englober notre triplet par le strict nécessaire :
Avant notre triplet, on va mettre :
PREFIX ex:   <http://example.org/>
INSERT DATA {
GRAPH <http://example/bookStore>
{
et à près, on fermera par
}
}

C'est pas très orthodoxe, mais le principal, c'est de tester si ça marche, alors on va la faire simple, on aura tout le loisir de faire joli ensuite.
Attention.... POF :
-  une variable "debutRequete" avec comme valeur :
PREFIX ex:   <http://example.org/> INSERT DATA { GRAPH <http://example/bookStore> 
- et une variable "finRequete" avec comme valeur :
}}

Bouhhh ! c'est pas bien !!!



On complète ensuite notre "requeteUpdate", en ajoutant deux blocs :
 "get global debutRequete" (avant "get global Sujet" )
et "get global finRequete" (après le bloc " .").

Votre code devrait maintenant ressembler à ceci :


et le texte qui s'affiche dans la zone de texte "Resultat" à ceci :
PREFIX ex:   <http://example.org/> INSERT DATA { GRAPH <http://example/bookStore> ex:David ex:type ex:Personne . }}


Nous avons maintenant nos données, que nous avons mis dans une enveloppe.
Le destinataire, c'est le serveur http://rdf-smag0.rhcloud.com/, on va même être plus précis, car sa boite au lettre se trouve à l'adresse : http://rdf-smag0.rhcloud.com/update, et il va falloir envoyer à cette adresse, une requête de type POST.
Il ne reste plus qu'à mettre en place le transporteur... et c'est là qu'intervient notre composant "WEB1" que nous avions inséré au tout début de ce post...

Créons maintenant une nouvelle variable que nous nommerons "endpointUpdate" et donnons-lui la valeur de l'adresse de la boite aux lettres de notre serveur "http://rdf-smag0.rhcloud.com/ds/update"

Ensuite, on sort le bloc "set Resultat.Text" du bloc "When EnvoyerBouton.click", et à la place, on y met deux blocs : "set Web1.Url" et "Call Web1.PostText" qui vont respectivement donner à WEB1 l'adresse de destination, et la valeur du paramètre "update=".

Et bien voilà, le plus dur est fait... pas insurmontable, quand même...
juste une toute petite dernière chose, pour être sûr du résultat...
Ajouter un bloc "When Web1.gotText" qui s'exécutera dès que la réponse du serveur arrivera... avec à l'intérieur, l'affichage dans la zone de texte "Résultat", de la valeur "reponseContent".



Lorsque vous testez maintenant votre appli, ( MIT compagnon) et que vous cliquez sur "Envoyer", vous devriez voir apparaitre dans la zone "Résultat", la ligne suivante :
<html><head></head><body><h1>Success</h1><p>Update succeeded </p></body></html>


et c'est plutôt bon signe : <h1>Success</h1><p>Update succeeded </p>

Pour vérifier, repassez sur l'écran d'accueil après avoir ajouté le code du bouton "retour Accueil", puis sur l'écran "Visualisation" comme nous l'avons implémenté ici http://smag0.blogspot.fr/2016/03/bigdata-facile-une-application-android.html
mais c'est plus joli ici http://rdf-smag0.rhcloud.com/ds/query?query=select+*+where+%7B%3Fs+%3Fp+%3Fo%7D&output=text , car pour l'instant dans la visualisation, on n'a pas formaté le résultat...


Si t'es arrivé jusque là, t'es plus un flemmard, alors cadeau : le code sur AppInventor : http://ai2.appinventor.mit.edu/?galleryId=5233374557372416

Les retours sont les bienvenus, si j'ai fait des boulettes, ou si je ne suis pas clair. Pour rappel : ceux qui veulent s'installer leur propre serveur peuvent le faire en local (en téléchargeant Apache Fuseki ou sur le cloud , par exemple Openshift en récupérant le source ici : https://github.com/scenaristeur/smag0-fuseki-rdf-openshift



[ cet article fait partie de la série RDF FACILE - Mon petit BigData ]