Objet

Ce post décrit un prototype de ChatBot builder qui a été réalisé avec Oracle Application Express (Apex) et qui est destiné à Facebook Messenger. Pour illustration, j’ai créé un bot spécialisé pour un syndic immobilier qui illustre la plupart des possibilités que peut offrir un agent conversationnel de type Facebook Messenger.
On peut également imaginer des bots simplifiés pour des collectivités locales répondant à des question usuelles relatives à la vie locale, ou bien des bots spécialisés pour naviguer dans un catalogue d’objets.

La solution retenue repose sur un modèle de données qui contient les différentes « routes » de réponse ainsi que les modèles de message. Ce genre de ChatBot est à privilégier pour un ensemble fini de réponse. Il n’y a aucune intelligence ni moteur NLP. En revanche, aucune programmation n’est nécessaire: On se contente de remplir les différentes réponses en réaction à des messages.
Ce chatbot tire également parti du moteur de recherche textuel fourni par la Database Oracle et cela offre à l’utilisateur beaucoup de flexibilité dans la formulation des questions (insensibilité aux voyelles accentuées, par exemple, et stemming sur les formes conjuguées).  Il est possible de rajouter un thésaurus avec des synonymes, ou bien une nomenclature.

Lire la suite de

Télécharger l’application apex de démo depuis Github.

Pour utiliser l’API API Open Data Temps réel  de la RATP depuis Oracle Apex, c’est à dire depuis une database Oracle, on peut utiliser la méthode suivante:

Appel  d’un service

Liste des stations pour une ligne donnée (RER A dans l’example ci-dessous)

declare
 l_envelope CLOB;
BEGIN

-- Build a SOAP document appropriate for the web service.
 l_envelope := '
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:wsiv="http://wsiv.ratp.fr" xmlns:xsd="http://wsiv.ratp.fr/xsd">
 <soap:Header/>
   <soap:Body>
     <wsiv:getStations> 
      <wsiv:station>
        <xsd:line>
          <xsd:id>RA</xsd:id>
        </xsd:line>
       </wsiv:station>
     </wsiv:getStations>
   </soap:Body>
</soap:Envelope>
';

apex_web_service.make_request(
 p_url => 'http://opendata-tr.ratp.fr/wsiv/services/Wsiv',
 p_collection_name => 'RATP',
 p_version => '1.2',
 p_envelope => l_envelope );

end;

Le document XML est enregistré dans la colonne nommée XMLTYPE001 d’une collection APEX par la procédure apex_web_service.make_request.

Parsing du résultat

Le résultat est enregistré dans une collection dont le nom, arbitrairement donné, est : ‘RATP’.

Observer que l’on précise des namespaces dans l’appel à la fonction XMLTABLE:

SELECT xt.name Station
FROM apex_collections x,
 XMLTABLE(
     XMLNAMESPACES ('http://www.w3.org/2003/05/soap-envelope' AS "soapenv",
                    'http://wsiv.ratp.fr' AS "ns2", 
                    default 'http://wsiv.ratp.fr/xsd' 
     ),
     '/soapenv:Envelope/soapenv:Body/ns2:getStationsResponse/ns2:return/stations' PASSING x.xmltype001
     COLUMNS 
        name VARCHAR2(100) PATH 'name/text()'
 ) xt
where collection_name = 'RATP'
order by station

Conclusion

Une fois que les données sont disponibles sous forme de table, il est très simple d’utiliser n’importe quel composant d’Apex pour restituer les informations.


Requete pour obtenir les prochains passages

SELECT xt.codem code, to_date(xt.stationsDates,'YYYYMMDDHH24MI') passage, to_date(xt.stationsDates,'YYYYMMDDHH24MI') delai, xt.direction direction 
FROM apex_collections x,
 XMLTABLE(
 XMLNAMESPACES ('http://www.w3.org/2003/05/soap-envelope' AS "soapenv",
 'http://wsiv.ratp.fr' AS "ns2",
 default 'http://wsiv.ratp.fr/xsd'
 ),
 '/soapenv:Envelope/soapenv:Body/ns2:getMissionsNextResponse/ns2:return/missions' PASSING x.xmltype001
 COLUMNS 
 stationsDates VARCHAR2(100) PATH 'stationsDates/text()',
 codem VARCHAR2(100) PATH 'code/text()',
 direction VARCHAR2(100) PATH 'direction/sens/text()'
 ) xt
where COLLECTION_NAME='RATPH'
order by passage ASC

Code PLSQL pour obtenir les prochains passages

declare
 l_envelope CLOB;
BEGIN

-- Build a SOAP document appropriate for the web service.
 l_envelope := '<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:wsiv="http://wsiv.ratp.fr" xmlns:xsd="http://wsiv.ratp.fr/xsd">
 <soap:Header/>
 <soap:Body>
 <wsiv:getMissionsNext>
 <wsiv:station>
 <xsd:id>' || :P6_STATIONID ||'</xsd:id>
 <xsd:line>
 <xsd:id>' || :P4_LIGNE ||'</xsd:id>
 </xsd:line>
 <xsd:name></xsd:name>
 </wsiv:station>
 <wsiv:direction> 
 <xsd:sens>*</xsd:sens>
 </wsiv:direction>
 </wsiv:getMissionsNext>
 </soap:Body>
</soap:Envelope>
';apex_web_service.make_request(
 p_url => 'http://opendata-tr.ratp.fr/wsiv/services/Wsiv',
 p_collection_name => 'RATPH',
 p_version => '1.2',
 p_envelope => l_envelope );
end;

Objet

Voici quelques liens et du matériel pour créer un ChatBot basé sur Oracle Application Container Cloud et destiné à Facebook Messenger.

J’ai mis en attachement un code que j’ai adapté pour node.js, qui s’inspire du projet Git  avec quelques ajouts pour exploiter la position GPS. Il faut créer auparavant une page dans FB ainsi qu’une app pour Messenger.

Le ficher .zip peut directement être instancié dans Oracle Container Cloud (node.js). Penser à ajouter une variable système (au niveau du setting de node.js)  qui contiendra la valeur du token de page. Je l’ai appelée : FB_PAGE_ACCESS_TOKEN

Ce chatbot n’est utilisé pour l’instant qu’en mode développement car il est nécessaire de soumettre le bot à FB avant que celui-ci ne soit rendu public.Lire la suite de

Les données que possède la Ville de Paris sont exploitées au mieux par les services municipaux dans le cadre de leurs missions. Elles constituent également un patrimoine immatériel qui peut être mis en valeur pour l’ensemble de la collectivité :

  • les chercheurs peuvent y trouver matière à nourrir leurs travaux et expériences,
  • les développeurs peuvent créer des services innovants utilisant ces données,
  • les citoyens et journalistes y trouvent des informations brutes,
  • les entreprises peuvent fournir une valeur ajoutée à ces données, et ainsi créer de l’emploi et de la richesse pour la collectivité.

Le mouvement « Open Data » (données ouvertes) vise à obtenir de tout type de structure, et notamment des collectivités publiques du monde entier, la mise à disposition de tous, de façon libre et gratuite, des données électroniques.

source: https://opendata.paris.fr/page/lademarche/

Parmi les différents datasets, celui des sanisettes semblait du plus haut intérêt pour un promeneur.

snap02425

API REST

Il suffit d’ajouter cette API dans MCS puis définir un schéma qui reprend les attributs du flux json. On utilise ensuite MAX pour réaliser une application simple de positionnement sur une map avec détection de la position depuis le device, pour localiser des sanisettes à moins de x mètres, ou bien celles encore ouvertes.

IMG_1440 IMG_1441 IMG_1442 IMG_1443

Il existe d’autres datasets très présentables, eux, comme celui des arbres remarquables.

 

Intro

Ce sont des note de travail sur une première prise de contact avec Oracle Application Container Cloud Service (Oracle ACCS/Node).

Oracle ACCS propose deux types de containers applicatifs:

  • Java SE (Java)
  • Node.js (Javascript)

Ce post concerne Node.js.

On déploie une application Javascript comme si on travaillait avec un serveur d’application, mais avec un niveau de cloisonnement plus poussé.

Prérequis

Suivre le tutorial: Developing a RESTful Node.js and HTML5 application to Oracle Application Container Cloud Service

Il s’agit d’une application qui liste des sujets et qui permet d’en ajouter ainsi que des commentaires.

Il y a, à coté, une page html (index.html) qui fait des appels à cette application.

Pour info: Oracle ACCS propose une application sample déjà installée sur le serveur. Cette application est instanciable lors de la création d’une nouvelle appli.

Développement et test en local

Pour tester le fonctionnement, avant de déployer sur Oracle ACCS, il faut installer node.js sur son PC et suivre le tutorial.

Optionnel: Pour inclure des appels REST vers d’autres services, il faut utiliser le module require.

Avant de lancer la commande node server.js, il faudra positionner la variable NODE_PATH à la valeur suivante:
set NODE_PATH=C:\Users\<USERNAME>\AppData\Roaming\npm\node_modules

Le résultat ressemble à :

snap02335

Déploiement

Un fois que c’est vérifié:

  • Bien vérifier la variable port et la fixer à la valeur suivante:
    var PORT = process.env.PORT || 80;
  • on fabrique un .zip avec l’application node (server.js + un fichier Manifest)
  • On se connecte à Oracle ACCS et on crée une nouvelle application de type Node.js en chargeant le fichier zip précédent.
  • On récupère l’adresse et on met à jour la page HTML pour pointer vers l’adresse de l’application.

snap02333

snap02334

Test du bon fonctionnement

Soit on déclenche la page index.html dans un browser, soit on appelle directement l’URL https://testpmo-gse00000405.apaas.em2.oraclecloud.com
Observer que l’URL est préfixée par le nom que l’on donne à l’application lors de sa création

Conclusion: c’est extrêmement simple à déployer !

Avantages pour l’appel de service REST

L’application est directement accessible en SSL.

On peut développer en Javascript et  échapper aux contraintes de Cross Origin Domain puisque les appels REST vers d’autres services se feront depuis un serveur et non pas depuis un browser. cela est particulièrement vrai pour les services REST qui ne sont pas encore CORS enable.
(pour info: Les APIs de Oracle Documents Cloud Service sont désormais CORS enable depuis cet été 2016)

A tester: Il faut vérifier comment les applications Node interagissent avec l’identity Domain. Est-ce que l’on peut utiliser l’authentification native du tenant et récupérer , au niveau de l’application, le user connecté ?

 

Oracle Process Cloud Service propose des APIs permettant d’accéder à des informations structurelles et à des indicateurs agrégés d’activités (Les APIS de Analytics sont disponible sur le serveur GSE).
On peut ensuite utiliser BI Publisher pour la production de rapport d’activité en format pdf.

cf Documentation des APIS

Voici un exemple à partir de DHC:

 

Retrieves the process-definitions with forms, without forms, docs or all using the interfaceFilter. Filter can have four values – form, noForm, doc or all. The value doc can be used to fetch process definitions that can be started by a document/folder.

Les APIS renvoient un body en format Json. je n’ai pas réussi à lui faire générer un autre format.

Cas Particulier de Analytics

Il s’agit des APIs qui seront les plus intéressantes à utiliser pour la réalisation de dashboard spécifiques.

Obtention de la définition d’une requête:

pcs-gse00000181.process.us2.oraclecloud.com:443/bpm/api/3.0/analytics/ootbqueries-definitions/DUE_DATE_ANALYSIS_BY_OPEN_TASKS_TREEMAP

L’appel suivant déclenche une requête analytique

pcs-gse00000181.process.us2.oraclecloud.com:443/bpm/api/3.0/analytics/ootbqueries/DUE_DATE_ANALYSIS_BY_OPEN_TASKS_TREEMAP

Je n’ai pas exploité plus loin les possibilités, mais il est facile d’imaginer  qu’avec Oracle Jet, par exemple, c’est simple de produire une représentation graphique de ces infos.

Exploitation dans BI Publisher

J’ai ensuite converti le document json en format XML afin de l’exploiter avec BI Publisher (qui ne prend pas de Json en entrée).

Dans Word, il suffit alors de construire un template d’affichage prenant comme échantillon le fichier XML préalablement généré. Remarque: Il faut avoir installé le plugin Oracle BI Publisher Desktop.

snap02311

Voici un Exemple de restitution au format pdf

Observations:

Le serveur PCS supporte CORS, et on peut  manipuler ces APIs REST depuis Javascript dans un browser.
Oracle Jet comprend pas mal de widgets graphique et sera donc intéressant à considérer.

Pour l’authentification, c’est de la Basic Authentication sur https.

 

 

 

 

 

Lors de la réalisation d’un formulaire Freevo (webfom) dans PCS, il faut savoir que l’ajout d’un  champs de type Dropbox nécessite l’écriture d’un peu de Javascript. Le plus souvent, il faut aller alimenter les données du champs à partir d’un appel de service REST.

J’ai créé les services REST suivants qui sont accessibles en https (mode GET seulement) )et qui ne nécessitent pas d’authentification particulière :

Le service REST est fourni ici par une instance APEX à partir de la vénérable table EMP.

Source: Documentation Oracle PCS exemples de Rules)

Création d'une rule pour le remplissage d'une dropbox

Il faut ajouter un champs de type dropbox dans la webform et ajouter une Rules avec le code suivant:

(on suppose que le champs s’appelle userlist)

 

/*member empno, ename, items*/
var emp;
if(form.load) {
var x = '';
eval('x=' + http.get('https://apex.oracle.com/pls/apex/teamfr/hr/empinfo/'));
var opts1 = []; 
var opts2 = []; 
 for (var i=0; i < x.items.length; i++) { 
   if (x.items[i]) { 
     opts1[i] = x.items[i].ename; 
     opts2[i] = x.items[i].empno; 
   }
 }
userlist.options=opts1;
userlist.value=opts2;
}

Une table contient des références de roses (nom, cultivar, créateur, millésime …)

snap01244

ORDS (Oracle Rest Data Service) est utilisé pour exposer certaines méthodes d’accès et de modification à cette table. Une formulaire avec le look bootstrap illustre l’ajout d’une nouvelle rose dans le référentiel.

Une version Early Adopter est disponible depuis le 9 mars 2015.

Une méthode de type GET se traduira par un ordre SELECT, tandis qu’une méthode PUT, UPDATE ou DELETE sera mappée sur un package PL/SQL.

Observer que ORDS gère automatiquement la pagination (liens de retour et d’avancement) ainsi que les liens de détail ($uri)

IMPORTANT: les mapping de paramètres sont très sensibles à la casse des lettres !! Il s’agit de la partie un peu lourde du setup car il faut tout bien câbler les paramètres

Formulaire de saisie d’un nouvel élément (appel de la méthode POST. Cf Code plus bas)

 

 

 

Un service Web plutôt amusant qui permet d’enchaîner des actions variées à partir d’un événement: IFTTT (prononcer ift)

Il existe plein d’autres recipes, la plupart concernant des équipements mobiles (ex: si je rentre dans une zone géographique, alors déclencher une action)

Pour utiliser ce service, il faut créer un compte puis définir ses recipes. Dans le cas d’un mobile ou tablette, il existe une application native qui trappes les événements et applique les recipes.

Ci-dessous: Chaque fois que je publie un post sur Blogger, un tweet est ajouté sur mon compte Tweeter. (C’est mon quatrième tweet !)

snap01012

 

snap01009

snap01010

snap01011

snap01013