Era da un po' di tempo che cercavo un modo di accoppiare una tastiera fisica ad un terminale Android (telefono o tablet...per l'MK808 e' fin troppo semplice) e finalmente con Bluetooth Easy Connect ci sono riuscito (a patto di avere i permessi di root sul telefono). In pratica l'applicazione installata la porzione del software bluetooth che gestisce i dispositivi HID e che non e' compresa di default in Android
Il test e' stato effettuato su un Nexus S accoppiato ad una tastiera Apple
Una volta effettuato l'accoppiamento tra i dispositivi tutto funziona bene. L'unico problema reale e' che non risultano essere disponibili dei layout di tastiera differenti da quello inglese per cui alcuni caratteri digitati non risultano essere corrispondenti a quelli scritti a video (poco male ..e' da tanto che ho fatto l'abitudine a scrivere in modalita' inglese su tastiere in italiano)
lunedì 12 agosto 2013
Autenticazione OAuth2 con Facebook
L'autenticazione via Facebook e' la piu' semplice delle applicazioni Facebook e per poterla gestire si deve prima creare una applicazione Facebook dal menu che si trova in alto a sinistra della propria Home
Creando una nuova applicazione si ottengono
Si deve quindi selezionare Website with Facebook Login indicando la URL della directory dove e' in esecuzione lo script che si intende utilizzare. Attenzione: la URL deve essere in formato FQDN (non sono ammessi nemmeno gli IP numerici)
Per rendere pubbblica l'applicazione deve essere posto su Disabilitato il controllo della SandBox
A questo punto si puo' scaricare il pacchetto con le librerie PHP per interagire con le API di Facebook da questo link
Attenzione : per eseguire la libreria Php dell'SDK Facebook e' necessario che sul server web sia installata l'estensione php5-curl pena la comparsa di un fantomatico Errore 500
E' quindi giunto il momento di usare lo script riportato alla fine di questo post (modificando con gli opportuni valori i campi evidenziati in giallo)
---------------------------------------------------------------
<?php
require '../src/facebook.php';
$facebook = new Facebook(array(
'appId' => '673135dxxxxxxx',
'secret' => 'dde6cfb07dbb769xxxxxxxxxxxxxxxx',
));
$user = $facebook->getUser();
if ($user) {
try {
$user_profile = $facebook->api('/me');
} catch (FacebookApiException $e) {
error_log($e);
$user = null;
}
}
if ($user) {
$logoutUrl = $facebook->getLogoutUrl();
} else {
$loginUrl = $facebook->getLoginUrl();
}
?>
<!doctype html>
<html xmlns:fb="http://www.facebook.com/2008/fbml">
<head>
<title>OAuth Facebook</title>
<style>
body {
font-family: 'Lucida Grande', Verdana, Arial, sans-serif;
}
h1 a {
text-decoration: none;
color: #3b5998;
}
h1 a:hover {
text-decoration: underline;
}
</style>
</head>
<body>
<?php if ($user): ?>
<a href="<?php echo $logoutUrl; ?>">Logout</a>
<?php else: ?>
<div>
Non autenticato :
<a href="<?php echo $loginUrl; ?>">Registrami con Facebook</a>
</div>
<?php endif ?>
<?php if ($user): ?> <br><br>Adesso sono autenticato come <br>
<img src="https://graph.facebook.com/<?php echo $user; ?>/picture">
<pre><?php print_r($user_profile); ?></pre>
<?php else: ?>
<strong><em></em></strong>
<?php endif ?>
</body>
</html>
Creando una nuova applicazione si ottengono
Si deve quindi selezionare Website with Facebook Login indicando la URL della directory dove e' in esecuzione lo script che si intende utilizzare. Attenzione: la URL deve essere in formato FQDN (non sono ammessi nemmeno gli IP numerici)
Per rendere pubbblica l'applicazione deve essere posto su Disabilitato il controllo della SandBox
A questo punto si puo' scaricare il pacchetto con le librerie PHP per interagire con le API di Facebook da questo link
Attenzione : per eseguire la libreria Php dell'SDK Facebook e' necessario che sul server web sia installata l'estensione php5-curl pena la comparsa di un fantomatico Errore 500
E' quindi giunto il momento di usare lo script riportato alla fine di questo post (modificando con gli opportuni valori i campi evidenziati in giallo)
Da autenticare |
Autenticato |
<?php
require '../src/facebook.php';
$facebook = new Facebook(array(
'appId' => '673135dxxxxxxx',
'secret' => 'dde6cfb07dbb769xxxxxxxxxxxxxxxx',
));
$user = $facebook->getUser();
if ($user) {
try {
$user_profile = $facebook->api('/me');
} catch (FacebookApiException $e) {
error_log($e);
$user = null;
}
}
if ($user) {
$logoutUrl = $facebook->getLogoutUrl();
} else {
$loginUrl = $facebook->getLoginUrl();
}
?>
<!doctype html>
<html xmlns:fb="http://www.facebook.com/2008/fbml">
<head>
<title>OAuth Facebook</title>
<style>
body {
font-family: 'Lucida Grande', Verdana, Arial, sans-serif;
}
h1 a {
text-decoration: none;
color: #3b5998;
}
h1 a:hover {
text-decoration: underline;
}
</style>
</head>
<body>
<?php if ($user): ?>
<a href="<?php echo $logoutUrl; ?>">Logout</a>
<?php else: ?>
<div>
Non autenticato :
<a href="<?php echo $loginUrl; ?>">Registrami con Facebook</a>
</div>
<?php endif ?>
<?php if ($user): ?> <br><br>Adesso sono autenticato come <br>
<img src="https://graph.facebook.com/<?php echo $user; ?>/picture">
<pre><?php print_r($user_profile); ?></pre>
<?php else: ?>
<strong><em></em></strong>
<?php endif ?>
</body>
</html>
Autenticazione OAuth2 con Google
Mediante le API di Google e' possibile effettuare un sistema di autenticazione basato sulle credenziali di Google ovvero si puo' avere un sistema di verifica username/password basato su un account Google
Per fare cio' in Php per prima cosa si deve creare una applicazione andando su questa pagina https://code.google.com/apis/console/?api=plus&pli=1
Si crea una nuova applicazione
e si ottengono le chiavi per l'utilizzo delle API
a questo punto si puo' scaricare da questo link la libreria Php per interfacciarsi con le API di Google
Attenzione: il redirect Url e' l'indirizzo dello script che gestisce l'autenticazione. Normalmente Google richiede che sia un indirizzo in https ma si puo' cambiare anche in http (non come per le API di Facebook)
Si puo' quindi inserire lo script in Php riportato alla fine di questo post per verificare l'uso delle API modificando i campi evidenziati in giallo con le proprie chiavi
A questo punto richiamando l'indirizzo dello script in un browser si avranno le seguenti schermate
Richiesta di login
Verifica dei permessi richiesti dall'applicazione (in questo caso minimali)
-----------------------------------------------------
<?php
require_once './api/src/Google_Client.php';
require_once './api/src/contrib/Google_Oauth2Service.php';
session_start();
$client = new Google_Client();
$client->setApplicationName("Google UserInfo PHP Starter Application");
$client->setClientId('30253xxxxxx.apps.googleusercontent.com');
$client->setClientSecret('Yq8K0SS-p28tjQxxxxxxxxxx');
$client->setRedirectUri('http://xxxxxx/luca/google/test.php');
$client->setDeveloperKey('AIzaSyDchpWdZDkRtCmdXRANkXjxxxxxxx');
$oauth2 = new Google_Oauth2Service($client);
if (isset($_GET['code'])) {
$client->authenticate($_GET['code']);
$_SESSION['token'] = $client->getAccessToken();
$redirect = 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF'];
header('Location: ' . filter_var($redirect, FILTER_SANITIZE_URL));
return;
}
if (isset($_SESSION['token'])) {
$client->setAccessToken($_SESSION['token']);
}
if (isset($_REQUEST['logout'])) {
unset($_SESSION['token']);
$client->revokeToken();
}
if ($client->getAccessToken()) {
$user = $oauth2->userinfo->get();
// These fields are currently filtered through the PHP sanitize filters.
// See http://www.php.net/manual/en/filter.filters.sanitize.php
$email = filter_var($user['email'], FILTER_SANITIZE_EMAIL);
$img = filter_var($user['picture'], FILTER_VALIDATE_URL);
$personMarkup = "$email<div><img src='$img?sz=50'></div>";
// The access token may have been updated lazily.
$_SESSION['token'] = $client->getAccessToken();
} else {
$authUrl = $client->createAuthUrl();
}
?>
<!doctype html>
<html>
<head><meta charset="utf-8"></head>
<body>
<header><h1>Google UserInfo Sample App</h1></header>
<?php if(isset($personMarkup)): ?>
<?php print $personMarkup ?>
<?php endif ?>
<?php
if(isset($authUrl)) {
print "<a class='login' href='$authUrl'>Connect Me!</a>";
} else {
print "<a class='logout' href='?logout'>Logout</a>";
}
?>
</body></html>
Per fare cio' in Php per prima cosa si deve creare una applicazione andando su questa pagina https://code.google.com/apis/console/?api=plus&pli=1
Si crea una nuova applicazione
a questo punto si puo' scaricare da questo link la libreria Php per interfacciarsi con le API di Google
Attenzione: il redirect Url e' l'indirizzo dello script che gestisce l'autenticazione. Normalmente Google richiede che sia un indirizzo in https ma si puo' cambiare anche in http (non come per le API di Facebook)
Si puo' quindi inserire lo script in Php riportato alla fine di questo post per verificare l'uso delle API modificando i campi evidenziati in giallo con le proprie chiavi
A questo punto richiamando l'indirizzo dello script in un browser si avranno le seguenti schermate
Richiesta di login
Verifica dei permessi richiesti dall'applicazione (in questo caso minimali)
Conferma dell'avvenuta autenticazione
<?php
require_once './api/src/Google_Client.php';
require_once './api/src/contrib/Google_Oauth2Service.php';
session_start();
$client = new Google_Client();
$client->setApplicationName("Google UserInfo PHP Starter Application");
$client->setClientId('30253xxxxxx.apps.googleusercontent.com');
$client->setClientSecret('Yq8K0SS-p28tjQxxxxxxxxxx');
$client->setRedirectUri('http://xxxxxx/luca/google/test.php');
$client->setDeveloperKey('AIzaSyDchpWdZDkRtCmdXRANkXjxxxxxxx');
$oauth2 = new Google_Oauth2Service($client);
if (isset($_GET['code'])) {
$client->authenticate($_GET['code']);
$_SESSION['token'] = $client->getAccessToken();
$redirect = 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF'];
header('Location: ' . filter_var($redirect, FILTER_SANITIZE_URL));
return;
}
if (isset($_SESSION['token'])) {
$client->setAccessToken($_SESSION['token']);
}
if (isset($_REQUEST['logout'])) {
unset($_SESSION['token']);
$client->revokeToken();
}
if ($client->getAccessToken()) {
$user = $oauth2->userinfo->get();
// These fields are currently filtered through the PHP sanitize filters.
// See http://www.php.net/manual/en/filter.filters.sanitize.php
$email = filter_var($user['email'], FILTER_SANITIZE_EMAIL);
$img = filter_var($user['picture'], FILTER_VALIDATE_URL);
$personMarkup = "$email<div><img src='$img?sz=50'></div>";
// The access token may have been updated lazily.
$_SESSION['token'] = $client->getAccessToken();
} else {
$authUrl = $client->createAuthUrl();
}
?>
<!doctype html>
<html>
<head><meta charset="utf-8"></head>
<body>
<header><h1>Google UserInfo Sample App</h1></header>
<?php if(isset($personMarkup)): ?>
<?php print $personMarkup ?>
<?php endif ?>
<?php
if(isset($authUrl)) {
print "<a class='login' href='$authUrl'>Connect Me!</a>";
} else {
print "<a class='logout' href='?logout'>Logout</a>";
}
?>
</body></html>
Tastiera Sony VGP-WKB1/1
Recentemente ho acquisito una tastiera Sony VGP-WBB1/1 destinata ad essere cestinata. Si tratta di una tastiera wireless che in origine era accoppiata ad un computer Sony Vaio Desktop All-in-one.
Oltre che essere un oggetto con un design carino (da notare la possibilita' di piegarla a libro per proteggere i tasti) il fatto di avere un trackpad la rende ideale per la Raspberry
Con mia grande ho scoperto che la tastiera e' si' wireless ma non bluetooth. Per farla funzionare e' necessario un ricevitore (proprietario) che era inglobato all'interno del case del computer All-in-one (sembra esistere un ricevitore esterno ma non saprei dove trovarlo) e quindi adesso la tastiera per quanto carina e' sostanzialmente un fermacarte di design...peccato
Oltre che essere un oggetto con un design carino (da notare la possibilita' di piegarla a libro per proteggere i tasti) il fatto di avere un trackpad la rende ideale per la Raspberry
Tastiera aperta |
Tastiera ripiegata |
Con mia grande ho scoperto che la tastiera e' si' wireless ma non bluetooth. Per farla funzionare e' necessario un ricevitore (proprietario) che era inglobato all'interno del case del computer All-in-one (sembra esistere un ricevitore esterno ma non saprei dove trovarlo) e quindi adesso la tastiera per quanto carina e' sostanzialmente un fermacarte di design...peccato
domenica 11 agosto 2013
Finless 1.7 su MK808
La chiavetta MK808 improvvisamente ha deciso di smettere di funzionare. Il difetto e' piuttosto curioso in quanto Android riusciva a caricarsi fino alla schermata di Home ma al momento di lanciare qualsiasi applicazione questa si chiude senza nessun messaggio di errore.
Visto che l'errore sembrava piu' di natura software che hardware ho provato flashando di nuovo il firmware
Frugando per Internet ho visto che e' disponibile una versione per Android 4.2 a questo link
La procedura di installazione prevede di mettere il dispositivo in flash mode e cio' si ottiene inserendo una graffetta nel buco del case come da foto sottostante
A questo punto, premendo sulla graffetta (si sente il click del pulsante nascosto sotto al buco) si inserisce un cavo standard USB tra il computer e la MK808 usando l'ingresso OTG (ovviamente deve essere rimosso l'accessorio OTG che permette di collegare le chiavi di memoria USB)
Windows riconosce il nuovo dispositivo ma non ha i driver per cui si deve scaricare il pacchetto RockusbDriver.rar. Al termine si avra' il nuovo device RK30Device
A questo punto tramite il software RKBatchTool e l'immagine scaricata si puo' flashare la MK808
Alla fine il sistema riparte con Android 4.2 ma con una sorpresa non gradita ovvero che la scheda Wifi non funziona...ho scoperto a posteriore a fronte di un case sempre uguale e nessun identificativo vengono prodotti diversi modelli di MK808 con hardware differente
A questo punto sono passato al firmware Finless 1.7 che si scarica da questo link
Flashare il dispositivo e' molto semplice perche' basta lanciare l'applicativo ROM Flash Tool, cliccare sul pulsante ed attendere
Alla fine si ha Android 4.1.1 gia' con i permessi di root e con pochissime applicazioni preinstallate in modo da personalizzare al massimo il dispositivo. C'e' anche un pulsante di shutdown in modo da spengere in modo non brutale l'MK808.
Il sistema adesso e' nuovamente funzionante al 100%
Visto che l'errore sembrava piu' di natura software che hardware ho provato flashando di nuovo il firmware
Frugando per Internet ho visto che e' disponibile una versione per Android 4.2 a questo link
La procedura di installazione prevede di mettere il dispositivo in flash mode e cio' si ottiene inserendo una graffetta nel buco del case come da foto sottostante
Attenzione alla graffetta !! |
A questo punto, premendo sulla graffetta (si sente il click del pulsante nascosto sotto al buco) si inserisce un cavo standard USB tra il computer e la MK808 usando l'ingresso OTG (ovviamente deve essere rimosso l'accessorio OTG che permette di collegare le chiavi di memoria USB)
Windows riconosce il nuovo dispositivo ma non ha i driver per cui si deve scaricare il pacchetto RockusbDriver.rar. Al termine si avra' il nuovo device RK30Device
A questo punto tramite il software RKBatchTool e l'immagine scaricata si puo' flashare la MK808
Alla fine il sistema riparte con Android 4.2 ma con una sorpresa non gradita ovvero che la scheda Wifi non funziona...ho scoperto a posteriore a fronte di un case sempre uguale e nessun identificativo vengono prodotti diversi modelli di MK808 con hardware differente
A questo punto sono passato al firmware Finless 1.7 che si scarica da questo link
Flashare il dispositivo e' molto semplice perche' basta lanciare l'applicativo ROM Flash Tool, cliccare sul pulsante ed attendere
Rom Flash Tool in esecuzione |
Alla fine si ha Android 4.1.1 gia' con i permessi di root e con pochissime applicazioni preinstallate in modo da personalizzare al massimo il dispositivo. C'e' anche un pulsante di shutdown in modo da spengere in modo non brutale l'MK808.
Il sistema adesso e' nuovamente funzionante al 100%
lunedì 5 agosto 2013
Da Debian Wheezy (stable) a Jessie (testing)
Qualche tempo fa, con il passaggio da Wheezy al ramo stable di Debian, tutte le mie installazioni sono passate da testing a stable. Il che va piu' che bene in quanto non ci sono particolari motivi per lamentarsi di Wheezy...in ogni caso ero comunque curioso di mantenere almeno un portatile in modalita' testing per cui ho provato a fare il passaggio
La prima cosa da fare e' modificare il file /etc/apt/sources.list modificando la parte evidenziata in giallo per farlo puntare ai repository testing e quindi a Jessie
----------------------------------------------
deb http://ftp.it.debian.org/debian/ testing main contrib non-free
deb-src http://ftp.it.debian.org/debian/ testing main contrib non-free
deb http://security.debian.org/ testing/updates main
deb-src http://security.debian.org/ testing/updates main
----------------------------------------------
Di seguito si eseguono i due comandi nell'ordine
apt-get update
apt-get dist-upgrade
Inizia un processo piuttosto lungo dipendente dal numero di pacchetti installati. E' praticamente tutto installato ad eccezione di una schermata in cui viene richiesta la rimozione del salvaschermo (da effettuare con un kill)
ed una richiesta di conferma di poter riavviare in automatico i servizi (a cui ho risposto di si)
Dopo circa due ore l'upgrade ha fine (ho avuto solo un piccolo problema su Java Oracle) e si puo' avere conferma digitando
cat /etc/issue
che deve rispondere
Debian GNU/Linux jessie/sid \n \l
in fin dei conti sostanzialmente indolore
per terminare
apt-get clean
apt-get autoremove
per cancellare il pacchetti .deb non piu' utili
La prima cosa da fare e' modificare il file /etc/apt/sources.list modificando la parte evidenziata in giallo per farlo puntare ai repository testing e quindi a Jessie
----------------------------------------------
deb http://ftp.it.debian.org/debian/ testing main contrib non-free
deb-src http://ftp.it.debian.org/debian/ testing main contrib non-free
deb http://security.debian.org/ testing/updates main
deb-src http://security.debian.org/ testing/updates main
----------------------------------------------
Di seguito si eseguono i due comandi nell'ordine
apt-get update
apt-get dist-upgrade
Inizia un processo piuttosto lungo dipendente dal numero di pacchetti installati. E' praticamente tutto installato ad eccezione di una schermata in cui viene richiesta la rimozione del salvaschermo (da effettuare con un kill)
ed una richiesta di conferma di poter riavviare in automatico i servizi (a cui ho risposto di si)
Dopo circa due ore l'upgrade ha fine (ho avuto solo un piccolo problema su Java Oracle) e si puo' avere conferma digitando
cat /etc/issue
che deve rispondere
Debian GNU/Linux jessie/sid \n \l
per terminare
apt-get clean
apt-get autoremove
per cancellare il pacchetti .deb non piu' utili
martedì 30 luglio 2013
Itunes 11.0.4.4.e Proxy Server
Stavo cercando di andare sull'Apple Store da Itunes da una rete che non avevo utilizzato mai per questo scopo quando mi sono imbattuto in un messaggio strano..ovviamente usando Windows perche' su Linux non si fa e basta
vista la presenza di un proxy nella rete ho cercato le impostazioni nei settaggi di ITunes senza successo...leggendo a giro la versione Windows di ITunes non ha queste impostazioni ma le prende direttamente da Internet Explorer
Breve controllo ed i settaggi di rete sono ok e si naviga dal browser di Microsoft.
Ancora un po' di lettura e trovo che ITunes non digerisce i file di configurazione .pac dei client del proxy server...niente male, metto le configurazioni a mano, controllo di essere in grado di navigare ma niente da fare.
A questo punto i casi sono due
1) il proxy mi filtra il traffico che va verso i server Apple di ITunes (sono piu' di uno leggendo i log di rete)
2) ITunes non ne vuole sapere di bucare un proxy server
vista la presenza di un proxy nella rete ho cercato le impostazioni nei settaggi di ITunes senza successo...leggendo a giro la versione Windows di ITunes non ha queste impostazioni ma le prende direttamente da Internet Explorer
Breve controllo ed i settaggi di rete sono ok e si naviga dal browser di Microsoft.
Ancora un po' di lettura e trovo che ITunes non digerisce i file di configurazione .pac dei client del proxy server...niente male, metto le configurazioni a mano, controllo di essere in grado di navigare ma niente da fare.
A questo punto i casi sono due
1) il proxy mi filtra il traffico che va verso i server Apple di ITunes (sono piu' di uno leggendo i log di rete)
2) ITunes non ne vuole sapere di bucare un proxy server
Iscriviti a:
Post (Atom)
Change Detection with structural similarity
L'idea di base e' quella di cercare le differenze tra le due immagini sottostanti Non e' immediatamente visibile ma ci sono dei ...
-
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...