lunedì 11 gennaio 2016

Compilare Apache/Cordova sotto Android Studio/IOS

Per compilare i progetti Cordova su Android ed IOS di solito faccio creare lo scheletro del  codice  a Cordova ma poi intervengo con Android Studio e XCode per le modifiche

Android
Per prima cosa si devono modificare i file

build.gradle  Module:CordovaLIb
build.gradle Module:android

sostituendo mavenCentral() con jcenter()
e risincronizzando il progetto (altrimenti non si compila)




IOS
Un aspetto fastidioso di Cordova su IOS e' che la WebView fa a corprire parte della statusbar.
Per evitare cio' la cosa piu' semplice e' nascondere la status bar aggiungendo a MainViewController.m la funzione

- (BOOL)prefersStatusBarHidden { return YES; }

Pinch to Zoom
Sia la rotazione del display che il pinch to zoom non sono abilitati di default in Cordova (e questo puo' essere molto fastidioso per utenti mobile abituati a questa funzionalita' praticamente ovunque)


Android

In Android devono essere aggiunta alla MainActivity le righe evidenziate in giallo

------------------------------

import android.os.Bundle;import org.apache.cordova.*;import android.webkit.WebSettings;
import android.webkit.WebView;


public class MainActivity extends CordovaActivity
{
    @Override    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        // Set by <content src="index.html" /> in config.xml        loadUrl(launchUrl);        WebView webView = (WebView) appView.getEngine().getView();
        WebSettings ws = webView.getSettings();
        ws.setSupportZoom(true);
        ws.setBuiltInZoomControls(true);
    }
}

------------------------------

IOS
In Ios si deve modificare il file config.xml in modo da abilitare il ViewPortScale

<platform name="ios">
        <allow-intent href="itms:*" />
        <allow-intent href="itms-apps:*" />
        <preference name='EnableViewportScale' value='true'/>
        <preference name='Orientation' value='all'/>
</platform>

fra le altre cose nel medesimo file si puo' abilitare anche l'Orientation 

venerdì 8 gennaio 2016

PlayStore su FireOS

Ho comprato per i bambini un tablet Amazon da 7 pollici per avere troppi pensieri se veniva distrutto in poco tempo dato il costo di circa 60 euro



Non avevo fatto il conto sul tablet Amazon non gira Android ma FireOS, fortemente derivato da Android ma senza i servizi Google, primo tra tutti Google Play

In realta' e' piuttosto semplice installare Google Play sul dispositivo seguendo le indicazioni a questo link
http://www.howtogeek.com/232726/how-to-install-the-google-play-store-on-your-amazon-fire-tablet/
il pacchetto .zip e' nato per Windows ed e' ridondante perche' se uno ha gia' i driver usb e adb e' piuttosto semplice farne a meno di molte cose


leggendo il file .bat e' piuttosto semplice capire che non c'e' bisogno di exploit per installare Google Play su FireOS..basta copiare ed installare gli apk di Google Play (non sono nemmeno necessari i permessi di root)..vedi righe evidenziate in giallo per l'installazione di Google Play ed azzurro per la rimozione dei servizi Amazon

Fra l'altro lo script permette anche di rimuovere gli aggiornamenti OTA e la ricezione delle offerte Amazon (ma cio' e' vietato se si e' acquistato il dispositivo a prezzo scontato a 59.99 euro al posto di 79.99 euro)

Fra le altre cose, nonostante il costo ridotto, il tablet e' una bella macchinetta anche abbastanza veloce che puo' valere la pena di avere
------------------------------------------------------
::visit Rootjunky.com

::Set our Window Title
@title Amazon Fire Tablet Tool

::Set our default parameters
@echo off
color 0b



:menuLOOP

call:header
::Print our header
::call:header

::Load up our menu selections
echo.--------------------------------------------------------------------------------
for /f "tokens=1,2,* delims=_ " %%A in ('"C:/Windows/system32/findstr.exe /b /c:":menu_" "%~f0""') do echo.  %%B  %%C

call:printstatus

set choice=
echo.&set /p choice= Please make a selection or hit ENTER to exit: ||GOTO:EOF
echo.&call:menu_%choice%

GOTO:menuLOOP

:menu_1    ADB Driver Install                 
cls
color 0b
adb kill-server
adb start-server
echo.--------------------------------------------------------------------------------
echo[*] This option will run a program to get your adb drivers
echo[*] installed for your Amazon Fire Tablet exit program when done
echo.--------------------------------------------------------------------------------
echo.
for /f "tokens=1,2,* delims=_ " %%A in ('"C:/Windows/system32/findstr.exe /b /c:":driver_" "%~f0""') do echo.  %%B  %%C
set choice=
echo.&set /p choice= Please make a selection then hit ENTER:
echo.&call:driver_%choice%
color 0b
cls
GOTO:EOF

:driver_1 ADB driver install
cls
color 0b
echo.--------------------------------------------------------------------------------
echo [*] Before continuing, ensure USB debugging is enabled
echo [*] in your Amazon fire 5th gen settings 
echo [*] go to device options then click on serial number 7 times to enable 
echo [*] developer options then in developer options turn on Enable adb option.
echo [*] MAKES SURE YOUR ANTI VERUS IS OFF. 
echo.--------------------------------------------------------------------------------
echo [*] press any key to start adb driver install
pause >nul
echo.--------------------------------------------------------------------------------
start devmgmt.msc
echo [*] Device Manager should open up wait for it. 
echo [*] Find Amazon Fire and right click on it. 
echo [*] Select Properties then Update Driver 
echo [*] "Browse My Computer For Driver Software" 
echo [*] "Let Me Pick from a List of Device Drivers on my Computer
echo [*] choose Have Disk
echo [*] Browse to the usb_drivers fold that is in this tool
echo [*] then click Next NOTE drivers are not signed this is fine. 
echo [*] once installed ADB should find the Amazon Fire Tablet.
echo.--------------------------------------------------------------------------------
echo [*] please run the driver test to make sure drivers work before installing apps
echo.--------------------------------------------------------------------------------
pause
echo [*] RootJunky OUT
set choice=
echo.&set /p choice= hit ENTER to return to start: ||GOTO:EOF
echo.&call:bootsubmenu_%choice%
color 0b
cls
GOTO:EOF

:driver_2  ADB Driver Test
cls
color 0b
adb kill-server
adb start-server
echo [*] Press any key to check if your drivers are installed
echo [*] correctly. 
echo.--------------------------------------------------------------------------------
pause > nul
echo.--------------------------------------------------------------------------------
echo [*] Is there a device listed under list of devices attached?
echo [*] If no then reboot computer and run the driver install option 
echo [*] again then recheck
echo [*] If device serial number listed then drivers are installed.
echo [*] Press any key to continue
echo.--------------------------------------------------------------------------------
adb devices
pause > nul
adb kill-server
echo [*] RootJunky OUT
set choice=
echo.&set /p choice= hit ENTER to return to start: ||GOTO:EOF
echo.&call:bootsubmenu_%choice%
color 0b
cls
GOTO:EOF


:menu_2 Install Google Play store and remove ads from lock screen
cls
color 0b
adb kill-server
adb start-server
echo.--------------------------------------------------------------------------------
echo First you must turn on ADB DEBUGGING in your Amazon fire 5th gen settings 
echo go to device options then click on serial number 7 times to enable 
echo developer options then in developer options turn on Enable adb option.
echo also make sure your drivers are installed 
echo.--------------------------------------------------------------------------------
pause
cls
adb wait-for-devices
echo [*] Installing Google Play Store apps this will take some time
echo.--------------------------------------------------------------------------------
echo [*] Installing app 1 of 4
adb install com.google.android.gms-6.6.03_(1681564-036)-6603036-minAPI9.apk
echo.--------------------------------------------------------------------------------
echo [*] Installing app 2 of 4
adb install GoogleLoginService.apk
echo.--------------------------------------------------------------------------------
echo [*] Installing app 3 of 4
adb install GoogleServicesFramework.apk
adb shell pm grant com.google.android.gms android.permission.INTERACT_ACROSS_USERS
echo.--------------------------------------------------------------------------------
echo [*] Installing app 4 of 4
adb install com.android.vending-5.9.12-80391200-minAPI9.apk
adb shell pm hide com.amazon.kindle.kso
cls
echo [*] all apps installed and permissions set.
echo [*] Also removed the ads from your lock screen.. your welcome
echo [*] please reboot device to fully remove ads then sign into Play store
echo.--------------------------------------------------------------------------------
adb kill-server
pause
color 0b
cls
GOTO:EOF


:menu_3 block OTA updates from Amazon
cls
color 0b
adb kill-server
adb start-server
echo.--------------------------------------------------------------------------------
echo First you must turn on ADB DEBUGGING in your Amazon fire 5th gen settings 
echo go to device options then click on serial number 7 times to enable 
echo developer options then in developer options turn on Enable adb option.
echo also make sure your drivers are installed 
echo.--------------------------------------------------------------------------------
pause
cls
adb wait-for-devices
adb shell pm hide com.amazon.otaverifier
adb shell pm hide com.amazon.device.software.ota
adb shell pm hide com.amazon.settings.systemupdates
echo.--------------------------------------------------------------------------------
echo [*] OTA update have now been blocked to protect root
echo [*] and keep Amazon from patching our exploits 
echo.--------------------------------------------------------------------------------
adb kill-server
pause
color 0b
cls
GOTO:EOF


:menu_4 unblock OTA updates from Amazon
cls
color 0b
adb kill-server
adb start-server
echo.--------------------------------------------------------------------------------
echo First you must turn on ADB DEBUGGING in your Amazon fire 5th gen settings 
echo go to device options then click on serial number 7 times to enable 
echo developer options then in developer options turn on Enable adb option.
echo also make sure your drivers are installed 
echo.--------------------------------------------------------------------------------
pause
cls
adb wait-for-devices
adb shell pm unhide com.amazon.otaverifier
adb shell pm unhide com.amazon.device.software.ota
adb shell pm unhide com.amazon.settings.systemupdates
echo.--------------------------------------------------------------------------------
echo [*] OTA update have now been unblocked
echo [*] and amazon can now auto update your device.
echo.--------------------------------------------------------------------------------
adb kill-server
pause
color 0b
cls
GOTO:EOF



:header  
cls        
color 0e
echo.[////////////////////////////      //////////            //////////////////////]                                                                           
echo.[///////////////////////////  ///   //////////////  ///////////////////////////]                                                                            
echo.[//////////////////////////  ////  //////////////  ////////////////////////////]                                                                    
echo.[/////////////////////////  //   ///////////////  /////////////////////////////]                                       
echo.[////////////////////////  ////  /////////  ///  //////////////////////////////]                                  
echo.[///////////////////////  //////  /////////    ////////////////////////////////]
echo.            RootJunkys Amazon Fire Tablet Google Play store Install
echo.             Huge thanks to SD-Shadow for his work on this device.
echo.--------------------------------------------------------------------------------
echo.
adb kill-server
adb start-server
echo.--------------------------------------------------------------------------------
adb devices
timeout 5 > nul
adb kill-server
cls
color 0b
GOTO:EOF

:printstatus
echo.
echo. Lets Do This...
echo.--------------------------------------------------------------------------------

GOTO:EOF

------------------------------------------------------

E' possibile fare anche il root del dispositivo come indicato qui
http://rootjunkysdl.com/?device=Amazon%20Fire%205th%20gen&tag=823814-20
ma il modo in cui viene effettuato non e' cosi' banale come nel caso sopra presentato

giovedì 7 gennaio 2016

Scrivere file con Cordova su Android Studio/XCode

Con Apache Cordova e' possibile scrivere dati sulla memoria del dispositivo mobile ma, a causa delle enormi differenze della gestione dello storage nei vari sistemi operativi, non e' possibile avere una soluzione unica ma si devono effettuare adattamenti ad hoc

Per prima cosa si deve aggiungere il plugin File con il comando

cordova plugin add org.apache.cordova.file
IOS
Il filesystem in IOS ovviamente non viene esposto e lo scambio dati avviene solo tramite ITunes



Il progetto Xcode di Cordova deve essere modificato come segue

1) deve essere aggiunto una chiave file info.plist
Application supports Itunes file sharing = YES
(UIFileSharingEnabled = YES)


2) deve essere aggiunto al file config.xml (dopo gli allow) il seguente codice
-------------
    <feature name="File">
        <param name="ios-package" value="CDVFile" />
    </feature>
    <feature name="FileTransfer">
        <param name="ios-package" value="CDVFileTransfer" />
    </feature>
    <preference name="iosPersistentFileLocation" value="Library" />
    <preference name="BackupWebStorage" value="local" />
-------------

3) il codice HTML5 deve essere leggermente modificato rispetto agli esempi di Cordova (in particolare si deve puntare sulla directory Documents che su IOS e' persistente ed in lettura/scrittura. Per un esempio si puo' leggere anche questo post
-------------
/* globals console,document,window,cordova */
document.addEventListener('deviceready', onDeviceReady, false);

var logOb;

function fail(e) {
    console.log("FileSystem Error");
    console.dir(e);
}

function onDeviceReady() {
    
    window.resolveLocalFileSystemURL(cordova.file.documentsDirectory, function(dir) {
                                     console.log("got main dir",dir);
                                     dir.getFile("log.txt", {create:true}, function(file) {
                                                 console.log("got the file", file);
                                                 logOb = file;
                                                 writeLog("App started");
                                                 });
                                     });
    
    document.querySelector("#actionOne").addEventListener("touchend", function(e) {
                                                          //Ok, normal stuff for actionOne here
                                                          //
                                                          //Now log it
                                                          alert("tasto 1");
                                                          writeLog("actionOne fired");
                                                          }, false);
    
    document.querySelector("#actionTwo").addEventListener("touchend", function(e) {
                                                          //Ok, normal stuff for actionTwo here
                                                          //
                                                          //Now log it
                                                          alert("tasto 2");

                                                          writeLog("actionTwo fired");
                                                          }, false);
    
}

function writeLog(str) {
    if(!logOb) {
        alert("errore write log");
            return;
            }
    var log = str + " [" + (new Date()) + "]\n";
    console.log("going to log "+log);
    alert("Luca");
    logOb.createWriter(function(fileWriter) {
                       
                       fileWriter.seek(fileWriter.length);
                       alert("Luca");
                       
                       var blob = new Blob([log], {type:'text/plain'});
                       fileWriter.write(blob);
                       console.log("ok, in theory i worked");
                       }, fail);
}

function justForTesting() {
    logOb.file(function(file) {
               var reader = new FileReader();
               
               reader.onloadend = function(e) {
               console.log(this.result);
               };
               
               reader.readAsText(file);
               }, fail);
    

}
-------------


Android

Su Android le cose sono decisamente piu' semplici

si dichiara in config.xml che si vuole usare il plugin
-------------
<feature name="File">
<param name="android-package" value="org.apache.cordova.FileUtils" />
</feature>
<feature name="FileTransfer">
<param name="android-package" value="org.apache.cordova.FileTransfer" />
</feature>
-------------

Si settano in permessi di scrittura in AndroidManifest.xml
-------------
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
-------------

Di nuovo il codice HTML5 dell'esempio di Cordova in cui e' evidenziata in giallo la modifica per Android
-------------
/* globals console,document,window,cordova */
document.addEventListener('deviceready', onDeviceReady, false);

var logOb;

function fail(e) {
console.log("FileSystem Error");
console.dir(e);
}

function onDeviceReady() {

window.resolveLocalFileSystemURL(cordova.file.externalRootDirectory, function(dir) {
console.log("got main dir",dir);
dir.getFile("log.txt", {create:true}, function(file) {
console.log("got the file", file);
logOb = file;
writeLog("App started");
});
});

document.querySelector("#actionOne").addEventListener("touchend", function(e) {
//Ok, normal stuff for actionOne here
//
//Now log it
writeLog("actionOne fired");
}, false);

document.querySelector("#actionTwo").addEventListener("touchend", function(e) {
//Ok, normal stuff for actionTwo here
//
//Now log it
writeLog("actionTwo fired");
}, false);

}

function writeLog(str) {
if(!logOb) return;
var log = str + " [" + (new Date()) + "]\n";
console.log("going to log "+log);
logOb.createWriter(function(fileWriter) {

fileWriter.seek(fileWriter.length);

var blob = new Blob([log], {type:'text/plain'});
fileWriter.write(blob);
console.log("ok, in theory i worked");
}, fail);
}

function justForTesting() {
logOb.file(function(file) {
var reader = new FileReader();

reader.onloadend = function(e) {
console.log(this.result);
};

reader.readAsText(file);
}, fail);

}
-------------

giovedì 31 dicembre 2015

Linux in ChormeOS con Crouton

Dopo aver installato ChromeOS su Samsung N150 (ed averne notato i limiti) ho provato ad usare crouton, un metodo per mettere in esecuzione Linux su ChromeOS dentro un chjail

Dato che non si tratta di un vero hardware Chromebook non e' stato necessario entrare in modalita' Developer

Linux in esecuzione su ChromeOS

Per installare crouton si procede scaricando lo script al seguente indirizzo https://goo.gl/fd3zc
Si digita da dentro il browser CTRL+ALT+T che apre una crosh shell. Si digita quindi

shell

e si lancia lo script

sudo sh ~/Downloads/crouton -t xfce -t core -t cli-extra
(la password e' password su ChromiumOs)

in questo modo viene lanciata l'installazione che dura oltre mezz'ora e che installa una Ubuntu Precise Pangoline con XFCE come desktop. Al termine dell'installazione vengono richiesti username e password dell'utente Ubuntu

sudo sh ~/Downloads/crouton -t xfce -t core or -t cli-extra

al termine ho provato a lanciare X con il comando
sudo startxfce4
ma ho ricevuto l'errore di No Screen Found. Questo e' un problema che si riscontra anche sui veri Chromebook. Su Internet ci sono molte soluzioni proposte ma nessuna ha funzionato
Ho quindi digitato
sudo startcli
e mi sono ritrovato nella shell di Ubuntu

Per spostarsi da Linux a ChromeOS si dovrebbe usare la combinazione ctrl+alt+shift+function+f1/f2 ma per me la combinazione non ha funzionato (cui veri Chromebook ci sono due tasti speciali che svolgono questa funzione)

Per montare il solo chroot si puo' digitare
sudo enter-chroot

Debris Flow con OpenPIV

Ogni tanto mi ricordo di aver una laurea (ops..un dottorato) in geologia e cerco di applicare qualche idea piu' strettamente informatica al campo geologico.

Un amico vulcanologo (Sebastien Valade) mi ha mostrato un sistema per calcolare il campo di velocita' di un flusso di lava semplicemente da una immagine ottica di una comune telecamera.Mi si e' accesa una lampadina che la stessa cosa poteva essere applicata anche alle frane ed in particolare ai debris flow

La teoria che sta dietro all'interpretazione delle immagini rientra nella categoria del Particle Image Velocimetry (qui la pagina wikipedia) . In estrema sintesi vengono ricercate le porzioni omologhe di due fotogrammi vicini nel tempo per calcolare il campo del vettore spostamento..detto cosi' e' banale ma la pratica e' decisamente differente

Per prova ho preso da Youtube una decina di fotogrammi di questo filmato che ritrare un debris flow in Cancia il 25 luglio 2015


Debris flow Cancia (Italy) 23/07/2015

I fotogrammi sono stati presi scaricando il video in formato mp4 da Youtube mediante una estensione di Firefox e poi avanzando fotogramma per fotogramma (tasto E)  e salvando il frame (Shif+S) con VLC 

I frame sono distanziati di due secondi 

Ho provato ad elaborare i frame per coppie successive (1-2, 2-3,3-4) con il primo esempio di tutorial in Python di OpenPIV

oppure usando un programma in Matlab (decisamente piu' complesso e completo) chiamato PIVLab


Non e' stata fatta alcuna calibrazione sul valore vero della velocita', si tratta solo di una prova di fattibilita' e, specialmente nel secondo caso, sembra funzionare

So long and thanks for all the fish

Grazie per aver contribuito a creare la "palestra" in cui ho imparato un po' di informatica

Ian Murdock (1973-2015), fondatore di Debian

mercoledì 30 dicembre 2015

OpenPIV su Ubuntu 15.10

OpenPIV e' un sistema di analisi di immagini che permette di calcolare il campo di velocita' di un sistema di particelle




per l'installazione su Ubuntu 15.10 si devono risolvere prima alcune dipendenze

apt-get install python-progressbar
apt-get install python-pip
apt-get install python-scipy
apt-get install python-numpy
apt-get install cython
pip install scikit-image (altrimenti apt-get install python-skimage)

dopo cio' si scarica il sorgente da GitHub  e si lancia l'installazione con il classico

python setup.py install

al momento di lanciare il primo esempio (tutorial-part1.py) sono incorso in un errore in fase di importazione del modulo filters di skimage. La soluzione e' piuttosto semplice: il modulo skimage ha modificato il nome del sottomodulo filters in filter (senza la s finale)


/usr/local/lib/python2.7/dist-packages/OpenPIV-0.20.1-py2.7-linux-x86_64.egg/openpiv/preprocess.py
/usr/local/lib/python2.7/dist-packages/OpenPIV-0.20.1-py2.7-linux-x86_64.egg/openpiv/tools.py

basta andare a modificare i file sotto indicati e modificare togliendo la s finale alla riga dell'import
from skimage.filter import....

e tutto inizia a funzionare

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...