Oltre java.util.Random

Daniel Dyer sta pubblicando sul suo blog una serie di articoli dedicati alla generazione di numeri casuali con Java. Tutti i programmatori Java prima o poi utilizzano la classe java.util.Random, che però va bene solo per semplici casi: necessità di una distribuzione uniforme e nessun requisito di sicurezza.

Per la crittografia usare java.util.Random è un peccato mortale: la classe da utilizzare in questo caso è java.security.SecureRandom. Per verificare quanto siano poco casuali i bit generati da java.util.Random fate riferimento a questa pagina: http://www.alife.co.uk/nonrandom/index.html.

Dyer coglie l’occasione per fare “pubblicità” al suo progetto opensource uncommons-maths, rilasciato sotto licenza Apache, che utilizza diversi motori casuali (Marsenne Twister, un generatore basato sugli automi cellulari che piacerebbe a Stephen Wolfram e un generatore basato su AES) e può generare numeri secondo diverse distribuzioni: uniforme, gaussiana, di Poisson, binomiale e esponenziale. È disponibile un demo che mostra in modo sensibile le diverse distribuzioni, basta eseguire sul proprio terminale preferito:

javaws https://uncommons-maths.dev.java.net/demo/demo.jnlp

Gli articoli pubblicati da mentre scrivo sono i seguenti:

Nei prossimi post della serie Dyer parlerà dei gradi di libertà nel mischiare un mazzo di carte e dei problemi da gestire quando si usano numeri casuali nella crittografia.

Nel suo profilo su LinkedIn Dyer scrive di avere esperienza nella programmazione di giochi online relativi a giochi d’azzardo: nessuna meraviglia che sia interessato alla generazione efficiente di numeri casuali (gli algoritmi random utilizzati da un programma che simuli la roulette può essere perfettamente corretto e “fair”: sono le regole del gioco a far sì che alla fine della giornata il vincitore sia sempre il banco).

Creare un jar con dipendenze con Maven

Maven è un strumento molto utilizzato per gestire il ciclo di vita delle applicazioni sviluppate in Java. Per compilare tutti i sorgenti è sufficiente lanciare il comando:

mvn compile

Una cosa che all’inizio dell’uso di Maven mi era sembrata sorprendentemente ardua era creare un unico .jar contenente tutte le dipendenze necessarie per l’esecuzione del programma. La soluzione è molto semplice. Aprite il pom.xml del vostro progetto e aggiungete il maven-assembly-plugin:

    <build>
        <plugins>

            ...

            <plugin>
                <artifactId>maven-assembly-plugin</artifactId>
                <configuration>
                    <descriptorRefs>
                        <descriptorRef>
                            jar-with-dependencies
                        </descriptorRef>
                    </descriptorRefs>
                    <archive>
                        <manifest>
                            <mainClass>
                                com.application.MainClass
                            </mainClass>
                        </manifest>
                    </archive>
                </configuration>
            </plugin>

            ...

        </plugins>
    </build>

Sostituite com.application.MainClass con il nome della classe contenente il main (compreso il package) e salvate il pom. Per generare il file jar eseguite:

mvn assembly:assembly

Implementare correttamente il pattern singleton in Java

Un pattern usatissimo (e soprattutto abusatissimo) nei linguaggi object oriented è il pattern Singleton, il quale in breve viene utilizzato quando si vuole essere sicuri che di una certa classe esista un’unica istanza. Lasciando da parte le discussioni sul perché sarebbe bene limitare al massimo l’uso di questo pattern, sul come sia sbagliato usarlo per raggruppare un insieme di funzioni “utility” e così via, occupiamoci della sua implementazione. Il metodo più ingenuo per implementarlo è il seguente:

// Implementazione lazy non thread safe
public class MySingleton {
  private static MySingleton instance;

  private MySingleton() {}

  public static MySingleton getInstance() {
    if (instance==null) {
      instance = new MySingleton();
    }
    return instance;
  }
}

Questa implementazione va benissimo finché l’applicazione è formata rigorosamente da un singolo thread. Nel caso in cui più thread possano richiamare il metodo getInstance() c’è una race condition: potrebbero entrambi superare il test dell’if e ottenere due istanze diverse della classe MySingleton.

La prima idea che viene per risolvere il problema è:

// Implementazione lazy corretta ma lenta
public class MySingleton {
  private static MySingleton instance;

  private MySingleton() {}

  public synchronized MySingleton getInstance() {
    if (instance==null) {
      instance = new MySingleton();
    }
    return instance;
  }
}

Questa implementazione è effetivamente thread safe, ma rende il metodo getInstance() sincronizzato, il che ha un certo impatto prestazionale, per cui sarebbe preferibile evitarla. C’è una soluzione semplice che però manca in laziness:

// Implementazione corretta non lazy
public class MySingleton {
  private final static MySingleton instance = new MySingleton();

  private MySingleton() {}

  public static MySingleton getInstance() {
    return instance;
  }
}

Questo codice è thread safe senza usare alcun costrutto particolare del linguaggio. L’unica sua pecca è che il riferimento all’istanza è inizializzato staticamente, per cui potrebbe istanziato anche molto prima della chiamata a getInstance() (basterebbe una chiamata a qualunque metodo statico di MySingleton per istanziarlo). Se nel programma considerato non interessa la laziness, questa può essere una buona soluzione, che ha anche il pregio di funzionare su tutte le versioni della JVM.

C’è una soluzione lazy apparentemente corretta detta double checked locking, molto in voga in passato, che però ha un subdolo bug che di fatto la rende thread unsafe:

// Implementazione non thread safe
public class MySingleton {
  private static MySingleton instance;

  private MySingleton() {}

  public static MySingleton getInstance() {
    if (instance==null) {
      synchronized(MySingleton.class) {
        if (instance==null) {
          instance = new MySingleton();
        }
      }
    return instance;
  }
}

Supponiamo di avere due thread, thread1 e thread2 che richiamano il metodogetInstance(): thread1 passa il test per entrambi gliif e inizia l’istanziazione di MySingleton, a questo punto thread2 esegue il primo if. Poiché non è entrato nella sezione sincronizzata non c’è una relazione “happens before” tra i due thread, e il comportamento del codice non è definito: thread1 potrebbe ricevere una istanza corretta, una non correttamente inizializzata o null (e istanzierebbe dunque un altro oggetto MySingleton, e il pattern è distrutto).

Con Java 5 è stato formalizzato il modello di memoria di Java, e è possibile modificare il codice precedente in modo che sia corretto anche se richiamato da più thread:

// Implementazione lazy thread safe *solo* per Java 5 e successivi
public class MySingleton {
  private volatile static MySingleton instance;

  private MySingleton() {}

  public static MySingleton getInstance() {
    if (instance==null) {
      synchronized(MySingleton.class) {
        if (instance==null) {
          instance = new MySingleton();
        }
      }
    return instance;
  }
}

La differenza è nella keyword volatile davanti alla variabile instance. Dichiarare una istanza come volatile significa che un aggiornamento della variabile stabilisce una relazione “happens before”. In un certo senso è come se i lettori e gli scrittori della variabile utilizzassero blocchi sincronizzati per cui il lettore ha la garanzia di vedere il valore correttamente aggiornato dallo scrittore.

Questo tipo di double checked locking è thread safe e probabilmente più veloce della versione che utilizza il metodo dichiarato come synchronized, anche se la differenza è probabilmente molto piccola. Questa versione non è garantito che funzioni correttamente con versioni di Java dalla 1.4 e precedenti (questo perché il memory model è stato formalizzato con Java 5), mentre è garantito funzionante dalla versione 5 in poi. Inoltre le variabili volatile danno delle penalizzazioni prestazionali su sistemi multi-CPU paragonabili a quelli della sincronizzazione.

Esiste una versione ancora più elegante, lazy, thread safe e funzionante su tutte le versioni di Java ideata da William Pugh:

// Implementazione lazy thread safe
public class MySingleton {
  private MySingleton() {}

  private static class MySingletonHolder {
    private final static MySingleton instance = new MySingleton();
  }

  public static MySingleton getInstance() {
    return MySingletonHolder.instance;
  }
}

Il “trucco” è nel fatto che la classe interna MySingletonHolder viene caricata dal class loader la prima volta che c’e n’è bisogno, vale a dire quando viene usata dal metodo getInstance(), per cui questo codice è thread safe senza usare costrutti particolari, è lazy perché non anticipa l’istanziazione del singleton e funziona su tutte le versioni di Java.

Il singleton è un pattern molto semplice, ma è sorprendentemente poco intuitivo realizzarne una implementazione corretta. A questo proposito Jon Bentley in Programming Pearls ricorda come la prima descrizione dell’algoritmo di ricerca binario (il binary search) sia stata pubblicata nel 1946, ma la sua prima implementazione corretta solo nel 1962. Come scriveva Donald Knuth:

Beware of bugs in the above code; I have only proved it correct, not tried it.

Le nuove tecnologie di KDE 4.0 al Release Event

Al Google Campus di Mountain View in California si sta svolgendo in queste ore il release event di KDE 4.0.
Particolarmente interessante è la presentazione di Aaron Seigo, benevolente dittatore di KDE, dove vengono presentate le tecnologie e i framework che costituiscono la struttura fondante di KDE 4 e ne permetterano, si spera, un ottimo sviluppo. Il ciclo di vita di KDE 4 è previsto essere lungo come quello di KDE 2 e KDE 3 sommati, per cui è prioritario avere delle solide basi che permettano a KDE di evolvere in modo robusto nel tempo. I componenti presentati sono:

Oxygen
Non si tratta propriamente di una tecnologia, ma è l’appeal grafico di KDE. Il progetto Oxygen si è occupato di ridisegnare completamente le icone di KDE (alcune migliaia), ridisegnare il look & feel delle finestre e di creare un nuovo tema di suoni per KDE 4.
Solid
È un set di API che permette un’interazione semplice e multipiattaforma con l’hardware. Permette ai programmi di sapere ad esempio quando viene collegata una fotocamera o un dispositivo di memorizzazione esterno, quali sono le impostazioni attuali del risparmio energetico, se siamo connessi alla rete o ricevere una notifica quando internet è accessibile e così via.
Phonon
Per usare le parole di Seigo, “Phonon è per il multimedia quello che Solid è per l’hardware”. Phonon permette alle applicazioni di interagire con il sottosistema multimediale del desktop environment. Seigo spiega che in cinque linee di codice è possibile realizzare un semplice player video. Con delle API concise e multipiattaforma è possibile sapere se una webcam è collegata e eventualmente utilizzarla.
Akonadi
Nato da KDE PIM, è il servizio di memorizzazione per la gestione delle informazioni personali (PIM). Permette di memorizzare le informazioni delle suite PIM (contatti, email, calendari, appuntamenti) e le rende disponibili attraverso un set di API a tutte le applicazioni. Con poche linee di codice gli sviluppatori di KDE PIM sono riusciti a creare un’applet sul desktop (usando Plasma) che mostra in real time le email in arrivo, in modo ovviamente sincronizzato con la suite principale.
Decibel
È un set di API che permette di interagire con diversi supporti di comunicazione come VoIP, chat e instant messaging anche contemporaneamente.
Kross
È ciò che dovrebbe attirare frotte di sviluppatori su KDE 4 :) È un layer trasparente che permette di accedere alle funzionalità di KDE e delle applicazioni che lo supportanto con qualunque linguaggio di scripting. Attualmente sono supportati “out of the box” ruby, python e javascript. Sono in corso i lavori su krossjava, che permetterà anche l’utilizzo di Java. Se ad esempio una azienda usa molto python e KOffice è possibile esportare degli oggetti da un documento di KOffice e manipolarli in python.
Sonnet
È un correttore ortografico (e in futuro correggerà anche gli errori di grammatica) capace di riconoscere la lingua che sta analizzando adattandovisi automaticamente. Linux.com ha pubblicato un articolo su Sonnet.
DXS
È il protocollo descritto dal Get Hot New Stuff di freedesktop.org che specifica come scaricare in modo user friendly. Per chi conosce KDE è il nuovo protocollo alla base delle finestre di dialogo che permettono di aggiungere temi in Kopete, script in Amarok, widget in SuperKaramba. Un uso abbastanza perverso può essere quello di usarlo per mettere a disposizione calendari di appuntamenti e notificare autmaticamente chi ne ha scaricato uno di eventuali modifiche. Nella sua presentazione Seigo mostra come KStars usando KNewStuff2, che a sua volta usa DXS, possa scaricare in modo semplice per l’utente le informazioni sugli oggetti celesti, e altrettanto facilmente disinstallarli.
Nepomuk
È la tecnologia che gestisce i metadati su KDE 4. Nepomuk permette di aggiungere tag e metadati ai file, consentendo di effettuare ricerche molto complesse sui file. L’esempio che fa Seigo è: “trova le fotografie di giraffe che mi ha inviato John via e-mail”. In una ricerca del genere è incluso il tipo di file (immagini), l’argomento del file (la giraffa), il canale di comunicazione (e-mail), la sorgente (John). Una ricerca del genere è molto macchinosa da realizzare con applicazioni tradizionali come Google Desktop Search, mentre un sistema basato sulle ontologie come Nepomuk permette di farla in modo molto naturale. Le ontologie sono memorizzate in Nepomuk come grafi, che sono una struttura molto inefficiente per le ricerche, per cui viene usato Strigi come motore di ricerca. Poiché è un progetto estremamente recente Nepomuk non è integrato in molte applicazioni, ma con il tempo dovrebbe diventare sempre più onnipresente.
Strigi
È un motore di indexing e di ricerca leggero e veloce. Potete considerarlo un equivalente open source si Google Desktop Search.
ThreadWeaver
ThreadWeaver è un supporto alla programmazione di applicazioni multi-thread che permette di sfruttare in modo semplice le CPU con architettura multi-core, che sono sempre più comuni. ThreadWeaver è basato sull’idea di suddividere le operazioni in job, descrivere le dipendenze tra i job e metterli in coda per l’esecuzione: il supporto li eseguirà nell’ordine ottimale sfruttando i core presenti (il cui numero è noto grazie a Solid). Sebbene sia un aspetto di KDE 4 squisitamente per i programmatori si traduce di fatto dal punto di vista dell’utente in una GUI più fluida e in programmi più rapidi. Insieme a ThreadWeaver Seigo descrive QtConcurrent, una libreria di Qt 4 che astrae l’implementazione dei thread dal sistema operativo sottostante, semplificando la programmazione per più sistemi operativi.
KWin
Come ho riportato in un post precedente KWin ora supporta gli effetti composite.
Plasma
Una delle innovazioni più attese di KDe 4 è Plasma, il motore che si occupa di rappresentare il desktop e i relativi widget come la barra delle applicazioni, l’orologio, il nuovo menu K, i widget che mostrano RSS o fanno interagire con Twitter e così via. Gli sviluppatori possono creare nuovi widget usando il linguaggio che preferiscono grazie a Kross.

La presentazione di Seigo è continua con un piccolo demo del funzionamento Dolphin, il nuovo file manager e il funzionamento di base di KDE su Mac.

Seigo ha anche descritto le nuove possibilità che si aprono per KDE grazie al supporto per più sistemi operativi: da un lato sicuramente attirare più utenti e sviluppatori grazie alla possibilità di sviluppare facilmente programmi non platform dependent, dall’altro quello ad esempio di standardizzare il supporto tecnico nelle aziende. Seigo spiega come sia possibile per una azienda scegliere di supportare Kontact come applicazione per le email, scegliere un server che supporti un qualunque protocollo aperto (non Exchange) e lasciare scelta agli utenti della piattaforma su cui utilizzarlo (Linux, Windows, BSD, Mac, OpenSolaris).

Infine viene presentata la comodità di utilizzare SVG per rappresentare la grafica in modo indipendente dalla risoluzione e una piccola demo di Marble, un componente simile a Google Earth, che in futuro userà il progetto Open Street Map per rappresentare le strade.

KDE 4 si presenta con un insieme di framework portabili e flessibili, sta ora agli sviluppatori e agli utenti trovare modi per farli interagire in modo utile. Il messaggio che ha cercato di veicolare Aaron Seigo è il secondo motto di KDE 4 (il primo è “Be free”): “the start of something amazing”. KDE 4 probabilmente non è ancora maturo, ma è la piattaforma su cui ci saranno, si spera, grandi sviluppi.

Kubuntu Tutorials Day

Keyboard icon by everaldo.comIl “Kubuntu tutorials day” si è tenuto con successo il 13 Dicembre. Per chi non ha potuto parteciparvi (come me :( ) sono disponibili i log all’indirizzo https://wiki.kubuntu.org/KubuntuTutorialsDay.

Il primo tutorial, tenuto dal deus ex machina di Kubuntu Jonathan Riddel, ha affrontato le basi della programmazione di KDE4 con python utilizzando PyKDE 4. Onestamente non ci si riesce a capire molto (e è completamente cinese se non si ha già una infarinatura di base di programmazione con Python e QT). Sostanzialmente jriddel ripercorre le slide che potete scaricare a questo indirizzo (pdf) in modo caotico a causa delle continue interruzioni. Un vero peccato.

Interessante per gli sviluppatori (o almeno per me) è stata la presentazione di Bazaar Version Control, un sistema per la gestione delle modifiche concorrenti a un progetto che supporta diversi workflow rispetto a quelli tradizionalmente supportati da CVS e Subversion, la pagina http://bazaar-vcs.org/Workflows dà una buona panoramica delle diverse modalità di funzionamento disponibili.

Anche la sessione di “Packaging 101″ e “Get your work into Kubuntu” sono state interessanti, oltre a mostrare uno spaccato della comunità che è alle basi di (K)Ubuntu e al suo processo di sviluppo.

La mia personalissima conclusione è che le sessioni su IRC vanno bene per “fare pubblicità”, ma non possono in alcun modo “formare” o insegnare qualcosa che rimanga. Per questo per chi è interessato agli argomenti trattati è bene far riferimento alle pagine del wiki o ai link suggeriti dai tutor delle sessioni:

Una libreria per visualizzare i PDF con Java

Java icon by everaldo.comJoshua Marinacci ha annunciato il rilascio da parte di Sun Microsystem di pdf-renderer, una libreria in puro Java per il rendering di documenti PDF. Questa libreria, derivante dallo sviluppo di OpenOffice, permette di visualizzare sullo schermo i documenti, ma può anche essere usata per effettuarne il rendering su immagini .png. pdf-renderer è in grado solo di visualizzare i PDF e effettuarne il rendering, ma non di crearli, per questo può essere utilmente affiancato a iText. Lo standard PDF 1.4 è supportato in modo pressoché completo, a parte le trasparenze, i form e alcuni encoding.

pdf-renderer è rilasciato sotto licenza LGPL e quindi può essere utilizzato gratuitamente senza eccessivi problemi anche in applicazioni commerciali o closed source, al contrario dell’incumbent JPedal, che viene rilasciato con licenza duale commerciale/GPL (e vanta una maggiore aderenza allo standard come specificato da Adobe).

Trovate una raccolta di librerie per creare, visualizzare e gestire PDF con Java all’indirizzo http://java-source.net/open-source/pdf-libraries.