lunedì 17 agosto 2015

Salvare pagine html on line per rassegna stampa

Uno dei problemi che si incontrano quando si cercano di salvare pagine html sui vari siti  (per esempio per creare una rassegna stampa) e' che la qualita' del risultato e' sempre scarsina, qualunque sia il formato di salvataggio

Per esempio partiamo da uno screenshot di una notizia sulla recensione della mia applicazione Abetone Trail Park


se si salva il contenuto in pdf mediante Chrome il risultato e' questo


Il tutto e' ovviamente non impaginato
Ho trovato utile usare il software Paparazzi, che riporta una impaginazione decisamente fedele del sito desiderato




venerdì 14 agosto 2015

Musescore e Songbook


Desktop
La versione desktop del programma puo' essere scaricata all'indirizzo https://musescore.org/it,e' opensource e multipiattaforma con sorgenti disponibili



Creando un nuovo spartito (File/Nuovo) viene chiesto il titolo, l'autore, lo o gli strumenti da usare, l'armatura di chiave,l'unita' di tempo (3/4, 4/4 per esempio) ed il numero di battute

Per inserire le note (modalita' di edit) si preme il tasto N oppure l'icona
Le note possono essere inserite dopo aver cliccato nella barra seguente indicando la durata direttamente posizionandole sul pentragramma

per inserire una pausa si entra in modalita' edit, si seleziona la lunghezza della nota e poi si clicca 


Attenzione : il programma in corso d'opera cerchera' di far sempre tornare la lunghezza della battuta. Per esempio se si ha una battuta in 4/4 e si e' aggiunta nota (per esempio una minima 1/2) aggiustera' il resto della battuta con una pausa di minima (1/2)

Per aggiungere elementi quali Articolazioni ed Abbellimenti (come staccati, crescenti ed altro) si deve uscire dalla modalita' edit (N) e si trascina l'elemento sulla nota interessata (cosi' come per le alterazioni non in chiave)

In automatico Musescore tende a raggruppare le note (per esempio di solito raggruppa le crome a  due a due) . Se non si e' soddisfatti si puo' usare in Tavolozze i comandi Proprieta' Gruppo note. Per raggruppare per esempio di clicca la seconda icona da sinistra nella file in alto e si trascina sulla seconda nota tra quelle che si devono raggruppare




E' possibile effettuare la trasposizione automatica della tonalita' utilizzando il menu' Note/Trasporto
Per esempio dalla tonalita' originale in Do maggiore



a Sol Maggiore



Una volta completato lo spartito (od anche in corso d'opera) si puo' ascoltare il brano con i tasti
(il play corrisponde al tasto spazio sulla tastiera)
Musescore viene distribuito con una libreria di suoni midi. Se si vuole un suono migliore si puo' scaricare una libreria SF2 piu' avanzata come quella per esempio FluidR3 GM2-2.SF2 (144 Mb!!)  reperibile qui e qui
Per installare la nuova libreria si devono aggiornare le Preferenze



ed in seguito Visualizza/Sintetizzatore/Aggiungi


(Curiosamente sono costretto ad impostare i suoni personalizzati ogni volta che apro il programma perche' si perdono le impostazioni)


Songbook
L'applicazione Musescore per Android ed IOS e' solo un player e visualizzatore dei file .mscz. Ne esistono due versioni: Musescore e' un programma che non permette di visualizzarea gli spartiti salvati sul proprio dispositivo portatile (ha quindi la necessita' del collegamento di rete per scaricare i dati dal sito di Musescore dopo aver fatto il login) e Songbook che permette di usare i propri file mscz.





Su Songbook non esiste la possibilta' di avere un file manager. Per aggiungere i propri spartiti si deve

  • su Android con un file manager si clicca sul .mscz e si indica "Apri con" Musescore Songbook
  • su IOS non e' possibile importare i dati mediante ITunes. Il sistema piu' semplice e' allegare i file degli spartiti anche una mail e poi "Apri con" l'allegato verso Musescore Songbook
Un paio di problemi: 
  • Solo su IOS l'applicazione portatile permette solo la modalita' portrait. Se si ruota lo schermo lo spartito non viene ridimensionato (su Android e' tutto a posto)
  • Esistono solo il tasto Play ed il tasto Ritorna all'inizio. Su brani lunghi questa e' una notevole limitazione ed esiste un trucco non immediato. Si deve premere sulla nota da cui si vuole partire in modo prolungato fino a che non viene emesso il suono della nota. A questo punto si puo' premere Play e l'esecuzione inizia dal punto prescelto


giovedì 13 agosto 2015

OpenCL e Mandelbrot

Il calcolo dell'insieme di Mandelbrot e' forse uno dei casi piu' semplici in cui applicare il calcolo parallelo perche' l'elaborazione di  ogni cella e' indipendente da quelle vicine.

Ai giorni d'oggi per effettuare il calcolo parallelo, invece di usare un cluster di computer, si possono usare i diversi core del processore oppure usare la scheda grafica con la sua GPU (mediante le librerie CUDA di NVidia o le piu' generiche OpenCL che possono girare su AMD, NVidia e Intel)



La strategia utilizzata in CUDA e OpenCL e' piu' o meno la stessa ovvero si scrive il codice di un kernel, ovvero della elaborazione che verra' eseguita su ogni unita' di elaborazione, e poi il codice che gestisce la coda dei processi e la distribuzione alle varie unita' di elaborazione

Un esempio di kernel per Mandelbrot e' il seguente
-------------------------------------------------------------------
#pragma OPENCL EXTENSION cl_khr_fp64 : enable

double trans_x(int x, int N)
{
    return 3.0 * ((double)x / N) - 2.0;
}
double trans_y(int y, int N)
{
    return 3.0 * ((double)y / N) - 1.5;
}
double mag2(double r, double i)
{
    return r * r + i * i;
}
__kernel void mandel(__global double* out, int N, int depth, double escape2)
{
    size_t idx = get_global_id(0);

    double z0_r = trans_x(idx % N, N);
    double z0_i = trans_y(idx / N, N);

    double z_r = 0;
    double z_i = 0;
    int k = 0;
    for(; k <= depth && mag2(z_r, z_i) < escape2 ; ++k)
    {
        double t_r = z_r; double t_i = z_i;
        z_r = t_r * t_r - t_i * t_i + z0_r;
        z_i = 2 * t_r * t_i + z0_i;
    }
    out[idx] = log(k + 1.0 - log(log(max(mag2(z_r, z_i), escape2)) / 2.0) / log(2.0));
}

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


Per mettere alla prova quanto vantaggio c'e' nell'usare OpenCL per il calcolo di Mandelbrot ho usato un portatile Surface Pro 2 con scheda video Intel HD 4400 ed il programma reperibile a questo link.

Come test ho provato il  Miniset level 2 (1000 iterazioni per punto) con i seguenti risultati

- C float, single thread :1.71 s
- C float, 4 thread : 0.61 s
- C float, 8 thread : 0.59 s
- C fixed-point 128 bit  2 thread : 22.5 s
- OpenCl CPU float  : 0.36 s
- OpenCL CPU  double : 0.4 s
- OpenCL GPU float : 0.096 s



mercoledì 12 agosto 2015

Hyper-V e Virtualbox

Da quando ho installato l'SDK di Windows Phone (e l'annesso emulatore) ho avuto la sgradita sorpresa che Virtualbox (cosi' come WMWare) non risultano piu' funzionanti perche' e' possibile avere in esecuzione un solo hypervisor per volta...peccato che a me serva anche una Linux box anche se virtualizzata

La soluzione del problema e' questa (copiata da qui):

1) Si clicca  Tasto Windows+X e si apre una finestra di shell come amministratore

2) Si digita bcdedit /copy {current} /d "No Hyper-V".Questo comando riporta come risposta una stringa tra parentesi graffe. Il testo tra le graffe deve essere copiato perche' sara' utile per il comando successivo

3) Si digita bcdedit /set {inserire_qui_codice_copiato} hypervisorlaunchtype off

4) A questo punto si effettua il logout e si, tenendo premuto il tasto SHIFT, si clicca con il mouse per riavviare il sistema

5) Al reboot sara' presente una nuova opzione (non di default) di boot No Hyper-V che dovra' essere usata se si vuole successivamente impiegare Virtualbox od altro software di virtualizzazione


lunedì 10 agosto 2015

Abetone Trail Park sulla stampa

Abetone Trail Park e' la mia ultima applicazione ed e' riuscita a ritagliarsi anche un suo piccolo spazio sulla stampa locale

La Nazione ed. Pistoia 8 Agosto 2015

Il Tirreno ed. Pistoia 6 Agosto 2015

Sviluppata in PhoneGap ha come aspetto tecnico piu' significativo quello di avere una base cartografica per escursionismo completamente integrata senza la necessita' di scaricarla dalla rete (in montagna la connessione dati non e' assolutamente garantita)..un altro aspetto interessante e' che i 625 Kmq di cartografia, originariamente per circa 90Mb, sono riusciti a rientrare in 32 Mb (comprimendo i dati di base ed eliminando i livelli di zoom non di interesse)




In attesa del MarketPlace di Firefox (un po' lentino ad approvare le applicazioni) e di Amazon Store questi sono i link per scaricare l'applicazione

https://play.google.com/store/apps/details?id=com.lucainnocenti.abetonetrailpark&hl=it

https://itunes.apple.com/us/app/abetone-trail-park/id1014602667?mt=8

https://www.microsoft.com/en-us/store/apps/abetone-trail-park/9nblggh1rdq7


venerdì 7 agosto 2015

OCR di spartiti musicali con Audiveris

Come principiante nello studio della musica il problema principale e' la lettura dello spartito.
Esiste il solfeggio ma la soluzione piu' veloce e' quella di usare un programma di editing musicale (come Musescore) per "sentire" come suona uno spartito prima di provare con lo strumento vero e proprio

Il sistema funziona ma e' piuttosto lungo e tedioso trascrivere partiture anche semplici anche perche' la scrittura musicale (della musica classica, la musica pop e' un altro mondo) e' molto densa di informazioni

Ho trovato pero' una scorciatoia ovvero l'utilizzo del servizio Audiveris, uno scanner OCR specializzato in trascrizioni di notazione musicale. Questo servizio e' di tipo online e si puo' utilizzare sia su https://audiveris.kenai.com/ che tramite https://musescore.com/import


Per una prova ho usato il primo esercizio dei 20 Studi per flauto di Gariboldi (in formato pdf. da notare anche il watermark che sicuramente confonde l'OCR)

Originale in PDF

Dopo il riconoscimento OCR viene generato un file in MusicXML o direttamente in MSCZ (formato di Musescore). Come si vede il risultato e' ottimale a parte un problema di impaginazione sulla battuta 29 ed il tempo che invece di essere un 4/4 viene letto come 2/2 (tempo tagliato)

veramente non male

mercoledì 5 agosto 2015

Usbmount

Un amico mi ha chiesto un sistema (per un gioco) di creare un sistema di registrare il passaggio dei concorrenti da alcuni passaggi obbligati....ovviamente il sistema doveva essere al costo minimo possibile ed i dati di passaggio dovevano essere registrati su un dispositivo portato dal concorrente (non e' previsto che ci potesse essere un collegamento Internet nei punti di passaggio ed i punti di passaggio dovevano essere recuperati anche molte ore dopo il termine del gioco)



Scartata l'ipotesi Rfid, per il costo del singolo chip Rfid scrivibile intorno ai 3-4 euro ciascuno e per il costo del programmatore di chip, una possibile soluzione e' quella di usare una Raspberry e delle normali chiavette USB per registrare i dati del passaggio

In pratica il concorrente deve inserire la chiavetta nella Raspberry ed in automatico devono inseriti i dati e la chiavetta deve essere estrarre senza smontare esplicitamente il dispositivo

La soluzione e' stata quella di usare una Raspbian minimale (senza Xwindow) ed il pacchetto Usbmount che crea automaticamente i device /media/usb, /media/usb0/ (apt-get install usbmount)

Per intercettare l'evento di inserimento della chiavetta e poter scrivere i dati sulla stessa si puo' modificare lo script /etc/usbmount/mount.d/00_create_model_symlink aggiungendo al termine del file (prima dell'exit) qualcosa del tipo

echo "luca" > /media/usb0/file.txt

in generale il sistema funziona bene anche se non e' velocissimo perche' impiega circa 5 secondi per la scrittura

ho provato anche un altro sistema ovvero creare una regola /etc/udev/rules.d/100-miaregola.rules con questo contenuto

ACTION=="add", SUBSYSTEM=="block", KERNEL=="sd[a-z]1", RUN+="/home/luca/usb.sh" 

nella home ho poi ho messo uno script che doveva scrivere il file sul dispositivo USB. Curiosamente, nonostante l'evento di inserimento della penna USB venisse correttamente intercettato (ho usato logger per scrivere in syslog e verificare) la scrittura del file, nonostante tutti i tentativi di svuotare le cache, avveniva solo alla disconnessione della penna USB e quindi sul disco fisso (cioe' in /media/sdb1 ma solo quando il device era stato smontato)

giovedì 30 luglio 2015

Muta di cicala


Mute di cicala trovate in pineta
Per vedere un video di come avviene la muta https://www.youtube.com/watch?v=u-jI6s4BqWc






Configurazione di rete su Linux

Abituati agli installer delle varie distribuzioni e ai vari network manager oramai e' difficile configurare le interfacce di rete usando i file testo (alla vecchia maniera).
Nel caso di configurazioni un po' piu' complesse, per esempio con interfacce fisiche multiple, puo' essere necessario "sporcarsi le mani" con la configurazione manuale

Partendo dal basso ci sono i seguenti casi

1) L'interfaccia non e' listata in ifconfig

Nel caso il dispositivo fisico sia stato correttamente montato ma non risulta nella lista di ifconfig la causa piu' probabile e' che non sia stato il  modulo del kernel corrispondente al dispositivo.
Un po' piu' esotico e' il caso in cui la scheda di rete non riesca a negoziare la velocita' di rete con gli altri dispositivi (cioe' non riesce a capire se si deve settare a 1Gb,100Mb o 10 Mb)
Si puo' vedere con il comando ethtool e si puo' forzare la velocita' della scheda con il comando

ethtool -s eth3 duplex full speed 100 autoneg off

2) L'interfaccia e' configurata ma non riesce a pingare nessun dispositivo della propria rete locale

Presupposto che gli altri dispositivi della rete privata siano pingabili (non sempre e' settato il protocollo di ICMP) la causa di questo comportamento puo' essere la mancanza di un corretto instradamento dei pacchetti. In questo caso si puo' provare ad aggiungere una route statica del tipo

up route add -net 10.1.1.0/24 dev eth3

nel file interfaces. Cio' indica ad eth3 indica  di instradare i pacchetti nella sottorete 10.1.1.0

3) Si riesce a vedere completamente la rete interna ma i pacchetti non escono

Questa e' facile. Manca la configurazione del gateway

up route add default gw 10.1.1.1 dev eth3

cosi' si istruisce eth3 ad uscire verso Internet da 10.1.1.1

per controllare le modifiche si puo' usare route -n 

4) Il dispositivo e' su Internet ma risolve solo gli indirizzi numerici 

Anche questa e' facile. Non e' stato configurato il DNS Server

mercoledì 8 luglio 2015

Raspberry e la giusta SD Card

Assieme ad un amico da qualche giorno stavamo configurando le nostre Raspberry (io una Rasp 1 modello B il mio amico una Rasp 2) scambiandoci idee via mail non potendosi incontrare di persona


La cosa curiosa e' che, mentre a me tutto funzionava tutto per il meglio, al mio amico insorgevano continui problemi con il sistema operativo che da funzionante diventava completamente irrecuperabile al riavvio successivo.

Dopo un giorno di tentativi di isolare il problema (e dopo che il sistema della Rasp 2 era miseramente crollato dopo una semplice rimozione di un pacchetto deb e successivo riavvio) e' stato chiaro che il problema non era nella configurazione software del SO ma in qualcosa altro differente

Una breve consultazione su http://elinux.org/RPi_SD_cards ha permesso di verificare che le due schede SD del mio amico (nel dettaglio due Kingston, SDC4/16 e SDC10/8) non sono compatbili con Raspberry e cio' giustifica le corruzioni del sistema operativo e gli errori senza una precisa logica che sono emersi

Cambiato il modello di scheda (e' stata sempre usata una Kingston) la Raspberry 2 ha finalmente iniziato a funzionare in modo corretto. Cio' conferma la mia impressione che si tratti di una soluzione valida sotto molti aspetti ma ancora troppo legata all'instabilita' dell'SD Card


martedì 7 luglio 2015

Clonare SD card per Raspberry


Usando Raspberry puo' essere utile, una volta settato il sistema operativo, effettuare una copia in modo da poter eseguire con gli esperimenti sapendo di poter tornare in poco tempo ad una situazione stabile

Per fare cio' si parte da un sistema operativo configurato su una SD che si inserisce in altro computer (questa procedura non puo' essere eseguita sulla stessa Raspberry) con Linux

Guardando nei file di log si definisce su quale device e' stata montata la scheda SD (nel mio caso era /dev/sdb con le partizioni /dev/sdb1 di boot e /dev/sdb2 di sistema). Dopo di cio' si smontano le partizioni

umount /dev/sdb1
umount /dev/sdb2

e si inizia una copia raw mediante dd

dd if=/dev/sdb of=/home/luca/rasp.iso bs=4M

(la copia richiede una decina di minuti ma dipende molto dalla classe della SD)

a questo punto si inserisce la nuova scheda (che sia vuota, piena o formattata non ha interesse perche' si tratta di una copia raw) e si inverte il processo

dd if=/home/luca/rasp.iso of=/dev/sdb bs=4M

(per semplicita' ho usato due schedine dello stesso taglio, altrimenti in un secondo tempo avrei dovuto espandere il filesystem per usare tutto lo spazio disponibile)

la nuova schedina risulta avviabile e con tutte le configurazioni della precedente.
La procedura e' simile su OS X ma i device sono rinominati in modo differente (/dev/disk2s2 per esempio)

Missing Push Notification Entitlement e PhoneGap

Sto sviluppando una applicazione Android/IOS e per non perdere la testa su due versioni ho deciso di usare Phonegap per mantenerel lo sviluppo centralizzato anche se di fatto non uso le API di Phonegap

Al momento di effettuare il primo upload su Apple Store (dopo che tutte le verifiche di XCode erano state superate) ho ricevuto nel giro di un secondo la seguente mail

----------------------------------------
Dear developer,
We have discovered one or more issues with your recent delivery for "Abetone Trail Park". Your delivery was successful, but you may wish to correct the following issues in your next delivery:
Missing Push Notification Entitlement - Your app appears to include API used to register with the Apple Push Notification service, but the app signature's entitlements do not include the "aps-environment" entitlement. If your app uses the Apple Push Notification service, make sure your App ID is enabled for Push Notification in the Provisioning Portal, and resubmit after signing your app with a Distribution provisioning profile that includes the "aps-environment" entitlement. See "Provisioning and Development" in the Local and Push Notification Programming Guide for more information. If your app does not use the Apple Push Notification service, no action is required. You may remove the API from future submissions to stop this warning. If you use a third-party framework, you may need to contact the developer for information on removing the API.
After you’ve corrected the issues, you can use Xcode or Application Loader to upload a new binary to iTunes Connect.
Regards,
The App Store team
----------------------------------------

Di fatto non uso le notifiche sulla mia applicazione e quindi non riuscivo a capire il motivo dell'errore.
Guardando il codice sorgente di PhoneGap, piu' precisamente in AppDelegate.m, sono presenti due funzioni

----------------------------------------
- (void)      application:(UIApplication*)application
    didRegisterForRemoteNotificationsWithDeviceToken:(NSData*)deviceToken
{
    // re-post ( broadcast )
    NSString* token = [[[[deviceToken description]
        stringByReplacingOccurrencesOfString:@"<" withString:@""]
        stringByReplacingOccurrencesOfString:@">" withString:@""]
        stringByReplacingOccurrencesOfString:@" " withString:@""];

    [[NSNotificationCenter defaultCenter] postNotificationName:CDVRemoteNotification object:token];
}

- (void)                                 application:(UIApplication*)application
    didFailToRegisterForRemoteNotificationsWithError:(NSError*)error
{
    // re-post ( broadcast )
    [[NSNotificationCenter defaultCenter] postNotificationName:CDVRemoteNotificationError object:error];

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

E' stato sufficiente commentare le due funzioni, ricompilare e rimandare a Apple Store per vedere scomparire il messaggio di errore

Cerca e copia da directory multiple

Un sistema rapido per copiare file con una medesima estensione (nell'esempio gif) sparsi in varie sottodirectory tutti in un sola cartella

find . -name '*.gif' -exec cp {} /home/luca/foto  \;

funziona su Linux e OSX 

martedì 30 giugno 2015

Port forwarding su Cisco AS520

Il router Cisco AS520 e' una macchina vecchiotta che ha gia' raggiunto il tempo di fine vendita e tra un anno terminera' anche il supporto per gli upgrade firmware ma si trova ancora in ambiente di piccole attivita'.

Per effettuare il port forwarding di un servizio standard (per esempio di un web server sulla rete interna) si entra nel menu Firewall/IPv4 Rules/Add

A questo punto si imposta
From Zone : Insercure (WAN)
To Zone : LAN
Service : Http (e' un menu a tendina con alcuni valori preimpostati)
Action : Allow always (di default e' su Deny)
Source Hosts : Any
Internal IP Address : 10. x. x. x (indirizzo della macchina su rete interna che fa da web server)
External IP Address : Dedicated WAN

Nel caso si voglia fare port forwarding di un servizio non predefinito, per esempio un sistema di amministrazione remota come VNC NoMachine, si deve andare in Firewall/Services/Add Custom Service indicando un nome e la porta del servizio che si vuole forwardare



Fatto cio' si torna in Firewall/IPv4 Rules e si ripete la procedura vista per il web server con la differenza che adesso nel menu a tendina dei Services si trovera' quello da noi aggiunto



LLama3 Anita

A seguito di questo post ho provato a vedere ho provato a vedere cosa accadeva ad utilizzare un modello specifico per la lingua italiana in...