java
Android

Stamattina mi sono ritagliato un paio d'ore per provare l'applicazione della settimana, ovvero Android.
Mi sono dunque scaricato l'sdk per linux. Google segnala che l'sdk funziona solo per architetture i386 quindi mi sono un pelo spaventato, ma alla fine ho visto che gira bene anche sulla mia Ubuntu Gutsy x86_64.
Quello che ho voluto provare è scrivere il classico HelloWorld senza usare eclipse.
Android infatti viene rilasciato anche con un comodo plugin per eclipse che vi guida dalla scrittura al deploy sull'emulatore.
Io non uso eclipse, come sempre il buon vi e la bash bastano e avanzano. Anzi permettono di capire meglio come funziona il tutto.
Una volta scaricato e scompattato l'sdk, nella directory tools/ si trovano un po' di programmi da lanciare da riga di comando.
Il primo da usare è uno script python che crea la struttura delle directory e lo stub della classe che conterrà il codice scritto:
$ ./activityCreator.py --out HelloGtrev it.gtrev.android.hello.HelloGtrevAdesso andiamo ad editare la classe generata:
$ cd HelloGtrev/src/it/gtrev/android/hello/
$ gvim HelloGtrev.javaLa classe inialmente si presenta così:
package it.gtrev.android.hello;
import android.app.Activity;
import android.os.Bundle;
public class HelloGtrev extends Activity
{
/** Called with the activity is first created. */
@Override
public void onCreate(Bundle icicle)
{
super.onCreate(icicle);
setContentView(R.layout.main);
}
}Adesso è molto semplice aggiungere il nostro codice:
package it.gtrev.android.hello;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
public class HelloGtrev extends Activity
{
/** Called with the activity is first created. */
@Override
public void onCreate(Bundle icicle)
{
super.onCreate(icicle);
// il codice per visualizzare il nostro hello world
TextView tv = new TextView(this);
tv.setText("Ciao Mondo! (anche dall'Italia)");
setContentView(tv);
}
}A questo punto dobbiamo compilare la classe. Per fare questo è sufficiente usare ant e il comodo build.xml creato per noi dallo script python. Ant creerà nella directory bin/ un file chiamato HelloGtrev.apk. Questo file contiene l'applicazione.
Per provarlo ci affidiamo all'emulatore contenuto sempre nella directory tools:
$ ./emulator &
Il comando precedente lancia l'emulatore (vi apparirà un telefonino che assomiglia tanto ad un treo); ora non ci resta che copiare l'applicazione con il comando adb presente sempre nella directory tools:
$ ./adb install HelloGtrev/bin/HelloGtrev.apk

Il risultato lo vedete qua sopra.
- gtrev's blog
- 6 comments
- Read more
- 1664 reads
Parancoe: i controller
Scrivo qui un breve tutorial su come definire un controller per Parancoe. A breve una versione in inglese sul sito del progetto (Lucio te lo prometto ;) )
Update 2007-10-02 12:55:00: If you want the English version of this tutorial follow this link
Definizione
Per definire un controller in Parancoe i passi da compiere sono due:
- scrivere la classe del controller
- definire in parancoe-servlet qual è il package nel quale il controller si trova.
Supponiamo di dover creare un controller che gestisca le chiamate alle url del tipo "/admin/*.html". Definiamo la classe AdminController in questo modo:
package org.parancoe.basicWebApp.controllers;
public abstract class AdminController extends BaseMultiActionController {
...
}BaseMultiActionController è una classe di Parancoe che estende MultiActionController aggiungendo utilità per il logging e la gestione degli errori.
Una volta definito il controller, per agganciarlo al corretto url è sufficiente mettere l'annotazione @UrlMapping("mia_url") in questo modo:
package org.parancoe.basicWebApp.controllers;
@UrlMapping("/admin/*.html")
public abstract class AdminController extends BaseMultiActionController {
...
}Autodiscovery
A questo punto è sufficiente inserire la seguente riga nel file parancoe-servlet.xml:
<define-controllers
basePackage="org.parancoe.basicWebApp.controllers"
parent="abstractController" />Parancoe si occuperà di andare ad analizzare i controller definiti in basePackage e a caricarli nel contesto di Spring. Inoltre registrerà il mapping definito dall'annotazione.
Le annotazioni
Le annotazioni che si possono utilizzare per definire il mapping sono tre:
- @UrlMapping: riceve una stringa che contiene la definizione di un'url;
- @MultiUrlMapping: premette di definire più mapping per lo stesso controller
- @DefaultUrlMapping: questa annotazione non prevede alcun parametro e serve ad indicare a Parancoe di usare il metodo di default per la definizione del mapping.
Per quanto riguarda l'ultima annotazione, il metodo di default definisce il mapping a partire dal nome del controller: così AdminController mapperà su /admin/*.html, mentre MioFantasticoController su /mio/fantastico/*.html.
(e adesso forse è più chiaro a cosa servisse il metodo uncamelize che avevo descritto qualche tempo fa).
Alcune note finali
E' ancora possibile definire i propri controller all'interno del file parancoe-servlet.xml.
Si deve però avere l'accortezza di usare come id il nome completamente qualificato del controller, così da sovrascrivere la definizione costruita dall'autodiscovery.
Happy parancoing!
- gtrev's blog
- Aggiungi un commento
- Read more
- 1382 reads
Spezzare una parola in CamelCase

Il camelcase come ci ricorda wikipedia:
[...] è la pratica di scrivere parole composte o frasi unendo tutte le parole tra loro, ma lasciando le loro iniziali maiuscole. Il nome (letteralmente "carattere a cammello") deriva dai "salti" all'interno di una parola, che fanno venire in mente le gobbe di un cammello. [...]
Il camel case è molto usato dai programmatori Java perché è la convenzione ufficiale di Sun per la scrittura dei nomi di classe e di variabile.
Detto questo, può capitare di voler prendere una parola in camel case e separarla nelle sue componenti. Confesso di aver cercato un po' su internet ma di non aver trovato del codice già pronto, quindi ecco di seguito il metodo che mi sono
scritto.
L'idea è semplice:
prendo gli indici di dove sono le lettere maiuscole e spezzo le parole secondo questi indici.
Per fare questo mi viene in aiuto il pattern matching e precisamente il pattern che rappresenta le lettere maiuscole nel character set unicode, cioè \p{Lu}.
Il codice è qua di seguito:
List<Integer> idxList = new ArrayList<Integer>();
//\p{Lu} is the unicode pattern for capital letters
Pattern p = Pattern.compile("\\p{Lu}");
Matcher m = p.matcher(camelString);
//find all occurrences of an uppercase letter and
//put their position in a list
while(m.find()){
idxList.add(m.start());
}
Una volta ottenute le posizioni è sufficiente usare il metodo substring sulla stringa considerata, avendo cura di usare gli indici appena ricavati.
Allego al post la classe completa.
- gtrev's blog
- 8 comments
- Read more
- 2217 reads
Java and compiz issue reprise

Do you remember of the problems between java and compiz that I talked about in a recent post?
I thought I solved them by using a recent version of the jdk (precisely 1.6.0_02 build 05) but I was wrong.
It seems that some weird behaviors are still present, for example when netbeans displays a JDialog.
I found another bug for this problem, which is still work in progress, precisely 6509038.
A german user commented on the bug that this issue is still present in jdk6 update 2 but not in jdk7. Yes you read it right.
jdk7 is still under development, but developers produce weekly snapshots at this site.
So I downloaded and installed the linux version (amd64 of course), configured netbeans to use this jdk and magically everything started working fine!
So if you don't fear of using a jdk under development and you are bored of weird issues on netbeans GUI, give jdk7 a try!
By the way, I'm using netbeans 6.0M10 and jdk7 which are both development versions and they are pretty stable! Kudos to both development teams!
- gtrev's blog
- Aggiungi un commento
- 1299 reads
Parancoe: Url Mapping
Nell'ultima settimana ho cercato di capire come funziona il meccanismo di url mapping di Spring, ovvero la parte dello stack MVC che permette di mappare una richiesta HTTP verso l'opportuno controller.
La cosa ovvia è che del tutto si occupi la servlet che fa da front controller (DispatcherServlet), visto che a questa arriva la HttpRequest, meno ovvio è il modo con cui la servlet opera.
Analizzando il codice di Spring (viva l'open source!) ho capito che la servlet demanda la repsonsabilità di determinare il corretto controller ad una opportuna istanza di HandlerMapping.
Vi risparmio la dimostrazione di questa asserzione, fidatevi.
Quello che è importante è che per gestire il corretto instradamento dela richiesta HTTP al controller basta registrare un opportuno oggetto di tipo HandlerMapping.
HandlerMapping è un'interfaccia che contiene un unico metodo, getHandler, che ritorna sia l'handler che gli interceptors registrati per la richiesta HTTP.
Quindi la retta via da seguire adesso è quella di realizzare un HandlerMapping per Parancoe!
- gtrev's blog
- 3 comments
- 1339 reads
Parancoe is moving

Parancoe, the open source project promoted by Jug Padova is moving.
All the code base is now on googlecode.
So if want to check it out you have to point your svn client to:
svn checkout http://parancoe.googlecode.com/svn/trunk/ parancoe
The main reason for this migration is that we didn't feel very comfortable with java.net services. Let me explain.
Java.net is a great site and there are many important projects hosted there, but it's too many times down for maintenance.
In addition to this we didn't get a lot of feedback when we asked if we can add additional services like continuum integration.
The general feeling is that java.net is lacking improvements. We hope that the new course of Sun will speed up the development on this site.
In the mean time we will use googlecode.
We bought (better to say that Lucio bought) a domain so if you want more information on the project point your browser to parancoe.org.
Maybe in parancoe.org we can host a sort of planet, like planet.debian.org, which aggregates the blogs of the team members (when they write about parancoe of course ;) ).
I have to ask to seesaw team which is hosting the site. Maybe saying to Paolo that he is not able to do it... ;)
- gtrev's blog
- Aggiungi un commento
- Read more
- 1372 reads
Java and compiz issue

As you may know, I've installed compiz on my linux box, and I feel very comfortable with it.
But sometimes I stumble on some weird problems when using java applications like Netbeans.
The problem is that windows don't dispose very well, all that you see is a gray screen with nothing on it.
This seems to be a well known issue (see bug 6429775) on jdk:
the problem is that AWT filters out all ConfigureNotify if the toplevel is not reparented.
But Compiz doesn't reparent windows at all.
Possible solution would be detect if we are under Compiz and do not filter eventsfrom the discussion on bug 6429775
There is a patch in new releases of jvm, so if you experience this problem, try to upgrade to sun jdk 1.6.0 u02.
- gtrev's blog
- 4 comments
- 1710 reads



17 weeks 4 days ago
31 weeks 1 giorno ago
37 weeks 6 days ago
46 weeks 5 days ago
49 weeks 5 days ago
51 weeks 3 days ago
1 anno 3 weeks ago
1 anno 4 weeks ago
1 anno 30 weeks ago
1 anno 30 weeks ago