venerdì 5 giugno 2009
Chi lavora con il suddetto nel titolo sa bene che non non è prevista, di base, la sincronizzazione dello schema del database con il modello; nei giorni passati ho trovato un tool a linea di comando chiamato LINQ to SQL Database Synchronizer comprensivo di sorgenti di cui ho scritto un brevissimo “pezzo” su Programmazione.it.
Il tool può essere interessante.
martedì 2 dicembre 2008
Leggete un mio
articolo, di 3 puntate, su
Programmazione.It relativo a riflessioni e suggerimenti sul bilanciamento tra l’alta coesione e il disaccoppiamento delle classi in fase di design. E siccome mi interessa, fatemi sapere le vostre riflessioni sull’argomento.
mercoledì 19 novembre 2008
| Nel numero 133 di Dicembre di IoProgrammo, attualmente in edicola, c’è un mio articolo introduttivo riguardo la piattaforma di sviluppo Microsoft Robotics Studio. Buona lettura. |
lunedì 20 ottobre 2008
Tempo fa scrissi un articolo dal titolo “Simulare un operatore di call center con Windows Workflow Foundation”.
Da un paio di settimane, a puntate (ben 7), l’articolo è visibile su Programmazione.IT
Buona lettura.
giovedì 25 settembre 2008
Ho scoperto l’esistenza di Wikipedia in napoletano, semplicemente fantastica. Riporto la “paggena prencepale”:
http://nap.wikipedia.org
domenica 29 giugno 2008
Mi ero preparato un po’ di esempi di codice in ausilio ad una giornata di corso sui design patterns, poi però ho pensato che forse, per un fine didattico, la cosa migliore che potessi fare era di “raccontare” ai partecipanti una serie di scenari in cui poter applicare, per ciascuno, uno specifico pattern e lasciare a loro il compito di trovare un modo per risolvere il problema; dopodichè gli avrei presentato il pattern e illustrato il mio esempio di implementazione.
Mi ha meravigliato che, per un buon 70% ci sono sempre andati vicino, segno che i patterns sono soluzioni comunque vicine alla logica umana piuttosto che a quella di un guru dell’IT e, probabilmente, segno che le attività dei labs svolte negli incontri passati sono state utili per far passare le loro “menti” da un approccio procedurale ad uno object oriented.
Bravi…
Technorati Tags:
Corsi,
OOP,
Patterns
domenica 22 giugno 2008
Questo è un appello rivolto a qualsiasi categoria di azienda italiana che fa uso di tecnologia software e si avvale della consulenza di aziende IT per svilupparlo.
Cari Clienti, vi prego, fate capire in modo chiaro quali sono le vostre necessità e, se pensate di sapere esattamente cosa volete, se decidete quindi di scrivere da voi un documento dei requisiti, fatelo pure ma che sia solo un aiuto ulteriore per migliorare la comunicazione fra voi e i vostri consulenti IT; non fatelo solo perchè non avete voglia e tempo di “parlare”, è un grande errore perchè il risultato potrebbe non essere ciò che immaginavate.
Magari accade di rado, ma se i vostri consulenti vi forniscono dei suggerimenti sull’approccio al ciclo di sviluppo del software diversi da quelli che avete sempre utilizzato, fate il favore, rimettevi in gioco, datevi una alternativa, in fondo state pagando qualcuno per aiutarvi.
Ricordatevi che il mondo dell’IT è in continua evoluzione e qualcuno nel mondo cerca di trovare nuove pratiche che aiutino a comprendervi e sviluppare al meglio il sistema di cui avete bisogno, quindi non è detto che quello che avete imparato dieci anni fa sia la perfezione, provate il CAMBIAMENTO!
Questo appello non è a titolo personale, bensì frutto di alcune chiacchierate con persone che partecipano all’erogazione di miei corsi.
Ed è solo l’inizio…
sabato 12 gennaio 2008
Sono amici di un caro vecchio amico, si erano appena sposati ed erano sull'aereo caduto il 4 gennaio scorso in Venezuela.
Il titolo del post corrisponde ad un sito: stefanoefabiola.org, costruito per dare e soprattutto ricevere possibili notizie in merito alla scomparsa dell'aereo, dato che non si trovano rottami. Forse si è inabissato nel punto in cui dovrebbe esser caduto, circa 1200 metri di profondità, o forse è caduto su un'isola. Non lo sappiamo.
State ascoltando o vedendo nei TG vari le novità su questa tragedia? No, ed è per questo che serve tener viva la voce, altrimenti c'è il rischio che vengano abbandonate le ricerche per sempre.
Chissà se qualche amico che legge questo blog, magari dagli USA (visto che ricevo visite anche da là), può in qualche modo parlare con quelli di TerraServer per dare una mano agli amici e ai familiari che cercano queste persone a metter su qualcosa sulla falsa riga di ciò che è stato fatto per Jim Gray un anno fa?
Leggete il sito, grazie a tutti.
lunedì 15 ottobre 2007
Bello questo blog, parole semplici ma piene di esperienza. E' il blog di una nonna, e non è nè una battuta nè un insulto, chi lo riempie ogni giorno è una signora di ottantasei anni, della Toscana, una insegnante in pensione, che accudisce il marito malato e si sente sola, o meglio forse si sentiva sola, poi due anni fa ha iniziato a scrivere e, qualche giorno fa, è stata intervistata da Repubblica.
Andate a vedere quanti commenti, peccato che non ha un RSS attivo...forse non sa cos'è. Però è forte lo stesso. Leggetelo.
L'eredità di Nedda
Abbiamo la necessità di implementare un client WCF che sia in grado di effettuare il download automatico dei metadati del servizio remoto e configurare un proxy che sia in grado di stabilire una comunicazione?
Utilizziamo le classi MetadataExchangeClient, MetadataSet, WsdlImporter e ServiceEndpointCollection
creiamo un oggetto MetadataExchangeClient nel quale definiamo la URI del servizio remoto e specifichiamo di voler richiedere il documento WSDL di descrizione del servizio
MetadataExchangeClient metadataExchange = new MetadataExchangeClient
(new Uri("http://localhost:8000/ServizioRemoto/?wsdl"),
MetadataExchangeClientMode.HttpGet);
poi creiamo un oggetto MetadataSet in cui scarichiamo i metadati utilizzando il metodo GetMetadata() della classe MetadataExchangeClient
MetadataSet metadataSet = metadataExchange.GetMetadata();
creiamo un oggetto WsdlImporter dal MetadataSet che contiene il documento WSDL comprensivo degli endpoints
WsdlImporter importer = new WsdlImporter(metadataSet);
e inseriamo gli endpoints nell'apposita collection ServiceEndpointCollection mediante il metodo ImportAllEndpoints() della classe WsdlImporter
ServiceEndpointCollection endpoints = importer.ImportAllEndpoints();
infine, all'interno di un ciclo For..Each configuriamo una variabile proxy per ogni endpoint trovato
foreach (ServiceEndpoint ep in endpoints)
{
IInterfacciaServizio proxy = new ChannelFactory<IInterfacciaServizio>(ep.Binding, ep.Address).CreateChannel();
((IChannel) proxy).Open();
// codice di elaborazione del servizio
((IChannel) proxy).Close();
}
da notare che ChannelFactory è in grado di generare il proxy basandosi in maniera identica a ciò che riflette il contratto del servizio remoto, quindi se un metodo è dichiarato sincrono l'oggetto proxy avrà la stessa identica implementazione del metodo.
Technorati Tag:
WCF ,
.NET3 ,
C#
giovedì 5 luglio 2007
Questo post nasce da una domanda posta da un mio PartnerClienteCollega.
Il titolo è provocatorio, non credo sia possibile metterli a confronto, credo invece più adeguato valutare le esigenze e decidere, conoscendone i vantaggi e i limiti, di adottare l'uno anzichè l'altro.
MOSS 2007 è un ambiente Web-based dotato di un backend scalabile in cui è possibile effettuare ricerche di informazioni, quindi ideale per condividere in azienda;
Groove 2007 è un rich client, installato su ogni pc, per piccoli team, quindi ideale per decentralizzare la collaborazione.
MOSS 2007 permette di sviluppare applicazioni con workflow mediante Windows Workflow Foundation;
Groove 2007 facilita la comunicazione diretta per la maggior parte mediante il peer-to-peer (si, esatto), permette di lavorare disconessi per poi riconnettersi in un secondo momento e sincronizzare il lavoro eseguito offline.
MOSS 2007 va utilizzato da aziende che devono fare attività di searching di dati condivisi, deploy di portali, sviluppo di business forms e processi di workflow;
Groove 2007 va utilizzato da team che hanno bisogno di condividere non un portale ma un banco di lavoro per frequenti scambi di informazioni.
Ora però, anche per rispondere al mio PartnerClienteCollega, vediamo alcuni limiti di Groove rispetto a MOSS.
La fonte dei dati seguenti è un post pubblicato sul blog del team TechNet di Groove: http://blogs.technet.com/groove/default.aspx
| Maximum individual file size (in a Files tool or otherwise): | 2Gb |
| Maximum total content size that can be serialized to others during invitation | 2Gb |
| Maximum total File size in a SharePoint Files Tool | 1Gb |
| Maximum total File and Folder count in a SharePoint Files Tool | 5,000 |
Meetings Tool limits text input to:
| Meeting title to 256 chars
|
| | Meeting location to 256 chars |
| | Action item names to 256 chars |
| | Agenda item names to 256 chars |
| | Agenda item duration to 24 hours |
Account Configuration limits text input to:
| Key field to 37 chars |
| | Account name to 256 chars |
| | Account name to 256 chars |
| | Password limits text input to 256 chars |
| | Calendar subject limits text input to 256 chars |
| In Forms we only allow 1 attachments field per Form | |
| Maximum Total File Size in a Folder Sharing workspace | 2Gb (can be overriden) |
| Maximum Total File and Folder count in a Folder Sharing Workspace | 5,000 (can be overriden) |
| Maximum Number of Members in a Workspace | 100 (can be overriden) |
lunedì 14 maggio 2007
Sono passati diverse settimane da quando ho scritto l'ultimo post del mio blog, finalmente ho trovato un attimo di tempo; durante la scrittura di quel post pensavo di mettermi a scrivere una activity che potesse far navigare la user interface di un software, fortunatamente qualcuno mi ha fermato dicendomi che era già stato scritto e in effetti, facendo una breve ricerca ho trovato una serie di link a codice simile a ciò che avevo in mente, quindi lungi da me clonare l'acqua calda.
Giro pagina. Per un mio cliente ho consigliato di implementare (e lo sto facendo), in un prodotto, la gestione della cache e ho scelto l'application block scritto in oggetto del post; in rete ho trovato diversi siti e blog che parlano di ciò, non credo che ai miei lettori possa interessare la "mia" introduzione o la "mia" spiegazione perciò mi limiterò a descrivere dettagli tecnici secondo la mia esperienza in proposito.
Nel già citato application block vi è, tra le altre, una classe denominata ExpirationTask che, una volta istanziata, rappresenta un singolo task per gestire ciò che, inserito in cache, è scaduto.
Se si vuole dare una occhiata all'interno della nostra cache e rimuovere tutti gli elementi scaduti è possibile invocare il metodo SweepExpiredItemsFromCache passandogli come parametro un HashTable di oggetti CacheItems da rimuovere.
Occorre però prima aver marcato come expired gli elementi nella HashTable, quindi MarkAsExpired(HashTable object).
martedì 27 febbraio 2007
Molto tempo fa scrissi un articolo sullo User Interface Application Block in cui parlai di grafi navigazionali, dare la possibilità ad un applicativo di "guidare" e mostrare la propria interfaccia utente mediante l'uso di un file xml dotato di un apposito schema in cui potevo scrivere il percorso delle transizione che le singole forms della mia applicazione potevano fare secondo ciò che l'utente sceglieva di volta in volta. Bello.
Mi rendo conto solo ora che ciò è possibile anche con WF.
Posso progettare e implementare una activity che funga da navigatore del mio grafo. Molto bello.
Mi occorrono fondamentalmente tre cose: il punto di partenza, il punto di arrivo e una "memoria storica" dei percorsi precedenti, una sorta di segnalibri; penso quindi, in maniera semplificata, ad una classe NavigationManager di tipo CompositeActivity e a due property TheFirstIs e TheNextIs - la raccolta di segnalibri, poi, non è altro che una collection di Activities. Bellissimo.
Ora penso al #3 di questo post.
venerdì 16 febbraio 2007
A chi nutre interesse per Mono segnalo l'apertura di una nuova community avente nome "Community Asp.NET | Mono", dedicata alla possibile congiunzione dei due ambienti.
A tal proposito chiedo ai miei lettori se possa essere di interesse qualche post su Mono & i suoi derivati.
lunedì 5 febbraio 2007
Non so se è il primo, forse è l'unico o forse no, ma qui potete leggere il blog dei clochard della stazione di Milano Centrale.
Sono voci molto interessanti di una piccolissima parte degli "invisibili" del mondo. Leggetele quando avete un po' di tempo...e quando vi sentite depressi e il mondo vi crolla addosso...starete meglio.
giovedì 1 febbraio 2007
Lavorando con la funzionalità di esportazione di webpart, e collegandomi al mio precedente post #9, potrebbe capitare il caso in cui un utente provi ad esportare una webpart che contiene una parte dei suoi dati contrassegnati come sensibili; quindi, per riassumere, significa che la webpart ha l'attributo
[Personalizable(PersonalizationScope.User, true)]
nella situazione suddetta possiamo mostrare all'utente un avviso che lo informa di annullare l'operazione perchè non consentita.
L'oggetto che gestisce ciò è il WebPartManager e la property è ExportSensitiveDataWarning.
<asp:WebPartManager ID="myWPM" runat="server" ExportSensitiveDataWarning="Attenzione! impossibile esportare dati sensibili" />
mercoledì 31 gennaio 2007
Può essere necessario, a volte, inibire ad un utente la possibilità di effettuare il drag'n'drop di una webpart da una zona ad un'altra.
Possiamo farlo mediante la classe WebPartZoneBase e, in particolare, utilizzando la property DragDropEnabled(True|False) che passa il valore alla omonima property della classe WebPartChrome.
Uno dei metodi canonici che il WebPart Framework mette a disposizione per disabilitare verbi è quello di utilizzare l'override sul metodo FilterWebPartVerbs e passargli la collection di verbi che si vuole abilitare/disabilitare unitamente alla webpart:
protected override WebPartVerbCollection FilterWebPartVerbs(WebPartVerbCollection verbs, WebPart webPart)
{
WebPartVerbCollection wpvc = base.FilterWebPartVerbs(verbs, webPart);
foreach (WebPartVerb verb in wpvc)
{
if (verb == this.Zone.EditVerb)
verb.Enabled = webPart.AllowEdit;
}
return wpvc;
}
ciò che probabilmente non riusciremo a fare, però, è nascondere il verbo "Edit" per una serie di motivi, primo fra tutti WebPartChrome.ShouldRenderVerb che sembra "ignorare" l' AllowEdit=False soltanto per il verbo "Edit".
Per suggerire un possibile workaround rimando al mio post #3 fermo restando il valido uso del codice suddetto per i restanti verbi.
martedì 30 gennaio 2007
Quando creiamo verbi custom potremmo avere la necessità di associare azioni particolari, come ad esempio la funzione di narrazione del testo per utenti disabili, che non prevede form di dialogo o da compilare ma soltanto una attivazione o disattivazione della suddetta funzionalità.
Ebbene, ciò significa che accanto al verbo, nel menù a tendina, dovrebbe comparire anche un simbolo di spunta o un checkbox da selezionare/deselezionare; come fare?
Utilizzando la property WebPartVerb.Checked (true|false) possiamo giungere al nostro obiettivo. Quando il suo valore è true accanto al nome del verbo apparirà una checkbox.
Da ricordare, però, che tale proprietà funziona solo con verbi custom.
Link al libro su Amazon
Scritto a quattro mani da un architetto e da un progettista di WF (Shukla & Schmidt), consiglio la lettura di questo libro a chi desidera acquisire i concetti che sono alla base di quello che considero essere un "framework nel framework".
L'obiettivo del libro non è quello di elencare e disquisire a 360° sui 350 e passa tipi presenti nei tre assemblies che costituiscono il Windows Workflow Foundation, infatti il libro non è un manuale o una reference guide, bensì si pone come spunto di riflessione sui concetti e principi che hanno spinto i due autori a dedicarsi alla progettazione di WF, e lo fa anche con una moltitudine di esempi di codice sparsi nel libro.
Il primo capitolo è dedicato alla descrizione di concetti, quasi astratti, del modello di programmazione di WF;
Nel secondo capitolo si inizia a parlare di activities, cosa sono nel mondo reale, come si implementano nel codice, come si creano workflows composti da activities e come si esegue una applicazione "pilotata" da workflows.
I capitoli 3 e 4 descrivono le features interne delle activities, come si aggiungono activities durante l'esecuzione di un programma, come si gestiscono le exceptions, cosa è la compensation, insomma il ciclo di vita di una activity.
Il capitolo 5 spiega come costruire applicazioni che fungono da hosting per il runtime di WF, mentre nel capitolo 6 si affronta in dettaglio come sia possibile gestire le transazioni in un ambiente come quello di WF.
Infine i rimanenti 2 capitoli danno una idea delle potenzialità di estensione del WF e dei suoi workflows.
A complemento del libro vi sono due appendici molto utili poichè elencano una serie di porzioni di codice relative ai diversi tipi di workflow e alle activity composite.
In conclusione, "Essential Windows Workflow Foundation" è un testo adatto a coloro che vogliono iniziare un percorso di studio su WF ma che hanno necessariamente basi consolidate di .NET e C# 2.0.