“L’importante è esagerare”

So bene che “scherza coi fanti ma lascia stare i santi”, ma per parlare dei Community Days 2014 non potevo prendere in prestito frase migliore… Potrei parlare del fatto che abbiamo sfondato la quota delle 1000 iscrizioni e che stiamo praticamente “soppalcando” le sale. Potrei parlare di quanto io sia lieto di vedere che il numero di community che quest’anno supportano l’evento è il più alto di sempre e le ringrazio di cuore perchè senza di loro l’evento lo puoi anche organizzare ma non riusciresti ad erogarlo. Potrei parlare del fatto che avremo una inedita track dedicata C++, un linguaggio tanto potente quanto spesso bistrattato, grazie alla disponibilità del neonato user group C++ che ha scelto il nostro palcoscenico per il proprio “debutto in società”. Potrei parlare del fatto che tanti eventi “piazzano” in agenda sessioni dedicate performance e scalabilità, e la nostra umile (ma convinta) risposta è una sessione ad hoc tenuta da uno degli sviluppatori di StackOverflow (#meico). E potrei anche azzardare l’affermazione che avere in keynote l’Amministratore Delegato di Microsoft Italia (che, immaginerete, ha una agenda piuttosto “piena”) significa che, insomma, il nostro “piccolo grande” evento ormai è un po’ meno “piccolo” ed un po’ più “grande”, e non solo dimensionalmente.

Ma se dovessi dirvi perché quest’anno i Community Days esagerano, beh… Vi direi di dare una occhiata alla agenda della terza giornata perchè è una di quelle che a noi tecnici sembrano tanto inutili e che poi, dovessimo mai dotarci di partita IVA o addirittura aprire una azienda, potrebbero letteralmente salvare la vita. Quando 10 anni fa avviai Managed Designs avrei tanto avuto bisogno di non essere tanto ignorante da non ritrovarmi a pagare per gli errori commessi nella generazione di offerte (es: assicurare il margine di contribuzione ed includere una quota di risk management) o nelle scelte tecnologiche perché, da semplice tecnico, non immaginavo che tutti i progetti potessero concludersi in attivo ma i costi indiretti potessero mandare il bilancio aziendale in negativo e i soldi, a quel punto, li deve mettere l’imprenditore, cioè io. O voi. Oppure perchè BYOD è una buzzword che oggi è tanto “cool” ma, esattamente come la scelta degli smartphone, non si fa (esclusivamente) di pancia ma anche dovendo considerare le norme di legge perché, altrimenti, indovinate chi le paga le sanzioni? E potrei continuare… Insomma, 10 anni addietro avrei voluto che una giornata del genere ci fosse e soprattutto avrei voluto non essere tanto presuntuoso da pensare che, se anche ci fosse stata, non mi sarebbe servita perché, ehi, io ero bravo a scrivere software ed alla fin fine l’importante è quello. E invece no, ci sono skill altrettanto importanti per un “imprenditore” (anche di se stesso) e sono veramente “orgoglione” di avere avuto la possibilità di inserire questi temi in agenda.

Hai ragione Enzo, l’importante è esagerare: non so cosa io e Daniele potremo inventarci l’anno prossimo ma ti assicuro che guarderemo in fondo al cilindro per vedere se sia rimato qualche piccione :-)

Tag di Technorati: ,

Andrea @ WPC 2013

Ormai ci siamo: settimana prossima “arriva” WPC e, per la 12a volta, abbasserò la qualità dell’evento partecipandovi in qualità di relatore. Sperando di far cosa utile ai partecipanti, provo a spiegare quale sarà il taglio delle mie 2 sessioni in modo da permettere di capire se preferirle (o viceversa) a quelle contemporanee.

  • Idiomatic Domain Driven Design: siete reduci dalla prima lettura del “blue book” oppure “non ho letto il libro, ma ho trovato un po’ di documentazione online”? Bene, probabilmente ora ricadete in una delle seguenti categorie: 1) pensate che DDD “per il nostro scenario è troppo costoso, mica dobbiamo lanciare i razzi sulla Luna”, oppure 2) vi siete persuasi che, giacchè la prima “D” in “DDD” significa “Domain”, allora la chiave di volta sia il Domain Model e quindi… Evvai con le classi “Cliente”, “Fattura”, “Prodotto”, mapping con l’O/RM di turno e passa la paura. Ecco, in questa sessione “scopriremo” che:
    1. in DDD, l’implementazione è un “dettaglio”. Un interessantissimo dettaglio, ma pur sempre un dettaglio. DDD è una strategia, non “solo” un insieme di (design) pattern
    2. l’implementazione di DDD “si… può… fare!” (cit.) senza che costi uno sproposito e adeguandola allo stack tecnologico per sfruttarne le peculiarità (ecco perchè nel titolo c’è scritto “Idiomatic”)
    3. la classe “Fattura” potrebbe anche non esistere, e sarebbe comunque DDD
  • Designing Web Solutions: in questa sessione cercherò, dando per già acquisita una buona competenza relativa al tipico stack tecnologico di una applicazione web, di spiegare a quali temi architetturali dedicare attenzione in funzione di vari scenari. In questo contesto, con l’espressione “temi architetturali” intendiamo, ad esempio: gestione degli URL del sito, eventuale API esposta dal sito, microdata, sitemap, security, fruizione mediante device eterogenei, integrazione con servizi esterni… Per ogni tema, oltre ad affrontare il problema dal punto di vista concettuale vedremo anche delle ipotesi implementative. “Codice”, insomma.

Ci vediamo a WPC? :-)

Technorati Tags: ,,

Sito UGIdotNET, da M1 a v1.

Ho aggiornato la copia online della versione beta del sito UGIdotNET, basandola sulla build M1 che ho chiuso da qualche giorno. Ecco le principali caratteristiche:

  • Responsive, testata con:
    • Windows: Chrome (ok), FireFox (ok), IE10 (ok)
    • iOS7: Chrome (ok) e Safari (ok)
    • iOS6: Chrome (ok) e Safari (che ha qualche problemino)
  • pervasivo, seppur non completissimo, supporto degli structured data di http://schema.org  (sono quelli supportati dai crawler di Bing, Google, Yahoo! e Yandex)
  • Al di fuori della home page, è tutto HTML5 valido secondo il validator del W3C. Perché “al di fuori della home page”? Perché la sintassi di Angular mi sta costringendo ad inserire alcuni caratteri che il validator considera errati: cercherò un workaround o, più probabilmente, di capire dove mi sono perso qualcosa :-)
  • [NEW] Implementata la gestione delle sottoscrizioni alle newsletter (leggasi: la possibilità di desottoscriversi)

Dal mio punto di vista M1 chiude, salvo “imprevisti”, la v1 anche se mancano delle feature importanti che ho già nel backlog ma slittano al prossimo aggiornamento del sito, auspicabilmente non lontano.

Da ora in poi mi dedicherò, fino alla pubblicazione (spero entro un paio di settimane) in produzione, esclusivamente al fix dei bug che mi saranno segnalati dotati di repro. Ne conosco già qualcuno (es: responsive su iOS6), ma ogni segnalazione è davvero benvenuta, grazie.

Technorati Tags:

Sito UGIdotNET, beta 2

Ho pubblicato un aggiornamento della versione beta del nuovo sito UGIdotNET, ecco il changelog:

  • [UPDATE] Alcuni cambiamenti in home page, sia estetici (es: appaiono gli abstract anche per i tip e il numero di video è stato aumentato a 4) sia “sotto il cofano” (es: video e blog nella barra di dx vengono popolati mediante AngularJS).
  • [NUOVO] Le pagine “lista” di articoli, news e tip hanno i feed atom/rss
  • [NUOVO] E’ disponibile la sezione “Eventi
  • [NUOVO] Aggiunta la pagina “Collabora
  • [UPDATE] La pagina di gestione del profilo utente permette ora di modificare: dati anagrafici, indirizzo e-mail e password
  • Fix e ottimizzazioni varie.

Il layout, analogamente a quanto detto in precedenza, non è ancora definitivo anche se ho avviato uno spike per realizzare un template responsive basato su Bootstrap. Come al solito, segnalatemi eventuali bug (dotati di repro) e ribadisco la raccomandazione di utilizzare il nuovo sito, nonostante sia una beta, in sostituzione di quello attuale.

Technorati Tags:

Never mind the bollocks: here’s the MvcMate

Premessa: l’ho mostrato durante la mia sessione ai #CDays13 di Roma e mi stanno arrivando alcune mail al riguardo, quindi approfitto del blog per una risposta “pubblica e cumulativa”: ecco il sorgente di MvcMate, disponibile anche come package NuGet. Per coloro che non erano presenti, MvcMate è una libreria che sviluppiamo in Managed Designs a supporto dei nostri progetti web: fondamentalmente, è nata quando ho deciso di iniziare a impacchettare tutte quelle primitive che, pur generalmente utili, erano invece sparpagliate all’interno dei vari progetti (uno su tutti: la beta del nuovo sito UGIdotNET).

Al momento, la libreria contiene:

  • alcuni ActionResult custom: Atom10Result, ImageResult, JsonpResult e Rss20Result
  • un action filter: MinifyAttribute
  • un html helper: Html.Upload/UploadFor
  • una constraint per il routing engine: NotEqualConstraint

L’idea alla base di MvcMate consiste nell’aggiungere funzionalità ad ASP.NET ed ASP.NET MVC facendole sembrare “native” cioè quanto più indistinguibili, nell’uso, da quelle built-in: in sostanza, uno degli obbiettivi è quello di generare la più bassa frizione possibile all’adozione della libreria. Per esempio, relativamente agli action result sono disponibili degli extension method della classe controller che permettono di scrivere, all’interno di una action, codice quale:

   1: public ActionResult MyJsonp()
   2: {
   3:     var model = new {FirstName = “Mario”, LastName=”Rossi”};
   4:     return this.Jsonp(model);
   5: }

Man mano che avrò tempo integrerò le altre primitive già pronte e, d’ora in poi, quelle che produrremo ex novo saranno implementate direttamente nella libreria: inizialmente saranno disponibili nel sorgente per poi finire anche nel package NuGet.

Il sorgente contiene anche alcuni sample che mostrano l’utilizzo di tutte le funzionalità della libreria e, a mio avviso, è una interessante “palestra” per coloro che volessero approfondire MVC per capire come “faccia a fare cosa” (es: come vengono generati gli attributi del markup che permettono di usare jQuery Validate in combinazione alle data annotation?) oppure come effettuare unit testing in un contesto di questo tipo (la libreria è per la maggior parte sviluppata facendo TDD). Per coloro che volessero dare un’occhiata al sorgente, alcuni approfondimenti utili potrebbero essere questo articolo o quest’altro.

Relativamente a CodePlex, ho scelto Git in modo da permettere fork e pull request: in generale, commenti e suggerimenti sono benvenuti così come ogni forma di supporto. Non sparate sul pianista, però; ok? :-)

Nuovo sito UGIdotNET, siamo in beta

Come ho mostrato ieri in occasione dei Community Days di Roma, abbiamo pubblicato la versione beta del nuovo sito UGIdotNET; in questo contesto, “versione beta” significa: “ad eccezione dei forum e della gestione della modifica del proprio profilo utente, tutte le funzionalità del sito dovrebbero essere ‘production ready’: in caso contrario, segnalatemelo”. Alcune note:

  • Il database utenti è condiviso tra i siti, quindi ogni account valido per “www” lo è anche per “beta”, e viceversa. Es: potete registrarvi su “beta” e effettuare login da “www”
  • Per tutta una serie di (credo buoni) motivi, il nuovo sito utilizza delle rotte differenti ma tutti gli url “legacy” dovrebbero essere supportati
  • Layout e grafica sono assolutamente non definitivi ed, anzi, molto probabilmente soggetti a profonda rivisitazione
  • Le ottimizzazioni “serie” non sono ancora state effettuate (early optimization is evil), quindi le performance non sono ancora quelle desiderate/desiderabili
  • L’archivio di workshop ed eventi non è ancora online, ma dovrebbe arrivare presto (ricordando che: Assert.AreEqual(“presto”, “compatibilmente con il fatto che sviluppo il sito nel tempo libero”;)
  • La funzionalità di ricerca è assolutamente primitiva: ho optato per una implementazione “quick & dirty” in attesa di realizzare quella “vera”
  • Il sito *non* è feature complete (es: i forum danno errore 404): in questo senso, il lavoro da fare è ancora moltissimo e potrebbe anche essere un buon momento per darci dei suggerimenti. In questo caso, optate per la “forma” della user story (es: In qualità di utente, desidero poter reimpostare la password dimenticata al fine di poter effettuare login)

My 2 cents: usate il sito beta in sostituzione di quello “stabile” e comunicatemi eventuali bug, possibilmente dotati di “repro”.

Technorati Tags: ,

Annunciaziò Annunciaziò! (cit.)

Citando Mauro, sono felice ed orgoglioso di annunciare che: Hibernating Rhinos and Managed Designs announce enterprise partnership related to RavenDB. Aziendalmente è un passo molto importante e devo innanzitutto ringraziare Mauro per aver avuto l’idea e, con il “solito” formidabile supporto dei bottegai tutti, per averla resa possibile: Ayende è persona giustamente esigente e riuscire ad ottenere questo accreditamento da parte sua è un risultato in sé.

Cosa significa questo accordo? Significa che Managed Designs è il partner d’elezione per coloro che, nelle zone coperte dall’accordo (sostanzialmente Europa centrale, occidentale ed orientale), desiderassero consulenza (in tutte le sue forme: architetturale, affiancamento, formazione, planning, …) dedicata al DBMS RavenDB: un accordo di questo tipo ci metterà alla prova non soltanto tecnicamente ma anche logisticamente: a tutt’oggi, ad eccezione di qualche occasione particolare, siamo stati sostanzialmente una azienda focalizzata sul mercato italiano, mentre questo accordo ci “obbliga” –con piacere- ad acquisire un respiro internazionale che ci permetta di condividere l’esperienza e la soddisfazione acquisite utilizzando questo notevole (“Oste, è buono il vino?”) DBMS ed evitare che la sua adozione sia dovuta alla volontà di rendere il proprio progetto à la page bensì alla consapevolezza che, quando così fosse, tale strumento è quello che meglio soddisfa i requisiti.

E’ l’inizio, insomma, di una nuova avventura quindi… “IO SPERIAMO CHE ME LA CAVO”.

L’importanza di chiamarsi… Framework

Ok, spero innanzitutto che Oscar Wilde non si stia troppo lamentando per la citazione a sproposito presente nel titolo :-) Ciò premesso, questo tip appena pubblicato su UGIdotNET mi ha riportato alla mente un episodio che descrissi in questo post: più che sull’argomento in sè ho riflettuto sul fatto che nell’anno 2000, quando mi trovai a dover risolvere il problema citato nel post, spesi svariate giornate per giungere alla soluzione ivi descritta perchè per scoprire l’esistenza di quella modalità di scrittura “non logged” di SQL Server dovetti spulciare la documentazione di SQL Server ed altrettanta ne spulciai per capire come, utilizzando le estensioni custom del suo driver ODBC, trarre vantaggio da quella tecnica.

Per certi versi si trattò di un interessante esercizio speculativo che mi lasciò in dote qualche conoscenza in più in merito ad alcuni internals di SQL Server, ma con il senno di poi penso che i servizi offerti dalla classe SqlBulkCopy sono un ottimo esempio di cosa dovrebbe fare un framework, ossia offrire delle primitive ad un (ragionevole) livello di astrazione che permetta allo sviluppatore di dedicare il proprio tempo alla soluzione della parte “pregiata” (si ok, si scrive “pregiata” ma si legge “domain”…) di un problema potendo far affidamento su un substrato tecnologico che sia in grado di sfruttare la tecnologia/piattaforma sottostante.

In questo senso, nonostante l’ipertrofia che ormai lo caratterizza, penso a quanto valore ci sia nel .NET Framework che ormai diamo per scontato e quanto avrei preferito, mentre nel 2000 dovevo risolvere da solo il problema in oggetto, aver a disposizione SqlBulkCopy potendo dedicare meno tempo al lavoro e magari usare il tempo risparmiato per un Mojito in buona compagnia… :-)

Upload di file in applicazioni ASP.NET MVC: un paio di approfondimenti

Mi riaggancio a questo mio tip pubblicato su UGIdotNET per fare un paio di approfondimenti:

  • Se usate l’attributo accept dell’elemento input e il browser protesta anche se il file che avete referenziato per il download è corretto, probabilmente siete incappati nello stesso bug di jQuery Validate che anche io ho potuto “gustare”: aggiornate la suddetta libreria all’ultima versione (va benissimo quella disponibile su NuGet) e il problema sarà risolto
  • Se il vostro server è a 64 bit e l’application pool è configurato per usare questa word length, ove voleste (come nel mio caso) effettuare l’upload di un file Excel ed effettuarne il parsing con ADO.NET, ricordate che per default il Jet Engine in versione x64 non è installato (e per ottimi motivi, visto che praticamente non è supportato negli scenari server side): potete scaricarlo qui ma attenzione alle release note che trovate nella sezione “Overview” della pagina perchè vi starete addentrando nel classico scenario “it works on my machine”. N.B., non fatevi ingannare dal fatto che sulla vostra devstation, che ovviamente è a 64 bit, funziona tutto alla perfezione mentre fate sviluppo & test: Visual Studio è a 32 bit e così anche Cassini, quindi state “funzionando” a 32 bit e in questo caso il problema non sussiste.

BTW, in realtà dopo qualche utilizzo del codice mostrato nel tip mi sono proprio stufato di non avere un migliore supporto a questa tipologia di scenario e quindi ho realizzato un helper method analogo a quelli disponibili out of the box per i data type supportati nativamente. Diciamo che ho un’idea per il prossimo tip :-)

Guisa1, ovvero “a volte ritornano”

Dopo una lunga (e fastidiosa, almeno per il sottoscritto) assenza, torna un evento organizzato dallo “user group dedicato ai perché oltre che al come”; in una parola: GUISA. Il format è (crediamo) davvero innovativo: né sessioni “full frontal” né “open” né, soprattutto, tecnologia fine a se stessa bensì solo casi reali. Ogni sessione, infatti, presenta per 60 minuti un progetto “real world” del quale verranno mostrate le scelte architetturali e tecnologiche, motivando le suddette scelte; e dopo i 60 minuti… 30 minuti di “open” nel quale metterle in discussione. Insieme. Ma sempre partendo dai requisiti, perché vogliamo parlare e discutere di scelte fatte con la testa e non con la “pancia”.

Questo è il primo giro e per “far bootstrap” le sessioni le abbiamo messe noi, dal prox giro ci sarà la CFP perché parlar di progetti ha tanto più senso quanto più eterogenei essi sono nella loro genesi. Ergo, preparatevi. :-)

Ah, si: c’è anche una (piccola" ?) eccezione (perché ogni buona regola generale ha delle altrettanto buone eccezioni): un “acceso” thread della scorsa settimana avvenuto su Twitter ci ha infatti convinto ad “infilare” in agenda una sessione con formato “open” dedicata ad Ubiquitous Language. Non l’avete vista fino ad ieri? Non mi stupisce: l’ho appena pubblicata. :-)

L’iscrizione è gratuita; per i dettagli logistici vi rimando al post del buon Mauro. L’hashtag dell’evento è #guisa1

«aprile»
domlunmarmergiovensab
303112345
6789101112
13141516171819
20212223242526
27282930123
45678910