lunedì 26 novembre 2018
venerdì 23 novembre 2018
Problemi di Alexa
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
"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
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();
},
};
--------------------------------------------------------------------
Iscriviti a:
Post (Atom)
Debugger integrato ESP32S3
Aggiornamento In realta' il Jtag USB funziona anche sui moduli cinesi Il problema risiede nell'ID USB della porta Jtag. Nel modulo...
-
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...
-
Questo post e' a seguito di quanto gia' visto nella precedente prova Lo scopo e' sempre il solito: creare un sistema che permet...
-
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...