La mia prima skill con Alexa: facile, con VoiceFlow!

Ero alla ricerca di previsioni del meteo decenti con Alexa. Sì, perchè diciamocelo, il provider meteo di default Alexa fa abbastanza pena in Italia.

E allora ho pensato, perchè non farmi la mia skill personale che mi aiuta nella scelta del mezzo di trasporto adeguato per andare al lavoro? (bici o auto n.d.r.)

Detto, fatto! Meteo Aeronautica Militare per Alexa pronta per voi!

La scelta su come realizzarlo è caduta sui VoiceFlow che permette, tramite un diagramma di flusso, di generare skill in tempi record senza digitare una linea di codice!

Il bello di VoiceFlow è che ti permette l’integrazione con script esterni (come il mio script in python per gestire il provider meteo) e ti consente di pubblicare la skill in modo guidato sul store di amazon!

Veramente stra consigliato!

QNAP non va in standby: capiamolo con lo script blkdevMonitor.sh

Da pochi giorni sono un possessore di un NAS QNAP e mi sono imbattuto il un classico problema: gli HDDs non vanno in standby.

Sui forum QNAP si parla di uno script bash da lanciare via ssh, che ahimè, non è più scaricabile.

Per fortuna, girando nelle pieghe del web (aka google cache), sono riuscito a farlo riemergere dal black hole.

Ed eccolo qui in tutta la sua “splentitudine”:

#!/bin/sh
#================================================================
# Copyright (C) 2008 QNAP Systems, Inc.
#
# 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; either version 2
# of the License, or (at your option) any later version.
# 
# This program 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.
#----------------------------------------------------------------
#
# blkdevMonitor_v2.sh
#
#	Abstract: 
#		A program of testing purpose on monitor block device
#
#	HISTORY:
#		2013/05/15	-	Created	- Kent
# 
#================================================================
/sbin/daemon_mgr klogd.sh stop "/etc/init.d/klogd.sh start"
/usr/bin/killall dd 2>/dev/null 1>/dev/null

MD_DEVIVES="md9 md13 md0 md1 md2"
SD_DEVIVES="sda sdb sdc sdd sde sdf sdg sdh"
Do_Log=0
MAXRUN=100
FORCE_STANDBY=0
BLKDEV_LOG=/root/blkdevMonitor_v2.log

analyse_kmsg()
{
	_klog=/.klog
	/bin/touch $_klog
	_standby=1

	# read /proc/kmsg
	while [ 1 ]; do
		/bin/dd if=/proc/kmsg of=$_klog bs=1 count=10240 2>/dev/null 1>/dev/null
		for i in $MD_DEVIVES; do
			/bin/cat $_klog | /bin/grep $i | /bin/grep "dirtied inode"
			if [ $? = 0 ]; then
				/bin/cat $_klog | /bin/grep $i | /bin/grep "dirtied inode" >> $BLKDEV_LOG
				_standby=0
			fi
			/bin/cat $_klog | /bin/grep $i | /bin/grep "block"
			if [ $? = 0 ]; then
				/bin/cat $_klog | /bin/grep $i | /bin/grep "block" >> $BLKDEV_LOG
				_standby=0
			fi
		done
		for i in $SD_DEVIVES; do
			/bin/cat $_klog | /bin/grep $i | /bin/grep "dirtied inode"
			if [ $? = 0 ]; then
				/bin/cat $_klog | /bin/grep $i | /bin/grep "dirtied inode" >> $BLKDEV_LOG
				_standby=0
			fi
			/bin/cat $_klog | /bin/grep $i | /bin/grep "block"
			if [ $? = 0 ]; then
				/bin/cat $_klog | /bin/grep $i | /bin/grep "block" >> $BLKDEV_LOG
				_standby=0
			fi
		done
		if [ $_standby = 0 ]; then
			return 1
		fi
	done
}

_countdown()
{
	/bin/sync;/bin/sync
	/bin/echo -n "Countdown: "
	cntdown=$1
	while [ ${cntdown} -gt 0 ]; do
		/bin/sleep 1
		/bin/echo -n "${cntdown} "
		cntdown=$[$cntdown-1]
	done
	echo
}

_check_standby()
{
	for i in $SD_DEVIVES; do
		/sbin/hdparm -C /dev/${i} 2>>/dev/null | /bin/grep active
		if [ $? -eq 0 ]; then
			echo /dev/${i}
			echo "Some process was waked up HDD..."
			return 1	# HDD is active
		fi
	done
	return 0
}

/bin/echo "===== Welcome to use blkdevMonitor_v2 on `/bin/date` ====="
case "$1" in
	-h)
	/bin/echo "Usage:"
	/bin/echo "  $0 [N]"
	/bin/echo "  N means that monitor block devices N times and generate N log files.(Default N = 100)"
	exit 0
	;;
esac

/bin/echo "Turn off/on VM block_dump & Clean dmesg"
/bin/echo 0 > /proc/sys/vm/block_dump
/bin/dmesg -c 2>/dev/null 1>/dev/null
/bin/dmesg -c 2>/dev/null 1>/dev/null
/bin/dmesg -c 2>/dev/null 1>/dev/null

_cnt=20
while [ ${_cnt} -gt 0 ]; do
	/bin/sync
	/bin/dmesg -c 2>/dev/null 1>/dev/null
	_cnt=$[$_cnt-1]
done
/bin/echo 1 > /proc/sys/vm/block_dump
/bin/date > /dev/null
_countdown 3
# ignore 10240 bytes
/bin/dd if=/proc/kmsg of=/dev/null bs=1 count=10240 2>/dev/null 1>/dev/null

/bin/echo "Start..."

[ "x$1" != "x" ] && MAXRUN=$1
_cnt=0

# remove log
/bin/rm -f $BLKDEV_LOG

while [ ${_cnt} -lt ${MAXRUN} ]; do
	echo "============= $_cnt/$MAXRUN test, `/bin/date` ==============="
	echo "============= $_cnt/$MAXRUN test, `/bin/date` ===============" >> $BLKDEV_LOG
	if [ $FORCE_STANDBY = 1 ]; then
		_check_standby
		if [ $? != 0 ]; then
			for i in $SD_DEVIVES; do
				# force standby
				/sbin/hdparm -y /dev/${i} 2>/dev/null 1>/dev/null
				if [ $? = 0 ]; then
					echo "Issuing standby command in /dev/${i}"
				else
					echo "/dev/${i} not found"
				fi
			done
		fi
		/bin/sleep 20
	fi
	analyse_kmsg
	_cnt=$[$_cnt+1]
	echo
	echo >> $BLKDEV_LOG
done

/bin/echo "Turn off block_dump"
/bin/echo 0 > /proc/sys/vm/block_dump

Utilizzandolo, ho capito che il mio problema era nell’app di videosorveglianza (che comunque non stavo usando)

Windows CE è morto? Lunga vita a Linux e Wine

(lo stile di scrittura di questo post è volutamente leggero, ma l’argomento è dannatamente serio!)

Ormai sono 18 anni che lavoro come firmwarista in ambito industriale e mi è capitato di vedere di tutto sugli schermi delle povere HMI: sistemi operativi proprietari, Windows 95, 98, XP e anche lo SCOMODISSIMO Windows CE!

Purtroppo, ma che dico, PER FORTUNA, Windows CE è stato finalmente decretato morto dalla Microsoft.

Questo decesso programmato ha portato molte aziende sull’orlo di crisi tecniche.

E ora come sostituiamo Windows CE?

La scelta banale potrebbe essere quella di portare tutto il software sulle moderne versioni di Windows. Peccato però che ci si dimentica spesso di una parolina, o forse di due: REAL-TIME.

Infatti, Windows CE, aveva tanti difetti ma una cosa su tutte faceva abbastanza bene: eseguire codice in tempo reale!

Purtroppo Windows 10 & Co. non gradiscono molto la parte realtime. Si, so quello che state per dire: ma ci sono le estensioni realtime per windows!

Ok, ma le avete provate? Queste estensioni sono dannatamente pesanti e si portano dietro un ulteriore zavorra: UN COSTO DI LICENZA SUPERIORE A QUELLO DI WINDOWS STESSO!

Quindi, vi starete chiedendo, che cosa suggerisce il fenomenale Roberto Viola?

Semplice: LINUX!

O meglio, Linux + Wine + Xenomai!

Nel dettaglio, Xenomai si occuperà della gestione realtime, mentre Wine si occuperà della parte grafica della HMI che sicuramente non vorrete riscrivere!

Signori, in pochi giorni, se non ore, avrete migrato il vostro applicativo da Windows CE a Linux senza più costi di licenza e sopratutto su un kernel al passo con i tempi!

Avete avuto anche voi situazioni simili?

Dai che forse il 2020 sarà l’anno di linux…almeno per quello che riguarda l’ambito industriale!

Corsette domenicali: proviamo a non buttare plastica

Oggi ce l’ho un po’con il mondo intero per un non ben precisato motivo. Capita, capita a tutti. È in questi giorni però che cerco di tramutare un po’ di negatività in qualcosa di utile.

Me ne stavo li, in mezzo alla strada alle 8 di sera a correre, con la pioggia in testa e mi chiedevo, ma è mai possibile che alle garette di paese si consumi così tanta plastica per i bicchieri nei ristori?

Quindi ho partorito questa semplice idea: chi partecipa alle garette, se vuole bere, si porta il bicchiere da casa.

Esempio, 2 euro su Amazon e passa la paura

Ora dopo gli insulti che mi state tirando, veniamo a rispondere alle vostre domande:

1) Ma se vengo alla garetta e non lo sapevo di sta regola che faccio? Semplice, al tavolo delle iscrizioni, al costo di 2 euro in più, ti vendono IL TUO BICCHIERE PERSONALE PIEGHEVOLE ™

2) Ma come!? Devo fermarmi 3 secondi a farmi riempire il bicchiere e così facendo non riuscirò a battere il mio PR su strava della mezza maratona!?!?#&$¥ Svegliati, stai correndo un cacchio di garetta di paese, che cacchio te ne frega del tuo tempino del menga?

3) Ma non voglio portarmi in giro un bicchiere per tutta la corsa, e’ scomodissimo!!?!?€&*#!! Signori vedo gente con tutto e di più addosso nelle garette: portare un cacchio di bicchiere legato al polso, o addirittura nel taschino del gilet non credo vi faccia sprecare molte energie.

Se siete arrivati fin qua, significa che o siete messi peggio di me, oppure che la mia idea non è così malsana. Quindi quello che propongo è che ognuno, nel proprio piccolo, cerchi di propagandare questa piccola idea all’interno del proprio gruppo di corsa, sperando,un giorno, di partecipare ad una garetta #bicchierinofree

SYCL: diamo un boost ai nostri algoritmi con la GPU

Da qualche giorno (in realtà fine settembre 2019) Intel ha rilasciato LLVM 9.0.0 che porta con se una grandissima novità: un supporto a SYCL perfettamente funzionante.

Per chi non conoscesse SYCL, riporto qui la descrizione di wikipedia:

SYCL (pronuncia “sickle”) è un layer di astrazione gratuito e multipiattaforma progettato sui concetti di portabilità e di efficienza di OpenCL, che permette al codice di piattaforme eterogenee di essere scritto in uno stile “a sorgente singola”, utilizzando completamente lo standard C++. SYCL consente lo sviluppo di una sola sorgente in cui le funzioni di modello C ++ possono contenere sia il codice host (cpu) che quello per il dispositivo (gpu/fpga/arm) al fine di costruire algoritmi complessi che utilizzano l’accelerazione OpenCL e quindi poter riutilizzare tutto il loro codice sorgente su diversi tipi di hardware e di dati. La possibilità, per gli sviluppatori, di non essere costretti a tener conto del dispositivo su cui il programma girerà (necessario in OpenCL), rende molto più semplice e lineare la programmazione.

In breve: potete accelerare i vostri algoritmi usando la GPU!
Quante volte avete raggiunto il limite di un sistema e siete stati costretti a dover upgradare la CPU o addirittura rivoluzionare un algoritmo perfettamente funzionante per cercare di limitare qualche millisecondo ad ogni iterazione?

Beh LLVM + SYCL potrebbero essere una manna dal cielo in queste situazioni.
In particolare ho provato per voi alcuni esempi (trovate tutto qui https://github.com/cagnulein/sycl-benchmarks):
Un semplice FOR da 500.000.000 di iterazioni, comprensivo di una moltiplicazione di una tan per un atan richiede circa 107 secondi per essere eseguito su una CPU intel di settima generazione. Bene, se questo stesso algoritmo lo fate girare su GPU (la stessa GPU integrata della stessa CPU presa in considerazione prima) passerete da 107 secondi a soli 4.8 secondi! Si avete letto bene, 4.8 secondi!

Non vi resta che sporcarvi le mani voi stessi seguendo questo bell’articolo http://pramodkumbhar.com/2019/07/intels-one-api-what-we-know-and-how-to-get-ready/

Se avete dubbi chiedete pure.

Modenacorre e reggiocorre come trovare le VOSTRE foto

Se siete runner “fashion” emiliani (ma non solo) e siete stanchi di cercare le vostre foto nel sito modenacorre.it e reggiocorre.it, beh ragazzi oggi ho la soluzione che fa per voi!

Ho creato questo simpatico script in python ( https://github.com/cagnulein/runcolor ) che, una volta indirizzato sull’album da scansionare ( esempio http://www.reggiocorre.it/showg.aspx?aid=10659 ), vi troverà all’interno delle foto! O meglio, in realtà troverà immagini con un sacco di pixel del colore selezionato.

Non vi siete mai chiesti perchè i runner portano abbigliamenti sgargianti? Beh ora avete la risposta: per favorire la ricerca di se stessi con script in python!

Stavo pensando se generalizzare la cosa creando una pagina web con nodejs, se pensate vi possa essere comodo, donatemi una birra e farò in modo che il vostro sogno diventi realtà!

Sotto un piccolo esempio di runner “fashion” 😀

Aggiungere un file GPX ad un video

Nei giorni scorsi ho acquistato una classica Action Cam da Amazon per fare da dashcam sulla mia ebike CMS F16.

Dato che salvo sempre i miei tracciati con il mio fido Polar M430 mi sono chiesto: come faccio ad unire un GPX salvato dal mio orologio con un video e sincronizzarlo?

Cercando un po’ in rete ho trovato la soluzione free e semplice: Garmin Virb Edit! ( lo potete scaricare qui )

Contrariamente a quanto farebbe pensare il nome, il software funziona con tutti i dispositivi che generano GPX (in caso comunque per arrivare al formato GPX esistono milioni di converter free su internet). Il programma è disponibile sia per Windows che per MAC.

L’utilizzo è molto semplice: si importa il video, si importa il GPX e poi con un comodissimo pulsante si sincronizzano le due traccie. Consiglio di scegliere una svolta ben delineata sia nella traccia GPS che nella traccia video per eseguire la sincronizzazione in modo corretto.

Questo è un esempio del risultato ottenuto:

Buon divertimento!

Raspberry: modificare la luminosità di uno schermo via HDMI (e non solo!)

Per lavoro stavo cercando come poter modificare la luminosità e più in generale tutti i parametri di uno schermo collegato via HDMI al raspberry.

Ho trovato il tool ddcutil ( https://www.ddcutil.com/raspberry/ ) che funziona da dio.

Prima di tutto bisogna modificare il file /boot/config.txt aggiungendo questa linea

dtparam=i2c2_iknowwhatimdoing

riavviate

e provate ad avviare il comando ddcutil getvcp
Dovreste trovare la lista di tutti i parametri supportati dal vostro schermo.

Nel mio caso, per esempio, per modificare la luminosità mi è bastato inviare il comando

sudo ddcutil setvcp 10 100

dove 100 è il valore in percentuale della luminosità del display.

Qui trovate anche il pacchetto ddcutil compilato per ARM64.

Intel Movidius vs altre CPU Intel

In questi giorni ho avuto modo di sperimentare con Intel Movidius e mi è sembrato carino condividere i risultati ottenuti.

L’idea era quello di capire se e quando l’utilizzo di una VPU Movidius avesse senso.

Da quello che potete vedere, la VPU Movidus ha senso su sistemi datati come il vecchio N4200 ma non hanno nessun senso su architetture come un i7 di ottava generazione (era abbastanza ovvio, ma almeno ci sono dei dati a supporto, dato che su internet non si trova nulla).

Qui il report completo ottenuto con l’applicazione presente all’interno del toolkit Intel Openvino “demo_benchmark” (qui i dettagli per l’installazione):

Full deviceIntel(R) Core(TM) i7-8850H CPU @ 2.60GHz
  
Count:1000 iterations
Duration:1761.70 ms
Latency:7.31 ms
Throughput:567,63 FPS
  
Full deviceIntel® UHD 630
  
Count:1000 iterations
Duration:2729.50 ms
Latency:10.72 ms
Throughput:366,37 FPS
  
Full deviceIntel Vision Accelerator Design with Intel Movidius VPUs
  
Count:1000 iterations
Duration:5025.83 ms
Latency:19.79 ms
Throughput:198,97 FPS
Full deviceIntel® Pentium ® CPU N4200 @ 1.10GHz
  
Count:1000 iterations
Duration:24897.62 ms
Latency:104.2 ms
Throughput:41,67 FPS
  
Full deviceIntel® HD 505
  
Count:1000 iterations
Duration:12399.70 ms
Latency:38.30 ms
Throughput:80,65 FPS

DBPower N6 e Camking Pro: crash all’avvio

Ho acquistato la settimana scorsa una DBPOWER N6 e devo dire che per 20€ (era in offerta a tempo) funziona alla grande.

Avendo la WiFi ho provato ad usarla: la prima volta ha funzionato correttamente, dopodiché la app Camking Pro su Android non ha più voluto aprirsi.

L’unica soluzione è disinstallare l’app e reinstallarla (certificata anche da un sacco di utenti nelle recensioni di Google play). Ovviamente da nerd non potevo sottostare a tale affronto e mi sono messo alla ricerca di una soluzione.

Scaricando questa versione (una vecchia versione della app che però sembra essere esente da bug e uguale a livello di funzioni) si può smettere di disinstallare ogni volta l’applicazione!