Portable Kanban

Da qualche mese in azienda utilizziamo un software free per gestire la lista di attività da fare: Portable Kanban.

Utilizza un database locale utile quando si lavora da soli, oppure Redis per gestire piccoli gruppi di lavoro.

Ottimo il supporto offerto da Dmitry Ivanov che risponde a quesiti molto velocemente.

C’è anche la possibilità di sviluppare plugin per estendere le funzionalità del sw.

Non avendo grandi know how su linux, ho installato un porting di Redis su windows e devo dire che tutto funziona molto bene.

Il backup del database viene fatto usando powershell in maniera tale da garantire un minimo di sicurezza.

Annunci

JasperReports

 

I report sono sempre molto utili ed è per questo che ho cominciato a cercare un prodotto simile a Reporting Services, meglio se free, per lavorare su DB2.

Ho cominciato ad utilizzare JasperReports  e devo dire che sono soddisfatto.

Installabile sia su Linux, sia su Windows offre diverse versioni.

Secondo me, la versione community non ha grandi limitazioni,  in particolare ho trovato interessanti alcune caratteristiche:

  • utilizzo di molti dbms (sqlserver, postgre, db2..) tramite jdbc
  • esportazione excel, pdf, html
  • possibilità di creare barcode
  • integrazione con gli applicativi ( per esportare un report basta una richiesta ad un url formattato correttamente)
WebClient httpclient = new WebClient();  
httpclient.Credentials = new NetworkCredential("user", "pwd");
httpclient.Headers.Add("Content-Type","application/x-www-form-urlencoded);
httpclient.DownloadDataCompleted += new DownloadDataCompletedEventHandler(httpclient_DownloadDataCompleted);
httpclient.DownloadDataAsync(new Uri(url), new ReportUserState() {  
LocalPath =path, 
ReportUrl ="http://url/jasperserver/rest_v2/reports/Reports/nomereport.pdf?PAR1=VAL1"});
  • schedulazione di un report per l’invio mediante mail
  • utilizzo di un repository interno postgres
  • tool di progettazione ben fatto

Quello che mi piace un po’ meno è fare l’aggiornamento del software quando esce una nuova versione.

Non ci ho perso molto tempo, ma sembra che l’update non mantenga le vecchie impostazioni…

Db2 SQL toolkit

 

Utilizzando DB2 su ISeries ci si rende subito conto che non sono molti gli strumenti visuali che permettono di “lavorare con i dati” in maniera efficace.

INavigator, strumento compreso nell’installazione del Client Access, può andare bene per amministrare un database ma non offre molta flessibilità per le interrogazioni SQL.

Dopo un po’ di ricerca ho cominciato a utilizzare SquirrelSQL un client multi-database scritto in java.

squirrel

Squirrel è utilizzabile con parecchi database, e attraverso JTOpen  permette di lavorare su DB2.

squirrel1

 

Trovo particolarmente utile:

  • la possibilità di esportare velocemente il risultato di una query in Excel
  • l’editazione dei dati in griglia
  • la possibilità di consultare velocemente la struttura di viste e tabelle

DB2 Logger

Recentemente mi è stato chiesto di realizzare un sistema di log per tracciare le modifiche apportate ad alcune tabelle su DB2 su Iseries.

Il risultato dove essere qualcosa del tipo:

Tabella modificata, utente di modifica, chiave della tabella, variazioni

Ho subito pensato al trigger come l’unico sistema per tutte le modifiche in maniera trasparente per le applicazioni esistenti. Dopo qualche esperimento ho trovato un paio di soluzioni….

Soluzione 1

Non essendo un programmatore RPG, ho tentato di realizzare un trigger sql ( un esempio interessante è quello che trovate qui). Il problema è sembrato subito essere l’estrema lentezza  dell’operazione di estrazione delle modifiche, avvertita appena si superavano i 1000 record modificati da una singola query.

Soluzione 2

Inserire in una coda lo stato della riga pre e post modifca e realizzare un consumatore con c#.

Mi sarebbe piaciuto serializzare in xml lo stato delle righe old e new  in maniera dinamica (stile FOR XML AUTO in SQLServer) ma al DB2 proprio questa cosa non piaceva.

L’unica soluzione rimasta era rivolgermi ad un buon vecchio programmatore RPG (grazie MT per la pazienza) e creare un trigger che popolasse la coda inserendo lo stream di dati che rappresenta le 2 righe (old e new).

Leggere da una DataQueue su ISeries sembrava facile e invece, per avere buone prestazioni, ho dovuto usare la libreria java JTOpen convertita in assembly dotnet grazie a Ikvm.

AS400 conn = new com.ibm.as400.access.AS400(ip, user, password);
DataQueue dqData = new DataQueue(conn, queuepath);
while (!ct.IsCancellationRequested )
{
	DataQueueEntry entry = dqData.read(waitseconds);
    if (entry != null)
    {
    	transformblock.Post(new TriggerItem() 
			{ Buffer = entry.getData() });
    }
}

Il resto è stato abbastanza facile, un servizio windows che:

  • legge dalla coda per svuotarla prima possibile
  • elabora i dati usando TransformBlock recuperando la struttura del record dalle viste di sistema
  • salva i log su Queue per realizzare un inserimento batch su database

Ho scelto la soluzione 2 perchè :

  • è quella più scalabile, consente infatti di aggiungere consumatori della coda
  • offre maggiore flessibilità grazie a dot.net, si può pensare ad esempio di serializzare le modifiche in formato json e storicizzarle su un NoSQL (tipo MongoDb).

In conclusione devo dire che tutto funziona egregiamente, con quasi 300000 righe di log scritte in un paio di settimane e tempi di elaborazione molto ridotti.