Sostituzioni di testo multilinea in un file con sed

Postato da ROb | nella categoria Linux | venerdì, 12 marzo 2010

0

Proprio ieri ho dovuto necessità di costruire uno script che mi permettesse di sostituire in un file xml n occorrenze di un certo tag con il contenuto di un altro file xml.

sostituzione sed

Probabilmente esistono mille modi diversi per farlo, come mi avete sempre insegnato con i vostri mitici commenti.
Voglio postare la soluzione che ho trovato girovagando qua e là nei vari forum e che nel mio caso ha funzionato alla perfezione sfruttando la bash e il comando sed.

Valorizziamo innanzitutto la variabile str che contiene il testo da rimpiazzare.
Sia test.xml il file che contiene la stringa da rimpiazzare e contenuto.xml il file con il testo da sostiruire nel file test.xml al posto della stringa contenuta nella variabile str, ecco il comando sed che permette di farlo:

str="<rimpiazzo\/>"
sed -e "/$str/r contenuto.xml" -e "/$str/d" test.xml

Questi sono i due file xml:

test.xml

<prova>

  <rimpiazzo/>

</prova>

contenuto.xml

   <rimpiazzo>
      ciao
   </rimpiazzo>

Prima si valorizza la variabile str con il testo da rimpiazzare (in questo caso il testo rimpiazzo) quindi si lancia il comando sed.
E’ importante notare che il testo da rimpiazzare valorizzato nella variabile str deve essere valorizzato secondo la sintassi sed quindi con l’escaping di eventuali caratteri speciali sed o di espressioni regolare. In questo caso è stato fatto l’escaping del carattere /.

Ecco l’output in console ottenuto dal comando:

<prova>

   <rimpiazzo>
      ciao
   </rimpiazzo>

</prova>

Fusione xml completata!

ExtJS: il framework di sviluppo Javascript per eccellenza

Postato da ROb | nella categoria Sviluppo web | venerdì, 12 febbraio 2010

2

Recentemente ho avuto il bisogno di riscrivere completamente un’applicazione web.
Penso di conoscere bene html, css e javascript ma, nonostante questo, nella scrittura di applicazioni web ho dovuto spesso risolvere gli stessi problemi, rispondere alle stesse esigenze e scrivere in diverse occasioni lo stesso codice.

ExtJS logo

Per questi motivi mi sono guardato un pochino attorno cercando una libreria Javascript che mettesse in mano dello sviluppatore un ambiente con oggetti pronti all’uso, semplici da configurare, carini da vedere e potenti allo stesso tempo.
Mi sono concentrato sulla ricerca di toolkit Javascript e non su altro perché avevo necessità di sfruttare tale libreria con differenti tecnologie server side.
Ovviamente un aspetto fondamentale di valutazione è che il toolkit funzioni con tutti i browser web più diffusi (Firefox, Safari e Chrome, Internet Explorer … IE è volutamente stato messo per ultimo).

Indubbiamente anche in questo caso il panorama non è assolutamente deludente e il mondo open source offre come al solito le sue superbe soluzioni.
I più famosi in quest’ambito sono: Dojo, Prototype, Scriptaculous, jQuery (anche se più che un toolkit è un nuovo approccio Javascript alla selezione degli oggetti) , SmartClient, ed ExtJS (anche nella sua variante Yui).

Dopo aver visto gli esempi proposti nel sito e aver fatto alcuni test ho provato a svilupparla con ExtJS.

Rotte le prime iniziali difficoltà per impostare l’ambiente con tutte le opportune dipendenze, mi sono subito accorto di avere a che fare con una libreria veramente matura, flessibile e molto performante.
Il forum della comunità è attivissimo, la documentazione (presentata anch’essa tramite un’applicazione web ExtJS) è comodissima da navigare e ben scritta, i bug sono pochi e di poco rilievo, perlomeno nella versione che ho provato e che sto ancora usando, cioè la 2.2.1 (il ramo attuale è alla major release 3.x).

Essendo una libreria già molto famosa, numerosi sono i tool di contorno alla libreria stessa. C’è chi l’ha usata per generare un template wordpress (http://extjswordpress.net/), chi l’ha sfruttata per generare un desktop virtual su web, chi ci ha scritto un software di collaborazione.

ExtJS desktop example

Lo showcase dimostrativo è veramente molto ricco e ci sono oggetti già pronti per qualsiasi situazione.
Gli widget che sto usando più di tutti sono le griglie (con la possibilità di caricare i dati in modo asincrono via JSON), i form, le finestre flottanti, i tab e gli accordion.
Con ExtJS è anche semplicissimo implementare caricamenti e callback via AJAX mettendo infatti a disposizione degli oggetti statici per l’invio e la ricezione dei dati serializzati.

Per gli amanti del Google Web Toolkit c’è anche una versione di ExtJS integrata con GWT chiamata GXT. Il suo sviluppo, pur se con qualche ritardo dovuto a una partenza successiva, sta procedendo bene e contano a breve di allineare le funzionalità ExtJS con GXT.

Dal punto di vista della licenza ExtJS ha adottato una coercizione “forte” di chi la utilizza verso l’open source basata sul principio del Quid Pro Quo.
Chi vuole utilizzare ExtJS per progetti open source è liberissimo di farlo chi invece intende utilizzarla per progetti non “open” deve acquistare una licenza commerciale.
In realtà fino alla versione 2.x la politica di licenza era leggermente diversa (LGPL) e permetteva di utilizzare la libreria anche in progetti closed source.

La serializzazione XML di oggetti attraverso XStream

Postato da ROb | nella categoria Java, Sviluppo web | mercoledì, 3 febbraio 2010

0

Prima o poi capita a tutti di dover mettere gli oggetti da qualche parte (anche ai più disordinati :-) ).

Quando è capitato anche a me mi sono chiesto quale fosse il metodo più veloce (in termini di tempo di ricerche e test) e semplice. Mi rendo conto che non è sempre l’approccio corretto per risolvere i problemi ma in questo caso, visto che l’ambito di applicazione era veramente ristretto, mi sono permesso di usare questa tattica.

La serializzazione xml di oggetti Java

Quando sono approdato nel “Two Minute Tutorial” dell’homepage del progetto mi sono subito convinto a provare la libreria XStream.

Ritornando per un attimo sul problema originale, stavo cercando una libreria che mi permettesse di salvare degli oggetti Java (quindi delle istanze di classi) all’interno di stringhe o file in formato xml. Ero convinto della fattibilità della cosa ma non sapevo effettivamente come fare.
La comodità di avere dei pezzi di codice in xml contenenti oggetti Java serializzati apre effettivamente a un mondo di possibili applicazioni interessanti, prima fra tutti la possibilità di salvare lo stato di un applicazione oppure anche la possibilità di caricare dei parametri di configurazione di un servizio.

Ispirato dal codice del tutorial e dopo aver scaricato i due file jar (uno contenente la libreria XStream e l’altro una libreria da cui XStream dipende) ho iniziato a pasticciare con Eclipse per arrivare al mio desiderato semilavorato.
Effettivamente il “Two Minute Tutorial” non tradisce le aspettative e grazie alla semplicità di utilizzo di XStream sono riuscito a generare stringhe xml da oggetti e viceversa istanziare oggetti Java a partire da porzioni di codice xml.

Ecco qua il risultato:

package it.bits4beats.test;

import com.thoughtworks.xstream.XStream;

/**
 * @author Roberto Rossi
 */
public final class ObjectSerialization {

    private ObjectSerialization() {
    }

    public static void main(String[] args) {
        try {
        	XStream xstream = new XStream();

        	xstream.alias("address", Address.class);

        	Address address = new Address();
        	address.setAddress("Via Giacomo Leopardi, 2");
        	address.setCity("Recanati");

        	String xml = xstream.toXML(address);

        	System.out.println("--- SERIALIZATION ---");
        	System.out.println(xml + "\n");

        	Address address2 = (Address) xstream.fromXML("<address><address>Via Beniamino Gigli, 4</address><city>Porto Recanati</city></address>");

        	System.out.println("--- DESERIALIZATION ---");
        	System.out.println("address: " + address2.getAddress());
        	System.out.println("city: " + address2.getCity());
        }
        catch (Exception e) {
            e.printStackTrace();
        }
    }

}

class Address {
	private String address;
	private String city;

	public String getAddress() {
		return address;
	}
	public void setAddress(String address) {
		this.address = address;
	}
	public String getCity() {
		return city;
	}
	public void setCity(String city) {
		this.city = city;
	}
}

La riga 15 istanzia la classe XStream, addetta a tutte le operazioni di serializzazione/deserializzazione degli oggetti. Nella riga 17 si comunica a XStream che l’elemento root per la class Address (definita in questo stesso file) si chiama appunto “address”.
Successivamente si procede a due test indipendenti, il primo (righe 19-26) crea un oggetto di tipo Address e ne genera la versione xml, il secondo (righe 28-32) inizializza una stringa xml contenente un indirizzo e istanzia un oggetto Address che la rappresenta.

Questo è l’output della console:

--- SERIALIZATION ---
<address>
  <address>Via Giacomo Leopardi, 2</address>
  <city>Recanati</city>
</address>

--- DESERIALIZATION ---
address: Via Beniamino Gigli, 4
city: Porto Recanati

Della serie: minimo sforzo, massima resa!