Friday, February 06, 2009

SemWeb

Oggi voglio introdurvi, miei cari lettori, ad una mia ottima amica degli ultimi giorni: una libreria per lo sviluppo di network semantici. La libreria SemWeb è quanto di meglio offre il mondo open source nell'ambito delle reti semantiche per il framework .net. caratteristica estremamente interessante di questa libreria sta da un lato nella sua integrabilità con database "reali", dall'altro nella sua compatibilità con query N3 e SPARQL.
Vediamo un pò di fare un esempio semplice di network. Supponiamo di voler creare una rete semantica basata sulla mitica Facebook API (o per lo meno sui servizi REST). E supponiamo di voler organizzare in modo intelligente le informazioni per ottenere dati di marketing tali da permetterci di andare a valutare come posizionare un certo prodotto sul mercato in modo da sfruttare le caratteristiche virali di internet (si, ho sparato una sequenza di stupidate per giustificare l'uso di Facebook REST).
Partiamo dal definire le caratteristiche fondamentali di questo "gioco". Abbiamo degli utenti di facebook, i loro amici, le cose di cui sono fan, i gruppi a cui appartengono, le applicazioni che hanno installato. Date queste entità e fato il fatto che sono tutte accessibili tramite le API REST, diventa estremamente facile poter pensare al mondo facebook come insieme di triplette (entità1, relazione, entità2). In particolare avremo delle entità che potremo identificare tramite il loro indirizzo "personale" su facebook avendo facilmente l'URI di ognuna di esse. Le relazioni potremmo prenderle, effettivamente, da FOAF, ma per facilità di trattazione creiamo uno standard nostro, ad esempio "http://www.facebook.com/rel/isFriendOf".
Ora il gioco diventa semplcissimo. Ogni volta che invochiamo l'api trovando nuovi amici di un dato utente, aggiungiamo ad un MemoryStore uno statement contenente l'entità dell'utente che stiamo analizzando, il tipo di relazione "http://www.facebook.com/rel/isFriendOf" e l'entità dell'utente che abbiamo trovato come amico del primo. Questo per ogni tipo di relazione che andremo ad analizzare.
Fatto questo il MemoryStore conterrà un pò di relazioni fra utenti. Sarebbe estremamente interessante poter interrogare la raccolta di dati su relazioni particolari, come amici di schieramenti politici opposti. Per questo ci viene in aiuto SPARQL, che con un elegante sistema di codifica permette di andare a definire esattamente quella query (domani il codice di esempio della query).
Non ha senso dover rifare ogni volta l'albero (anche se magari persone si sono aggiunte o tolte). Per questo si può utilizzare l'ottimo RDFXmlWriter che trasforma la rete semantica definita nel memorystore in un file XML utilizzabile sia da Protege, che ovviamente dall'RDFXmlReader per ripartire da una rete già pronta...
Domani un pò di codice su cui pensare...

Di colli di bottiglia

ieri. ore 9.00: parte l'esecuzione dell'analizzatore del framework .net che genera la rete semantica.
ieri. ore 9.10: si conclude l'esecuzione con la creazione di un file XML delle dimensioni di 120MB. Sono circa 1500000 relazioni RDF.
oggi. ore 9.00: parte l'esecuzione dell'analizzatore del framework .net che genera la rete semantica.
oggi. ore 9.10: siamo a 10000 relazioni.
oggi. ore 12.00: siamo a 300000 relazioni.
oggi. ore 15.00: siamo a 550000 relazioni.
domani. ore 00.40: siamo a 1145723 relazioni.
domani. ore 01.15: si conclude l'esecuzione che ha riempito SQL Server 2008 con le relazioni gioiose e felici. Chissà se funzionano le query SPARQL...

Thursday, January 22, 2009

Purity and Side Effect Analysis for Java Programs - Salcianu, Rinard

Il concetto di side effect è uno dei più dibattuti degli ultimi tempi (no, non arriverà nelle case di tutti tramite porta a porta, la discussione, perchè tanto c'è il forum di Lambda the Ultimate), soprattutto a causa del suo stretto legame con i linguaggi imperativi. Il paper dei due ricercatori del MIT presenta una interessante modalità di analisi dei side effect (e quindi un modus operandi per la caccia ai metodi puri). In particolare il modo per inferire le informazioni sui side effect delle operazioni è assolutamente interessante. Peccato solo per due questioni: è tutto pensato per Java (non che il porting dei concetti sia difficile) e devo immaginare un modo per rendere il controllo dei side-effect parte integrante dell'analisi del framework .net. Pare facile...

Wednesday, October 08, 2008

Beh, beh, beh

Perchè non esistono librerie decenti che interpretino Prolog? Perchè non esistono planner per C#? perchè non si può avere la libreria AIMA con un pò di parallelismo? perchè? perchè? perchè? :@

Tuesday, September 30, 2008

parlare di predicibilità...

Oggi ho scoperto cose mistiche su VS2008... ad esempio che bisogna creare ogni volta la cartella (del progetto, della soluzione, ecc)... Grazie Guido!!!

Vi posto un estratto di codice, giusto per divertirsi... e per riaprire questo gioioso blog! :D

string temp = solution.GetProjectTemplate("SequentialWorkflowLibrary.zip", "CSharp");
Directory.CreateDirectory(where + "\\WFlow");
solution.AddFromTemplate(temp, where + "\\WFlow", "WFlow", false);

e ora cerchiamo di capire come si mette del codice in un metodo... :P

Monday, September 01, 2008

“Sia l’oggetto” e l’oggetto fu

Come possiamo rappresentare la realtà? Possiamo essere dichiarativi e dire che la coda è una proprietà di cavallo, possiamo essere imperativi e dire che cavallo ha una coda. Oppure possiamo essere “ad oggetti” e dare un punto di vista diverso sul nostro cavallo. Niklaus Wirth diceva “Programma = Dati + Algoritmi”. Indubbiamente vero, ma cercare di spiegare il funzionamento di una grande multinazionale parlando di “dati” e “algoritmi” non è prettamente cosa facile. O per lo meno non lo è utilizzare solo tipi di dato primitivi. Il paradigma ad oggetti non è infatti molto lontano da quello imperativo procedurale. Solo che invece di avere “Programma = Dati + Algoritmi” diventa “Realtà = Entità + Relazioni” o, in un’ottica più legata all’interazione attiva, “Programma = Oggetti + Interazioni”.

Detto questo, non ci resta che definire Oggetto e Interazione.

Un oggetto è la descrizione astratta di un’entità. Una sua versione utilizzabile è un’istanza. Cavallo è un concetto chiaro nella nostra mente, ma nella nostra mente un cavallo esiste solo come informazione. Un cavallo reale è un’istanza del nostro modello di cavallo, del nostro oggetto “Cavallo” (si, lo so, il paragone è forte e dire che il cavallo reale è un’istanza del nostro modello mentale può sembrare forte, ma ci addentreremo in altri momenti nella questione filosofica della differenza tra percezione della realtà e realtà).
Come Cavallo è un tipo di oggetto chiaro nella nostra mente e “istanziabile”, così non è il concetto di Animale. Un cavallo è un animale, ma non tutti gli animali sono cavalli. E non esiste un Animale “puro”, ovvero che non sia nulla di più specifico di un animale. Questo genere di classe è detta “astratta”, e non è mai istanziabile in modo diretto. Ora facciamo un ulteriore salto verso l’astrazione. Sia un animale, che abbiamo già visto essere astratto, che una pianta (per similitudine la supporremo anch’essa astratta) hanno la caratteristica di essere “viventi”. Hanno quindi delle proprietà caratteristiche quali (tanto per fare dei nomi) un certo numero di cellule, possono vivere e morire. Ma queste caratteristiche sono effettivamente diverse all’interno di entrambe le tipologie di esseri viventi. Cionondimeno il fatto che qualcuno ci dica che ad un nostro amico è stato regalato un “essere vivente” (per quanto infinitamente vaga possa essere questa affermazione) ci permette di dedurre che l’entità che gli è stata regalata è nata, può morire, ecc. Questo tipo di informazione (che definisce solo le caratteristiche ma non il modo di valutarle) è detta nel paradigma ad oggetti Interfaccia. Quindi, gerarchicamente, possiamo vedere che un cavallo (classe) è un animale (classe astratta), che a sua volta è un essere vivente (interfaccia), così come una rosa (classe) è una pianta (classe astratta) che è a sua volta un essere vivente (interfaccia).

Le interazioni possono essere di due tipi. Vi sono le interazioni di tipo strutturale, ovvero che definiscono una gerarchia tra gli oggetti (come tra cavallo e animale), e di tipo diretto, che definiscono l’uso di un oggetto da parte di altri oggetti. Le interazioni di tipo strutturale sono ad esempio

  • la generalizzazione, ovvero la constatazione che sia cavallo che foca sono animali e quidni posseggono tutte le caratteristiche degli animali, e inoltre hanno, separatamente, delle caratteristiche in più. La classe astratta “animale” è detta classe padre, le classi “foca”, “cavallo” sono dette classi figlio.
  • la realizzazione, ovvero la considerazione che un animale, essendo un essere vivente, ne realizza in modo peculiare le caratteristiche e le proprietà
Le interazioni di tipo diretto sono invece definite dai metodi all’interno delle singole classi. Quindi l’interazione tipica è l’uso di un dato metodo all’interno di un dato oggetto.

Saturday, July 29, 2006

Finito. (gli aggiornamenti non sono stati frequenti, ma...)

Lo so, sono un idiota. "Se non hai tempo di postare, chiudi." diceva un grande teoirco del blog. La mia risposta è se non ho tempoper postare non ho tempo nemmeno per chiudere.

In ogni caso è finita.

Mercoledì scorso ho discusso la tesi su Windows Workflow Foundation con un risultato di 105. Va benissimo, sono contento. Però questo non implica che smetterò di giocherellare con i diagrammi di flusso e di stato. Anzi. Appena torno da NYC inizierò a lavorare ad alcune idee che mi erano venute...
E - stavolta non mi dimenticherò - vi terrò aggiornati sulle genialità di WWF.

Friday, May 26, 2006

Prima Prerelease... Molte domande poche risposte

Dunque: Presentazione effettuata mercoledì scorso. Le domande poste dal prof. N. sono tante. E sono estremamente interessanti. Da analizzare. Ma ci vuole tempo: Martedì nuovo briefing dal prof. B. Vediamo se si riesce ad arrivare ad una soluzione anche parziale dei problemi posti. Due nuove presentazioni in arrivo: Una improntata sul WF Runtime Environment e una sulle sfide poste dal prof. N. Garantisco (il mio processore non ne era affatto felice) che il "ping-pong test" ha fnzionato...

Monday, May 22, 2006

Buttare giù esempi d'uso...

Non è affatto facile quanto sembra. Anzi. Direi che trovare esempi sensati è decisamente dura... Ma la vera complessità è riuscire a mettere in risalto la genialità dello strumento senza tergiversare su piccolezze [di per sè estremamente complesse da gestire, intendiamoci, come le property e l'introspection].

Tuesday, May 16, 2006

Work in progress

Sto al momento lavorando alla presentazione si WinFX e Workflow Foundation. I webcast MSDN sono impressionantemente utili (e sono anche al momento l'unica fonte di informazioni che ho trovato).

Ecco i link alla versione "pre-pre-pre alpha" della presentazione pdf (1.6 MB) - swf (217kb)

Wednesday, May 03, 2006

BTW: come si può non amare VS2005???

Quello che vedete sotto è il risultato diretto del copia-incolla!!! :o Come si può non adorare quello strumento di potere... :D

Testiamo le activity...

Interessante la struttura delle Acivity. Sto cercando di fare un apiccola libreria di attività legate alla console. Lo so, c'è la CodeActivity che è fatta apposta, ma speravo di raggiungere una specializzazione molto maggiore. Una specie di ncurses per Workflow.

Ecco un (umilissimo e stupido) esempio di codice

public partial class ConsoleWrite: Activity
{
private string _message;
public string Message {
set { _message = value; }
get { return _message; }
}

private bool _nl;
public bool NewLine {
set { _nl = value; }
get { return _nl; }
}
public ConsoleWrite()
{
InitializeComponent();
}

protected override ActivityExecutionStatus
Execute(ActivityExecutionContext executionContext)
{

Console.Write(Message);
if (NewLine) Console.WriteLine();
return base.Execute(executionContext);
}
}

Inizia il lavoro per la tesi!!!

In occasione dell'inizio del lavoro per la tesi su Windows Workflow Foundation ho aperto un nuovo blog.
Pubblicherò un pò tutto quello che trovo di interessante.