domenica 30 agosto 2009

Applicare XSL:FO lato server per generare documenti


Molte applicazioni web hanno una fase di produzione di documenti, di reportistica.
Uno degli strumenti usati lato Java per ottenere ciò è l'applicazione dello standard XSL:FO ad esempio tramite la libreria gratuita Apache FOP.

Uno schema spiega bene come avviene la trasformazione in un caso abbastanza generico.

Il filtro XSL viene applicato a un XML (statico o generato dinamicamente, non importa) generando eventualmente un documento PDF sotto la supervisione della libreria Apache FOP.

Quando avrai capito un po' le basi, un tutorial più avanzato come questo (è necessaria una IBM id gratuita) ti servirà per i dettagli sui vari elementi. Generare liste, tabelle link, indici e complessi layout del documento sono alcuni degli argomenti di questo corso gratuito e molto interessante per chi voglia applicare XSL:FO.
Altri link utili possono sempre essere la "reference" fatta per esempi da zvon.org che fornisce uno o più modi di utilizzo quando si ha un dubbio su un tag.
Un altro tutorial interessante è quello di javaboutique, che propone 3 sezioni (13 pagine in tutto), la più interessante delle quali è probabilmente la terza riguardo all'inserimento di immagini statiche o dinamicamente generate.
Infine, trovo un po' dispersivo (ma immagino sia completo!) questo capitolo su XSL:FO...

Dopo queste segnalazioni,
aggiungo soltanto che i documenti XML sono molto puliti se li si tiene puliti.
Non dimenticarsi mai di indentazione, commenti, separazione delle sezioni renderà il tuo lavoro più semplice e più comprensibile a chi debba prenderlo in carico dopo di te.
Sono passato più di una volta per l'incubo di dover mettere mano a un documento XSL confuso per cambiare una tabella o una intestazione... non auguro a nessuno di passarci. :)

domenica 9 agosto 2009

ancora XSLT sul client?

Un punto di partenza per XSLT, oltre al documento ufficiale, può essere questa semplice pagina di esempi:
http://www.w3schools.com/xsl/xsl_w3celementref.asp
L'idea che c'è alla base è semplice e già consolidata: trasformare un documento xml in un altro documento (XML, HTML...), applicando un filtro.
Il filtro è un documento XML anche lui, che contiene un template con il quale seleziona elementi del documento sorgente e li trasforma, per poi eventualmente mostrarli nel documento risultante.
Il linguaggio per la selezione degli elementi si chiama XPath (alcuni esempi qui).
Supponendo che il documento XML d'origine contenga i dati, il "foglio di stile" XSLT dà la disposizione della struttura in una separazione contenuto/stile che è sempre tanto ricercata.
Tuttavia se la separazione HTML CSS funziona tanto bene... quella XML XSLT non sembra altrettanto adatta ai browser.

Nel lontano 2005 ero molto incuriosito dalle trasformazioni xml sul client e ho creato questo sito, che nel tempo poi ho trasformato varie volte, aggiungendo la libreria prototype e rendendolo molto più dipendente da ajax e controllo del DOM tramite javascript, che dalla vera trasformazione XSLT.
Il linguaggio infatti è ancora valido ma soprattutto per i suoi usi server-side. Il browser è più veloce a gestire le trasformazioni javascript, che sono anche supportate in maggior modo dai diversi browser sebben con tutti le piccole differenze delle varie versioni.
Si suppone che quello che arriva al browser sia già un documento da mostrare e non uno scheletro da trasformare, con pochissime eccezioni.
Quindi pur essendo divertente (e fattibile) l'idea di prendere un feed rss e trasformarlo on the fly sul proprio browser con un foglio di stile XSLT, questo rimane solo un esercizio di bravura, più che una applicazione reale. Sarà meglio affilare le unghie sul server e servire un documento già pronto per un browser. E se proprio ci si vuole sbizzarrire a cambiare qualche cosa nella visualizzazione CSS3 e Javascript possono fare miracoli.

Altre fonti:
Questo articolo di stackoverflow.com descrive bene in breve i problemi della trasformazione xslt sul client.
Una vera applicazione del XSLT sul client la potete comunque trovare qui (il foglio xslt se non lo trovate è questo)
Un bell'articolo per iniziare a mettere le mani su XSL (link)

Rimando il discorso alle trasformazioni xslt e xslfo sul server eventualmente a un'altra volta. Un buon punto di partenza per gli appassionati di Java cmq può essere questo articolo di o'Reilly

Imparare il giapponese sul web

Sono un grande appassionato di lingue e per ogni lingua il pc è un ottimo strumento di apprendimento. Seguono i siti che più aiutano nello studio del giapponese.
Fatemi sapere se conoscete qualche altro valido strumento a disposizione sulla rete.

http://www.guidetojapanese.org/
E' una grammatica e un corso con parecchio materiale. Non andate sulla versione in italiano che è molto più striminzita. La versione originale affronta tutti i temi fondamentali della lingua e ha esercizi per le varie sezioni.
C'è anche qualche capitolo sull'introduzione alla scrittura.

http://www.csse.monash.edu.au/~jwb/cgi-bin/wwwjdic.cgi?1C
Questo dizionario è fondamentale. Permette di cercare dall'inglese o dal giapponese, anche usando i romaji (ovvero la traslitterazione in caratteri occidentali delle parole giapponesi)

Per l'ascolto sicuramente c'è moltissimo materiale in giro. Io mi sono trovato molto bene con
http://www.japanesepod101.com
Ora il sito è a pagamento dopo la prima settimana per quasi tutti i contenuti. Il mio consiglio è di scaricare tutti gli mp3 presenti delle lezioni nella prima settimana di iscrizione. Ogni dialogo è seguito da una versione rallentata e da una versione con la traduzione in inglese di ogni frase. Dopo il dialogo vengono spiegati i vocaboli nuovi e un paio di regole di grammatica affrontate. Un podcast eccezionale.

http://tatoeba.fr/
Questo sito permette, quando si è imparata una parola nuova, di trovare frasi di esempio con quella parola. Può essere sempre utile sapere quando e come utilizzare un termine.

Per rivisitare le parole tramite dei quiz io uso la mia pagina web, dove mi sono costruito una sezione per imparare i vocaboli.
http://dado21780.altervista.org/imparaparole.xml
Ma la cosa più semplice è andare su un sito come
http://www.renshuu.org/
dove la gente crea quiz per vocaboli di ogni livello di difficoltà. Ci sono quanti quiz volete qui.

Per chi ha l'ipod touch o l'iphone, applicazioni gratuite come "kotoba", "wwwjdic" e le flashcards "kanji" (quest'ultima ora costa 79 centesimi) sono ottimi strumenti.

Due note:
1) i film sottotitolati sono sempre un ottimo mezzo per imparare. Se riuscite a trovare una buona fonte sul web bene, altrimenti il buon youtube funziona sempre
http://www.youtube.com/watch?v=05FSfZRSEHs

2) Non basta apprendere. Bisogna anche fare pratica. Leggere, ascoltare e vedere è importante. Ma se non si scrive e non si parla... sarete costretti ad ascoltare le conversazioni senza intervenire mai. :)

mercoledì 5 agosto 2009

Primo esempio Widget AIR 1.5

------------
Introduzione
------------


Partendo da una serie di demo statiche sviluppate in Flash, si voleva indagare sulla fattibilità e la eventuale semplcità di realizzazione di alcune funzioni in ActionScript3, da poter poi rilasciare in formato Widget AIR.

Ogni sezione comprende L'ARGOMENTO, LE CLASSI trovate per affrontarlo ed eventualmente qualche LINK di riferimento.
Ovviamente questa non è una copertura esaustiva degli argomenti.


------------------------
LINK UTILI (in generale)
------------------------
Documentazione
di classi Flash e AIR:
http://help.adobe.com/it_IT/AS3LCR/Flash_10.0/class-summary.html

Adobe AIR Labs:
http://labs.adobe.com/technologies/air/

Guida ufficiale di Adobe AIR:
http://help.adobe.com/it_IT/AIR/1.5/devappsflash/

Ottime risorse video per tutorial vari su AS3:
http://www.gotoandlearn.com

Una in particolare per MonsterDebugger, un ottimo strumento di debug:
http://www.gotoandlearn.com/play?id=109

---------
Argomento
---------

Caricamento RSS Feed Remoto.

Classi:
URLRequest e URLLoader per caricare un file remoto o in locale a seconda del path passato nel costruttore dell'URLRequest
Ascoltare l'evento COMPLETE per capire quando il file è stato caricato.
urlLdr.addEventListener(Event.COMPLETE, nomeFunzioneDaUsare);


---------
Argomento
---------


Mostrare in pagina parti feed XML caricato

Classi
1 - XML contenitore di un documento o di un nodo XML. XMLList come wrapper di un array di nodi.
var rssTest:XML = new XML(data);
var listTest:XMLList = rssTest.channel.item.children();

2 - TextField, TextArea da usare ad esempio per mostrare i testi ricavati. Aggiungere un eventListener per i link.
txt5.addEventListener(MouseEvent.CLICK, gotoLink);
function gotoLink(...){ navigateToUrl(new URLRequest(...)); }

3 - URLRequest e Loader per caricare e aggiungere un'immagine
var imgTip:Loader = new Loader();
imgTip.load(new URLRequest(imgTip_src));
addChild(imgTip);

Nota su RSS:

Il formato RSS è standard e tutti i feed hanno gli stessi elementi ma alcuni siti, ad esempio il NYT, utilizzano anche dei namespace aggiuntivi per dei tag loro specifici.

Il file XML di cui eseguire il parse quindi va controllato nel suo formato per sapere quali elementi contengono i contenuti desiderati.


---------
Argomento
---------

Caricare audio remoto e riprodurlo. Stream proprietari come realAudio e quickTime non sono facilmente riproducibili tramite Flash. Quanto c'è qui di seguito riguarda file mp3.

Classi:
- SoundLoaderContext (x il buffering), Sound, SoundChannel, SoundTransform
soundChannel = sound.play(0,0,soundTransform);

Link:
3 - esempio di discussione riguardo a RealPlayer in AIR - http://forums.adobe.com/thread/97714


---------
Argomento
---------


Caricare video remoto e riprodurlo. Gli esempi qui sotto si riferiscono allo standard Flash .FLV

Classi:
- Video, NetConnection, NetStream
video.attachNetStream(new NetStream(new NetConnection()));
- Caricare un video di Youtube equivale a importare un file swf esterno con Loader e URLRequest.
loader.load(new URLRequest("http://www.youtube.com/v/3DLF-yypNH4&hl=it&fs=1&"))

Link:
1 - Flash Media Server per soluzioni più complesse di gestione video - http://www.adobe.com/products/flashmediaserver/


---------
Argomento
---------


Inserire contenuti di siti internet esterni internamente al progetto in Flash.

Classi:
- HTMLLoader, URLRequest.
hloader.load(new URLRequest("https://www.poste.it/bancoposta/prestiti/prestito_online.shtml"));
hloader.width...
height...
addChild(hloader);


---------
Argomento
---------


Gestire l'HD, soprattutto per un'applicazione AIR.

Classi:
- File, URLRequest - Per il download consapevole dell'utente che sceglie una destinazione
testFile.download(urlReq)
- File, URLStream, URLRequest, ByteArray, FileStream - Per la gestione, un minimo più complessa del download dello stream in modo trasparente all'utente.


Nota:
Ho un esempio semplice per ognuna di queste funzioni se qualcuno è interessato.

Charts - Test per una web application.

SERVER SIDE

Ho messo su un esempio per ognuna di queste librerie citate tranne che per ILog, per la quale non è possibile al momento (23 luglio) nemmeno scaricare una versione shareware.

Qui sotto faccio un paio di commenti a ogni libreria.

JFreeChart + cewolf (link)

Ho provato JFreeChart + cewolf, con licenza LGPL

L'esempio che ho messo su con un tutorial crea un grafico casuale con dei dati generati in una servlet.

Permette una configurazione dei dati semplice e anche pulita in pagine JSP grazie alle librerie di tag già pronti.

non è ajax enabled. La pagina creata deve essere ricaricata interamente dal server. Questo può essere aggirato implementando una minima funzionalità ajax o come nell'esempio dove ho posto il grafico in un iframe che viene ricaricato per non causare il reload di tutta la pagina.

funzioni come zoom/pan non sono supportate dalla libreria.

Questa libreria sembra molto seguita e creare un line chart richiede molto poca configurazione e sforzo. Tuttavia i punti critici potrebbero renderla insufficiente.

Chart director (link) costa 499 per la redistribuzione

Viene creata un’immagine sul server che periodicamente viene scaricata.

Per testare l’esempio che allego lanciare la applicazione e andare su

/ChartDirectorTest/realtimedemo.jsp (o l'ultimo link in basso a sinistra se si parte dalla index dell'applicazione)

Per provarla ho modificato la demo del realtime in modo da permettere la scelta del valore 0.1 secondi nel menu a tendina della real time chart demo.

Sul mio pc sembra un po' lenta ma potrebbe darsi che è questo pc che si blocca un po' come in molte operazioni javascript

Permette anche la creazione dei grafici più disparati e permette zoom&pan

Tuttavia la creazione è un (poco) più complessa che nel caso di JFreeChart perché non ci sono tag già pronti (vedi il file realtimechart.jsp dell'esempio).

ILog (IBM) (link):

real-time ajax-enabled server charts

http://svdemo01.ilog.com/real-time-81/

Questa libreria commerciale permetterebbe aggiornamenti realtime.

La versione demo non è al momento disponibile e i prezzi non sono visualizzati. Il loro sito consiglia di richiedere informazioni e così ho fatto.

Le prime librerie che ho visto server side aggiornano il grafico caricando ogni volta una nuova immagine dal server. Per refresh frequenti allora forse è più utile una libreria javascript.

CLIENT SIDE

Tutte le librerie fondate su Jquery sono sotto licenza MIT O GPL.

Da quel che ho capito la GPL è quella "virale", però se la MIT va bene per uso commerciale possiamo usarle. Mi sembra che la MIT permetta l'uso commerciale purché si citi la licenza stessa della libreria usata (in modo che la licenza della libreria sia nota anche nel software nuovo).

Ho provato JQuery FLOT, le cui API sono a:

(link)

Modificando uno degli esempi statici nel loro pacchetto, ho ottenuto un grafico che si aggiorna ogni intervallo desiderato (nell'esempio mezzo secondo).

La creazione è con javascript a oggetti un po' più complesso del js-charts ma molto più pieno di opzioni. La grafica è più accattivante, consente lo zoom e il pan, ha dei tooltip cliccabili e offre funzioni per riprendere i valori dei dati inseriti nel grafico.

Un bell'articolo a riguardo:

http://www.michelem.org/2008/01/07/ajax-plotting-drawing-charts-using-jquery-and-flot/

Jquery Sparkline ha una licenza BSD ("roughly equivalent to MIT one")

(link)

Sparkline mi sembra decisamente più veloce nell'aggiornamento, tant'è che nell'esempio ho messo un refresh di 10 millesimi e l'animazione sembra fluida.

Ha meno funzioni di Flot soprattutto per gestire punti all'interno del grafico con label e click del mouse su di essi, però è più veloce.

jquery visualize

(link)

JQuery Visualize offre una semplice struttura tabellare di background al grafico che si crea. Mi sembra un po' più lento nell'attivare il refresh del grafico tramite

myChart.trigger('visualizeRefresh');

L'esempio che ho creato aggiorna il dom del documento con una nuova colonna (in teoria) ogni 100ms e aziona il refresh.

I tasti display e hide li ho messi per la tabella che eventualmente così può essere nascosta.

GWT Chronoscope

(link)

Ho mandato già un email a timepedia (sviluppatori di questa libreria) richiedendo informazioni sul tipo di licenza e su quanto costi la loro libreria per uso commerciale ma non ho avuto ancora risposta.

E' un progetto molto grande e pesante e a difficoltà il grafico si carica nel mio browser. Può gestire quantità massive di dati a quanto dicono loro, e sembra sicuramente la libreria più piena di funzioni. Ma se non si ha bisogno di tutte queste funzioni, eviterei di imparare una libreria così grande e pesante.


Una ottima lista a prima vista sembra quella a

http://www.datavisualization.ch/tools/13-javascript-libraries-for-visualizations/comment-page-1#comment-948