30 agosto 2015

Leggere e scrivere un databse .accdb senza Access con Libreoffice

Come riportato qui :

'limited olders driver "Microsoft.Jet.OLEDB.4.0" works fine for read/write, while "Microsoft.ACE.OLEDB.12.0" driver only reads; (fdo#43187). Driver only works on Windows.'

Libreoffice non è pienamente compatibile con le ultime versioni di MS Access, già a partire dalla 2010.
Come fare per accedere (in read/write) a preesistenti file nel formato .accdb, senza per forza acquistare la suite di redmond oppure, in ambienti non-Windows, senza eseguirla con wine o VirtualBox?

Ci viene in aiuto UCanAccess (http://ucanaccess.sourceforge.net/site.html), un'implementazione open source del Driver JDBC che permette ai client jdbc (per esempio, DBeaver, NetBeans, SQLeo, Open Office Base, Libre Office Base, Squirrell) di accedere in lettura e scrittura ai database MS Access (.mdb and .accdb).
Essendo scritta interamente in Java, gira su Windows e su sistemi non-Windows (linux), senza la necessita di driver ODBC, grazie all'impiego di:

  • Jackcess coem libreria per accedere a Ms Access (http://jackcess.sourceforge.net/).
  • Hsqldb come  synchronized DBMS (http://hsqldb.org/).
  
L'elenco completo delle feature può essere trovato nell'home page del progetto, assieme al pacchetto con gli eseguibili, giunto alla versione 3.0.0.


Oltre al classico uso del terminale a riga di comando (per i puristi), attraverso l'esecuzione di script da shell (inclusi nel paccheto compresso e che prevedono la possibilità di eseguire comandi SQL e l'esportabilità in formato CVS dei dati), esiste l'opportunità di integrazione con Libreoffice(LO), secondo le modalità di seguito esposte.

Una volta scaricato e decompresso il pacchetto in un percorso opportuno, apriamo LO e consideriamo la scheda "Avanzate" nel menu Opzioni, dalla quale possiamo accedere alla finestra "Percorso classi", premendo il relativo pulsante.

 Si tratta allora di aggiungere gli archivi (in formato .jar) contenuto nel percorso di decompressione ed elencati di seguito:

//ucanaccess-3.0.0.jar
//lib/commons-lang-2.6.jar
//lib/commons-logging-1.1.1.jar
//lib/hsqldb.jar
//lib/jackcess-2.1.2.jar






Quindi chiudiamo LO e riapriamolo, iniziando la procedura di creazione di un nuovo DB, scegliendo l'opzione "Connect to an existing database (JDBC)"

Supponendo che il file MSAccess che voglio manipolare sia "TOL.accdb"  nle percorso, /home/bleish/Scrivania/TOL.accdb, devo completare i campi mostrati nella finestra nel modo seguente (notare la tripla slash):

  • URL della sorgente dati-->   jdbc:ucanaccess:///home/bleish/Scrivania/TOL.accdb
  • Classi di driver JDBC --> net.ucanaccess.jdbc.UcanaccessDriver

Fatto questo posso passare avanti e salvare il database creato in una cartella desiderata.

Da questo momento è possibile aprire il file e manipolare, attraverso JDBC, il file .accdb di Access.
Tuttavia, l'accesso in modalità read/write è solo consentito alle tabellee alle view, e non è possibile gestire form e codice VB; inoltre molte delle tipiche operazioni sulle tabelle non sono consentite.

17 agosto 2015

Django e le migrazioni


Nelle precedenti versioni, Django offriva un sistema di aggiornamento dei modelli e di conseguente sincronizzazione con il relativo schema nel database piuttosto antiquato, permettendo solo di aggiungere nuovi modelli al database, senza modifiche in itinere: non era possibile modificare o rimuovere i modelli esistenti attraverso il comando

syncdb

Aggiornare un'applicazione in modo che rifletta le modifiche apportate al modello diventava qualcosa di laborioso (esistono tuttavia dei tool come South, oppure Django Evolution.

Dalla versione 1.7, sono state introdotte le migrazioni, ovvero l'automatismo attraverso il quale è possibile applicare i cambiamenti del modello (aggiunta di campi, ...) allo schema del database.

Sostanzialmente, si tratta di una procedura molto semplice che possiamo schematizzare nel modo seguente:
  • applicare i cambiamenti al modello;
  • eseguire il comando

    python manage.py makemigrations
  • eseguire il comando

    python manage.py migrate 

Il primo comando, makemigrations, è responsabile della creazione di una nuova migrazione basata sui cambiamenti fatti sul modello; migrate, invece, applica la migrazione, oppure elenca gli eventuali motivi ostativi.
A questi comandi si aggiunge sqlmigrate, che permette di mostrare le istruzioni SQL che verranno eseguite per applicare la migrazione.

Le migrazioni si possono pensare come un sistema di controllo della versione per lo schema del database: makemigrations opera una scansione del modello modificato e un confronto con le versioni precedenti conservate nei files di migrazioni, producendo un impacchettamento dei cambiamenti del modello in un nuovo file di migrazione; migrate, infine, si occupa di applicare i cambiamenti allo schema.

I file di migrazione vengono conservati nella directory
my_app/migrations.

11 agosto 2015

Django, installazione ed estensioni necessarie

"Django makes it easier to build better Web apps more quickly and with less code."
Come recita la pagina principale del progetto Django, è un web framework open source per lo sviluppo di applicazioni web, scritto in Python e sviluppato dalla "Django Software Foundation" (DSF), un'organizzazione indipendente senza scopo di lucro. Stando a wikipedia, utilizzano questo framework Pinterest, Instagram, Mozilla, The Washington Times et al.
Citando la descrizione degli sviluppatori, mostrata in alto, aggiungerei che, non solo è più facile, ma anche più divertente e naturale.

L'installazione si svolge seguendo semplicidue principali alternative:
  • utilizzando, con i privilegi di roor, il package manager pip: (eventualmente da installare nel sistema con sudo apt-get install python-pip ):

    pip install django

    oppure per versione specifica:

    pip install Django==1.8.3
  • manualmente scompattando il pacchetto scaricato dalla pagina di download ed eseguendo, all'interno della cartella radice, il comando:

    sudo python setup.py install
In entrambi i casi si può verificare la versione installato con:

python -c "import django; print(django.get_version())"

Può essere utile aggiornare una precedente installazione; di questo si occupa automaticamente il comando

pip install -U django

che provvede a  disinstallare completamente la precedente versione e installare la nuova.

Un gruppo di estensioni interessanti si installa con il comando

pip install django-extensions

delle quali parleremo più diffusamente in seguito.

Utilizzando pip è anche possibile procedere alla disinstallazione con il comando

sudo pip uninstall django

Analogamente è possibile interrogare pip per sapere quali estensioni di django sono installate:

sudo pip freeze | grep -i django

Ulteriori informazioni possono essere reperite nella guida di installazione.

25 marzo 2013

VideoLAN e gli streaming rtmp



Benché sia chiaramente dichiarato nel wiki di VideoLAN, il Real Time Messaging Protocol (RTMP) non è pienamente supportato dal noto, versatile e open-source media player. In altre parole, le playlist non si avviano.

Tuttavia esiste un tool, scritto originariamente per altri player, che può funzionare bene al nostro scopo, permettendoci di continuare ad usare VLC.

Si tratta di RTMPDump, un toolkit che supporta gli stream rtmp, inclusi rtmp://, rtmpt://, rtmpe://, rtmpte://, e rtmps://.

A parte tutte le possibili configurazioni che offre, a noi interessa quella di agganciare un flusso rtmp e inviarlo, tramite pipeline, a vlc che lo riproduce. Un esempio è:

rtmpdump.exe -r "rmpt://url/dove/si/trova/il/flusso" | 'C:\Program File\VideoLAN\VLC\vlc.exe'

Ovviamente il path di vlc.exe può variare da contesto a contesto.
Una versione compilata si trova qui.

21 aprile 2012

Netcat e l'invio di dati.

Netcat è un programma opensource a riga di comando di comunicazione remota utilizzabile per moltissime funzioni: eseguire una scansione sulle porte di un computer remoto o ascoltare in locale, trasferire files, essere usato come una chat o persino per la creazione di una backdoor.

Un elenco dettagliato di tutte le opzioni richiamabili con le relative funzioni  è presenta nella relativa pagina di wikipedia.it, insieme ad alcuni esempi di utilizzo.

In questa sede mi preme mettere in evidenza l'uso come trasferimento di file e dati.

Supponiamo di avere due computer A e B collegati in remoto tramite la rete, di cui si conoscono gli indirizzi IP; supponiamo si voglia trasferire una immagine a basso livello del disco fisso del computer A verso il computer B; supponiamo inoltre che in entrambe le macchine sia presente netcat installato, assieme a dd e bzip2.

Prepariamo intanto la macchina B a ricevere i dati, mettendola in ascolto su una porta libera, ad esempio 19000
$ nc -l 19000 | bzip2 -d | dd bs=1M of=/path/to/file/destinazione.img
Il computer B si aspetta dati in blocchi da 1Mb compressi con bzip2 e li va raggruppare in un file destinazione.img, secondo il percorso indicato.
A questo punto la macchina A può inviare dando il comando
$ dd bs=1M if=/dev/hda | bzip2 -c | nc computerB.dominio.com 19000
 Esiste anche una versione più aggiornata e complessa, socat, e anche una versione che fa uso della crittografia, cryptcat.
Il sorgente è anche compilabile (ed il relativo eseguibile utilizzabile)su Windows; una build è scaricabile da qui.

20 febbraio 2012

La lettura delle scale logaritmiche.


Prendiamo il grafico della funzione logaritmo in base 10 rappresentato sopra (con scale differenti per i due assi coordinati), che costituisce la legge con la quale vengono "compresse" le coordinate dei punti di un determinato grafico per renderlo in forma logaritmica.

Supponiamo di avere un'ascissa $X $ da posizionare su una scala logaritmica; in tale scale ogni decade mantiene la stessa ampiezza $ D $cm, mentre sia $ d$cm la distanza dell'ascissa da posizionare dalla decade immediatamente precedente, che indichiamo con $ X_0$; allora dal grafico di sopra si ha
$ log(X_0) è \frac{d}{D}=log(X) $
da cui segue
$ d=D \cdot log \frac{X}{X_0} $
Quindi, andremo a cercare la nostra ascissa a distanza $ d $cm  dalla decade di riferimento.

Viceversa, se abbiamo la misura $d$ cm, allora leggiamo un'ascissa:
$X=X_0 \cdot 10^{\frac{d}{D}}.


Riferendoci al grafico sottostante, se volessimo determinare l'ascissa (o l'ordinata) di un punto A sul grafico, dovremmo partire dal considerare la decade immediatamente inferiore (ovvero relativa all'ordine di grandezza 0.1) e considerare le distanze, rilevabili con un righello dal grafico,

$ \overline{OA}=2.47cm $
$ \overline{OB} =4.65cm $

$ X_A = 0.1 \cdot 10 ^ {\frac{2.47}{4.65}}=0.34 $

Analogamente se dobbiamo individuare il punto C di ascissa $ X_C=15.75 $, avremo che la sua posizione sul grafico sarà a distanza
$4.65cm \cdot log \frac{15.75}{10}=0.92cm $
dalla decade immediatamente inferiore.

Precisione e accuratezza

Precisione ed accuratezza sono termini usati per descrivere sistemi e metodi per misurare, stimare o predire, o comunque in tutti quei casi in cui si vuole conoscere il valore vero.
Nella fattispecie, un qualasiasi metodo utilizzato porta ad un determianto risultato, rispettando un predefinito  ciriterio, che si vuole sia il più vicino possibile al valore vero.
Precisione ed accuratezza sono modi per descrivere l’errore che può esistere fra questi due valori.

Sfortunatamente, precisione ed accuratezza sono utilizzati in maniera intercambiabile nella documentazione non tecnica. Nell'Ingegneria e nella Fisica sperimentale esse hanno un significato diverso che di seguito andremo ad evidenziare.
Come esempio, consideriamo un oceanografo che misura la profondità del mare usando un sistema  sonar. Le onde sonore del sistema di misura viaggiano a velocità relativamente costante nell’acqua, permettendo di rilevare la profondità dal tempo trascorso tra gli impulsi trasmessi e ricevuti. Questa particolare misura può  essere affetta da molti fattori: rumore casuale nei circuiti elettronici, onde sulla superfici dell’oceano, flora marina sul fondale oceanico, variazioni nella temperatura dell’acqua che causa una variazione della velocità di propagazione delle onde sonore, etc.
Per investigare questi effetti, l’oceanografo compie molte letture ripetute in un punto che si sa essere  profondo  esattamente 1000 metri (il valore vero). Queste misure vengono poi riordinate nell’istogramma mostrato in figura. Come ci si aspetta dal Teorema del Limite Centrale, i dati acquisiti seguono la  “distribuzione normale”. Il valore medio si trova al centro della distribuzione e rappresenta la migliore stima della profondità basata su tutti i dati misurati. La deviazione standard definisce la larghezza della  distribuzione, descrivendo quanta variazione si presenta fra misure successive.
Questa situazione dà luogo a due tipi di errore a cui il sistema può essere soggetto:
  •  Innanzitutto, il valore medio può essere traslato rispetto al valore vero; tale scostamento è chiamato accuratezza della misura;
  • inoltre, misure individuali possono non coincidere bene fra loro, come indicato dalla larghezza della distribuzione; questa varibilità è chiamata precisione della misura ed è espressa dal valore della deviazione standard o dal rapporto segnale-rumore.
 
Si consideri una misura che ha una grande accuratezza ma piccola precisione: l’istogramma è centrato sul valore vero ma è molto largo. Sebbene le misure siano corrette nell’insieme, ognuna di loro è una cattiva stima del valore vero. Questa situazione è detta avere una scarsa ripetibilità; le misure effettuate in  successione non coincidono bene. Una piccola precisione deriva dagli  errori casuali, ovvero dagli errori  che cambiano ogni volta che la misura viene ripetuta, per cui la precisione risulta un'ottima stima del rumore cauale. Mediando su parecchie misure, miglioreremo la  precisione.
Adesso, immaginiamo una misura che è molto precisa ma che ha una piccola accuratezza. Ciò rende l’istogramma molto stretto ma non centrato sul valore vero. Una piccola accuratezza deriva dagli  errori sistematici, ovvero quegli errori che vengono ripetuti esattamente nella stessa maniera ogni volta che viene effettuata la misura. L’accuratezza di solito è dipendente da come si calibra il sistema. Per esempio, nella misura della profondità dell’oceano, il parametro direttamente misurato è il tempo trascorso. Questo è convertito in profondità da una procedura di calibrazione che mette in corrispondenza i  millisecondi con i  metri. Questa procedura può essere semplice come il moltiplicare per una velocità fissa o complicata come
dozzine di correzioni del secondo ordine. Mediare le misure individuali non migliora per nulla l’accuratezza. In breve, l’accuratezza è una misura della calibrazione.

Nella pratica attuale ci sono parecchie situazioni in cui precisione ed accuratezza possono essere correlate. Per esempio, immaginiamo di costruire un amplificatore elettronico con resistori con tolleranza 1%. Questa tolleranza indica che il valore di ogni resistore sarà entro l’1% del valore nominale entro un grande insieme di variabilità di fattori come temperatura, umidità, età, etc. Questo errore nella resistenza produrrà un corrispondente errore nel guadagno dell’amplificatore. Questo errore è un problema di accuratezza o di precisione? La risposta dipende da come si effettua la misura. Per esempio, si supponga di costruire un amplificatore e di testarlo parecchie volte per pochi minuti. L’errore nel guadagno rimane costante in ogni test e si conclude che il problema è l’accuratezza. Viceversa, si supponga di costruire  mille amplificatori. Il guadagno da dispositivo a dispositivo fluttuerà in maniera casuale e il problema sembra essere di  precisione. Nella stessa maniera, ognuno di questi amplificatori mostrerà fluttuazioni nel guadagno al variare della temperatura e di altri parametri ambientali. Di nuovo, si parlerebbe di un problema di precisione.
Quando si decide con quale nome chiamare un problema, bisogna porsi due domande:
  1. Mediare successive letture migliorerà la misura? Se si, è un problema di precisione; se no, diaccuratezza. 
  2. La calibrazione correggerà l’errore? Se si, è un problema di accuratezza; se no, di precisione. Ciò potrebbe richiedere un poco di riflessione, specialmente su come ildispositivo sarà calibrato.
 
Nota: In alcune situazioni, il valore medio descrive cosa si sta misurando mentre la deviazione standard
rappresenta il rumore ed altre interferenze. In questi casi la deviazione standard non è importante per se
stessa ma in relazione al valore medio. Ciò ha dato luogo al termine rapporto segnale–rumore (signal-to-
noise ratio, SNR) che equivale al valore medio diviso la deviazione standard. 


fonte:
Steven W. Smith - The Scientist and Engineer's Guide to Digital Signal Processing - 2ed.
1999 - California Technical Publishing

28 aprile 2010

Scan2pdf bash script

Tutti conoscono la semplicità di utilizzo dei nautilus-script. E' per questo che ho realizzato questo semplice script che permette in maniera semplice e veloce la conversione di documenti cartacei in formato elettronico pdf, facilmente archiviabile e rintracciabile.

Vi sono molti utilities e programmi che svolgono lo stesso lavoro, primo fra tutti l'eccellente gscan2pdf; a me serve però qualcosa di semplice e sbrigativo, nonchè affidabile e potente.
#!/bin/bash
#
# scan2pdf - ver 0.2
# Questo script avvia lo scanner impostandolo con opzioni 
# comuni e produce in uscita un unico documento in formato 
# PDF che contiene le pagine scannerizzate
# 
# 2010 - bleish.wordpress.com


# $1="" se non è stato selezionato nessun file nella cartella 
# cliccata, allora la cartella di lavoro è quella cliccata 
# altrimenti prendiamo come cartella di lavoro quella 
# restituita proprio da $1
if [[ "$1" != "" ]]
then 
cd "$1"
fi   
gnome-terminal --geometry=60x25 -x scanimage -p --mode Gray \
--resolution 150 --compression JPEG --jpeg-quality 10 \
--batch-scan=yes --batch='outscan%0.3d' 
PACK=out
tmpdir=`pwd`
[ -e "$PACK.pdf" ] && PACK=`mktemp -u --tmpdir=$tmpdir out-XXX` 
convert outscan* $PACK.pdf 
rm outscan*


A questo punto basta installare lo script nella cartella ~/.gnome2/nautilus-scripts

10 febbraio 2010

Scrivere librerie MEX in C/C++

Gli elementi principali di un file mex in Matlab, scritto in linguaggio C/C++, sono principalmente quattro
  1. l'header mex.h
  2. il gateway mexFunction
  3. Gli array mxArray
  4. Le API function

mex.h

#include mex.h

Ogni mex-file scritto in C/C++ deve avere una direttiva di inclusione del header mex.h, in modo da poter utilizzare le API nella forma delle routines mx*

Il gateway mexFunction
mexFunction(int nlhs, mxArray *plhs[ ], int nrhs,
const mxArray *prhs[ ])
{
...
}

La routine di gateway tra il file mex e Matlab è chiamata mexFunction e, sostanzialmente, costituisce il "main" della libreria che andiamo ad implementare.

Tale routine, dichiarata il cui prototipo è dichiarato in mex.h, presenta i seguenti elementi:
  • nlhs è il numero di mxArray in uscita (lhs - left hand side)
  • plhs è un array di puntatori agli mxArray delle uscite attese
  • nrhs è il numero di ingressi (rhs - right hand side)
  • prhs è l'array di puntatori agli mxArray dei dati di ingresso, che sono read-only (const)

Si noti che il suffisso dei nomi di queste variabili si riferisce alla loro usuale posizione in una chiamata di funzione nell'ambiente Matlab. All'avvio dell'esecuzione del codice contenuto nel mex-file, i puntatori in plhs sono indefiniti, in quanto è compito del programma definirli esplicitamente (il compilatore non si occuperà di controllare se ciò avvenga).

mxArray

Si tratta di una struttura dati che gestisce i dati del programma e costituisce la rappresentazione in C dei vettori/matrici/string/cell di Matlab

Un mxArray viene dichiarato come una qualsiasi variabile
mxArray *myarray;
ma occorre che esso sia inizializzato con una mx* routine prima di essere usato (ad esempio, mxCreateNumericArray). Si noti che i dati in un mxArray vengono letti/scritti secondo il tipico ordine di Matlab, ovvero in colonna e verso destra, a differenza del C/C++ che li legge in riga e verso il basso.

Le API functions

Le API function prevedono, tra l'altro, le funzionalità per il trasferimento dei dati tra i mex-file e Matlab, la possibilità di richiamare funzioni Matlab dal codice sorgente in C/C++ e l'accesso ai dati contenute in un mxArray. Quelle più usate sono relative alla:
  • creazione di array (mxCreateNumericArray, mxCreateCellArray, mxCreateCharArray);
  • accesso agli array (mxGetPr, mxGetPi, mxGetM, mxGetM, mxGetData, mxGetCell)
  • modifiche agli array (mxSetPr, mxSetPi, mxSetData, mxSetField)
  • controllo di un array (mxIsClass)
  • gestione della memoria (mxMalloc, mxCalloc, mxFree, mexMakeMemoryPersistent, mexAtExit, mxDestroyArray, memcpy)
  • altro (mexEvalString, mexCallMATLAB, mexPrintf, mexWarnMsgTxt )

Una descrizione completa è reperibile in MATLAB External/API Reference Guide.

Di seguito presentiamo un esempio di un mex-file che creare un mxArray per contenere i dati in uscita
#include "mex.h"
void mexFunction(int nlhs, mxArray *plhs[],
int nrhs, const mxArray *prhs[])
{
int i, j, m, n;
double *data1, *data2;

if (nrhs != nlhs)
mexErrMsgTxt("The number of input and output arguments must be the same.");

for (i = 0; i < nrhs; i++)
{
/* Find the dimensions of the data */
m = mxGetM(prhs[i]);
n = mxGetN(prhs[i]);

/* Create an mxArray for the output data */
plhs[i] = mxCreateDoubleMatrix(m, n, mxREAL);

/* Retrieve the input data */
data1 = mxGetPr(prhs[i]);

/* Create a pointer to the output data */
data2 = mxGetPr(plhs[i]);

/* Put data in the output array */
for (j = 0; j < m*n; j++)
{
data2[j] = 2 * data1[j];
}
}
}

Altri esempi sono reperibili qui.

Librerie mex in matlab per windows con compilatore gnu

In Matlab, i file MEX (matlab executable) permettono l'esecuzione di propri codici in C/C++ o Fortran direttamente dall'ambiente Matlab come se fossero delle funzioni o routines built-in. I principali vantaggi sono essenzialmente due: la possibilità di utilizzare codice scritto in C/C++ o Fortran senza il bisogno di riscriverlo come script m-file; inoltre, una maggiore efficienza di tale codice (soprattutto nei cicli for) riguardo i tempi di esecuzione.

L'inizializzazione del sistema di compilazione avviene eseguendo
mex -setup
dal prompt di Matlab.
In ambiente Windows, sono supportati una varietà di compilatori, come quelli Borland e Microsoft; tuttavia, in questa sede ci interessa configurare il sistema per l'utilizzo di strumenti GNU e/o open-source, che nativamente non sono presenti nel sistema. Possiamo optare per MinGW oppure per CygWin; noi abbiamo preferito il primo.
Una volta installato il compilatore con tutte le librerie, verificato che le variabili di ambiente sono correttamente configurate, passiamo alla configurazione del sitema mex tramite la comoda utility gnumex.




Tale utility va a creare lo script mexopts.bat che viene richiamato per ogni compilazione, invocando, con i giusti parametri, il compilatore gcc.
Se tutto è andato a buon fine, dovrebbe essere possibile eseguire la compilazione di un codice di esempio fornito con Matlab:
mex yprime.c
Le funzioni implementate nella nuova libreria yprime.dll, generata dalla compilazione del codice C, possono essere invocate come le usuali funzioni di Matlab:
yprime(1,1:4)

ans=
2.0000
8.9685
4.0000
-1.0947

Ulteriori informazioni:

4 febbraio 2010

Cornice sfumata con Nautilus-script

Il seguente script modifica una immagine selezionata per produrne un'altra con una cornice sfumata trasparente di pochi pixel.

#!/bin/sh
# Questo Script modifica l'immagine in ingresso, aggiungendo una cornice sfumata
# dipendenze: imagemagick, bc
#
# 2010 - ver 0.1 - bleish.wordpress.com
PERCORSO=`pwd`
[ -n "$PERCORSO" ] && cd "$PERCORSO"
if [ $# -eq 0 ]; then
zenity --title="PDFJoin" --error --title="Attenzione"\
--text="Seleziona un file."
exit 1
fi
h=`identify -format '%h' "$1"`
w=`identify -format '%w' "$1"`
h1=`echo $h-5 | bc`
w1=`echo $w-5 | bc`
stringa="rectangle 5,5 $w1,$h1"
TEMPFILE=`tempfile`
MASK=`tempfile`
convert "$1" "$TEMPFILE.png"
convert -size ${w}x${h} xc: -draw "$stringa" -blur 30x3 -negate "$MASK.png"
convert "$TEMPFILE.png" "$MASK.png" +matte -compose CopyOpacity -composite "c$1.png"
rm -f "$MASK.png"
rm -f "$TEMPFILE.png"
rm -f "$TEMPFILE"
rm -f "$MASK"

E' utile inserire lo script tra i nautilus-script in ~/.gnome2/nautilus-scripts
Nelle immagini di seguito rappresentate si può vedere il risultato dell'esecuzione dello script.

gnome-screenshot e istantanee parziali del desktop


gnome-screenshot è utile per catturare una istantanea dello schermo. Sui sistemi linux (e ubuntu :-P) sono configurate di default le possibilità di catturare una schermata dell'intero schermo oppure di una finestra attiva, utilizzando la combinazione id tasti Stamp e Alt+Stamp. Tale opportunità si presenta anche da consolle, con i comandi, rispettivamente:
gnome-screenshot
oppure
gnome-screenshot -w
Oltre a queste opzione, sono interessanti anche l'uso del ritardo di cattura (--delay=SECONDS), la possibilità di aggiungere effetti come bordi od ombre (--effect=border, --effect=shadow) e, infine, la possibilità di visualizzare una comoda GUI per indicare queste ed altre opzioni prima di effettuare l'istantanea.
Tuttavia, l'opzione più interessante è quella di poter indicare la regione del desktop da catturare, in modo da evitare fastidiosi ritagli e fotoritocchi successivi alla cattura:
gnome-screenshot -a
Questo può essere un comando personalizzato da inserire tra le scorciatoie da tastiera, magari associate alla pressione della combinazione dei tasti Ctrl+Stamp. Vedi la figura in alto per maggiori dettagli.

26 gennaio 2010

Aggiornare ora e data del sistema con ntpdate

E' da un po' di tempo che ho un fastidioso problema con il mio pc ubuntu. A quanto pare si è scaricata la batteria che alimenta la logica cmos della scheda madre, in quanto, quando spengo il computer e tolgo l'alimentazione, al riavvio trovo sempre l'orologio di sistema in ritardo.

A parte cambiare la batteria (e forse sarebbe meglio cambiare il computer ;-) ) si può ovviare con un comando eseguito all'avvio che sfrutta il protocollo NTP per sincronizzare l'ora e la data attraverso la rete:

sudo ntpdate it.pool.ntp.org

Questo comando, ovviamente, risulta poco indicato nel caso di computer desktop, ma risulta interessante nel caso dei server, in quanto permette di mantenere coerenti i log di sistema.

Link utili:

Prove di scrittura con latex e formule matematiche

Per visualizzare nella pagina delle perfette formule matematiche basta inserire nel template della pagine dopo il tag head il seguente codice:
 <div style="color: black;"> <script src="http://www.maths.nottingham.ac.uk/personal/drw/LaTeXMathML.js" type="text/javascript"> </script></div>
Alternativamente, è possibile, nella scheda layout del blog, inserire un gadget HTML/Javascript, privo di titolo, in cui inserire il codice precedente.
Seguono alcuni esempi; altri esempi li trovi qui.

\$F^\prime=\frac{dF}{dx} =\int_b ^a  x^2 dx+ 1/2\$
 $F^\prime=\frac{dF}{dx} =\int_b ^a  x^2 dx + 1/2$

\$\alpha_i^2=\beta+\Gamma \cdot sin (\lambda+\rho+\pi)\$
$\alpha_i^2=\beta+\Gamma \cdot sin (\lambda+\rho+\pi)$

\$\sqrt {q}=\hat a +\widehat {ABCD} \$
$\sqrt {q}=\hat a +\widehat {ABCD}$

\$\forall  \exists  \angle  \sum  \prod  \infty  \pm\$
 $\forall \exists \angle \sum \prod \infty  \pm $

\$\begin{eqnarray} x &=& \frac{-7 \pm \sqrt{49 - 24}}{6} \\ &=& -2 \textrm{ or } -\frac13. \end{eqnarray} \$

$\begin{eqnarray} x &= & \frac{-7 \pm \sqrt{49 - 24}}{6} \\ &= & -2 \textrm{ or } -\frac13. \end{eqnarray}$

 \$\displaystyle{ A = \left[\begin{array}{c c c} 1-x & 0 & 0 \\ 0 &1-x &0 \\ 0 &0 &1-x \end{array}\right].\$
$\displaystyle{ A = \left[\begin{array}{c c c} 1-x &0 &0 \\ 0 &1-x &0 \\ 0 &0 &1-x \end{array}\right].$

25 gennaio 2010

Hello world!

Finalmente mi sono deciso. Finalmente. Spero sia un utile strumento per crescere professionalmente e personalmente.