Oggi mi e' arrivato questo SMS apparentemente proveniente dalla mia banca
ho cliccato sul link e si e' aperta una pagina con la richiesta di inserire le credenziali perche' il conto era stato limitato. Da cellulare la schermata era questa
Mi sono insospettito della URL ripristino-datiweb.com e mi sono spostato sul PC.
Una volta copiata la URL (https://ripristino-datiweb.com/verificapsd2/it/persone-e-famiglie/login-page.php?&sessionid=74c7228a6ce06a2603aa2b54e3237a8a&securessl=true) il browser mi reindirizzava in automatico a Google.com e non vedevo la schermata di login del cellulare
Lanciando la URL https://ripristino-datiweb.com la pagina era bianca con la sola scritta "Nice try :-("
(nessun altro codice ne' html ne' javascript)
Tra le altre cose sembra che il redirect basato sull'UserAgent sia gestito direttamente da Apache e non da una pagina web via Javascript con qualche regola del tipo quella indicata a questo sito
una ricerca sul whois riportata che la registrazione del sito e' su GoDaddy ed e' stato creato oggi
Domain Name: RIPRISTINO-DATIWEB.COM
Registry Domain ID: 2509476000_DOMAIN_COM-VRSN
Registrar WHOIS Server: whois.godaddy.com
Registrar URL: http://www.godaddy.com
Updated Date: 2020-03-31T16:07:06Z
Creation Date: 2020-03-31T16:07:06Z
Registry Expiry Date: 2021-03-31T16:07:06Z
Registrar: GoDaddy.com, LLC
Registrar IANA ID: 146
Registrar Abuse Contact Email: abuse@godaddy.com
martedì 31 marzo 2020
sabato 28 marzo 2020
QTSensors su Ubuntu Touch (UBPorts) in QML
Visto che sto imparando a programmare UBPorts ho voluto provare a convertire questo progetto Android/Kotlin per QML. In pratica si tratta di leggere i valori dell'accelerometro e, ad intervalli regolari, inviare i dati ad server web con una richiesta GET
Per abilitare l'utilizzo della rete nella app si deve modificare il file apparmor
apparmor
===========================================
Main.qml
===========================================
/*
* Copyright (C) 2020 Your FullName
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; version 3.
*
* ubuntu-calculator-app is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
import QtQuick 2.7
import Ubuntu.Components 1.3
//import QtQuick.Controls 2.2
import QtQuick.Layouts 1.3
import Qt.labs.settings 1.0
import QtSensors 5.0
MainView {
id: root
objectName: 'mainView'
applicationName: 'acc2.luca.innocenti'
automaticOrientation: true
// variabili globali
readonly property double radians_to_degrees: 180 / Math.PI
property double pitch: 0.0
property double roll: 0.0
width: units.gu(45)
height: units.gu(75)
// un evento ogni 5 secondi
Timer {
interval: 5000
running: true
repeat: true
onTriggered: {
console.log("Timer")
var xmlHttp = new XMLHttpRequest();
xmlHttp.open("GET", "http://192.168.1.102/index.php?pitch="+pitch.toFixed(3)+"&roll="+roll.toFixed(3), true); // false for synchronous request
xmlHttp.send();
}
}
Accelerometer {
id: accel
dataRate: 100
active:true
onReadingChanged: {
var x = accel.reading.x
var y = accel.reading.y
var z = accel.reading.z
pitch = calcPitch(x,y,z)
roll = calcRoll (x,y,z)
//etichetta.text=""+accel.reading.x+"\n"+accel.reading.y+"\n"+accel.reading.z
etichetta.text = "Pitch : "+pitch.toFixed(1)+"\nRoll : "+roll.toFixed(1)
function calcPitch(x,y,z) {
return Math.atan2(y, z)*radians_to_degrees;
}
function calcRoll(x,y,z) {
return Math.atan2(-x, Math.sqrt((y*y)+(z*z)))*radians_to_degrees;
}
}
}
Page {
anchors.fill: parent
header: PageHeader {
id: header
title: i18n.tr('acc2')
}
Label {
anchors {
top: header.bottom
left: parent.left
right: parent.right
bottom: parent.bottom
}
id: etichetta
text: i18n.tr('Luca')
verticalAlignment: Label.AlignVCenter
horizontalAlignment: Label.AlignHCenter
}
}
}
Per abilitare l'utilizzo della rete nella app si deve modificare il file apparmor
apparmor
===========================================
{
"policy_groups": ["networking"],
"policy_version": 16.04
}
===========================================
Main.qml
===========================================
/*
* Copyright (C) 2020 Your FullName
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; version 3.
*
* ubuntu-calculator-app is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
import QtQuick 2.7
import Ubuntu.Components 1.3
//import QtQuick.Controls 2.2
import QtQuick.Layouts 1.3
import Qt.labs.settings 1.0
import QtSensors 5.0
MainView {
id: root
objectName: 'mainView'
applicationName: 'acc2.luca.innocenti'
automaticOrientation: true
// variabili globali
readonly property double radians_to_degrees: 180 / Math.PI
property double pitch: 0.0
property double roll: 0.0
width: units.gu(45)
height: units.gu(75)
// un evento ogni 5 secondi
Timer {
interval: 5000
running: true
repeat: true
onTriggered: {
console.log("Timer")
var xmlHttp = new XMLHttpRequest();
xmlHttp.open("GET", "http://192.168.1.102/index.php?pitch="+pitch.toFixed(3)+"&roll="+roll.toFixed(3), true); // false for synchronous request
xmlHttp.send();
}
}
Accelerometer {
id: accel
dataRate: 100
active:true
onReadingChanged: {
var x = accel.reading.x
var y = accel.reading.y
var z = accel.reading.z
pitch = calcPitch(x,y,z)
roll = calcRoll (x,y,z)
//etichetta.text=""+accel.reading.x+"\n"+accel.reading.y+"\n"+accel.reading.z
etichetta.text = "Pitch : "+pitch.toFixed(1)+"\nRoll : "+roll.toFixed(1)
function calcPitch(x,y,z) {
return Math.atan2(y, z)*radians_to_degrees;
}
function calcRoll(x,y,z) {
return Math.atan2(-x, Math.sqrt((y*y)+(z*z)))*radians_to_degrees;
}
}
}
Page {
anchors.fill: parent
header: PageHeader {
id: header
title: i18n.tr('acc2')
}
Label {
anchors {
top: header.bottom
left: parent.left
right: parent.right
bottom: parent.bottom
}
id: etichetta
text: i18n.tr('Luca')
verticalAlignment: Label.AlignVCenter
horizontalAlignment: Label.AlignHCenter
}
}
}
QML Mandelbrot in UBPorts / Ubuntu Touch
Ovviamente, visto che mi sono messo a studiare UBPorts, non poteva mancare un porting di Mandelbrot. La prima scelta e' stata QML che in pratica e' un sottoinsieme di HTML5 per quanto riguarda il codice
Il progetto completo in Clickable si trova a questo link
https://github.com/c1p81/lucainnoc-gmail.com
Piccola nota: il progetto e' dannatamente lento
Le icone nel progetto sono in formato .svg (Gimp non supporta direttamente questo formato)
Il progetto completo in Clickable si trova a questo link
https://github.com/c1p81/lucainnoc-gmail.com
Piccola nota: il progetto e' dannatamente lento
Le icone nel progetto sono in formato .svg (Gimp non supporta direttamente questo formato)
===================================================================
/*
* Copyright (C) 2020 Your FullName
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; version 3.
*
* ubuntu-calculator-app is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
import QtQuick 2.7
import Ubuntu.Components 1.3
//import QtQuick.Controls 2.2
import QtQuick.Layouts 1.3
import Qt.labs.settings 1.0
import QtQuick.Window 2.2
MainView {
id: root
objectName: 'mainView'
applicationName: 'pixel.luca.innocenti'
automaticOrientation: true
width: Screen.width
height: Screen.height
Page {
anchors.fill: parent
header: PageHeader {
id: header
title: i18n.tr('Mandelbrot QML')
}
Canvas {
id: canvas
width: Screen.width
height: Screen.height
onPaint: {
var context=canvas.getContext("2d")
context.fillStyle="rgb(0,0,0)";
context.fillRect(0, 0, width, height);
var re_min = -2.0;
var im_min = -1.2;
var re_max = 0.7;
var im_max = 1.2;
var iterazioni = 25;
var colori = ["#FFFFFF","#FF0000","#00FF00","#0000FF","#FF00FF","#FFFF00","#00FFFF","#FFaa00","#abcedf","#fedc0a","#ab16dd","#d00fba","#edabcc","#ddacff"];
var r;
var a,b;
var x,y,x_new,y_new;
var test;
var k,j,i;
var re_factor = (re_max-re_min);
var im_factor = (im_max-im_min);
for (var i=0;i<width;i++)
{
for (var j=0;j<height;j++)
{
a = re_min+(j*re_factor/height);
b = im_min+(i*im_factor/width);
x = 0;
y = 0;
test = 0;
for (var k=0;k<iterazioni;k++)
{
x_new = (x*x)-(y*y)+a;
y_new = (2*x*y)+b;
if (((x_new*x_new)+(y_new*y_new))>4)
{
// colora il punto
r = k%12;
context.beginPath();
context.fillRect(i-1,j-1,1,1);
context.fillStyle=colori[r];
context.stroke();
break;
}
x = x_new;
y = y_new;
}
}
}
}
}
}
}
giovedì 26 marzo 2020
Log su Ubuntu Touch (Ubports)
Uno degli aspetti piu' critici per sviluppare le applicazione UBPorts con Clickable e' riuscire a fare il debug. La cosa piu' semplice e' loggarsi in SSH in shell sul tablet ed andare nella directory
/home/phablet/.cache/upstart
in questa directory ci sono i file di log. Il file di log per esempio della applicazione acc2.luca.innocenti sviluppata con Clickable avra' un nome file del tipo application-click-{nome_app}.{versione}.log ovvero
application-click-acc2.luca.innocenti_acc2_1.0.0.log
Altrimenti si puo' usare la app LogViewer https://open-store.io/app/logviewer.neothethird ma l'uso e' decisamente piu' scomodo (e con molto meno dettaglio)
/home/phablet/.cache/upstart
in questa directory ci sono i file di log. Il file di log per esempio della applicazione acc2.luca.innocenti sviluppata con Clickable avra' un nome file del tipo application-click-{nome_app}.{versione}.log ovvero
application-click-acc2.luca.innocenti_acc2_1.0.0.log
Altrimenti si puo' usare la app LogViewer https://open-store.io/app/logviewer.neothethird ma l'uso e' decisamente piu' scomodo (e con molto meno dettaglio)
mercoledì 25 marzo 2020
Linux Alpine su Ipad
Uno dei miei sogni e' diventato realta', una distribuzione Linux, seppur minima, che gira direttamente su Ipad
Per usare al meglio iSh e' quasi obbligatorio l'uso della tastiera fisica
Il progetto si chiama https://ish.app/ e fa girare una ambiente Alpine Linux in shell con la possibilita' di installare software tramite apk (sono attivi solo i repository main e community, non il world)
il programma e' open source e si puo' installare al momento tramite TestFlight
Per usare al meglio iSh e' quasi obbligatorio l'uso della tastiera fisica
Il progetto si chiama https://ish.app/ e fa girare una ambiente Alpine Linux in shell con la possibilita' di installare software tramite apk (sono attivi solo i repository main e community, non il world)
il programma e' open source e si puo' installare al momento tramite TestFlight
Editor Nano |
Apk |
martedì 24 marzo 2020
Cambio della batteria IPhone SE con sorpresa
Viste le pessime condizioni della batteria del mio Iphone SE mi sono deciso a prendere il coraggio a due mani e provare a sostituire la batteria. Ho visto un po' di tutorial (iFixIt per primo) ed ho iniziato.
Appena sollevato lo schermo con la ventosa la sorpresa....il pulsante Home non si e' sollevato assieme
allo schermo (come era previsto)
ed al di sotto dello schermo non si vede la batteria ma c'e' una placca metallica che ricopre sia la batteria che tutta l'elettronica
Per scrupolo ho riacceso e si'....il software conferma che si tratta di un Iphone SE
Questo e' cio' che mi sarei dovuto trovare davanti
Come si vede lo schermo di un Iphone originale ha una serie di gancetti ed il pulsante Home rimane solidale con lo schermo
Questi Iphone lo ho comprato anni fa ricondizionato su Ebay ed ha sempre funzionato in modo corretto...mi sa che quanto meno lo schermo era stato sostituito ma non escludo anche altre parti
Quando la batteria morira' del tutto allora ci riprovero' ma per adesso ho rimontato tutto per non fare danni irreversibili (del resto la batteria le sue 15 ore le regge)
Appena sollevato lo schermo con la ventosa la sorpresa....il pulsante Home non si e' sollevato assieme
allo schermo (come era previsto)
ed al di sotto dello schermo non si vede la batteria ma c'e' una placca metallica che ricopre sia la batteria che tutta l'elettronica
Per scrupolo ho riacceso e si'....il software conferma che si tratta di un Iphone SE
Questo e' cio' che mi sarei dovuto trovare davanti
Come si vede lo schermo di un Iphone originale ha una serie di gancetti ed il pulsante Home rimane solidale con lo schermo
Questi Iphone lo ho comprato anni fa ricondizionato su Ebay ed ha sempre funzionato in modo corretto...mi sa che quanto meno lo schermo era stato sostituito ma non escludo anche altre parti
Quando la batteria morira' del tutto allora ci riprovero' ma per adesso ho rimontato tutto per non fare danni irreversibili (del resto la batteria le sue 15 ore le regge)
lunedì 23 marzo 2020
Errore Pitch, Roll, Azimuth su Android Nexus 5
Volevo fare un po' di test sull'accuratezza dei dati degli accelerometri di un telefono (nello specifico un Nexus 5) e per fare cio' mi sono scritto questa applicazione in Kotlin che cerca di disabilitare il Doze Mode per fare lavorare in continuo la app
Di seguito i risultati
Ogni punto sul grafico e' dato dalla media di 20000 misure ed e' rappresentativo di circa 7.5 minuti
Misura 1
nr punti : 144
durata minuti : 1080
Std.dev pitch : 0.33 gradi decimali
Std.dev roll : 0.36 gradi decimali
St.dev azimuth : 0.65 gradi decimali
Misura 2
nr punti : 39
durata minuti : 273
Std.dev pitch : 0.1 gradi decimali
Std.dev roll : 0.09 gradi decimali
St.dev azimuth : 0.067 gradi decimali
Misura 3
nr punti : 122
durata minuti : 812
Std.dev pitch : 0.19 gradi decimali
Std.dev roll : 0.17 gradi decimali
St.dev azimuth : 0.1 gradi decimali
Misura 4
nr punti : 84
durata minuti : 574
Std.dev pitch : 0.4 gradi decimali
Std.dev roll : 0.14 gradi decimali
St.dev azimuth : 0.21 gradi decimali
In generale la standard deviation rimane sotto (anche abbondantemente) a 0.5 gradi decimali.. non male
L'unico aspetto che mi ha lasciato un po' perplesso e' il fatto che durante la prova 4 le misure evidenziano un chiaro trend crescente
Di seguito i risultati
Ogni punto sul grafico e' dato dalla media di 20000 misure ed e' rappresentativo di circa 7.5 minuti
Misura 1
nr punti : 144
durata minuti : 1080
Std.dev pitch : 0.33 gradi decimali
Std.dev roll : 0.36 gradi decimali
St.dev azimuth : 0.65 gradi decimali
Misura 2
nr punti : 39
durata minuti : 273
Std.dev pitch : 0.1 gradi decimali
Std.dev roll : 0.09 gradi decimali
St.dev azimuth : 0.067 gradi decimali
Misura 3
nr punti : 122
durata minuti : 812
Std.dev pitch : 0.19 gradi decimali
Std.dev roll : 0.17 gradi decimali
St.dev azimuth : 0.1 gradi decimali
Misura 4
nr punti : 84
durata minuti : 574
Std.dev pitch : 0.4 gradi decimali
Std.dev roll : 0.14 gradi decimali
St.dev azimuth : 0.21 gradi decimali
In generale la standard deviation rimane sotto (anche abbondantemente) a 0.5 gradi decimali.. non male
L'unico aspetto che mi ha lasciato un po' perplesso e' il fatto che durante la prova 4 le misure evidenziano un chiaro trend crescente
domenica 22 marzo 2020
Ubuntu Touch su Nexus 7 2 gen
Mi ero gia' occupato oramai molti anni fa del progetto Ubuntu Touch (all'epoca Ubuntu for phones) piu' che altro perche' lo sviluppo era legato a Qt.
Per installare Ubuntu Touch sui dispositivi supportati la soluzione piu' semplice e' utilizzare UBPorts Installer
Per avere la taskbar si deve fare swipe da sinistra a destra, per avere l'elenco delle applicazioni aperte swipe da sinistra a destra (swipe lento cicla tra le app, swipe veloce fa vedere tutte le app aperte)
Lo screenshot corrisponde alla pressione contemporanea dei due tasti del volume
Le applicazioni si installano da OpenStore
La mancanza di software e' abbastanza devastante!!
Per disinstallare una app si preme a lungo l'icona, si aprira' una nuova finestra con l'opzione rimozione
Per abilitare la connessione SSH con il tablet si digita sul computer
ssh-keygen
poi si copiano le chiavi sul tablet
adb push ~/.ssh/id_rsa.pub /home/phablet/
sempre sul tablet si copiano le chiavi
mkdir /home/phablet/.ssh
Per installare si procede con il seguente codice
pip3 install git+https://gitlab.com/clickable/clickable.git
si deve poi mettere in Path la directory $HOME/.local/bin e si deve avere in Path anche Adb
The scripts futurize and pasteurize are installed in '/home/luca/.local/bin' which is not on PATH.
Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location.
The script cookiecutter is installed in '/home/luca/.local/bin' which is not on PATH.
Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location.
The script jsonschema is installed in '/home/luca/.local/bin' which is not on PATH.
Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location.
The script clickable is installed in '/home/luca/.local/bin' which is not on PATH.
Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location.
Per installare Ubuntu Touch sui dispositivi supportati la soluzione piu' semplice e' utilizzare UBPorts Installer
Per avere la taskbar si deve fare swipe da sinistra a destra, per avere l'elenco delle applicazioni aperte swipe da sinistra a destra (swipe lento cicla tra le app, swipe veloce fa vedere tutte le app aperte)
Swipe da destra |
Swipe da sinistra |
Lo screenshot corrisponde alla pressione contemporanea dei due tasti del volume
Le applicazioni si installano da OpenStore
La mancanza di software e' abbastanza devastante!!
Per disinstallare una app si preme a lungo l'icona, si aprira' una nuova finestra con l'opzione rimozione
Per abilitare la connessione SSH con il tablet si digita sul computer
ssh-keygen
poi si copiano le chiavi sul tablet
adb push ~/.ssh/id_rsa.pub /home/phablet/
sempre sul tablet si copiano le chiavi
mkdir /home/phablet/.ssh
chmod 700 /home/phablet/.ssh
cat /home/phablet/id_rsa.pub >> /home/phablet/.ssh/authorized_keys
chmod 600 /home/phablet/.ssh/authorized_keys
chown -R phablet.phablet /home/phablet/.ssh
sudo android-gadget-service enable ssh
A questo punto per collegarsi via rete si prende l'ip del tablet e si entra in SSH
ssh phablet@ip_address
Per editare direttamente sul tablet via cavo USB si puo' usare semplicemente
ssh phablet@ip_address
Per editare direttamente sul tablet via cavo USB si puo' usare semplicemente
adb shell
La password di root della shell e' il codice PIN
Si puo' effettuare un mirror dello schermo del tablet sul pc tramite il comando
adb exec-out timeout 120 mirscreencast -m /run/mir_socket --stdout --cap-interval 2 -s 384 640 | mplayer -demuxer rawvideo -rawvideo w=384:h=640:format=rgba -
Si puo' effettuare un mirror dello schermo del tablet sul pc tramite il comando
adb exec-out timeout 120 mirscreencast -m /run/mir_socket --stdout --cap-interval 2 -s 384 640 | mplayer -demuxer rawvideo -rawvideo w=384:h=640:format=rgba -
Per programmare UBPorts non si usa piu' Ubuntu SDK ma si utilizza Clickable
Per installare si procede con il seguente codice
pip3 install git+https://gitlab.com/clickable/clickable.git
si deve poi mettere in Path la directory $HOME/.local/bin e si deve avere in Path anche Adb
The scripts futurize and pasteurize are installed in '/home/luca/.local/bin' which is not on PATH.
Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location.
The script cookiecutter is installed in '/home/luca/.local/bin' which is not on PATH.
Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location.
The script jsonschema is installed in '/home/luca/.local/bin' which is not on PATH.
Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location.
The script clickable is installed in '/home/luca/.local/bin' which is not on PATH.
Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location.
Sul tablet si devono abilitare i permessi da sviluppatore da Impsotazioni/Informazioni/Modalita' sviluppatore/ (ATTENZIONE: la modalita' sviluppatore non si puo' abilitare se non e' stato impostato un blocco schermo per esempio con Pin Code)
a questo punto per creare un progetto si usa
clickable create
attenzione: per le voci AppName e Namespace non possono essere usati caratteri speciali (sono ammessi caratteri alfabetici ed il punto)
Per testare la applicazione si puo' digitare
clickable desktop
altrimenti con il solo clickable si effettua l'upload sul tablet
Come IDE si puo' usate l'editor Atom con il plugin https://atom.io/packages/atom-build-clickable
e selezionare la directory del progetto
Per compilare e lanciare la app sul tablet si preme F9. Se si preme F7 si puo' scegliere come target il desktop od il tablet.
attenzione : al momento di compilare il progetto viene effettuato il download di un docker con una immagine di Ubuntu 16.04 quindi c'e' necessita' di spazio disco e connessione di rete
Un libro di riferimento per la programmazione si trova a questo link
https://legacy.gitbook.com/book/mimecar/ubuntu-touch-programming-course/details
a questo punto per creare un progetto si usa
clickable create
attenzione: per le voci AppName e Namespace non possono essere usati caratteri speciali (sono ammessi caratteri alfabetici ed il punto)
Per testare la applicazione si puo' digitare
clickable desktop
altrimenti con il solo clickable si effettua l'upload sul tablet
Applicazione Python in esecuzione su desktop |
La stessa applicazione in esecuzione sul tablet |
Come IDE si puo' usate l'editor Atom con il plugin https://atom.io/packages/atom-build-clickable
e selezionare la directory del progetto
Per compilare e lanciare la app sul tablet si preme F9. Se si preme F7 si puo' scegliere come target il desktop od il tablet.
attenzione : al momento di compilare il progetto viene effettuato il download di un docker con una immagine di Ubuntu 16.04 quindi c'e' necessita' di spazio disco e connessione di rete
Un libro di riferimento per la programmazione si trova a questo link
https://legacy.gitbook.com/book/mimecar/ubuntu-touch-programming-course/details
Database su Android con Room e Kotlin
Il nuovo approccio per avere un database persistente su Android e' quello di utilizzare Room
Per integrare la libreria nel progetto Android si deve modificare il file build.gradle (app) aggiungendo il plugin kapt in testa
Per integrare la libreria nel progetto Android si deve modificare il file build.gradle (app) aggiungendo il plugin kapt in testa
apply plugin: 'com.android.application'apply plugin: 'kotlin-android'apply plugin: 'kotlin-android-extensions'apply plugin: 'kotlin-kapt'
ed aggiungendo le seguenti dipendenze (questo sono le dipendenze per Kotlin, nel caso di uso di Java la terza riga, quella che inizia con kapt, deve essere sostituita con
annotationProcessor "androidx.room:room-compiler:$room_version"
La gestione delle chiamate Rooms avviene per SQL
In sintesi viene definito il tracciato record del database. Da notare che non sono esplicitamente previsti campi DateTime; per questo motivo uso lo Unix Time come Long
Il nome dell'unica tabella e' nome_tabella
Le query sono incluse nella sezione DAO. Ogni query riporta un int che dice quante righe sono state interessate dalla query stessa
Nella sezione Database viene collegata la tabella al Db
Attenzione: se si cambia il tracciato record deve essere modificato il numero di versione del Db
Il nome del file e' inserito in DatabaseBuilder
Le query vengono gestite all'interno di coroutine
Per copiare il database dal telefono al PC si puo' usare
adb -d shell "run-as com.luca.innocenti.roomdb cat /data/data/com.luca.innocenti.roomdb/databases/sensori.db" > /home/luca/room.db
dove com.luca.innocenti.roomdb e' il nome del package mentre sensori.db e' il nome del file
database sul telefono
Altrimenti da Android Studio si va su View/Tool Windows/Device File Explorer
Per leggere il file su desktop si puo' utilizzare DB Browser for SQLite
==============================
def room_version = "2.2.5" implementation "androidx.room:room-runtime:$room_version"kapt "android.arch.persistence.room:compiler:$room_version" // optional - Kotlin Extensions and Coroutines support for Roomimplementation "androidx.room:room-ktx:$room_version" // Test helperstestImplementation "androidx.room:room-testing:$room_version" annotationProcessor "android.arch.persistence.room:compiler:1.0.0"
La gestione delle chiamate Rooms avviene per SQL
In sintesi viene definito il tracciato record del database. Da notare che non sono esplicitamente previsti campi DateTime; per questo motivo uso lo Unix Time come Long
Il nome dell'unica tabella e' nome_tabella
Le query sono incluse nella sezione DAO. Ogni query riporta un int che dice quante righe sono state interessate dalla query stessa
Nella sezione Database viene collegata la tabella al Db
Attenzione: se si cambia il tracciato record deve essere modificato il numero di versione del Db
Il nome del file e' inserito in DatabaseBuilder
Le query vengono gestite all'interno di coroutine
Per copiare il database dal telefono al PC si puo' usare
adb -d shell "run-as com.luca.innocenti.roomdb cat /data/data/com.luca.innocenti.roomdb/databases/sensori.db" > /home/luca/room.db
database sul telefono
Altrimenti da Android Studio si va su View/Tool Windows/Device File Explorer
Per leggere il file su desktop si puo' utilizzare DB Browser for SQLite
package com.luca.innocenti.roomdb import android.os.Bundle import android.util.Log import androidx.appcompat.app.AppCompatActivity import androidx.room.* import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.launch class MainActivity : AppCompatActivity() { @Entity(tableName = "nome_tabella") data class TabellaEntity( @PrimaryKey(autoGenerate = true) var id: Int, @ColumnInfo(name = "tempo") var tempo: Long = 0, @ColumnInfo(name = "pitch") var pitch: Float = 0.0f, @ColumnInfo(name = "roll") var roll: Float = 0.0f, @ColumnInfo(name = "azimuth") var azimuth: Float = 0.0f, @ColumnInfo(name = "nota") var nota: String ) @Dao interface DbDao { @Query("SELECT * FROM nome_tabella") fun getAll(): List<TabellaEntity> @Query("SELECT * FROM nome_tabella WHERE nota LIKE :nota") fun findByNota(nota: String): List<TabellaEntity> @Insert fun insertAll(vararg todo: TabellaEntity) @Delete fun delete(todo: TabellaEntity) @Query("DELETE FROM nome_tabella WHERE id = :id") fun getSingleRecordDelete(id: Int): Int @Query("UPDATE nome_tabella SET nota=:nota WHERE id = :indice") fun getSingleRecordUpdate(nota: String, indice: Int): Int @Update fun updateDb(vararg todos: TabellaEntity) } @Database(entities = [TabellaEntity::class], version = 1) abstract class AppDatabase : RoomDatabase() { abstract fun DbDao(): DbDao } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) val db = Room.databaseBuilder( applicationContext, AppDatabase::class.java, "sensori.db" ).build() GlobalScope.launch { db.DbDao().insertAll(TabellaEntity(0,12,13.4f,7.7f,0.3f,"Nota")) db.DbDao().insertAll(TabellaEntity(0,13,13.4f,7.7f,0.3f,"Nota2")) var data = db.DbDao().getAll() data?.forEach { Log.d("test", it.toString()) } var ricerca = db.DbDao().findByNota("Nota") ricerca?.forEach{ Log.d("ricerca", ricerca.toString()) } db.DbDao().getSingleRecordDelete(6) data = db.DbDao().getAll() data?.forEach { Log.d("dopo", it.toString()) } db.DbDao().getSingleRecordUpdate("modifica",6) data = db.DbDao().getAll() data?.forEach { Log.d("dopo", it.toString()) } //db.clearAllTables() db.close() } } }
sabato 21 marzo 2020
Lotta contro CUPS
Visto il periodo mi sono dovuto ricreare l'ufficio in casa, stampante compresa. Ho ritirato fuori quella gia' vista qui e sono iniziati i problemi. Mentre 4 anni fa la avevo installata senza troppi problemi adesso sulla mia Debian testing la stampante si ostina a andare in pausa appena avere ricevuto l'input
I log non sono di aiuto....sembra essere un problema nel passaggio tra Cups e Ghostview. Dopo un vano tentativo di fare un downgrade di Cups ho provato la strada di ricompilare tutto da sorgenti
Prima con apt-get remove ho disinstallato cups e poi compilato da sorgenti (ultima versione disponibile a questo indirizzo)
https://github.com/apple/cups/releases/tag/v2.3.1
Una volta riavviato il servizio
service cups start
ancora errori sul file di log ma questo volta era un problema legato a "Filter failed"
e' stato sufficiente montare questi pacchetti che la stampante ha ripreso vita
apt-get install cups-filters
apt-get install foomatic-db
apt-get install foomatic-db-gutenprint
I log non sono di aiuto....sembra essere un problema nel passaggio tra Cups e Ghostview. Dopo un vano tentativo di fare un downgrade di Cups ho provato la strada di ricompilare tutto da sorgenti
Prima con apt-get remove ho disinstallato cups e poi compilato da sorgenti (ultima versione disponibile a questo indirizzo)
https://github.com/apple/cups/releases/tag/v2.3.1
Una volta riavviato il servizio
service cups start
ancora errori sul file di log ma questo volta era un problema legato a "Filter failed"
e' stato sufficiente montare questi pacchetti che la stampante ha ripreso vita
apt-get install cups-filters
apt-get install foomatic-db
apt-get install foomatic-db-gutenprint
giovedì 19 marzo 2020
p7m e Linux
In questi giorni di telelavoro forzato mi sono trovato a lavorare sul mio portatile personale Linux invece della postazione lavorativa Windows con alcuni problemi legati ad alcuni software. Uno dei problemi e' stato quello di gestire gli allegati della PEC che in ufficio erano gestiti da Dike
Ho trovato una comoda soluzione in ArubaSign. In pratica si scarica l'installer da qui, di decomprime,si cambiano i permessi al file install.bat (che non e' un batch DOS ma uno script Python). Dopo di cio' e' sufficiente trascinare il file p7m su Verify e si puo' estrarre il documento
Ho trovato una comoda soluzione in ArubaSign. In pratica si scarica l'installer da qui, di decomprime,si cambiano i permessi al file install.bat (che non e' un batch DOS ma uno script Python). Dopo di cio' e' sufficiente trascinare il file p7m su Verify e si puo' estrarre il documento
venerdì 13 marzo 2020
Imagemagick cache
cercando di fare una gif animata partendo da circa 500 jpg ad alta risoluzione mi sono imbattuto nell'errore cache resources exhausted che non avevo mai incrociato
La soluzione per ovviare all'esaurimento della cache (sia di memoria Ram che di disco) e' editare
il file /etc/ImageMagick-6/policy.xml modificando i valori sottostanti
<policy domain="resource" name="memory" value="4GiB"/>
<policy domain="resource" name="map" value="512MiB"/>
<policy domain="resource" name="width" value="16KP"/>
<policy domain="resource" name="height" value="16KP"/>
La soluzione per ovviare all'esaurimento della cache (sia di memoria Ram che di disco) e' editare
il file /etc/ImageMagick-6/policy.xml modificando i valori sottostanti
<policy domain="resource" name="memory" value="4GiB"/>
<policy domain="resource" name="map" value="512MiB"/>
<policy domain="resource" name="width" value="16KP"/>
<policy domain="resource" name="height" value="16KP"/>
giovedì 12 marzo 2020
Accensione automatica da ricarica di telefoni Android
Per un nuovo progetto avevo bisogno di una funzione che trovo molto comoda su IPhone, ovvero l'avvio automatico da spento quando viene inserito il cavo USB collegato alla corrente, e che non avevo trovato su Android
Lo scopo poi e' quello di avviare in automatico una applicazione una volta terminato il boot
Frugando ho trovato che questa opzione e' facilmente disponibile nei Nexus con semplici comandi da fastboot
./adb reboot bootloader
./fastboot oem off-mode-charge 0
./fastboot reboot
A questo punto per rimuovere il lock screen di Android si va in Impostazioni/Sicurezza/Blocco schermo/nessuno
A questo punto sarebbe interessante avviare in automatico un app (od un servizio)
Per fare una prova ho usato Nexus 5 con Android 6 perche' le versioni piu' recenti
di Android rendono piu' difficile lanciare una app al boot in automatico
Si vede modificare il Manifest (righe evidenziate in giallo)
AndroidManifest.xml
============================================
Nella MainActivity si crea una nuova classe che riceve la notifica dell'avvenuto boot
(per vedere se il codice funziona si osservi logcat, non ci sono messaggi per l'utente)
MainActivity.kt
============================================
Lo scopo poi e' quello di avviare in automatico una applicazione una volta terminato il boot
Frugando ho trovato che questa opzione e' facilmente disponibile nei Nexus con semplici comandi da fastboot
./adb reboot bootloader
./fastboot oem off-mode-charge 0
./fastboot reboot
A questo punto per rimuovere il lock screen di Android si va in Impostazioni/Sicurezza/Blocco schermo/nessuno
A questo punto sarebbe interessante avviare in automatico un app (od un servizio)
Per fare una prova ho usato Nexus 5 con Android 6 perche' le versioni piu' recenti
di Android rendono piu' difficile lanciare una app al boot in automatico
Si vede modificare il Manifest (righe evidenziate in giallo)
AndroidManifest.xml
============================================
<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.luca.innocenti.autoboot"> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <receiver android:name=".BootReceiver" android:enabled="true" android:exported="true"> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" /> <action android:name="android.intent.action.QUICKBOOT_POWERON" /> </intent-filter> </receiver> </application> </manifest>
============================================
(per vedere se il codice funziona si osservi logcat, non ci sono messaggi per l'utente)
MainActivity.kt
============================================
package com.luca.innocenti.autoboot import android.content.BroadcastReceiverimport android.content.Contextimport android.content.Intentimport android.content.Intent.ACTION_BOOT_COMPLETED import androidx.appcompat.app.AppCompatActivityimport android.os.Bundleimport android.util.Log class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) } } class BootReceiver : BroadcastReceiver() { override fun onReceive(c: Context, intent: Intent?) { val action = intent?.action Log.d("ASD123123", "RECEIVED BOOT") val b = intent?.toUri(Intent.URI_INTENT_SCHEME) when (action) { ACTION_BOOT_COMPLETED -> startWork(c) } } private fun startWork(context: Context) { Log.d("Test", "Test") } }
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...
-
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...