CodePlex... un passo da fare?

Stanotte ho passato un paio di ora chattando con Phil Haack, capo supremo di SubText.

Tra le tante cose abbiamo parlato di un possibile spostamento di SubText da Sourceforge a CodePlex.

I dubbi sono molti: da MbUnit usato per lo unit testing, alla gestione delle build (ora usiamo CC.NET), la storia dei checkin.

E' possibile tutto ciò?

Lorenzo, o guru supremo di VSTS, se ci sei batti un colpo , e dacci qualche risposta, meglio se direttamente sul blog di Phil: Should Subtext Move To CodePlex.

powered by IMHO 1.3

[CSDev#1] - Personalizzare CommunityServer: scrivere CSModules

Giorni fa mi lamentavo della scarsità di documentazione riguardante Community Server: ho dunque deciso di sopperire a questa mancanze scrivendo dei post a riguardo. Probabilmente troverete alcune di queste cose cercando sui forum di CS.org o sull'appena lanciato CSMVP.com
Ma siccome il programmatore italiano è pigro e non legge la doc in inglese, cerco di provvedere inaugurando una serie di articoli in Italiano su come estendere CommunityServer.

Ci sono diversi modi per personalizzare CommunityServer:

  • Graficamente, creando temi e skin (sia generici, che per i blog, le photo gallery ed i forum)
  • aggiungendo nuove funzionalità (cioè creando nuovi applicativi per CS) scrivendo degli AddOn: ad esempio stanno già facendo un CSWiki
  • modificando il comportamento delle operazioni standard dei blog, forum, registrazione utente, scrivendo dei Moduli (CSModules)
  • estendendo le informazioni salvate nella registrazione utente
  • accedendo alle informazioni salvate in CS da applicazione esterne (ad esempio un vostro portale che deve però autenticare gli utenti in base alle informazioni presenti nel DB di CommunityServer)

Sviluppare un CSModule è il modo più veloce per entrare in contatto con le API di CS, quindi inizio la mia serie di post partendo da come si sviluppa un CSModule.

Installare CommunityServer

Ovviamente la prima operazione da fare è installare in locale CommunityServer.
Per sviluppare è sufficiente avere l'installazione binaria, ma per chi volesse esiste anche l'SDK, che include anche tutto il codice sorgente della versione Express.

Se usate l'MSI del quale ho fornito il link, alla fine dell'installazione avrete un'instanza di CS installata, con il DB già creato e popolato con dati d'esempio, normalmente accessibili all'indirizzo http://localhost/cs (o similare)

Creare il progetto VS2005

Ora potete iniziare a sviluppare il vostro modulo per CS.
Per farlo è sufficiente creare un "Class Library" project con VS2005, creare un folder nel quale copiare le dll core di Community Server, e creare dei riferimenti alle librerie necessarie. Ipotizzando di voler sviluppare un CSModule che interagisce con il Forum saranno necessarie:

  • CommunityServer.Components.dll
  • CommunityServer.Discussions.dll

Nel caso voleste interagire con i blog, avreste dovuto creare un riferimento alla dll CommunityServer.Blogs.dll. E se volevo interagire con le Gallery? Beh... indovinate

Queste librerie contengono tutte le API e le entities necessarie per accedere a tutte le informazioni necessarie per sviluppare dei moduli.

L'interfaccia ICSModule

Affinche una classe sia identificata come modulo di CommunityServer è necessario che implementi l'interfaccia ICSModule.
L'unico metodo di questa interfaccia è il metodo Init.

Ecco come si presenta lo scheletro di un CSModule.

using System;
using CommunityServer.Components;
using CommunityServer.Discussions.Components;
using CommunityServer.Blogs.Components;

namespace CSModuleTest
{
    
class CSModuleTest: ICSModule
    {
        
#region ICSModule Members
        public void 
Init(CSApplication csa, System.Xml.XmlNode node)
        {
            
//Qui va l'implemenazione del metodo
        
}
        
#endregion
    
}
}

La domanda che sorge spontanea, e che mi sono fatto pure io appena ho visto l'interfaccia è: ma dove sono i metodi che vengono chiamati ogni volta che CS vuole far entrare in gioco i moduli?

Gli sviluppatori di CS hanno deciso che le interfacce sono troppo complesse da gestire in un'applicativo OpenSource per via della impossibilità di fare versioning. Quindi hanno deciso di usare l'approccio che MS ha usato per gli HttpModule e HttpHandler: cioè usare gli eventi.

Quindi, nel metodo Init, ogni modulo deve "dichiarare" che eventi vuole gestire, e poi implementare il codice per gestirle nell'appropriata funzione di gestione dell'evento.

Un ottimo post sull'argomento (con conseguente discussione) è stato scritto dal capo supremo di SubText, Phil Haack: Building Plugins Resilient To Versioning
Dall'articolo ne segue che il framework per i plugin di SubText sarà event-driven

Ma torniamo al nostro CSModule:
quali sono gli eventi che vengono alzati dalla CSApplication, e che possono essere gestiti da il nostro modulo?
Ce ne sono una 20ina, e sono elencati sul Wiki degli sviluppatori.
Se intanto volete inziare a guardarli, i nomi sono abbastanza auto-esplicativi.
Comunque li approfondiremo in un'altro post, ma ora come esempio guardiamo l'evento alzato ogni volta che viene salvato un post: PostPostUpdate.
Con Post si intende sia una entry nel blog, sia un messaggio nel forum, sia un commento ad un blog, ecc... (cioè tutti gli elementi che ereditano dalla classe Post).

Ecco come sarebbe il modulo di prima con aggiunto l'event handler dell'evento PostPostUpdate:

using System;
using CommunityServer.Components;
using CommunityServer.Discussions.Components;
using CommunityServer.Blogs.Components;

namespace CSModuleTest
{
    
class CommunityCreditPointSubmission: ICSModule
    {
        
#region ICSModule Members

        public void 
Init(CSApplication csa, System.Xml.XmlNode node)
        {
            csa.PostPostUpdate += 
new CSPostEventHandler(csa_PostPostUpdate);
        }

        
#endregion
        
        void 
csa_PostPostUpdate(IContent content, CSPostEventArgs e)
        {
            
if (e.ApplicationType == ApplicationType.Forum)
            {
                ForumPost post = (ForumPost) content;
                System.Diagnostics.Debug.WriteLine("Post Title = " + post.Subject);
            }
        }
    }
}

Ora che il nostro Modulo è pronto come la aggiungo al CommunityServer installato il locale?
Basta aggiungere la seguente riga nel communityserver.config

<add name = "MyCSModule" type = "CSModuleTest.CSModuleTest, CSModuleTest" />

E per debuggare?

Non potendo lanciare direttamente il server in debug (si potrebbe fare se avessimo usato l'SDK, ma secondo me sbattimento inutile), si deve lanciare l'applicazione nel browser, e poi attaccarsi al processo di ASP.NET col debugger di VS2005.

La prossima puntata, vedremo la classa base di CommunityServer: CSContext

powered by IMHO 1.3

[OT] Troppo lavoro fa male ...

... ed ecco le conseguenze.

Ho incontrato un topo
Oggi mentre andavo a prendere il caffè durante la pausa pranzo guardavo per terra e lo sguardo mi cade su qualcosa di grigio.
Guardo bene e vedo una figura riversa per terra, mi avvicino e constato che è un topolino.
Lo guardo e lo raccolgo, è un pò sporchino e lui mi ringrazia di non avelo lasciato li dato che è stufo di farsi calpestare.
Arrivato a casa mi dice che ha bisogno di un buon bagno così lo accontento.

Questo è quello che scrive un mio collega, dopo una giornata stressante di lavoro... e c'è anche la foto del topo di pezza nella vasca da bagno

powered by IMHO 1.3

Il mio nuovo libro: ASP.NET 2.0 MVP Hacks and Tips

Oggi sono andato a trovare Lorenzo al lavoro, e, oltre ad una chiaccherata, mi ha anche dato il libro che gli avevo chiesto di comprarmi al TechEd di Boston: ASP.NET 2.0 MVP Hacks and Tips.

Perchè tutta strada per comprare un libro che posso trovare su Amazon?: perchè comprandolo al TechEd di Boston sarebbe stato firmato dagli autori, e in particolare da uno che stimo moltissimo... Scott Hanselman !!!

Ecco qui sotto le foto della copertina e della firma di Scott (indicato in rosso):

ASP.NET 2.0 MVP Hacks and Tips Cover Scott Hanselman Signature on my new book

powered by IMHO 1.3

Nomi in codice per software

Avete fatto un software e non sapete che nome dargli? Magari prima che il "marketing" abbia deciso il nome ufficiale?

O sfogliate un libro di mitologia Celtica, oppure, se non avete voglia di pensare, potete farvi generare il codename automaticamente:

ubique.ch ha realizzato un generatore di nomi in codice per gli attacchi milatari, ma può benissimo essere usato per generare nomi in codice di due parole.

Alcuni nomi:

PinkSabre, SharpObelisk, UrgentSword, RedArms, ShiningCanyon, ...

powered by IMHO 1.3

2 modi per indicare errori utente

Magari li conoscevate già, ma ieri ho trovato 2 belle sigle per identificare che un errore non un errore dell'applicativo ma è stato commesso dell'utilizzatore:

PEBCAK = Problem Exists Between Chair And Keyboard

e ID-10-T error...

PS: appena scritto, ed è appena accaduto un errore PEBCAK

powered by IMHO 1.3

Lotta sul fil di lana per Community Credits

Lorenzo Barbieri è ormai irraggiungibile (211k punti), ma la lotta per il secondo posto per il mese di Giugno è serratissima: ben 4 persone sono raccolte in un fazzoletto di 5000 punti... e di queste ben due Italiani (io e Michele).

Riusciremo a fare tripletta di Italiani? Chi vincerà la tastiera senza lettere? Chi la chiavetta USB microscopica, chi Yoda versione zaino a grandezza reale e chi il robot programmabile binario?

powered by IMHO 1.3

Il servizio "sta a partire"

Per caso ho aperto l'elenco dei servizi mentre stava partendo il servizio MS SQL. Ed ecco come viene identificato un servizio mentre sta partendo: "A partire"

Ma chi diavolo ha tradotto questo stato del servizio? Non sono un cultore dei dialetti, ma "Sta a partire" mi pare un'espressione romana, o sbaglio?

powered by IMHO 1.3

«giugno»
domlunmarmergiovensab
28293031123
45678910
11121314151617
18192021222324
2526272829301
2345678