giovedì 19 febbraio 2015

XML 2 CSV con XQuery

Il problema di oggi e' prendere un file xml molto lungo, estrarne alcuni campi in base ad alcune regole e poi effettuarne l'esportazione in CSV


La prima cosa che  mi e' venuta in mente e' stata quella di importare l'XML in Mysql, agire con qualche query ed esportare il risultato (Mysql ha filtri nativi sia per xml che csv) ma poi mi sono messo a cercare ed ho trovato XQuery, un linguaggi similSQL che agisce sui file testo xml

Una delle implementazioni di questo linguaggio si trova in xqilla, facilmente reperibile nei repository di Debian

apt-get install xqilla

per semplificare le cose mostrero' come funziona su un file di piccole dimensioni (visualizzato in Firefox che ha un discreto visualizzatore di file xml)


Xqilla non permette di avere un uso interattivo e si deve creare un file con lo script Xquery. L'esempio lo riporto di seguito

esempio.xq
-------------------------------------------------------------
for $x in doc("eventi.xml")/Root/Evento
where $x/Durata>15
return
concat("luca;",
$x/Titolo/text(),
";",
$x/Luogo/text())

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

la sintassi e' piuttosto semplice
nella prima riga viene caricato il file xml con la gerarchia di interesse
nella seconda riga vengono selezionati i record con la durata maggiore di 15
nelle righe successive avviene l'output concatenando una stringa e due campi (senza specifiche viene mostrato il record con i suoi tag per esempio <Luogo>Firenze</Luogo> mentre con la specifica /text() si ottiene il contenuto del record senza i tag)

lanciando il comando
xqilla esempio.xq

il risultato sara'
luca;Calcio in costume;Firenze

comodo, veloce e scriptabile

mercoledì 18 febbraio 2015

FailOver con Corosync/Pacemaker per Apache su Debian/WmWare

Il failover e' un sistema per permettere la continuita' di un servizio di rete mediante due server (di cui uno attivo ed uno passivo) che si sostituiscono nel caso in cui il sistema primario non funzioni in modo corretto



Attenzione : Il sistema indicato gestisce solo i servizi ma non la sincronizzazione dei dati

Per la configurazione e' stata seguita (e parzialmente modificata) la guida a questo link

Per simulare il sistema sono stati creati due server virtuali (deb1 e deb2) ed un client su WMware Player. I server sono stati configurati in modo identico partendo da una Debian base ed installando i pacchetti corosync, pacemaker ed apache2.

Il servizio ad alta disponibilita' (HA) sara' disponibile su 192.168.32.150

deb1 : 192.168.32.138
deb2 : 192.168.32.139
debclient : 192.168.32.140
HA : 192.168.32.150

la prima verifica e' che le macchine siano in grado di pingarsi reciprocamente

per prima cosa e' stato modificato il file /etc/hosts per far risolvere il nome in modo statico dell'altra macchina

per esempio su deb1 e' stato aggiutno
192.168.32.139 deb2.nearbee.it deb2

cosi' da deb1 si puo' pingare direttamente deb2

poi e' stato modificato il file /etc/corosync/corosync.conf  utilizzando il set di indirizzi dei server

interface {
ringnumber: 0
bindnetaddr: 192.168.32.0
 mcastaddr: 226.94.1.1 mcastport: 5405 }

in seguito si verifica /etc/corosync/corosync.conf  abbia ver=0 (di default e' gia' cosi') e si imposta START=yes su /etc/default/corosync

si effettuano le stesse modifiche sia su deb1 che su deb2 e poi si avvia il servizio
/etc/init.d/corosync start

con il comando
crm_mon -1
si devono quindi vedere i due server online

visto che si tratta di una configurazione a due macchine si impostano i seguenti parametri

crm configure property stonith-enabled=false
crm configure property no-quorum-policy=ignore

a questo punto viene impostato l'indirizzo HA 
crm configure primitive VIP ocf:IPaddr2 params ip=192.168.32.150 nic=eth0 op monitor interval=10s 

si verifica che l'ip virtuale 192.168.32.150 sia pingabile

si imposta quindi quale servizio deve essere impostato come high availability (nel nostro caso apache)
(HA-apache e' un nome che puo' essere impostato a piacere

crm configure primitive HA-apache lsb:apache2 op monitor interval=15s
(puo' essere configurato qualsiasi servizio presente in /etc/init.d/)
per verificare che il servizio sia stato modificato usare crm_mon -1
per semplicita' si puo' modificare il file index.html in /var/www inserendo il nome del server per rendere chiaramente visibile quale macchina sta rispondendo


a questo punto il sistema fail over e' completo
con i server deb1 e deb2 accesi e funzionanti, si puo' dal client collegarsi ad 

http://192.168.32.150

e rispondera' il server deb1. Spengendo la macchina virtuale deb1, l'indirizzo virtuale 192.168.32.150 sara' acquisito da deb2, collegandosi quindi ad http://192.168.32.150 sara' la macchina di backup a rispondere




And Now for Something Completely Different

Caserma dei pompieri 
Meccanici di auto
Batman e Joker

Capitan America

Star Wars (Yoda sulla sinistra)




martedì 17 febbraio 2015

RSync Linux to Mac

Dovendo scambiare qualche tera di dati tra una macchina Linux ed un Mac Os X Server 10.9 ho provato a lanciare un rsync al posto di un piu' comune scp

Il primo problema individuato e' stato che su Linux era installata una versione 3.1.1 di rsync mentre su Mac era presenta una vetusta 2.6.9 (rilasciata nel 2006!!!). Cioe' creava conflitto nella trasmissione dei dati

Grazie al progetto Rudix e' stato possibile installare la versione piu' recente e rendere compatibili nel numero di versione la parte Linux e Mac

Rilanciato lo scambio dati, questo e' iniziato ma non riusciva a copiare alcuni file perche' la codifica dei caratteri del nome file era in UTF-8 multibyte (caratteri speciali in particolar modo lettere accentate)

Uno dei suggerimenti trovati su Internet era quello di definire lo switch

--iconv=utf8,latin1

ma all'atto pratico non ha funzionato (alcuni utenti riportano che sia un problema specifico dello scambio da Linux a Mac

Ha invece avuto successo effettuare prima una conversione dei nomi prima di rsync con il comando

convmv -f latin1 -t utf8  --notest file_name

(l'ultimo switch e' quello che rende operativo il cambio di codifica, senza questo viene solo effettuata una simulazione)

lunedì 16 febbraio 2015

Arduino YUN e Internet Dongle

Nel caso di non disporre di una connessione via cavo o via WiFi, Arduino YUN puo' comunque trasmettere i dati connettendo un internet dongle (nel caso specifico un Hauwei E172 targato Vodafone, anno 2008)



La configurazione e' piuttosto semplice perche' puo' essere effettuata mediante la pagina di amministrazione web

Per fare cio' si devono pero' installare i seguenti pacchetti
opkg install luci-proto-3g (per la parte web)
opkg install kmod-usb-serial-option kmod-usb-serial-wwan luci-proto-3g usb-modeswitch-data usb-
modeswitch (per la gestione dell'harware)

A questo punto si va in Luci Menu e si crea una nuova interfaccia



Si configura la porta (per me /dev/ttyUSB0 visibile da logread) e le impostazioni di rete



e tornando indiestro si attiva l'interfaccia di rete



GNUPG

Per inviare mail criptate end-to-end oppure per siglare una mail in modo che sia impossibile modificarla la soluzione piu' semplice e' quella di usare la segnatura GPG (il corrispondente open della PGP)

la procedura per creare le chiavi su Linux da linea di comando e' la seguente. Conviene utilizzare la chiave a 4096 bit RSA/DSA

luca@debian:~$ gpg --gen-key
gpg (GnuPG) 1.4.12; Copyright (C) 2012 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

gpg: directory `/home/luca/.gnupg' created
gpg: creato un nuovo file di configurazione `/home/luca/.gnupg/gpg.conf'
gpg: ATTENZIONE: le opzioni in `/home/luca/.gnupg/gpg.conf' non sono ancora attive durante questa
esecuzione del programma
gpg: portachiavi `/home/luca/.gnupg/secring.gpg' creato
gpg: portachiavi `/home/luca/.gnupg/pubring.gpg' creato
Per favore scegli che tipo di chiave vuoi:
   (1) RSA and RSA (default)
   (2) DSA and Elgamal
   (3) DSA (firma solo)
   (4) RSA (firma solo)
Cosa scegli? 1

RSA keys may be between 1024 and 4096 bits long.
What keysize do you want? (2048) 4096

La dimensione richiesta della chiave è 4096 bit
Per favore specifica per quanto tempo la chiave sarà valida.
         0 = la chiave non scadrà
      <n>  = la chiave scadrà dopo n giorni
      <n>w = la chiave scadrà dopo n settimane
      <n>m = la chiave scadrà dopo n mesi
      <n>y = la chiave scadrà dopo n anni
Chiave valida per? (0)



You need a user ID to identify your key; the software constructs the user ID
from the Real Name, Comment and Email Address in this form:
    "Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de>"

Nome e Cognome: Luca Innocenti
Indirizzo di Email: lucainnoc@gmail.com
Commento:
Hai selezionato questo User Id:
    "Luca Innocenti <lucainnoc@gmail.com>"

Modifica (N)ome, (C)ommento, (E)mail oppure (O)kay/(Q)uit?

gpg: /home/luca/.gnupg/trustdb.gpg: creato il trustdb
gpg: key 48CFC879 marked as ultimately trusted
chiavi pubbliche e segrete create e firmate.

gpg: controllo il trustdb
gpg: 3 marginal(s) needed, 1 complete(s) needed, PGP trust model
gpg: depth: 0  valid:   1  signed:   0  trust: 0-, 0q, 0n, 0m, 0f, 1u
pub   4096R/48CFC879 2015-02-13
      Key fingerprint = E656 AD90 9447 4312 9C70  1773 C490 96A0 48CF C879
uid                  Luca Innocenti <lucainnoc@gmail.com>
sub   4096R/D7979695 2015-02-13
-----------------------------------------------------------------------

KeyID = 48CFC879
Key fingerprint = E656 AD90 9447 4312 9C70  1773 C490 96A0 48CF C879

 ----------

A questo punto sono state create la chiave privata (da tenere riservata) e quella pubblica da distribuire agli altri per poterci inviare messaggi codificati. Evidenziate in giallo i codici delle chiavi
Si puo' verificare il contenuto del portachiavi GPG mediante

luca@debian:~$ gpg --list-keys
/home/luca/.gnupg/pubring.gpg
-----------------------------
pub   4096R/48CFC879 2015-02-13
uid                  Luca Innocenti <lucainnoc@gmail.com>
sub   4096R/D7979695 2015-02-13
-------------------------------------------------------------

Per distribuire la chiave pubblica si puo' inviare il file esportato
gpg -armor --output pubkey.txt --export 48CFC879

oppure si puo' inviare la chiave ai server pubblici in cui sono salvate le rubriche delle chiavi (chi vorra' inviarci una mail criptata puo' cercare le nostre credenziali su questi server)

 gpg --send-keys --keyserver hkp://subkeys.pgp.net 48CFC879




gpg --import keyserver2.pgp.comGlobalDirectoryKey.asc
gpg: key CA57AD7C: public key "PGP Global Directory Verification Key" imported
gpg: Numero totale esaminato: 1
gpg:              importate: 1  (RSA: 1)
gpg: 3 marginal(s) needed, 1 complete(s) needed, PGP trust model
gpg: depth: 0  valid:   1  signed:   0  trust: 0-, 0q, 0n, 0m, 0f, 1u

Per effettuare il backup e copiare le chiavi si puo' seguire

luca@debian:~/Scaricati$ gpg -ao backup_pub.key --export 48CFC879
luca@debian:~/Scaricati$ gpg -ao backup_priv.key --export-secret-keys D7979695

i file delle chiavi sono tutti contenuti nella propria home/.gnupg

/home/luca/.gnupg/pubring.gpg
-----------------------------
pub   4096R/48CFC879 2015-02-13
uid                  Luca Innocenti <lucainnoc@gmail.com>
sub   4096R/D7979695 2015-02-13

pub   2048R/CA57AD7C 2004-12-06
uid                  PGP Global Directory Verification Key
uid                  [jpeg image of size 3400]
uid                  DNR KS1 <do-not-reply@keyserver1.pgp.com>
uid                  DNR-KS2 <do-not-reply@keyserver2.pgp.com>



se si vuole seguire la via semplice invece si puo' usare l'estensione EnigmaMail per Thunderbird. Una volta installata mediante Strumenti/Componenti Aggiuntivi basta seguire i menu' di guida per creare le chiavi GPG e le impostazione di base di invio delle mail (vale per Mac, Windows e Linux)


Con questo sistema e' gestita in modo automatico la pubblicazione di chiavi sui server

Su Gmail esiste una estensione chiamata Mymail-Crypt che pero' mi ha dato problemi con le chiavi a 4096 bit (sembra che accetti solo le chiavi a 2048 bit)


mercoledì 11 febbraio 2015

JWPlayer

Tempo fa avevo provato JPlayer, un plugin JQuery per pubblicare video ed audio su web
Adesso e' il tempo di JWPlayer


l'uso e' intuitivo, basta solo indicare la posizione del file, una eventuale immagine di fermoimmagine
---------------------------------------------------------------------------
<script src="jwplayer.js" ></script>
<div id="myElement">Loading the player...</div>

<script type="text/javascript">
    jwplayer("myElement").setup({
        file: "blue_bossa.mp4",
        image: "vlcsnap.png",
width: 640,
        height: 360
    });
</script>
---------------------------------------------------------------------------
il progetto completo puo' essere scaricato da 
https://drive.google.com/file/d/0B_BeE7yoBqdHYWRpMXN1c1ItaTA/view?usp=sharing
(video ripreso da http://blog.naver.com/silverstarca)

AGGIORNAMENTO
Per poter inserire il player sul proprio server Web e' necessario inserire la chiave che si ottiene registrandosi sul sito di jwplayer

Opencv camera calibration in cpp

Oltre che con uno script Python come visto qui la calibrazione della camera si puo' fare anche con il programma in CPP Questo il proce...