SimpleDateFormat: quante insidie

JavaProprio qualche giorno fa mi trovavo a parlare della proprietà lenient della classe SimpleDateFormat, cioè un booleano che, se lasciato al valore di default, permette di riconoscere come “date ben formate” giorni come il 31 febbraio 2012 o cose del genere. Ma le insidie dietro questa classe sono altre, e molto più gravi.

Leggendo la documentazione della classe si trova il seguente commento:

Date formats are not synchronized. It is recommended to create separate format instances for each thread. If multiple threads access a format concurrently, it must be synchronized externally.

Ebbene, quelli della Oracle consigliano di creare delle istanze separate della classe per ogni thread che la usa. Ma cosa succede se non si segue questo consiglio ?
Continua a leggere

Microsoft ClickOnce su Apache Server

Apache ServerMicrosoft ClickOnce è una tecnologia promettente disponibile dalla versione 2.0 del framework .Net (per chi non lo sapesse.. siamo quasi alla 4.5), che si sta diffondendo rapidamente. Consente di avviare delle applicazioni .Net con un solo click da una pagina web, gestisce automaticamente l’aggiornamento software in caso di nuove versioni e sembra poter sostituire completamente il vecchio file Setup.exe. Continua a leggere

Include che non include – PHP

Includendo un sorgente PHP (con include o require e varianti varie ed eventuali), un errore di compilazione interromperà il flusso di programma in cui l’include è presente, senza alcuna segnalazione (tipicamente!).

Se l’inclusione è parametrica e abbiamo bisogno, non solo di proseguire il flusso di programma, ma anche sapere cosa diavolo è successo, è necessario configurare al volo il compilatore al fine di fornirci informazioni sugli errori, almeno nel breve periodo di attivazione della include:

Esempio:

ini_set('display_errors', 1);

while( $row = db_fetch_array( $result ) ) {
$function_library = '/var/www/plugin/' . $row['function'] . '.inc';
if ( ! file_exists( $function_library ) )   continue;
include $function_library;
}

ini_set('display_errors', 0);

Sul reference si vedrà come include o require ritornino un exit code, ma questo vale solo ad indicare inclusione o non inclusione: non gli errori di compilazione del file incluso: semplicemente il codice verrà interrotto TUTTO !!!!!

Link utili:
http://php.net/manual/en/function.error-reporting.php

Cercare il nome di una colonna all’interno dell’intero db [Update: 29/03/12]

oracle db

Aggiornato al 29/03/12, grazie alle segnalazioni di Andrea 😉

Problema: verificare l’esistenza di una determinata colonna all’interno del db inserendo il suo nome o parte di esso

Testato: oracle db, 10g – 11g

Soluzione: eseguire il seguente comando sql sostituendo a nomecolonna il nome della colonna (o parte di esso) da ricercare:

  • Utente amministratore
select table_name, column_name from all_tab_columns
where column_name like '%nomecolonna%'
  • Utente generico
select table_name, column_name from USER_TAB_COLUMNS
where column_name like '%nomecolonna%'

Java Reflection Proxy

javaLa classe java.lang.reflect.Proxy è, senza troppi preamboli, la base di tutti i framework Java che si fondano sui principi della programmazione ad aspetti, e forse anche di tutti quelli che ne fanno a meno.

Attraverso questa classe, è possibile generare a runtime degli oggetti che implementano un determinato insieme di interfacce, anche se tali interfacce sono sconosciute al momento della compilazione o addirittura ancora non concepite dal programmatore. E’ attraverso questa classe che l’application server riesce a fornire una implementazione per gli EJB della nostra applicazione, arricchendo dei semplici metodi con funzioni definite dalle specifiche JPA, JTA, JMS, JNDI etc. etc.
Continua a leggere

Java Native Access (JNA)

Java Native AccessParliamo di una libreria davvero interessante che potrebbe risolvere non pochi problemi nel lavoro quotidiano: JNA, ovvero come utilizzare una DLL di Windows direttamente dal linguaggio Java. Java Native Access (JNA) è una libreria open source che permette di invocare funzioni presenti in librerie del sistema operativo in maniera molto rapida e con la scrittura di poche righe di codice.

A differenza delle librerie JNI (Java Native Interface), per utilizzare JNA non sono richiesti dei passaggi aggiuntivi di preparazione, come la generazione di file intermedi o la compilazione di codice nativo. JNA nasconde al programmatore tutti i dettagli “scomodi” per consentirgli di concentrarsi direttamente sull’obiettivo da realizzare. Al programmatore Java, infatti, è lasciato il solo compito di definire l’interfaccia delle funzioni esportate dalla libreria e queste divengono direttamente utilizzabili. Niente generazione di file di intestazione, niente scrittura o compilazione di codice nativo: solo scrittura di codice Java.

La “magia” diventa possibile attraverso la generazione automatica di stub per le interfacce native, eseguita da JNA al primo tentativo di utilizzo della libreria. Tali stub sono responsabili dell’effettiva traduzione dei tipi di dati (eseguono una conversione in entrambe le direzioni) e del collegamento al codice nativo da eseguire.

Ecco un esempio di codice Java che utilizza le librerie JNA per eseguire una chiamata ad una DLL definita in precedenza. Il codice presuppone che la libreria si trovi nel classpath dell’applicazione con nome “MiaLibreriaNativa.dll” ed abbia una funzione denominata “sayHello” con parametri e valore di ritorno “void”.

import com.sun.jna.Library;
import com.sun.jna.Native;
 
public interface LibreriaNativa extends Library {
    public static LibreriaNativa INSTANCE = (LibreriaNativa) Native.loadLibrary("MiaLibreriaNativa.dll", LibreriaNativa.class);
 
    public void sayHello();
}

Con tali accorgimenti è stata definita l’interfaccia Java LibreriaNativa la cui definizione è del tutto simile a quella della corrispondente interfaccia nativa definita nella libreria DLL. La variabile INSTANCE è lo stub generato da JNA (tramite il metodo loadLibrary della classe Native) che consente l’utilizzo della funzione esportata.

La libreria così “importata” in Java può essere utilizzata in maniera molto semplice attraverso le istruzioni seguenti.
Continua a leggere

Codemotion 2012

image

Si è appena concluso l’evento dell’anno per tutti i nerd d’Italia: il codemotion 2012. Tanti argomenti nuovi, javascript e HTML 5 su tutti, solita caccia al gadget più figo.

I talk interessanti si contano sulla punta delle dita, ma è sempre un momento di incontro di cui non si riesce a fare a meno.