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)




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

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)

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





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)

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

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 -



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

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

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"
==============================
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

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

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

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