Tutti gli articoli di admin

TUTORIAL GO – COSTRUTTI DI CONTROLLO

Oggi vediamo i costrutti di controllo offerti da GO. I costrutti consentono di configurare il flusso delle operazione sequenziali in base all’algoritmo stabilito dall’autore. Si dividono in iterativi e di selezione.

  • FOR

il costrutto for è un costrutto iterativo e consente di iterare un comando n volte fino a che è valida la condizione di controllo

nel ciclo for ho inizializzato la variabile i con 0 (Non ho esplicitato il tipo perchè Go lo desume da solo), ho definivo la condizione per continuare l’iterazione (i deve essere minore della costante limite) e ho definito la regola di incremento ( in questo caso i cresce di una unità per ogni iterazione). Rispetto ad altri linguaggi come java non sono richieste parentesi per chiudere i comandi di inizializzazione del for, mentre sono obbligatorie le parentesi {} per racchiudere il blocco di operazioni da effettuare.

La condizione di inizializzazione e la condizione di incremento sono opzionali, pertanto posso scrivere il codice in questo, rendendo il codice equivalente ad un costrutto while.

Anche la condizione di uscita può essere omessa, ottenendo così un ciclo virtualmente infinito che può essere pilotato tramite il comando break che interrompe l’esecuzione.

Insieme al comando break può essere usato il comando continue che permette di saltare l’iterazione corrente e andare alla prossima.

  • IF

Il costrutto IF è un costrutto di seleziona e consente di eseguire il codice contenuto nelle sue parentesi {} al verificare di una condizione booleana. Se guardate il codice precedente quando il contatore vale 5 il sistema interrompe il ciclo con il comando break.

Tramite il comando else è possibile definire un blocco di operazioni alternativo ed inoltre è possibile all’interno del blocco if definire una assegnazione ad una variabile che sarà visibile solo nel blocco if.

Nel blocco ho introdotto una variabile d inizializzata con il valore di z e ho definito una condizione alternativa a quella di uscita, grazie alla quale stampo il valore corrente dell’indice.

  • SWITCH

Il costrutto switch è un costrutto di selezione e ci viene in aiuto quando dobbiamo gestire la verifica di n possibili valori. Invece di usare tanti if/else annidati lo switch case ci consente di gestire in modo elegante la casistisca descritta.

Nel blocco sopra sto verificando il valore di z, gestendo le casistiche 1 e 2 con apposito output, per gli altri valori viene stampato il valore default. Quando la condizione viene riscontrata il sistema esegue il codice relativo, a differenza di altri linquaggi come JAVA non è necessario specificare la chiave break. Nella clausola case possono essere presenti più condizioni separate da virgola ed è possibile inserire l’output di una funzione, l’importante che il tipo sia dello stesso tipo delle altre clausole.

E’ possibile anche omettere la condizione da verificare ottenendo un modo più elegante per scrivere degli if/else in cascata specificando la regola di ingresso a livello del blocco case. Lo stesso codice di sopra può essere riscritto come segue

  • DEFER

Il costrutto DEFER è un comando interessante. Consente di eseguire un codice alla fine del programma. Agisce come una pila con una logica di tipo First In Last Out, pertanto il primo comando inserito sarà l’ultimo ad essere eseguito.

Ottenendo così l’output atteso

TUTORIAL GO – PACKAGE, TIPI, VARIABILI E COSTANTI

Messo in piedi l’IDE incominciamo a vedere come è strutturato il sorgente. Go è organizzato in package, quindi il primo comando definito all’interno del nostro file contiene la definizione del package tramite la direttiva package

Il package principale è main ed è quello da cui parte la nostra applicazione. Possiamo importare altri package per estendere le funzionalità a nostra disposizione e lo facciamo tramite la direttiva import. I package hanno la classica struttura ad albero, importante sapere che per invocare le funzioni all’interno del programma va usato l’ultimo nodo della definizione del package.

Nel codice sopra ho definito il package main, ho fatto l’import di 2 package di sistema e nella function main ho provveduto a stampare il risultato della chiamata random. Come potete vedere per invocare la funzione ho utilizzato l’ultima parte del nome del package rand.

L’elenco completo dei package di sistema è disponibile qui. L’import multiplo può essere fatto anche invocando più volte la direttiva import per ogni package ma così risulta più compatto.

A questo punto introduciamo le variabili, esse possono essere definite a livello di package o a livello di funzione, possono essere definite in modo esplicito tramite la chiave var e relativo tipo oppure lasciamo che sia Go a dedurre il tipo.

Nel blocco ho definito una variabile principale a livello di package tramite var e specificando il tipo, mentre ho definito una variabile secondaria a livello di function specificando direttamente il valore e lasciando decidere al compilatore la deduzione del tipo. L’operatore := può essere usato solo dentro una function.

Go mira alla stesura di codice compatto e permette la definizione di più variabili e relativa inizializzazione nello stesso statement.

I tipi semplici previsti da Go sono i sequenti:

Quando si definisce una variabile e non si specifica il valore il sistema inizializza con 0 i numeri, false i tipo bool e stringa vuota i tipi string. La conversione tra i tipi non è implicita ma deve essere gestita tramite l’opprtuna funzione.

Tramite l’operatore const è possibile definire delle costanti, se definite con lettera maiuscola saranno visibili al di fuori del package e dovranno presentare un commento a corredo

TUTORIAL GO – INSTALLARE GO

Iniziamo una serie di articoli dedicati a Go, il linguaggio opensource realizzato da Google e rilasciato nel 2009. Eletto nel 2009 e nel 2016 come linguaggio dell’anno da TIOBE.

Il sito ufficiale di Go è https://golang.org/

Per iniziare scarichiamo l’eseguibile disponibile nella sezione download https://golang.org/dl/ ed eseguendo la configurazione standard go creerà una cartella in C:\Go> e configurerà in automatico le variabili d’ambiente in modo che il compilatore sia invocabile in ogni shell.

Ad installazione finita basta lanciare il comando go version per verificare se tutto è ok. In caso positivo il sistema mostrerà la versione go installata nel mio caso

go version go1.14.6 windows/amd64

A questo punto apriamo il nostro ide. Allo stato attuale risultano 2 ide concorrenti Visual studio code di Microsoft e GoLang di JetBrains. GoLang è una suite pensata per Go ma è a pagamento, mentre Visual Studio Code è open source e tramite plugin supporta lo sviluppo per Go. Ho scelto Visual Studio Code e come plugin ho installato il plugin realizzato da Google disponibile qui.

A questo punto scriviamo il nostro primo programma in go e come classico dei classico scriviamo il nostro Ciao Mondo.

Creiamo la nostra directory e all’interno di essa creiamo il nostro file ciaamondo.go

la prima direttiva indica il package di appartenenza.

la seconda direttiva import permette di importare i package già offerti dalla piattaform, in questo fmt che consente di accedere alle funzioni di I/O.

Infine la funzione main che consente di scrivere a video il nostro messaggio.

Per lanciare il programma usiamo la direttiva run e il gioco è fatto

Per creare l’eseguibile usiamo la direttiva build che crea l’eseguibile.

Alla prossima.

SWAGGER: Generare FILE JSON

Swagger è un prodotto che ti consente di documentare i rest service che hai implementato tramite delle comode annotation. Puoi quindi descrivere i campi accettati, le regole di validazione applicati e tutto quanto concorra ad una definizione efficiente delle specifiche.

Una volta che hai completato le tue specifiche ti consente di generare agevolamente il file json delle specifiche tramite il quale poter generare il client per invocare i tuoi servizi.

Per generare il file è sufficiente invocare l’url

http://<hostname>:<port>/v2/api-docs?format=openapi

La risposta sarà il file json da cui poter generare agevolmente il client.

JAXB: manca un’annotazione @XmlRootElement

L’eccezione com.sun.istack.SAXException2: impossibile eseguire il marshalling del tipo come elemento poichè manca un’annotazione @XmlRootElement capita quando si prova a fare il marshalling di un oggetto non annotato come root element.

Per risolvere questo problema basta annotare l’elemento con la annotation @XmlRootElement

E’ la soluzione più semplice ma se le classi sono ottenute in modo automatico, magari tramite un plugin maven ad ogni iterazione si presenta nuovamente il problema.

In questo caso vi viene in soccorso la classe ObjectFactory generata dal plugin che vi offre dei metodi create* che restituisco l’oggetto annidato dentro il wrapper JAXBElement e il gioco è fatto.

JAXBElement createTrasferimentoDati = new ObjectFactory().createTrasferimentoDati(trasferimentoDati);

SPRING-BOOT: java.io.FileNotFoundException: class path resource

Spring boot ci da diversi metodi per accedere alle risorse disponibili. Una delle più semplici prevede l’uso della annotion @Value e la classe Resouse

Nell’esempio sopra riportato sto definendo un file tipologie.json disponibile nel classpath dentro la cartella json e posso accedervi usando i meto della classe Resource.

Fin qui tutto bene, se lanciamo con maven la direttiva spring-boot: run il sistema funziona correttamente ma se rilasciamo il nostro applicativo in formato jar ecco che otteniamo questa eccezione quando cerchiamo di accedere al file

Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception

java.io.FileNotFoundException: class path resource [json/tipologie.json] cannot be resolved to absolute file path because it does not reside in the file system: jar:file:/nome,.jar/BOOT-INF/classes!/json/tipologie.json

Per risolvere il problema occorre leggere il dato usando il metodo getInputStrean che mi garantisce la lettura del file anche dentro il jar

InputStream inputStream = tipologicheJson.getInputStream();

VUFIND – Fatal error: Allowed memory size exhausted

Abbiamo visto in uno dei precedenti articoli come vufind offra una comoda funzionalità per l’importazione dei cataloghi in formato xml. Tale funzione si base sull’utilizzo di xsl per la conversione del file xml nel formato accettato da Solr.

Se il file è molto grande è possibile che venga generato l’errore

PHP Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 48745161 bytes) in C:\vufind-3.1.2\vendor\zendframework\zendframework\libr
ary\Zend\Http\Client\Adapter\Socket.php on line 370

Questo errore si verifica che abbiamo esaurito la memoria dedicata ai processi php.

Per risolvere il problema occorre accedere al file php.ini ed estendere la proprietà incrementandola ulteriormente.

memory_limit=256M

JAVA – CONFIGURARE I MESSAGGI DI JAVAX.VALIDATATION

Usare JAVAX.VALIDATION ha i suoi vantaggi, tramite delle comode annotation demandiamo al nostro sistema la funziona di validazione per le casistiche più comuni

che coprono la stragrande maggioranza dei casi.

Quando il sistema riscontra l’errore restituisce il messaggio associato, es. not be not null

Qualora volessimo agevolmente localizzare il messaggio è sufficiente creare un file ValidationMessages_it_IT.properties sotto la directory resources del nostro progetto maven e il gioco è fatto

Es. del file

javax.validation.constraints.NotNull.message=Obbligatorio
javax.validation.constraints.NotEmpty.message=Obbligatorio