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

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

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

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

giovedì 27 febbraio 2020

Flutter webview

Ultimamente sto avendo parecchie noie da Play Store perche' alcune mie vecchie applicazioni realizzate con PhoneGap vengono ritenute pericolose per vulnerabilita' delle librerie contenute in phonegap e vengono rimosse in automatico. Ho cosi' cercato in giro un framework alternativo con caratteristiche simili a PhoneGap ed ho voluto provare a convertire una mia app PhoneGap in Flutter (anche perche' essendo un prodotto Google spero che non eliminino le app dallo store se compilate con Flutter)

Per installare Flutter si inizia scaricando il pacchetto del framework da questo link
Si scompatta e si mette in path la directory /flutter/bin
Per editare i progetti si puo' usare Android Studio aggiungendo i plugin di Flutter e Dart da Preferences (CTRL+ALT+S) e poi Plugin/Marketplace

Si crea quindi un nuovo progetto Flutter

si modifica il file pubsec.yaml per inserire la dipendenza dal plugin flutter_webview

dependencies:
  flutter:
    sdk: flutter
  flutter_webview_plugin: ^0.3.10+1

modificare il file pubspec.yaml per includere le directory di assets della

(attenzione che:
- le varie righe devono essere indentate in modo corretto
- deve essere creata una riga per ogni subdirectory contenuta in assets
- la directory assets non viene creata di default

flutter:
assets:
  - assets/
  - assets/css/
  - assets/altimetria/
  - assets/img/
  - assets/imgit/


per confronto questa e' parte dell'albero assets del mio progetto


Alla fine si crea popola con la webview e si fa puntare la url ai file locali

main.dart

import 'package:flutter/material.dart';
import 'package:flutter_webview_plugin/flutter_webview_plugin.dart';
void main() {
  runApp(new MyApp());}

class MyApp extends StatefulWidget{
  _MyAppState createState() => _MyAppState();}

class _MyAppState extends State<MyApp> {
  @override  Widget build(BuildContext context) {
    return new MaterialApp(
        home: new WebviewScaffold(
          url: "file:///android_asset/flutter_assets/assets/index.html",        ),        debugShowCheckedModeBanner: false,    );  }
}

mercoledì 26 febbraio 2020

Goering ed il "porcellino"

Stavo guardando un documentario su Hermann Goring e da fiorentino non ho potuto fare a meno di notare la statua del Porcellino di Pietro Tacca presente in una delle residenze di Goring

Fotogramma del documentario
Con un po' di ricerca ho trovato che la statua si trovava nella residenza estiva a Carinhall. Non sono riuscito a trovare notizie se la statua presso Carinhall sia una copia (ne esistono tuttora molte a giro per il mondo) o, visto il vizio di Goring di portarsi a casa cio' che ci piaceva, dell'originale (attualmente a Firenze al Museo Bardini)

Originale (Wikipedia)




martedì 25 febbraio 2020

Tributo a Gilles

Per lavoro capita spesso di effettuare sopralluoghi in fabbriche dismesse e trovare ricordi di epoche passate. Non poteva passare inosservato questo poster allegato alla rivista CorrierBoy del 2 maggio 1979 appeso ad un muro




...e no, non era possibile staccarlo e verra' presto rimosso dai lavori di ristrutturazione
Frugando su Internet e' comparsa una immagine di qualita' migliore

venerdì 21 febbraio 2020

ConnManCtl Command line network manager

Cercando di mettere su una macchina dalle risorse ridotte ho installato una Debian netinst con I3
Per ridurre il carico volevo un network manager da linea di comando ed ho trovato connmanctl


per utilizzarlo si digita connmanctl e si apre un prompt

enable wifi
scan wifi
services
agent on
connect (si deve copiare la stringa accanto al nome del proprio AP vedi immagine)

Nell'uso mi sono accorto che il DNS non viene gestito dal DHCP ma viene preso quello inserito in resolv.conf

Una volta connessi ad una rete wifi al successivo riavvio non e' necessario ripetere la procedura di autenticazione

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