lunedì, febbraio 26, 2007

Scarnificato

Scarnificato


Casualità d'un incontro, donato
da colui che domina l'avvenire,
aveva mutato mia esistenza.
Prati fioriti, boschi, laghi, monti;
tutto splendeva con te al mio fianco.

Ci siamo raccontati, accuditi,
osservati, carezzati, amati;
compenetrati e complementati.
Fulminea entrasti nel profondo,
crescendo nella mia vita: fu tua.

Pensieri, speranze e sogni freschi;
polpa di esistenza calda, rosa.
Or hai abbandonato questo sangue,
appaio carcassa scarnificata,
vuoto incolmabile: or ti sogno.

desiderio d'affetto tuo pervade,
m'impregna, umido 'l guanciale, freddo;
io caloroso, ora sento 'l gelo.
Tuo pensiero, via lo caccio tremante,
ma m'insegue, nei sogni e nel cuore.


Gabriele Lombardi

mercoledì, febbraio 14, 2007

Istinti opposti distruggono

Istinti opposti distruggono


A volte inspiegabil, istintiva
reazione a propri desideri,
i più intimi, profondi e dolci,
carezza, sguardo, affetto trasmesso,
distrugge realtà che fu rosea.

Cercavo solo lievi tue carezze;
esprimevo come peggio si possa.
Avrei trovato con gesti soavi,
avrei dovuto comprender che tu
altrettanto cercavi mei sussurri.

Non ho capito e non ho spiegato,
ho solo mostrato forte mancanza
con scontento arrogante, lascivo.
Avrei dovuto, ma non ho fatto,
or me ne pento, è tardi purtroppo.

Mente mia s'attorciglia su sè stessa,
cuor si contrae, dolor inespresso.
Ancor non riesco a capacitarmi
d'aver perso simil tua ricchezza,
per stupidità d'opposti istinti.

Del senno di poi son piene le fossa,
ora vero come mai chiaro vidi.
Or darei tutto per poter trasmetter
parola, carezza, sorriso, bacio.
In me stesso, resto solo, afflitto.


Gabriele Lombardi

lunedì, febbraio 12, 2007

Ali tarpate

Ali tarpate


Ali tarpate iteratamente;
sovente accennan volo libero;
poi Tu, e io servo e aiutante,
scagli rose di cupi pallettoni
contro librante illuso misero,
un ascoltatore di emozioni.

Tu, immortal d'Odiesseo irato,
sballotti ludicamente tui figli,
disperdi nel mar del pensier brumato:
tarli profondi brulicano svelti,
picchian sul cuore come grossi magli;
ed io, complice, causa di risvolti.

Ma probabilmente Tu non esisti,
se non nelle nostre menti bacate:
Tu sei solo casualità, fingesti
d'esser divinità, per assolverci
da nostre azioni; tornan spietate
conseguenze, s'adopran per ferirci.

Tarpate t'ho l'ali, troncando netto
nostro volo una volta sereno;
pensandoci par mi sento d'inetto.
Chiedi se t'odio: mai potrei, in questa
o altra vita, amandoti, veleno
d'odio provar, tua scelta non lo desta.


Gabriele Lombardi

Parole, pensieri e sensazioni

Parole, pensieri e sensazioni


Pare incredibile,
quanto nascosti restin
sensazioni, affetto,
dispiaceri, tristezza,
delusi desideri,
sentimenti profondi.

Pensieri già tradiscon:
non posson descrivere;
parole riassumon:
troppo vorremo dire;
timori mi strozzano
favellar sul nascere.

A volte trovo, forte
d'inferto minor danno,
silenzio soluzione:
trattener dentro di sé,
per non infligger colpi
di certo non voluti.

Di tante cicatrici,
silenzio reciproco,
non so dove si pone:
lenta medicazione,
o truce e crudele
reciproco supplizio?


Gabriele Lombardi

martedì, gennaio 23, 2007

GoF design patterns

Chi non avesse mai studiato o letto il libro "Design Paterns" della GoF (Gang of Four).. ma anche chi lo conosce a memoria ed è uno "squilibrato patternizzatore" di tutto il codice che scrive.. eccovi un link ad un lavoro di descrizione per esempi dei pattern GoF.. comprensivo di tavola periodica dei design patterns :D

GoF Design Patterns

C++: i paradigmi Object Oriented e Generics Oriented accoppiati

Con il C++ si ha un esempio di linguaggio di programmazione multiparadigma in cui i vari paradigmi inclusi sono in grado di cooperare per generare nuove famiglie di design patterns. In particolare in C++ è possibile sfruttare in maneira furba l'esistenza di OO e dei generics (templates) per ottenere codice flessibile ed ottimizzato per le proprie esigenze.
Al link seguente troverete un pattern curioso.. che per questo ha preso il nome di Curiously Recurring Template Pattern (CRTP).
Un altra serie di pattern a paradigma misto.. li pubblicherò in questo blog a breve.. vi aspetto ;)

giovedì, gennaio 11, 2007

lunedì, gennaio 08, 2007

Flatlandia: quesito di dicembre 2006

Questo mese è stato proposto il seguente quesito:

Sono dati due segmenti b e c (b>c).

Disegnare con essi un trapezio rettangolo ABCD di basi AB=b, DC=c e di altezza AD=b+c.

1) Verificare, e poi dimostrare, che la circonferenza di diametro CB incontra il lato AD in due punti che chiameremo P e Q (AP

2) Determinare in funzione di b e c la lunghezza della corda PQ, le distanze di P e Q dai vertici A e D del trapezio e l’area del triangolo BPC.


Il problema sembra molto più complicato di quello che è: infatti se si disegna il trapezio rettangolo.. e se ne disegna un altro ruotato di 180 gradi facendo aderire il lato obliquo, si scopre che il trapezio è in realtà una porzione di un quadrato. Si scopre inoltre che il centro della circonferenza descritta per simmetria è il centro del quadrato. Chiamato X tale punto, essendo il segmento XC (raggio del cerchio) maggiore del semilato del quadrato di lunghezza (b+c)/2, ed essendo minore della semidiagonale di lunghezza sqrt(2)(b+c), devono per forza esserci punti della circonferenza esterni al quadrato e punti interni, ovvero devono esserci due intersezioni con ogni lato del quadrato. Si osservi che l'esistenza delle due intersezioni si può scoprire e dimostrare anche notando che sul lato superiore del quadrato esiste già l'intersezione C, sul lato inferiore esiste l'intersezione B e per simmetria ogni lato deve avere un'intersezione per ognuna delle distanze DB ed AC.


Una ulteriore nota è la seguente: per simmetria la lunghezza dal segmento CD è identica alla lunghezza del segmento DQ; inoltre, sempre per simmetria, si può considerare l'insieme di punti di intersezione della circonferenza con il quadrato come l'insieme dei punti del quadrato di distanza CD=c dai vertici.

Ovviamente il calolo della corda PQ è ora semplice da effettuare:
PQ = AD-AQ-DP = b+c-2c = b-c

Il triangolo BPC infine è rettangolo: infatti per la simmetria della scelta dei punti, BPC si può ottenere dividendo a metà, lungo una diagonale, il quadrato mostrato in figura.


Il lato PB è lungo l=sqrt(c^2+b^2), il triangolo ha quindi area (l^2)/2.

Mie foto pubbliche

Ecco che finalmente ho messo a disposizione alcune delle mie foto artistiche.. giuro che ne aggiungerò ancora una marea :D
http://picasaweb.google.com/ilgabbio

mercoledì, dicembre 20, 2006

Un framework per l'analisi di dati

Quante volte è capitato, a chiunque faccia ricerca in ambito scientifico, di dover manipolare ed esplorare dati, magari di doverli rappresentare graficamente, oppure interpolare con una qualche tencinca, per esempio con le T-spline. Se non si utilizza un software commerciale come Matlab e si sta lavorando in C++ per mantenere un occhio sulla portabilità e un occhio sull'efficienza.. in genere ci si affida a librerie esterne con il risultato di avere un elenco enorme di dipendenze. Ecco qui un framework che mette a disposizione tantissimi strumenti (tutti quelli di cuik si ha bisogno?) sotto un'unico pacchetto: ROOT.
Direi che il modo migliore per apprezzare ROOT è quello di andare a dare un occhio al materiale pubblicato, alle applicazioni che ci sono state implementate utilizzandolo.. e poi scaricarlo e provare ad utilizzarlo :D

sabato, dicembre 16, 2006

Tensor Voting

Il Tensor Voting, tecnica che si sta diffondendo molto rapidamente nella computer vision per il perceptual grouping di informazioni, non può che essere una tecnica citata in questo blog come ospite d'onore: infatti penso che non ci sia nulla di più vicino alla tecnologia, all'arte ed alla percezione di questa tecnica.
Il Tensor Voting affronta il problema di determinare le strutture percettive presenti in un insieme di punti di uno spazio a N dimensioni RN. Tali strutture vengono determinate sfruttando due principi principali:
  1. La "continuazione percettiva" di strutture esistent verso il vicinato: ad esempio se osserviamo una linea tratteggiata vediamo comunque una linea, anche se in realtà si tratta solo di tanti segmenti, questo perchè eprcettivamente tentiamo a "continuare" ogni segmento verso il successivo.
  2. La "morbidezza delle variazioni" delle strutture stesse: qui si intende parlare di smoothness, in questo caso il senso di questo termine è quello di mantenere il più costante possibile (minimizzarne quindi le variazioni) la curvatura delle strutture. Ad esempio la curva con curvatura costante che può unire due punti è un arco di circonferenza, non obbligatoriamente un segmento, infatti l'arco di circonferenza potrebbe evitare variazioni brusche nella derivata prima della curva in una giunzione precedente o successiva.
Non intendo descrivere qui il Tensor Voding, sarebbe decisamente ridondante (si cerci sulla rete, con autori Medioni, Tang e Mordohai), quello che intendo dare come idee.. o come riflessioni sono le seguenti:
  • Esistono tutti gli strumenti matematici che permettono di lavorare algoritmicamente con il Tensor Voting.. ma nessuno strumento di analisi globale, che permetta di interpretarne i risultati.. che sono stupefacenti.. ma che non sono secondo me descritti con sufficiente rigore.. ad esempio non si parla mai dello spazio delle possibili orientazioni, o delle possibili curve, o del fatto che ogni singolo voting è uno step discreto in un automa a stati infiniti.. insomma dal punto di vista analitico manca un bel po' di lavoro (speriamo di essere io a farlo ;).
  • Il Tensor Voting è una tecnica molto pontente, non ci sono dubbi.. però credo che il suo nome debba essere spezzato in due:
    • Tensor: Si lavora con votanti e voti che sono tensori; i votati sono solo punti.
    • Voting: Si tratta di una tecnica di voto, come ad esempio Hough; io direi che la generalizzazione del Tensor Voting più ovvia è il Voting.. una descrizione del voting come meta-tecnica di information transmission fra dati possa essere un formalismo potente, molte tecniche figlie possono essere costruite a partire da questa. Ovviamente in questo caso la matematica analitico-descrittiva del Voting sarebbe l'assoluta essenza del Voting stesso.
  • Dal punto di vista computazionale ci sono vari problemi: è una tecnica che può essere resa molto veloce grazie alle giuste strutture dati, però tende ad occupare una quantità di memoria esponenziale al crescere della dimensionalità N, costruire una tecnica efficiente di sintesi dei tensori del tensor voting field per dimensionalità alte potrebbe essere molto utile.

martedì, novembre 21, 2006

Cellular Neural Networks (CNN)

Gli automi cellulari sono sempre stati considerati dei giochini interessanti, fatti per esplorare le basi più semplici della teoria del caos, osservare comportamenti e proprietà emergenti non banalmente deducibili dalle regole di evoluzione del sistema. La loro natura di "stati definiti su nodi du un lattige rettangolare bidimensionale" però li hanno sempre resi molto vicini alle problematiche di elaborazione delle immagini. Ecco qui un lavoro che permette di esplorare alcune tecniche di elaborazione di immagini basate sugli automi cellulari. Lo strumento teorico, estensione dell'automa cellulare classico, prende il nome di rete neurale cellulare (CNN). I risultati sono interessanti, anche se non mostrano nulla di non ottenibile per altre vie, in genere anche in maniera molto più efficiente.

L'idea di estendere però lo strumento affinchè sia in grado di gestire organizzazioni di cellulle in agglomerati capaci di computazione locale non sarebbe malaccio.. si immaginino delle sorte di agglomerati cellulari che si muovono nello spazio degli stati attingendo alle informazioni presenti in esso e nell'immagine, aggregazioni che magari tendono a nutrirsi di pixel a 1 nell'immagine (binaria) da elaborare, la loro evoluzione potrebbe portare ad agglomerati di cellule addensati dove sono presenti curve o aree, portando ad un perceptual grouping dei dati sparsi ed incompleti.

Potrebbe essere un campo divertente in cui giocare :)

lunedì, novembre 13, 2006

Flatlandia, quesito di Novembre 2006

Nel sito Flatlandia ogni mese viene proposto un quesito geometrico a cui provare a rispondere cimentandosi nella dimostrazione di piccoli teoremi oppure dove è possibile cimentarsi in divertenti costruzioni geometriche. Su questo blog verranno pubblicate le risposte.
Quesito di Novembre 2006:

Costruire un quadrilatero in cui le bisettrici di due angoli opposti (di vertici A e C) siano parallele.

1) Quali caratteristiche presenta il quadrilatero così ottenuto?
2) Potrebbe essere un trapezio o un parallelogrammo?

Descrivere la costruzione e giustificare le risposte.


La costruzione richiesta non è banale, ma può essere ottenuta ragionando sulla costruzione della bisettrice di un angolo dati tre punti (estremo, centro ed altro estremo), e sui gradi di libertà a disposizione. In particolare è possibile utilizzare un SW di geometria vincolata, come kseg, per costruire ciò che di seguito viene descirtto.
  • Il quadrilatero descritto ha 7 gradi di libertà: ovvero perde solamente un grado di libertà nel vincolo richiesto. E' quindi possibile pernsare di utilizzare 6 gradi di libertà per fissare 3 punti del quadrilatero, utilizzare il restante grado di libertà per selezionare la bisettrice parallela a quella (implicitamente) data e trovare quindi la costruzione che permetta di determinare il quarto punto.
  • La costruzione di una bisettrice dati tre punti A, B e C è molto semplice, è sufficiente infatti:

    1. costruire la retta passante per A e B,
    2. proiettare C su tale retta con un arco centrato in B,
    3. Successivamente può essere costruito un segmento DB, ed il suo punto medio E.
    4. La bisettrice è la semiretta che parte da B e passa per il punto E.



  • Per ottenere ora il quarto punto del quadrilatero è indispensabile costruire una retta parallela alla bisettrice appena ottenuta controllabile tramite un punto; per questo motivo si costuisce un punto P libero sul segmento AC e si costruisce la retta passante per esso e parallela alla bisettrice.

  • Per costruzione, esattamente come per il segmento DC, il punto incognito X potrà essere utilizzato per costruire la bisettrice, a noi nota, utilizzando la stessa costruzione. Per questo motivo si costruisce il segmento passante per A e parallelo a DC, si determina il punto di incontro F con la bisettrice di X e si determina il punto proiettato D' a distanza doppiarispetto ad AF.
  • A questo punto, esattamente come B è il punto di incontro tra le rette BE (bisettrice) ed AD, così è possibile costruire la retta CD' e determinare il quarto punto del quadrilatero come incrocio con la bisettrice nota.
  • L'output ottenuta con in input i punti A, B, C e P vincolato sul segmento AC è quello mostrato in figura.
  • Interessante è osservare, al muoversi di P sul segmento AC, quali sono le possibili posizioni del punto X. Per ottenere questa informazione viene costruito il luogo di punti X definito dalle possibili posizioni di P ottenendo quanto mostrato nella figura seguente:
  • Si può mostrare che le possibili posizioni del punto X si trovano su una roto-omotetia dell'iperbole equilatera limitata dai punti A e C e passante per B ed ovviamente X. Un ramo (quello superiore nella figura) consente di ottenere i quadrilateri convessi e l'altro consente di ottenere i quadrilateri concavi.
  • Per quanto riguarda i quesiti: questa costruzione consente di avere tutti e soli i quadrilateri costruibili con le condizioni date, possono essere parallelogrammi ma non trapezi (se non degeneri in rettangoli).

mercoledì, novembre 08, 2006

Matlab: ottenere un numero arbitrario di parametri d'uscita

Spesso in Matlab capita di conoscere solo a run-time il numero di parametri da ottenere in uscita dalla chiamata a una funzione, questa situazione si presenta, ad esempio, se si utilizza la classica funzione ind2sub su un array di dimensionalità non nota a tempo di scrittura del codice.
Si immagini di avere a disposizione un array A ed un indice i di accesso lineare ai dati contenuti in A (accesso non strutturato, vedendo i semplicemente dati come una sequenza senza struttura). Ottenerne le dimensioni è possibile con la funzione size, ottenere l'indice strutturato da i richiede di ottenere in uscita dalla funzione ind2sub un numero di parametri non a tempo di scrittura del codice. L'utilizzo dell'espansione delle celle in sequenze di parametri viene in soccorso:
% Ottenimento delle dimensioni:
sze = size(A);

% Costruzione della cella per i parametri in output:
is = cell(1,numel(sze));

% Conversione dell'indice i in indice strutturato:
[is{:}] = ind2sub(sze,i);

% Esempio di utilizzo degli indici strutturati memorizzati nella cella:
elem = A(is{:});

martedì, novembre 07, 2006

Lenta carne pensante

A volte, il peso del proprio corpo,
ci fa sentire legati
a una realtà terrena da cui fuggire;
lo si vorrebbe abbandonare,
seppur momentaneamente,
per inibirne le distrazioni,
per eliminare dalla mente
gli effetti dei suoi capricci.

M'immagino senza carne,
pensiero puro librante,
capace di incredibili voli pindarici
che mi portino ovunque:
nel cuore di persone fantastiche,
nel cuore di luoghi fantastici,
nel cuore di teorie fantastiche.

Ma il fardello è qui, da trasportare;
la realtà ci mantiene
in uno spazio-tempo limitato;
solo un sospiro e una carezza
possono dar l'illusione della libertà.
Chiudo gli occhi: per un attimo volo.

Tempo fuggevole, luoghi lontani,
li focalizzo chiaramente:
canyon, foreste, oceani e ghiacciai;
luoghi dove dispiegare le ali
d'una ricercata serenità.

Ne carezzo la freschezza,
ne vedo i bagliori,
ne respiro l'aria,
ne odo i silenzi.

Riapro gli occhi,
tornano i sensi,
strette pareti.

Mi opprimono,
mi soffocano.

Uccidono.

venerdì, novembre 03, 2006

Matlab: multidimensional array slicing

Si immagini di avere un array multidimensionale A con un numero di dimensioni non noto nel momento in cui si scrive il codice. Si immagini anche di avere a disposizione un array from contenente per ogni dimensione l'indice di partenza di un'operazione di slicing, e un arrai to contenente gli indici di arrivo. Ipotizzando di avere già svolto tutti i controlli sulle dimensioni e sugli indici si può effettuare lo slicing come segue:

  • Si costruisce una cella contenente per ogni dimensione l'array di indici da utilizzare.
  • Si utilizza l'espansione di celle in elenco di parametri accoppiato con l'operatore di slicing.
Il tutto è riassunto nel codice seguente:

% Parametri forniti:
A = rand(3,3,3);
from = [1,2,1];
to = [3,2,2];

% Costruzione della cella (domanda: il ciclo è evitabile?):
D = numel(size(A));
inds = cell(1,D);
for i=1:D
% Gli indici voluti:
inds{i} = from(i):to(i);
end

% Lo slicing:
sliceA = A(inds{:});

Flatlandia, quesito di Ottobre 2006

Sul sito Flatlandia
ogni mese viene proposto un quesito geometrico da risolvere con la sola logica e la sola geometria. Ecco la mia risposta al seguente quesito di Ottobre 2006:

1) Fissato un segmento BC, costruire un triangolo ABC in cui la mediana AM sia congruente al lato AB.

2) Come si dovrà scegliere AM affinché il triangolo ABC sia rettangolo o acutangolo o ottusangolo?

Giustificare le risposte.



Nella figura è mostrata la costruzione che permette di ottenere il triangolo richiesto. In essa:

  • Si è determinato il punto medio M sul segmento BC. Si è identificato il punto medio D sul segmento BM.
  • Si è costruita la retta passante per D ortogonale a BM: questa retta è ortogonale alla corda della circonferenza passante per B ed M; preso un qualunque punto A su tale retta si ha che la distanza tra A e B è uguale alla distanza tra A ed M (mediana) essendo entrambe raggi della circonferenza costruita. Così è risolto il punto 1.


  • Esistono solamente due punti A sulla retta passante per AD tali che il triangolo ottenuto sia rettangolo. Chiamati A1 ed A2 tali punti si ha che tutti i triangoli AiBC, in cui Ai è un punto sul segmento A1A2, sono ottusi. I triangoli A1BC e A2BC sono rettangoli e gli altri sono acuti.
  • I punti A1 e A2 sono facilmente ottenibili grazie al seguente ragionamento: il triangolo finale, avendo un lato e due angoli in comune con ABD, deve essergli simile. Ma tracciandone la mediana DE come in figura, per similitudine deve essere DE congruente con BD, e quindi con DM, deve quindi essere la mediana la DE metà della mediana AM. Ne segue che il triangolo ABC è il doppio del triangolo ABD. Questo implica che, essendo AE, EB, ED, BD e DM congruenti, devono esserlo anche AB con BM, quindi il triangolo ABM è equilatero; è quindi sufficiente tracciare un arco centrato in B e passante per M per ottenere, come intersezione con la retta AD, i due punti A1 e A2. Così è risolto il punto 2.

martedì, ottobre 31, 2006

Poesia: uno sfogo per i sentimenti?

Penso che la poesia sia per me, come per molti autori, uno sfogo per i sentimenti, per questo si scrive di più e meglio quando qualcosa non và!

Date un occhio a questa poesia di Charles Baudelaire:

L'AMORE E IL CRANIO
Vecchio fregio

Sul cranio dell'umanità
l'Amor sta seduto,
che sembra sul trono, e di là,
con viso paffuto,

soffiando le bolle rotonde
le lancia su in alto
e prende, lievi e gioconde,
le stelle d'assalto.

I fragili globi lucenti
van su spensierati,
ma esplodono tosto:
frammenti di sogni dorati.

invano ogni volta la voce
del cranio garrisce:
"Ma questo giochetto feroce,
quand'è che finisce?

perchè ciò che tu, traditore,
disperdi nel vento,
è il vivo mio sangue, il mio cuore,
il mio sentimento!"

Adoro Baudelaire!!! Penso che molti si immedesimino in questo testo quando qualcosa va male con il partner.

Le mie poesie sono una raccolta di sentimenti, pensieri e sensazioni gettate sulla carta da un ragazzo di differenti età, che scrivendo dall'adolescenza alla (quasi ;) maturità mostra la propria crescita intellettuale e sentimentale. Potete reperirle qui.