venerdì, novembre 23, 2007

Goccia

Goccia


Goccia mi s'è posata
d'improvviso sul volto:
pioggia lieve, trasporta;
saran d'uno stolto,
ma l'antichi riporta
mente d'era passata.

Frenetico appare
seguirsi d'adulteri
giorni non penetranti:
son gl'intensi valori,
e non i fuorvianti,
cui voglio l'sapore!

Aspirandot'appieno
gusto l'vero valore
ch'amalgama serena
coscienza d'amore;
sublima l'anatema,
errar pare ameno.

Son gli alti e bassi
che compongono succo
di esistenza, piatto
appare il rintocco
d'esistere coatto:
sovente siam percossi!

Usma essenza densa
di quanto già possiedi;
aspira la fragranza
di antichi rimedi
qual vera sostanza:
palpito non pensa.


Gabriele Lombardi

sabato, novembre 03, 2007

Bella

Bella


Come un sorriso solare
che sorge al mattino
e non tramonta mai,
come un angelo sognatore
che dispiega le ali
in un leggero volo libero,
come un delicato fiore
apre i petali vellutati
sfiorato dalla rugiada,
come una dolce amante
trasmette inconsapevole
un amore profondo e intenso;

così tu sai rendermi felice,
così tu sai carezzarmi,
così tu sai essere la mia donna,
così tu sai appagarmi,
così tu sai sorridermi,
così tu sai capirmi,
così tu mi vuoi e ti dai,
così tu mi intrighi,
così tu diventi il mio centro,
così tu.. e nessun'altra..
nel mio profondo t'inerpichi
drogandomi d'amore vero.

Mia bella,
ora ti sento mia
e non posso più pensare
a una vita vissuta senza di te.


Gabriele Lombardi

mercoledì, ottobre 31, 2007

Diamo un occhio ai saponi fatti in casa

Eccovi un piccolo album fotografico dei saponi auto-prodotti:

Saponi

lunedì, ottobre 15, 2007

Saponi saponi e ancora saponi!


Ragazzi.. come mi capita ogni tanto (anzi ogni spesso!) mi salta per la testa qualcosa e parto per la tangente! A sto giro sono partito per la tangente dei saponi e mi son messo a fabbricarne in casa! Se date un occhio al sito ilmiosapone troverete una marea di consigli, strumenti e ricette pronte per essere sperimentate.. considerate fra l'altro che se utilizzate il metodo a freddo potete utilizzare degli strumenti dedicati per il sapone per una spesa complessiva di circa 20€, senza devastare per forza una pentola di casa (che poi familiari vari tipo mogli, mariti o genitori vengono a bussare alla mia porta incazzati neri!!!).

Siccome sul sito del link c'è già scritto tutto.. non vorrei ripetere le stesse informazioni.. a parte il fatto che la soda caustica in drogheria si trova con estrema facilità e costa pure poco (tipo 5€ un kg con cui potete fare circa 8 kg di sapone.. che mi sembrano abbastanza ;).. e che dovete assolutament elavorare con finestre spalancate.. meglio se direttamente in balcone o comunque all'aperto e con tutte le protezioni e precauzioni del caso perché la soda caustica non scherza!!!

A parte tutto questo.. voglio darvi una ricettucola che mi sono inventato io e che mi sembra essere venuta una figata esagerata! Non l'ho trovata da nessuna parte.. quindi è pubblicata qui in esclusiva per voi (oooh ;). ECCOLA!


Sapone orientale rinfrescante

Questa ricetta sembra molto complicata ma in realtà ha l'enorme vantaggio di non contenere ingredienti comlicati da cercare.. molti si possono trovare in qualunque erboristeria (olii essenziali, foglie di eucalipto, olio di mandorle dolci), altri al supermercato (tutti gli altri olii, il miele e la farina di cocco). Considerate che potete tranquillamente sostituire degli ingredienti.. se avete già in casa il miele e non è all'eucalipto va bene comunque (ovviamente meglio usare quello di eucalipto), se non avete la farina di cocco ma quella normale.. ok comunque!

Pesate i grassi nelle seguenti quantità:
100g olio di mandorle dolci
100g olio di soia
50g olio di ricino
400g olio di riso
350g olio di oliva (meglio extravergine)

Procuratevi anche:
5ml olio essenziale alle mandorle (circa 50 gocce)
5ml olio essenziale all'eucalipto (circa 50 gocce)
q.b. farina di cocco (un cucchiaio va bene)
q.b. miele all'eucalipto (un cucchiaio va bene)
20g foglie secche di eucalipto (frullatele per farne una polverina fine ma non troppo)

Per la soluzione caustica servono:
125g soda caustica
300cl acqua con amido di riso procurato come segue:


Facendovi un bel riso (meglio se in bianco).. che potrete mangiarvi aggiungendo zafferano o funghi trifolati.. come vi pare.. ma durante la cottura.. tenete l'acqua non troppo abbondante ma nemmeno troppo scarsa e di tanto in tanto con un mestolo recuperate l'amido.. che non sia troppo pastoso.. deve rimanere abbastanza liquido.. dovete raccoglierne 300cl in una brocca graduata. Fatelo raffreddare.

Indossate vestiti vecchi e mettetevi le protezioni (guanti di gomma, maschera anti gas (anche semplice), occhiali da saldatore).. pesate la soda caustica con precisione (al grammo.. non all'atomo!) e unitela lentamente con l'amido all'interno di uno stampo alto per torte abbastanza capiente da contenere almeno 2l d'acqua.. e che userete solo per il sapone. Non versate MAI l'acqua nella soda.. sempre il contrario e sempre lentamente mescolando con un cucchiaio che userete SOLO per fare il sapone. Mescolate bene fino a far sciogliere la soda.. state attenti ad essere in un posto all'aperto senza cose, persone o animali in giro perché la soluzione caustica è pericolosa (raggiungerà circa gli 80 gradi solo per la reazione chimica)!

Mentre la soda rafredda e raggruma l'amido (ogni tanto andate a dargli una girata altrimenti viene fuori la ricotta sopra e tutto liquido sotto), cominciate a scaldare su un fornello i grassi, a fuoco molto lento, ogni tanto ficcateci dentro un dito per controllare la temperatura.. devono essere 45 gradi, se avete un termometro meglio, altrimenti controllate che sia appena tiepido, 45 gradi sono poco più della temperatura corporea (37).. la temperatura è molto importante.. quindi se riuscite a procurarvi 2 termometri è molto meglio!

Quando la soda si è raffreddata fino a 45 gradi e l'olio è arrivato a 45 gradi.. uniteli (meglio la soda nell'olio.. però io di solito faccio il contrario per non rovinare una pentola da cucina!), mescolate bene con un cucchiaio, poi passate al frullatore a immersione (dovreste dedicare un frullatore intero al solo sapone.. se non volete farlo dato il costo della cosa potete prendere un frustino da dolci al costo di 3 euri e frullare a mano come facevano gli antichi con i rametti per fare il fuoco.. io faccio così.. è faticoso ma funziona e non devo spendere 70€ per un frullatore ad immersione). Smettete di frullare solamente quando raggiungete il nastro, ovvero quando il tutto è abbastanza cremoso da lasciare una piccola scia per un istante quando togliete il frullatore.

A questo punto il sapone è pronto.. non resta che profumarlo e arricchirlo: tirate via metà del composto versandolo attentamente in un altro stampo, lo userete dopo. Aggiungete al rimanente il miele, la farina di cocco e l'olio essenziale alle mandorle. Continuate a mescolare a mano un po' (tipo un paio di minuti) e date anche una leggera frullatina, dovrebbe diventare ancora più cremoso. Fatto questo mettete da parte lo stampo principale e prendete il secondario con il composto avanzato: mettete l'olio essenziale all'eucalipto e le foglie di eucalipto; mescolate e frullate.
Tococ d'arte: adesso versate il composto all'eucalipto dentro al composto al miele facendo una bella striscia centrale profonda. Versatelo tutto, poi procuratevi una bella assicella di legno.. o comunque qualcosa per isolare termicamente e mettete in un posto riparato il vostro stampo con tutto il sapone dentro, coperto in maniera che il calore duri di più aiutando la saponificazione. Lasciate maturare e indurire per 48 ore, poi sformate il sapone e lasciatelo stagionare almeno per un mese, meglio se due (diventa più delicato con la pelle).

HAPPY SOAPING ;)



mercoledì, ottobre 10, 2007

Cose semplici.. ma di effetto!!!

A volte penso: "come è possibile che nel nostro laboratorio si lavori così tanto senza pensare all'impatto emotivo che anche prodotti semplici hanno su chi li vede?" Ovviamente mi metto in prima persona: cerco di inventare algoritmi carini (e funzionanti) per svolgere i compiti più disparati nel ramo della computer visione e dell'elaborazione delle immagini.. e poi non mi rendo conto di quanto poco ci voglia per valorizzarli!

Ad esempio: con un proiettore, una webcam, un puntatore laser (ed ovviamente un computer) si può costruire in maniera molto semplice un sistema di puntamento (cioè di controllo del cursore) che funzioni con il puntatore laser puntato contro un muro dove è proiettato lo schermo del PC.. senza troppa fatica (l'algoritmo di localizzazione dello spot luminoso rosso è veramente una cavolata), ma con un risultato decisamente d'effetto! E' tanto semplice che mi è sembrato assurdo che non ci avesse ancora pensato nessuno.. infatti ci avevano già pensato [1].

Al che dico.. il giochino del puntatore laser me gusta e me lo implemento.. però d'ora in poi voglio cercare di stupirmi e stupirvi con effetti speciali.. alla mia portata! ;)

martedì, luglio 24, 2007

Factor-Graphs.. questi sconosciuti!

L'inferenza statistica è uno strumento veramente potentissimo in molti campi, permette di sfruttare al massimo le informazioni a disposizione, eventualmente corredate da prior distributions ecc ecc, per ricavare delle distribuzioni di probabilità che descrivono un determinato fenomeno. Ad esempio si può utilizzare una tecnica di inferenza come la belief-propagation nelle Bayesian-networks per sapere se in Cina il prezzo del sale aumenterà o diminuirà partendo dal fatto che in Italia piove ecc ecc.. eccessi a parte l'idea è che eventi fra loro apparentemente scorrelati possono influenzare tramite catene di dipendenza altri eventi, le Bayesian-networks hanno sostanzialmente lo scopo di consentire la gestione di queste dipendenze per determinare la distribuzione di probabilità di un evento a posteriori (ovvero date le informazioni disponibili).

Esistono una quantità smodata di tecniche di inferenza statistica, ma -udite udite- moltissime di esse sostanzialmente si pongono come scopo quello di marginalizzare una distribuzione di probabilità coniugata in molte variabili, spesso facilmente fattorizzabile (ad esempio utilizzando le regole relative alle distribuzioni di probabilità condizionata).

I factor-graphs sono uno strumento molto potente per la marginalizzazione di funzioni in molte variabili fattorizzabili in funzioni a poche variabili, del tipo:
data g(x1,x2,...,xn) = PRODi(f(Xi)

dove le xi sono le variabili e gli Xi sono dei sottoinsiemi (di cardinalità "bassa") delle variabili xi,

è possibile sfruttare la fattorizzazione per calcolare efficientemente:
g(xj) = SUMx1(SUMx2(...SUMxj-1(SUMxj+1(...SUMxn(g(x1,x2,...,xn))...))...))

I factor-graphs permettono di effettuare questo calcolo utilizzando un solo semplice algoritmo di nome Sum-Product-Algorithm. Tantissimi algoritmi sono rappresentabili come istanze dei factor-graphs, ad esempio l'algoritmo di Viterbi, il belief-propagation per le Bayesian-networks, forward-backward, Random Markov Fields ecc ecc Turbo-codes decoding.. e ovviamente molti altri algoritmi possono essere costruiti utilizzando lo stesso framework.

Quindi? Non state ancora leggendo l'articolo del link? Ok, allora se non avete voglia di leggere tutto il paper magari date un occhio qui per un tutorial/demo. ;)

mercoledì, luglio 04, 2007

Documenti antichi

Dalla Sonipaf rispuntano importantissimi documenti di 9 anni fa!!! Date un occhio a quali effetti collaterali producono gli esami di analisi nei poveri studenti che inconsapevoli del pericolo li affrontano!

Analisi1 Analisi2
GIURO.. prima di analisi ero normale! ;)

mercoledì, giugno 27, 2007

Da sempre, vicini

Da sempre, vicini


Interminabile la nostr'attesa,
obbligata distanza duratura
ha fermentato ancor più di prima
il desiderio e la certezza
d'un intreccio a maglie strette,
un ricco ricamo variopinto
che sulla tela della nostra vita
prende forma mostrando l'armonia
di ciò ch'assieme siamo e saremo.

Ritrovo, abbraccio, le pennellate
d'un rosso vivo or ci dipingono
su uno sfondo rosa permanente;
coricati in un campo di grano
ammirando l'orizzonte aperto:
scorgiamo serena retta linera
ch'immersi c'accompagnerà entrambe
fra carezze d'oro e alto cielo.


Gabriele Lombardi

lunedì, giugno 25, 2007

Side effects in Matlab

Come tutti i "matlabbisti" sanno, in Matlab l'assegnamento ed il passaggio dei parametri è virtualmente per copia, ovvero virtualmente ogni volta che si assegna una variabile ad un'altra o che si passa una variabile a una funzione questa viene copiata per intero in maniera tale da non avere side effects. In pratica ovviamente non viene sempre fatta la copia: viene utilizzata una politica di lazy-evaluation sulle copie in maniera da utilizzare la variabile originale fin tanto che non vengono fatte modifiche e di copiarla in una nuova variabile solamente a fronte di una richiesta di modifica della stessa (questo solamente per una questione di efficienza).

Ma è possibile ottenere in Matlab i side effects?

Ovviamente è possibile ottenerli utilizzando Java o creando MEX-files in C o in FORTRAN. E' però possibile ottenere i side effects anche in Matlab puro sfruttando i workspaces temporanei creati durante le chiamate a funzione. Nel post Programmare OOP in Matlab è stato spiegato come costruire una classe in Matlab utilizzando solamente le funzioni. Ora, si ipotizzi di istanziare la classe counter, descritta in quel precedente post, e crearne una copia come segue:
c1 = counter(1); % Istanziazione:
c2 = c1; % Copia:
Ora l'oggetto c1 e l'oggetto c2 sono esattamente lo stesso oggetto. Le modifiche su uno hanno side effects sull'altro, infatti:
c1.next()
ans = 1
c2.next()
ans = 2
c1.next()
ans = 3
c2.next()
ans = 4
Inoltre realizzando una funzione come la seguente:
function incrementa(c)
c.next();
E richiamandola come segue:
c =counter(1);
incrementa(c);
incrementa(c);
c.next()
ans = 3
E' possibile appurare che l'oggetto passato alla funzione può essere modificato dall'interno della stessa generando side-effects.

SPIEGAZIONE: Le classi realizzate come spiegato nel post precedente sfruttano la creazione di un workspace locale (WL) per ogni chiamata a funzione Matlab, quando una funzione Matlab viene richiamata un workspace temporaneo viene creato ex-novo in cui "vivono" le variabili locali della funzione, alla terminazione dell'esecuzione tale WL viene lasciato in pasto al garbage collector che normalmente lo rimuove, nel caso però in cui vengano restituiti i puntatori a funzioni innestate, che possono quindi accedervi, il WL non viene rimosso perchè esistono ancora delle variabili che vi possono accedere. Il WL viene eliminato quando anche l'oggetto istanziato diviene irraggiungibile. A differenza delle normali variabili però il WL è legato all'istanza dell'oggetto in maniera indiretta, non fa parte della variabile, questo significa che copiare la variabile non copia il WL. L'oggetto rappresenta in maniera indiretta un puntatore al WL, passare quindi questo "puntatore" a una funzione o copiarlo non provoca la replica del WL che rimane lo stesso e soffre quindi dei side-effects.

Questo comportamento non deve essere visto come un "baco" ma come una "feature": infatti è un modo efficace per ottenere i side-effects quando e se servono.

mercoledì, giugno 13, 2007

Ovunque

Ovunque


Stupendi luoghi, che ci circondano,
sanno attarr'attenzione per poco:
sbalordit'osserviamo, sentiamo
l'arte con ogne brandello d'anima.

Fra imponenti volte, capitelli,
dipinti e sculture, chiese, ponti,
vasti sentieri lungo freschi boschi,
scintillanti laghi, montagn'e mari;

in tutto questo, aprendo i sensi,
non possiamo che scorger noi stessi:
opera d'arte certo non umana,
che più ci scalda, tanto da sciogliere.

Distanti; ovunqu'io poss'andare,
ricordo fatti, medito sorprese,
vedo 'l tuo viso, cerco tuoi occhi:
ovunque, dentro me, ci sei sempre tu.


Gabriele Lombardi

Fluttuazioni

Fluttuazioni


L'onda,
piatta ma grintosa,
in vista delle rive,
si gonfiava maestosa
e troppo sicura di sé.

La spuma sorrideva,
correva veloce nel vento;
senza accorgersene
finalmente raggiungeva
l'agognata bianca meta.

Improvviso il crollo,
spariva l'acqua sotto i piedi:
parte di se veniva a mancare,
ciò che la componeva, mischiata,
l'abbandonava tradendo sicurezza.

Riflusso silenzioso
trasportava nuovamente,
nell'oceano tumultuoso,
disgregate parti
per restituire vigore pieno.

Altra meta, quella giusta,
sà meglio accogliere:
onda splendente, gioiosa;
scorgendoci, d'istinto,
ci siam corsi incontro.

Fluido, armonioso scontro
d'imponenti masse,
ch'impazienti son mischiate
in ogni minima goccia:
profondo abbraccio.


Gabriele Lombardi

martedì, giugno 12, 2007

C++: se lo conosci non ti uccide...

...e io stavo per rimanerci secco!!! ;)

Posto questo post (scusate la cacofonia) per gli "ignoranti" come me che ignorano.. o semplicemente dopo anni non si ricordano più.. della seguente "finezza" del C++.. che tanto fine non è in realtà: in C++ alla creazione di un oggetto i costruttori vengono richiamati dalle classi base alle classi derivate in catena secondo l'ordine con cui sono dichiarati nella sintassi del costruttore dopo l'operatore ':'. I distruttori invece vengono richiamati automaticamente in ordine inverso (notare, in ordine inverso anche rispetto a strani ordinamenti nel grafo aciclico ottenibile tramite l'ereditarietà multipla).
A parte il discorso del chaining, che ai più è noto, la finezza sta nelle operazioni che possono essere svolte all'interno dei costruttori e dei distruttori: chi di voi per caso volesse utilizzare il noto pattern "Abstract method" se lo scordi pure perchè all'interno di costruttori e distruttori non è possibile richiamare metodi virtuali puri relativi alla classe stessa, nemmeno se si ha a che fare con l'istanza di una classe derivata che li implementa concretamente. In sostanza niente "Abstract method" all'interno di costruttori e distruttori.. vi lascio un pezzettino piccolo piccolo di codice con cui giocare.


// The abstract superclass:
class A {
public:
// The constructor:
A() {
// Try to call but cannot dispatch:
virtualMethod();
}
// The virtual pure method:
virtual void virtualMethod()=0;
};

// My subclass
class B : public A {
public:
// The implementation:
virtual void virtualMethod() {};
};

// Using them:
int main(int argc, char *argv[]) {
// Instantiating:
B b;
b.virtualMethod();
return 0;
}

giovedì, maggio 31, 2007

C++: problemi con il polimorfismo

Questo post sarebbe da mettere come domanda in un newsgroup di programmazione in C++.
Non so se a qualcuno di voi è mai capitato, però a me è la seconda volta che succede di definire un metodo virtuale puro in una superclasse, convinto di poterlo implementare nella sottoclasse (simpatico e banale, anche se potente, design pattern "Abstract method").. e di vedere un bel messaggio di errore del linker che non trova l'implementazoine del metodo se si tenta di chiamarlo!

VOLETE IL CODICE? OK!

Allora di una cosa sono sicuro: con l'operatore di assegnamento ottengo il seguente risultato:

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

#include
using namespace std;

// The abstract superclass:
class A {
public:
// The virtual pure methods:
virtual A& operator +=(A& a)=0;
virtual A& operator =(A& a)=0;
};

// My subclass
class B : public A {
public:
// The implementations:
virtual A& operator +=(A& a) {
cout << "Called the '+=' operator!" << endl;
return *this;
}
virtual A& operator =(A& a) {
cout << "Called the '=' operator!" << endl;
return *this;
}
};

// Using them:
int main(int argc, char *argv[]) {
// Instantiating:
B b1,b2;
b1 += b2; // This works:
b1 = b2; // This give a compile time error:
return 0;
}

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

il che potrebbe essere QUASI accettabile.. se non fosse che non c'è modo di richiedere forzatamente l'implementazione nelle sottoclassi dell'operatore di assegnamento. Provate a sostituire i parametri dal tipo A& al tipo B&.. e vedete come s'incazza il compilatore!!!
Il codice che l'altra volta mi aveva dato lo stesso errore era su un metodo normalissimo.. fra l'altro con un altro compilatore (nemmeno da dire cambi compilatore perchè è un baco.. il baco è NEL MIO CERVELLO!).

Ok.. se trovate un modo per richiedere forzatamente (stile signature nell'interfaccia) l'implementazione dell'assegnamento nelle sottoclassi.. ditemelo perché la soluzione banale NON FUNZIONA :(

giovedì, maggio 24, 2007

C++.. RISOLTOOOOOO

Risolto il problema.. conclusioni e suggerimenti:
IN C++ NON MISCHIARE MAI IL SACRO (standard C libraries) E IL PROFANO (stl libraries) SENZA UNA OTTIMA CONSAPEVOLEZZA DEI PERICOLI CHE STAI AFFRONTANDO!!!

In sostanza se si gioca troppo con i namespaces una sola include di un header file C standard piazzata nel posto sbagliato può dichiarare nel namespace sbagliato (cioè non quello esterno) un casino di simpatiche cosucce che dovrebbero restare in ::!!!

Ok ok.. per molti di voi questa è una banalità.. a me però non era mai successo di sclerare così per una include.. e quindi valeva la pena di scrivere un po' di cazzate sul mio blog ;)

Aforisma su C++ e Ken Shiro

Programmare in C++ è come esegure il colpo della distruzione dell'univareso usato da Ken Shiro contro il Sacro Imperatore Souther: UN SOLO ERRORE D'ESECUZIONE PUO' PORTARE ALLA DISTRUZIONE DELL'INTERO UNIVERSO!!! :)

C++.. debugging?

Allora, voglio lasciare su questo blog una bella digressione sul C++: avete mai provato a realizzare in C++ una bella libreria tutta tempestata di template, in cui utilizzate pesantemente STL (stdc++), tipi (typedef), namespace, cicici e tututu?

PROVATE!!!

Allora.. cerca che ti cerco.. e mentre sviluppo in C++ (mannaggia a me) un pezzo piuttosto grosso e importante del mio lavoro di dottorato.. come libreria ultra astratta ultra pluggabile ultra sciacquate-gli-uocchie.. tiro su il mio bel ambientino di testing con il connubio CppUnit e Automake/Autoconf/AutoTuttoQuelloCheVuoiFaccioIoNonTiDeviPreoccupareDiNullaTantoIlTuoLavoroNonFunzionaràMai..
..et voilà.. dopo ore di debugging di un test set VUOTO (tutto astratto, template dappertutto.. si inizia con il debugging della sintassi/semantica senza codice reale!).. mi salta fuori il solito errore da C++.. che uno non capisce:

/usr/local/lib/gcc/i686-pc-linux-gnu/4.0.4/../../../../include/c++/4.0.4/cstddef:52: error: '::ptrdiff_t' has not been declared
[altre 1945 righe simili]

Ok, allora.. ci ho messo 3 ore per capire FORSE come risolvere il problema.. fra altre 50 ORE vi faccio sapere se la soluzione adottata riguarda l'utilizzo di un macete a doppio taglio oppure no!

P.S.: I newsgroup mi sono serviti moltissimo in questo caso.. infatti hanno occupato inutilmente 2 di queste 3 ore.. anche ricompilare gcc con una versione più nuova mi ha aiutato.. a inchiodare una macchina per altre 2 di quelle 3 ore.. fortuna che in lab di macchine ce ne sono e si può parallelizzare il tempo!!! Parallelizzare lo spazio no he? Sarebbe utile essere qui e contemporaneamente alle maldive.. ne ho proprio bisogno!!!

martedì, maggio 22, 2007

Aspetti ortogonali

Come tutti ben sanno, il paradigma di programmazione per aspetti (AOP) è stato inventato appositamente per superare (o tentare di superare) le problematiche di ortogonalità fra differenti aspetti all'interno di un progetto software.

Al di là della poca diffusione e della poca risonanza che ha avuto questo paradigma (se volete un flame sul perché AOP non ha preso piede.. fate pure.. partecipo volentieri ;)), sicuramente un commento è dovuto: il problema dell'ortogonalità è diffuso in ogni dove, e tende a devastare rapidamente il risultato di moltissimi sforzi fatti da programmatori, da progettisti esperti di SE, da DBA, da CTO.. cicici e tututu! Insomma gli aspetti ortogonali rompono e parecchio!

Esempi? Allora: considerate il problema di etichettatura di dati al fine della classificazione, ad esempio chi di noi non ha incontrato l'annoso problema di memorizzare all'interno di una struttura di cartelle sensata la CATERVA di articoli scientifici raccolta in anni di lavoro? Chi di noi non si è accorto che UN ALBERO NON VA BENE? Ovvio, un albero no va bene perché esistono aspetti ortogonali che possono essere descritti solamente tramite un grafo diretto aciclico connesso (DAG). Sigle a parte la struttura dati che in questo caso avrebbe più senso è un MULTIALBERO.. se mi concedete la licenza poetica per coniare questo vocabolo. Si perchè mentre un grafo non distingue l'appartenenza degli archi a una sottostruttura, in questo caso ESISTE!

Ok ok.. sembra che io stia DIVAGANDO un po' troppo deragliando dal fulcro della questione.. ma quello che penso è che queste strutture a multialbero dovrebbero essere adottate in:
- documenti XML, dove spesso vengono solo simulate con riferimenti ovunque;
- linguaggi di programmazione, dove l'ereditarietà consente di ottenere alberi, o al più DAG;
- database, dove spesso si tenta inconsapevolmente di emularli con tabelle e query fra di esse.. ma in molti casi si tende a confondere le query con le tabelle.. soprattutto i discepoli di Access ;), in realtà il problema è che siccome i dati da qualche parte devono finire realmente, li si infila nelle tabelle e gli aspetti ortogonali li si mostra con le query.. quindi aggiungendo l'elaborazione di una query per non costruire una struttura dati adeguata (un multialbero).

L'elenco potrebbe allungarsi.. ma prima vorrei sapere.. siete d'accordo? Volete anche voi un multitagged-XML? ;)

lunedì, maggio 21, 2007

Ritratto

Ritratto


Arduo m’è ‘l tracciar
bei lineamenti,
tuo viso imitar
sui fogl’impazienti.

Di certo non eccello
in pittur’e disegno,
ma volto tanto bello
sfid’artista nel segno.

Son note sfumature,
m’è impresso profondo
ogne particolare:
il sorriso giocondo.

La traccia di graffite,
al pari d’un insulto,
di guance vellutate
soave luc’ha tolto.

Seppure possa esser
sentito realmente,
artista non può nascer
ch’angelo abilmente

renda a paragone
di tua real’essenza.
Di tratt’imitazione
a bellezz’è violenza.

T’osservo, e sereno me ne cibo.


Lombardi Gabriele

mercoledì, maggio 16, 2007

La collina del pensatore

La collina del pensatore


Giunto qui mi sdraio su calda roccia,
occhi chiusi, ascolto altri sensi:
sole calante m'accarezza piano,
fruscio di foglie, vento sovrano,
cinguettio, odor di camp'immensi,
cielo infinito, di calma doccia.

Attendo il variopinto tramonto,
cibandomi famelico di verde,
color di ricercata mia vita:
ogn'essere, di mente non sopita,
ha un luogo caro a lui concorde,
ov'esternar di pensieri tormento.

Qui son consumati duri momenti
d'un vivere oltre piatto essere,
qui s'affrontan i sottili problemi
non pratici c'affliggon coi ricami:
d'un organo che non può comprendere
son doni costruttiv'e disfacenti.

Molteplici pene affliggon forte,
delicato, fragile, istintivo
pensatore; romantico artista,
crede all'amore a prima vista,
con te d'indugiare non v'è motivo;
lontano come 'l figlio di Laerte.

Ciò ch'or profondamente pens'e temo
è 'l tuo penar errando per esteri
stupendi luoghi, perdendon'essenza.
In cuor mio tristemente avanza
colpevole sensazione di nostri
sentimenti vivi per cui or fremo.

In te so d'aver trovato splendido
tesoro un dì sepolto profondo,
ma lucente ai miei occhi
si mostra sincero senza balocchi.
Per anni, te e me amor forgiando,
vivremo: godi d'un viaggio candido.


Lombardi Gabriele

giovedì, maggio 10, 2007

Calendula

La Calendula officinalis è una pianta da fiore ornamentale e medicamentosa dalle mille proprietà benefiche.. oltre che artistiche. Ho aggiunto un pochino di dettagli sulle sue proprietà e sui metodi di coltivazione all'indirizzo:

http://it.wikipedia.org/wiki/Calendula_officinalis

chi è interessato e ci da un occhio.. se mi manda qualche commento/consiglio/critica.. sarà ben accettatissimo!!! :)

Appena le piantine mi crescono un po' farò mille foto e le aggiungerò.. per ora ho quelle dei semi e dei germogli.. appena le porto in uni le inserisco in wikipedia :D

lunedì, maggio 07, 2007

Lontana, qui con me

Lontana, qui con me


Spossato da stanca inattività,
pesante, mi corico affondando:
visione di tua voce, ascoltando
di tuo viso lineamenti, che già
a fuoco son tatuati dentro me.

Par breve, ma faticosa l'attesa
d'anime fresche lontan'intrecciate;
possono, tempo e distanza subite,
districar nodi ch'uniscon rosa?
Può condizion'allontanarmi da te?

Attendersi, non vedersi, pensare,
sentirsi poco, cercarsi, volersi:
amar'ingredienti d'una catarsi
che stringe laccio soffice d'amore.
Nulla par impossibile per noi.

Musica, sussurrata nella notte
da autori lontani, ma vicini;
ogni canzone di versi violini,
inspiegabilmente riport'a vette
di vita, momenti con te vissuti.

Distanti, continent'e oceano
separano corpi di carn'e ossa;
son sicuro ch'anime nulla possa
sbrogliare ché mischiate or vivono:
viva in me, vivo in te, noi siamo.


Gabriele Lombardi

giovedì, maggio 03, 2007

Viaggiando

Viaggiando

Corsa,
verso tranquilli istanti
vissuti di fretta,
ma serenamente,
incontrando decine di persone,
e profonde solitudini
in sintonia con la natura,
con me stesso,
con la vita
degna di questo nome.

In treno,
nei boschi,
sulla montagna,
tra piante e rocce,
di fronte a imponenti cascate,
sotto cieli stellati,
tramonti incantati,
ovunque,
nella magia del momento,
mancava un ingrediente
ormai fondamentale:
il tuo calore,
il tuo sguardo
posato su di me,
le tue carezze,
il tuo sorriso..
tu!

Tu,
parte di me,
non sei qui,
ma ti sento sempre vicina,
dentro i miei pensieri,
nei miei sogni,
nel mio cuore:
son sereno
perchè posso aspettarti;
sono felice
perchè ti amo.

Gabriele Lombardi

venerdì, aprile 20, 2007

Level-set

Cosa posso dire dei level-set? Che sono uno strumento formidabile, stupendo, comodissimo.. MA:
- l'obbligo di rappresentazione discreta ne limita l'utilizzo a 2 e 3 dimensioni.. con voxel spesso troppo grandi;
- l'elaborazione di uno o più volumi descriventi dei level set diventa oneroso data la quantità di dati da elaborare;
- la loro algebra è molto elegante dal punto di vista teorico, ma nella pratica si scontra con moltissime problematiche, soprattutto quelle di rappresentazione sopracitate.

QUINDI:
Perchè non costruire una sotto-algebra dei level-set manipolabile analiticamente in maniera comoda, così da poter rappresentare efficientemente (in spazio) i level-set per qualunque dimensionalità e da poterli manipolare efficientemente (in tempo) rimuovendo gli ostacoli che ora come ora mostrano?

IDEE:
- si può pensare di utilizzare una famiglia ristretta di funzioni distanza da comporre fra di loro;
- si può mantenere il level-set descritto analiticamente durante tutte le elaborazioni fino a quando non ne servono direttamente i dati (risultati finali o parziali);
- si possono utilizzare tecniche come marching-squares o marching-cubes per determinare l'approssimazione discreta del level-set reale a una precisione arbitraria, e solo quando serve.

Meditate, level-settatori, meditate ;)

mercoledì, aprile 18, 2007

Complicità

Complicità


Da soli pochi giorni
l'anime osserviamo,
scoperta par ch'adorni
l'esistente ricamo.

Sguardo complice scagli,
ch'io lo so già cogliere,
seguir mia pazzia scegli,
mio combaciant'essere.

Com'incastro profondo:
completiamo diverso,
spirito pareggiando;
nulla pare avverso.

Con breve cors'ora sò,
angelica visione,
ch'armonia simil non può
ch'esser dolce passione.

Fiori siamesi, sbocciati lontani,
or sfiorano delicati petali;
ancor ne gusto 'l brivido leggero,
su foglie, stelo, corolla, intrise
d'aroma soave di tua presenza.

E' primavera, ti vedo, ti sento,
altra stagione non riesc'a pensare.
T'osservo, una foto, un ricordo:
armoniose forme, profond'anima.
Accorciar distanz'attenderò sogno.


Gabriele Lombardi

lunedì, aprile 16, 2007

Ricostruzione 3D di layout di piani.. DA UNA SOLA IMMAGINE


E' nato un nuovo servizio Web, raggiungibile qui, che permette di ricostruire una scena in 3D a partire da una sola fotografia: l'assunzione di base è la presenza di differenti classi di superfici abbastanza semplici.. ad esempio il cielo, il pavimento, eventuali palazzi oppure altri tipi di oggetti verticali.

Il rettangolo rosso.. un mistero risolto

La nebula mostrata nell'immagine viene chiamata Red Rectangle, si tratta di una delle nebulose dalla forma più curiosa e insolita di tutte quelle avvistate nella volta celeste.


In questo articolo è descritto (brevemente) il mistero di Red Rectangle e la sua soluzione.
Quante altre simpatiche forme ci potrà mostrare lo spazio profondo? In ogni caso rimarrà sempre un affascinante immenso luogo da esplorare.. e perchè no? Per farci elaborazione delle immagini ;)

Calcolo tensoriale e variazionale.. un simpatico connubio

Come noto, il calcolo tensoriale è uno strumento molto comodo per la manipolazione di strutture geometriche descritte in spazi curvi, ad esempio in cordinate sferiche, cilindriche, o altri arbitrari spazi curvi descritti da mappe invertibili.
Come anche è noto, il calcolo variazionale consente di minimizzare integrali al variare di un funzionale incognito, questo viene utilizzato molto in fisica ad esempio per la ricerca dello stato di equilibrio di membrane o corde elastiche.

Come trovo ovvio proporre, le due fantastiche teorie, che ad esempio mostrano applicazioni in geometria e nel mio campo dell'elaborazione delle immaigni, possono essere messe assieme, e come trovo ancora più ovvio, possono miscelarsi in maniera molto più profonda di quel che si possa pensare a prima vista (stile deformare membrane elastiche descrivendole all'interno di uno spazio curvo).

Un esempio interessante: ogni superficie semplice in 3D (che non interseca sè stessa, che non è degenere riducendosi parzialmente o completamente a una curva o un punto.. ecc ecc.. ce ne sono un po' di proprietà raggruppate sotto la "semplicità") identifica uno spazio curvo in 2D, questo mi porta a pensare immediatamente alla seguente cosa: se lo spazio curvo fosse l'incognita?

Ragionando: tramite le tecniche variazionali è possibile determinare la posizione di equilibrio di una membrana elastica rispetto a determinate forze esterne e interne di elasticità. L'equazione differenziale di Eulero-Lagrange rende esplicite tali dipendenze da tali forze. Lo scopo però è quello di determinare una superficie! Si immagini ora di avere delle entità bidimensionali immerse in \Re^2, si immagini che tali entità abbiano delle proprietà invarianti che rimangono preservate al variare dello spazio curvo in cui vengono immerse, altre proprietà varianti, che dipendono dallo spazio considerato. E' allora possibile costruire un integrale di superficie, in cui il funzionale integrando esprime le proprietà varianti locali di cui minimizzare la "somma", relative alla rappresentazione in 2D delle entità geometriche di interesse, e dipendenti da una superficie {(x,y,z)|(x=x(u,v),y=y(u,v),z=z(u,v)} con (u,v)\in\Re^2, che identifica la deformazione spaziale di \Re^2.

So che tutto questo buttato lì sembra senza senso.. però mi prodigherò nel mostrare un'applicazione pratica più tangibile.. con dettagli in più.. quando questa idea sarà più matura.

martedì, aprile 10, 2007

Tuoi passi

Tuoi passi


Uno sull'altro, impronte lasciando,
scolpiscon mente, cuore e vita.
Battito di farfalla, ogn'istante,
può generare in fertile fata.

Io, lento rimuovo velo su velo,
conosco l'ignoto or più di ieri.
Tiepida scoperta mostra, stupendo,
affinità e mistero solerte.

Chi eri, chi sei, chi sono, saremo
assieme tutt'uno, aggrovigliati
corpo e anima per camminare
su qualunque via c'attenda 'l passaggio.

Passeggiamo, tu, io, fianco a fianco;
ciò ch'unita sorte ha preparato,
scriverà pagine di menti
or confuse, frizzanti, armoniose.


Gabriele Lombardi

martedì, aprile 03, 2007

Programmare OOP in Matlab

In Matlab esistono degli strumenti del linguaggio appositamente realizzati per consentire la programmazione OOP, essi sono descritti nel capitolo "Classes and Objects" e sono lo standard utilizzato anche all'interno della toolbox standard di Matlab per l'UI e per molto altro.
Tale tecnica di programmazione presenta alcuni indubbi vantaggi ma anche degli svantaggi enormi, a partire dalla struttura e costruzione delle classi all'interno del file-system, l'impossibilità di utilizzo della dot-notation e molti altri.
Una tecnica alternativa per fare OOP in Matlab sfrutta lo storing del workspace locale condiviso nel caso in cui vengano utilizzate delle funzioni innestate. La seguente dichiarazione della classe "counter", completamente commentata, mostra come può essere facilmente utilizzata questa tecnica:

function c = counter(start)
% COUNTER Generates a new counter object created with internal functions.
%
% The technique used here allows to create objects with all private
% attributes and public methods exported in a structure. All local
% variables defined here can be used as object attributes. Sub-functions
% can be used as private methods and setter/getter methods can be written
% to give the acces to attributes.. using the complete information
% hiding paradigm. The main funciton is the constructor. The object status
% is stored in a local workspace that have the same lifetime of the
% generated object.

% Save the initial value:
startVal = start;

% ===========
% Now there are two object attributes: start and startVal.
% ===========

% Returning the counter: this is the public methods set exported.
c = struct('next',@Next,'prev',@Prev,'reset',@Reset);

% ===========
% The public methods body.
% ===========
% The next integer function:
function n = Next
% Set:
n = start;
% Increment:
start = start + 1;
end
% The prev integer function:
function n = Prev
% Set:
n = start;
% Decrement:
start = start - 1;
end
% The reset function:
function Reset
% Reset:
start = startVal;
end
% ===========
% Private methods are simple functions and can be defined here.
% ===========
end

% ===========
% Support functions that are not methods (no access to attributes) are
% defined here.
% ===========

Per creare un oggetto di classe "counter" è sufficiente eseguire la funzione:
c1 = counter(1);
c2 = counter(-2);
Per eseguire un metodo è sufficiente utilizzare la dot-notation:
c1.next()
ans = 1
c1.next()
ans = 2
c1.reset()
c1.next()
ans = 1
Have fun! ;)

venerdì, marzo 30, 2007

Burrasca di velluto

Ragassuoli.. informazione di servizio.. siccome mi trovo in un periodo di mutazione profonda di me stesso e della mia vita.. ho deciso che la raccolta di poesie "Burrasca di velluto" termina qui. Il che non significa che smetto di scrivere.. ANZI.. la prossima raccolta l'ho intitolata "Oscillazioni".. vedremo che ne esce.. e quanto dura.. la precedente è durata 12 anni di crescita ;) e la trovate qui.

Non è da escludere che "Oscillazioni" cresca molto rapidamente dando spazio ad una terza raccolta.. fra l'altro, altra informazione di servizio: credo che pubblicherò "Burrasca di velluto".. se succede vi informerò IMMEDIATAMENTE ;)

mercoledì, marzo 28, 2007

Timestamp dei post

Belli guagluioni.. dovrei aver messo a posto il fuso orario di salvataggio dei post.. sempre che io non sia troppo FUSO ;)

Hookka che ti hookko anch'io

Confronto fra tecniche di hooking e l'AOP

Piccola osservazione forse banale:
  • le tecniche di hooking consentono di definire dei punti del proprio codice in cui l'esecuzione di codice esterno è ammessa previa registrazione di simpatiche funzioncine di callback, questo ad esempio permette a mtrace di tracciare l'attività della libreria malloc (ad es. funzioni malloc, realloc, free, ...). Ogni funzione di callback è però registrata come callback per esattamente una funzione da tracciare, eventualmente tipizzata per poter tracciare punti differenti;
  • l'AOP (Aspect Oriented Programming) prevede la possibilità di dichiarare degli aspetti come collezioni di azioni da poter eseguire eventualmente dietro esplicita richiesta oppure prima o dopo l'esecuzione di ben precisi metodi degli oggetti di ben precise classi (o tutte, o una parte). Differenti aspetti possono definire differenti azioni o classi su cui operano o metodi che "modificano".
Ok, questo era un riassunto BRUTTISSIMO e non esattamente corretto di quello che sono le due tecniche.. ora le riflessioni:
  • esiste sempre del codice esterno (es. funzioni) da eseguire in determinati punti del codice delle classi che descrivono le entità del dominio;
  • esiste sempre una tipizzazione (tipo di hook, aspetto legato all'azione);
  • si tenta sempre di imporre una separazione fra il codice che si vuole "iniettare" ed il codice preesistente;
  • gli aspetti lavorano su sottoinsiemi di classi, l'hooking lavora su ogni singola funzione.
Non vi sembrano simili simili simili? Decisamente direi che è possibile mettere l'hooking e l'AOP sotto lo stesso tetto. In realtà le implementazioni dell'AOP in genere prevedono un preprocessore che modifichi il codice sorgente prima della compilazione mentre nell'hooking tutto è eseguito a run-time.. però questo è solo un dettaglio tecnico.
Esempio.. ho implementato uno strumento di hooking per Matlab (FHook) che consente di fare anche AOP, è grezzo, non consente di sfruttare il pattern-matching per la selezione delle funzioni/sottofunzioni a cui applicare gli aspetti o su cui fare hooking.. però anche come strumento embrionale direi che può essere utile e si può usare per studiare a fondo questa simbiosi di concetti ;)

lunedì, marzo 26, 2007

Disegni di Sonipaf

Quando uno dice..
"Sta mia amica è un'artista della matita, pastello, acquarello ecc" ;)
Date un po' un occhio qui!

sabato, marzo 24, 2007

La vita

La vita
è una collezione di rare isole di equilibrio,
immerse in un mare di tempo
speso per cercarle.

giovedì, marzo 22, 2007


Un tramonto,
a volte affascinante,
ma a volte malinconico,
non può che chiudere una giornata
lasciando spazio al buio e al silenzio.
Una giornata, sperata interminabile,
si è conclusa scemando lentamente;
ma domani un nuovo sole
si leverà alto e lucente,
scaldandomi.
Gabriele Lombardi

martedì, marzo 20, 2007

Mutamento

Mutamento


Fui bimbo tenero, amoroso,
che conobbe soffice calor tuo;
mi cambiasti in sincero amante.
Poi il laccio si ruppe lentamente,
cosa ci portò a tanta distanza?

Permeasti nella mente fertile,
trovasti caldo concime d'abbraccio.
Or nulla esiste di tutto questo,
solo lontano ricordo tiepido;
in me permani incisa, mutando.

M'hai conosciuto bimbo cercatore,
m'hai trasformato in dolce compagno;
m'hai lasciato vulnerabil sperduto,
mutando il mio animo gentile
in un uomo dolce, forte, libero.


Gabriele Lombardi

lunedì, marzo 05, 2007

Memorie

Memorie


Fotografie al sapore di antica felicità;
la tua voce, che mi scaldò l'anima,
ora gelida m'inumidisce attraverso un filmato;
parole dolci hai inciso nella mia anima,
le leggo, le trascrivo, le conservo.

Dolcezza che mi fece innamorare;
affetto che mi legò indelebilmente;
amore che mi manca come ossigeno;
soffoco, senza te non respiro più
quel fresco tepore d'un viso sfiorato.

Hai donato ciò che di più grande esiste;
hai trasmesso ciò che ho sempre cercato;
ora non più, non mio, ma concedi ancora,
a chi saprà apprezzarlo,
il tuo dono unico e prezioso.


Gabriele Lombardi

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 ;)

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