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.