“This eagerness to change”

E insomma, un anno fa pubblicavo il mio ultimo post chiedendomi, tronfio come un vero bauscia sa/deve essere, in quale modo avremmo potuto migliorare l’anno successivo. E allora, quest’anno, io e Daniele siamo partiti da un principio ispiratore: “diversity”. Diversity perchè:

  • se il fenomeno startup ha dimostrato di poter essere un game changer in tema sia di scelte tecnologiche sia di approccio allo sviluppo del software (“va veloce e spacca tutto”, ci disse Marco)
  • se la track “business” inserita in agenda un anno addietro ha riscosso un riscontro che ci ha fatto capire che potevamo toglierla dalla “riserva protetta” e renderla un first class citizen anche se i temi sono (apparentemente) slegati dallo sviluppo software in senso stretto
  • se la partecipazione alla CFP di “signorine & giovanotti” cresce ogni anno ed è un toccasana in un settore storicamente prettamente maschile, con alcuni esemplari (io tra questi) per datare i quali qualcuno potrebbe proporre il Carbonio14
  • se anche chi ci ospita (e s[u|o]pporta) da anni mette la barra a dritta e avanti tutta verso Linux e OS X

Beh, allora il cambiamento è l’unica strategia evolutiva sensata (e qui la mia verve agilista va in sollucchero). E quindi:

  • Volevamo le startup? Ecco Xmetrics, che ci viene a raccontare come anche in Italia un tecnico possa avere una idea, capire che la sua preparazione tecnica non è condizione sufficiente per “farcela”, imparare la lezione ed a questo punto trovare un investitore (anche) grazie al quale trasformare la propria idea in realtà. Ah si, ed avere come testimonial un campione olimpico, scusate se è poco. Io per avere una startup finanziata con oltre 1M $ che abbia per testimonial Martin Gore farei carte false, per dire.
  • L’anno scorso abbiamo inserito i “pezzi grossi” in agenda? E allora quest’anno abbiamo pescato dall’altro lato della pozza e portato in Italia un Senior Director di Microsoft Corporation. Ok, sostanzialmente ha accettato poichè interessato a mangiare decentemente per una settimana più che per il prestigio del nostro evento, ma questo è un trascurabile dettaglio di implementazione, oltretutto dotato di access modifier “private” Sorriso
  • Vogliamo scongiurare il ricorso al Carbonio 14? Ed allora anche le tematiche devono guardare avanti e prendere atto di quanto potente sia ormai il “lato consumer della Forza” ed il suo impatto anche sugli scenari applicativi “tradizionali” e quindi in agenda abbiamo: IoT, wearable, Kinect, Docker, Unity3D, Enterprise UX… Oh, io la sessione su Microsoft Band non me la perdo Sorriso

Questo (ed altro) riuscendo però, a nostro avviso, a non snaturarci: .NET, C++, cloud computing, NoSQL, Xamarin, etc sono lì come sempre in fondo, ad esempio, di “roba” come Mono ne parliamo da prima che fosse “cool” farlo.

Cerchiamo, semplicemente, di rendere il take away dei Community Days utile sia nell’immediato sia in prospettiva. Ci abbiamo provato anche quest’anno, venite e diteci se ci siamo riusciti.

Ci vediamo ai Community Days 2015?

Tag di Technorati: ,

“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 :-)

«maggio»
domlunmarmergiovensab
24252627282930
1234567
891011121314
15161718192021
22232425262728
2930311234