Archivi categoria: DOCUMENTAZIONE

La categoria contiene tutta la documentazione disponibile per la consultazione

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

ECCEZIONE – THE PORT MAY ALREADY BE IN USE

Capita che la porta su cui lanciamo il nostro servizio sià già occupata e pertanto riceviamo una eccezione del tipo The Tomcat connector configured to listen on port failed to start. The port may already be in use or the connector may be misconfigured.

La prima soluzione è cambiare la porta che stiamo utilizzando agendo sul file di configurazione, la seconda soluzione è individuare il servizio che sta occupando la nostra parte e stopparlo.

In ambiente window per risolvere il problema occorre usare i comandi netstat per inviduare il processo e taskkill per eliminarlo

con questo comando elenchiamo tutti i processi e filtriamo quello che occupa la porta 10001

L’ultimo parametro indica il PID del processo incriminato e per eliminarlo usiamo taskskill

VUFIND – TUTORIAL 10 – PERFORMANCE

Al crescere dell’indice da gestire possiamo notare in Vufind un decadime nto delle prestazioni fino al suo completo blocco. La piattaforma presenta più componenti pertanto gli interventi di tuning coinvolgono sia la componente php/apache che gestisce il livello di presentazione che la componente java che gestisce l’indice della nostra biblioteca. Per poter monitorare le performance è buona norma mettere in piedi una procedura di stress test che simuli il carico di produzione, per questo vufind consiglia di usare jmeter o WCAT( Web Capacity Analysis Tool) di Microsoft. Per esigenze ho usato WCAT che, configurato correttamente, permette di simulare n accessi concorrenti con le query più disparati al fine di valutare il comportamento della nostra piattoforma sotto carico. A questo punto scarichiamo WCAT versione 32 bit o 64 bit e configuriamo il nostro client definendo lo scenario tramite un apposito file e il numero di utenti da simulare.

Esempio di file scenario.txt che simula una ricerca libera

E’ possibile aggiungere altre transazioni per simulare altre ricerche.

Esempio di file settings.txt che simula 30 utenti

A questo punto potete aprire 2 shell cmd per avviare il testing e ipotizzando che il nostro vufind giri sul nostro localhost scriveremo

A questo punto il client incomincia ad avviare un utente dopo l’altro e a simulare le chiamate configurate. A fine esecuzione sarà possibile consultare il report che indicherà quante richieste sono state effettuate e quante di esse hanno avuto esito positivo. A questo punto per aumentare le prestazioni, se i tempi di risposta non sono soddisfacenti, occorre agire sulla RAM del solr, sul numero di CORE e il tipo di Garbage Collection del nostro server. A questo punto ci viene in soccorso la doc ufficiale di vufind che riporta questo schema di prestazioni per un indice da 8,8 milioni di record:

CPU Cores (2.7GHz)Memory (GB)Garbage CollectionFresh (Req/s)Cached (Req/s)
2430ConcMarkSweepGC327.9705.9
2430G1GC93.3167.5
2430ParallelGC320.6701.2
248ConcMarkSweepGC205.5780.0
248G1GC64.0147.2
248ParallelGC250.7788.3
230ConcMarkSweepGC81.1161.4
230G1GC65.6123.9
230ParallelGC75.6220.9

Il report evidenzia la differenza di prestazione tra le ricerche nuove e le ricerche mantenute in cache.