mercoledì 17 febbraio 2010

ARF e WCF

In un recente progetto che ho realizzato in WSS con l'ausilio di ARF, un mio collega ha dovuto integrare delle chiamate a servizi WCF, nella fattispecie per recuperare un profilo utente da un applicativo propietario.

Durante il test è incappato in questo errore:

ARF: System.ApplicationException: This operation returned because the timeout period expired. (Exception from HRESULT: 0x800705B4)
at System.Threading.ReaderWriterLock.AcquireWriterLockInternal(Int32 millisecondsTimeout)
at ARF.Web.Utility.SPFileWatcher.Timer_Elapsed(Object sender, ElapsedEventArgs e)

Dopo averci speso una giornata, seguendo alcune mie considerazioni, Alberto ha scoperto che la connessione WCF va chiusa esplicitamente altrimenti va in conflitto con la cache di ARF (ARFCache.cs). Frugando nel codice di ARF si è anche accorto che la cache, utilizzata per cachare i template xslt, ha un timeout impostato a 30 secondi, di default.

mercoledì 10 febbraio 2010

Cosa cambia nel rendering di SharePoint 2010

Vi segnalo un post del blog di Andrew Connell in cui si parla del nuovo rendering di SharePoint 2010, decisamente più pulito ma non XHTML 2.0 compliant. Il link è: SharePoint 2010 Changes in Rendering.

martedì 26 gennaio 2010

Best Master Page

Facendo mente locale all'esperienza passata e ad alcuni studi recenti, con relativa sperimentazione, sono giunto alla seguente conclusione: se dovessi riscrivere una custoim master page userei solo codice html e placeholder. Detta così non c'è nulla di inaspettato, ma spiegando quanto ho in mente forse qualche perplessità potrebbe nascere. Vi invito quindi fin da subito a commentare quanto andrò a dire, concedendomi l'attenuante di una temporanea insanità mentale e del fatto che non propongo ciò come LA SOLUZIONE, ma semplicemente come uun'idea che mi è venuta in mente, o perlomeno una presa di coscienza.

L'invenzione dell'acqua calda consiste in questo: invece di mettere i controlli direttamente nella master page, soprattutto quelli custom (si pensi per esempio al rendering accessibile dei menu tramite l'utilizzo delle componenti di ARF, che ho menzionato in post precedenti), andrei a posizionarli in control template personalizzazati, posizionati in pagina tramite feature, utilizzando appunto i delegate control. Un vantaggio che mi viene in mente, e qui potrebbero scatenarsi i detrattori, è la possibilità di scrivere del codice runat server all'interno dei controlli ascx, cosa che nelle master page non è possibile fare; questo mi permetterebbe volendo (anche se non è il sistema più elegante dal punto di vista dei puristi dello sviluppo) di non generare codice compilato in DLL. Ovvero ad eventuali modifiche non dovrei ricompilare il codice per riportarlo o nella bin della web application oppure in GAC.

A questo punto sono pronto alla pubblica lapidazione. Ben venga se ne esce qualcosa di costruttivo che ci consenta di scrivere delle buone master page, facilmete manutenibili.

Aggiungo qualche link di approfondimento:
User Control in Master Page (Page Footer)
Sovrascrivere i DelegateControl

mercoledì 20 gennaio 2010

SPSecurityTrimmedControl no XHTML compliant

Leggendo un recente post di Barbara Falchi, ho scoperto che anche in SharePoint 2010 il controllo SPSecurityTrimmedControl viene renderizzato con il tag SPAN. Questo comportamento è molto noioso se si cerca di creare pagine XHTML, perchè si viene a generare del codice sintatticamente scorretto. Mi vado a spiegare: il controllo SiteActionMenu viene renderizzato come DIV con tutta la relativa struttura di anchor etc., se incluso in nel controllo SPSecurityTrimmedControl genererebbe un DIV contenuto in uno SPAN; ovvero un tag block contenuto in un tag inline, fortemente scorretto. Se invece si volesse utilizzare SPSecurityTrimmedControl per nascondere qualcosa contenuto nel tag HEAD (un css o un javascript per esempio) si andrebbe di male in peggio, in quanto i tag accettati nel tag HEAD non sono molti e se non erro tutti inline.

Il motivo per cui il controllo SPSecurityTrimmedControl genera uno SPAN e da ricercarsi nella sua implementazione; il controllo deriva da System.Web.UI.WebControl che di default crea proprio un tag SPAN:

// costruttore
protected WebControl() : this(HtmlTextWriterTag.Span) {}


A dire il vero il WebControl prevede altri due costruttori:

protected WebControl(string tag)
{
this.tagKey = HtmlTextWriterTag.Unknown;
this.tagName = tag;
}

public WebControl(HtmlTextWriterTag tag)
{
this.tagKey = tag;
}


Peccatto che il controllo SPSecurityTrimmedControl non li utilizzi.

public SPSecurityTrimmedControl()
{
}

internal SPSecurityTrimmedControl(HtmlTextWriterTag tag) : base(tag)
{
}


A mio parere sarebbe stato meglio avere la possibiltà di valorizzare una proprietà pubblica per poter scegliere il tag da renderizzare (tra SPAN e DIV) o semplicemente avere la possibilità di renderizzare solo il contenuto del controllo, comportamento che lo avrebbe reso utilizzabile a livello di HEAD. Logicamente è sempre possibile scrivere un proprio controllo, ma questo lo dedico alla prossima puntata. Intanto vi segnalo un post che tratta del controllo SPSecurityTrimmedControl, evidenziandone altri problemi. Ho comunque il sospetto che il post in questione faccia riferimento ad una versione del controllo precedente alla service pack 2.0 di SharePoint. Qualcuno me lo può confermare?

venerdì 15 gennaio 2010

SharePoint 2007 & XHTML

Per esperienza personale, oltre al fatto che è anche dichiarato da Microsoft, SharePoint 2007 non è in grado OOTB di generare codice XHTML valido, indipendentemente dal DOCTYPE utilizzato. Fortunatamente qualche espediante per raggiungere un buon grado di aderenza allo standard XHTML c'è.

Parlo principalmente della carateristica di publish del MOSS, di cui ho più esperienza. I problemi derivano per esempio dal rendering dei campi RitchImage, che aggiungono attributi deprecati e scrivono il tag in maiuscolo. Per risolvere questo problema si può ricorrere agli adapter. Molti progetti presenti in Codeplex inerenti all'accessibilità fanno ricorso a questo espediante; consiglio:
Tutti progetti che affrantano il problema della resa del codice conforme allo standard XHTML; dal mio punto di vista non esiste il progetto risolutore, un mix delle soluzioni è l'approccio migliore.

Un altro consiglio per generare del buon codice è di usare il più possibile le Content by Query WebPart, che generano il codice html tramite XSLT. Questo permette al programmatore di maggior controllo sul codice generato. L'unica accrotezza da tenere presente è che gli XSLT usati dalla CQWP generano HTML pertanto il consiglio è di modificarli per fargli generare in output del codice XML. Per avere un controllo maggiore, tramite browser, delle CQWP, ho usato una WebPart che le estende e che espone anche quelle proprietà che altrimenti sarebbero visibili solo esportando la webpart stessa; la webpart è la Extented CQWP di Waldek Mastykarz (Paging Content Query Web Part).

mercoledì 30 dicembre 2009

Blogs su SharePoint

Segnalo due nuovi blog in italiano si Sharepoint; uno più orientato ai site builder, mentre l'altro dedicato all'architettura di SharePoint e ai suoi aspetti sistemisitici.

http://nonsolosharepoint.wordpress.com/
http://sharepointpig.wordpress.com/

domenica 27 dicembre 2009

SharePoint 2007 e le risorse globali

Mi è stato detto che se si vuole creare una WSP che distribuisca in automatico le risorse globali è necessario che nel manifest.xml i file di risorse siano dichiarati ApplicationResourceFile nell'apposita sezione ApplicationResourceFiles (http://stackoverflow.com/questions/296003/deploy-a-resource-file-to-appglobalresource-folder-on-activation).

Siccome con WSPBuilder non è possibile ottenere un manifest così fatto è necessario procedere a mano, ma facendoci aiutare da WSPBuilder fin dove possibile.
Per prima cosa copiare nella root del progetto il file WSPBuilder.exe.config e impostare a true la proprietà BuildDDF: .

Mettere i file di risorse nella cartella Resources all'interno della cartella 12.

1 - Generare una wsp, copiarla e rinominarla con estensione .cab.
2 - Aprire il file cab ed estrarre il manifest.xml.

3 - Modificare il file cab aggiungendo sotto

<rootfiles>
<rootfile location="Resources\myResource.en-US.resx">
<rootfile location="Resources\myResource.resx">
</rootfile>

il codice seguente

<applicationresourcefiles>
<applicationresourcefile location="myResource.en-US.resx">
<applicationresourcefile location="myResource.resx">
</applicationresourcefile>

4 - Scaricare il "Microsoft Cabinet Software Development Kit" e creare il file CAB a mano con MakeCab.exe.
5 - Rinominare il file cab in wsp e installarla in sharepoint con stsadm.

Dopo aver fatto tutto questo, però, mi sono accorto che i file di risorse invece di essere compiati nella cartella App_GlobalResources, vengono copiati in un cartella "resources" sempre all'interno della web application di SharePoint ospistata da IIS nella quale la nostra wsp è stata deployata.

Dopo un po' di ricerche ho trovato questo articolo (http://www.mikhaildikov.com/2007/03/sharepoint-resources-types-use-and_2163.html) in un blog che spiega bene come in effetti gli elementi de manifest ApplicationResourceFiles e Resources siano inutili e suggerisce un modo per copiare a runtime i file di risorse nella cartella App_GlobalResources. Un altro utile articolo sui file di risorse è "SharePoint Internals: Resources".

Se qualcuno ha sperimentato altri modi ho ha trovato il sistema di usare i sopra citati elementi del manifest non abbia problemi a scrivere un commento. La stessa cosa vale se sapete come funziona il meccanismo delle risorse in SP 2010. Nella speranza che ci siano stati dei miglioramenti nella gestione delle risorse globali.

mercoledì 23 dicembre 2009

SharePoint 2010 Client Object Model

Fianalmente cominciano a trovarsi svariati video su SharePoint 2010 che entrano in dettaglio sulle novità di questo nuovo prodotto di Microsoft. Essendo molto attratto dalla nuova interfaccia e curioso di capire come poter sviluppare siti che si avvicinino sempre più all'esperiece degli utenti, mi sono concentrato sui video che mostravano una delle grandi novità della UI si SP 2010; il Client Object Model.

Vi segnalo due video in cui parla Andrew Connell:
Overview of the Client Object Model
ECMAScript Client Object Model

Nell'articolo seguente invece viene fatto un paragone tra le applicazioni client stile SP 2007 e quelle che saranno con SP 2010:
SharePoint 2010: Introducing the Client Object Model

Nel secondo in particolare, fate attenzione quando viene mostrato il controllo SharePoint:ScriptLink che ha un attributo nuovo LoadAfterUI. Questo attributo non viene spiegato ma immagini serva per indicare a SharePoint di caricare lo script sp.js in modo asincrono, dopo che la pagina è stata caricata completamente.

Il client object model faciliterà l'accesso ai dati. Esistono ancora i web service, ma il client object model ne è una valida alternativa.

Altra novità sono le REST API di SharePoint.

giovedì 10 dicembre 2009

Costruire un sito web - riflessioni

Costruire un sito web è come costuire una casa.

Bisogna avere un progetto, segliere i materiali e seguire gli standard. Gli architetti che disegnano la casa hanno anche le basi di ingegneria per sapere che quello che disegnano starà in piedi, poi si fanno aiutare per i calcoli delle forze, ma un'idea di base riescono a farsela da soli; almeno i più bravi. I problemi da affrontare nel progettare una casa sono sempre gli stessi, al massimo aumentano un po' le complessità se la casa è a più piani, in una zona sismica oppure un grattacielo. Di certo i materiali sono pressapoco sempre gli stessi: cemento, legno, ferro etc. Gli architetti più smalizziati e ripesttosi delle leggi si preoccupano dell'abbattimento delle barriere architettoniche e per endere più confortevole e abitabile la casa pensano a una serie di servizi utili a chi ci abiterà.

Se ci pensate progettare un sito web ha le stesse analogie, purtroppo la sua costruzione non sempre segue le stesse regole utilizzate per progettare una casa. Spesso i designer non parlano le lingue del web, ragionano solo con la carta e curano solo l'aspetto finale del sito. Usabilità (i confort della casa) o l'accessibilità (l'abbattimento delle barriere architettoniche) sono parole usate a puro titolo commerciale, ma non ne conoscono le basi. La stessa cosa spesso la si può dire anche per gli stessi sviluppatori. Conosco programmatori ASP.NET che non conoscono il protocollo HTTP, che non sanno come funzionano le FORM. Altri che ignorano il linguaggio CSS e non sanno che per scrivere uno script Javascript cross-browser è meglio affidarsi al DOM del W3C, usano ancora "document.all"! Come se un muratore non sapesse fare il cemento o riconoscere un mattone.
Ho parlato con grafici che non conoscevano le unità di misura del web, lavoravano solo in pixel. Altri che non conoscevano il significato delle misure in percentuale: "allora a 1024x768 la colonna destra la facciamo del 30%, mentre a 800x600 la facciamo del 25%"! Cosa? Fissiamo una percentuale e la teniamo per tutte le risoluzioni.

Nessuno di noi si cimenterebbe da solo a costruirsi la casa, mentre tutti bene o male abbiamo provato a fare un sito. Chi lo fa di professione dovrebbe approfondire i fondamentali e specializzarsi nel proprio ruolo, ma sempre più spesso questo non si fa.

sabato 5 dicembre 2009

Un po' di medicina per i nostri CSS

Ormai è chiaro a tutti che scrivere codice html cross-browser utilizzando XHTML e CSS in passato era come camminare in un campo minato, a causa delle implementazione più o meno fedele degli standard. Il libro che sto leggendo "Progettare libri web standard" riassume un decennio di storia dei browser motivando anche alcune scelte che hanno introdotto alcune volte delle errate interpretazioni degli standard css, si pensi per esempio al caso del Broken Box Model di IE. Nel leggere il libro mi sono accorto che nel corso della mia vita professionale, che è cominciata nel 1999, ho visto tutte le cose elencate nel libro, e ho anche scritto codice HTML usando quei mezzucci descritti nel libro come immondizia HTML. Per fortuna la scoperta dei css e di XHTML mi ha aperto gli occhi.

Vi riporto un po' di link utili menzionati nel libro di siti in cui vengono presentati i vari bug che affliggono i più comuni browser.

Oltre a descivere i vari bug vengono proposte anche delle soluzioni per poter scivere del codice HTML il più possibile cross-browser.

giovedì 26 novembre 2009

Fatti non foste a viver come bruti ma per seguir virtute e canoscenza

Sto leggendo un libro molto interessante che consiglio a tutti quelli che, come me, lavorano con i siti web.

Il libro in questione è "Progettare siti Web Standard" di Jeffrey Zeldman. Per chi non lo sapesse Zeldman e il fondatore di "Web Standars Project" (che ha vinto la "battaglia" della standardizzazione delle tecnologie usate dai browser) e di "A List Apart".

Buona lettura.

The Winner Is... 2

Il sito ATM vince un altro premio.

Il sito "Atm ha ricevuto un altro riconoscimento: “Miglior prodotto digitale” nella categoria “eGovernment and Istitutions” del concorso eContent Award Italy, patrocinato dalla Presidenza del Consiglio dei Ministri".

Boom Atm su internet: 35mila visite al giorno


ATM, CONSEGNATO IERI PREMIO ECONTENT AWARD ITALY PER SITO

giovedì 19 novembre 2009

Branding SharePoint 2010

Non ho ancora avuto modo di mettere mano al nuovo SharePoint, ma girando sulla rete si trovano già delle prime utilities per incominciare a lavore con il nuovo prodotto. In particolare per la personalizzazione delle pagine, ho trovato su Codeplex un primo progetto che mette a disposizione una Starter Master Page, una sorta di minimal master page (Starter Master Page).

Dello stesso autore una serie di articoli sul suo Blog che parlano del Branding di SharePoint 2010. Eccovi il link al primo post.

Ho anche trovato la versione aggiornata dello Sharepoint Manager (SPManager 2010).

martedì 10 novembre 2009

Dai diamanti non nasce niente dal letame nascono i fior...

Se son rose fioriranno. In effetti non tutto è perduto, ho ancora l'occasione di lavorare con SharePoint, per il momento con una vecchia versione (WSS 2.0), ma è sempre esperienza. Il morale è alto e forse presto vi sottoporrò qualche nuovo risultate delle mie sperimentazioni.

Dimenticavo, devo ancora finire la guida di ARF!

A presto.

venerdì 30 ottobre 2009

Sono stato messo "AlFresco"

A causa di avverse politiche di mercato, per usare un eufemismo politicamente corretto, la mia carriera di sharepointer si è interrotta bruscamente. Non sarò più sul pezzo per un po' e non so quanto riuscirò ancora a scrivere sulle mie esperienza con il prodotto. L'unica possibilità è che il mio entusiasmo iniziale non si raffreddi del tutto, consentendomi di trasformare una professione in un hobby. In questo modo potrei mettermi a sperimentare in solitaria e raccontervi il frutto di tale attività, vedremo. Intanto indosserò nuovamente i panni del programmatore Java e mi dedicherò alla programmazione di applicazioni web basate sul CMS AlFresco e sul framework LifeRay. Potrebbe anche essere che nasca qualche articolo comparativo con SharePoint, anche in questo caso dipenderà tutto dall'entusiasmo.

Mi raccomando, tornate a visitarmi e "portatemi le arance"!

martedì 27 ottobre 2009

SharePoint Future

Quest'oggi ho partecipato alla SharePoint Future, overview di SharePoint 2010, organizzata da Green Team e Pialorsi Sistemi. Come sempre la ormai rodata squadra di trainer ci ha bombardato letteralmente di informazioni; ed erano solo una minima parte. Dal mio punto di vista, più orientato al site building, mi ha fatto piacere sapere che SP 2010 sarà XHTML strict compatibile, anche se mi ha lasciato un po' di sasso il fatto che non supporterà più IE 6 (forse la conferma che le nuove tecnologie Microsoft sono più rispettose degli standard). Le master page nuove sono "prive di tabelle" o per lo meno a tendere lo saranno e tutti i controlli sono stati riscritti per generare del buon HTML semantico. No vedo l'ora di provarlo!

Ultima considerazione, probabilmente con la nuova versione di SharePoint ARF andrà in pensione...

ARF Guide 0.9 è online

Ho appena rilasciato la nuova versione della guida in italiano sul fremawork ARF.
Potete scaricarla da Codeplex.

domenica 25 ottobre 2009

Guida ad ARF - in arrivo una nuova versione

State collegati, tra poco rilascerò un nuova versione della guida in italiano su ARF; ricca di contenuti, dalle feature nascoste all'intragrazione con Silverlight, qusta nuova versione si merita un salto di numerazione. Sarà targata 0.9, ben tre salti di versione. Spero di riuscirla a pubblicare in concomitanza con l'evento SharePoint Future che si terrà martedì 27 a Milano, in cui ci verranno preentate in anteprima le nuove caratteristiche di SharePoint 2010.

lunedì 19 ottobre 2009

ARF Form Base Authentication and WSS Publishing

Indagando nel codice di ARF ho scoperto un paio di funzionalità nascoste e non documentate, che ho intenzione di esplorare meglio con degli articoli mirati e nella mia guida. Per il momento mi limito a riportare quanto scoperto e le prime impressioni. Le due due funzionalità in questione sono ARF-FormsAuth e ARF-WSSPublishing. Entrambe sono due feature non attive dopo l'installazione della soluzione ARF, ma che devono essere attivate dall'utente, la prima è addirittura HIDDEN. ARF-FormsAuth è un tentativo di creare un sistema di autenticazione di base basato su form, integrato in SharePoint. Si basa su due liste custom FormsMemberList e FormsRoleConfig e su due provider personalizzati da configurare a mano nel web.config della web application: MembershipProvider e RoleProvider.

Nella wsp che si scarica dal sito ufficiale di ARF c'è un probolema con la feature ARF-FormsAuth, mancano le due cartelle contenenti gli schema delle liste custom. Siccome esiste una seconda feature che installa un'istanxa di queste liste e che non funziona se la prima feature non è attivata in modo corretto è necessario correggere l'errore di installazione. Per fare ciò è necessario rinominare la wsp di ARF in un file .cab, estrarre il contenuto e copiare le cartelle FormsMemberList e FormsRoleConfig contenute nella cartella della feature ARF-FormsAuth nella rispettiva cartella che si trova in 12\TEMPLATE\FEATURES. Fatto ciò è necessario riattivare la feature con stsadm -o activatefeature (usare l'opzione -force) e infine lanciare un IISRESET. Dopo questi passaggi sarà possibile attivare anche la feature ARF-FormsAuthLists.

La seconda feature, attivabile a livello di sito (SPWeb), dovrebbe consentire di creare delle pagine custom in WSS a partire dal template di pagina Basic.aspx, che al suo interno usa un campo (field) RichTextField, compreso nella soluzione ARF. Il condizionale è d'obbligo perchè non sono ancora riuscito a far funzionare la caratteristica. Di certo devo segnalare un errore: nella pagina Basic.aspx si fa riferimento alla master page /_catalogs/masterpage/spworks.master di cui non vi è traccia nella soluzione; pertanto la pagina risulta inutilizzabile. Per risolvere il problema consiglio di modificare la pagina utilizzando una più standard ~masterurl/default.master o ~masterurl/custom.master master page.

L'impressione al momento è che queste funzionalità siano solo una bozza e non effettivamente funzionanti, ma vi saprò dire una volta che le avrò provato davvero.

Come sempre rinnovo l'invito a collaborare con me se avete già avuto modo di fare esperianza con qualcuna delle funzionalità di ARF, in modo da avere una più ricca collezione di esperienze e di impressioni.

venerdì 16 ottobre 2009

Custom Master Page

Mi sono sempre domandato quando mai avrei usato le custom master page di Sharepoint, ora l'ho scoperto.

Per un progetto ho creato una site definition graficamente molto gradevole ma del tutto inadatta ad ospitare le pagine delle liste (list form page), quindi ho dovuto trovare un sistema per poter applicare la mia master page alle sole pagine aspx presentate al visitatore, lasciando la default master page associata al resto delle pagine. Siccome le pagine associate alle liste usano la ~/_layouts/default.master, non posso associare la mia master page alla default.
A questo punto entra in gioco la custom master page, ovvero nella mia site definition, nel file ONET.XML, ho usato configuration id="1" name="Blank" custommasterurl="/_catalogs/masterpage/clinicalmaster/ClinicalBasic.master", mentre nel codice SPweb.CustomMasterUrl e nelle pagine aspx ~masterurl/custom.master.

In questo modo tutte le pagine originali di WSS continuano a lavorare come prima.