Archivi tag: Java

tunnel-data

Hadoop e “Big Data”

Si dice che il 2014 sarà l’anno del Big Data… qualunque cosa questo significhi…

HadoopBig Data è una parola che va molto di moda, anche se ognuno di noi ha un’idea diversa sul suo significato. Analizzare “big data” significa estrarre conoscenza da grandi moli di dati, come possono essere i dati generati dal crawling di una gran quantità di siti internet, dai post nei social network di un gruppo cospicuo di persone, dalle variazioni di valore delle azioni in borsa nel corso degli anni per un numero consistente di titoli.

Il problema nasce proprio da qui… quanto grande ? che significa cospicuo ? 1 terabyte può essere considerato “big data” ? e 10 terabyte ?

Continua a leggere

Java

oAuthentication – Java

OAuth2oAuthentication è un plugin Java EE 6 per integrare in un’applicazione web i meccanismi di autenticazione oAuth 2 di Facebook o Google.

ll plugin richiede una configurazione molto semplice, da effettuare nel file web.xml dell’applicazione. Il modulo JAR include la maggior parte dei parametri di configurazione all’interno di un web-fragment.

Sono richiesti un container Java EE 6 o Java EE 6 Web Profile.

E’ possibile ottenere la libreria tramite Maven nel seguente modo:

</p>
<p style="text-align: justify;">it.nerdammer
oauthentication
1.0.5</p>
<p style="text-align: justify;">

Il file web.xml va configurato nel seguente modo:

</p>
<p style="text-align: justify;">oAuthenticationFilter
it.nerdammer.oauthentication.web.AuthenticationFilter</p>
<p style="text-align: justify;">DEFAULT_PROVIDER google
LOGIN_ERROR_PAGE /myErrorPage
FACEBOOK_APP_ID --get an app id from facebook--
FACEBOOK_APP_SECRET --the app secret from facebook--
GOOGLE_CLIENT_ID --get a client id from google app--
GOOGLE_CLIENT_SECRET --the client secret from google app--
oAuthenticationFilter
/web/private/*</p>
<p style="text-align: justify;">

Per informazioni sull’utilizzo si rimanda a Google Code.

Dependency injection fatta in casa

JavaVisto il moltiplicarsi dei framework per la dependency injection in Java negli ultimi anni (CDI, Guice…), sembra ormai scontato che questo pattern sia fondamentale per la realizzazione di applicazioni enterprise complesse.

Creare un dependency injector, al contrario, è qualcosa di molto semplice. Basta usare un po’ di refection.

Prendiamo un esempio: PrizeManager è una semplice classe che, dati degli utenti e dei premi, assegna questi randomicamente, informando un altro oggetto (MainController) dello stato delle cose.

package it.nerdammer;

import java.util.Collections;
import java.util.List;

public class PrizeManager {

	@Inject
	private MainController mainController;
	
	@Inject
	private List<User> users;
	
	@Inject
	private List<Prize> prizes;
	
	public void assignPrizes() {
		mainController.start();
		
		Collections.shuffle(users);
		Collections.shuffle(prizes);
		
		for(int i=0; i<users.size() && i<prizes.size(); i++) {
			// assegna i premi
			users.get(i).winPrize(prizes.get(i));
		}
		mainController.stop();
	}
}

Il compito del dependency injector è quello di impostare i riferimenti dei campi annotati con l’annotazione @Inject.

Continua a leggere

SimpleDateFormat: quante insidie

JavaProprio qualche giorno fa mi trovavo a parlare della proprietà lenient della classe SimpleDateFormat, cioè un booleano che, se lasciato al valore di default, permette di riconoscere come “date ben formate” giorni come il 31 febbraio 2012 o cose del genere. Ma le insidie dietro questa classe sono altre, e molto più gravi.

Leggendo la documentazione della classe si trova il seguente commento:

Date formats are not synchronized. It is recommended to create separate format instances for each thread. If multiple threads access a format concurrently, it must be synchronized externally.

Ebbene, quelli della Oracle consigliano di creare delle istanze separate della classe per ogni thread che la usa. Ma cosa succede se non si segue questo consiglio ?
Continua a leggere

Java Reflection Proxy

javaLa classe java.lang.reflect.Proxy è, senza troppi preamboli, la base di tutti i framework Java che si fondano sui principi della programmazione ad aspetti, e forse anche di tutti quelli che ne fanno a meno.

Attraverso questa classe, è possibile generare a runtime degli oggetti che implementano un determinato insieme di interfacce, anche se tali interfacce sono sconosciute al momento della compilazione o addirittura ancora non concepite dal programmatore. E’ attraverso questa classe che l’application server riesce a fornire una implementazione per gli EJB della nostra applicazione, arricchendo dei semplici metodi con funzioni definite dalle specifiche JPA, JTA, JMS, JNDI etc. etc.
Continua a leggere

Java Native Access (JNA)

Java Native AccessParliamo di una libreria davvero interessante che potrebbe risolvere non pochi problemi nel lavoro quotidiano: JNA, ovvero come utilizzare una DLL di Windows direttamente dal linguaggio Java. Java Native Access (JNA) è una libreria open source che permette di invocare funzioni presenti in librerie del sistema operativo in maniera molto rapida e con la scrittura di poche righe di codice.

A differenza delle librerie JNI (Java Native Interface), per utilizzare JNA non sono richiesti dei passaggi aggiuntivi di preparazione, come la generazione di file intermedi o la compilazione di codice nativo. JNA nasconde al programmatore tutti i dettagli “scomodi” per consentirgli di concentrarsi direttamente sull’obiettivo da realizzare. Al programmatore Java, infatti, è lasciato il solo compito di definire l’interfaccia delle funzioni esportate dalla libreria e queste divengono direttamente utilizzabili. Niente generazione di file di intestazione, niente scrittura o compilazione di codice nativo: solo scrittura di codice Java.

La “magia” diventa possibile attraverso la generazione automatica di stub per le interfacce native, eseguita da JNA al primo tentativo di utilizzo della libreria. Tali stub sono responsabili dell’effettiva traduzione dei tipi di dati (eseguono una conversione in entrambe le direzioni) e del collegamento al codice nativo da eseguire.

Ecco un esempio di codice Java che utilizza le librerie JNA per eseguire una chiamata ad una DLL definita in precedenza. Il codice presuppone che la libreria si trovi nel classpath dell’applicazione con nome “MiaLibreriaNativa.dll” ed abbia una funzione denominata “sayHello” con parametri e valore di ritorno “void”.

import com.sun.jna.Library;
import com.sun.jna.Native;
 
public interface LibreriaNativa extends Library {
    public static LibreriaNativa INSTANCE = (LibreriaNativa) Native.loadLibrary("MiaLibreriaNativa.dll", LibreriaNativa.class);
 
    public void sayHello();
}

Con tali accorgimenti è stata definita l’interfaccia Java LibreriaNativa la cui definizione è del tutto simile a quella della corrispondente interfaccia nativa definita nella libreria DLL. La variabile INSTANCE è lo stub generato da JNA (tramite il metodo loadLibrary della classe Native) che consente l’utilizzo della funzione esportata.

La libreria così “importata” in Java può essere utilizzata in maniera molto semplice attraverso le istruzioni seguenti.
Continua a leggere