In una LAN con più installazioni della stessa distribuzione Linux è utile, per risparmiare banda, l'installazione di un "package cacher" che permetta di scaricare una sola volta ogni pacchetto. Il primo pc che necessita di un pacchetto lo farà scaricare al cacher il quale lo metterà a disposizione per gli altri. Per distribuzioni Debian o derivate (Ubuntu, Mint ...) uno dei software più diffusi è apt-cacher-ng, evoluzione di apt-cacher.
L'installazione nel server avviene con il consueto comando
sudo apt-get install apt-cacher-ng
Dopo l'installazione il software è già funzionante ma può essere configurato a piacimento agendo nel file di configurazione acng.conf, per modificarlo
sudo nano /etc/apt-cacher-ng/acng.conf
Uno dei parametri è la directory in cui viene memorizzata la cache, questa deve essere di proprietà dell'utente e del gruppo apt-cacher-ng. Per modificare la directory cambiare il parametro come segue:
CacheDir: /media/disk-500-A/cache/apt-cacher
e riavviare apt-cacher-ng con il comando:
sudo invoke-rc.d apt-cacher-ng restart
Per cambiare proprietario alla direcotry:
sudo chown -R apt-cacher-ng:apt-cacher-ng /media/disk-500-A/cache/apt-cacher
Nei client è necessario modificare la configurazione di apt per far sì che utilizzino il "package cacher".
Creare il file /etc/apt/apt.conf.d/01proxy con il comando
sudo nano /etc/apt/apt.conf.d/01proxy
con il seguente contenuto:
Acquire::http::Proxy "http://IP_DEL_SERVER:3142";
Acquire::http::Proxy {
download.oracle.com DIRECT;
};
La prima riga indica l'ip del server, le altre servono per evitare che certe richieste vengano inviate al cacher, nel caso specifico il download dai server Oracle di Java non viene gestito dal cacher.
martedì 7 febbraio 2017
sabato 9 aprile 2011
Download di un file in Java
In Java per scaricare un file, ma più in generale per ottenere una risorsa identificata da un URL, è necessario:
Il secondo metodo alloca un java.io.FileOutputStream per implementare quello che sarà probabilmente l'utilizzo più diffuso del metodo precedente cioè il download su un file locale della risorsa desiderata.
Post correlati:
Download di un file in Java: codice d'esempio
- Istanziare un URL con l'indirizzo della risorsa. Il metodo più semplice è quello di utilizzare il costruttore della classe java.net.URL che ha come unico paramentro la stringa corrispondente all'indirizzo (riga 105 del codice d'esempio).
- Aprire l'inputStream corrispondente (riga 39).
- Allocare un java.io.BufferedInputStream (riga 43) corrispondente all'InputStream aperto in precedenza. Questa operazione, al pari della precedente, migliora le prestazioni limitando le chiamate di sistema alle funzioni di I/O
- Allocare un java.io.BufferedOutputStream (riga 46) corrispondente all'outputStream sul quale scrivere il contenuto della risorsa.
- Allocare un array di byte da usare come buffer per la copia dei dati. La dimensione del buffer va ponderata a seconda delle esigenze, tenendo conto che un buffer troppo piccolo limita le prestazioni mentre una dimensione troppo grande fa sì che tutto il contenuto rimanga in memoria (potrebbero sorgere problemi anche gravi come java.lang.OutOfMemoryError).
- Le righe 51 e 52 sono quelle in cui avviene la copia. Vengono infatti letti ad ogni iterazione un certo numero di byte (variabile count) dall'input e scritti nell'output.
- Le righe successive servono per chiudere le risorse allocate in precedenza, secondo il "dispose pattern"
Il secondo metodo alloca un java.io.FileOutputStream per implementare quello che sarà probabilmente l'utilizzo più diffuso del metodo precedente cioè il download su un file locale della risorsa desiderata.
Post correlati:
Download di un file in Java: codice d'esempio
Download di un file in Java: codice d'esempio
001 package com.blogspot.pilloledijava.download;
002
003 import java.io.BufferedInputStream;
004 import java.io.BufferedOutputStream;
005 import java.io.File;
006 import java.io.FileOutputStream;
007 import java.io.IOException;
008 import java.io.InputStream;
009 import java.io.OutputStream;
010 import java.net.URL;
011
012 /**
013 * Classe che implementa due metodi per scaricare la risorsa identificata da un
014 * URL su un outputstream o su un file
015 *
016 * @author pdj
017 *
018 */
019 public class Downloader {
020
021 /**
022 * Metodo che scrive su un java.io.OutputStream la risorsa identificata da
023 * un URL
024 *
025 * @param url
026 * URL da scaricare
027 * @param outputStream
028 * outputstream di destinazione
029 * @param bufferSize
030 * numero di byte letti ad ogni iterazione
031 * @throws IOException
032 * potrebbe essere causata da problemi sia nella sorgente (ad
033 * esempio url irraggiungibile) che nella destinazione (problemi
034 * vari di I/O).
035 */
036 public static void download(final URL url, final OutputStream outputStream,
037 final int bufferSize) throws IOException {
038 // Url input stream
039 final InputStream inputStream = url.openStream();
040 try {
041 // I BufferedInputStream e BufferedOutputStream non sono necessari
042 // ma migliorano le performance
043 final BufferedInputStream bufferedInputStream = new BufferedInputStream(
044 inputStream);
045 try {
046 final BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(
047 outputStream);
048 try {
049 final byte[] buffer = new byte[bufferSize];
050 int count;
051 while ((count = bufferedInputStream.read(buffer)) > 0) {
052 bufferedOutputStream.write(buffer, 0, count);
053 }
054
055 } finally {
056 bufferedOutputStream.close();
057 }
058 } finally {
059 bufferedInputStream.close();
060 }
061 } finally {
062 inputStream.close();
063 }
064 }
065
066 /**
067 * Metodo che salva su un file su un java.io.File la risorsa identificata da
068 * un URL
069 *
070 * @param url
071 * URL da scaricare
072 * @param outputStream
073 * outputstream di destinazione
074 * @param bufferSize
075 * numero di byte letti ad ogni iterazione
076 * @throws IOException
077 * potrebbe essere causata da problemi sia nella sorgente (ad
078 * esempio url irraggiungibile) che nella destinazione (file già
079 * esistente, problemi di permessi, ...).
080 */
081
082 public static void download(final URL url, final File file,
083 final int bufferSize) throws IOException {
084 if (file.exists()) {
085 throw new IllegalArgumentException(file.getAbsolutePath()
086 + " already exists");
087 }
088
089 final FileOutputStream fileOutputStream = new FileOutputStream(file);
090 try {
091 download(url, fileOutputStream, bufferSize);
092 fileOutputStream.flush();
093 } finally {
094 fileOutputStream.close();
095 }
096 }
097
098 /**
099 * Metodo main usato per test
100 *
101 * @param args
102 */
103 public static void main(String[] args) {
104 try {
105 URL url = new URL("http://pilloledijava.blogspot.com/");
106 File f = new File("/home/pdj/Scrivania/blog.html");
107 download(url, f, 4096);
108 } catch (Exception e) {
109 e.printStackTrace();
110 }
111 }
112
113 }
Post correlati:
Download di un file in Java
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ò:
Il metodo byte2String trasforma l'array in una stringa nella tipica notazione esadecimale con i ":".
Post correlati:
Mac address in Java: codice d'esempio
Il codice è molto semplice:
con il metodo
java.net.NetworkInterface.getNetworkInterfaces();
si ottiene una Enumeration
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
Post correlati:
Apache Derby: il DBMS portabile (Introduzione)
Apache Derby: configurare Eclipse per iniziare un progetto
Codice d'esempio
- 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. - 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".
- 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.
- Il metodo invocato alla riga 23 inserisce nella tabella 100 righe con delle normali INSERT
- 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. - 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
Post correlati:
Apache Derby: il DBMS portabile (Introduzione)
Apache Derby: configurare Eclipse per iniziare un progetto
Query SQL: tutorial passo-passo
Iscriviti a:
Post (Atom)