un po' di problemi con Alexa...alcuni esempi
"funzionale" viene interpretato come "funziona le"
"cfr" (pronunciato ciefferre) viene interpretato come "c'è fede"
"centro" alcune volte viene interpretato come "cento"
"sesto" viene intepretato come "6o"
questi problemi sono debuggabili solo attraverso la Alexa Developer Console tramite il file JSON che traduce il parlato nel file interpretato
venerdì 23 novembre 2018
giovedì 22 novembre 2018
Bash script come cgi in Apache
Cosa succede quando scrivi uno script bash che funziona bene e non vuoi convertirlo in Php? Semplice...ritorni indietro di venti anni e lo fai diventare un cgi script
Per prima cosa si devono abilitare gli script CGI in Apache
a2enmod cgi
service apache2 restart
Per prima cosa si devono abilitare gli script CGI in Apache
a2enmod cgi
service apache2 restart
in Debian la directory di default per i CGI e' in /usr/lib/cgi-bin...si copia quindi lo script e lo si rende eseguibile
Per prima cosa c'e' da dire che lo script non deve rispondere in modo arbitrario (per esempio con un semplice testo) ma con un file html altrimenti verranno generati errori del tipo 500 di output non correttamente formattato
In Bash si possono leggere anche le variabile GET passate sulla URL e cio' mediante IFS
Nell'esempio sottostante e' prevista una sola variabile (che corrisponde ad un id numerico) e che e' stata salvata nell'array parm all'indice 1
----------------------------------------------------
#!/bin/bash
echo "Content-type: text/html"
echo ""
echo '<html>'
echo '<head>'
echo '<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">'
PATH="/bin:/usr/bin:/usr/opt/bin"
export $PATH
saveIFS=$IFS
IFS='=&'
parm=($QUERY_STRING)
IFS=$saveIFS
stringa="$(xidel --silent --extract "//img/@src" "http://xxxxxxxxxxxx.it/?utf8=true&size=micro&mode=double&idc=${parm[1]}" | grep idraulico | awk 'FNR==1')"
echo '</head>'
echo '<body>'
#echo ${parm[1]}
file="$(basename $stringa)"
echo $file
echo '</body>'
echo '</html>'
exit 0
----------------------------------------------------
Xidel
Xidel e' un comodo programma a linea di comando che permette di estrarre informazioni da un file HTML. Non esiste nei repository di Debian ma il pacchetto .deb puo' essere comodo scaricato da questo link http://www.videlibri.de/xidel.html
Nell'esempio sottostante viene richiamata una pagina html da cui estrarre un link (che varia in modo non predefinito) in modo automatico
in pratica xidel richiama il file dall'indirizzo xxxxx.wp, estrae tutti gli HRef incontrati, si estraggono solo quelli che hanno la stringa "filename", poi con awk si prende solo il primo della lista e con sed si eliminano dei caratteri (in questo caso ..)
Nell'esempio sottostante viene richiamata una pagina html da cui estrarre un link (che varia in modo non predefinito) in modo automatico
in pratica xidel richiama il file dall'indirizzo xxxxx.wp, estrae tutti gli HRef incontrati, si estraggono solo quelli che hanno la stringa "filename", poi con awk si prende solo il primo della lista e con sed si eliminano dei caratteri (in questo caso ..)
#!/bin/bash
cd "$(dirname "$0")";
stringa="$(xidel --silent --extract "//a/@href" xxxxxxxxxxxx.wp | grep filename | awk 'FNR==1' | sed 's/..//')"
echo "${stringa}"
martedì 20 novembre 2018
Estrarre dati da un XML a linea di comando
Per estrarre dati in modo semplice da un XML una soluzione puo' essere xml_grep
Questo comando e' incluso nel pacchetto Debian xml-twig-tools
si procede quindi con
apt-get install xml-twig-tools
xml_grep 'note' test.xml --text_only
Questo comando e' incluso nel pacchetto Debian xml-twig-tools
si procede quindi con
apt-get install xml-twig-tools
supponiamo di avere un XML tipo
---------------
<?xml version='1.0' encoding='UTF-8'?>
<alert xmlns="urn:oasis:names:tc:emergency:cap:1.2">
<identifier>XXXXXX</identifier>
<sender>XXXXXX</sender>
<sent>2018-11-14T15:24:00+01:00</sent>
<status>Actual</status>
<msgType>Alert</msgType>
<scope>Public</scope>
<note>XXXXXXX</note>
<info>
<category>Met</category>
<event>XXXXX</event>
............
---------------
e che si voglia estrarre il contenuto di <note>
si puo' usare la semplice sintassi
lunedì 19 novembre 2018
Scheletro di progetto NodeJS
I comandi di base per creare un progetto NodeJS
mkdir test
cd test
npm init --yes
npm install request --save (viene installato via npm il modulo "request" nella subdir /node_modules)
si crea quindi il file del programma (per esempio app.js) e si lo si mette in esecuzione con
node app.js
mkdir test
cd test
npm init --yes
npm install request --save (viene installato via npm il modulo "request" nella subdir /node_modules)
si crea quindi il file del programma (per esempio app.js) e si lo si mette in esecuzione con
node app.js
HTTP Async request in Alexa
Per fare interagire Alexa con server esterni la cosa piu' semplice e' usare il modulo http perche' e' un built-in e non necessita di supporto esterno. Si dichiara l'uso all'inizio della Lambda function
--------------------------------------------------------------------
const Alexa = require('ask-sdk');
var http = require('http');
--------------------------------------------------------------------
si crea poi una funzione di richiesta http. Attenzione: questa funzione e' di tipo asincrono e si deve inserire la Promise per fare in modo che il risultato entri nello scope della funzione principale
--------------------------------------------------------------------
function httpGet() {
return new Promise(((resolve, reject) => {
var options = {
host: '80.211.xxxx,xxxx', //solo ip o nome dominio ..niente http od https prima
port: 80,
path: '/dpc.php',
method: 'GET',
};
const request = http.request(options, (response) => {
response.setEncoding('utf8');
let returnData = '';
response.on('data', (chunk) => {
returnData += chunk;
});
response.on('end', () => {
resolve(returnData);
console.log("returnData "+returnData);
});
response.on('error', (error) => {
reject(error);
});
});
request.end();
}));
}
--------------------------------------------------------------------
--------------------------------------------------------------------
const Alexa = require('ask-sdk');
var http = require('http');
--------------------------------------------------------------------
si crea poi una funzione di richiesta http. Attenzione: questa funzione e' di tipo asincrono e si deve inserire la Promise per fare in modo che il risultato entri nello scope della funzione principale
--------------------------------------------------------------------
function httpGet() {
return new Promise(((resolve, reject) => {
var options = {
host: '80.211.xxxx,xxxx', //solo ip o nome dominio ..niente http od https prima
port: 80,
path: '/dpc.php',
method: 'GET',
};
const request = http.request(options, (response) => {
response.setEncoding('utf8');
let returnData = '';
response.on('data', (chunk) => {
returnData += chunk;
});
response.on('end', () => {
resolve(returnData);
console.log("returnData "+returnData);
});
response.on('error', (error) => {
reject(error);
});
});
request.end();
}));
}
--------------------------------------------------------------------
Il custom intent che deve gestire la funzione asincrona sopra indicata deve essere modificato ponendo async nell'handler e deve aspettare il ritorno della funzione httpGet prima di procedere in modo da popolare in modo corretto la variabile response
--------------------------------------------------------------------
const geo = {
canHandle(handlerInput) {
const request = handlerInput.requestEnvelope.request;
return (request.type === 'IntentRequest'
&& request.intent.name === 'geo');
},
async handle(handlerInput) {
const response = await httpGet();
const { intent } = handlerInput.requestEnvelope.request;
const activity = intent.slots.luogo.value;
var speechOutput = response;
if (activity == "firenze")
{
//speechOutput = "firenze si trova in toscana";
}
if (activity == "milano")
{
speechOutput = "milano si trova in lombardia"
}
return handlerInput.responseBuilder
.speak(speechOutput)
.getResponse();
},
};
--------------------------------------------------------------------
mercoledì 14 novembre 2018
Alexa Skills
Per usare Alexa Skill in Europa si deve usare la zona AWS denominata Ireland
Per creare un custom intent in lambda NodeJS che legga le variabili passate da Alexa ASK si procede cosi
il modello prevede un custom intent di nome geo che ha uno slot (ovvero una variabile) di nome luogo
---------------------------------------------------------------------------
{
"interactionModel": {
"languageModel": {
"invocationName": "geografia",
"intents": [
{
"name": "AMAZON.CancelIntent",
"samples": []
},
{
"name": "AMAZON.HelpIntent",
"samples": [
"aiuto "
]
},
{
"name": "AMAZON.StopIntent",
"samples": []
},
{
"name": "AMAZON.NavigateHomeIntent",
"samples": []
},
{
"name": "geo",
"slots": [
{
"name": "luogo",
"type": "AMAZON.City"
}
],
"samples": [
"dimmi dove si trova {luogo}",
"dimmi dove è {luogo}"
]
}
],
"types": []
}
}
}
---------------------------------------------------------------------------
le righe in azzurro servono a leggere la variabile luogo che e' passata da ASK (via JSON) e la mettono nella variabile JS ac
---------------------------------------------------------------------------
const geo = {
canHandle(handlerInput) {
const request = handlerInput.requestEnvelope.request;
return (request.type === 'IntentRequest'
&& request.intent.name === 'geo');
},
handle(handlerInput) {
const { intent } = handlerInput.requestEnvelope.request;
const ac = intent.slots.luogo.value;
var speechOutput = " ";
if (ac == "firenze")
{
speechOutput = "firenze si trova in toscana"
}
if (ac == "milano")
{
speechOutput = "milano si trova in lombardia"
}
console.log(ac);
//const speechOutput = activity;
return handlerInput.responseBuilder
.speak(speechOutput)
.getResponse();
},
};
---------------------------------------------------------------------------
i messaggi di console.log si leggono si Amazon CloudWatch Logs.Dalla finestra della funzione di Lambda in alto ci sono i tab Configurazione e Monitoraggio..si clicca Monitoraggio e poi visualizza log in CloudWatch
Per fare interagire Alexa con informazioni derivanti da un server esterno mediante richieste http
(lo script test.php e' semplicemente un echo("stringa");
---------------------------------------------------------------------------
var http = require('http');
let data = '';
resp.on('data', (chunk) => {
data += chunk;
});
// The whole response has been received. Print out the result.
resp.on('end', () => {
//console.log(JSON.parse(data).explanation);
console.log(data);
});
}).on("error", (err) => {
console.log("Error: " + err.message);
});
---------------------------------------------------------------------------
Iscriviti a:
Post (Atom)
Physics informed neural network Fukuzono
Visto che puro ML non funziona per le serie tempo di cui mi sto occupando ed le regressioni basate su formule analitiche mostrano dei limiti...

-
In questo post viene indicato come creare uno scatterplot dinamico basato da dati ripresi da un file csv (nel dettaglio il file csv e' c...
-
La scheda ESP32-2432S028R monta un Esp Dev Module con uno schermo TFT a driver ILI9341 di 320x240 pixels 16 bit colore.Il sito di riferiment...
-
Questo post e' a seguito di quanto gia' visto nella precedente prova Lo scopo e' sempre il solito: creare un sistema che permet...