Hardware o design?

Driiin driin, scendo giù, il mio spacciatore di hardware Apple (k) mi consegna a domicilio il gioiellino (in tutti i sensi): il topo magico! Mouse wireless/touch pad/che altro? Delux!
Scarico il "Wireless Mouse Software", installo, riavvio, apro System Preferences ed eccolo:

Poi, dò un'occhiata alla mia scrivania e ditemi voi se questa non è classe! Grazie Aerandir!

Java Performance: occhio alla concatenazione delle stringhe.

E' utile prestare l'attenzione alle performance del nostro codice, dato che la concatenazione delle stringhe è una delle operazioni più comuni e frequenti.
Oggi ho letto quest'articolo molto interessante
StringBuilder vs StringBuffer vs String.concat - done right e ne riassumo il contenuto qui di seguito.
Il dilemma è :
operatore "+", StringBuffer o StringBuilder?

Innanzitutto è importante sottolineare che gli oggetti String in Java sono immutabili, ovvero una volta creati non possono essere più modificati. Pertanto "modificare" una stringa significa creare un nuovo oggetto e rendere il nuovo oggetto la referenza alla variabile che stiamo modificando. Quindi, quando si concatenano stringhe, non si fa altro che creare un nuovo oggetto con il contenuto delle stringhe concatenate.

Una volta detto questo le deduzioni sono semplici. Se si utilizza:
  • l'operatore "+" ( o String.concat() ): viene creata una nuova stringa, il valore della vecchia viene copiato nel nuovo oggetto e viene accodata l'altra stringa. Più lunga è la stringa, più lento è il processo (che coinvolge anche il Garbage Collector per la rimozione degli non più utilizzati). Evitate di utilizzare "+" in un loop! Va benissimo per System.out.println("x:"+x+" y:"+y);

  • la classe StringBuffer: è una sequenza di caratteri "thread-safe" (synchronized) e modificabile. In qualsiasi punto ed in ogni momento, il contenuto può essere può essere modificato utilizzando gli appositi metodi ( append, insert ... ).

  • la classe StringBuilder (a partire da Java 1.5): il funzionamento è pressocchè uguale ma è più veloce di StringBuffer, poichè non è synchronized.
IN CONCLUSIONE: And the winner is.... StringBuilder!!!
Se dobbiamo costruire delle stringhe molto lunghe, o all'interno di loop o ancora modificarne frequentemente il contenuto, è senz'altro indispensabile utilizzare StringBuilder. Per semplici concatenazioni di piccole stringhe, utilizziamo il "+" che riduce notevolmente la quantità di codice da scrivere.

Convenzioni per la scrittura di codice Java

Eleganza, ordine, leggibilità e manutenibilità del codice ... chi più ne ha più ne metta... le convenzioni per la scrittura del codice ( Java o qualsiasi altro linguaggio di programmazione) sono fondamentali, specie quando si lavora in team.
Di solito sono concetti assodati, che i programmatori acquisiscono con lo studio e l'esperienza lavorativa, ma purtroppo spesso non sono scontati per tutti.
Un documento che dovremmo leggere tutti è il seguente:

Linee guida della Sun per la scrittura del codice Java

Se invece volete riderci su ed imparare come scrivere codice pessimo, potete leggere questi preziosi consigli (ovviamente sarcastico): http://soft-land.org/cgi-bin/doc.pl?doc=documenti/pessimo (ESILARANTE!!!) :D


Down di Gmail ... di nuovo ...

Google è attualmente l'esempio più macroscopico di Cloud Computing. Indubbiamente ed indiscutibilmente all'avanguardia per la qualità e l'innovazione dei servizi offerti ... ma sempre più spesso siamo i protagonisti di scomodi "down" dei servizi. Oggi Gmail fuori uso ...


AppStatus di Google riporta:

Ed ancora:
- 02 settembre 2009
- 26 febbraio 2009

L.A.P. #1 al DMI

Finalmente anche in ambito accademico si comincia a fare qualcosa di concreto ed innovativo che proietti gli studenti al mondo del lavoro. Ad ottobre, presso il Dipartimento di Matematica ed Informatica di Catania, partirà il nuovo corso universitario di programmazione per iPhone, denominato L.A.P #1 (Laboratorio Avanzato di Programmazione): un corso specifico per la programmazione del nuovo dispositivo di casa Apple.

Il corso di 48 ore è strutturato in moduli didattici da due ore ciascuno. Potete visionare il programma QUI. Docenti del corso sono il prof. Vincenzo Cutello (Ordinario presso il Dipartimento di Matematica ed Informatica) ed il Dott. Costantino Pistagna (ricercatore presso lo stesso dipartimento).
In Italia, solo il Politecnico di Milano, aveva proposto A PAGAMENTO (1000 e rotti €) un corso per programmazione iPhone, pertanto l'iniziativa del C.d.L. in Informatica è certamente degna di nota e l'interesse degli studenti sembra già altissimo.

Obiettivo e' la formazione di nuovi programmatori specializzati in quest'ambito. In tal modo, si vuole offrire agli studenti del corso di laurea, competenze all'avanguardia spendibili sul territorio rilanciando, al contempo, l'ateneo Catanese.

La realtà Apple/iPhone è molto vicina ad i giovani e L.A.P. #1 significa:
- avere un punto di riferimento per iniziare a scoprire la programmazione su Cocoa
- offrire una valida alternativa di lavoro ai neo-laureati
- aprire una nuova porta sull'innovazione e lo sviluppo economico
- iniziare a far crescere un campo di sviluppo ancora "verde" in Italia

Complimenti ed in bocca al lupo ad insegnanti e studenti!

Dead software walking

Come risposta a questo vecchio post "News dalla Compuware", ecco che fine ha fatto OptimalJ:

http://en.wikipedia.org/wiki/OptimalJ

Come un oggetto della storia passata, la biografia di un artista che riporta la data di nascita e la data di morte, è finito su Wikipedia con i miei dolori a seguito ... Aspettative tradite, progetto abbandonato! Ed io? Continuo a mantenere un sistema software massiccio con questo cadavere tra le mani, che si fa sempre più pesante ... Ahimè!

10 Veri Motivi per non aggiustare il pc agli amici!

Scusate se ricopio ... ma è troppo bella per passare inosservata!
(grazie a http://www.baldo.it/update/2009/divertenti/10-veri-motivi-per-non-aggiustare-il-pc-agli-amici/ )
RIPORTO FEDELMENTE:

(1) Diventi automaticamente disponibile sempre e per sempre; a qualunque ora del giorno e della notte, ovunque tu sia: al lavoro, sotto la doccia…
“Pronto, ciao ti disturbo?”
“Beh in questo momento sono in barca in ferie…”
“Ah… ma tanto tu fai presto in queste cose. Senti ho il computer che quando lo accendo mi da errore 000×32F33. Cosa può essere? Sono disperato…”
“Si, ma sono in mezzo al mare”
“Va bene. Dimmi cosa devo fare…”

(2) Diventi oggetto di una catena di passaparola selvaggio.
“Aspetta che lo chiedo a un mio amico, lui di sicuro lo sa. Poi è molto alla mano e se ha tempo ti da una mano volentieri.”

(3) Diventi automaticamente il responsabile e amministratore del PC
“Ti ricordi che l’anno scorso mi avevi installato quel programma per vedere i filmati? Ecco, stamattina, vado ad accendere il PC e non si accende più, cosa può essere successo? Non è che hai fatto qualcosa di strano?”

(4) Devi conoscere tutti i programmi e tutti i sistemi operativi esistenti sul pianeta. Da Blender al GWBASIC, da Windows 95 alle più improbabili distro di Linux. Dovrai saper fare tutto di tutto: non sono ammesse lacune per chi “conosce il computer”
“Senti, scusa se ti disturbo, ma ho un problema: come faccio ad importare un audiolibro con Itunes?”
“Guarda, mi dispiace, ma non ho l’Ipod e Itunes non lo conosco”
“Dai che tu ci capisci di sicuro più di me. In due minuti tu fai tutto…”

(5) Diventi, per esteso, la prima persona da consultare per tutto ciò che funziona a corrente elettrica
“Ciao, scusa se ti disturbo, ma ho l’home theatre della sala che non funziona più bene. Tu guardi anche quelle cose lì? Perchè è da qualche giorno che si sente un fruscio dal vufer e magari bisogna solo cambiare un fusibile…”

(6) Vieni visto come uno spacciatore di hardware
“Ciao, scusa se ti disturbo, volevo comprarmi un PC portatile, tu non è che hai delle bazze?”
“No”
“Come no? Lavorando nei computer vuoi che non ti passi sotto mano qualche occasione? Beh se hai qualcosa fammelo sapere, intanto mi daresti un’occhiata a dei preventivi che mi sono fatto fare?”

(7) Devi sempre navigare nell’ignoto.
“Ciao, scusa se ti rompo, ma il PC non va più”
“Come non va più? Non si accende o cosa?”
“No no, si accende ma poi non va”
“Cos’è che non va? Il sistema operativo?”
“Io non ci capisco mica niente… non va”
“Ma che sistema operativo hai?”
“Cosa vuoi che ne sappia io che sistema operativo ho….cos’è il sistema operativo? Dove devo leggere? Guarda, fai prima se vieni qua a dare un’occhiata, aspetto, vai tranquillo, va bene anche stasera dopo il lavoro…”

(8) Lavorerai sempre gratis… se va bene!
Al di là di qualche caffè offerto, non vedrai mai un soldo. Di sicuro, però, ne spenderai: viaggi, telefonate, probabilmente anche cavetti, vecchi componenti, batterie, viti, ecc…

(9) Grazie alla tua disponibilità, sarai sempre sottovalutato e verrai classificato al massimo come “smanettone”.
I “tecnici”, quelli veri, fanno le stesse cose che fai tu (forse con meno cura), ma prendendo 80 euro all’ora, saranno visti come semidei.

(10) Serve davvero un decimo motivo?

-_-

HttpSessionListener: come gestire gli utenti on line in Java

Scopo di questo articolo è proporre una soluzione semplice ad una delle problematiche più comuni che riguarda un'applicazione web: mantenere la lista degli utenti on line.
Innanzitutto distinguiamo i concetti di HttpSession e ServletContext.
In un'applicazione J2EE, una sessione (tipicamente legata ad un'utente) è rappresentata dalla classe javax.servlet.http.HttpSession e fornisce un'associazione tra il client HTTP ed il web server. Un ServletContext è costituito da un gruppo di servlet, pagine JSP o altre pagine web che condividono tra di loro risorse e dati. Ogni Servlet Context corrisponde, in pratica (a partire dalle specifiche 2.1 sulle Servlet), all'intera applicazione web, al contrario della sessione le cui risorse sono disponibili solo all'interno della sessione stessa.

Pertanto, la lista degli utenti on line (ad esempio un HashMap con chiave = sessionId e valore = username), sarà conservata in ServletContext. Ciò implica che:
1. quando un utente effettua il login sull'applicazione web e viene instanziata una nuova sessione sul web server, aggiungeremo una entry alla lista degli utenti;
2. quando un utente effettua il logout dall'applicazione web oppure la sessione va in timeout e scade, rimuoveremo la relativa entry dalla lista.

Java mette a disposizione degli sviluppatori, un'utilissima interfaccia (un listener) javax.servlet.http.HttpSessionListener che viene notificata con degli eventi ogni volta che la lista delle sessioni attive in una web application subisce un cambiamento.

I metodi da implementare sono :
- void sessionCreated(HttpSessionEvent se) : notifica della creazione di una sessione
- void sessionDestroyed(HttpSessionEvent se) : notifica dell'invalidazione di una sessione

Ad esempio:

package example;

public class MyHttpSessionListener implements HttpSessionListener {

public void sessionCreated(HttpSessionEvent event) {

/* AGGIUNGI QUI L'UTENTE LOGGATO,
ALLA COLLECTION CONSERVATA IN SERVLET CONTEXT */
}

public void sessionDestroyed(HttpSessionEvent event) {
/* RIMUOVI QUI L'UTENTE LOGGATO,
DALLA COLLECTION CONSERVATA IN SERVLET CONTEXT
...
(HashMap)
event.getSession().getServletContext().getAttribute("userList").remove(event.getSession().getSessionId());
*/

}
}


Per attivare il listener, è inoltre necessario aggiungere la seguente voce al file web.xml:

<listener>
<listener-class>
example.MyHttpSessionListener
</listener-class>
</listener>

Riferimenti:

- http://java.sun.com/products/servlet/2.1/api/javax.servlet.http.HttpSession.html
- http://java.sun.com/j2ee/sdk_1.3/techdocs/api/javax/servlet/http/HttpSessionListener.html
- http://www.mokabyte.it/2002/01/servlet23_2.htm

Campagna Anti - Facebook


E’ da mesi che la gente mi pone sempre la stessa domanda:

“Ma tu … non ci sei su Facebook??? ”

Ebbene NO, NON CI SONO SU FACEBOOK!!!
Dovrei?!? E’ obbligatorio?!?
Sembra diventare il must dei nostri tempi, una specie di ufficio anagrafe mondiale. Se evadi le tasse, nessuno ci fa caso, ma se non hai un account su Facebook, sei davvero una persona strana!

Diventa una droga, un morbo subdolo … cercare, conoscere, pubblicare, apparire: una vita on line.
Ma perchè? Perchè tutti hanno bisogno di comunicare cosa fanno in ogni istante della propria giornata? Perchè tutti devono sapere cosa farò stasera, o dove sono stata ieri mattina? Perchè devo essere “taggata” sulle fotografie, come se avessi dietro paparazzi autorizzati ma senza essere una VIP?

Non ci rendiamo conto di come, inconsciamente, questo meccanismo infernale sta entrando ed invadendo le nostre vite. E a cosa servono le leggi sulla tutela della privacy quando un conoscente, con un solo click, permette a Facebook di inviare una mail di invito a “tutta” la sua rubrica dei contatti? Non pensate che sia ora di svegliarsi?

Non voglio essere assolutamente negativa: indubbiamente, Facebook ha permesso a tantissime persone di ritrovarsi piacevolemente dopo anni ed anni e, per certi aspetti, è davvero un meraviglioso aggregatore sociale che accorcia le distanze e tavolta, ha aiutato tantissime persone a sentirsi meno sole ed a trovare qualcuno con cui scambiare i propri pensieri .
Il problema nasce quando la sottile linea di confine tra il piacere di ritrovarsi con gli “amici” e la “necessità” di conoscere tutti i particolari della vita privata altrui, viene ampiamente oltrepassata.

Si litiga su Facebook, si discute di tutto e di tutti. Se non accetti “l’amicizia” di qualcuno che hai visto solo una sera in tutta la tua vita, magari si offende. Amici di Facebook… possibilmente, gente a cui hai stretto la mano per dire “Molto piacere” si dichiara tuo”AMICO” … 200 amici??? Davvero??? Ma che fortuna ad avere tutti questi amici … ! Non sarebbe forse opportuno chiamarli CONOSCENTI?
Che valore diamo ai veri rapporti? Che prezzo ha un sorriso vero, che possiamo vedere con i nostri occhi?
Riflettiamo, riflettiamo … stiamo perdendo il senso della realtà … viviamo una realtà virtuale. Ma se ci pensate bene … una “realtà”, in quanto reale … non può essere virtuale. Significa che stiamo prendendo in giro noi stessi… quando siamo felici di avere tanti “amici”, ma se l’adsl va giù, ci ritroviamo soli come cani …

CONFIGURAZIONE DI JBOSS CON SSL

Transport Layer Security (TLS) e il suo predecessore Secure Sockets Layer (SSL) sono dei protocolli crittografici che permettono una comunicazione sicura e una integrità dei dati su reti TCP/IP come, ad esempio, internet. TLS e SSL operano a Livello di trasporto (Transport Layer) e criptano la comunicazione dalla sorgente alla destinazione (end-to-end).

Quando viene installato un certificato SSL su di un server in cui è presente JBoss, si devono eseguire i seguenti passi per la configurazione di Tomcat dentro l'application server.
  1. Creare la chiave del server con il seguente comando :

    keytool -genkey -alias <keyalias> -keypass <yourpassword> -keyalg RSA -keysize 1024 -dname "CN=<commonname>,O=<organizationName>,OU=<organizationUnitName>,C=<countryName>" -keystore server.keystore -storepass <yourpassword>

    dove :

    <keyalias> è il valore dell'attributo keyalias che troviamo nel file server.xml ( dentro la directory {jboss_home_dir}/server/default/deploy/jbossweb-tomcat55.sar )

    <Connector className="org.apache.catalina.connector.http.HttpConnector"
    maxThreads="100" strategy="ms"
    maxHttpHeaderSize="8192" emptySessionPath="true"
    scheme="https" secure="true" clientAuth="false" keystoreFile="${jboss.server.home.dir}/conf/server.keystore" keystorePass="mypassword" sslProtocol = "TLS" keyAlias="mykeyalias" />


    <companyName> es. www.youserver.it
    <organizationName> es. GARR
    <organizationUnitName> es. UNIPI (se ne possono specificare più di uno)
    <countryName> es. IT
    <yourpassword> es. mypassword

    ESEMPIO:
    keytool -genkey -alias mykeyalias -keypass mypassword -keyalg RSA -keysize 1024 -dname "CN=www.myserver.it,O=GARR,OU=UNIPI,OU=CED,C=IT" -keystore server.keystore -storepass mypassword

  2. Copiare il file server.keystore, generato sopra, nella cartella {jboss home dir}/server/default/conf/

  3. Certificare la chiave con il certificato CA, attraverso il seguente comando :
    keytool -certreq -keystore server.keystore -alias mykeyalias -file mycert.pem

ERRORI COMUNI:

Quando JBoss non è opportunamente configurato dopo l'installazione del certificato SSL , in fase di avvio dell'application server viene rilevata la seguente eccezione:

java.io.IOException: Keystore was tampered with, or password was incorrect

Questo avviene se:
  • il file server.keystore non è stato ancora generato
  • il file server.keystore è stato manomesso
  • dentro il file server.xml (di cui sopra) la voce Connector è commentata
  • dentro il file server.xml (di cui sopra), alla voce Connector i valori degli attributi (es. keyalias o keystorepass)


Fonti:
  • http://cybertrust.omniroot.com/support/codesigning/codesign_sunjava.cfm
  • http://www.theserverside.com/discussions/thread.tss?thread_id=22243
  • http://jack.godau.googlepages.com/jbosscertificatesandopenssl