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



Congiunzione Venere Giove 30 giugno 2015


E' necessario ingrandire a piena risoluzione la fotografia per apprezzare la congiunzione tra Giove e Venere. Dal vivo ed ad occhio nudo la separazione tra i due pianeti e' assolutamente apprezzabile ma rimane sempre un bello spettacolo


martedì 23 giugno 2015

Raspberry Kiosk (read only mode)

Per una installazione di un monitor informativo (una semplice pagina web che si autoaggiorna) ho pernsato di installare una Raspberry in modo da avere un sistema economico e con poco consumo di corrente


Cio' che non avevo previsto e' che il luogo dell'installazione e' particolarmente soggetto a mancanza di corrente e nel giro di dieci giorni dalla messa in esercizion il sistema e' crollato perche' il filesystem sulla SD Card si e' corrotto

Un sistema che e' provato e' quello suggerito da questo link ma mi sono subito insospettito perche' viene disinstallato il server X. Facendo le prove infatti il filesystem va effettivamente in modalita' di sola scrittura ma X ha necessita' di scrivere dentro la directory /home e quindi la strada proposta non e' perseguibile perche' X Windows non si avvia (rimane uno schermo nero con un cursore che lampeggia beffardo)

L'altra soluzione e' quella di rendere il sistema a sola lettura in generale e di creare invece un filesystem virtuale in memoria per quelle directory in cui e' necessario scrivere come proposto da questo link
Vale comunque la pena di seguire il consiglio di disinstallare i sistemi di log

apt-get remove --purge wolfram-engine triggerhappy cron anacron logrotate  dphys-swapfile 
in sintesi si modifica /etc/fstab per mettere in sola scrittura il filesystem della schedina

/dev/mmcblk0p2 / ext4 defaults,noatime,ro 0 1
(io per essere sicuro ho messo in sola lettura anche la partizione di boot) e si mette la directory /tmp in memoria

tmpfs /tmp tmpfs defaults,size=30M 0 0
a questo punto si installa unionfuse, il sistema per creare il filesystem in memoria (il valore di 30M e' puramente indicativo, si puo' andare tranquillamente fino a 200M)

apt-get install unionfs-fuse

si spostano le directory /var e /home che saranno quelle ad essere realizzate in memoria

mkdir /ro 
mv /var /ro 
mv /home /ro 
 mkdir /var /home

e si aggiorna /etc/fstab

unionfs-fuse#/tmp=rw:/ro/var=ro /var fuse cow,allow_other,nonempty 
unionfs-fuse#/tmp=rw:/ro/home=ro /home fuse cow,allow_other

al succesivo riavvio si potra' scrivere in /home e /var (ma le modifiche saranno in memoria e quindi perse al successivo riavvio) mentre nel resto del file system sara' impossibile accedere in scrittura a meno di non digitare

mount / -o remount,rw

Questo sistema e' ottimo e funziona ma ovviamente si va ad occupare parte della ram con un disco virtuale quindi i processi che gireranno non dovranno essere esosi di ram

Per far partire il sistema direttamente in X conviene riconfigurare
sudo raspi-confige poi scegliere il menu "Enable Boot to Desktop" > select "Desktop Log in .."

per vari motivi puo' essere conveniente installare un browser come Chromium (piu' pesante di quello preinstallato ma con meno problemi nella visualizzazione dei siti)

per mandare in esecuzione automatica Chromium quando parte X si edita il file 
nano /etc/xdg/lxsession/LXDE-pi/autostart

aggiungendo la linea
@chromium --kiosk --ignore-certificate-errors --disable-restore-session-state "http://www.domain.com"

lunedì 22 giugno 2015

Fauna caldinese

E' tempo di lucciole ma anche di questi simpatici animaletti
Le chiavi danno un'idea delle dimensioni


Luna Giove e Venere 20 Giugno 2015

Tre in un colpo solo. Luna Giove e Venere cosi' luminosi da poter essere ripresi anche da cellulare (eravamo usciti per la manifestazione Occhi su Saturno ...)




Ingradire per vedere i dettagli del cielo

sabato 20 giugno 2015

Slow Php Redirect

Uso spesso il redirect verso una pagina html nei siti scritti in Php, piu' che altro per pagine di validazione di password, e non ho mai avuto problemi

basta indicare
<?php 
header("Location: www.google.com");
?>

e non effettuare nessuna operazione di scrittura (leggasi print od echo) e la cosa funziona

Ultimamente ho sviluppato una applicazione per Android/IOS che usa una WebView all'interno della quale c'e' una pagina (ospita su un server esterno) che usa la funzione di redirect ed ho notato un ritardo anche di 10 secondi tra quando viene effettuata la richiesta e quando la connessione viene reindirizzata

Il problema non era nella applicazione mobile. Riscrivendo il codice php in questo modo 

<?php 
header("Location: www.google.com",true,307);
echo "<html></html>";
flush();
ob_flush();
exit;
?>

il reindirizzamento e' immediato

venerdì 19 giugno 2015

Aggiungere directory raw in Android Studio


La directory /raw non e' creata di default da Android Studio.
Per includerla si deve cliccare destro sull'albero del progetto /New/Android resource directory



e poi selezionara rae dal secondo menu a tendina



Includere librerie aar in Android Studio

In questo post viene descritto come includere librerie Android in formato aar in un progetto di Android Studio. Per questo esempio viene indicato come installare Android Beacon Library

1) Esempio 1 : partendo dal file aar

In questo caso si scarica in locale il file aar dal sito del produttore


Dal progetto precedentemente create si clicca destro per New/Module


Selezionando Import Jar or Aar Package


Per selezionare il file si usa il quadratino all'estrema destra della prima casella di testo

Al termine si osserva che compare la nuova libreria nell'albero del progetto

Per includere la nuova libreria nella catena di compilazione di Gradle si deve editare il file build.gradle relativo al Modulo app (attenzione, esistono diversi file build.gradle all'interno di un progetto Android Studio) come indicato dalla riga evidenziata

-----------------------------------------------
apply plugin: 'com.android.application'

android {
    compileSdkVersion 21    buildToolsVersion "21.1.2"
    defaultConfig {
        applicationId "luca_innocenti.nearbeewear"        minSdkVersion 21        targetSdkVersion 21        versionCode 1        versionName "1.0"    }
    buildTypes {
        release {
            minifyEnabled false            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.google.android.support:wearable:1.2.0'    compile 'com.google.android.gms:play-services-wearable:7.5.0'    compile 'org.altbeacon:android-beacon-library:2+'}
-----------------------------------------------

1) Esempio 2 : usando un repository remoto

al posto di installare la libreria in locale si puo' richiederla al momento della compilazione da un server remoto. Per ottenere cio' basta indicare l'indirizzo del server remoto ed il nome della libreria che si vuole includere sempre nel file build.gradle del modulo dell'applicazione (vedi parti in giallo)
Per seguire questa strada e' necessario che la macchina di sviluppo sia sempre connessa con Internet

-----------------------------------------------
apply plugin: 'com.android.application'

android {
    compileSdkVersion 21    buildToolsVersion "21.1.2"
    defaultConfig {
        applicationId "luca_innocenti.beacontrasmitter"        minSdkVersion 21        targetSdkVersion 21        versionCode 1        versionName "1.0"    }
    buildTypes {
        release {
            minifyEnabled false            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'        }
    }
}
final def var = repositories {
    jcenter{
        url "http://jcenter.bintray.com/"    }
}
var

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.google.android.support:wearable:1.2.0'    compile 'com.google.android.gms:play-services-wearable:7.5.0'}dependencies {
    compile 'org.altbeacon:android-beacon-library:2+'}




Crash su sottomissione ad Apple Store


Oggi una sorpresa. Mandando in verifica una app su Apple Store con la stessa procedura che ho fatto solo un paio di giorni fa XCode ha crashato in modo non recuperabile


Chiudere ed aprire Xcode non serve a niente e nemmeno reinstallarlo

La soluzione arriva da questo link: si deve archiviare l'applicazione, lanciare Organizer, chiudere il progetto nella finestraa principale di XCode lasciando aperto Organizer e solo a questo punto si effettua l'upload su Apple Store

Ancora devo capire perche' continuo a pagare soldi per questo tipo di servizio....

giovedì 18 giugno 2015

Settare il tempo su Centos 7

Un piccolo promemoria su come settare il tempo su Centos
Per prima cosa si deve settare/modificare la propria timezone mediante il comando


timedatectl set-timezone Europe/Rome (Italia)
timedatectl set-timezone Etc/UTC (UTC)


per sincronizzare l'orologio con un servizio NTP si deve configurare il file /etc/ntp.conf con l'indirizzo di un timeserver ed aggiornare la regola del firewall

firewall-cmd --add-service=ntp --permanent 
firewall-cmd --reload
systemctl start ntpd

Disinstallare applicazioni da Android Wear

Per disinstallare applicazione da Android Wear non esiste un sistema integrato all'interno dell'orologio.




Se si ha l'applicazione/installer sul telefono basta agire sul telefono che la modifica si replica anche sull'orologio ma se si sta per esempio sviluppando una applicazione in proprio questa strada non risulta applicabile

Ci viene quindi in aiuto adb ma si deve conoscere il nome reale del pacchetto installato (e non il nome dell'applicazione)

Per listare le applicazioni installazione sull'orologio si puo' digitare

adb shell
pm list packages

diciamo che il pacchetto che si vuole disinstallare luca_innocenti.soundwear si esce dalla shell e si digita

adb uninstall luca_innocenti.soundwear

queste istruzioni funzionano se l'orologio e' collegato via USB (ovvero se e' collegato sulla sua basetta). Se invece il debug e' avviato via bluetooth si deve procedere con


adb forward tcp: 4444 local abstract: / adb hub 
adb connect localhost: 4444 
adb devices a
db-s localhost: 4444 shell 
pm list packages 
adb -s localhost: 4444 uninstall luca_innocenti.soundwear

lunedì 15 giugno 2015

Android Wear con Eclipse


Ho un vecchio progetto (vecchio per modo di dire ... ma nell'informatica un anno ha una valenza un po' particolare) in Eclipse a cui volevo aggiungere il supporto ad Android Wear senza trasportare tutto in Android Studio

La procedura per impostare l'ambiente di sviluppo non e' molto lineare e deriva da quanto descritto a questo link

Per prima cosa da Sdk Manager deve essere aggiunto il Google Repository


Una volta terminato il download si deve andare nella directory del proprio SDK ed in particolare in

./extras/google/m2repository/com/google/android/support/wearable/1.0.0/wearable-1.0.0.aar
copiare il file .aar, rinominarlo in .zip e decomprimerlo (attenzione esiste anche un file wearable-1.0.0.jar da non usare)
Dopo lo scompattamento si entra nella cartella, si crea un directory libs e vi si copia il file classes.jar



Si apre quindi Eclipse e si importa la directory con File/New/Project/Android Project From Existing Code
Dopo l'importazione si clicca destro sulla directory wearable-1.0.0. /Properties/Android, si flagga IsLibrary, Apply, Ok e da questo punto in poi e' stato aggiunto il supporto di Android Wear ad Eclipse



Per aggiungere il supporto ad Android Wear ad un progetto si clicca sulle proprieta' del progetto/Android e si aggiunge la libreria wereable




giovedì 4 giugno 2015

ISS Spotting 1 giugno 2015

Grazie ad un passaggio quasi zenitale, l'assenza di nuvole ed un orario non impossibile (22:30) ho provato a riprendere la ISS (dopo i tentativi del 2013 e 2014)

Questa volta mi sono organizzato con una Pentax Mz con un tempo di apertura di 30 secondi e sensibilita' a 3200 ASA ed un Fuji Lumix DMC LS 5 in modalita' ripresa video (la prima montata su cavalletto la seconda semplicemente appoggiata per terra rivolta verso l'alto)

Pentax modificata aumentando il contrasto

video da Fuji (da vedere a tutto schermo alla massima qualita')

lunedì 1 giugno 2015

Mysql SSH Tunnel

In questo precedente post avevo indicato come mettere in ascolto un demone SSH su due schede di rete

Mi e' stato chiesto, sulla stessa macchina di poter interagire con il server Mysql, sia dalla scheda con indirizzo interno che da quella con indirizzo pubblico. Nonostante i vari tentativi di modificare il bind-address (impostandolo per esempio a 0.0.0.0 per il server SSH) non sono riuscito a mettere il server in ascolto.
A questo punto entra in gioco un piccolo trucco; visto che l'accesso SSH e' garantito si puo' creare un tunnel mysql over ssh, in pratica il traffico mysql viene instradato con canale SSH ed il client non si collega direttamente all'indirizzo remoto ma ad un propria porta locale

Il comando per fare cio' e' il seguente
ssh -fNg -L 3307:127.0.0.1:3306 luca@10.1.1.238

ci si collega dal client alla macchina remota (10.1.1.238) collegando la porta remota 3306 (Mysql) con una porta locale 3307

per collegarsi ed interrogare il database si puo' usare quindi la sintassi
mysql -h 127.0.0.1 -P 3307 -u luca 

(testato su Os X e Linux)

Planet Trails con uno smartphone

In attesa di riprendere la ISS al passaggio del 1° Giugno, ho provato a sostituire la digitale  reflex con il telefonino per riprendere Giove e Venere

Le fotografie sono state riprese dalle 21.47 alle 23.00 del 29/05/2015 con il programma Android Camera FV - 5 con una foto al minuto con un tempo di apertura di 10 secondi

Piu' in alto Giove, piu' luminoso ed in basso Venere

Le foto sono state unite mediante il programma StarTrail
Le tracce sono state registrate ma si vede chiaramente l'assenza delle stelle. Confrontando con il programma Stellarium, Giove e Venere erano gli unici oggetti ripresi con magnitudo negativa



Questa l'animazione (osservando attentamente si osserva anche il passaggio di un aereo)


Considerando che il passaggio della ISS e' previsto per 22:30 del 1° Giugno con una magnitudo -3.6 sara' possibile filmarla con il telefono ma ci si puo' scordare si fotografare oggetti con magntudo inferiore a -1 (quindi non si possono fotografare le stelle)

venerdì 29 maggio 2015

2 Nic su Centos 7

Alcune volte puo' essere comodo avere installate due schede di rete, una con indirizzo pubblico ed una con indirizzo di rete interna.

Su Centos la gestione di una scheda aggiuntiva non e' proprio immediata come su altre distribuzioni, a partire dal nome delle interfacce

Dopo aver installato la scheda si procede montato il modulo corrispondente e si digita ifconfig
---------------------------------------
enp0s29u1u4: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 10.1.1.238  netmask 255.255.255.0  broadcast 10.1.1.255
        inet6 fe80::21f:5bff:feff:272e  prefixlen 64  scopeid 0x20<link>
        ether 00:1f:5b:ff:27:2e  txqueuelen 1000  (Ethernet)
        RX packets 513511  bytes 486606241 (464.0 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 39723 (38.7 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

enp3s0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet xxx.xxx.xxx.xxx  netmask 255.255.255.0  broadcast xxx.xxx.xxx.xxx
        inet6 fe80::76d0:2bff:fe33:1b57  prefixlen 64  scopeid 0x20<link>
        ether 74:d0:2b:33:1b:57  txqueuelen 1000  (Ethernet)
        RX packets 40416982  bytes 21343890651 (19.8 GiB)
        RX errors 0  dropped 9381  overruns 0  frame 0
        TX packets 44936717  bytes 45611506292 (42.4 GiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 0  (Local Loopback)
        RX packets 3209  bytes 330370 (322.6 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 3209  bytes 330370 (322.6 KiB)

        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
---------------------------------------
l'interfaccia enp3s0' e' quella che e' stata configurata in automatico durante l'installazione mentre la enp0s29u1u4 e' quella aggiunta in un secondo momento. Ci si deve annotare il MAC Address della nuova scheda.

Si va quindi nella directory /etc/sysconfig/network-scripts/ e si duplica il file ifcfg-enp3s0 su un nuovo file ifcfg-enp0s29u1u4 (da notare che il nome corrisponde all'dentificativo di ifconfig)
---------------------------------------------
TYPE=Ethernet
BOOTPROTO=static
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_FAILURE_FATAL=no
NAME=enp0s29u1u4
ONBOOT=yes
IPADDR0=10.1.1.238
PREFIX0=24
IPV6_PEERDNS=yes
HWADDR=00:1f:5b:ff:27:2e

---------------------------------------------
si inserisce in HWADDR il valore copiato da ifconfig e si elimina il gateway

si rilancia la rete con il comando
systemctl restart network.service

Puo' essere utile mettere in ascolto il demone SSH su entrambe le interfacce di rete (sia quella interna che quella esterna). Per fare cio' si edita il file /etc/ssh/sshd_config impostante il ListenAddress a 0.0.0.0 (che equivale a tutti gli indirizzi IP impostati sulla macchina)

il server SSH si aggiorna con 
systemctl restart sshd.service

giovedì 28 maggio 2015

Hack a keyboard

Hack nel senso di migliorare....
Sto lavorando ad un progetto per modificare una tastiera Usb per renderla un footswitch per cambiare pagina su uno spartito elettronico di MuseScore (cio' non mi rendera' sicuramente un miglior musicista ma sicuramente piu' geek)


L'elettronica di una tastiera USB e' molto ridotta ed e' concentrata sullo su una schedina, il resto e' solo una matrice di fili per arrivare alla posizione dei tasti.
Il connettore e' di tipo a 26 piste divise in due sezioni da 13. Cortocircuitando una coppia di pista si simula la pressione di un tasto


Le tastiere generano di solito un codice di scansione per i tasti standard e due codici di scansione per i tasti speciali (per esempio i tasti di espansione aggiungono il codice 224 mentre il tastierino numerico ha come predecessore il codice 0)


A me interessava cercare la combinazione PageUp e PageDown.
Cosi' mediante il seguente programmino in Python mi sono messo a cortocircuitare coppie di piste e trascrivere su una griglia il risultato
------------------------------------------------------
from msvcrt import getch
import sys
z_old = "a"
while True:
    z = getch()
    # escape key to exit
    if ord(z) == 27:
        break
    if (z != z_old):
        print ord(z)
        sys.stdout.flush()
        z_old = z
------------------------------------------------------


Con una buona dose di fortuna ho trovato quasi subito la combinazione giusta
13/18 : PageUp
13/19 : PageDown

mercoledì 27 maggio 2015

Centos e Debian su Lenovo X200T

Un po' come sfizio (visto il basso costo) mi sono comprato un Lenovo X200T, un portatile convertibile ovvero con la possibilita' di rovesciare il monitor e di usarlo tipo tablet.


Lo schermo e' dotato di un digitalizzatore Wacom da usare mediante penna (non e' un touchscreen che riconosce il tocco delle dita)

Il portatile mi e' arrivato privo di sistema operativo e per non impazzire troppo con Linux ed in digitalizzatore Wacom ho provato ad installare Ubuntu perche' ricordavo che nelle configurazioni di sistema era presente la configurazione di Wacom....ma senza successo.
Al contrario Centos  7 e Debian 8 riconoscono al volo il digitizer (Centos 7 in particolare riconosce tutto l'hardware, wifi compreso, senza dover effettuare ulteriori configurazioni..ma per comodita' ho installato Debian)

Un po' di configurazioni per l'uso in modalita' tablet

1) al login si puo' aprire la tastiera virtuale per inserire la password



2) nel DE si puo' installare una tastiera virtuale come florence




3) con la modalita' tablet si puo' tenere il computer in modalita' landscape o portrait. La rotazione delle schermo puo' essere fatta con il comando

xrandr -o left (landscape)
xrandr -o normal (portratit)

cosi' facendo si ruota lo schermo ma non si ruota il sistema di riferimento del puntatore. Per questo motivo si deve eseguire il seguente comando ad ogni rotazione

xsetwacom set "Wacom Serial Penabled 1FG Touchscreen stylus" rotate ccw

per tornare al settaggio normale del mouse
xsetwacom set "Wacom Serial Penabled 1FG Touchscreen stylus" rotate none

ovviamente non funzionano di default i tasti per la rotazione dello schermo ma si puo' creare una combinazione di tasti che, mediante xbindkeys, permette di effettuare questa operazione.

Una volta installato xbindkeys si lancia
xbindkeys -k

si preme la combinazione preferita, si copiano le tre righe di testo che devono essere inserite .xbindkeys nella propria home. Nel mio caso ho inserito le combinazione CTRL+ALT+z per ruotare lo schermo in formato tablet e CTL+ALT+a per riportarlo in modalita' desktop
-----------------------------------------------------
"/home/luca/rotazione.sh"
    m:0xc + c:52
    Control+Alt + z

"/home/luca/no_rotazione.sh"
    m:0xc + c:38
    Control+Alt + a
-----------------------------------------------------

lo script di rotazione e' il seguente
-----------------------------------------------------
xrandr -o left
xsetwacom set "Wacom Serial Penabled 1FG Touchscreen stylus" rotate ccw
-----------------------------------------------------
mentre quello che riprstina lo schermo e'
-----------------------------------------------------
xrandr -o normale
xsetwacom set "Wacom Serial Penabled 1FG Touchscreen stylus" rotate none
-----------------------------------------------------

martedì 26 maggio 2015

DIY Puzzle Mac

Un portatile Mac e' stato vittima di un incidente stradale (e' caduto da una moto in corsa ed e' stato schiaccciato da diverse macchine)...ovviamente il display e' stato immediatamente distrutto ma i pezzi interni al case unibody (rivelatosi molto resistente) ne sono usciti sostanzialmente integri

dato che ormai erano sostanzialmente inutilizzabili, se non come parti di ricambio, me li hanno prestati per vedere se era possibile ricostruire un pc Mac funzionante


In sostanza i pezzi recuperati sono stati la scheda madre, la matrice della tastiera, la flat dell'hard disk (il disco originario SSD e' stato subito cannibalizzato), il trackpad e l'altoparlante di sinistra con relativa flat

la scheda e' all'interno della scatola bianca al di sotto della tastiera


i pezzi sono stati racchiusi tra due pezzi di legno (case artiginale), il segnale video e' stato preso dalla thunderbolt mediante un adattore, e' stato inserito un hard disk tradizionale ed e' stata collegata una tastiera/mouse della Logitech sulla porta usb (purtroppo iil modulo wifi/bluetooth del portatile erano alloggiati in uno spigolo del case e mi sono arrivati).. il trackpad non e'  stato montato

E' da notare che oltre alla tastiera USB ho dovuto montare anche la tastiera originale (o meglio quello che ne rimane) perche' il pulsante di accensione del Mac (un diaframma a bolla) e' presente solo sulla tastiera



Una volta finito il montaggio e' stato il momento di preparare il disco per installare Mac Os X.
Per fare cio' da App Store si deve scaricare l'installer di Yosemite. Dopo 5 e passa gigabyte si apre in automatico l'installer ma non si deve fare niente. L'installer si autocancella per cui e' consigliabile copiarlo dalla cartella Applicazioni per esempio su Desktop per poterlo usare se qualcosa va male. Senza chiudere l'installer si deve usare DiskMakerX4b4 ed un pen drive USB da 8 Gb per creare una unita' di avvio

Messi insieme tutti i pezzi e' partita l'installazione che e' andata a buon fine



Come si vede la scheda madre apparteneva ad un MacBook Pro 5,5 (13 pollici mid 2009) A1278


L'unico appunto e' che il sistema dopo aver effettuato lo shutdown deve essere disconnesso dal connettore magsafe per poi potersi riavviare


giovedì 21 maggio 2015

Flashare il firmware ad un aliante

Come programmatore non avrei mai pensato di dover appoggiare il portatile su un'ala per cambiare il firmware ad un sistema anti-collisione di un aliante.


Giusto come indicazione non credo che affiderei la mia sicurezza ad un sistema (come quello che ho aggiornato) che:
  1. funziona solo se aggiorni il firmware entro una certa data
  2. funziona solo se anche gli altri alianti possiedono la stessa versione di firmware
  3. si puo' aggiornare solo usando il proprio software proprietario (e' una trasmissione seriale ma non sono dati i parametri per cui o si usa l'applicazione proprietaria Windows o niente da fare)

Il sistema anti-collisione e' la scatola rossa





Salvare uno stream radio su file con Audacity

Oggi un amico ha tenuto una intervista radiofonica presso una radio locale che trasmetteva anche in streaming. Per salvare l'audio della trasmissione era necessario dirotta il flusso dalla scheda audio verso gli altoparlanti verso un file, cosa effettuabile con Audacity.
Il programma usato per leggere lo stream e' stato VLC

La procedura e' leggermente differente in Mac e Windows

MAC
Si deve prima andare in Preferenze di Sistema/ Suono. Nel tab Uscita si deve selezionare Soundflower (2ch) ed nel tab Effetti Sonori/Riproduci effetti audio mediante Soundflower (2ch)

A questo punto non si sentira' piu' nessun suono dagli altoparlanti ma aprendo Audacity con input Soundflower (2ch) e mandando in registrazione Audacity si osserva lo stream catturato

Windows
Su questa piattaforma la cosa e' ancora piu' semplice perche' basta impostare come sorgente il missaggio della scheda audio. Si potra' inoltre ascoltare in diretta la registrazione mentre viene effettuata









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