mercoledì 29 ottobre 2008

A new start :-)

Welcome to my new Tech blog...again :-)
After writing some posts in Italian, I thought that the best language for technical writings is English. Well, actually I already knew that, but I wanted to make some tech resources available in Italian. The fact is that no Italian developer searches for resources in Italian...they don't even think to search in Italian, they simply use English...
Obviously, as you may guess, I'm not a native English speaker, so I will probably make some mistakes...please be warned, and if you find one, please don't hesitate to point out ;-)

mercoledì 15 ottobre 2008

Grails e HtmlUnit

Nei giorni scorsi ho provato a fare qualche prova di web screen-scraping in un progetto Grails, utilizzando HtmlUnit 2.3.
Dopo aver creato una applicazione Grails di prova e aver messo tutti i jar della distribuzione di HtmlUnit nella cartella lib, ho provato a lanciare l'applicazione...ottenendo come risultato solo questa bella eccezione:

Error executing script RunApp: Class org.apache.xerces.parsers.AbstractSAXParser$AttributesProxy does not implement the requested interface org.xml.sax.Attributes
java.lang.IncompatibleClassChangeError: Class org.apache.xerces.parsers.AbstractSAXParser$AttributesProxy does not implement the requested interface o
rg.xml.sax.Attributes
at groovy.util.XmlSlurper.startElement(XmlSlurper.java:305)
...

Dopo qualche ricerca e qualche tentativo ho scoperto che il problema si risolve cancellando il jar xml-apis-1.0.b2.jar dalla directory lib.

Una volta avviato il server ho potuto testare la connessione ad un sito qualunque, (http://www.daviderossi.org/ ;-) ), creando una nuova action nel controller e stampando sulla console il risultato.

Prima di poter accedere al sito, ho però dovuto configurare un proxy, in questo modo:

WebClient webClient = new WebClient(BrowserVersion.FIREFOX_2, "proxy.it", 8080)
((DefaultCredentialsProvider) webClient.getCredentialsProvider()).addProxyCredentials("user", "password");

Le possibilità offerte da HtmlUnit sono moltissime, tra cui la possibilità di trovare gli elementi per nome, id o attraverso un percorso xpath, cosi come inviare form o cliccare link...
Il primo test che ho fatto è stato di collegarmi alla home page, individuare il link alla pagina 'Tecnologie', cliccarlo e leggere il contenuto della pagina come testo.
Il codice completo della action e' questo:

def provaHome = {
WebClient webClient = new WebClient(BrowserVersion.FIREFOX_2, "proxy.it", 8080)

(DefaultCredentialsProvider)webClient.getCredentialsProvider()).addProxyCredentials("user", "password");
HtmlPage homePage = (HtmlPage) webClient.getPage('http://www.daviderossi.org/')
println homePage.getTitleText()
def xpath = "//a[.='Tecnologie']"
def link = homePage.getByXPath(xpath)?.get(0)
HtmlPage resultPage = (HtmlPage) link.click()
def content = resultPage.getElementById("content")
println content.asText()

}

sabato 11 ottobre 2008

GIT, questo sconosciuto

Da qualche settimana sto usando GIT ( http://git.or.cz/ ), il sistema di controllo di versione iniziato da Linus Torvalds e usato in molti grossi progetti OpenSource, come Linux Kernel, Ruby on Rails e X.org.
Le idee che ne stanno alla base sono molto valide e innovative, ma l'uso è inizialmente tutt'altro che intuitivo.
GIT appartiene alla categorie dei vcs distribuiti, ossia permette ad ogni sviluppatore di avere un proprio repository locale nel quale committare tutte le modifiche. Questo repository locale (contenuto direttamente nella working directory) potrà poi essere sincronizzato con il repository di altri sviluppatori o, in modo più classico e simile a CVS e SVN, con un repository centrale condiviso.
GIT è veloce. Molto veloce. Al punto che a volte ci si chiede se abbia già finito o se non abbia neanche iniziato...(Non sto scherzando !) Molto più veloce di SVN, niente a che vedere con CVS...un altro ordine di grandezza.
E questo, assieme alla possibilità di sviluppare off-line e sincronizzarsi solo ogni tanto con gli altri sviluppatori e a un supporto molto potente al branching, è il suo punto di forza.