Capitanfuturo

another blog notes

JSF: update in p:commandButton non funziona con ui:include

Problema
Immaginiamo di avere una pagina principale che includa una sezione. Ora immaginiamo di avere un pulsante nella pagina inclusa che voglia comandare la pagina chiamante.

Prima soluzione: non funzionante
La pagina chiamante è del tipo:
 
    
 
In pagina2.xhtml troviamo il bottone
 

Questa soluzione non funziona ma...

Seconda soluzione: funzionante 
... se aggiungiamo un panelGroup esterno il tutto inizia a girare come desiderato

    
        
    


perchè?

Spiegazione
Il nocciolo della questione sta nel fatto che il codice javascript risiede lato client (viene scaricato con la pagina web per intenderci) mentre JSF viene lavorato lato server. E' il server che processa il file xhtml e genera del html da restituire al client. Ora nel momento in cui premiamo il pulsante lo span generato via JSF non sarà presente per via dell'attributo renreded. La soluzione è quindi quella di mantenere uno span al più vuoto con id="A" in modo che sia sempre a disposizione del codice javascript. Un altro caso di utilizzo di questo accorgimento è quando per esempio apriamo un popup che alla chiusura debba aggiornare la pagina chiamante.
Il consiglio è quindi quello di fare sempre attenzione alla separazione che esiste tra la pagina generata dal server e il codice javascript che facciamo eseguire al client.

Aggiungere una regola di route statico in Windows 7

Lo so che vi domanderete cosa diavolo ci faccia con un Windows sotto la tastiera ma ultimamente per lavoro mi è capitato di utilizzare via RDP una macchina con Windows 7 per programmare. La rete interna accede tramite un gateway specifico alla rete di un cliente e per questo ho dovuto impostare una regola di route con questo semplice comando (ovviamente gli indirzzi sono immaginari) dal prompt dei comandi:

route add 192.168.5.0 mask 255.255.255.0 172.16.18.5

Se volete rendere permanente la regola la poptete salvare appendendo alla fine /p

Unsupported major.minor version


Il post di oggi è un tip sul compilatore Java. Se provate ad eseguire un programma compilato con una versione di Java superiore a quella installata nel vostro sistema operativo o se nell'IDE non avete impostata la giusta compliance allora vi ritroverete con il seguente errore:

Unsupported major.minor version 51.0
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:634)
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:277)
    at java.net.URLClassLoader.access$000(URLClassLoader.java:73)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:212)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:205)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:321)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:266)

Per risolvere il problema sarà necessario aggiornare alla versione riportata nell'errore la vostra JDK o la JRE a seconda che vogliate sviluppare od eseguire il programma in questione.

Eclipse: riparare un workspace corrotto


Stressando l'IDE o a causa di un crash del sistema capita di ritrovarsi con un workspace di Eclipse corrotto e con il seguente messaggio di errore all'avvio:

!MESSAGE The workspace exited with unsaved changes in the previous session;
refreshing workspace to recover changes

Per risolvere il problema senza dover ricreare il workspace è possibile provare prima alcune soluzioni indipendenti:

  1. Rimuovere il file .snap dalla cartella [workspace]\.metadata\.plugins\org.eclipse.core.resources e riavviare eclipse
  2. Rimuovere la cartella [workspace]\.metadata\.plugins\org.eclipse.core.resources\.root\.indexes e riavviare eclipse
  3. Rimuovere la cartella [workspace]\.metadata\.plugins\org.eclipse.ui.workbench e riavviare eclipse

Links
http://www.lazylab.org/197/eclipse/eclipse-hanging-on-startup-repair-corrupt-workspace/
http://stackoverflow.com/questions/207843/how-do-i-prevent-eclipse-from-hanging-on-startup

RaspberryPi: Controllare il desktop da remoto con VNC


Premessa
A volte può essere utile avere l'accesso da remoto ad un desktop grafico sul nostro raspberrypi. Il metodo più diffuso è quello di installare un server VNC e collegarsi poi con un client da un altro computer. Per il raspberrypi possiamo scegliere tra due strade a seconda dell'utilizzo che se ne vuole fare:

  1. Installare TightVNC Server: crea una sessione diversa per ogni connessione non cifrata
  2. Installare x11vnc: permette di comandare il desktop dell'utente corrente sul raspberrypi

Tra i due metodi ho preferito il secondo visto che il mio raspi è collegato direttamente ad un televisore CRT. In questo modo posso navigare in internet su schermo grande direttamente dal tablet comodamente seduto sul divano. Unica nota negativa è che questo meccanismo non funziona per pilotare XBMC, per il quale è meglio utilizzare il client per android per esempio.

Installare TightVNC Server
1. Da linea di comando eseguire
sudo apt-get install tightvncserver
2. Avviare il server con il comando
tightvncserver
e quindi
vncserver :0 -geometry 1920x1080 -depth 24
in questo modo abbiamo creato un server sulla porta 5900 in full HD
3. Se preferite potete scrivere un piccolo script per avviare il server ad ogni avvio con il comando
nano svnc.sh
e copiare il contenuto

#!/bin/sh
vncserver :0 -geometry 1920x1080 -depth 24 -dpi 96
rendiamo lo script eseguibile con il comando
chmod +x svnc.sh
4. Ora potete usare lo script per avviare il server.

Installare x11vnc
1 Se l'idea è quella di visualizzare il desktop corrente del vostro raspberrypi allora è consigliabile usare x11vnc. Per installarlo eseguire
sudo apt-get install x11vnc
e se volete impostare una passowrd per l'accesso
x11vnc -storepasswd
2 Eseguire il server x11vnc con il comando
x11vnc -forever -display :0
Dovreste vedere il vosto indirizzo ip locale sul quael connettersi da remoto
3 Ora potete come prima scrivere uno script per rendere la cosa più semplice al prossimo riavvio con il comando
nano startVnc.sh
e copiare il contenuto

#! /bin/sh
x11vnc -forever -display :0
rendiamo lo script eseguibile con il comando
chmod +x startVnc.sh
4 Possiamo rendere automatico l'avvio del server alla login dell'utente corrente andando ad aggiungere uno script nella cartella /etc/xdg/autostart. Eseguiamo i seguenti comandi
cd /etc/xdg/autostart
sudo nano x11vnc.desktop
ed incollare il seguente contenuto
[Desktop Entry]
Name=VNC Autostart
Exec=/home/pi/startVnc.sh
Type=Application
Terminal=true
5 Salvare e provare con un client a connettersi. L'indirizzo è quello de

Links
http://elinux.org/RPi_VNC_Server

RaspberryPi: configurare un muletto aMule


Premessa
Il progetto di oggi legato al RaspberryPi è quello di configurarlo come muletto. Per comodità ho comprato una pendrive da 32GB collegata al raspi da utilizzare come disco esterno autoalimentato.
L'idea è quella di utilizzare il client GNU\Linux su un'altra macchina per pilotare il demone di aMule utilizzando aMule Remote GUI. In rete spesso si trovano guide per configurare l'interfaccia aMule Web che sconsiglio visto che dagli stessi sviluppatori è ritenuta instabile.



Collegare il Raspberry Pi ad un hard disk o pendrive USB
Questa fase preparatoria ha lo scopo di avere un sistema che riconosca ad ogni avvio la presenza della pendrive e che la monti in una posizione stabile nel tempo. Per ottenere questo risultato è necessario modificare la tabella delle partizioni. Quando GNU\Linux riconosce un drive USB crea un file nella cartella /dev. Per avere un elenco dei drive caricati basta eseguire da linea di comando

sudo fdisk -l

confrontando le dimensioni dei dischi e il tipo di filestystem potrete facilmente riconoscere dove si trova la pendrive. Nel mio caso si trova in /dev/sda1. Se avete formattato la pendrive con il formato NTFS allora dovrete assicuravi di aver installato il seguente pacchetto con il comando da terminale:

sudo apt-get install ntfs-3g

1 Creaiamo una cartella dove andare a montare il disco ad ogni riavvio con il comando

sudo mkdir /media/usbhdd

2 Assegniamo i permessi all'utente di default pi

sudo chown pi:pi /media/usbhdd

3 Proviamo a montare il disco con il comando

sudo mount -t vfat -o uid=pi,gid=pi /dev/sda1 /media/usbhdd

nota che se si sta usando un disco formattato in NTFS sarà da sostiruire -t vfat con -t ntfs-3g

4 Proviamo a smontare il disco con il comando

sudo umount /media/usbhdd

5 Ora siamo pronti a modificare il file di configurazione fstab con il comando

sudo nano /etc/fstab

aggiungere in fondo al file

/dev/sda1 /media/usbhdd vfat uid=pi,gid=pi 0 0

6 Riavviare il raspi per controllare che sia tutto a posto

Installazione e configurazione di aMule
Vediamo ora come procedere con l'installazione e la configurazione di aMule.

1 Il pacchetto di aMule è presente nei repository di Raspbian. Per installare basta quindi

sudo apt-get install amule-common amule-daemon amule-utils

2 Per configurare aMule ad accettare connessioni da remoto dobbiamo creare il file di configurazione ~/.aMule/amule.conf con il comando.

amuled -f

Fatto questo eseguiamo

pikill -9 amuled

per terminare il processo. Ora modificare il file di configurazione con il comando

nano ~/.aMule/amule.conf

Cercare la sezione

[External Connect]

e inserire il valore "1" per la seguente property:

AcceptExternalConnections=1

3 Generiamo una password per l'accesso da inserire nei file di configurazione. La codifica richiesta è in MD5. Possiamo generare la passaword da terminale con il seguente comando:

echo -n nuovaPassword | md5sum | cut -d ' ' -f 1

dove ovviamente sostituire "nuovaPassword" con la password scelta.

4 Aggiungiamo la password appena creata nel file ~/.aMule/amule.conf alla property

ECPassword=

5 Ora nella sezione

[WebServer]

impostare:

Enabled=1
Password=la password generata precedentemente in codifica MD5
Template=default


6 Infine serve configurare il file ~/.aMule/remote.conf

nano ~/.aMule/remote.conf

AdminPassword= la stessa password impostata in amule.conf codificata in MD5
Template=default


7 Uscire e salvare con CTRL+X e Y

Configurare il router
Amule utilizza delle porte prestabilite per le connessioni. Quasi tutti i router hanno le porte di comunicazione chiuse per ragioni di sicurezza. Per configurare il proprio router vi rimando a questa pagina http://www.emule.it/guida_emule/config_porte/routers.asp

Primo avvio di Amule. Aggiugnere i server Met
Dopo il primo avvio se foste interessati ad utilizzare la rete Kademlia http://it.wikipedia.org/wiki/Kademlia dovrete fare il bootstrap dei server met. Un buon sito che ne tiene un elenco funzionante è http://www.giardiniblog.com/server-met/

Da provare: Controllo remoto con Android
Non ho ancora provato ma questo client per Android potrebbe essere molto interessante ed è sviluppato da un italiano

Links
http://raspberrywebserver.com/serveradmin/connect-your-raspberry-pi-to-a-USB-hard-disk.html
http://www.slacky.eu/slacky/AMule_remote
http://www.emule.it/guida_emule/config_porte/routers.asp
http://www.giardiniblog.com/server-met/
https://play.google.com/store/apps/details?id=com.iukonline.amule.android.amuleremote&hl=it

RaspberryPi: configurare l'uscita RCA video


Premessa
Questa settimana vediamo come configurare il raspi per mostrare l'uscita video sul cavo RCA. Disponendo di una televisione a tubo catodico questo è l'unico metodo per godermi il mio XBMC box e trasformare una vecchia TV Grundig Cinaro in una smartTV.
Il RaspberryPi non ha un BIOS convenzionale e sfrutta alcuni file presenti nella scheda SD in posizioni convenzionali per eseguire il bootstrap del sistema. Tutta la configurazione tipica di un BIOS è presente nel file /boot/config.txt nella partizione boot. Questo file viene letto dalla GPU prima che il processore ARM sia inizializzato.



Configurazione
La configurazione base è impostata dai parametri sdtv_mode e sdtv_aspect. La TV che ho sottomano come da libretto di istruzioni è un televisore per il sistema europeo PAL e in formato 16:9. Nella pagina RPiconfig è possibile trovare tutte le possibili modalità ed impostazioni relative alle televisioni. Nel mio caso il sistema PAL viene impostato da sdtv_mode=2 e la modalità in 16:9 da sdtv_aspect=3

Esempio di configurazione
1 Modificare il file /boot/config.txt con il comando da terminale

sudo nano /boot/config.txt

2 aggiungere in coda questi due parametri
sdtv_mode=2
sdtv_aspect=3

3 Riavviare e controllare che tutto sia a posto con il seguente comando da terminale:
sudo /opt/vc/bin/tvservice -s

Blogger + SyntaxHighligther + Bootstrap

Premessa
Come avrete notato da qualche settimana ho aggiornato il layout del blog. Questo nuovo layout è dinamico e basato sul classico Bootstrap. Da anni uso il plugin Javascript di Alex Gorbatche, SyntaxHighlighter per poter renderizzare il codice sorgente. E' un ottimo strumento che si adatta bene anche alla piattaforma Blogger di Google. Peccato che il mix dei tre componenti: Blogger + SyntaxHighlighter + Bootstrap non vadano molto d'accordo. Sembra infatti che il contenuto del post sia caricato successivamente al Javascript.

Workaround parziale
L'idea di fondo per garantire il funzionamento dei vari componenti è quello di ritardare il rendering del codice sorgente contenuto nei post. La soluzione non è certo delle più eleganti visto che si introduce un ritardo programmatico e cementato nel codice ma per adesso è la soluzione più indolore e facile che abbia trovato.

1. Aggiungere i CSS di SyntaxHighlighter nell'head del documento:

< link href='http://alexgorbatchev.com/pub/sh/2.1.382/styles/shCore.css' rel='stylesheet' type='text/css'/ > 
< link href='http://alexgorbatchev.com/pub/sh/2.1.382/styles/shThemeDefault.css' rel='stylesheet' type='text/css'/ >

2. Aggiungere i Javascript per i brashes disponibili in fondo alla pagina, appena prima la chiusura del tag body
< script src='http://alexgorbatchev.com/pub/sh/2.1.382/scripts/shCore.js' type='text/javascript'/>
< script src='http://alexgorbatchev.com/pub/sh/2.1.382/scripts/shBrushJava.js' type='text/javascript'/ >
< script src='http://alexgorbatchev.com/pub/sh/2.1.382/scripts/shBrushSql.js' type='text/javascript'/ >
< script src='http://alexgorbatchev.com/pub/sh/2.1.382/scripts/shBrushXml.js' type='text/javascript'/ >
< script src='http://alexgorbatchev.com/pub/sh/2.1.382/scripts/shBrushXml.js' type='text/javascript'/ >
< script src='http://alexgorbatchev.com/pub/sh/2.1.382/scripts/shBrushBash.js' type='text/javascript'/ >
< script src='http://alexgorbatchev.com/pub/sh/2.1.382/scripts/shBrushJScript.js' type='text/javascript'/ >
< script src='http://alexgorbatchev.com/pub/sh/2.1.382/scripts/shBrushPerl.js' type='text/javascript'/ >
< script src='http://alexgorbatchev.com/pub/sh/2.1.382/scripts/shBrushPlain.js' type='text/javascript'/ >
< script src='http://alexgorbatchev.com/pub/sh/2.1.382/scripts/shBrushScala.js' type='text/javascript'/ >
 
< script language='javascript' type='text/javascript' >
  SyntaxHighlighter.config.bloggerMode = true;
         
  // set timeout and iterate through the appropriate html items
  window.setTimeout(function() {
    jQuery( "pre" ).each(function( index ) {
    SyntaxHighlighter.highlight(undefined, jQuery( this ).get(0));
   });
  }, 3000);
  < /script >

Osservazioni finali
Il timeout dovrebbe essere funzione del broswer e della connessione, cosa che evidentemente non va bene per essere una soluzione stabile nel tempo.
La funzione jQuery analizza tutti i tag pre, dando per scontato che i tag pre vengano utilizzati solo per SyntaxHighlighter, cosa che non è necessariemente vera. Questa limitazione potrebbe corrompere alcuni layout.

Call to action
Se avete delle soluzioni migliori vi prego di condividerle.
Fonte
Ulises Fasoli