Informatica materia viva per fare arte?

 

                          ...Pare che il software comincia a superare la soglia di tool a supporto di realizzazioni creative e comincia a diventare materia da plasmare per realizzare creazioni artistiche...

 

In vacanza, durante la visita a un museo di arte contemporane  ...   potreste all'improvviso sentirvi a casa vostra! prodigi da developer ;-)




 -  http://www.jacksonpollock.org/

 -  http://www.chrisoshea.org/projects/out-of-bounds/description/

 

Due software che vanno in questa direzione  Open Computer Vision Library  (anche per VC++ .NET) e   openFrameworks C++ library for creative coding (anche per visual studio).

 


Fonte:
http://2005to2007.fabrica.it/blog/2008/04/shining_through_walls.html 
http://www.fabrica.it/blog/2007/10/jackson_pollock_goes_digital.html

Tags :   |  |

Progettazione di app. multi-threading: prevenire il deadlock

L'obiettivo è quello di far emergere dal disegno in modo evidente la politica di gestione dello stallo che si  vuole seguire e aiutare ad applicarlo in modo consistente in tutta la applicazione. Elenco qui un repertorio di pattern che trovo utili quando si implementa la strategia di prevenzione del deadlock [1].

 Ordered Lock 

Quando l'esecuzione di un metodo e la sequenza che segue di chiamate ad altri metodi richiede di acquisire più lock insieme, si previene il deadlock acquisendo sempre i lock con ordine dato (per esempio i lock su istanze della classe ServerListener vanno fatti sempre prima di quelli sulla classe ConnectedClient che a loro volta vanno prima di quelli sulle istanze della classe Client).

Il pattern è descritto anche nel Portland Pattern Repository http://c2.com/cgi/wiki?OrderedLocks


 Wait All Lock

L'altro modo di prevenire il deadlock è di acquisire tutti i lock che servono insieme per esempio usando il metodo Mutex.WaitAll()




 
Entrambi questi pattern suggeriscono di centralizzare l'acquisizione dei lock e va nella direzione opposta di incapsulare in ogni  classe la gestione dei propri lock (per esempio la classe ServerListener si preoccupa in ogni metodo di acquisire i lock necessari  per leggere e scrivere i suoi field e cosi fa la classe ConnectedClient etc.) Come fare ? Ho raccolto 2 idee.


 

  Mediator 

Questo approccio consiste nel separare la sequanza di chiamate tra metodi che provocano la acquisizione di più lock (per esempio la chiamata del metodo ServerListener.AcceptCOnnectionRequest() che internamente chiama ConnectedClient.AddNewClient() che a sua volta chiama new Client() ).
La sequenza di chiamate dirette viene spezzata e sostituita da una classe "mediatore" che fa le singole chiamate singolarmente una dopo l'altra e risponde agli eventi (un po come un form con i controlli) :
http://wiki.ugidotnet.org/default.aspx/UGIdotNETWiki/PatternMediator

Questa classe "mediatore" ora fa emergere quella che prima era una sequenza di chiamate nidificate come matriosche e ora è invece una lista piatta di operazioni.  E cosi può assumersi la responsabilità di acquisire i lock (con uno qualunque dei 2 pattern sopra) senza ropmere l'incapsulamento delle classi.

Diventando cosi visibili tutti gli ordered lock diventa evidente se e quando può convenire sostituirle un ordered lock con un Coarse Grained Lock : http://martinfowler.com/eaaCatalog/coarseGrainedLock.html


  Data Mapper 

L'idea è di separare nel disegno le strutture dati condivise dalle classi che implementano la logica come fa il pattern Data Mapper (anche se il pattern è originariamente destinato a una tabella nel db mentre in questo caso interessa di una struttura dati condivisa) : http://martinfowler.com/eaaCatalog/dataMapper.html

Ogni sequenza di chiamate viene eseguita da una procedura che chiama i mapper per leggere le strutture dati condivise e  valorizzare le istanze che implementano la logica, esegue le operazioni necessarie e richiama i mapper per aggiornare le strutture  dati condivise. Ogni sequenza può essere implementata in un Transaction Script : http://martinfowler.com/eaaCatalog/transactionScript.html

Per far si che tutti i Transaction Script seguano in modo uniforme il modello di lock e di gestione dello stallo si puo far derivare tutti i transaction script dallo stesso Layer Supertype http://martinfowler.com/eaaCatalog/layerSupertype.html  .

_____________________________________
[1] Richard C. Holt: Some Deadlock Properties of Computer Systems. ACM Comput. Surv. Vol.4 Num.3, Sett 1972

Tags :   |  

Visualizza la blogsfera

 

Dalla elaborazione dei dati sulla blogsfera nascono queste rappresentazioni grafiche dei dati : i nodi sono i blog e gli archi i link/referrals tra blog

 

E' una applicazione di data mining: http://datamining.typepad.com/gallery/blog-map-gallery.html

Fonte: http://www.creativereview.co.uk/crblog/mapping-the-blogosphere/

Tags :   |  |  |

Progettazione di app. multi-threading - altri pattern comuni

Proseguo col repertorio di possibili opzioni per la progettazione di applicazioni multi-threading, da quelle comuni a entrambi i  modelli a competizione e a sincronizzazione.

Quelli che hanno lo scopo di ridurre il tempo di lock di una istanza condivisa (= attraversata da più thread = i cui metodi sono richiamati da più thread) o la durata del rendezvous per una sincronizzazione tra produttore e consumatore.

 

 Optimistick Locking

L'idea è la medesima di quella usata con i db, cioè quella di fare le elaborazioni e i calcoli lunghi prima ancora di mettere i lock o avviare il rendezvous per poi poter essere velocissimi dovendo solo applicare i risultati già calcolati e verificare che nel frattempo un altro thread non ha cambiato le carte in tavola.


L'ho trovato descritto nel Portland Pattern Repository http://c2.com/cgi/wiki?OptimisticLocking e anche da Fowler http://martinfowler.com/eaaCatalog/optimisticOfflineLock.html

 

 

 

 Transazioni di compensazione

Questa idea arriva dai transaction processing monitor (come le Transactions e il DTC di COM+) e dalla teoria derivata dalle long running transaction, cioè lo studio delle caratteristiche di sistemi dove vengono rilassate alcune delle proprietà ACID delle transazioni.

L'idea è di spezzare il tempo di lock o di rendezvous in due parti in modo che una parte lunga di elaborazione che sta nel centro possa essere fatta senza lock o rendezvous. Se nella seconda parte l'esecuzione di controlli e veriifiche danno un risultato che invalida la prima parte, non essendo pià possibile annullarla (nel senso che nel fattempo quelle info sono state accessibili e potenzialmente giù utilizzate come buone da altri thread) si esegue una operazione uguale e contraria detta di compansazione.

Ho trovato qui una descrizione: http://en.wikipedia.org/wiki/Long-running_transaction

 


 Double-check 

Ossia il pattern del doppio controllo, uno prima di acquisire il lock o fare il rendezvous e uno durante a lock acquisito o a rendezvous in corso.   E' utile quando il più delle volte il controllo da esito negativo e quindi non è necessario proseguire e fare effettivamente lock/rendezvous.

E' anche un anti pattern perchè la sua applicazione risente fortemente della architettura fisica del processore e dal linguaggio e quindi il codice compilato funziona diversamente da quanto si creda.

 
E' descritto nel Portland Pattern Repository  http://c2.com/cgi/wiki?DoubleCheckedLocking  e anche in wikipedia http://en.wikipedia.org/wiki/Double_checked_locking_pattern  

Nel wiki di UGI http://wiki.ugidotnet.org/default.aspx/UGIdotNETWiki/PatternSingleton.html  è descritta una implementazione che tiene conto della architettura del processore e del linguaggio ed è garantita di funzionare correttamente.

 


 Read/write lock

Qui l'idea consiste nel permettere più letture contemporanee e invece restringere ad una scrittura alla volta riducendo di molto i casi in cui l'elaborazione di un thread resta bloccata in attesa che venga rilasciara un'istanza o in attesa dell'altra istanza produttore o consumatore con cui sincronizzarsi.

Anche questo è descritto nel Portland Pattern Repository  http://c2.com/cgi/wiki?ReadWriteLock  e in wikipedia http://en.wikipedia.org/wiki/Read_write_lock_pattern


 

Tags :   |