mercoledì 29 dicembre 2010

Considerazioni sui dischi esterni

Qualche giorno fa mi sono trovato davanti alla scelta di come formattare il mio nuovo hard disk portatile. Pur essendo un accanito utente Linux, mi trovo a volte a dover usare altri sistemi, primo fra tutti Windows, e quindi ho bisogno che i miei dati siano leggibili (e scrivibili) indipendentemente dal sistema operativo. E' quindi da escludere un file system della famiglia ext: nonostante esistano programmi per leggere partizioni ext da Windows, tale sistema non viene riconosciuto dalla maggior parte dei dispositivi multimediali in commercio. Fat è quindi la scelta di portabilità piu' indicata, ma non quella corretta per me, che devo memorizzare file ben piu' grandi di 5 GB. Ho quindi deciso di formattare con il New (?) Technology File System (NTFS), file system leggibile e scrivibile da Windows e Linux, leggibile da Solaris e da OSX. Purtroppo però il driver Linux di questo file system ha prestazioni pessime: formattare un container TrueCrypt significa partire da una banda di 30 MB/s circa per poi arenarsi attorno a 5 MB/s. La stessa formattazione fatta da un sistema Windows parte con una banda di 35 MB/s e si assesta intorno ai 23 MB/s. In generale poi le prestazioni in scrittura, su entrambi i sistemi, sono basse, probabilmente dovute al journaling di questo file system. Ovviamente queste prove non rappresentano un benchmarking effettivo, ma le prove sono state effettuate varie volte sempre con i medesimi risultati.

mercoledì 15 dicembre 2010

OpenBSD Security

Questa mattina ho trovato nella mia casella di posta una e-mail di Theo De Raadt inviata alla lista security-announce di OpenBSD che parla di una cospirazione ad opera dell'FBI. Sostanzialmente Theo ha ricevuto una e-mail privata, che poi ha promosso in mailing list, in cui gli viene spiegato perché OpenBSD ha perso i fondi dal DARPA: l'FBI ha pagato le persone che lavoravano al progetto IPSEC per introdurre delle backdoor volontarie al fine di poter monitorare il traffico cifrato instaurato in un tunnel. Inutile dirlo, gli sviluppatori OpenBSD se la sono presa a male....
Personalmente ritengo che questi sospetti siano infondati, ad ogni modo essendo l'implementazione di OpenBSD molto stimata e replicata, ed essendo il codice Open Source, non penso che passerà molto tempo affinché la verità venga a galla.

martedì 14 dicembre 2010

Eclipse Visual Editor

Finalmente sono riuscito ad installare il Visual Editor su Eclipse Helios, ma ho dovuto scaricare il pacchetto e installarlo manualmente come fosse un repository locale. Per aprire un file visuale con l'editor è necessario fare click destro sulla risorsa e selezionare Open With -> Visual Editor (al posto di Java Editor). Da notare che nel mio caso (applicazione RCP con viste e editor) l'editor non si comporta bene poiché non riconosce esattamente la vista o l'editor se questo viene creato con variabili "temporanee" (ossia non di istanza). Dovrò lavorare un po' per adattare il mio sistema all'uso del VE.

Nebula Table Combo

Usare il Table Combo di Nebula è un'operazione tutto sommato semplice, anche se manca un po' di documentazione a riguardo. Mostro di seguito i passi necessari all'utilizzo del widget, che nel caso della mia applicazione visualizzano una semplice tabella con ID/Descrizione di elementi.
Anzitutto occorre inizializzare il componento e definire le colonne (se si omette questo passo si avrà un combo che visualizza solo una delle colonne). Successivamente si decide se visualizzare o meno le intestazioni di colonna e infine si stabilisce quale colonna (con indice numerato partendo da zero) si deve rendere visibile nel combo quando questo è chiuso. Il seguente pezzo di codice illustra quanto appena descritto:

    // create the combo with the right style
    this.combo = new TableCombo( this ,  SWT.READ_ONLY );

    // say I want two columns
    this.combo.defineColumns( new String[]{ "ID", "Descrizione" }  );
    this.combo.setShowTableHeader( true );
    // the description is the column used for the selection
    this.combo.setDisplayColumnIndex( 1 );

Successivamente occorre inserire gli elementi nel combo, tenendo presente che occorrerà passare una coppia di stringhe in un unico oggetto array:


TableItem tableItem = new TableItem( this.combo.getTable(), SWT.NONE ); 
tableItem.setText( 
        new String[]{ newElement.getId(), newElement.getDescription() } );

PL/Java e Transazioni Distribuite

Al PGDay 2010 ho presentato un tutorial su PL/Java, una estensione Java ai linguaggi procedurali possibili in PostgreSQL. Alla fine del tutorial mi è stata rivolta una domanda interessante relativa ad un problema che non mi ero mai posto, e alla quale ho dato la risposta piu' logica secondo le mie conoscenze di PostgreSQL, di Java e di PL/Java.
Il quesito riguardava l'utilizzo di PL/java per comandare un ambiente enterprise ed eventualmente avviare una transazione distribuita. Cosa succede in questo caso? La risposta è semplice: PL/Java esegue all'interno del processo backend di PostgreSQL e quindi la transazione è confinata all'interno del backend stesso. Il processo backend non sa nulla di quello che PL/Java, che tuttavia esegue come processo esterno, sta facendo, e quindi non c'è modo di collegare la transazione/statement di PostgreSQL ad una eventuale transazione distribuita orchestrata da PL/Java. E' il programmatore PL/Java che deve farsi carico di tutto quanto.
Ad ogni modo, ho voluto chiarire questa faccenda sulla mailing list di PL/Java, qui si trova la discussione ufficiale.

venerdì 10 dicembre 2010

PGDay 2010: un altro successo marcato ITPug. Un altro successo della community.

E' stata una bella edizione quella di Roma 2010 del PGDay, giornata nazionale dedicata a PostgreSQL e giunta ormai alla sua quarta edizione. Ho partecipato all'organizzazione della prima versione del PGDay a Prato, nel 2007, in quello che fu' un evento di carattere internazionale e l'unione collettiva di un gruppo di persone appassionate e volenterose che diedero poi vita a ITPug, l'associazione che si e' fatta carica della promozione di PostgreSQL in Italia.
Ogni anno mi rendo sempre piu' conto che il PGDay non e' solo una giornata o un evento tecnico incentrato su PostgreSQL, bensi' un incontro della comunita', una comunita' di sviluppatori, di appassionati, di professionisti e in generale di gente che ne vuole sapere di piu'.
E come e' ormai tradizione, il PGDay 2010 inizia davanti ad una birra, in un ristorante di Roma, in attesa che un bel piatto di pasta (amatriciana o carbonara le uniche opzione scelte da noi DBA/sviluppatori) fumante ci sfami. Il tavolo e' denso di personalita' dal carisma e dalla competenza eccezzionale: oltre a noi italiani vi e' infatti Simon Riggs, intento a divorare una fiorentina decisamente esagerata anche per le sue capacita', e Jonhatan Katz impegnato con una piu' modesta pizza. Si parla ovviamente di PostgreSQL ma non solo: ogni argomento tecnologico e' valido per essere messo sul tavolo, cosi' come ogni cosa che rigurardi la comunita' e la cultura Open Source. Le discussioni con Daniele, Emanuele e il sempre intraprendente Torello sono avvincenti e illuminanti.

Il giorno seguente ci si alza di buon'ora per andare a preparare l'accoglienza presso lo splendido centro Cavour. E a nche qui ci si rende immediatamente conto del forte senso comunitario che aleggia attorno all'evento: tutti si prestano a lavori manuali per preparare i badge, le borsine, appendere i manifesti, provare i videoproiettori e quanto altro serva. Il tutto ovviamente condito da discussioni tecniche continue che possono nascere da qualunque commento, anche scherzoso.

Simon Riggs apre le danze con una introduzione su PostgreSQL 9 veramente d'effetto, non solo per l'alto livello tecnico e la chiarezza espositiva, ma anche per il saper comunicare efficacemente il vero valore aggiunto di PostgreSQL. E infatti si inizia gia' a parlare di quello che sara' un tema ricorrente nella giornata: il fattore economico. Vale la pena ricordare come PostgreSQL offra funzionalita' comparabili, identiche (e in alcuni casi anche superiori) a quelle di altri database commerciali senza richiedere costi di licenza. E' quindi evidente come la scelta di soluzioni professionali basate su PostgreSQL possa portare ad un risparmio economico anche notevole, soprattutto in un periodo, questo, nel quale le aziende e le amministrazioni faticano a far quadrare i bilanci.






Giusto qualche minuto per un ottimo coffee break e due chiacchere fra amici e via che si inizia con il programma tecnico. Nella mia sala io tengo il primo tutorial, 40 minuti di Java con attenzione a Pl/Java e considerazioni sull'utilizzo di un simile linguaggio di estensione. Il talk ha un buon audience, molto competente e preparato che mi stimola con domande veramente avvincenti. Dopo di me tocca ad Enrico che a tempo di record mostra il partitioning sia con le rules che con i trigger. E poi è la volta di Momjan con il suo primo talk: MVCC Unmasked. Effettivamente nulla di nuovo, nel senso che MVCC è un sistema ben conosciuto all'interno dello scenario database e soprattutto di PostgreSQL. Eppure le slide di Momjan, scarne e minimali se lette individualmente, diventano incredibilmente chiare e precise se accompagnate dalle sue parole. Veramente un ottimo talk. Prosegue Gabriele con la presentazione di un progetto ancora in fase alpha circa il cloud computing Amazon e PostgreSQL.

Altra pausa, questa volta per il pranzo, e poi si riparte con un pomeriggio ancora piu' ricco. Nella sala principale apre le danze Johnatan con un talk sugli ORM molto ben fatto ma che, personalmente, non dice nulla di nuovo. Insomma, uno di quei classici talk validi a livello ingegneristico ma non tecnologicamente avvincenti. Quello che si apprezza di Jonhatan è la pacatezza e il sorriso allegro e invitante, nonché la professionalità nell'esporre il proprio lavoro. E' la volta di David Fetter, con la presentazione di PL/Parrot; presentazione impeccabile e sottile come tutte quelle di David; personalmente apprezzo moltissimo il lavoro di David (in ogni direzione) ma apprezzo poco le sue presentazioni e il suo modo di esporre le cose. Ed è nuovamente la volta di Bruce, che questa volta spiega in modo pacato e con una semplicità disarmante una feature tanto complessa quanto utile: HOT Streaming Replication.

Una nuova pausa che fa apprezzare anche l'ottimo lavoro svolto dal catering e via con una nuova sessione di talk, l'ultima prima di lasciare spazio ai lightning talks; Daniele, Oleg e Gianni si alternano ad intrattenere il pubblico.

Il PGDay è ormai alla fine, torno a casa soddisfatto e compiaciuto del lavoro fatto. Ancora una volta ITPug ha saputo riunione i migliori esperti e professionisti di PostgreSQL (e in generale dello scenario database e Open Source) italiani e stranieri. Qualcuno durante un coffee break mi ha detto che il programma dell'evento era veramente molto denso, "siamo abituati a fare sempre eventi molto tecnici" è stata la mia risposta. Ed è vero: in generale preferiamo talk specialistici a semplice e sterile propaganda. Non voglio essere frainteso: la propaganda è importante, ma io personalmente penso sia meglio dimostrare con i fatti che si è migliori o in cosa si è migliori piuttosto che semplicemente dire che lo si è!

Come ogni anno non mancheranno le critiche, che secostruttive ci aiuteranno a migliorare questo evento che si è di fatto trasformato in un evento garantito e dalla indubbia qualità. I miglioramenti si vedono di anno in anno, grazie anche alle critiche. Fantastica l'idea di quest'anno di avere i nuovi cartellini con il programma "portatile" e le etichette adesive con la classificazione. Si tratta di innovazioni non importantissime ma che permettono di godersi meglio l'evento. E ancora una volta evidenzio l'importanza della comunità, che ha reso possibile tutto questo.Essere seduti a fianco dei committer principali di PostgreSQL ha evidenziato ancora di piu' l'importanza di questo aspetto del progetto, cosa che ITPug si impegna a diffondere da sempre.

A nome personale e di ITPug vorrei ringraziare tutti i volontari che hanno reso possibile questa grande festa di PostgreSQL: Diego, Simone, Marco, Torello, Emanuele, Daniele, Gianluca, Gabriele, Gianni senza nulla togliere a tutti gli altri.
Arrivederci al prossimo PGDay!

venerdì 3 dicembre 2010

Nuovi libri su PostgreSQL

E' un vero piacere vedere l'uscita di nuovi libri che trattino da vicino PostgreSQL:
I libri sono disponibili sia in formato cartaceo che digitale, e gli autori sono di tutto rispetto essendo implicati direttamente nello sviluppo di questo database.

Compilazione di Nebula

Visto che i download binari di Nebula continuano a non essere accessibili per via del refactoring, l'unica alternativa per usare i widget di questo fantastico progetto è quello di compilarli "manualmente". Per compilare i widget occorre avere CVS (per il dowload del codice), Maven per la compilazione e poi un po' di pazienza (tutto sommato il build è veloce).
I passi da seguire sono i seguenti:
  • creare una cartella che conterrà tutto il progetto;
  • effettuare il login anonimo al server CVS
cvs -d :pserver:anonymous@dev.eclipse.org:/cvsroot/technology login

  • scaricare l'albero dei sorgenti e dei progetti di Nebula:
cvs  -d ':pserver:anonymous@dev.eclipse.org:/cvsroot/technology' co org.eclipse.swt.nebula

  • e infine compilare i progetti org.eclipse.swt.nebula.nebula-incubation (ancora non stabili) e org.eclipse.swt.nebula.nebula-release (stabili): occorre entrare nella directory di ogni progetto e dare il comando mvn install. Ogni progetto avrà poi una cartella target che conterrà il jar finale.

giovedì 2 dicembre 2010

RCP: tray icon

Una applicazione RCP può facilmente visualizzare una icona integrata nel vassoio di sistema (tray). A tale icona può poi essere associato un menu' contestuale e delle relative azioni.
Per aggiungere una icona tray ad una applicazione RCP i passi da seguire sono fondamentalmente:
  1. ottenere un oggetto Tray dopo aver aperto la finestra principale, quindi dall'interno dell'ApplicationWorkbenchWindowAdvisor;
  2. si deve creare un TrayItem per ogni icona da visualizzare (tipicamente una sola);
  3. associare ad ogni item un listener per l'evento MenuDetect (click destro/menu' contestuale) e creare nel modo abituale il menu con le relative azioni e contributi;
  4. associare ad ogni item un listener per l'evento DefautlSelection per minimizzare/massimizzare la finestra principale (o un'altra parte dell'applicazione) quando l'utente fa click (sinistro) sull'icona nel tray.
  5. Il codice seguente mostra come configurare il tray in modo semplice, associando al menu' contestuale le azioni About e Exit. Il metodo configureTray dovrebbe essere chiamato nel post-window-open.

   private void configureTray(){
    // get the workbench window
    final IWorkbenchWindow window = this.getWindowConfigurer().getWindow();
   
    // get the tray for the current running system
    Tray tray = window.getShell().getDisplay().getSystemTray();
   
    // the tray could be null if the system does not support it
    if( tray == null )
        return;
   
    // if here I've got a valid tray, create a tray item and configure it with an image
    TrayItem trayItem = new TrayItem( tray,  SWT.NONE );
    // set the icon
    ImageRegistry imgRegistry = Activator.getDefault().getImageRegistry();
    trayItem.setImage( imgRegistry.get( ... ) );
    // set the tooltip
    trayItem.setToolTipText("...");
   
   
    // add a menu listener on the tray element, so that it can
    // show the menu
    trayItem.addListener( SWT.MenuDetect, new Listener(){

        @Override
        public void handleEvent(Event event) {
        // create a new menu manager
        MenuManager manager = new MenuManager();
        // create the context menu
        Menu trayItemMenu = manager.createContextMenu( window.getShell() );
       
        // add entries to the menu
        manager.add( ActionFactory.ABOUT.create(window) );
        manager.add( ActionFactory.QUIT.create(window) );
       
        // the menu must be visible
        trayItemMenu.setVisible( true );       
        }
       
    });
   
   
   
    // add a listener to the tray icon, so that when the user double clicks
    // on the item the window is popped up again and made visible
    trayItem.addListener( SWT.DefaultSelection, new Listener(){

        @Override
        public void handleEvent(Event event) {
        Shell windowShell = window.getShell();
        if( ! windowShell.isVisible() )
            windowShell.setVisible(true);
       
        windowShell.setMinimized(false);
       
           
        }
       
    });
    }