Livelli di logging e consigli per usarli

Non tutti sono soliti loggare cosa sta succedendo durante l’esecuzione di un’applicazione. E questo e’ il MALE, c’e’ poco da dire! Altri invece, pur loggando, non sanno mai quando loggare come trace, debug, info oppure warning, e spesso si ritrovano ad usare uno solo di questi valori, assieme al canonico error per segnalare l’accadimento di disastri.

Ho trovato su questo post una guida che puo’ aiutare a decidere “dove va cosa”:

ERROR: something terribly wrong had happened, that must be investigated immediately. No system can tolerate items logged on this level. Example: NPE, database unavailable, mission critical use case cannot be continued.

WARN: the process might be continued, but take extra caution. Actually I always wanted to have two levels here: one for obvious problems where work-around exists (for example: “Current data unavailable, using cached values”) and second (name it: ATTENTION) for potential problems and suggestions. Example: “Application running in development mode” or “Administration console is not secured with a password”. The application can tolerate warning messages, but they should always be justified and examined.

INFO: Important business process has finished. In ideal world, administrator or advanced user should be able to understand INFO messages and quickly find out what the application is doing. For example if an application is all about booking airplane tickets, there should be only one INFO statement per each ticket saying “[Who] booked ticket from [Where] to [Where]”. Other definition of INFO message: each action that changes the state of the application significantly (database update, external system request).
Continue reading

Sun Java JDK 1.6 su Ubuntu/Kubuntu 10.4

Versione di Ubuntu che installi, problemi con il Java che trovi. Dopo la deprecazione nella 9.10 del Java 1.5, in Ubuntu / Kubuntu 10.4 i pacchetti java made-in-sun (anche se ora dovremmo dire made-in-oracle) non sono piu’ presenti nei repository di default. Gli unici rimasti sono quelli OpenJDK (openjdk-6-jdk e openjdk-6-jre), che in genere vanno bene, ma a volte hanno problemi di funzionamento con programmi un po’ particolari ed hanno ancora performance lievemente inferiori rispetto alle implementazioni native.

Per poter accedere ai vecchi pacchetti Sun Java 6 (sun-java6-jre, sun-java6-jdk e tutti gli altri), occorre abilitare i repository Partner tra le sorgenti di installazione nel proprio package managar, come documentato in questo post. Oppure, in alternativa, lanciare il comando:
sudo add-apt-repository “deb http://archive.canonical.com/ lucid partner”

Fatto questo, una semplice ricerca e installazione dei pacchetti sun-java6-jre oppure sun-java6-jdk e dipendenze varie dovrebbe bastare.
sudo apt-get update

sudo apt-get install sun-java6-jdk

Occorre poi riconfigurare la jdk usata dal sistema. Ottenere prima una lista di quelle esistenti con il comando:
update-java-alternatives -l
e poi impostare quella sun con
sudo update-java-alternatives -s java-6-sun

Altre informazioni molto esaurienti in questo post, compresa l’installazione del java plugin per Firefox.

Continue reading

Java 1.5 su Ubuntu 9.10

Java 1.5 in Ubuntu 9.10Chi ha effettuato una nuova installazione o un aggiornamento a Ubuntu / Kubuntu / Xubuntu 9.10 e sviluppa in Java, avra’ notato l’assenza dei pacchetti riguardanti jdk e virtual machine per Java 1.5 (package java-5-sun, java-5-open eccetera).

Il motivo di questa esclusione e’ da ricercarsi nella “messa in cantina” da parte di Sun di JavaSE 1.5, a partire dal 3 Novembre, come spiegato in questo articolo: J2SE 5.0 End of Service Life Notice.

Per ovviare al problema, la soluzione non proprio piu’ pulita, ma funzionante, e’ quella di aggiungere i precedenti repository della Ubuntu 9,04 Jaunty mediante il comando:

echo deb http://it.archive.ubuntu.com/ubuntu/ jaunty multiverse | sudo tee -a /etc/apt/sources.list.d/javase5.list

Successivamente, bastera’ lanciare un

sudo apt-get update
sudo apt-get install java-5-sun

A questo punto, l’output del comando

sudo update-java-alternatives -l

dovrebbe mostrare le due versioni di java disponibili, tra le quali scegliere quella da usare nel sistema e impostarla con il comando

sudo update-java-alternatives -s java-1.5-0-sun

Altre informazioni sono disponibili sulle solite guide per Ubuntu

Continue reading

AvatarGrabber: social network scraping, Java e Funambol

AvatarGrabber screenshot
L’open source mi appassiona, il mondo mobile lo adoro, la programmazione e’ il mio passatempo preferito: trovare un connubio tra questi elementi sembrerebbe quasi impossibile. Ma basta guardarsi bene intorno e qualcosa di fantastico invece lo si trova: Funambol.

Un’entità tutta strana a partire dall’idea: capitali USA, centro ricerca e sviluppo in Italia, modello di business basato sull’open source applicato al mondo del mobile: il prodotto di punta, infatti, e’ un server capace di offrire funzionalità di posta push e sincronia di email, calendario e contatti praticamente sulla maggior parte dei dispositivi esistenti: Windows Mobile, Symbian, iPhone, iPod, Android, Blackberry e chi piu’ ne ha piu’ ne metta. Il tutto rilasciato sotto licenza AGPL 3.

Ma le stranezze non finiscono qui: mi ha accolto un individuo con il ruolo istituzionale di “community manager”, una figura (ancora) sconosciuta ai piu’, hanno creato e supportano una community di sviluppatori attorno al loro prodotto e sono promotori dei Code Sniper, ovvero moduli software la cui realizzazione viene affidata a volenterosi collaborati esterni, retribuiti per questo loro lavoro. E qui arrivo io.

Attirato da alcuni studi che avevo fatto per lo scraping dei dati dei profili utente sui social network, ho notato come uno dei loro Code Sniper cadesse proprio a pennello. E cosi’ e’ nato AvatarGrabber, un programma che cerca e associa gli avatar ai contatti della propria rubrica, presa ovviamente da un server Funambol.

Continue reading

Leggere e scrivere un elemento in un file XML

Snippet di codice banale, ma l’avro’ usato mille volte per leggere / scrivere un valore in un file XML

Il file XML (Crypto.xml)

<?xml version="1.0" encoding="utf-8" ?>
<CrypTool>
   <Language>german</Language>
   …
</CrypTool>

SNIPPET PER LA LETTURA

XmlDocument doc = new XmlDocument();
doc.Load("CrypTool.xml");
XmlElement root = doc.DocumentElement;
selLang = root.SelectSingleNode("./Language").InnerText;

SNIPPET PER LA SCRITTURA

selLang = "stringa da salvare";
//save to CrypTool.xml
XmlDocument doc = new XmlDocument();
doc.Load("CrypTool.xml");
XmlElement root = doc.DocumentElement;
XmlNode node = root.SelectSingleNode("./Language");                
node.InnerText = selLang;
doc.Save("CrypTool.xml");

Continue reading

Java: Image conversion to byte[] array

Convertire un byte array (byte[]) in un oggetto Image e’ molto semplice:

	private Image convertToImage(byte[] source){
	Image objImage = new Image(source);
	return objImage;
}

Il contrario invece, convertire un oggetto Image in un byte[] non e’ proprio cosi’ immediaito. Ecco lo snippet che uso, che carica direttamente da una URL un’immagine e la memorizza in un byte[]. comodo magari da usare successivamente all’interno degli elementi di una jList.

private byte[] loadImageFromURL(String strUrl){
	int intPos;
	String strFileExt;

	//guess file extension
	intPos = strUrl.lastIndexOf(".");
	if (intPos >= 0){
		strFileExt = strUrl.substring(intPos + 1);
	}else{
		//assign default jpg extension
		strFileExt = "jpg";
	}

	try {
		//load the image from the Internet
		ImageIcon objImageIcon = new ImageIcon(new URL(strUrl));

		//wait the loading of the image
		MediaTracker objMediaTracker = new MediaTracker(lstContacts);
		objMediaTracker.addImage(objImageIcon.getImage(), 0);
		objMediaTracker.waitForID(0, 5000);

		//convert the image
		BufferedImage objBI = new BufferedImage(objImageIcon.getIconWidth(), objImageIcon.getIconHeight(), BufferedImage.TYPE_INT_ARGB);
		Graphics2D g2 = objBI.createGraphics();
		g2.drawImage(objImageIcon.getImage(), 0, 0, null);
		ByteArrayOutputStream baos = new ByteArrayOutputStream();
		ImageIO.write(objBI, strFileExt, baos);

		return baos.toByteArray();

	} catch (MalformedURLException ex) {
		Logger.getLogger(MainForm.class.getName()).log(Level.SEVERE, null, ex);
		return null;
	} catch (IOException ex) {
		Logger.getLogger(MainForm.class.getName()).log(Level.SEVERE, null, ex);
		return null;
	} catch (InterruptedException ex) {
		Logger.getLogger(MainForm.class.getName()).log(Level.SEVERE, null, ex);
		return null;
	}
}

Continue reading

Naming guidelines utili nella programmazione

naming-guidelines.png
Programmando in un team, prima o poi si sente l’esigenza di adottare uno standard nella nomenclatura delle entita’ su cui si lavora: codice all’interno dei sorgenti, tabelle, viste, report, file del progetto e molto altro. Inoltre, anche se non si è in team, abituarsi a leggere e scrivere codice che segue certe convenzioni largamente adottate, aiuta nel momento in cui ci si approccia a sorgenti altri o code snippet pubblicati sulla Rete che utilizzano quelle convenzioni.

La scelta di queste naming guidelines, o linee guida per la nomenclatura, puo’ seguire diverse filosofie di pensiero, ognuna con i propri pro e contro. Alcune direttive comunque, consigliate da grossi big del settore, raccolgono sicuramente piu’ proseliti rispetto alle altre.

Nell’MSDN Microsoft, ad esempio, si trova molto materiale a proposito. Consiglio la lettura delle Naming Guidelines per .Net Framework, che affronta molti argomenti come i capitalization styles, l’uso di maiuscole e minuscole (case sensitivity), scelta delle parole, abbreviazioni e tutta una serie di consigli per assegnare nomi a classi, tipi enum, array, proprieta’, eventi e molto altro. Se poi non si conoscono il CamelCase o il PascalCase, Wikipedia aiuta, come sempre. E pensare che una volta consigliavano l’Hungarian notation.

Continue reading