martedì 27 settembre 2011
Gymmit, il Social Network per lo sport e gli impianti sportivi realizzato da Ingenium, verrà presentato agli imprenditori del settore sportivo durante un evento organizzato da Helpy Services a Roma, il 13 Ottobre 2011, dal titolo “Come aumentare gli iscritti al centro sportivo in tempi di crisi”.
Vedremo come l’impiego del Software Gestionale Gymnasium System, della Business Intelligence, e dei Social Media possano essere di aiuto agli imprenditori del settore sportivo, nonchè facilitare l’avvicinamento al mondo dello sport.
La partecipazione all’evento è gratuita!!

giovedì 28 luglio 2011
Ormai da anni impiego log4net per implementare lo strato di logging nei miei progetti e mi trovo veramente molto bene.
Una delle caratteristiche che amo di più di log4net è la possibilità di cambiare log sink solamente tramite file di configurazione, permettendo così di fatto la gestione del log nella propria applicazione senza preoccupazioni di dove poi questi messaggi vadano a finire o se una certa destinazione del log (ad esempio un DB) sia o meno presente nell’ambiente di produzione.
La configurazione di questo motore di logging avviene tramite sezione del file di configurazione (web.config o <app>.config) e questa configurazione viene “caricata” all’esecuzione del comando:
log4net.Config.XmlConfigurator.Configure()
Vi sono dei casi però, nei quali non siamo sicuri che un’applicazione effettui questa chiamata. Mi riferisco a quei casi in cui la nostra DLL, splendidamente farcita di log, venga chiamata da una file eseguibile il quale, pur avendo un file di configurazione .config che comprende magari anche la sezione di configurazione di log4net, non chiami correttamente il metodo Configure().
In questi casi saremmo noi costretti a controllare se il logger è stato o meno configurato, il che renderebbe tutto molto meno pratico.
Per risolvere la problematica, si può impiegare la seguente strategia:
- Rimuovere la configurazione di log4net dal file .config e riportarla in un file log4net.config, da copiare ovviamente nella directory della nostra applicazione
- Impostare nel file AssemblyInfo di ogni progetto di tipo Class Library per la quale desideriamo attivare la configurazione del logging l’attributo
[assembly: log4net.Config.XmlConfigurator(ConfigFile="log4net.config", Watch=true)]
In questo modo otteniamo due interessanti benefici: il primo è quello di isolare la configurazione del logging in un file, rendendola di fatto facilmente riutilizzabile e modificabile. Cambiando infatti SOLO il file log4net.config otterremo un comportamento del logging differente.
Il secondo è quello di poter dare per configurato il loggining nelle nostre dll, che potranno quinidi essere distribuite anche a sviluppatori terzi, senza richiedere loro di referenziare log4net e richiamare il metodo Configure.
mercoledì 27 luglio 2011
Oggi mi è stato sottoposto un problema veramente curioso. Una collega mi ha fatto notare che durante un’operazione di manutenzione di un DB SQL Server 2008 R2 ha lanciato una query di DELETE che non si è comportata come previsto. In pratica, questa query stava cancellando arbitrariamente i dati dalla tabella senza rispettare la clausola WHERE che compariva regolarmente nel testo della query.
Il comando dato al server è il seguente:
DELETE FROM dbo.Utenti WHERE IDUtente IN (SELECT IDUtente FROM dbo.Operatori)
Come mai il comportamento è strano? Perchè effettivamente in questa query c’è un errore! La tabella Operatori NON contiene il campo IDUtente, per cui, lanciato da solo, il comando
SELECT IDUtente FROM dbo.Operatori
Dà un errore di tipo:
Msg 207, Level 16, State 1, Line 1 Invalid column name 'IDUtente'.
Lo stesso errore non viene riportato se la query viene lanciata come subquery della clausola IN, bensì la query viene eseguita completamente, cancellando TUTTI i record dalla tabella Utenti, ignorando per cui la clausola WHERE IDUtente IN (…).
E’ da notare come utilizzando un nome di campo non esistente nè nella tabella Utenti, nè nella tabella Operatori la query vada in errore; per cui è da supporre che il comando non vada in errore proprio perchè il campo IDUtente compare nella tabella Utenti (cosa comunque errata).
Per ricreare il “problema” ed indagare ulteriormente, ho creato un piccolo DB con 2 tabelle, Utenti e Operatori, così strutturate:
- Utenti
- IDUtente [int] PK
- Nome [varchar(50)]
- Operatori
- IDOperatore [int] PK
- Nome [varchar(50)]
nella tabella Utenti ho 5 records (con IDUtente 1,2,3,4,5), mentre in quella Operatori ne ho 2 (con IDOperatore 1,2)
Questa query seleziona tutti gli utenti:
SELECT * FROM dbo.Utenti
Questa query seleziona solo gli utenti 1 e 2
SELECT * FROM dbo.Utenti WHERE IDUtente IN (SELECT IDOperatore FROM dbo.Operatori)
Questa query restituisce un errore:
SELECT IDUtente FROM dbo.Operatori
Msg 207, Level 16, State 1, Line 1 Invalid column name 'IDUtente'.
Questa query, stranamente, restituisce TUTTI gli utenti:
SELECT * FROM dbo.Utenti WHERE IDUtente IN (SELECT IDUtente FROM dbo.Operatori)
Non dovrebbe restituire tutti gli utenti, in quanto il campo IDUtente non fa parte della tabella Operatori. Altrettanto stranamente anche questa query restituisce tutti gli utenti:
SELECT * FROM dbo.Utenti WHERE IDUtente IN (SELECT IDUtente)
Per induzione, penso che SQL interpreti il campo IDUtente come campo dell’unica tabella elencata nella clausola FROM, anche se questo è a mio avviso fuorviante.
Quindi, quando fate una query di delete con una clausola IN, fate particolare attenzione ai nomi dei campi, e magari prima di eseguirla provate a fare una SELECT.
giovedì 28 aprile 2011
Solitamente non faccio pubblicità di prodotti commerciali nel mio blog… ma stavolta, visto che penso si tratti di un tool davvero utile e completo, voglio segnalarvi il tool della Red Gate SQL Doc 2 che permette di documentare un database SQL Server.
Troppe volte si “perde” il significato dei campi presenti nella miriade di tabelle presenti nei nostri database. Troppe volte si passa il tempo a chiedere al collega “Senior” il perchè di un campo o il significato o l’uso di un altro. Se quando si modifica il DB si generasse la documentazione con questo tool, integrandola con la descrizione dei campi che meritano un approfondimento, probabilmente si otterrebbero i seguenti effetti:
- Essere più “consci” di ciò che cambia nel nostro DB;
- Facilitare l’ingresso di nuovi colleghi all’interno dell’infrastruttura di sviluppo;
- Evitare di “riscrivere” funzionalità (SP, Functions) già presenti nel nostro DB ma “ignote”;
La Documentazione può essere generata in .doc, .htm, e in chm, quindi facilmente distribuibile e fruibile.
Nel sito della Red Gate c’è la versione di prova per 14 giorni. Provatela!
giovedì 21 aprile 2011
Oggi è uscito sul blog di MSDN Italia un mio Guest Blog Post sull’integrazione di DotNetNuke con Facebook. Questo articolo di tipo tecnico/divulgativo, spiega come sia stato possibile realizzare l’integrazione tra DotNetNuke e Facebook, integrazione che va dall’autenticazione fino al post di notizie sulla bacheca di Facebook. Nell’articolo si parla anche di gymmit.com, Il Social Network dello Sport che ho realizzato e per il quale ho implementato l’integrazione con Facebook. Visitatelo per vedere all’opera l’integrazione.
Un grazie di cuore a Microsoft e a tutti i ragazzi di MSDN Italia!!!!
domenica 17 aprile 2011
Volevo spendere due parole di ringraziamento per i feedback positivi che mi sono arrivati per la mia sessione “Total Smarphone Interoperability” tenuta ieri sera in uno degli eventi della nostra community XeDotNet.
Non era una sessione “comune”: per una volta ho voluto avere come “ospite” un sistema operativo (Android) ed un linguaggio (Java) che poco hanno a che fare con XeDotNet, ma tant’è: il mondo è bello perchè è vario e vedere cose nuove aiuta a dare un valore a ciò che già si ha, e a desiderare ciò che si vorrebbe avere.
Ben venga quindi il confronto, come molti di voi mi hanno detto ieri sera; ben venga una valutazione obiettiva degli strumenti e dei tempi di sviluppo; ben vengano le critiche costruttive che ci potranno solo portare a realizzare il nostro lavoro con maggiore consapevolezza ed una professionalità sempre maggiore.
Grazie a tutti voi, quindi, che avete saputo cogliere lo spirito di questa sessione, e che con la vostra curiosità l’avete resa ancora più interessante. Grazie!
lunedì 11 aprile 2011
In un mondo dove la parola d'ordine è "connected", gli smartphone giocano un ruolo chiave. Sempre più siamo abituati ad interagire con l'informazione ovunque. Twitter, Facebook e servizi di vario genere, ormai consentono l'accesso attraverso dispositivi mobili. La parola chiave per rendere fruibili i nostri servizi? Interoperabilità. E' infatti chiaro che se un servizio non è interoperabile, si potrebbero precludere delle occasioni di marketing per determinati possessori di smartphone a vantaggio di altri. In questo meeting vi parlerò di come realizzare un servizio WCF interoperabile, lo metteremo on line e svilupperemo due client che lo consumino: il primo per Windows Phone 7, ed il secondo per Android. Analizzeremo ambienti di sviluppo, tecniche, pro e contro degli approcci di ciascuna piattaforma, in una atmosfera di confronto produttivo.
Non mancate, la sessione sarà sicuramente stimolante ricca di spunti di discussione!
Venerdì 15 Aprile 2011, ore 19.30, presso il Novotel Castellana a Mestre (VE). Per iscriversi seguite questo link.
lunedì 7 febbraio 2011
Grazie a gymmit, oggi puoi iscriverti ad una comunità online fatta da persone che amano lo sport, e cercare all’interno del database di centri sportivi la palestra, la piscina o l’impianto sportivo dove si praticano gli sport che ami di più.
I tuoi amici sportivi possono commentare e dare i voti agli impianti sportivi e grazie alle funzionalità offerte dalla piattaforma social, è facile trovare amici che praticano i tuoi stessi sport o centri sportivi che possono offrirti i servizi che desideri.
Iscriversi a gymmit è facile e divertente, ma soprattutto è gratuito, sia per gli sportivi che per i centri sportivi. Per il centro sportivo vengono poi proposte tutta una serie di funzionalità aggiuntive che possono essere integrate in momenti successivi all’iscrizione del centro per favorire la riconoscibilità e la frequentazione del centro da parte degli sportivi.
Gli attori fondamentali di gymmit sono tre:
- Sportivi
- Centri sportivi (piscine, palestre, centri benessere, centri estetici)
- Investitori pubblicitari
Per uno sportivo, essere su gymmit rappresenta la possibilità di conoscere nuove persone con le quali condividere momenti di svago o di allenamento, restare in contatto con compagni di squadra e organizzare partite, incontri o eventi.
Per un centro sportivo, essere su gymmit significa farsi trovare facilmente dagli sportivi, poter fare promozione delle proprie attività amministrando i dati pubblicati sul sito esponendo caratteristiche, categorie, contatti, fotogallery, mappa e molto altro attraverso un’interfaccia semplice ed intuitiva.
Per un investitore pubblicitario, promuovere il proprio business su gymmit rappresenta la concreta possibilità di raggiungere un pubblico di sportivi di qualsiasi livello che sono sicuramente interessati ad acquistare prodotti o servizi sportivi.
La roadmap e l’evoluzione di gymmit è ancora molto ricca e costellata di innumerevoli funzionalità che renderanno ancora più piacevole il praticare sport in compagnia.
Visita gymmit, ed iscriviti per partecipare alla community. Il benessere e la compagnia sono i nostri valori, condividili con noi!
Be social. Be fit. Be gymmit!
martedì 30 novembre 2010
Se anche voi combattete con WCF tutti i giorni, vi sarete imbattuti sicuramente nel problema di condividere il file WSDL che viene generato, con gli Imports che fanno riferimento a file esterni (XSD). Bene, su codeplex è disponibile il progetto WCFExtras che, impiegato seguendo le istruzioni, consente di far generare il file WSDL in un unico file (e anche molte altre cose interessanti).
Single WSDL file
Some older SOAP toolkits fail when trying to import a WSDL file that contains references to external .xsd files. This extensions simply merges the external types into the wsdl file and produces a single flat wsdl file that contains all the definitions it needs.
Riesco a scrivere solo ora due righe per ringraziare tutti per l’esperienza da Speaker a WPC 2010.
Grazie ai partecipanti, che sono stati presenti alle mie sessioni “in massa”. Grazie per la fiducia che mi avete voluto accordare; spero che questa non sia stata tradita, come spero di avervi trasmesso informazioni e concetti che vi saranno utili nel lavoro di tutti i giorni.
Grazie all’organizzazione di Overnet, precisa e rilassata, che non ci ha fatto mancare nulla. Un grazie particolare ad Andrea Benedetti per il supporto morale e l’incoraggiamento.
Grazie agli amici e colleghi Speakers; il confronto con voi non solo è stimolante… fa crescere e rinnova in me il desiderio di sperimentare. Sempre.
Un Grazie agli amici MVP e a Microsoft, che con il programma MVP non solo dà a noi l’opportunità di crescere e divulgare la tecnologia, ma crea un vero e proprio “tessuto sociale” che rende il nostro lavoro, a volte arido e incompreso, un patrimonio da diffondere e apprezzare.
Grazie, e alla prossima!