468x60

venerdì 21 dicembre 2012

Problema reload embedded PDF in Vaadin

In Vaadin per visualizzare i PDF che ho generato ho utilizzato il componente Embedded, ma ho riscontrato un problema: il pdf non viene ricaricato dal browser se non viene generato con un nome diverso, a causa del caching. Per risolvere questo problema ho aggiunto un timestamp al nome del file generato.
String outputFile = path + File.separatorChar + nomeFile + timestamp + ".pdf";
File pdfFile = new File(outputFile);
Embedded e = new Embedded(null, new FileResource(pdfFile, getInstance()));
e.setMimeType("application/pdf");
e.setType(Embedded.TYPE_BROWSER);
e.setSizeFull();
VerticalLayout layout = new VerticalLayout();
layout.setSizeFull();
layout.addComponent(e);
printWindow.setContent(layout);
mainWindow.addWindow(printWindow);

lunedì 15 ottobre 2012

FancyBox auto close

Vediamo come fare per chiudere automaticamente un FancyBox dopo un tempo determinato:
$(document).ready(function() {
 $(".fancybox").fancybox({
  width: 640, // o altro
  height: 320,
  afterLoad: function(){
   setTimeout( function() {$.fancybox.close(); },3000); // 3000 = 3 secondi
  }
 });
});

venerdì 5 ottobre 2012

File batch per comprimere più files in diversi archivi

Vediamo come scrivere un file batch Windows per comprimere con 7zip più files in diversi archivi zippati, in modo che ogni file venga zippato nel suo archivio. Alla fine avremo nomefile1.zip nomefile2.zip ecc...
@ECHO OFF
CD "C:\Documents and Settings\user\Desktop\t"
FOR %%A IN (*) DO "C:\Programmi\7-Zip\7z.exe" a -tzip -mx9 -mm=LZMA "%%A.zip" "%%A"

lunedì 1 ottobre 2012

MySQL binlog size

Dovendo lavorare con la replicazione in MySQL ho dovuto abilitare i binlog, ma questo ha portato dopo alcuni mesi alla saturazione dello spazio su disco. Il motivo? Non c'era alcun limite all'archiviazione dei binlog. Per risolvere il problema basta aggiungere questo comando nel file di configurazione di MySQL:
expire_logs_days = X
Dove X è il numero di giorni da tenere

martedì 7 agosto 2012

Ordinamento con NULL in MySQL

L'ordinamento ascendente in MySQL funziona in modo da mettere in cima i valori NULL.

Ad esempio, SELECT nickname, name FROM people ORDER BY nickname, produrrà:
nickname name
NULL Art
NULL Mary
Abby Abigal
Bobby Robert
Cindy Cynthia

Capita alcune volte di voler cambiare questa logica in modo da mettere in fondo i valori NULL, per ottenere un risultato di questo tipo:
nickname name
Abby Abigal
Bobby Robert
Cindy Cynthia
NULL Art
NULL Mary

Per farlo dobbiamo aggiungere un campo calcolato, che chiameremo ad esempio ordine, ed ordinare prima in base ad esso. SELECT nickname, name, IF(nickname IS NULL,1,0) AS ordine FROM people ORDER BY ordine, nickname, che produrrà:
nickname name ordine
Abby Abigal 0
Bobby Robert 0
Cindy Cynthia 0
NULL Art 1
NULL Mary 1

venerdì 3 agosto 2012

Update condizionale in MySQL

Vediamo come eseguire un update condizionale in MySQL:
UPDATE tabellaSET campo = IF(condizione, valore se true, valore se false)

martedì 24 luglio 2012

Abilitare il log delle query in MySQL

Vediamo come abilitare il log delle query in MySQL, una funzionalità molto utile per il tuning ed il debug...

Accedere alla console di MySQL e digitare i seguenti comandi:

// per redirigere l'output su tabella
set global log_output='table';

// per abilitare il log
set global general_log=1;


// per disabilitare il log
set global general_log=0;

venerdì 20 luglio 2012

Root path in Vaadin

Come ottenere il path della root della web application in Vaadin:
getApplication().getContext().getBaseDirectory()

mercoledì 18 luglio 2012

Applicazione demo del SQLContainer Vaadin

Da quando il SQLContainer è stato reso parte integrante del framework Vaadin l'applicazione demo ufficiale non è più quella presentata nel Book di Vaadin (il quale dovrebbe essere corretto perchè porta un riferimento a com.vaadin.addon.sqlcontainer.demo)...


Ecco dove trovare il nuovo demo:
http://dev.vaadin.com/svn/demo/demo-site/src/com/vaadin/demo/sqlcontainer

martedì 17 luglio 2012

Java e timestamp da MySQL con JDBC

Per mostrare correttamente un timestamp da un db MySQL, con JDBC, bisogna leggere il dato appunto con getTimestamp() e non getDate()... vediamo un esempio:
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm");
data = sdf.format(rs.getTimestamp("data"));

lunedì 16 luglio 2012

Redirect frame in un frameset

Vediamo il codice javascript da utilizzare per effettuare il redirect di un frame da parte di un altro frame nel frameset:
parent.frames['nomeframe'].location.href='url';

venerdì 22 giugno 2012

Date e variabili in Linux/Unix

Vediamo come fare per assegnare una data ad una variabile, in particolare formattiamo la data per restituire solo l'anno:
anno_cur=`date +%Y`
Adesso vediamo come sottrarre un valore alla variabile anno_cur per ottenere l'anno precedente:
anno_prec=`expr $anno_cur - 1`
NB: è importante usare il carattere ( ` ) non il carattere apice ( ' )

Sottrazione variabili in Linux/Unix

Lavorando su vecchi sistemi Unix ho avuto necessità di sottrarre due variabili, per farlo non basta semplicemente $var1-$var2 :-(

Vediamo come fare:
c=$(expr $a - $b)

lunedì 4 giugno 2012

Soluzione Cannot load from mysql.proc...

Cannot load from mysql.proc. The table is probably corrupted

E' possibile risolvere questo errore di MySQL eseguendo il seguente comando, il quale provvederà ad eseguire un fix dell'interno DBMS:
mysql_upgrade -uroot -p

giovedì 24 maggio 2012

Embeddare pagine JSP in Vaadin

L'argomento largamente trattato in rete è quello di come embeddare un'applicazione Vaadin dentro una pagina JSP, ma c'è molto poco o nulla su come invece embeddare una pagina JSP dentro un'applicazione Vaadin... Vediamo come fare:
  • Copiare i files JSP che ci interessano direttamente sotto la cartella WebContent, oppure dentro una sotto-cartella che creeremo appositamente che chiameremo "jsps"
  • Editare il file web.xml aggiungendo il seguente servlet-mapping
<servlet-mapping>
   <servlet-name>jsp</servlet-name>
   <url-pattern>/jsps/*</url-pattern>
</servlet-mapping>
  • A questo punto l'ambiente è pronto, adesso dobbiamo solo creare un contenitore per embeddare la pagina, come abbiamo fatto nel precedente post
Window subwindow = new Window("Titolo");
subwindow.setWidth("90%");
subwindow.setHeight("90%");
subwindow.setModal(true);
Embedded e = new Embedded("", new ExternalResource("nomeApp/jsps/mypage.jsp");
e.setType(Embedded.TYPE_BROWSER);
e.setSizeFull();
VerticalLayout layout = new VerticalLayout();
layout.setSizeFull();
layout.addComponent(e);
subwindow.setContent(layout);
getWindow().addWindow(subwindow);

mercoledì 23 maggio 2012

Vaadin ed Embedded setSizeFull

Utilizzando Vaadin mi sono imbattuto in uno strano problema di layout col componente Embedded. In pratica, nonostante il componente fosse impostato con setSizeFull(), che equivale a setWidth("100%") e setHeight("100%"), verticalmente occupava solo una piccola parte dell'area disponibile.

Per risolvere il problema ho dovuto mettere il componente Embedded dentro un container VerticalLayout, impostando anch'esso con setSizeFull(). Vediamo un esempio:

Window subwindow = new Window("Titolo");
subwindow.setWidth("90%");
subwindow.setHeight("90%");
subwindow.setModal(true);


Embedded e = new Embedded("", new ExternalResource(url));
e.setType(Embedded.TYPE_BROWSER);
e.setSizeFull();


VerticalLayout layout = new VerticalLayout();
layout.setSizeFull();
layout.addComponent(e);
subwindow.setContent(layout); getWindow().addWindow(subwindow);
Problema risolto! Adesso il componente Embedded copre tutta l'area di subwindow :)

lunedì 21 maggio 2012

Notifiche desktop per Google Calendar

E' possibile abilitare le notifiche desktop per Google Calendar configurando in modo opportuno il browser Google Chrome, vediamo come:


  1. Verificare che Chrome abbia le notifiche desktop abilitate. Selezionare Strumenti-> Opzioni-> Roba da Smanettoni-> Impostazioni Contenuti
  2. Selezionare Notifiche ed assicurarsi che sia selezionata l’opzione "Chiedi quando un sito vuole mostrare le notifiche desktop (consigliato)" e che nelle eccezioni non sia presente Google Calendar
  3. Accedere al proprio account Calendar, cliccare sul link Impostazioni-> Impostazioni Calendar-> Labs
  4. Individuare e attivare i "Promemoria Discreti"
  5. Premere il pulsante "Salva", all'apparire della barra di richiesta acconsentire affinché Calendar possa inviare notifiche a Chrome
Adesso avremo le notifiche di Calendar sul desktop :)

sabato 5 maggio 2012

Problemi reinstallazione MySQL

Vi è mai capitato di ottenere questo fastidiosissimo messaggio di errore dopo la reinstallazione di MySQL?
can't connect to mysql server on 'localhost' (10061)
Dopo aver fatto un upgrade ad una versione successiva non riuscivo proprio a connettermi con nessun utente...

Bene, per risolvere questo problema basta semplicemente aggiungere questa riga al file di configurazione di MySQL my.ini o my.cnf
bind-address=0.0.0.0
In ogni caso, se provenite da una reinstallazione come nel mio caso, assicuratevi di aver seguito tutti i passi di questa procedura:
  • Se non lo avete già fatto, backuppare tutto dal vecchio MySQL prima di rimuoverlo, dati ed utenti, col comando mysqldump --routines --all-databases -uroot -ppassword > backup.sql
  • Disinstallare MySQL
  • Rimuovere la cartella dati, tipicamente su C:/Documents and Settings/All Users/Application Data/MySQL/MySQL Server 5.5/Data/
  • Rimuovere la cartella di installazione di MySQL, tipicamente su C:/Program Files/MySQL

giovedì 3 maggio 2012

Path di webapps su Tomcat

Il path assoluto della web application, all'interno di una Servlet, è possibile ottenerlo nel seguente modo:
javax.servlet.ServletContext.getRealPath("/");
Se invece dobbiamo risalire al path assoluto da una classe che non sia una Servlet, possiamo farlo attraverso la variabile di sistema catalina.home, la quale identifica il path assoluto della root di Tomcat:
System.getProperty("catalina.home") + "/" + webapps;

Problema tabelle case sensitive in MySQL

Ho riscontrato un fastidioso problema nella sincronizzazione di database MySQL di sistemi diversi dovuto ai nomi delle tabelle, che su alcuni sistemi è case sensitive di default. Il problema in questione l'ho risolto modificando il file di configurazione di MySQL, che su Linux si trova su /etc/mysql/my.cnf, aggiungendo la seguente riga:
lower_case_table_names=1

martedì 24 aprile 2012

Soluzione errori in Replica MySQL

ERROR 1201 (HY000): could not initialize master info structure more error messages can be found in the mysql error log

Questo fastidioso errore l'ho risolto col comando FLUSH SLAVE;

:-)

lunedì 23 aprile 2012

Parametri opzionali in BIRT

E' possibile passare dei parametri opzionali ai reports BIRT. Per farlo bisogna eseguire uno script beforeOpen prima dell'apertura del dataset interessato. Ecco un esempio di codice:
if(params["nome_parametro"].value) {    this.queryText += " AND parametro='"+params[" nome_parametro "]+"'";}

Reports con Vaadin

La migliore soluzione che ho trovato al momento per integrare reports in applicazioni web Vaadin è stata di avvalermi di BIRT. Inizialmente avevo tentato l'embedding di reports Jasper, ma dopo una serie di problemi di visualizzazione ho optato per BIRT, il quale mette a disposizione out-of-the-box un'ottima e leggera applicazione web per la visualizzazione di reports con comodissime funzioni quali esportazione del report in diversi formati, esportazione dei dati, stampa, form inserimento parametri per reports parametrici... Inoltre è disponibile un'ottima documentazione, un'ampia community, ed un ottimo report designer al pari di iReport di Jasper.

giovedì 19 aprile 2012

Visualizzare un date picker in BIRT

La pagina di input dei parametri in BIRT di default non ha il date picker per inserire le date. Vediamo come fare per aggiungerlo:

- Scaricare JSCal2-1.9 da http://www.dynarch.com/projects/calendar/download/1.9/ ed estrarre il contenuto sul web viewer nella directory /birt/webcontent/birt.

- Modifichiamo il file birt/webcontent/birt/pages/layout/FramesetFragment.jsp, aggiungendo le seguenti righe di codice prima del tag </HEAD>
<link rel="stylesheet" href="birt/JSCal2-1.9/src/css/jscal2.css" type="text/css"><link rel="stylesheet" href="birt/JSCal2-1.9/src/css/border-radius.css" type="text/css">
<link rel="stylesheet" href="birt/JSCal2-1.9/src/css/win2k/win2k.css" type="text/css"><script src="birt/JSCal2-1.9/src/js/jscal2.js" type="text/javascript"></script><script src="birt/JSCal2-1.9/src/js/lang/it.js" type="text/javascript"></script>
- Modifichiamo il file birt/webcontent/birt/pages/parameter/TextBoxParameterFragment.jsp, aggiungendo le seguenti righe di codice a fine pagina prima del tag /TD>
<%if(parameterBean.getParameter().getDataType()==7 || parameterBean.getParameter().getDataType()==4) {%><button id="<%=parameterBean.getName()%>_calendar-trigger"...</button><script type="text/javascript">Calendar.setup({inputField : "<%=parameterBean.getName()%>",trigger : "<%=parameterBean.getName()%>_calendar-trigger",
onSelect : function() { this.hide() }});</script><%}%>

mercoledì 18 aprile 2012

Porta 8009 bloccata da Tomcat

port 8009 required by Tomcat server at localhost is already in use

Questo messaggio mi ha tormentato per qualche ora, poi ho trovato la causa e la soluzione sul seguente ottimo tutorial :)

http://www.stanicblog.com/2012/01/how-to-kill-apache-tomcat-without.html

mercoledì 11 aprile 2012

Avvio automatico di una MV su Ubuntu

Per avviare automaticamente al boot di Ubuntu una macchina virtuale con VMware Player, basta aggiungere il seguente comando alle applicazioni di avvio:
vmplayer /pathmv/filename.vmx

mercoledì 29 febbraio 2012

Tabelle con righe numerate in Vaadin

Per avere una colonna col numero di riga in Vaadin bisogna utilizzare:
table.setRowHeaderMode(Table.ROW_HEADER_MODE_INDEX);

mercoledì 22 febbraio 2012

Shortcut keys in Vaadin

Ecco un'ottima guida su come aggiungere degli shortcut a pulsanti ed altri componenti in Vaadin:
https://vaadin.com/book/-/page/advanced.shortcuts.html

Vediamo un semplice esempio nel quale definiamo uno shortcut su un pulsante, in questo caso il tasto enter:
Button ok = new Button("OK");ok.setClickShortcut(KeyCode.ENTER);

venerdì 17 febbraio 2012

Temi e Sfondo componenti Vaadin

Per cambiare lo sfondo dei componenti in Vaadin serve creare un theme customizzato con delle regole CSS.

Per dettagli riguardo i themes vedi qui, e per una guida su come crearli con l'Eclipse Plugin vedi qui.

Dopo aver creato il suddetto tema, avremo il file styles.css che conterrà le regole CSS, ad esempio:

.sfondo-blu1 {
background: #E6F8FE;
}

Per associarlo al componente utilizziamo questo codice Java:
myTextField.setStyleName("sfondo-blu1");

mercoledì 8 febbraio 2012

Disinstallare manualmente applicazioni da Windows XP

Vediamo come disinstallare manualmente le applicazioni da Windows XP:

- Cercare la directory dell'applicazione ed eliminarla

- Aprire regedit, andare su HKEY_LOCAL_MACHINE\SOFTWARE, ed eliminare la cartella dell'applicazione

- Aprire regedit, andare su HKEY_CURRENT_USER\SOFTWARE, ed eliminare la cartella dell'applicazione

- Per rimuovere l'applicazione da Aggiungi/Rimuovi, aprire regedit ed andare su HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall, ed eliminare la cartella dell'applicazione

- Alcune applicazioni hanno servizi collegati, per eliminarli andare su HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services

- Queste sono le cartelle dove solitamente si trovano i files di configurazione:

  • C:\Documents and Settings\All Users\Start Menu\Programs
  • C:\Documents and Settings\All Users\Start Menu\Programs\Startup
  • C:\Documents and Settings\%YourUserID%\Start Menu\Programs
  • C:\Documents and Settings\%YourUserID%\Start Menu\Programs\Startup

martedì 31 gennaio 2012

Colore sfondo ContentPanel in ExtGWT

La documentazione presente per ExtGWT scarseggia, per capire come cambiare il colore dello sfondo di un ContentPanel c'è voluto mezz'ora, anche a causa di post che si contraddicevano...

Ad ogni modo, ecco come impostare il colore dello sfondo del ContentPanel:
panel.setBodyStyle("backgroundColor: #colore_qui;");

sabato 28 gennaio 2012

Compressione contenuti Vaadin

Di solito è una buona cosa comprimere con gzip tutto il traffico http in chiaro di Vaadin, per la velocità e in modo da minimizzare la quantità di dati trasferiti. Per farlo bisogna configurare il server, ed è un concetto applicabile in generale e non solo per Vaadin.

Quando la compressione gzip è abilitata, il server comprime i dati inviati al browser, spesso con conseguente riduzione notevole della dimensione dei dati trasferiti e quindi del tempo di download.

Non vogliamo comprimere roba che è già molto compressa, come ad esempio i file JPEG, perciò dobbiamo fare in modo che il server conosca quali mime-type vogliamo comprimere. Di solito il server è preconfigurato per comprimere alcuni tipi noti, come HTML e CSS, ma un mime-type che di solito manca è quello utilizzato per la comunicazione JSON che utilizza Vaadin, cioè application/json.

Vediamo come configurare Tomcat

In Tomcat, è necessario configurare il connettore per avere compression="on" ed impostare compressableMimeType con l'appropriato mime-type (il default di Tomcat 7 è "text/html, text/xml, text/plain", ed effettivamente manca application/json). Inoltre, è possibile impostare il compressionMinSize per soddisfare le raccomandazioni di Google. E' possibile farlo nel file server.xml:

<Connector port="8080"
   …OTHER STUFF...
   compression="on"
   compressionMinSize="500"
   compressableMimeType="text/html,text/xml,text/plain,application/javascript,application/json"/>

Buon utilizzo!

giovedì 26 gennaio 2012

Escape SQL strings in Java

Capita spesso di dover elaborare stringhe di testo per eliminare i caratteri speciali. Per questo scopo possiamo avvalerci della classe StringEscapeUtils di Apache Commons.

Ecco un esempio:
import org.apache.commons.lang.StringEscapeUtils;

public class StringUtilsEscapeExampleV1 {

  public static void main(String args[]) {
    String unescapedJava = "Are you for real?";
    System.err.println(
      StringEscapeUtils.escapeJava(unescapedJava));

    String unescapedJavaScript = "What's in a name?";
    System.err.println(
      StringEscapeUtils.escapeJavaScript(unescapedJavaScript));

    String unescapedSql = "Mc'Williams";
    System.err.println(
      StringEscapeUtils.escapeSql(unescapedSql));

    String unescapedXML = "";
    System.err.println(
      StringEscapeUtils.escapeXml(unescapedXML));

    String unescapedHTML = "";
    System.err.println(
      StringEscapeUtils.escapeHtml(unescapedHTML));

  }
}
Oppure, nei casi più semplici, possiamo usare un semplice replaceAll() che sostituisce tutte le occorrenze di un dato carattere. Ad esempio, quando si lavora con stringhe SQL, causano problemi i singoli apici ( ' ), che è possibile rimpiazzare semplicemente con stringa.replaceAll("'", "''")

mercoledì 25 gennaio 2012

Aggiungere elementi ad una Table in Vaadin

Vediamo come aggiungere elementi ad una Table in Vaadin

Innanzitutto bisogna definire i campi della tabella:
table.addContainerProperty("field1", String.class, null);
table.addContainerProperty("field2", Integer.class, null);

Poi, per aggiungere elementi alla tabella, possiamo specificarne il numero di riga:
table.addItem(new Object[] { field1TextField.getValue(), field2TextField.getValue(), new Integer(1));
table.addItem(new Object[] { field1TextField.getValue(), field2TextField.getValue(), new Integer(2));

oppure impostare null come numero di riga, in questo modo verrà effettuato un append a fine tabella:
table.addItem(new Object[] { field1TextField.getValue(), field2TextField.getValue(), null);

mercoledì 18 gennaio 2012

Modifica titolo pagina "Categorie" in Virtuemart

Per modificare il titolo della pagina "Categorie" di Virtuemart bisogna modificare il file /administrator/components/com_virtuemart/languages/common/italian.php

lunedì 9 gennaio 2012

Vaadin Table getValue vs getItem



In Vaadin ci sono due modi per ottenere informazioni da una riga selezionata su una tabella al suo click:

Metodo1
table.addListener(new ItemClickListener () {
@Override
public void itemClick(ItemClickEvent event) {
Item item = table.getItem(event.getItemId());
Object myObjectProperty = item.getItemProperty("myProperty").getValue();
}
});

Metodo2
table.addListener(new ItemClickListener () {
@Override
public void itemClick(ItemClickEvent event) {
Object rowId = table.getValue();
Object myObjectProperty =  table.getContainerProperty(rowId, "myProperty").getValue();
}
});

Alcune volte il metodo2 mi ha dato problemi, restituendo null come rowId.


giovedì 5 gennaio 2012

Vaadin Checkbox Listener

Utilizzando il componente Checkbox di Vaadin ho avuto qualche problema con i listener quando il componente Checkbox lo utilizzavo anche come campo di una tabella.

Ho dovuto sostituire il listener:


checkbox.addListener(new Property.ValueChangeListener() {
   public void valueChange(ValueChangeEvent event) {
    //esegui codice
   }
});


con il listerer:


checkbox.addListener(new ClickListener() {

@Override
public void buttonClick(ClickEvent event) {
boolean enabled = event.getButton().booleanValue();
if(enabled) {
//esegui codice
} else {
//esegui codice
}
}
});


468x60

Cerca su Google

Cerca nel Blog con Google