Post

Visualizzazione dei post da luglio, 2012

Java, il linguaggio di programmazione più usato al mondo

DOMANDA: Quanti programmatori Java esistono al mondo? RISPOSTA: Consultando il sito della Oracle  possiamo stupirci del numero di programmatori Java esistenti al mondo: ben 9 milioni ! Wikipedia ne dichiara 10 milioni , ma una stima forse più realistica è quella di NumberOf.net  che parla comunque di  9.007.346 . Qualunque sia il risultato esatto la vera notizia è che Java si afferma come linguaggio più utilizzato al mondo ! Altri numeri interessanti sono: Un bilione di download all'anno (quindi cir ca 1.000.000.000.000/anno) Tre bilioni di dispositivi su cui gira Java  (quindi cir ca 3.000.000.000.000) Sul 97% degli Enterprise Desktop gira Java Sul 100% dei player Blue-Ray c'è Java Numeri da capogiro cresciuti soprattutto da quando, nel 2007, Java è passato all' open source . Con questa bella notizia per tutti i programmatori Java , vi annuncio la pausa estiva di Agosto in cui non verranno pubblicati nuovi articoli. Ci rivediamo

JFreeChart: statistiche e grafici in Java

DOMANDA: Come si creano grafici e statistiche in Java? RISPOSTA: Uno dei possibili modi per creare  velocemente  statistiche e grafici in Java è utilizzando JFreeChart , una libreria che, con pochi sforzi, ci permette di ottenere dei buoni risultati. Per far funzionare l'esempio abbiamo bisogno delle seguenti librerie: - jfreechart- 1.0.14 .jar (scaricabile da qui ) - jcommon- 1.0.17 .jar (scaricabile da qui ) (le versioni indicate sono quelle utilizzate nell'esempio) Qualora non importassimo le librerie JCommon incorreremo nel seguente errore: The type org.jfree.util.PublicCloneable cannot be resolved.         It is indirectly referenced from required .class files Guardiamo ora come, in un unico esempio di Test , riusciamo a stampare tre file ( istogramma.jpg, torta1.png, torta2.png ):  package statistiche; import java.io.File; import java.io.IOException; import org.jfree.chart.ChartFactory; import org.jfree.chart.ChartUtilities; import org.jfree.chart.JFree

Caricamento di immagini multiple

DOMANDA: Come posso caricare immagini multiple in un'interfaccia grafica Java? RISPOSTA: Prendendo spunto dalla domanda fatta nel post Caricamento di immagini , vi mostrerò ora come caricare immagini multiple . Le differenze sono sostanzialmente nella creazione di un oggetto Immagine dedicato ed alla gestione di un numero dinamico di immagini.  Vediamo la nuova classe Immagine.java : package immagini; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.io.File; import javax.imageio.ImageIO; public class Immagine { private static long count = 0; private long id ; private BufferedImage image ; private int x ; private int y ;     // "imagePath" è il path dell'immagine da caricare     // x e y sono le coordinate dell'immagine public Immagine(String imagePath, int x, int y) { this .image = loadImage(imagePath); this . x = x; this . y = y; this . id = count ++;

Check compatibilità Java Virtual Machine

DOMANDA: Come posso controllare se la versione della Java Virtual Machine (JVM) installata è compatibile con il mio programma? RISPOSTA: Per controllare la versione della Java Virtual Machine   (JVM) installata e informare l'utente dell'incompatibilità con il nostro programma, possiamo usare uno script batch basato sulla major.minor version delle distribuzioni di Java . Nel caso in cui provassimo ad eseguire un jar compilato con Java 7 su una JVM 6 , riceveremmo la seguente eccezione : Exception in thread "main" java.lang.UnsupportedClassVersionError : NomeClasseMain: Unsupported major.minor version 51.0         at java.lang.ClassLoader.defineClass1(Native Method)         at java.lang.ClassLoader.defineClassCond(Unknown Source)         at java.lang.ClassLoader.defineClass(Unknown Source)         at java.security.SecureClassLoader.defineClass(Unknown Source)         at java.net.URLClassLoader.

Servlet 3.0: @WebServlet

DOMANDA: Come si configurano le Servlet 3.0 con l'Annotation @WebServlet? RISPOSTA: Le Servlet 3.0 possono essere configurate in modo tradizionale aggiungendo le seguenti righe al web.xml : <servlet>    <servlet-name> MiaServlet </servlet-name>    <servlet-class> it.blogspot.lancill.TestServlet </servlet-class>    <init-param>        <param-name> parametro1 </param-name>       <param-value> http://lancill.blogspot.it </param-value>     </init-param>  </servlet>  <servlet-mapping>     <servlet-name> MiaServlet </servlet-name>     <url-pattern> /servlet/* </url-pattern>  </servlet-mapping> Con questa configurazione la nostra Servlet , di nome MiaServlet , riceverà un parametro di inizializzazione ( parametro1 ) valorizzato con " http://lancill.blogspot.it " e risponderà a qualunque url che comincerà per " /servlet/" . Quindi se d

Creare Thread in Java

DOMANDA: Cos'è e come si crea un Thread?  RISPOSTA: Il Thread  è una parte di un processo che può essere lanciata parallelamente ad altre sottoparti per riuscire a concludere il processo iniziale in un tempo minore.  Supponiamo che un processo sia fatto da due metodi che impiegano rispettivamente 10 e 7 secondi ad essere completati. In linea teorica se questi due metodi fossero lanciati in due Thread paralleli, il tempo totale sarebbe di 10 secondi (cioè il tempo massimo impiegato da uno dei due) invece dei 17 che impiegherebbero se eseguiti in sequenza. Esistono due modi per creare un Thread : estendere la classe java.lang.Thread o implementare l'interfaccia java.lang.Runnable . Il vantaggio di utilizzare Runnable è quello di lasciarci la libertà di estendere qualunque altra classe. Ricordiamo infatti che Java non consente l'ereditarietà multipla.  Calcola1 è un Thread creato estendendo la classe Thread : package  thread; public class Calcola1 ex

Apache Tomcat: modificare la porta HTTP/HTTPS

DOMANDA: Ho installato Apache Tomcat sulla porta di default 8080, c'è modo di modificarla senza reinstallarlo? RISPOSTA: Si è possibile.  Per modificare la porta HTTP di Tomcat , ovvero la porta su cui il webserver Apache risponde alle richieste HTTP , è necessario modificare il file di configurazione server.xml , presente nella cartella conf del path di installazione (di solito è  C:\Programmi\Apache Software Foundation\Tomcat 7.0\conf\server.xml ). In questo file troviamo, tra le tante configurazioni, queste righe: <!-- <Connector executor="tomcatThreadPool" port=" 8080 " protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> --> Modificando il valore 8080 possiamo modificare la porta di ascolto di Tomcat per le richieste HTTP . Per modificare la porta HTTPS il procedimento è analogo, ma interessa le righe subito in basso alle precedenti: <!-- <Connec

Eclipse: Font Size

DOMANDA: Come si cambia la dimensione dei caratteri del codice in Eclipse? RISPOSTA: La domanda di oggi nasce dall'esigenza tipica nata durante le lezioni o le presentazioni di codice al pubblico che puntualmente non riesce a leggere nemmeno una riga a causa delle dimensioni di default di Eclipse troppo ridotte. Per modificarle è sufficiente seguire questi passi: 1. selezionare dal menù Window -> Preferences -> General -> Appearance -> Colors and Fonts ;  2. selezionare la prospettiva e la categoria da modificare  dalla lista a destra. N el nostro  esempio Java ; 3. selezionare Java Editor Text Font ; 4. cliccare il tasto  Edit sulla destra; 5. selezionare tipo, stile e dimensione del Font ; 6. cliccare OK . Seguiti questi passi il pubblico potrà finalmente ammirare (e criticare) il vostro codice senza alcun dubbio visivo! Nella stessa finestra possiamo modificare anche altre opzioni come lo sfondo , le labels , ecc...,

Eclipse: Shortcuts (scorciatoie) da tastiera

DOMANDA: Quali sono le shortcuts di Eclipse più utili? RISPOSTA: Usare le shortcuts  da tastiera migliora di molto le prestazioni di un programmatore. Di seguito sono elencate le shortcuts di default, fermo restando che potete sempre cambiarle o aggiungerne di personalizzate (in fondo al post vediamo come). Vediamo alcune delle più utili: Ctrl + spazio Autocomplete, ossia mostra i suggerimenti della parola che state scrivendo. Ctrl + 7 Commenta/Decommenta la riga corrente o la selezione di codice in blocco. Ctrl + Click Eseguito sul nome di un metodo o di una classe, apre la finestra in cui si trova il metodo o la classe ed il cursore si sposta esattamente al punto desiderato. Ctrl + Shift + R Refactoring, ossia rinomina la variabile selezionata ovunque nel workspace aggiornandone i riferimenti. Ctrl + H Cerca il testo selezionato all'interno del workspace. Utile ad esempio per sapere dove un setter o getter viene chiamato. Tab/Shift + Tab Ind

Strutture dati: List, Set, Map

DOMANDA: Che differenza c'è fra List, Set e Map? Quale devo usare? RISPOSTA: Un Data Structure è una struttura ottimizzata per collezionare dati. List e Set sono strutture dati che estendono Collection mentre Map vive indipendentemente.  Una Collection è un contenitore di un insieme di valori, una sorta di array dinamico. A seconda dell'utilità, si possono usare diverse implementazioni dell'interfaccia Collection. Essa infine può essere tipizzata , ossia contenere solo dati di un certo tipo, tale tipo si indica attraverso i Generics (indicandolo fra parentesi angolari). Siccome il tipo è un oggetto , per esprimere primitivi come int  bisogna usare i wrapper come Integer . List Contiene dati ordinati. I duplicati sono permessi. Aggiunge un elemento: add(Object obj). Accede ad un elemento: get(int index). Rimuove un elemento: remove(Object obj) o remove(int index). Le List servono nel caso in cui i dati possano essere duplicati.  Due c

JNI: Richiamare DLL .NET da Java

DOMANDA: In Java è possibile chiamare delle funzioni contenute in una DLL .NET? RISPOSTA: Anche se limita fortemente l' indipendenza dalla piattaforma tipica di questo linguaggio, in Java è possibile richiamare i metodi contenuti all'interno di una DLL grazie alle librerie Jni4Net . Tali librerie permettono la creazione metodi ponte (bridge o proxy) attorno alla classe C# richiamabili da Java che si occupano della trasformazione dei dati nella comunicazione tra i due linguaggi. Vediamo come possiamo risolvere il nostro problema: Prerequisito : Avere installato e configurato correttamente il Java Development Kit (qui usiamo la versione 7 update 5 del JDK) e il compilatore C# csc.exe (disponibile anche in VisualStudio). Seguiamo attentamente le operazioni elencate di seguito: 1. Scarichiamo le librerie BIN  jni4net   (qui utilizziamo la versione 0.8.6 ) 2. Scompattiamo il file compresso appena scaricato 3. Entriamo nella cartella s

ExecutorService: Eseguire Thread a gruppi di N

DOMANDA: Come posso schedulare i Thread affinché siano eseguiti a gruppi di N? RISPOSTA: Esiste un oggetto della classe java.util.Concurrent chiamato ExecutorService che risolve il problema in poche righe di codice. Vediamo un esempio in cui vogliamo svolgere dieci operazioni (ciascuna della durata di mezzo secondo)  eseguendole a gruppi di 2 . Classe Operazione : package executorservice; public class Operazione implements Runnable { private long id ;   public Operazione( long id) { this . id = id; } @Override public void run() { System. out .print( id + " " ); try { Thread.sleep(500); // mezzo secondo di pausa } catch (InterruptedException e) { e.printStackTrace(); } } } La classe di Test : package  executorservice; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class TestConcurrent { public static void main(String[] args) {

Impostare java.exe nel PATH di Windows a runtime

DOMANDA: Come posso avviare automaticamente un jar eseguibile senza controllare che il programma java.exe sia correttamente impostato tra le variabili d'ambiente? RISPOSTA: Nel post Creare un eseguibile Java è stato descritto come realizzare un jar eseguibile e avviarlo con un semplice doppio click. Tutto ciò avviene correttamente se l'associazione dei file .jar con il programma java.exe è avvenuta correttamente nel mondo Windows. Per metterci al sicuro che il nostro jar sia sempre eseguito, possiamo definire un file batch (.bat) che esegue i comandi che Windows (con le corrette impostazioni) eseguirebbe per noi. Lo script batch riportato di seguito esegue i seguenti passi: 1. Utilizzo del comando where java per recuperare il percorso del file java.exe 2. Memorizzazione del percorso del file java.exe nella variabile d'ambiente java_path 3. Aggiornamento della variabile d'ambiente PATH aggiungendo il valore della variabile ja

Creare file Microsoft Excel .XLS e .XLSX con Apache POI

DOMANDA: In Java è possibile creare un file Microsoft Excel .xls o .xlsx? RISPOSTA: Così come visto per i file Microsoft Word .doc e .docx è possibile creare dei file Microsoft Excel .xls e .xlsx con la libreria gratuita Apache Poi . Guardiamo insieme un esempio: package xsl; import java.io.FileOutputStream; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.ss.util.CellReference; import org.apache.poi.xssf.streaming.SXSSFWorkbook; public class XlsApachePoi {    public static void main(String[] args) throws Throwable {       Workbook wb = new SXSSFWorkbook(100); // creo il file (100 righe massimo in memoria)       Sheet sh = wb.createSheet(); // creo un foglio       for ( int numRighe = 0; numRighe < 100; numRighe++){          Row row = sh.createRow(numRighe); // creo una riga          for ( int cell