lunedì 23 novembre 2009

Java plugin per Firefox su Ubuntu

To execute applets in your Firefox browser you have to install the java plugin.

Follow this steps:
1) sudo apt-get install sun-java6-jdk
2) ln -s /usr/lib/jvm/__JDK-VERSION__/jre/plugin/i386/ns7/libjavaplugin_oji.so /home/__USER__/.mozilla/plugins/

giovedì 5 novembre 2009

Why hibernation doesn't work?

In my case the answer is easy: not enough space in the swap partition.
In order to hibernate the pc, Ubuntu copies the ram to the swap partition, so this must be at least as bigger as the installed ram.

You can verify ram and swap size with:
cat /proc/meminfo | grep SwapTotal; cat /proc/meminfo | grep MemTotal

domenica 1 novembre 2009

Mysql and the default value of a TIMESTAMP column

The DEFAULT value in CREATE TABLE specification indicates a default value for a column.

The default value must be a constant and it cannot be a function or an expression. This means, for example, that you cannot set the default for a date column to be the value of a function such as NOW(). The solution is to specify CURRENT_TIMESTAMP as the default for a TIMESTAMP column.

giovedì 29 ottobre 2009

Handler di Eclipse RCP
Classicamente, la definizione di un command per un plugin RCP prevede una classe handler di default, che definisca il comportamento dell'applicazione quando viene attivato il command.

id="it.sinossi.SinossiCommand"
categoryid="it.sinossi.command.SinossiCommandsCategory"
defaulthandler="it.sinossi.handlers.DefaultSinossiHandler"
name="SinossiCommand">



In questo caso, quando viene attivato il SinossiCommand, viene automaticamente eseguito il metodo execute(ExecutionEvent evt) della classe DefaultSinossiHandler.

Supponiamo ora che un plugin esterno abbia la necessità di personalizzare il comportamento dell'applicazione all'attivazione del SinossiCommand, cioè di definire un handler custom per tale command.
E' sufficiente inserire nel plugin.xml del progetto esterno un'extension di org.eclipse.ui.handler come la seguente:


commandid="it.sinossi.command.SinossiCommandsCategory">









L'handler CustomSinossiHandler viene utilizzato al posto del default handler se l'activePartId corrisponde a quello della vista SinossiView. Infatti, la porzione di xml compresa all'interno del tag "activeWhen" è una core expressione e permette di definire quali sono le condizioni in cui l'handler è attivato. Analogamente, si può definire quando l'handler è abilitato definendo una core expression all'interno del tag "enableWhen".
Per saperne di più..
Help - Eclipse SDK - Handlers
Eclipse wiki - Command Core Expressions

venerdì 23 ottobre 2009

Fare il debug dei test avviati con maven

Nel caso in cui si presenti la necessità di fare il debug di test avviati tramite maven è sufficiente aggiungere il flag -Dmaven.surefire.debug.
Da console:
mvn test -Dmaven.surefire.debug
questo fa in modo che i test, subito dopo l'avvio, si mettano in pausa in attesa che un debugger remoto si colleghi alla porta 5005 (valore di default eventualmente modificabile).

Se volessimo connettere Eclipse in debug non dovremmo fare altro che creare una nuova Debug Configuration (menù Run > Debug Configuration...), selezionare il tipo "Remote Java Application" e impostare nel campo Port il valore 5005. Cliccando su Debug, Eclipse si collegherà ai test, precedentemente entrati in pausa, facendoli immediatamente ripartire. L'esecuzione si fermerà su tutti breakpoint che avremo impostato permettendo il normale debug all'interno di Eclipse.

Vedi anche:
Maven Surefire Plugin > Examples > Debugging Tests

Mappa caratteri in Linux

Come in windows esiste il comando per aprire la Mappa Caratteri (charmap), anche in Linux esiste un comando equivalente che apre la finestra della mappa caratteri:
gucharmap.

Se si vuole visualizzare l'elenco dei caratteri speciali direttamente da console senza utilizzare l'ambiente grafico si può digitare il comando:
man ascii.

How to configure a port-forwarding in Virtualbox

I want that the oracle installed in to my virtualbox VM can be accessed from outsite.
The idea is to mount the port 1521 in to 127.0.0.1

You have to execute the following command on console when the VM is stopped:
VBoxManage setextradata "VMNAME" "VBoxInternal/Devices/pcnet/0/LUN#0/Config/oracle/Protocol" TCP
VBoxManage setextradata "VMNAME" "VBoxInternal/Devices/pcnet/0/LUN#0/Config/oracle/HostPort" 1521
VBoxManage setextradata "VMNAME" "VBoxInternal/Devices/pcnet/0/LUN#0/Config/oracle/GuestPort" 1521

To check if all is fine:
netstat -na | grep 1521
You'll see that the 1521 on your host (127.0.0.1) is listening

martedì 13 ottobre 2009

Come inserire caratteri speciali in Linux

A volte capita di dover scrivere dei caratteri particolari non presenti nel layout della nostra tastiera. Una soluzione un po' artigianale potrebbe essere quella di andare a copiare il carattere da qualche testo in cui è presente per poi incollarlo dove ci serve.

Ma Gnome ci viene incontro mettendo a disposizione un comodo shortcut: tenendo premuti CTRL+SHIFT e digitando la lettera "u" seguita dal codice Unicode del carattere desiderato, al rilascio di CTRL e SHIFT il carattare magicamente(!) apparirà nel nostro testo.

Ad esempio il carattere tilde "~", non presente nelle tastiere con layout italiano, può essere inserito con CTRL+SHIFT+u7e.

Vedi anche:
Wikipedia - List of Unicode characters

giovedì 8 ottobre 2009

StackLayout

Lo StackLayout appartiene a eclipse.swt.widgets.Layout e serve per sovrapporre elementi grafici, consentendo di switchare tra essi agevolmente portando in primo piano l'oggetto che si desidera.

Un esempio molto semplice è il seguente. Ho un Composite container che contiene due altri Composite compositeOne e compositeTwo, solo uno dei due voglio che sia in primo piano:

Composite container = new Composite(compositeParent, SWT.NONE);
container.setLayoutData(new GridData(GridData.FILL_BOTH));
final StackLayout stackLayout = new StackLayout();
container.setLayout(stackLayout);

Composite compositeOne = new Composite(container, SWT.NONE);
compositeOne.setLayout(new FillLayout());

Composite compositeTwo = new Composite(container, SWT.NONE);
compositeTwo.setLayout(new FillLayout());

// se si vuole rendere visibile il compositeOne
stackLayout.topControl = compositeOne;
container.layout();

// se si vuole rendere visibile il compositeTwo
stackLayout.topControl = compositeTwo;
container.layout();


Grazie al set topControl dello stackLayout e richiamando il metodo layout() ottengo lo switch tra i due oggetti.

Howto open a Shell in a folder

Follow this 2 steps:

1) in the install/upgrade menu of Cygwin select the chere package under the “Shells” category

2) inside a shell exec the command chere -i

Here details and screenshots.

giovedì 1 ottobre 2009

Robotica a basso costo, basata su Lego Mindstorms

La famosa fabbrica di giocatoli lego già da tempo non limita più il suo giro di affari alle semplici costruzioni per bambini.
Una nuova tecnologia che va sempre perfezionandosi, sta trasformando la Lego, in una fabbrica di robot di consumo a basso costo.
Sul sito http://mindstorms.lego.com pottete vedere alcuni esempi delle nuove creazioni Lego.

Attraverso un processore denominato "Mindstorms NXT" (32 bit Atmel AT91SAM7S256 a 48 MHz) programmabile con un linguaggio molto simile al C e una una vastissima serie di sensori( termici, acustici,tattili, di luce, etc....) si possono facilmente assemblare e programmare a nostro piacimento qualsiasi tipo di automa.
unico vincolo stingente la scarsa potenza dei servomotori messi a disposizione dalla Lego.
Su youtube sono decine i filmati che riprendono alcuni dei "robot Lego" nelle Più disparate "faccende", è famoso il filmato in cui un robot lego in pochissimo tempo riesce a risolvere il cubo di rubik.

mercoledì 30 settembre 2009

Sistema Operativo Android , utilizzo del database SQLite

Il sistema operativo Android è molto avanzato, quasi simile a quello di un normale pc.
Si basa sul kernel Linux 2.6 e permette di sviluppare applicazioni java di alta complessità.
Al contrario di altri sistemi operativi (per telefoni), Android può utilizzare per la persistenza dei dati il database SQLite.

Esempio di un gerenic Dao Per Android

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;

public class GenericDAO extends SQLiteOpenHelper {

private static final String TAG = "GenericDAO";
private static SQLiteDatabase db;
private static String dName;
private static String tName;
private static String sql;
public static final String KEY_ID = "_id";

private static GenericDAO instance;

private GenericDAO(Context ctx, String dbName, String sql, String tableName, int ver){
super(ctx, dbName, null, ver);
Log.i(TAG, "Creating or opening database [ " + dbName + " ].");
GenericDAO.sql = sql;
dName = dbName;
tName = tableName;
}

public static GenericDAO getInstance(Context ctx, String dbName, String sql, String tableName, int ver){
if(instance == null){
instance = new GenericDAO(ctx, dbName, sql, tableName, ver);
try{
Log.i(TAG, "Creating or opening the database [ " + dbName + " ].");
db = instance.getWritableDatabase();
}catch(SQLiteException se){
Log.e(TAG, "Cound not create and/or open the database [ " + dbName + " ] that will be used for reading and writing.", se);
}
}
return instance;
}

public void close(){
if(instance != null){
Log.i(TAG, "Closing the database [ " + dName + " ].");
db.close();
instance = null;
}
}

@Override
public void onCreate(SQLiteDatabase db){
Log.i(TAG, "Trying to create database table if it isn't existed [ " + sql + " ].");
try{
db.execSQL(sql);
}catch(SQLException se){
Log.e(TAG, "Cound not create the database table according to the SQL statement [ " + sql + " ].", se);
}
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion){
Log.i(TAG, "Upgrading database from version " + oldVersion + " to " + newVersion + ", which will destroy all old data");
try{
db.execSQL("DROP TABLE IF EXISTS " + tName);
}catch(SQLException se){
Log.e(TAG, "Cound not drop the database table [ " + tName + " ].", se);
}
onCreate(db);
}

public long insert(String table, ContentValues values){
return db.insert(table, null, values);
}

public Cursor get(String table, String[] columns){
return db.query(table, columns, null, null, null, null, null);
}

public Cursor get(String table, String[] columns, long id){
Cursor cursor =db.query(true, table, columns, KEY_ID + "=" + id, null, null, null, null, null);
if (cursor != null) {
cursor.moveToFirst();
}
return cursor;
}

public int delete(String table) {
return db.delete(table, "1", null);
}

public int delete(String table, long id) {
return db.delete(table, KEY_ID + "=" + id, null);
}

public int update(String table, long id, ContentValues values) {
return db.update(table, values, KEY_ID + "=" + id, null);
}
}



Modello java Notes.java
public class Notes {

public static final String DATABASE_NAME = "data";
public static final String DATABASE_TABLE = "notes";
public static final int DATABASE_VERSION = 1;
public static final String TABLE_CREATE =
"create table notes (_id integer primary key autoincrement, "
+ "title text not null, body text not null);";

public static final String COL_TITLE = "title";
public static final String COL_BODY = "body";

private int id;
private String title;
private String body;

public int getId() {
return id;
}
public String getTitle() {
return title;
}
public String getBody() {
return body;
}
public void setId(int id) {
this.id = id;
}
public void setTitle(String title) {
this.title = title;
}
public void setBody(String body) {
this.body = body;
}


}



Utilizzo del Dao
private String testCRUD(){

String result="";
Cursor cursor = null;
String[] columns = new String[] {GenericDAO.KEY_ID, Notes.COL_TITLE, Notes.COL_BODY};

GenericDAO dao = GenericDAO.getInstance(this, Notes.DATABASE_NAME, Notes.TABLE_CREATE, Notes.DATABASE_TABLE, Notes.DATABASE_VERSION);

if(dao != null){

ContentValues values = new ContentValues();
values.put(Notes.COL_TITLE, "aaa");
values.put(Notes.COL_BODY, "bbb");
dao.insert(Notes.DATABASE_TABLE, values);

values = new ContentValues();
values.put(Notes.COL_TITLE, "ccc");
values.put(Notes.COL_BODY, "ddd");
dao.insert(Notes.DATABASE_TABLE, values);

cursor = dao.get(Notes.DATABASE_TABLE, columns);


int idColumn = cursor.getColumnIndex(GenericDAO.KEY_ID); 
int titleColumn = cursor.getColumnIndex(Notes.COL_TITLE); 
int bodyColumn = cursor.getColumnIndex(Notes.COL_BODY); 
.....................................................................
.....................................................................
.....................................................................
result += " now update the second record.";

values = new ContentValues();
values.put(Notes.COL_TITLE, "eee");
values.put(Notes.COL_BODY, "fff");
dao.update(Notes.DATABASE_TABLE, 2, values);

cursor.requery();
cursor.close();

result += " now delete first record.";

dao.delete(Notes.DATABASE_TABLE, 1);

result += " now delete all records.";

dao.delete(Notes.DATABASE_TABLE);

dao.close();
}

return result;

}

Android mette a disposizione dei programmatori librerie, tutorial, esempi di codice e un plugin per Eclipse.
Quest'ultimo è stato scelto da Google come ambiente di sviluppo ufficiale.

martedì 29 settembre 2009

Istanziare classi annidate con Spring

Tra le varie possibilità offerte da Spring di istanziare un oggetto non poteva mancare l'istanziazione delle classi annidate.
Ipotizziamo di avere una classe IndexArgsFactory definita all'interno di IndexArgs:
public final class IndexArgs
{

    public static final class IndexArgsFactory
    {

        public IndexArgsFactory(FormulaManager formulaManager)
        {
          // [...]
        }
    }
    // [...]
}
Nel file di configurazione di Spring dovremo usare la notazione:
<bean id="indexArgsFactory" class="it.sinossi.example.IndexArgs$IndexArgsFactory">
  <constructor-arg ref="formulaManager" />
</bean>
Dove il carattere "$" fa da separatore tra la classe contenitore e la classe annidata.

Vedi anche:
Nested Classes
Inner classes
[LINK] I Layout di SWT
Su Eclipse Corner Article, un articolo piuttosto approfondito che svela molte delle caratteristiche dei layout di SWT.

Understanding Layouts in SWT..


venerdì 25 settembre 2009

Il cestino di Oracle

A partire dalla versione 10g nel database Oracle è stato introdotto il concetto di cestino (Recycle Bin), il cui funzionamento è analogo a quello del cestino presente nei sistemi operativi: le tabelle droppate non vengono immediatamente rimosse dal database ma vanno invece a finire nella Recycle Bin, da cui possono poi eventualmente recuperate senza grosse difficoltà.

Le tabelle droppate non vengono cancellate ma rinominate (insieme a tutti gli oggetti collegati come indici, trigger, ...) con dei nomi generati dal sistema che cominciano per BIN$.

Per visualizzare le tabelle droppate presenti nella Recycle Bin:
select * from recyclebin;

Per ripristinare una tabella precedentemente droppata:
flashback table DROPPED_TABLE_NAME to before drop;

Per svuotare la Recycle Bin:
purge recyclebin;

Per eliminare definitivamente una tabella senza passare per la Recycle Bin:
drop table TABLE_NAME purge;

La Recycle Bin può essere abilitata/disabilitata:
alter session set recyclebin = on;
alter session set recyclebin = off;

lunedì 21 settembre 2009

Recuperare i nomi dei mesi/giorni nelle varie localizzazioni

Le localizzazioni delle stringhe relative alle date sono gestite dalla classe DateFormatSymbols.
Tramite metodi come getMonths o getWeekdays è possibile recuperare i valori che vengono poi utilizzati nella formattazione delle date.

DateFormatSymbols dfs = new DateFormatSymbols(Locale.ITALIAN);
String[] monthNames = dfs.getMonths();
for (String month : monthNames) {
 System.out.println(month);
}

L'output sarà:
gennaio
febbraio
marzo
aprile
maggio
giugno
luglio
agosto
settembre
ottobre
novembre
dicembre

Si deve fare particolare attenzione alle lettere maiuscole/minuscole delle stringhe restituite, che seguiranno la convenzione della lingua selezionata. Ad esempio in italiano i nomi dei mesi e dei giorni sono dei nomi comuni ed hanno l'iniziale minuscola (gennaio, febbraio, ...) mentre in inglese i nomi iniziano con la lettera maiuscola (January, February, ...).

Un'altra particolarità, dovuta alle stranezze della classe Calendar, sono gli array di stringhe restituiti: nel caso dei mesi l'array ha 12 elementi che hanno indici da 0 a 11; nel caso dei giorni della settimana invece l'array ha 8 elementi, con il primo elemento, quello con indice 0, contenente una stringa vuota, gli elementi successivi contengono i nomi dei giorni della settimana, a partire dalla domenica.
Qual è la causa di questa anomalia?
Questi array vengono acceduti utilizzando come indici le costanti della classe Calendar, quindi l'anomalia dell'array dei nomi dei giorni è dovuta al fatto che mentre le costanti che rappresentano i mesi partono da 0 (Calendar.JANUARY == 0), le costanti che identificano i giorni della settimana partono da 1 (Calendar.SUNDAY == 1).

DateFormatSymbols dfs = new DateFormatSymbols(Locale.ITALIAN);
String[] weekdays = dfs.getWeekdays();
for (int i = 0; i < weekdays.length; i++) {
 System.out.println(i + " " + weekdays[i]);
}
Visualizza
0 
1 domenica
2 lunedì
3 martedì
4 mercoledì
5 giovedì
6 venerdì
7 sabato

Vedi anche:
DateFormatSymbols

venerdì 18 settembre 2009

Come deprecare un metodo

Quando si vuole eliminare un metodo da una classe, evitando di interferire sul codice che da questa dipende, la soluzione sta nella deprecazione.
Dalla versione 1.5 di Java per deprecare un metodo si deve usare l'annotazione @Deprecated, che può essere usata sulle classi, sui metodi o sui campi.
E' buona norma accompagnare l'annotazione con i javadoc, usando il tag @deprecated nel cui testo è opportuno specificare perchè il metodo viene deprecato e qual è l'alternativa da utilizzare.


/**
* [...]
* @deprecated use {@link #importTrade(Trade)} instead ...
*/
@Deprecated
Long importTradeFromXML(String xml) {
...


Per creare nei javadoc un collegamento ad un altro metodo viene utilizzato il tag @link la cui sintassi è:

{@link package.class#member label}

Nel caso di overloading dei metodi si deve specificare il metodo facendo seguire al nome l'elenco dei tipi degli argomenti presi in ingresso.

Vedi anche:
How and When To Deprecate APIs
javadoc @deprecated
javadoc @link

giovedì 17 settembre 2009

[Link] Back to the basics: Display, Shell, Window ...

Un articolo interessante su alcuni aspetti (a volte oscuri) di Eclipse RCP:

Back to the basics: Display, Shell, Window ...

marco