Archivi categoria: DOCUMENTAZIONE

La categoria contiene tutta la documentazione disponibile per la consultazione

Errore Ionic – npm ERR! Unexpected token ‘.’

E’ un errore che riscontro ultimamente lavorando con ionic. Mi capita quando provo ad avanzare lnode dalla versione 16.13.2 ad una versione successiva. Allo stato attuale ho una configurazione funzionante che prevede:

Nel momento in cui scrivo sono presenti queste versioni

Ma solo la 16.3.2 non presente il problema in oggetto e riporto per comodità un estratto del file di log e della console

Secondo gli amici di Github occorre avanzare nvm ad una versione successiva (1.1.9) e rimuovere e reinstallare la 16.15.0 di node

RestTemplate – Gestire contenuto Multipart-mixed

In questi giorni mi sono trovato a dover gestire il contenuto di servizio rest che a seguito di una chiamata GET restituiva un content di tipo multipart-mixed. Nel progetto precedente usavo jersey che gestiva in mod del tutto trasparente questo tipo di chiamata, in questo progetto avevo una dipendenza da Spring ed ero vincolato ad usare la classe RestTemplate, peccato che per questa template la lettura di questo tipo di contenuto non fosse così agevole.

Per risolvere ho letto la risposta come byte[] e poi ho usato la classe org.apache.commons.fileupload.MultipartStream presente nel in Commons FileUpload per leggere il contenuto da un byte[], scartare gli header e leggere solo il file di mio interesse

ERRORE – Plugin execution not covered by lifecycle configuration

Oggi vediamo un problema in cui mi sono imbattuto recentemente. Importando un progetto maven in Spring Tool Suite 4 (STS) a fine processo l’IDE mostrava un fastidioso messaggio rosso

Errore su STS

Sostanzialmente il messaggio indicava che uno dei vari plugin configurati nella build del processo non era gestito correttamente nel ciclio di vita gestito da STS. Nel mio caso si trattava del plugin jasperreports-plugin responsabile della compilazione dei file .jrxml in file.jasper e la condizione di errore veniva indicata sul tag execution

plugin che da il problema

Per gestire l’errore è stato sufficiente sfruttare un’altra feature del maven, ovvero il dependency management e definire tramite un altro plugin (lifecycle-mapping) il comportamento di Eclipse. Il dependency managament è un tag disponibile all’interno del tag build.

configurazione che risolve lanciando l’esecuzione

Una volta aggiornato il pom, STS ha rimosso l’errore, compilato i file e generato i file jasper attesi.

E’ possibile configurare lo stesso plugin anche per ignorare il plugin incriminato all’interno della gestione di STS, in questo caso invece di usare l’action execute si usa l’action ignore

configurazione che risolve ignorando l’esecuzione

Per maggiori informazioni vi invito a leggere la documentazione ufficiale disponibile qui, mentre per l’ottimo plugin di compilazione di report la pagina ufficiale è questa.

TUTORIAL GOLANG – LEGGERE ARCHIVI

Dopo aver visto come creare dei file zip vediamo come poter effettuare la lettura e lo spacchettamento di un file zip.

Ipotizziamo di avere un file zip sotto la directory download, vogliamo leggerlo e scompattarlo nella directory dove lanciamo la routine go.

A questo punto creiamo una directory rdt con permessi di scrittura

Infine scorriamo l’elenco dei file presenti all’interno dello zip, li leggiamo e li copiamo all’interno della directory appena generata

In questo esempio di nuovo vediamo il pakage filepath che ci permette di costruire dei percorsi sul file system con la function Join che concatena i percorsi ricevuti.

Alla prossima

TUTORIAL GOLANG – GENERARE ARCHIVI

Golang mette a disposizione i package tar e zip per gestire le operazioni comuni di creazione archivi e la loro compressione. Il package tar consente di raggruppare in un unico file tutti i file contenuti in una directory mentre il package zip consente di effettuare la compressione dei dati.

Vediamo come creare un tar e un file zip. In particolare consideriamo una cartella e mettiamo il contenuto della cartella in un file tar e in un file zip

Tramite la fucntion Create creo sia il file tar che il file zip e per ognuno di essi genero un writer. Tramite il comando defer mi assicuro che la chiusura del writer venga effettuato alla fine di tutti i miei comandi.

Tramite la funcion readDir recupero tutti i file della directory corrente, genero l’header per il tar che inizializzo con il nome e la size del file che sto provessando e finalmente posso scrivere tramite il writer sia l’header che il contenuto del file.

Per lo zip il giro è ancora più semplice perchè non è obbligatorio il passaggio dell’header.

Nel prossimo articolo vedremo come leggere e recuperare i dati dai miei archivi.

TUTORIAL GOLANG – ESEGUIRE CHIAMATE HTTP

L’articolo illustra come fare delle chiamate http tramite go. Il package che offre le funzioni per gestire il protocollo http si chiama “net/http”. Vediamo subito come gestire i principali casi d’uso.

Per effettuare una GET si usa la funzione get, che restituisce un oggetto Response e un oggetto Error.

Nell’esempio sto invocando la homepage di google, e verifico la presenza di errore e il codice restituito dalla risposta. Successivamente tramite il package ioutil recupero il body della response e lo stampo a video.

Se invece volessi inviare una post Golang mette a disposizione 2 funzioni: post e postForm.

La funzione post riceve in ingresso l’url cui inviare la post, il content type del dato che sto inviando e un reader del package io

La funzione postForm invece riceve in ingresso l’url cui inviare la post e il form dei dati chiave, valore

Le 3 funzioni consentono di inviare get e post, ma qualora volessi usare altri metodi come la put o la delete occorre usare il metodo addNewRequest per creare una request e usare il client http per inviare la richiesta.

Per gestire le caratteristiche avanzate delle connessioni Go mette a disposizione l’oggetto Transport che opportunamente configurato consente di definire un proxy per l’invocazione del servizio. Questo caso si presenta quando il nostro client è presente all’interno di una rete il cui accesso ad internet è veicolato dalla presenza di un proxy.

Qualora invece il nostro server voglia un certificato occorre caricare il certificato e configurato sempre nel transport affinchè venga usato in trasmissione

Nell’esempio sto leggendo il certificato e lo sto configurando all’interno del transport per poi fornirlo al client.

Abbiamo quindi visto come invocare i vari metodi e come gestire una rete con proxy e una connessione crittografata con invio del certificato.

Alla prossima

SPRING-BOOT – CONFIGURARE PROXY e CERTIFICATI PER SERVIZI SOAP

Spring ws è un pacchetto messo a disposizione da Spring per gestire agevolmente la comunicazione tra servizi SOAP. La libreria consente di configurare agevolmente un server soap che riceve chiamate nel rispetto di uno schema definito dall’utente. Per maggiori informazioni rimando all’ottimo tutorial realizzato dai ragazzi di spring e che trovate qui

Inoltre la libreria consente di configurare agevolmente un client per poter invocare dei servizi esposti su un altro server e sulla configurazione base rimando sempre al tutorial di spring che trovate qui.

In questo articolo approfondiamo come configurare il client che gira all’interno di una rete con proxy e che richiede lo scambio dei certificati con il server su cui sono esposti i servizi soa.

Il nostro client si trova in una rete con 2 livelli di sicurezza: un proxy che regola il traffico verso l’esterno della nostra rete e un server che accetta chiamate crittografate con un certificato associato.

Per fare questo dobbiamo configurare il messagesender presente nella classe WebServiceTemplate con una istanza della classe org.springframework.ws.transport.http.HttpComponentsMessageSender che utilizza la classe Apache HttpClient per l’invio di Post.

Nella classe client sto settando il message sender tramite un metodo seguente in configuro i tempi di timeout e a questo passo il client httoClient dove effettivamente configuro il proxy e il certificato

Definisco il contesto SSL fornendo il keystore e il truststore. Definisco il proxy fornendo host e porta e infine creo il client usando la classe HttpClientBuilder.

Alla prossima

TUTORIAL GO – IMPLEMENTARE DEI SERVIZI HTTP

Nell’articolo di oggi vedremo come instanziare un server ed esporre dei servizi per lettura e scrittura di una entità. Per fare questo utilizzeremo 2 nuovi package “net/http” e “encoding/json”, il primo ci permette di instanziare il server e definire le azioni da intraprendere per dei path, il secondo ci consente agevolvemente di fare encoding e decoding di oggetti json.

Incominciamo instanziando il server e implementando un servizio di keepalive che serve a stabilire se il server è attivo regolarmente.

La funzione HandleFunc definisce il path e il relativo handler. Per handler si intende la funzione che verrà eseguita dal server in corrispondenza della richiesta riceveuta.

Se abbiamo fatto tutto bene invocando il servizio http://localhost:10000/isAlive riceveremo un 200 ok con testo alive.

A questo punto supponiamo di voler gestire una rubrica dei contatti e pertanto definiamo prima di tutto la nostra struct Contatto

La struct presenta 2 parametri Nome e Cognome e relative regole di trascodifica in json. Definiamo l’elenco dei contatti e lo inizializziamo con dei dati di prova, simulando la presenza di un database

Infine definiamo l’handler relativo

In tal modo invocando l’url http://localhost:10000/contatti otterremo il seguente json [{“Nome”:”nome 1″,”Cognome”:”Cognome 1″},{“Nome”:”nome 2″,”Cognome”:”Cognome 2″}]

Di seguito il codice completo

Il package http ci ha consentito di tirare su il server e configurare delle risposte su dei path statici. Il package ha dei limiti, non ci permette di configurare degli endpoint variabili ed esplicitare il metodo http supportato. Per superare questo limite ci viene in soccorso un nuovo package “github.com/gorilla/mux”. Il package va installato con il comando

A questo per tirare su il server e configurare opportunamente gli endpoint possiamo scrivere

Il packge ci mette a disposizione l’oggetto router che consente per ogni handler di definire maggiori proprietà per meglio mappare il comportamento

Il package ci consente agevolmente di leggere le path variable e superare i limiti del package net/http.

Di seguito il codice completo per l’analisi dei metodi restanti

Alla prossima

TUTORIAL GO – GESTIONE DEL DATABASE

Nell’articolo di oggi vedremo come integrare un database oracle e come effettuare le operazione di lettua e scrittura.

Prima di tutto introduciamo il package per la gestione del db database/sql e insieme al package dobbiamo importare il driver specifico per il database cui connettersi. L’elenco dei driver disponibili e le relative basi di dati supportati sono disponibili al link https://github.com/golang/go/wiki/SQLDrivers. Per lavoro uso Oracle, pertanto nell’esempio integro il driver godror. Per poter usare questo driver occorre installarlo e configurarlo nell’ambiente go tramite la direttiva:

Il driver è realizzato in cgo pertanto è richiesta la presenza di un gcc compiler, nel mio caso ho utilizzato quello disponibile all’indirizzo https://jmeubank.github.io/tdm-gcc/. Maggiori informazioni su godror sono disponibili al l’url https://github.com/godror/godror

Dopo aver installato gcc e godror possiamo finalmente definire l’import

Per la connessione al db il comando da usare è Open del package db

Il primo parametro della Open è il nome del driver e a seguire la stringa di connessione verso il db nel formato username@password@ip:port:sid

La funzione restituisce una istanza db e come secondo parametro un oggetto error che potrà essere gestito tramite la funzione panic.

Vediamo subito come effettuare una operazione di scrittura tramite la funzione Exec

Nell’esempio tramite la funzione Begin ho avviato una transazione con commit previsto a fine operazioni di scrittura. Nel caso specifico sto facendo la cancellazione di un record dalla tabella di audit e successivo inserimento La funzione Exec ritorna un oggetto Result che rappresenta l’esito di una qualsiasi chiamata al db mostrando quante righe sono state coinvolte e l’id dell’ultimo inserimento.

Se volessi leggere i dati mi viene in aiuto la funzione Query che restituisce un cursore che scorre sulle righe selezionate

Nell’esempio sto leggenda dalla tabella audit tutti i record e tramite la funzione Scan dell’oggetto Rows la assegna a delle variabili per stamparne successivamente il valore. Con il comando defer chiudo il cursore alla fine di tutte le operazioni.

Per semplificare il lavoro con il db ci vengono in soccorso altri package che consentono di velocizzare il lavoro. Oggi introduco il package sqlx disponibile all’url https://jmoiron.github.io/sqlx/

Per installarlo il comando è

ad installazione effettuata può essere importato con la direttiva github.com/jmoiron/sqlx”. Questo package consente di mappare le query direttamente su struct senza dover ricorrere al comando Scan.

Ho definito una struct Audit che presenta i parametri ID e dataora, ne ho definito il tipo e tramite il thick ho definito il mapping, tramite la regola del contesto:nomecolonna.

A questo punto ottengo il gioco è fatto

Con la Open ottengo un riferimento al db che mi espone le funzioni Get per il recupero del singolo oggetto e Select per il recupero di un set di righe,

Alla prossima

ps. per i pigri a seguire l’intero codice

TUTORIAL GO – LETTURA E SCRITTURA DEI FILE

Dopo aver visto le caratteristiche di Go cominciamo a vedere alcuni casi d’uso tipici dello sviluppo. Iniziamo con la lettura e la scrittura dei file.

Come si può vedere ho introdotto nuovi package: os, io/ioutil e bufio. os è il package che offre i metodi per la creazione e cancellazione dei file, ioutil offre funzioni per la manipolazione del file e bufio offre metodi bufferizzati per la lettura e scrittura

Nell’esempio in sequenza creo il file, lo popolo, ne leggo il contenuto e poi lo rimuovo dal file system.

nuovofile, errore := os.Create(“miofile.txt”) crea un file di nome miofile.txt nella directory dove eseguo il file .go. Il metodo Create restituisce 2 variabili, la prima di tipo file e la seconda di tipo Error che sarà valorizzato con il messaggio di errore se l’operazione non è possibile. Successivamente per popolare il file uso il metodo writestring della classe File e aggiungo ulteriore testo utilizzando un Writer offerto dal package bufio. Il writer bufferizzato migliora le prestazioni in caso di molte operazioni di scrittura e le rende effettive con il metodo flush, Infine con il close rendo il file disponibile per altre manipolazioni.

nuovofile, errore = os.Open(“miofile.txt”) apre il file con il nome passato come parametro e lo cerca nella directory dove il file go viene lanciato. Restituisce un oggetto di tipo file e l’eventuale errore. La lettura del contenuto può essere fatta in vari modi. La funzione Read legge il contenuto e lo salva in uno slice, restituendo in uscita il numero di caratteri letti. La funzione Seek consente di spostare il punto di inizio di lettura del file. Anche per la lettura il bufio ci mette a disposizione il reader che consente di effettuare le letture sfruttando il buffer in memoria. Il package ioutil mette a disposizione delle funzioni che agevolano l’operazione di lettura, es. txt, errore := ioutil.ReadFile(nuovofile.Name()), restituisce il contenuto del file in una variabile di tipo []byte.

Infine per cancellare il file il package io mette a disposizione la funzione Remove che riceve in ingresso il nome del file.