Archive for February, 2009
25 marzo: Osservatorio Enterprise 2.0
Feb 27th
Al via il 25 marzo il secondo convegno dell”Osservatorio Enterprise 2.0. Saranno presentati i risultati della Ricerca, che ha coinvolto attraverso survey ed interviste oltre 300 tra CIO, Responsabili Risorse Umane e Responsabili Marketing.
La Ricerca di quest’anno cercherà di fornire una visione complessiva approfondendo, in particolare, i trend emersi rispetto a quattro filoni di iniziative: Social Network & Community, Unified Communication & Collaboration, Content & Document Management e Adaptive Enterprise Architecture.
Ci vediamo la!
http://feeds2.feedburner.com/romeopruno
Feb 26th
Pls update your favorite feed reader with this new url
thks!
Gabriele Del Giovine approda in it Consult
Feb 25th
Sono davvero incasinato in questo periodo, vorrei scrivere molti post ma non ne ho fisicamente il tempo … chi mi conosce bene può immaginare quanto io abbia da fare per non trovare 5 minuti per scrivere. Tutto questo non mi può comunque impedire di condividere assieme a voi una bellissima notizia come quella del titolo di questo post. Gabriele Del Giovine sarà a breve in azienda per dare man forte a tutte le attività inrenti Microsoft Office SharePoint e Knowledge Management in genere.
Reputo Gabriele una persona fantastica, vive con passione la tecnologia ed il suo know-how è basato su di una esperienza in prima linea su tutto ciò che ruota in torno ai sistemi server rilasciati da Microsoft nell’arco dell’ultimo decennio. Oltre le sue competenze tecniche, Gabriele ricopre un ruolo molto importante nella vita lavorativa di molti professionisti del settore, che come me, valuta ed estende ogni giorno architetture complesse basate su SharePoint. Grazie alle sue competenze ed alla sua disponibilità, sono riuscito, come migliaia in Italia e forse anche all’Estero, a muovere i primi passi dentro alle soluzioni software proposte da Microsoft per il Document Management … ed aggiungerei con ottimi risultati!
Benvenuto Gabry!
content source & search scope
Feb 17th
Per lavorare con gli Shared Service Provider occorre molta buona pratica, non solo per quanto riguarda la gestione delle risorse ma occorre anche considerare il tempo che il server impiega ad effettuare determinate operazioni. Una delle operazioni più comuni, circa la manutenzione del servizio di ricerca, sta proprio nel delineare una corretta politica di *alimentazione* di uno Shared Service Provider (SSP) attraverso l’aggiunta/manutenzione di Content Source e di eventuali Search Scope.
Nell’esempio sotto vi giro del codice che mostra come aggiungere un content source di tipo *web*, quindi di provvedere anche alla registrazione di un suo personale Search Scope.
1: public static void AddScopeToWebContentSource(Uri ssp_url, string cs_name, string scope_name)
2: {
3:
4: SearchContext ctx = null;
5:
6: using (SPSite site = new SPSite(ssp_url.ToString)) {
7:
8: ctx = SearchContext.GetContext(site);
9: }
10:
11: // Retrieve current SSP and its ContentSources
12: Content sspContent = new Content(ctx);
13: ContentSourceCollection sspCollection = sspContent.ContentSources;
14:
15: // If the new ContentSource already exists, no action
16: if ((!sspCollection.Exists(cs_name))) {
17:
18: WebContentSource webCS = (WebContentSource)sspCollection.Create(typeof(WebContentSource), cs_name);
19: }
20:
21:
22: Schema sspSchema = new Schema(ctx);
23: ManagedPropertyCollection props = sspSchema.AllManagedProperties;
24: Scopes scopes = new Scopes(ctx);
25: ScopeCollection sspScopes = scopes.AllScopes;
26: bool exist = false;
27:
28:
29: // Cicle through Scope collection to check if the new scope already exist
30: foreach (Scope sc in sspScopes) {
31:
32: if ((sc.Name == scope_name)) exist = true;
33: }
34:
35:
36: // If the new Scope already exist, no action
37: if (exist == false) {
38:
39: Scope newScope = sspScopes.Create(scope_name, "put a description here!!", null, true, null, ScopeCompilationType.AlwaysCompile);
40:
41: // Automatically this code add as "Rule" its Content Source
42: newScope.Rules.CreatePropertyQueryRule(ScopeRuleFilterBehavior.Include, props("ContentSource"), cs_name);
43: }
44:
45: }
Ancora di seguito, del codice che mostra come alimentare il Content Source con una lista di indirizzi url. Il metodo permette anche di specificare se si intende forzare il full crawl del Content Source non appena abbiamo aggiunto i nuovi start address.
1: public static void AddContentsToWebContentSource(Uri ssp_url, string cs_name, string[] startAddresses, bool startFullCrawl, int MaxSiteEnumerationDepth, int MaxPageEnumerationDepth)
2: {
3:
4: if ((MaxPageEnumerationDepth == 0)) MaxPageEnumerationDepth = 1;
5: if ((MaxSiteEnumerationDepth == 0)) MaxSiteEnumerationDepth = 1;
6:
7: SearchContext ctx = null;
8:
9: using (SPSite site = new SPSite(ssp_url.ToString)) {
10:
11: ctx = SearchContext.GetContext(site);
12: }
13:
14:
15: Content sspContent = new Content(ctx);
16: ContentSourceCollection sspCollection = sspContent.ContentSources;
17:
18: if ((sspCollection.Exists(cs_name))) {
19:
20: WebContentSource csWeb = sspCollection.Item(cs_name);
21:
22: for (int i = 0; i <= startAddresses.Count - 1; i++) {
23:
24: if ((!csWeb.StartAddresses.Exists(new Uri(startAddresses(i).ToString)))) {
25:
26: csWeb.StartAddresses.Add(new Uri(startAddresses(i).ToString));
27: csWeb.MaxSiteEnumerationDepth = MaxSiteEnumerationDepth;
28: csWeb.MaxPageEnumerationDepth = MaxPageEnumerationDepth;
29: csWeb.Update();
30:
31: if ((startFullCrawl)) csWeb.StartFullCrawl();
32: }
33: }
34: }
35: }
Magari lo potete rendere ancora più generico, facendo scegliere anche il tipo di Content Source che si intende registrare (Site, Web, Exchange Folder, File System, …).
Custom Security Trimmer & SharePoint
Feb 10th
Questo è uno degli argomenti più *insider* dell’universomondo di SharePoint, non solo per la sua complessità ma sopratutto per la scelta implementativa che esso comporta.
L’utilizzo di CST (Custom Security Trimmer) è la soluzione proposta da Microsoft per il problema del *trimming* all’interno di operazioni di ricerca e presentazione dei risultati offerte da MOSS. In particolare, ogni volta che un utente esegue una qualsiasi ricerca all’interno del portale, il suo profilo viene utilizzato in fase di *query time* per effettuare il check su quali dei contenuti indicizzati, quindi interessati dalla ricerca che si sta effettuando, l’utente abbia accesso per poi presentarli in fase di visualizzazione.
Può capitare quindi che su di un monte di 100 documenti disponibili, l’utente corrente abbia dei permessi validi solo su di una piccola parte di questi (10?), quindi visualizzerà come risultati soltanto quest’ultimi senza avere coscenza dell’esistenza dei restanti 90. Più che sacrosanto direi!!
L’utilizzo del trimming è un’aspetto fondamentale dell’architettura di collaboration proposta da Microsoft e la maggior parte delle volte viene presentato e percepito giustamente come un grande vantaggio nell’utilizzo del portale anche come unico punto di accesso alle informazioni. Ovviamente rimane una scelta vincente l’utilizzo di MOSS in questi scenari, anzi non si potrebbe immaginare una soluzione migliore, ma ahimè occorre considerare anche architetture in qui questa funzionalità deve essere momentaneamente messa da parte per far posto a soluzioni custom, frutto cioè di una politica di profilazione *differente* da ciò che MOSS offre in modalità Out Of The Box.
Pensate a scenari in qui le vostre applicazioni utilizzano MOSS come base documentale, molto spesso eseguendo operazioni di gestione documentale magari utilizzando un service account, il risultato è abbastanza banale: l’utente anche se in qualche modo legato alla finalità del documento non viene riconosciuto come propeietario a meno che in fase di manipolazione dei dati la vostra applicazione non si preoccupi anche di attribuire specifici permessi.
Scendendo ancora nel particolare, può capitare che processi di archiviazione documentale, ad esempio, eseguano operazione di migrazione massiva di contenuti da un sito all’altro senza preoccuparsi di mantenere la politica di permessi del sito di origine: anche qui ahimè vi ritrovereste senza alcun risultato durante la vostra ricerca, pur avendo in qualche modo partecipato alla pratica di formazione di un determinato documento ora archiviato.
Quindi bene in questo caso adottare una buona politica di CST, magari accompagnata da un corretto urilizzo dell’impersonificazione del service account in fase di ricerca ma in alcuni casi anche questo non basta.
In questi ultimi periodi capita frequentemente, visto anche il *successo* di MOSS come Application Platform, di utilizzare questo prodotto come motore documentale per 100, 1000 attività trasversali al document management, quindi capita che i permessi settati sui singoli documenti o elenchi rientrino in una più grande e variegata policy interna all’applicazione che viene ospitata in MOSS.
A prescindere da quale livello di granularità si intenda adottare su siti, liste e/o documenti, non si può prescindere dal considerare anche che l’applicazione host deve in qualche modo poter vivere di vita propria, nello specifico, specializzare e/o estendere le policy native di MOSS anche all’interno di essa, proporre profili personalizzati di utenza che debbano inevitabilmente uscire fuori dal contesto documentale.
Un piccolo esempio: la gestione della qualità.
Una soluzione integrata in MOSS per la gestione della qualità, ha si una profilazione per il gestore documentale ma deve preoccuparsi di mantenere anche altre 10/15 profilazioni a livello applicativo e spesso se questa soluzione è agganciata ad un BPM, il profilo deve essere il più possibile vicino a quello rappresentato dell’organizzazione (ufficio, divisione, settore) di appartenenza senza tralasiare anche le spcifiche competenze di determinati ruoli.
Non è sempre facile mantenere o estendere profilazioni interne a MOSS, in quanto alcuni ruoli applicativi non possono, per natura, essere riportati o re-interpretati su scenari applicativi del tutto esterni a MOSS.
In questi scenari il collo di bottiglia potrebbe essere l’utilizzo di un CST *as Microsoft suggest*, proprio quando dobbiamo uscire fuori dalla profilazione offerta da MOSS, quindi effettuare un match tra policy interne ed esterne al motore di gestione documentale.
Per rendere più esplicativo il problema vi propongo un esempio di CST *as-is*, il codice che riporto può essere consultato qui.
Il metodo core è la funzione di check che deve restituire una array di GUID che andranno a formare la lista di informazioni restituite dalla ricerca. Possiamo intervenire appunto su questa lista, scegliendo quali di questi risultati concorrerrano alla formazione dei risultati di ricerca:
1: public BitArray CheckAccess(IList<String> documentcrawlURLs, IDictionary<String, Object> sessionProperties)
2: {
3: BitArray retArray = new BitArray(crawlURLs.Count);
4:
5: for (int x = 0; x < crawlURLs.Count; x++)
6: {
7: /*
8: To fully implement the security trimmer,
9: add code to perform the security check
10: and determine if strUser can access crawlURLs[x].
11: If strUser can access crawlURL[x], then:
12: */
13: retArray[x] = true;
14: //If not:
15: retArray[x] = false;
16: }
17: return retArray;
18: }
Implementando la logica di comportamento del metodo non dovremmo riscontrare alcun problema in condizioni *normali* ma tutto cambia se ci troviamo a dover effettuare un match con profilazione applicative, quindi proprie della nostra applicazione. In questo caso i problemi possono dimostrarsi numerosi e particolarmente *fastidiosi* sopratutto in termini di efficienza di tempo impiegato e di risorse di calcolo.
Problema 1: Impersonificazione
L’impersonificazione del service account che molto spesso deve avere il *monopolio* del patrimonio documentale è spesso requisito fondamentale in quanto il trimming mantiene le informazioni dell’utente che sta eseguendo l’operazione di ricerca, quindi mantiene le sue credenziali. E’ necessario impersonificare un utente di livello più elevato per fare in modo che il monte di documenti ritornato sia il più amio possibile.
Problema 2: Parsing del documentcrawlURLs
Un problema non da poco è l’identificazione delle informazioni del documnto all’interno della lista di input della funzione CheckAccess.
La funzione presenta ogni item alla logica di profilazione nel seguente modo:
1: sts3://moss/siteurl=/siteid={86051521-13de-4dac-80d1-231406b51b57}
2: /weburl=/webid={e67908fc-024b-4689-b854-4837d0d32abb}
3: /listid={30dc794a-c5b6-4c86-97f6-2ed65133149d}/viewid={efc86211-
4: 96e2-4443-9dfc-5d8e42daf285}
Quella rappresentata è la classica quaterna formata dall’url della site colelction, url del web site, guid della lista ed il guid della view. Da qui dobbiamo in qualche modo implementare del codice per l’identificazione del documento o della lista ed effettuare un check sulle permission di questi ultimi, in più eseguire un match con le policy della nostra applicazione, quindi decidere se aggiungere o meno l’item all’array che ritornerà la funzione CheckAccess.
Problema 3: Manutenzione della soluzione
La DLL che implementeremo oltre che essere registrata nella GAC (ovvio) necessiterà anche di alcune operazioni di amministrazione in MOSS ed in più lo stesso CST dovrà esseere aggiornato mano a mano che la crescita delle SiteCollection interessate dall’applicazione crescerà di numero o di dimensione.
In generale più è complessa la logica delle funzioni di CheckAccess che implementiamo, più perde di efficienza l’intera architettura di ricerca, in quanto le operazioni di check vengono chiamate durante l’attesa della visualizzazione dei dati da parte dell’utente, a *query time* per l’appunto.
Test su quantità di documenti (>10000) già richiedono un incremento dell’attesa di + di 0,05 secondi. Consideriamo anche che il problema n.1 (Impersonificazione) ovviamente incide molto sulle performance in quanto utilizzando un account con elevati privilegi la quantità di documenti posta a CST è molto spesso la totalità dei documenti a disposizione della nostra organizzazione.
Per chi di voi necessità di effettuare profilazioni complesse e che necessitano uan esternazione applicativa da MOSS una strada efficiente, mantenibile ed altamente customizzabile risiede il più delle volte in questa semplice best practice:
- Utilizzo del query object model per effettuare la ricerca;
- Passaggio delle informazioni inerenti al documento (questa volta no GUID) ad una Stored Procedure per il parsing e profilazione;
- Presentazione dei risultati
Questo utilizzo può abbassare di molto i tempi di esecuzione richiesti da MOSS anche se confrontato con quelli attesi in normali condizioni di trimming.
iRobot
Feb 8th
Qualche mese fa Fabio mi parlò di questo iRobot Roomba, aspirapolvere che ha regalato per natale 2007 ai genitori. La recensione di Fabio non lascia diverse interpretazioni, sicuramente si tratta di un oggetto realmente intelligente e facile da gestire .. oltretutto un’aspirapolvere completamente autonomo e che non richiede particolari attenzioni è un elettrodomestico desiderato da tutti, non credete?
Interessante è comunque pensare a cosa ci sia dietro questa simpatica invenzione e proprio ieri a cena ne ho avuto occasione per parlare assieme ad alcuni amici …naturalmente *informatici*. Il core di questo simpatico elettrodomestico sta nell’utilizzo di una particolare implementazione del modello alla base dell’algoritmo chiamato “Crop Circles” ed utilizzato frequentemente all’interno di missioni militari anti-mine.
La nuova versione (iRobot 560) è in grado di memorizzare mappe parziali di qualsiasi percorso incompleto, quindi di riniziare precisamente dall’ultimo punto in cui si trovava prima dello spegnimento o del’autoricarica.
Veramente un buon prodotto … lo acquisterò, il mio amico Matteo ieri sera ha convinto anche PAPI :-)
Microsoft SharePoint Conference 2009
Feb 3rd
Come segnalato da Claudio, quest’anno l’edizione 2009 della Microsoft WW SharePoint Conference si svolge a Las Vegas dal 19 al 22 ottobre. Numerose anteprime attendono i partecipanti, sopratutto dal punto di vista Office 14. Se siete del mestiere … non potete mancare!
Ambiente di sviluppo *scalabile*
Feb 3rd
Quando si parla di sviluppo in generale si tende a circoscrivere l’ambiente di produzione alla propria macchina o al massimo ad una delle tante macchine virtuali che abbiamo configurato. Ancor di più se parliamo di Microsoft Office SharePoint Server che come ben sappiamo soffre di limitazioni abbastanza *strette* in termini di portabilità delle soluzioni che sviluppiamo.
Pensate quindi alla necessità delle software house che sviluppano prodotti integrati in SharePoint e quindi i requisiti di scalabilità adottati per le operazioni di sviluppo, test e manutenzione del prodotto.
Con l’avvento di Windows Server 2008 e la tecnologia Hyper-V, virtualizzare è diventato oltre che pura *necessità* un modo efficace ed efficiente per predisporre ambienti, in questo caso di sviluppo, in grado di assicurare alta scalabilità di prestazioni con uno sforzo, il più delle volte, uguale a zero.
Ancor più difficile è mantenere un ambiente di sviluppo che sia in grado di assicurare le funzionalità del prodotto sia su sistemi operativi x86 che x64.
Per fare un esempio reale, da tempo oramai lo sviluppo e mantenimento di josh Protocol!, il prodotto che seguo principalmente, richiede un ambiente di certificazione Windows Server 2008, di conseguenza è necessario sostenere lo sviluppo, deploy e test del prodotto su piattaforma x64.
La soluzione che si è scelta tempo fà è risultata molto efficiente, sia in termini di prestazioni che di mantenibilità di uno degli ambienti di sviluppo che poggia principalmente su Windows Server 2008 x64 e MOSS 2007.
Questa figura mostra lo scenario tipico sul quale viene sviluppato josh Protocol! o qualsiasi altro prodotto di it Consult. Una architettura di questo genere ha molti vantaggi ma prima voglio spiegarvi la configurazione delle macchine presenti.
Hyper-V FARM 1 – è la vera e propria FARM di MOSS nella quale viene assemblato uno scenario NLB con uno o più server per l’indicizzazione o a loro posto più ruoli di query service ai singoli FE. Il cluester mantiene i DBs di configurazione ed eventualmente anche quelli dell’applicazione. La FARM mantiene degli ALIAS esterni che possono essere in seguito utilizzati per effettuare test interni o opoerazioni di manutenzione.
Hyper-V FARM 2 – è l’ambiente di sviluppo su macchine tipicamente Windows Server 2008 ma ne possono essere aggiunte anche altre di altro genere. Su ogni server vengono installate soltanto le componenti web di MOSS cosi da poter condividere una alta quantità di informazioni con la FARM senza sovraccaricare le macchine di sviluppo che a loro volta possono testare versioni x86/x64 del prodotto.
L’utilizzo di Hyper-V è essenziale per le operazioni di manutenzione e ripristino di diversi stati delle macchine cosi da agevolare anche l’estensione della stessa FARM o delle singole macchine di sviluppo.
L’occupazione delle risorse fisiche del server che ospita Hyper-V possono essere dinamicamente assegnate a seconda delle fasi di sviluppo del prodotto o ad esempio concentrate su singoli componenti (ad esempio Index Server(s), Cluster) per aumentare le capacità di calcolo.

