Welcome

This is the generic homepage (aka Aggregate Blog) for a Subtext community website. It aggregates posts from every blog installed in this server. To modify this page, edit the default.aspx page in your Subtext installation.

To learn more about the application, check out the Subtext Project Website.

Powered By:

Blog Stats

  • Blogs - 715
  • Posts - 31049
  • Articles - 310
  • Comments - 108687
  • Trackbacks - 590702

Bloggers (posts, last update)

Latest Posts

The Top Programming Languages 2015

posted @ 26/08/2015 8.53 by Alessandro Gervasoni

Slack

sicuramente molti di voi lo conoscono/usano da anni ma io utilizzo questo strumento di messaggistica da pochi mesi..

https://slack.com
 

posted @ 25/08/2015 8.33 by Alessandro Gervasoni

PostgreSQL & cstore_fdw

cstore_fdw


cstore_fdw è una (delle molte) estensioni messe a disposizione dalla community di PostgreSQL, che permette di salvare in modalità colonnare i nostri dati all'interno della base dati di PostgreSQL.



Come funziona


Da come si può dedurre dalle iniziali "fdw" (foreign-data wrapper), questa estensione mette disposizione una nuova tipologia di tabelle con funzionalità e formato diverso da quello standard utilizzato in PostgreSQL. Per gestire i dati, le tabelle sono suddivise in due tipologie di file:


Data File


Qui trovano posto i dati. Questi vengono salvati nell'ordine in cui sono inseriti (vedremo più avanti le conseguenze di ciò). Ogni data file è unico e (a differenza dei data-file PostgreSQL) non viene suddiviso raggiunta una  determinata  dimensione. Al suo interno i dati vengono suddivisi in "Row Stripes" che raggruppano set di tuple (il numero di righe è configurabile) che costituiscono la nostra tabella. Le Row Stripes sono caratterizzate da tre sezioni:

  • Stripe Skip List: si possono considerare l'indice delle nostre tabelle, mantengono il valore minimo e massimo di ogni colonna contenuta all'interno del singolo Row Stripe. Questo permette di identificare (data una condizione where) se l'informazione risiede o meno all'interno del suddetto Row Stripe.

  • Stripe Data: qui vengono contenuti i dati più un paio di informazioni di supporto (esempio la presenza o meno di valori nulli). Inoltre questa sezione è soggetta a compressione se tale opzione è attiva.

  • Stripe Footer: qui  vengono mantenute informazioni quali la dimensione dei vari Stripe Skip List e Stripe Data.


Per gestire le varie Row Stripes, contenute in un data file, viene aggiunto un secondo file di supporto o "Footer File", dove trovano posto le informazioni sulla dimensione e la posizione di ogni singolo Row Stripe.


Indicizzazione  dei dati


Come accennato sopra, i dati all'interno del nostro data file sono raggruppati in set di righe e quindi indicizzati. Per ogni set di righe viene calcolato il minimo e il massimo valore contenuto nelle relative colonne. Questo comporta in fase di ricerca di identificare se una determinata informazione si trovi nel rowset che  si sta analizzando, evitando di dover fare lunghe scansioni di ogni singolo Row Stripe. A tal proposito è consigliabile importare i dati nell'ordine  con cui, realisticamente, verranno effettuate le ricerche.

Quindi se la nostra tabella conterrà:


(

dt_day timestamp without time zone NOT NULL, -- Data

list_id integer NOT NULL,    --Identificativo di riga

count integer

)


e prevediamo di effettuare query che insisteranno sul campo dt_day e list_day, una buona soluzione sarebbe quella di caricare i dati già ordinati per dt_day, list_id, count. Questo comporta la riduzione di overlap delle informazioni su diverse Row Stripes e quindi aumentare il numero di Row Stripes esclusi in fase di scansione.


Installazione


L'installazione effettuata su CentOS 7 si è rivelata semplice e  veloce.


  • Installate protobuf-c-devel, su CentOS 7 dovrete aggiungere il repository EPEL:

    • sudo yum install protobuf-c-devel

  • Aggiungete nel PATH il percorso dove si trova il file pg_config:

    • PATH=/usr/local/pgsql/bin/:$PATH

  • Infine eseguite il make install.

  • Aggiungete nel file postgresql.conf (dovrete  riavviare il servizio di PostgreSQL):

    • shared_preload_libraries = 'cstore_fdw'


Utilizzo


Fatta  eccezione per alcune parametri (non obbligatori) che è possibile dichiarare in fase di inizializzazione delle nostre tabelle, non è necessario conoscere nulla di più delle normali istruzioni SQL, che già utilizziamo per inserire o estrarre dati.


Di seguito un esempio:


--Procediamo con l'installare l'estensione nel nostro database.

CREATE EXTENSION cstore_fdw;       


--Creiamo il l'oggetto server per mezzo del quale utilizzeremo il 'cstore_fdw'

CREATE SERVER cstore_server FOREIGN DATA WRAPPER cstore_fdw;


--Creiamo la nostra tabella

CREATE FOREIGN TABLE cs_count_view_per_ads

(    dt_day timestamp without time zone NOT NULL,

list_id integer NOT NULL,

count integer

)

SERVER cstore_server OPTIONS (compression 'pglz');


Qui mi sono limitato a dichiarare solo l'opzione "compress". Ma è possibile utilizzare anche le seguenti opzioni:


filename: indicando il percorso assoluto e il nome del file da utilizzare, è possibile specificare dove il file che conterrà i dati della tabella sarà salvato.

compression: le opzioni previste sono "none" e "pglz". Attiva o meno la  compressione  dati.

stripe_row_count: numero di righe che costituiscono una singola Row Stripe. Considerate  che più è alto questo valore, migliori saranno le prestazioni, ma maggiore sarà la richiesta di memoria. Default  150.000.

block_row_count: numero di righe per singola colonna. Il default è 1.000. Modificando questo valore, si va a modificare la "risoluzione" (o granularità) del nostro indice. Più è basso più preciso sarà il nostro indice. Di contro aumenteranno le richieste di lettura del nostro Row Stripe e diminuirà il rapporto di compressione. Utilizzare valori bassi torna utile nel caso di avere dati poco ordinati e richieste che recuperano set di dati relativamente piccoli.

L'utilizzo di valori più alti, comporta una  migliore compressione e una riduzione delle letture, ma (soprattutto se i dati non sono correttamente ordinati) potrebbero crescere il numero di overlap dei dati fra i vari Row Stripe (con conseguente riduzione delle prestazioni).

Ovviamente non c'è la configurazione  perfetta, fate qualche prova, utilizzando set di dati il più simile possibile (per quantità e tipologia) a quelli che poi utilizzerete in produzione.


Per caricare la nostra tabella, possiamo utilizzare:

  • il comando COPY

  • INSERT INTO ... SELECT ... FROM


Infine ricordate  di fare un ANALYZE della tabella (per aggiornare le statistiche).


Alcune considerazioni


Sulla nostra tabella, abbiamo caricato circa 295 milioni di righe.


count_view_per_ads (normale tabella PostgreSQL):

  • righe: 295M

  • dimensione tabella: 12GB

  • dimensione indici (dt_day, list_id): 9GB


cs_count_view_per_ads:

  • righe: 295M

  • dimensioni tabella: 1.3GB

Ovviamente il rapporto di compressione può variare in base alla tipologia e allo schema della tabella, in ogni caso i livelli di compressione sono sempre nell'ordine del 50% (o superiori) rispetto alla tabella originale. A questo bisogna aggiungere che non viene allocato spazio aggiuntivo per gli indici.


Per quanto riguarda le prestazioni vi invito a leggere qui:

https://www.citusdata.com/citus-products/cstore-fdw/cstore-fdw-quick-start-guide


Per la mia esperienza non ho riscontrato miglioramenti nei tempi di elaborazione delle query, in alcuni casi sono leggermente inferiori alle rispettive query che utilizzano normali tabelle con indici di PostgreSQL.


Inoltre va tenuto in considerazione alcune limitazioni:

  • non è possibile utilizzare istruzioni di INSERT INTO ... VALUES, DELETE e UPDATE

  • l'estensione non è disponibile per PostgreSQL per Windows.


Considerando le suddette limitazioni, utilizzare questa tipologia di tabelle può rivelarsi una valida soluzione nei casi in cui si ha a che fare con tabelle "in sola lettura" (time-series, log, storicizzazione dei dati, etc ...), dove inserire i dati e non dover provvedere a cancellarli.

Anche su tabelle di dimensioni relativamente può essere un'ottima  soluzione.

Nel caso sia necessario effettuare  cancellazioni periodiche, bisogna intervenire sulla tabella:

  • generando una  nuova tabella ed eliminando quella vecchia

  • lavorando con le tabelle partizionate


Riferimenti


posted @ 24/08/2015 17.57 by pietro partescano

VSO e deploy di Agosto

Questa volta l’annuncio è sicuramente tardivo, perchè il deploy di VSO è del 7 Agosto, ma volevo comunque, sebbene in ritardo, annunciare una ulteriore funzionalità migliorata della Kanban Board in VSO.

Nei precedenti deploy era stata introdotta la possibilità di cambiare lo sfondo delle card in base a regole sui Work Item, ed avevo mostrato come questa funzionalità può essere utilizzata per marcare visivamente il T-Shirt sizing. In questo ultimo deploy la possibilità di cambiare l’aspetto delle card in base a regole sui work item è stato ulteriormente espanso, permettendo interessanti combinazioni.

Se premete il bottone dei settaggi nella Kanban Board, la prima cosa interessante è che viene aperta una visualizzazione in cui potete configurare molte opzioni del vostro account che riguardano la visualizzazione agile.

 

image

Se aggiungiamo una regola, possiamo verificare che ora è possibile anche personalizzare il titolo, ad esempio si può creare una regola per cui se la card ha una priorità uguale a 4 (massima) il titolo verrà mostrato in rosso ed in grassetto.

image

In alto a destra potete vedere una preview, di come verrà visualizzato il titolo, e nella vostra board ora si può visualizzare immediatamente le card per cui la priorità è massima.

image

Oltre a questo, un’altra interessante novità riguarda le librerie client per sviluppare con TFS. Nella versione VSO/2015 le nuove REST API costituiscono probabilmente una delle migliori opzioni, dato che non richiedono nessuna libreria, ma se avete codice che utilizza il Client Model di TFS, la conversione non è indolore. Finalmente il Client Object Model di TFS è disponibile come libreria Nuget, come potete leggere qui. Questo significa anche che potete redistribuire tutte le dll, invece di richiedere l’installazione del Team Explorer / Visual Studio.

Happy VSO.

Gian Maria.

posted @ 22/08/2015 10.30 by Gian Maria Ricci

MCT Summit Africa 2015

You are welcome see MCT Summit great location YAOUNDE' in CAMEROON

posted @ 03/08/2015 12.29 by Rosalba Fiore

xtype.js



Elegant, highly efficient data validation for JavaScript Apps

http://xtype.js.org/overview

posted @ 03/08/2015 9.56 by Alessandro Gervasoni

Falsi miti: CQRS va implementato con DDD e DDD senza CQRS non si può fare

I due acronimi, DDD e CQRS, stanno troppo spesso nella stessa frase e sempre più spesso mi rendo conto che per le persone devono andare a braccetto: nulla di più sbagliato.

DDD ha uno scopo, per certi versi molto filosofico e aulico, che gira intorno al concetto di comprensione e/o processo di apprendimento, DDD si prefigge di permetterci di disegnare un modello di dominio che sia il più fedele possibile al modello analitico che vogliamo maneggiare.

Il modello analitico è frutto del processo di apprendimento, o di analisi, che una serie di attori, i domain expert(s) (notare il plurale), di pratiche, come il context mapping, e di strumenti (passatemi il termine), come l’ubiquitous language, ci aiutano a generare.

CQRS ha uno scopo ben diverso, e per certi aspetti drammaticamente più semplice: farci comprendere quanto sia importante che una query non cambi la verità.

Ammettetelo, non vi aspettavate quella definizione di CQRS :-)

Ora, che i due quando usati insieme e con grano salis siano un’accoppiata perfetta non vi è dubbio, ma allo stesso tempo non c’è scritto da nessuna parte che debba succedere.

.m

posted @ 29/07/2015 14.24 by Mauro Servienti

Documentazione EF 7 (Beta 5)

Documentazione "Work in Progress" della prossima release di Entity Framework : http://ef.readthedocs.org/en/latest/

posted @ 22/07/2015 8.07 by Pietro Libro

Alcune novita sul licensing di VS 2015

Se andate sulla pagina dove viene fatta la comparazione di tutte le versioni di VS 2015, potrete notare alcuni fatti interessanti. Ad esempio si può notare che il Power Point Storyboarding, la Code Review ed il Task Suspend/Resume sono stati resi disponibili non solamente per la professional, ma addirittura per la versione Community.

image

Code Lens, altra feature molto interessante, è stata resa disponibile anche per la professional. Vi invito a dare una scorsa alla pagina in questione, perchè passare a VS2015 non vi porterà solamente le nuove funzionalità di questa versione, ma potrebbe portare nella vostra edition, funzionalità prima presenti solamente nella premium o nell’ultimate.

Happy VS.

posted @ 21/07/2015 8.56 by Gian Maria Ricci

Falsi miti: sincrono è consistente

Questa è facile!

Aleggia questa strana convinzione che un mondo sincrono sia anche consistente, ecco… a meno che le vostre query in lettura non usino lock pessimistici e transazioni con un altissimo livello di serializzazione allora mi spiace dirvi che le vostre query sono stale by design

Mi spiace anche farvi notare che il sincrono non fa altro che ridurre la finestra temporale e dare una falsa sensazione di sicurezza; sensazione che altro non fa che abbassare il livello di guardia “aiutandoci” a produrre codice che troppo spesso parte dal presupposto che le cose vadano come ci aspettiamo.

Aggiungo come nota di colore che siccome non teniamo mai in considerazione la latenza, partendo dal presupposto sbagliatissimo che sia prossima a zero, la finestra temporale di cui sopra spesso si riduce veramente di poco.

.m

posted @ 16/07/2015 10.40 by Mauro Servienti

[news] Android wear

https://www.android.com/wear

posted @ 14/07/2015 8.57 by Alessandro Gervasoni

Card Styling nella Kanban Board

Con l’ultimo aggiornamento di VSO è stato introdotto il “Card Styling” per le card della Kanban Board. Di base è un semplice motore di regole per cui, in base a criteri espressi sui campi dei work item, abbiamo la possibilità di colorare lo sfondo delle card a nostro piacimento.

Il limite attuale è che l’unico stile possibile che può essere applicato è lo sfondo, ma non è improbabile che in futuro si possano avere altri stili possibili. Vediamo quindi un possibile uso di questa funzionalità.

Si supponga di suddividere le card per “grandezza” usando il classico T-Shirt sizing, ovvero ogni card può avere la grandezza S/M/L/XL. Sulla base della grandezza delle card introduciamo alcuni semplici regole del tipo:

1) Solamente una card XL può essere presente nella board ad eccezione naturalmente della colonna Done e del backlog
2) Solamente una card L può essere presente in una specifica colonna della board
3) Se in una colonna è presente una card XL, in quella stessa colonna non può essere presente più di una card M
4) Se in una colonna è presente una card L in quella stessa colonna non possono essere presenti piu di 2 card M

Questo è un possibile esempio di semplici regole che ci permettono di gestire la variabilità in grandezza delle varie card. A questo punto è necessario però avere un immediato impatto visuale sulla board relativamente alla grandezza delle card. Per questo possiamo usare la nuova funzionalità di Styling.

image

Questo nuovo menù aprirà una finestra in cui potete inserire una serie di regole per decidere il colore di sfondo delle card. Ecco ad esempio le regole per colorare di rosso le card XL, in giallo quelle L e in blu quelle S

image

  • Come potete vedere una regola ha un nome, il colore di sfondo da usare, ed un editor che vi permette di inserire condizioni sui vari campi dei Work Item. In questo esempio ho usato i TAG per categorizzare le card. Se una card soddisfa più regole, verrà applicata la prima soddisfatta. Dalla finestra di gestione regole potete infatti con il drag & drop effettuare un riordinamento.

image

In questo modo è possibile avere un immediato colpo d’occhio sulla grandezza delle card su cui il nostro team sta lavorando.

Gian Maria.

posted @ 11/07/2015 10.23 by Gian Maria Ricci

Falsi miti…

Uno dei problemi enormi che si trova a dover affrontare chi approccia Domain Driven Design oggi è il sovraccarico di informazioni, spesso confusionarie e fuorvianti, tra cui deve districarsi prima di capire cosa fare e come.

Ci sono poi una sfilza di falsi miti che vorrei pian piano provare a sfatare o se non altro provare a mettere in un angolino e sperare che vengano dimenticati.

Si parla troppo spesso nella stessa frase di: DDD, CQRS e Event Sourcing, facendone spesso un pastrocchio ma soprattutto partendo dal presupposto che siano per forza da implementare sempre insieme, che vadano a braccetto in maniera inscindibile.

Se guardiamo poi al solo argomento Event Sourcing c’è una quantità infinita di interpretazioni errate e di grovigli.

Tutti questi falsi miti, pericolosissimi, combinati con la nostra (di informatici) capacità di abbracciare l’hype (leggi microservices come novità del momento) non possono che produrre danni inenarrabili.

.m

posted @ 06/07/2015 10.35 by Mauro Servienti

Buoni pasto dal 1 Luglio

Ragazzi bisogna diffondere la notizia. La soglia di esenzione fiscale dei ticket restaurant riconosciuti portando il limite di non imponibilità fiscale a euro 7,00 per quelli utilizzati in forma elettronica. Rimane invece invariata la disciplina per i buoni basto cartacei restando fissa a euro 5,29. Il nuovo dettato normativo avrà effetto a decorrere dal 1 luglio 2015. Da oggi, 1 luglio, non sarà più possibile fare la spesa al supermercato utilizzando contemporaneamente più buoni pasto, forniti dal datore di lavoro. MA COME??!?!?!? E I TICKET VECCHI!!!!?!?!? Inoltre l’uso dei ticket, che può riguardare solo le somministrazioni di alimenti e bevande, può avvenire solo durante la giornata lavorativa, anche se domenicale o festiva e i beneficiari non possono essere soggetti diversi dai lavoratori, per cui il buono non può essere ceduto, venduto, né convertito in denaro. Ma soprattutto non può essere cumulato. Ma chi ha deciso la non cumulabilità, la non spendibilità di domenica, uno al giorno? Paperino?

posted @ 01/07/2015 23.13 by Emanuele Prato

La Web European Conference apre la registrazione domani 1 Luglio a mezzogiorno

title

É finalmente arrivato il momento che molti aspettavano: domani, a mezzogiorno, aprirá la registrazione per la seconda Web European Conference.

Nella precidente edizione tutti I 170 biglietti disponibili sono finiti nelle giro di qualche ora: quest’anno abbiamo molti piú posti, oltre 400, ma per essere sicuri di non perdere l’opportunitá, andate alla  pagina di registrazione per tempo.

Registrati per la Web European Conference

Speakers e sessioni

La Call for Presenters verrá chiusa domani, e vi chiederemo un aiuto nel scegliere le sessioni da includere nella conferenza: potete guardare giá tutte le proposte sul nostro repository su github, farvi un’idea e da domani votare per le vostre sessioni preferite.

In aggiunta abbiamo giá i nostri due TOP speakers: Scott Hanselman e Dino Esposito.

speakers

 

Sponsors

Ed infine, un grande grazie agli sponsors e partner, senza i quali la conferenza non sarebbe possibile.

sponsors

 

posted @ 30/06/2015 11.46 by Simone Chiaretta

Amazon e L’IVA

E’ interessante vedere come le notizie vengono prese in modo differente :), dal 1°Maggio Amazon emette fattura italiana, e per me, che sono un’attività, è una notizia veramente interessante.

Prima del 1°Maggio infatti, per acquistare su amazon con partita IVA, bisognava farsi abilitare ad Intrastat (con relative spese del commercialista) e poi si entrava tra l’altro nella lista delle P.IVA che commerciavano con il Lussemburgo. Insomma, l’acquisto come professionista su amazon era veramente sconveniente.

Ora leggo questo articolo su Repubblica (http://www.repubblica.it/economia/2015/05/04/news/amazon_reverse_charge-113480629/?ref=HRLV-6&refresh_ce) e rimango quantomeno sconcertato. Viene detto:

Il problema vero era nell'applicazione pratica. Una volta che un cliente verificava la propria Partita IVA nel suo account - pratica che nei primi anni non era nemmeno troppo rigorosa - qualsiasi prodotto "Venduto e spedito da Amazon" diventava esentasse: scarpe, mobili, giocattoli, videogiochi, televisori, biancheria intima. Senza andare troppo per il sottile, perché ovviamente non sta al venditore verificare che il cliente abbia diritto di acquistare determinati oggetti come beni strumentali alla propria attività.

Ora, io non sono un commercialista e ne capisco poco, ma sostanzialmente questa cosa è palesemente falsa. Quando io abilito la mia P.IVA ad intrastat, e quindi al Reverse Charge, Amazon mi emette una fattura senza IVA, perchè io Debbo dichiararla allo stato e quindi o pagarla (se non è un bene legato alla mia attività) oppure riscaricarla perchè è un bene legato alla mia attività.

Quindi in realtà non è mai stato esentasse, ma, come succede in ItaGlia, il paradiso degli evasori. Questo perchè, se acquisto in reverse charge e non dichiaro nulla allo stato, da quello che so io è evasione di IVA, ed in generale il mio commercialista mi ha detto, in maniera molto chiara: Prima di qualsiasi acquisto in reverse charge, debbo abilitarti la partita IVA e mi raccomando poi, fai attenzione a qualsiasi aquisto fai che possa avere il reverse charge, perchè se non lo dichiari poi sono augelli per diabetici. Quindi il problema non è Amazon.

Quindi mi chiedo, tutti quelli che hanno acquistato da amazon senza iva, e senza dichiarare il reverse charge, il nostro stato non li becca? Non esiste nessun modo? Da noi deve essere sempre il paradiso dei “furbetti” dove qualsiasi legge deve essere aggirata?

Alk.

posted @ 20/06/2015 12.10 by Gian Maria Ricci

WebP : A new image format for the Web

https://developers.google.com/speed/webp/

posted @ 18/06/2015 17.52 by Alessandro Gervasoni

Repository delle mie brame

Qualche tempo fa con un amico si stava discutendo di `Repository Pattern` e di tutto quello che gli gira intorno, tutta la disquisizione ruotava intorno a quale fosse il ruolo di un `repository` in un mondo orientato a CQRS. Siamo dopo un po’ di scambi di opinioni giunti alle seguenti questa conclusioni.

Un repository deve

  1. consentire di caricare un aggregato data la sua chiave primaria;
  2. consentire di aggiungere una nuova istanza di un aggregato;
  3. persistere le modifiche apportate ad un aggregato;
  4. rappresentare una Unit Of Work;

Un repository non deve

  1. consentire di eseguire query di nessun tipo;
  2. forzare la dichiarazione di intenti: Non è responsabilità di chi usa un aggregato sapere se deve persistere o meno delle modifiche, se il repository è una UoW la responsabilità è sua;

Se pensiamo di esprimere i requisiti di cui sopra con del codice C# lo possiamo fare usando la seguente interfaccia ad esempio:

namespace Sample.Repository.Pattern
{
public interface IRepository<T> where T : SomeConstraint
{
void Add(T entity);
T GetById(int Id);
void CommitChanges();
}
}

Che sebbene sembri soddisfare tutti i nostri requisiti non soddisfa il punto ‘4’ delle cose che un repository deve fare: Unit of Work.

Perché?

Provate a pensare come usereste l’interfaccia di cui sopra:

IRepository<Person> peopleRepo = …
 
var aPerson = peopleRepo.GetById( 123 );
aPerson.ChangeName( “new person name” );
 
peopleRepo.CommitChanges();

Se il repository è una UoW non dobbiamo dichiarare che vogliamo aggiornare l’istanza di Person che abbiamo appena modificato, lo sa già quindi ci basta a e avanza dichiarare che vogliamo salvare, CommitChanges().

Ma, osservate il seguente scenario:

IRepository<Person> peopleRepo = …
IRepository<Company> companiesRepo = …
 
var aPerson = peopleRepo.GetById( 123 );
aPerson.ChangeName( “new person name” );
 
var aCompany = companiesRepo.GetById( 456 );
aCompany.RegisterVATNumber( “vat number” );
 
peopleRepo.CommitChanges();
companiesRepo.CommitChanges();

Non è più una singola Unit Of Work e l`unico che abbiamo per garantire l’atomicità delle operazioni di cui sopra è racchiudere il codice in un blocco `using` con un `TransactionScope`.

Sebbene non sia un gran problema, e non è neanche sbagliato, la cosa che ci sta forzando ad andare in quella direzione non è l’architettura ma meramente la scelta di design che abbiamo fatto per l’API del nostro repository.

Se lo disegnassimo così?

namespace Sample.Repository.Pattern
{
public interface IRepository
{
void Add<T>(T entity) where T : SomeConstraint;
T GetById<T>(int Id) where T : SomeConstraint;
void CommitChanges();
}
}

La modifica è in apparenza banale, ci siamo limitati a spostare i generics dalla dichiarazione dell’interfaccia ai singoli membri della stessa, con la differenza fondamentale che adesso possiamo scrivere questo:

IRepository repo = …
 
var aPerson = repo.GetById<Person>( 123 );
aPerson.ChangeName( “new person name” );
 
var aCompany = repo.GetById<Company>( 456 );
aCompany.RegisterVATNumber( “vat number” );
 
repo.CommitChanges();

Che oltre a farci risparmiare un apio di righe di codice, ma chi se ne frega, ci permette di soddisfare elegantemente anche il punto “4”.

Volete vederlo in azione?

.m

posted @ 17/06/2015 9.44 by Mauro Servienti

Clusterize.js

Tiny plugin to display large data sets easily

 

https://nexts.github.io/Clusterize.js/

posted @ 16/06/2015 16.21 by Alessandro Gervasoni

Un piacevole ebook sul Social Media

Il nuovo e-book di Valentina Turchetti, edito da Area51 Publishing, vuole proprio fare chiarezza e fornire strategie e tattiche utili ad imprenditori, manager, liberi professionisti, aspiranti consulenti web per attuare una comunicazione online vincente e presenziare i Social Media efficacemente.

Grazie a numerose case history e casi studio tratti dall’esperienza professionale quotidiana dell’autrice, l’e-book assume un connotato estremamente concreto: non si tratta di un manuale teorico, ma di una guida pratica che illustra, passo dopo passo, capitolo dopo capitolo, quali sono le attività, le opportunità, le sfide che chi lavora nel Social Media Marketing si trova, ogni giorno, a dover affrontare.

L’e-book Social Media Marketing. Strategie per costruire e gestire efficacemente la tua Comunicazione sui Social Media è suddiviso in cinque capitoli:

1.    Social Media Marketing: cosa c’è da sapere.

2.    Il Listening: prima si ascolta, poi si agisce.

3.    Content Creation & Management

4.    Community Management e Brand Reputation

5.    Digital P.R.

 

Un E-book innovativo nel suo genere, che non vuole essere un semplice manuale teorica, ma una guida pratica per presenziare efficacemente i Social Media.

L’E-book in Social Media Marketing è acquistabile su Amazon a soli € 4,99: ACQUISTA ORA!

Autore: Valentina Turchetti
Casa Editrice: Area51 Publishing – Web Marketing Edizione
Pagine: 187
ASIN: B00WT4CUGW
ISBN: 978-88-6574-713-1

ebook-socialmedia

Informazioni e Contatti
Valentina Turchetti
valentina@seobuzz.it
www.seobuzz.it

posted @ 15/06/2015 13.42 by Marco Maltraversi

Latest Images

From miscellaneous
From miscellaneous
From miscellaneous
From Immagini
From Immagini
From Immagini
From Immagini
From Immagini
From Immagini
From Immagini
From Immagini
From Immagini
From Immagini
From Immagini
From Immagini
From Immagini
From Immagini
From Immagini
From Immagini
From Immagini