lunedì 10 novembre 2008

On Content Repository

Scrivo in velocità questo post su come dovrebbe essere un content repository secondo cheng. Intendiamoci, in java esistono implementazioni varie del jsr 170, la più blasonata è apache jackrabbit.
Non mi piace molto. Non mi piace molto perchè a mio avviso è un pò limitante nella semantica degli oggetti che possono essere salvati nel repository, nella fattispecie i "link" agli altri nodi sono..esattamente questo, dei link. Molti obietteranno che questo è esattamente il comportamento di un file system, il problema è che un content repository NON è un file system.

Nella pratica un content repository è utilizzato per salvare bit di dati in una struttura gerarchica e dinamica, con possibilità di modificare i nodi a runtime (un modo piuttosto diverso --e secondo me migliore in molti casi-- di un RDBMS tradizionale). Devo ancora scavare più a fondo, ma mi sembra che la gerarchia, cioè la possibilità di salvare nodi come figli di altri nodi, venga vista come una sorta di mappatura della gerarchia delle classi su una struttura simil-file system.
Ok, se è effettivamente così mi piace ancora meno.

Ora, finalmente, una breve panoramica su "come dovrebbe essere un content repository per il cheng":

  • gerarchico, ma nel senso di "posizione" non di "tipo";

  • con possibilità di specificare la semantica dei nodi collegati:

    • composizione: il nodo figlio non ha senso di esistere senza il padre (e quindi è "posizionato" come figlio del nodo a cui appartiene);

    • aggregazione: il nodo collegato è un'entità a se stante, quindi può essere posizionato dove vuole; il nodo aggregante mantiene un link ad esso;



  • semistrutturato: i nodi possono (e spesso è molto meglio che lo facciano) specificare un "tipo", anche se in questi casi sarebbe meglio chiamarlo "prototipo", al quale possono essere aggiunte proprietà senza dover necessariamente rivedere l'infrastruttura (e mi pare che questo punto sia soddisfatto);

  • mi piace molto anche l'idea dei "mixin", già implementata: un nodo può soddisfare diversi mixin, che altro non sono che ulteriori prototipi che specificano dati addizionali (erediarietà multipla? no, il nodo ha un prototipo solo e molti mixin..non è corretto, ma si possono grosso modo mappare mixin con le interfacce di java --e non a caso uno dei mixin di default di alfresco è versionable, notate una certa somiglianza della nomenclatura con le interfacce che comunemente si creano in java? (hint: *able)-- ).



Tra parentesi, un sistema del genere è anche come salverei le informazioni di un'applicazione web, ed avrebbe in effetti anche la pregevole proprietà di poter essere esposto tramite servizi rest piuttosto facilmente.
Certo, esistono progetti molto ambiziosi sullo storage di dati esposto tramite servizi rest, piuttosto che tramite "driver" proprietari. Ad esempio couchdb (incubato da apache e il cui principale sviluppatore è stato "acquisito" da IBM per lavorare a tempo pieno sul progetto..e vorrà dire qualcosa), il difetto che trovo in questa soluzione è che non è gerarchico: i dati sono salvati in uno "flat space".

Detto questo aspetto che qualcuno implementi il jsr 283 (content repository 2.0), per vedere in che direzione si è mossa la comunità java...

giovedì 30 ottobre 2008

L'eresia del web

Il web evolve. E' un fatto sotto gli occhi di chiunque naviga ed ha un minimo di cognizione sui siti dove capita: non stò parlando del fatidico "web 2.0", concezione più filsofica che pratica per indicare una trasformazione nell'idea di Internet, piuttosto mi riferisco a questioni più pratiche, rivolte agli sviluppatori di siti/applicazioni web.

Veniamo al dunque: la diffusione dei servizi cosidetti sociali ha portato alla nascita di numerosi framework e librerie per la generazione di interfacce sempre più flessibili e potenti, utilizzate dai più per rendere l'esperienza dei siti web sempre più simile (se non migliore) a quella di applicazioni native.

Da un certo punto di vista l'utilizzo estensivo di javascript sul lato client è visto come un miglioramento: le pagine web non sono più "stupide" raccolte di dati, ma sono interattive e permettono quindi una friuzione più completa del sito. Da un altro punto di vista le applicazioni web che sfruttano esclusivamente javascript per presentare contenuti (attenzione, parlo di "presentazione dei contenuti", non di "interazione" con gli stessi, sono due cose differenti almeno per me) è, semplicemente, disastrosa per vari motivi:


  • la modifica a runtime del DOM dell'html è difficile da rendere accessibile;


  • i motori di ricerca non riescono a indicizzare pagine create dinamicamente sul client;


  • di fatto si rende impossibile (con poche eccezioni) funzionalità quali bookmark e passaggio di link per l'identificazione delle risorse.



Quindi, qualcuno penserà, il cheng crede che javascript sia sbagliato, che era meglio quando il browser per qualsiasi azione faceva il reload completo della pagina, che si stava meglio quando si stava peggio...

Ovviamente no. No, sono convinto che queste tecnologie siano effettivamente utili, solo penso che si dovrebbe essere cauti nel progettare un'applicazione web "one-page": le funzionalità del client, a mio avviso, dovrebbero essere soprattutto "cosmetiche", piuttosto che implementare da zero l'interfaccia, ed il cambiamento dall'interazione su una risorsa ad un'altra (ie. in un blog passare dal leggere un post ad un altro) dovrebbe modificare l'url della pagina, per rendere l'utente coscente del fatto che andrà ad agire su una risorsa diversa.
Per quest'ultimo punto sono combattuto: il fatto che, per cambiare l'url della pagina, attualmente non esista altro modo se non il ricaricamento della stessa porta alla conclusione che non si può utilizzare una chiamata ajax per ottenere lo stesso effetto. Vero. Ma è anche vero che ci possono essere degli "hack" che vengono in aiuto: ad esempio google maps non richiede, ovviamente, di ricaricare la completa pagina quando ci si muove nella mappa e fornisce, nella pagina, un link che riconduce allo stato della mappa in quell'istante.

Ok, quindi tutto questo che cosa ha a che fare con la millantata "eresia" del web citata nel titolo? Ci arrivo: abbiamo quindi visto che javascript stà assumendo un'importanza che fino a una manciata di anni fa nessuno si sarebbe aspettato (linguaggio con una sintassi strana, implementazioni buggate e soprattutto diverse, lentezza.. insomma, ne aveva --ed ha attualmente-- tante di rogne). Ma è l'unico che permette di agire nel client sulla pagina visualizzata (nativamente, in alternativa si potrebbe usare actionscript o java, ma non mi adentrerò in queste tecnologie). Ora, un'applicazione web tipicamente è implementata con un'architettura 3 (o N, in alcuni casi)-tier: il livello dei dati, quello della logica di business e la presentazione. Spesso quest'architettura è più o meno malamente integrata con un'architettura MVC (Model View Controller), altri hanno già scritto su come dovrebbe essere un'architettura 3-Tier/MVC (personalmente ho preso in considerazione solo il paragrafo sull'architettura, il resto ha delle svistea mio parere piuttosto clamorose).

Tipicamente l'applicazione ha un database sul quale vengono salvate le informazioni sugli utenti, dati eccetera. Il livello applicativo, la business logic, è implementata con diversi linguaggi: PHP, .NET, Java, Perl, Python, Ruby (e tanti altri). Infine la presentazione tipicamente avviene con sistemi di templating per HTML (cose tipo mischiare HTML e codice o emettere HTML dal codice non le prendo minimamente in considerazione, e se state pensando di fare un'applicazione web non dovreste farle neppure voi!).

Ok, tutto è molto bello. Cosa succede però se cominciamo a mettere nell'equazione anche le chiamate asincrose da html? I framework web "di vecchia scuola" (anche detti "page-centric", ie. Struts e Spring-MVC) sono praticamente tagliati fuori, a parte alcuni tentativi per permettere l'iterazione con delle action, in ogni caso stanno venendo sorpassati da framework che agiscono direttamente sul client, mentre al server è demandato solo lo scambio di dati (tipicamente in formato XML o json).
Sembra un'ottima idea: risolve il problema di interazione tra pagine generate sul server e "tocchi" di pagina, sempre generati sul server, e riduce la complessità del codice sul server (che non deve più generare HTML).

L'idea meravigliosa, però, è la causa dei già citati problemi delle applicazioni web "single-page". Quindi non se ne esce? Riusciranno i nostri programmatori-eroi a creare applicazioni web che siano facilmente ed efficacemente fruibili ai naviganti, accessibili alle persone diversamente abili ed indicizzabili dagli stupidi spider di google?

Certo, è possibile. E' ovviamente anche lievemente perverso, ma seguite questa storiella: tu (si, proprio tu) vuoi fare un'applicazione web che permetta di gestire la proprio collezione di sacchetti antigelo del freezer. Cominci a progettare, fai il tuo bel database (ce ne sarebbe da discutere anche sul database, ma rimando ad un prossimo post), crei la logica dell'applicazione, diciamo in java (ma fosse php sarebbe uguale, e comunque anche sulla logica approfondirò in un prossimo post) e poi, siccome ti senti molto cool, crei l'interfaccia grafica in una sola pagina, con tutte le interazioni ajax-based. Va tutto molto bene finchè non ti arrivano email di collezionisti di sacchetti di freezer inca*ati perchè non riescono a scambiarsi i link delle rispettive collezioni e ti accorgi anche che google non indicizza nulla delle collezioni presenti. Mh, qualcosa va storto.

Ora, permettetemi di presentarvi REST (Representational State Transfer), che non un'architettura di un sistema, piuttosto è una metodologia. Secondo i precetti rest ogni "risorsa" di un sistema è identificata da un URL. Per ora ci basta questo piccolo concetto, per un'analisi un pò approfondita seguite la wikipedia (anche se anche lì le idee sono forse un pò confuse).

Utilizzando il precetto rest, decidi quindi di suddividere quelli che sono i tuoi dati in "risorse": una risorsa è l'utente, subordinata ad essa ci sono la sua (per semplicità assumeremo che un utente abbia solo una) collezione di sacchetti per freezer e ovviamente sotto la collezione ci sono i singoli sacchetti.ah, e ci sono anche gli amici dell'utente. Ti ritrovi quindi ad avere uno schema di url fatto circa cosi:

utenti

myfreezer.net/{user}/

collezione

myfreezer.net/{user}/collection/

sacchetto

myfreezer.net/{user}/collection/{id}/

siccome il sito è social, la lista degli amici di un utente

myfreezer.net/{user}/friends/



Molto bene. Ora ogni risorsa ha il suo bel URL, ma perchè il trucchetto funzioni c'e' ancora bisogno di un paio di passaggi: in primis nella home page di myfreezer.net sar` necessario inserire la lista degli utenti (o almeno gli ultimi iscritti). Fatto questo ti renderai conto che siamo, in qualche modo, tornati un pò indietro: il server dovrà generare una pagina html per ogni risorsa. Vero, ma questo tipo di risorse non prevede e non necessita di abbellimenti o interazioni particolari: l'html generato per le risorse dovrebbe essere il più possibile scarno. Una cosa importante: per poter far funzionare tutto, in ogni risorsa si deve inserire un link alla pagina "applicazione" (o un redirect): una cosa del tipo "myfreezer.net/ajax/index.html?resource=myfreezer.net/cheng/collection". L'applicazione javascript deve controllare che nella request string ci sia l'indicazione della "resource" e modificarsi di conseguenza: nell'url che ho messo di esempio dovrebbe modificare l'interfaccia in modo tale da farmi visualizzare la collezione di sacchetti da freezer dell'utente cheng.

Qual'è il passo che molti, secondo me, ancora non hanno capito? la differenziazione tra i dati che vogliamo rendere accessibili e l'applicazione javascript. Nell'applicazione web di esempio, alla fine abbiamo reso disponibile il servizio in 2 modalità: una "pura" html, rest, in cui la navigazione è guidata solo ed esclusivamente tramite link (e form, per la modifica/creazione delle risorse), mentre l'altra ha una sfavillante interfaccia ajax. Fare solo una o l'altra oggigiorno non è abbastanza, almeno questa è l'opinione del sottoscritto.

Scriverò prossimamente sulla mia visione sui linguaggio per la logica di business e persistenza dei dati, fino ad allora spero di avere almeno messo il famoso tarlo nell'orecchio a qualche programmatore web.

Alla prossima!
cheng

sabato 10 novembre 2007

Dodge Custom Hello Kitty

Sono appena tornato dal pranzo e volevo rendere partecipe la comunità internettiana di una cosa curiosa:
avete presente la Dodge? sì, quella della pubblicità dove il tizio chiede aiuto all'altro tizio per caricare la batteria della macchina, gli dice di sfrizionare un pò e salta in aria.

Okkey, adesso immaginate la dodge;
prendete il volante e copritelo con del pelo rosa,
quindi passate ai coprisedili, rosa anch'essi, di hello kitty,
riempite qua e là con pupazzi vari,
infine colorate la macchina di rosa pallido..

Come ciliegina metteteci una bambina alla guida (oddio, sono quasi sicuro che fosse maggiorenne, dato che stava guidando, ma dalle fattezze non ci avrei giurato).

Beh, il mondo è bello perchè è vario!

fz



Blogged with Flock

mercoledì 1 agosto 2007

Moonk !

Get your own Moonk!

..ok, nonostante abbia una milionata di cose da fare/studiare/mettere a posto/ecc. , stasera ho trovato 5min. di tempo per settare un account su questo fantomatico "Moonk!": il solito servizio web 2.0 che permette di creare album di foto/video e musica e condividerlo con chiunque.

Siccome ho perso tempo a testarlo, ne perdo dell'ulteriore per creare un post con l'unico scopo di vedere com'e' il player in questione "embeddato" dentro blogger.

Detto questo saluti a tutti, vado a fare qualcosa di piu' produttivo (si, stavo pensando di andare a dormire ;) ).

il buon cheng

lunedì 9 luglio 2007

Primo post dal Dashboard-Widget

Ultimissime news: dato che sono pigro (molto pigro. Tanto. Non immaginate quanto), mi sono reso conto che uno dei fattori che mi blocca dall'aggiornare prontamente il mio blog è..che è lento.
Sì, lento: a caricare la pagina, a loggarsi, a scrivere e a postare.

Quindi ho trovato questo fantastico widget per la dashboard di OSX che mi permette di postare sul mio blog senza accedervi. C'erano delle alternative, ma sono tutte più o meno miseramente fallite.

Oggi ho deciso di fare la tesi, beh in realtà l'avevo deciso tempo fa, ma oggi ho deciso che è tempo di darsi da fare.. trovandolo, il tempo. Ma sì, in qualche modo lo si trova, eh!

Maman!

domenica 8 luglio 2007

Got a Mac!

Salve a tutti,
dopo il consueto periodo di silenzio stampa, torno con le ultime notizie sul cheng...
Innanzitutto il cheng adesso ha un portatile nuovo, un mac book pro nuovo fiammante.
Dopo quasi una settimana ho già provveduto a fare quasi tutte le schifezze che potevane essere fatte con siffatta macchina:
  • installato un tot di programmi (alcuni completamente inutili, ma sono bellissimi nella loro inutilità),
  • installato N virtual machines (beh, per ora un win XP, un win 2000 euna ubuntu 7.04),
  • installato bootcamp con win vista business
entro breve installerò anche alcuni tools di sviluppo specifici per macosx...a quale scopo, vi starete chiedendo? beh, non si sa mai. Magari è veramente la piattaforma del futuro :) .

Bene, passate le buone notizie è ora di dire che negli ultimi giorni non sono stato per niente bene: la mia gola -parole del medico- è in stati pietosi, e l'antibiotico che me la sta rimettendo a posto in realtà mi riempie la bocca di fastidiose piaghette e mi procura gioiosi mal di testa, che mi fanno compagnia durante la giornata.

In effetti perchè credete che stia scrivendo sul blog? è notoriamente un'attività che richiede poco sforzo cerebrale, quindi mi sembrava adatto per passare il tempo, in attesa che la novalgina faccia il suo effetto (ah, cosa farei senza la novalgina!)

Questo è quanto per la sezione "news", ciao a tutti!

domenica 29 aprile 2007

Riemersione!

Bentornati, dopo 8 giorni di dura immersione nel cinema asiatico nella fantastica cornice del Teatro Nuovo Giovanni da Udine, il bvz Cheng deve mestamente tornare a galla, fare un attimo i conti e ricominciare la vita standard edition.

E' l'ottavo anno che assisto al Far East Film Festival e questa è stata, a mio modesto parere, un'edizione di tutto rispetto: della trentina e passa di pellicole che mi sono sbafato molte erano piuttosto buone, ovviamente non sono mancate le ciofeche ma quelle sono presenti sempre e ovunque.
Se devo essere sincero l'aspetto più deludente è stata la scenografia: ho trovato piuttosto scadente la scelta di riempire le facciate del teatro con degli "smiles", ovviamente gialli. Probabilmente l'unica cosa che lega la scenografia al resto della manifestazione erano le altrettanto deludenti spillette che sono state vendute come gadget della manifestazione.

Come ogni anno il premio del pubblico mi ha lasciato perplesso (anche se devo ammettere che il primo classificato, "no mercy for the rude", non l'ho visto quindi non posso giudicare troppo); mi sento in dovere di esprimere il mio giudizio e allora annunciamo i vincitori dell'edizione 2007 del far east film festival:


Cheng Awards
  1. Memories Of Matsuko (Giappone 2006, 130')
  2. Tazza: the high rollers (Korea del Sud 2006, 139')
  3. The Host (Korea del Sud 2006, 119')


Cheng Nominations
  1. Sakuran
  2. Death Note
  3. The Case (China 2007, 87')


Per passare il tempo
  1. Dasepo Naughty Girls
  2. The restless
  3. Dynamite Warriors


Da non vedere
  1. Umizaru 2
  2. Arch Angels
  3. Big Movie (China 2006, 98')


..all'anno prossimo FEF!