468x60

lunedì 31 agosto 2009

Correzione differenziale GPS wireless


Lavorando al progetto di ricerca PROMIS ho dovuto realizzare un sistema per la correzione differenziale delle posizioni GPS.
Il Global Positioning System (GPS) permette, mediante la ricezione di informazioni da parte di satelliti in orbita a bassa quota, di determinare la propria posizione sul globo terrestre. La presenza dell'atmosfera determina una componente di variazione aleatoria del ritardo di propagazione dei segnali GPS, e pertanto la misura di posizione terrestre è di accuratezza ridotta, e nota solo a meno di un errore di decine di metri, o più, in caso di condizioni atmosferiche perturbate od infelice posizionamento dei satelliti.
Nel terminal del Porto di Gioia Tauro è presente una stazione differenziale (detta Base Station) la cui posizione è ben nota, e che riceve anch'essa il segnale GPS. Presso la Base Station, viene quindi calcolato un segnale di errore di posizione, che è lo stesso di quello di tutti i ricevitori GPS vicini alla Base Station stessa (le condizioni atmosferiche sono infatti le stesse).
Il segnale di correzione differenziale (DGPS) viene tradizionalmente trasmesso via porta seriale (o via radio), ed una volta integrato con l'informazione GSP, comporta un aumento dell'accuratezza della misura di posizione, il cui errore si riduce a pochi metri.
Nell'ambito del progetto PROMIS ho realizzato un server DGPS che trasmette in multicast le correzioni differenziali a tutti i client in ascolto, ed un client che da un lato riceve le correzioni differenziali trasmesse, e dall'altro comunica il segnale di correzione al ricevitore GPS, e ne visualizza le informazioni di posizione corrette.


venerdì 28 agosto 2009

Sincronizzazione giornaliera dell’ora di Windows XP

Forse saprete già che esistono programmi freeware che promettono di mantenere l’orologio del vostro pc sincronizzato con l’ora atomica mondiale… Sfortunatamente molti di questi programmi free di dubbia provenienza contengono anche dello spyware

Perchè rischiare? Windows XP già dispone di un servizio di aggiornamento automatico dell’ora (W32Time) il quale è predisposto per sincronizzare (di default una volta alla settimana, ma volendo la frequenza si può modificare) l’orario del vostro pc con quello di un server di riferimento (il server di riferimento predefinito è quello di Microsoft).

Potete verificare se questo servizio è attivo sul vostro pc cliccando due volte sull’orologio di sistema nella tray area e selezionando la scheda “Ora Internet“:

orainternet2

Come potete vedere dall’esempio, l’ultima sincronizzazione è stata effettuata alle 13.05 e la prossima è prevista per il giorno successivo alla stessa ora.

Personalmente ho preferito sostituire l’indirizzo del server NTP della Microsoft (NTP sta per Network Time Protocol) con quello dell’Istituto Nazionale di Ricerca Metrologica ntp1.inrim.it

I server NTP dell’ INRIM sono sincronizzati con un orologio atomico a fasci di cesio, il che vi permette di ottenere un’accuratezza estremamente elevata.

Se poi siete talmente maniaci da non tollerare l’aggiornamento automatico settimanale e preferireste invece un aggiornamento giornaliero, questo è possibile modificando una voce del registro di sistema.

La chiave da modificare si trova nel percorso:
HKEY_LOCAL_MACHINE\
\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpClient

Dovete modificare il valore del parametro “SpecialPollInterval” dal valore decimale 604800 (che sono i secondi di una settimana) al valore decimale 86400 (che sono i secondi di un giorno). Volendo potreste aumentare la frequenza degli aggiornamenti, ricordandovi di specificare sempre il valore in secondi e prestando sempre attenzione a specificare che si tratta di un valore decimale e non esadecimale.

specialpoll.jpg

Fatto ciò, per rendere effettive le modifiche, il servizio W32Time deve essere arrestato e riavviato.

Se non avete fretta potete aspettare il prossimo riavvio di Windows altrimenti al prompt dei comandi digitate il seguente comando, quindi premete invio:
net stop w32time && net start w32time

Per ulteriori approfondimenti sul servizio W32Time vi consiglio di visitare questa pagina del supporto tecnico Microsoft.

Interrogare l'NIST (Internet Time Service) utilizzando il Network Time Protocol

Se nelle nostre applicazioni Java abbiamo bisogno di interrogare l'Internet Time Service di un Time Server, possiamo utilizzare il Network Time Protocol (NTP), mediante la libreria open source Apache Commons Net.

Vediamone un esempio di utilizzo:

package test;

import java.net.InetAddress;
import java.util.Date;

import org.apache.commons.net.ntp.NTPUDPClient;
import org.apache.commons.net.ntp.TimeInfo;

public class TimeLookup {

// List of time servers: http://tf.nist.gov/service/time-servers.html
// Do not query time server more than once every 4 seconds
public static final String TIME_SERVER = "time-a.nist.gov";

public static void main(String[] args) throws Exception {
NTPUDPClient timeClient = new NTPUDPClient();
InetAddress inetAddress = InetAddress.getByName(TIME_SERVER);
TimeInfo timeInfo = timeClient.getTime(inetAddress);
long returnTime = timeInfo.getReturnTime();
Date time = new Date(returnTime);
System.out.println("Time from " + TIME_SERVER + ": " + time);
}
}

Sincronizzazione automatica dell'orologio di sistema

Windows

- Windows 95/98/NT
Questi sistemi operativi non implementano un client NTP, che deve essere quindi installato a parte. Un client liberamente scaricabile ed open source è Nettime.

- Windows XP/2000/2003/Vista/2008
Se il computer è membro di un dominio, probabilmente l'orologio verrà sincronizzato automaticamente da un Network Time Server. Altrimenti, l'orologio del computer può essere sincronizzato automaticamente e regolarmente da un server di riferimento ora.
In questa procedura vengono descritte le modalità per sincronizzare l'orologio del computer con un server di riferiemnto ora su Internet. Assicurarsi di essere connessi a Internet.

  1. Fare clic su Pannello di controllo dal menu di avvio, quindi su Data, ora, lingua e opzioni internazionali, quindi fare clic su Modificare data e ora.
  2. Scegliere la scheda Ora Internet. (Tale scheda non è disponibile se il computer è membro di un dominio)
  3. Scegliere Aggiorna.

Da linea di comando è possibile utilizzare questi comandi:

net time /setsntp:ntp1.inrim.it
net stop w32time
net start w32time

Per visualizzare il server ntp corrente digitare:

net time /querysntp

Linux

La soluzione preferita è usare il demone NTP, ntpd, configurando uno o più server NTP di riferimento nel suo file di configurazione /etc/ntpd.conf. In questo modo, oltre ad aggiornare l'orologio di sistema, ntpd ne stima l'errore sistematico, ed è in grado di correggerlo, evitando un andamento irregolare del tempo, e migliorando la precisione quando il computer non è connesso alla rete.

Per sincronizzare manualmente l'orologio di sistema con quello di un server, da console, in modalità root, dare il comando:

ntpdate ntp1.inrim.it

martedì 25 agosto 2009

Caricare immagini (e non solo) da un file JAR

Quando bisogna distribuire le proprie applicazioni torna molto utile impacchettare tutto il necessario in un file JAR. Se utilizzate Netbeans come IDE, per impacchettare nel JAR anche le immagini (o qualsiasi altra cosa) basta che copiate dentro un package i files di interesse. Lanciando poi "Clean and Build" i files si troveranno dentro il JAR creato nella cartella "dist".

Esempio
Vediamo come leggere un'immagine contenuta nel JAR con un semplice esempio:

Image image = toolkit.getImage(myClass.class.getClassLoader().getResource("immagini/immagine.gif"));

Nel codice sopra stiamo leggendo una immagine che si trova dentro il package immagini... semplice no?

lunedì 24 agosto 2009

Launch4j - wrapper Java in eseguibili Windows

Screenshot

Launch4j è un utile tool che permette di creare un file eseguibile nativo Windows completo di icona e splash screen, a partire dall'archivio JAR dell'applicazione. Launch4j non converte l'applicazione in un eseguibile, perchè questo può causare problemi. Semplicemente si pone come wrapper verso l'applicazione Java, ed è quindi comunque necessario che il sistema abbia installata una qualche versione della Java Runtime Environment (JRE). L'eseguibile generato può agire in due modi differenti. Solitamente l'archivio JAR viene totalmente incorporato nell'eseguibile, consentendo così di evitare di distribuirlo assieme all'applicazione. In alternativa, selezionando Don't wrap the jar, launch only, è possibile far si che l'eseguibile mantenga separato il file JAR, occupandosi solamente di eseguirlo invocando la JVM. In quest'ultimo caso è necessario distrubuire il file JAR assieme all'applicazione. E' importante sottolineare che i due approcci sono del tutto equivalenti, in quanto Launch4j non effettua conversioni del codice, ma funge semplicemente da wrapper. Una delle funzionalità più importanti e utili di Launch4j è la capacità di controllare automaticamente la presenza della JRE e la relativa versione, e di avvisare l'utente nel caso sia necessario scaricare un'altra versione della JRE, proponendo il link verso la pagina di download. Per sfruttare questa funzionalità è necessario specificare, nel tab JRE della GUI, la versione minima della JRE affinchè l'applicazione funzioni (es. 1.6.0.12), ed eventualmente anche la versione massima e il criterio di selezione della JRE nel caso sia installato anche il Java Development Kit (JDK). Nella stessa scheda è possibile anche impostare i parametri per l'esecuzione della JVM, quali le dimensioni dello heap e le opzioni della JVM. Nell'eseguibile vengono incorporate anche le informazioni sulla versione, il titolo dell'applicazione, il copyright, ecc... Tutto ciò è impostabile nel tab Version Info. E' anche possibile forzare Windows a consentire una sola esecuzione contemporanea dell'applicazione, impostando il mutex di controllo nel tab Single Instance. Infine una funzionalità simpatica è la possibilità di inserire uno splash screen.

sabato 22 agosto 2009

VoipCheap - ottimo software per voip gratuito

Ho provato VoipCheap, un software per il voip gratuito, e mi sono trovato abbastanza bene. La qualità dell'audio è buona, non eccellente, ma il prezzo è ottimo, perchè molte destinazioni possono essere contattate gratuitamente.

mercoledì 19 agosto 2009

System Tray in Java

Alcune volte occorre mostrare sulla System Tray del nostro sistema operativo un’icona della nostra applicazione, magari con qualche simpatica opzione o magari solo quando l’applicazione è minimizzata. Vediamo come ciò sia possibile utilizzando la classe SystemTray della libreria AWT presente dalla versione 6 di Java.

La classe SystemTray rappresenta la barra delle applicazioni della nostra scrivania. Su alcuni sistemi operativi, o più genericamente dovremmo parlare di desktop environment, la System Tray potrebbe non esistere o non essere supportata in questo caso quando cercheremo di ottenere l’istanza dell SystemTray con il metodo getSystemTray() verrà sollevata l’eccezione UnsupportedOperationException. Per testare se la barra è supportata basterà utilizzare il metodo isSupported().

La SystemTray può contenere più icone TrayIcon, aggiunt con il metodo add(java.awt.TrayIcon), e eliminate quando non più utili con remove(java.awt.TrayIcon). La classe TrayIcon consiste in un’immagine, un menù a popup e un insieme di listeners ad esso associati.

Vediamo un semplice esempio di utilizzo:

/**
*
* @author Carmelo Saffioti
*/
import java.awt.AWTException;
import java.awt.Image;
import java.awt.MenuItem;
import java.awt.PopupMenu;
import java.awt.SystemTray;
import java.awt.Toolkit;
import java.awt.TrayIcon;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JOptionPane;

public class SysTrayDemo {

public static void main(String[] args) throws Exception {

if (!SystemTray.isSupported()) {
System.out.println("La SystemTray non è supportata");
return;
}

SystemTray tray = SystemTray.getSystemTray();
Toolkit toolkit = Toolkit.getDefaultToolkit();
Image image = toolkit.getImage("trayIcon.jpg");

PopupMenu menu = new PopupMenu();

MenuItem messageItem = new MenuItem("Mostra messaggio");
messageItem.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e) {
JOptionPane.showMessageDialog(null, "www.carmelosaffioti.it");
}
});
menu.add(messageItem);

MenuItem closeItem = new MenuItem("Chiudi");
closeItem.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e) {
System.exit(0);
}
});
menu.add(closeItem);

TrayIcon icon = new TrayIcon(image, "SystemTray app", menu);
icon.setImageAutoSize(true);
try {
tray.add(icon);
} catch (AWTException e) {
System.out.println("La TrayIcon non può essere aggiunta");
}
}
}

Balloontip - libreria open source per balloon tips in Java

Balloontip è una libreria open source che permette di utilizzare balloon tips nelle applicazioni Java Swing. Semplice e potente da utilizzare... provatela!

venerdì 7 agosto 2009

Ini4J - The Java Ini Library

Ini4J è una semplice API Java gestire files di configurazione nel formato Windows .ini. E' davvero molto leggera e semplice da utilizzare...
  • Gestione di sezioni multiple
  • Gestione di espressioni
  • Lettura/scrittura del registro di Windows, senza dover utilizzare codice nativo (JNI)
  • Supporto del .REG file format
Vediamo un semplice esempio:

[happy]
age = 99
height = 77.66
homeDir = /home/happy

//lettura
Wini ini = new Wini(new File(filename));
int age = ini.get("happy", "age", int.class);
double height = ini.get("happy", "height", double.class);
String dir = ini.get("happy", "homeDir");

//scrittura
Wini ini = new Wini(new File(filename));
ini.put("sleepy", "age", 55);
ini.put("sleepy", "weight", 45.6);
ini.store();

dopo la scrittura avremo:

[sleepy]
age = 55
weight = 45.6

mercoledì 5 agosto 2009

Applicazioni Java e Sql Server

Ho sviluppato alcune applicazioni Java che effettuano connessioni a database Microsoft Sql Server utilizzando come driver JTDS e come IDE Netbeans. Il codice utilizzato per la connessione al database è il seguente:
Class.forName("net.sourceforge.jtds.jdbc.Driver").newInstance();
Connection con = DriverManager.getConnection("jdbc:jtds:sqlserver://server[:port]/database", "user", "password");
Se lo stesso codice viene utilizzato all'interno di una GUI, entra in lock, e la connessione al database non avviene.

Soluzione: nella configurazione di rete aggiungere una eccezione proxy per il server di cui alla connessione al database
468x60

Cerca su Google

Cerca nel Blog con Google