martedì 24 agosto 2010

Mac address in Java

Con Java 6 è possibile ottenere anche il mac address di una scheda di rete (valore non ottenibile con Java 5 e precedenti).

Il codice è molto semplice:
con il metodo
java.net.NetworkInterface.getNetworkInterfaces();
si ottiene una Enumeration di tutte le interfacce di rete del sistema, la classe NetworkInterface presenta un metodo getHardwareAddress() che restituisce un array di byte corrispondente ad un generico indirizzo fisico della scheda (che corrisponde al mac address nel caso di schede ethernet).
Tale array può:
  • essere a null nel caso di interfacce di rete particolari come quella di loop (individuabile anche tramite il metodo isLoopback() ) o altre fittizie
  • avere esattamente 6 byte per le schede di rete
  • avere lunghezza diversa da 6 byte per altre interfacce non ethernet (es. Firewire ha 8 byte).

Il metodo byte2String trasforma l'array in una stringa nella tipica notazione esadecimale con i ":".

Post correlati:
Mac address in Java: codice d'esempio

Mac address in Java: codice d'esempio


import java.net.NetworkInterface;
import java.util.Enumeration;

public class SimpleMacAddress{

/** Lunghezza della stringa contente il mac address (6 * 2)numeri esadecimali + 5 separatori */
public final static int MAC_ADDRESS_STRING_LEN = 17;
/** Lunghezza dell'array di byte */
public final static int MAC_ADDRESS_BYTE_LEN = 6;
/** Base dei numeri per la stringa */
public final static int MAC_ADDRESS_RADIX = 16;

public static void main(String[] args)
{
try{
//Elenco di tutte le interfacce di rete
Enumeration<NetworkInterface> e = NetworkInterface.getNetworkInterfaces();
while(e.hasMoreElements())
{
NetworkInterface ni = e.nextElement();
System.out.println("Name = " + ni.getName());
byte[] b = ni.getHardwareAddress();
System.out.println("hw = " + (b == null ? "null" : byte2String(b)));
System.out.println();
System.out.println("------------");
}

}catch(Exception e)
{
e.printStackTrace();
}
}

public static String byte2String(byte[] vByte)
{
if(vByte.length != MAC_ADDRESS_BYTE_LEN)
return "Mac address con lunghezza " + vByte.length;
StringBuilder sb = new StringBuilder();
int len = vByte.length;
for(int i = 0; i < len; i++)
{
//Utilizzo un int per evitare di avere numeri negativi
int a = vByte[i];
if(a < 0)
a = a + 256;
String s = Integer.toHexString(a/MAC_ADDRESS_RADIX) + "" + Integer.toHexString(a%MAC_ADDRESS_RADIX);
sb.append(s);
//tutte le coppie tranne l'ultima
if(i != len - 1)
sb.append(":");
}
return sb.toString();
}
}

Post correlati:
Mac address in Java

venerdì 25 giugno 2010

Apache Derby: query SQL

Derby: creazione del database e delle tabelle
  1. Dopo aver caricato il driver JDBC in maniera analoga a quanto accade con gli altri DBMS:

    Class.forName("org.apache.derby.jdbc.EmbeddedDriver");

    È necessario istanziare la connessione, questo non avviene impostando indirizzo ip e porta (non avrebbe senso) ma specificando la directory nella quale mettere il database:

    DriverManager.getConnection("jdbc:derby:" + path.getAbsolutePath() + ";create=true");

    nell'esempio viene specificato il path relativo della directory data/example; il parametro create=true/false indica come deve comportarsi Derby se nella directory non è presente un database.

  2. Ora il database può essere utilizzato via JDBC come qualunque altro DBMS, con l'accortezza di non aprire mai più connessioni contemporaneamente!
    Se si commentano le righe dalla 23 alla 28 e si esegue il programma, verrà creato un database (da Eclipse facendo un refresh nella cartella data si vedranno i nuovi file) con dentro una tabella "item".
Derby: query per inserimento e lettura dei dati
  1. Per ri-eseguire il programma è necessario commentare la riga 22 (altrimenti solleverebbe un'eccezione poiché le tabelle esistono già) e decommentare le righe dalla 23 alla 28.

  2. Il metodo invocato alla riga 23 inserisce nella tabella 100 righe con delle normali INSERT

  3. Anche le SELECT sono scritte in SQL e rispecchiamo la sintassi standard del linguaggio, la prima

    SELECT description FROM item where price = (select min(price) from item)

    non ha parametri e restitusce la descrizione dell'articolo meno costoso, mentre la seconda

    select count(*) as c from item where price <= ?

    ha un parametro e restituisce il numero di articoli con un prezzo minore uguale di threshold.

  4. Una piccola nota "stonata" (almeno dal mio punto di vista) è che Derby non accetta il "punto e virgola" alla fine del comando come da standard SQL.


Post correlati:
Apache Derby: il DBMS portabile (Introduzione)
Apache Derby: configurare Eclipse per iniziare un progetto
Codice d'esempio

venerdì 11 giugno 2010

Apache Derby: codice d'esempio





001 package com.blogspot.pilloledijava.derby;
002 
003 import java.io.File;
004 import java.math.BigDecimal;
005 import java.sql.Connection;
006 import java.sql.DriverManager;
007 import java.sql.PreparedStatement;
008 import java.sql.ResultSet;
009 import java.sql.SQLException;
010 import java.sql.Statement;
011 
012 public class DerbyExample {
013 
014   private static ExampleDbManager dbManager;
015 
016   /**
017    @param args
018    */
019   public static void main(String[] args) {
020     try {
021       dbManager = new ExampleDbManager(new File("data/example"));
022       dbManager.createTable();
023       dbManager.insertSample(100);
024       final String all = dbManager.getCheapest();
025       System.out.println("Cheapest item description: " + all);
026       final int count = dbManager.countCheaperThen(BigDecimal
027           .valueOf(5.0));
028       System.out.println("Cheap item: " + count);
029 
030       System.out.println();
031       System.out
032           .println("Apache Derby example: http://pilloledijava.blogspot.com/");
033       System.out.println("Enjoy !!!!");
034 
035     catch (Exception e) {
036       e.printStackTrace();
037       System.out
038           .println("Apache Derby example: http://pilloledijava.blogspot.com/");
039       System.out.println("Something wrong, sorry...");
040     finally {
041       try {
042         if (dbManager != null)
043           dbManager.close();
044       catch (SQLException e) {
045         // nothing in finally statement
046       }
047     }
048 
049   }
050 
051   /**
052    * Derby connection wrapper
053    
054    @author pdj
055    
056    */
057   public static class DbManager {
058 
059     protected final Connection connection;
060 
061     /**
062      * Embedded derby connection wrapper
063      
064      @param path
065      *            database location
066      @throws ClassNotFoundException
067      @throws SQLException
068      */
069     public DbManager(final File paththrows ClassNotFoundException,
070         SQLException {
071       // load Derby driver
072       Class.forName("org.apache.derby.jdbc.EmbeddedDriver");
073       // instantiate derby connection, if necessary creates database
074       connection = DriverManager.getConnection("jdbc:derby:"
075           + path.getAbsolutePath() ";create=true");
076     }
077 
078     /**
079      * Close connection
080      
081      @throws SQLException
082      */
083     public void close() throws SQLException {
084       connection.close();
085     }
086 
087   }
088 
089   /**
090    * Example query
091    
092    @author pdj
093    
094    */
095   public static class ExampleDbManager extends DbManager {
096 
097     public ExampleDbManager(final File paththrows ClassNotFoundException,
098         SQLException {
099       super(path);
100     }
101 
102     /**
103      * Create item table
104      
105      * run one time!
106      
107      @throws SQLException
108      */
109     public void createTable() throws SQLException {
110       Statement createStatement = null;
111       try {
112         createStatement = connection.createStatement();
113         createStatement
114             .execute("create table item(id integer primary key generated always as identity, description varchar(50) not null, price numeric(10,2)) ");
115       finally {
116         if (createStatement != null)
117           createStatement.close();
118       }
119     }
120 
121     /**
122      * Insert a lot of dummy item
123      
124      @param count
125      @throws SQLException
126      */
127     public void insertSample(final int countthrows SQLException {
128       PreparedStatement insertStatement = null;
129       try {
130         insertStatement = connection
131             .prepareStatement("insert into item (description, price) values(?, ?)");
132         for (int i = 0; i < 100; i++) {
133           final String randomName = "item_" + Math.random();
134           insertStatement.setString(1, randomName);
135           final BigDecimal randomPrice = BigDecimal.valueOf(
136               (long) (Math.random() 1000)2);
137           insertStatement.setBigDecimal(2, randomPrice);
138           insertStatement.execute();
139         }
140       finally {
141         if (insertStatement != null)
142           insertStatement.close();
143       }
144     }
145 
146     /**
147      * Return the description of the cheapest item
148      
149      @return
150      @throws SQLException
151      */
152     public String getCheapest() throws SQLException {
153       Statement createStatement = null;
154       try {
155         createStatement = connection.createStatement();
156         final ResultSet rs = createStatement
157             .executeQuery("SELECT description FROM item where price = (select min(price) from item)");
158         try {
159           return rs.next() ? rs.getString("description"null;
160         finally {
161           if (rs != null)
162             rs.close();
163         }
164       finally {
165         if (createStatement != null)
166           createStatement.close();
167       }
168     }
169 
170     /**
171      * Count item cheaper the threshold
172      
173      @param threshold
174      @return
175      @throws SQLException
176      */
177     public int countCheaperThen(final BigDecimal threshold)
178         throws SQLException {
179       PreparedStatement createStatement = null;
180       try {
181         createStatement = connection
182             .prepareStatement("select count(*) as c from item where price <= ?");
183         createStatement.setBigDecimal(1, threshold);
184         final ResultSet rs = createStatement.executeQuery();
185         try {
186           return rs.next() ? rs.getInt("c"null;
187         finally {
188           if (rs != null)
189             rs.close();
190         }
191       finally {
192         if (createStatement != null)
193           createStatement.close();
194       }
195     }
196 
197   }
198 
199 }




Post correlati:
Apache Derby: il DBMS portabile (Introduzione)
Apache Derby: configurare Eclipse per iniziare un progetto
Query SQL: tutorial passo-passo

Apache Derby: configurare Eclipse per iniziare un progetto

In questo post verrà spiegato come configurare Eclipse per poter eseguire il codice d'esempio:

  1. Creare un nuovo "Java project"

  2. Creare una directory "lib" (immagine) ed una directory "data" nel progetto


  3. Scaricare l'ultima versione della libreria (db-derby-10.6.1.0-lib.tar.gz) da qua http://db.apache.org/derby/derby_downloads.html#Latest+Official+Release

  4. Estrarre il file derby.jar nella directory lib create in precedenza


  5. Da Eclipse fare un refresh sulla directory lib ed aggiungere il file derby.jar al build path (tasto destro su derby.jar -> Build Path -> Add to Build Path)



Post correlati:
Apache Derby: il DBMS portabile (Introduzione)
Codice d'esempio
Query SQL: tutorial passo-passo

Apache Derby: il DBMS portabile (Introduzione)

Apache Derby (http://db.apache.org/derby) è un RDBMS (sistema di gestione di database relazionale) scritto completamente in Java e rilasciato sotto "Apache License, Version 2.0", quindi open source e completamente gratuito.
L'attuale versione (10.6.1.0) supporta quasi tutte le caratteristiche "obbligatorie" richeste da SQL-99/SQL-2003 ed alcune di quelle opzionali (http://wiki.apache.org/db-derby/SQLvsDerbyFeatures).

Rispetto al più blasonato MySQL, al più performante PostgreSQL ed ai più costosi Oracle e SQLServer, Derby ha una caratteristica veramente interessante per lo sviluppo di programmi monoutente: è portabile, cioè non è necessario installare un "server" perché Derby può leggere e scrivere direttamente dal filesystem. In questo modo è possibile sviluppare software da mettere, ad esempio, in una chiavetta e utilizzarlo su qualunque pc in cui sia installata una jre. Il prezzo da pagare per questa comodità è la "mono-connessione": non è possibile infatti utilizzare più connessioni contemporanee sullo stesso database. Nel caso sia necessario avere più connessioni è possibile installare Derby Network Server rinunciando però alla portabilità (o quantomeno ad una portabilità semplice); personalmente però, in un ambiente client/server, preferisco PostgreSQL perché più completo e performante.

I prossimi post spiegheranno passo-passo come utilizzare Derby con Eclipse.
Apache Derby: configurare Eclipse per iniziare un progetto
Codice d'esempio
Query SQL: tutorial passo-passo

domenica 23 maggio 2010

Ubuntu & HP dv6: le cuffie non disabilitano le casse

L'installazione di Ubuntu Lucid su un HP dv6 2000sl è stata quasi perfetta, ha riconosciuto tutto l'hardware:
  • scheda video
  • scheda audio *
  • webcam
  • schede di rete (ethernet e wiress)
  • tasti hp per il volume, la scheda wireless
L'unico malfunzionamento si è verificato con le cuffie: quando inserisco le cuffie non si spengono le casse e sento l'audio sia in cuffia che nelle casse.

Tra le centinaia di soluzione presenti nei vari forum, la più semplice che ha funzionato è stata una piccola variante di quella proposta per l'hp dv6 1100.EO in questo thread:
  • con i privilegi di amministratore modificare il file /etc/modprobe.d/alsa-base (ad esempio da terminale: sudo gedit /etc/modprobe.d/alsa-base)
  • Alla fine del file aggiungere le seguenti righe:
    alias snd-card-0 snd-hda-intel
    alias sound-slot-0 snd-hda-intel
    options snd-hda-intel model=hp-dv5
    options snd-hda-intel enable_msi=1
  • Salvare e riavviare il computer (probabilemente basta riavviare qualche servizio...)
Ora quando inserisco le cuffie, le casse si disattivano e viceversa.

martedì 11 maggio 2010

Java 2 html: syntax highlighting

Con Java2Html è possibile creare dei file html a partire da sorgenti Java, con lo stesso "syntax highlighting" di Eclipse o del framework Kawa. L'utilizzo è veramente semplice:
  1. Scaricare il file zip dalla sezione download
  2. Estrarre lo zip
  3. Da shell (o dal prompt dei comandi per i winari) entrare nella directory appena estratta e digitare java -jar java2html.jar
  4. Si aprirà una finestra dalla quale sarà possibile selezionare un file o incollare direttamente del codice
  5. Nel riquadro sottostante comparirà l'html già formattato e pronto per l'uso (tuttavia per incollarlo su questo blog ho dovuto rimuovere tutti i < br / > al termine di ogni riga altrimenti veniva visualizzata una riga vuota ogni riga di codice, ma è un problema di blogspot non di java2html)
  6. Più codice libero e ben documentato verrà pubblicato, più il mondo sarà più ricco!

mercoledì 5 maggio 2010

Decompressione di uno zip in Java

Algoritmo per la decompressione di uno zip in Java

/**
 * Decomprime uno ZipInputStream in una directory destinazione
 @param input ZipInputStream da estrarre
 @param output directory destinazione
 @throws IOException
 */
public static void decompress(ZipInputStream input, File outputthrows IOException
{
  ZipEntry zipEntry;
  while((zipEntry = input.getNextEntry()) != null)
  {
    boolean directory = zipEntry.isDirectory();
    if(directory)
    {
      File dir = new File(output, zipEntry.getName());
      if(!dir.exists())
        dir.mkdir();
      else if(dir.isDirectory())
        throw new IOException("Output directory \"" + dir.getAbsolutePath() "\" is a file");
    }else
    {
      File decompressFile = new File(output, zipEntry.getName());
      if(decompressFile.exists())
        throw new IOException("Output file \"" + decompressFile.getAbsolutePath() "\" already exists");
      FileOutputStream fos = new FileOutputStream(decompressFile);
      try{
        byte[] readBuffer = new byte[4096];
        int bytesIn = 0;
        while ((bytesIn = input.read(readBuffer)) != -1) {
          fos.write(readBuffer, 0, bytesIn);
        }
      }
      finally{
        fos.close();
      }
    }
  }
}

Invocazione tipica del metodo,
input: file da estrarre, output: directory destinazione


/**
 * Decomprime un file zip in una directory
 @param input file zip da estrarre
 @param output directory destinazione
 @throws IOException
 */
public static void decompress(File input, File outputthrows IOException
{
  ZipInputStream zis = new ZipInputStream(new FileInputStream(input));
  try{
    decompress(zis, output);
  }finally
  {
    zis.close();
  }
}

sabato 1 maggio 2010

Zip di una directory in java

Metodo ricorsivo per creare uno zip di una directory o di un file in Java

/**
* Aggiunge un File (file o directory) ad uno ZipOutputStream
* a partire da un certo path interno allo ZipOutputStream
* @param f File da aggiungere all'archivio
* @param path Path interno all'archivio in cui mettere il file
* @param zos ZipOutputStream che rappresenta l'archivio
* @throws IOException
*/
public static void compress(File f, String path, ZipOutputStream zos) throws IOException
{
boolean isDirectory = f.isDirectory();
//le directory terminano con "/", altrmineti sono file
final String nextPath = path + f.getName() + (isDirectory ? "/" : "");
ZipEntry zipEntry = new ZipEntry(nextPath);
zos.putNextEntry(zipEntry);
if(isDirectory)
{
File[] child = f.listFiles();
//ricorsione per ogni figlio
for(int i = 0; i < child.length; i++)
{
compress(child[i], nextPath, zos);
}
}else if(f.isFile())
{
FileInputStream fis = new FileInputStream(f);
byte[] readBuffer = new byte[4096];
int bytesIn = 0;
// inserisce il file nell'ultima zipEntry aggiunta allo ZipOutputStream
while ((bytesIn = fis.read(readBuffer)) != -1) {
zos.write(readBuffer, 0, bytesIn);
}
fis.close();
}
}

Invocazione del metodo:


/**
* Crea un archivio con il File (file o directory) specificato come
* paramentro, il path di partenza è vuoto
* @param input
* @param output
* @throws IOException
*/
public static void compress(File input, File output) throws IOException
{
ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(output));
try{
compress(input,"", zos);
}finally
{
zos.close();
}
}