Passa ai contenuti principali

Groovy CliBuilder: valori multipli per singolo argomento

Premessa
Sono stato coinvolto ultimamente in un piccolo progetto scritto in groovy e per la prima volta ho potuto provare i vantaggi della classe CliBuilder di Groovy, un builder che si basa sulla libreria di Apache commons-cli. Spesso ci capita di scrivere delle piccole applicazioni al volo e per necessità di tempo evitiamo di scrivere la parte front-end sin da subito.
Per provare la bontà della logica scritta si può pensare di sfruttare la cara e vecchia linea di comando. Ecco che Groovy mette a disposizione un builder per poter scrivere in modo agile un'interfaccia utente da linea di comando.
In questo articolo non tratterò tutti i casi di utilizzo di CliBuilder anche perché è ben documentato in rete, bensì parlerò del caso specifico di valori multipli per singolo argomento.

Vantaggi di CliBuilder

  1. Non ci dobbiamo preoccupare noi del parsing di String[] args del metodo main della nostra classe di avvio
  2. La mappatura dei flag delle opzioni avviene per configurazione in maniera chiara e leggibile
  3. Viene generato in maniera automatica l'output dell'helper
  4. Gestisce anche l'inserimento di valori multipli per lo stesso argomento  

Caso particolare: Valori multipli per un'opzione
Mettiamo per esempio di voler ricevere in ingresso un elenco di stringhe, per esempio un elenco di nomi di città e che vogliamo impostarlo per l'argomento -c o --cities. Vediamo con un esempio pratico come gestire i valori multipli.

import org.apache.commons.cli.Option

import org.apache.commons.cli.Option


class CliBuilderTest {

 public static void main(String[] args) {

  def params = [
   '-c',
   'Padova,Torino,Milano'
  ]
  args = params.toArray(new String[params.size()])

  def cli = new groovy.util.CliBuilder(usage: 'CliBuilderTest')
  cli.with {
   'c' (longOpt: 'cities', 'Names of cities', args: Option.UNLIMITED_VALUES, valueSeparator: ',')
  }
  
  OptionAccessor options = cli.parse(args)
  def cities = options.cs // Aggiungi un 's' al termine del shortName dell'argomento contenente i valori
  if(cities){
   cities.each{city->
    println city
   }
  }
 }

}

Considerazioni
L'uso di valori multipli può essere estremamente utile. Per rendere un argomento capace di ricevere multi valori è necessario configurarlo con Option.UNLIMITED_VALUES, inoltre è possibile specificare un separatore con il parametro valueSeparator.
Nella fase di processing invece basta appendere al nome in formato corto (nel nostro caso 'c') una 's'. A questo punto basta ciclare sui valori e applicare la logica voluta.

Nota per applicazioni costruite con Gradle
Per chi utilizza gradle come sistema di build va ricordato che va aggiunta la dipendenza in compile time di commons-cli di Apache.

compile 'commons-cli:commons-cli:1.2'

Links
http://groovy.codehaus.org/gapi/groovy/util/CliBuilder.html
http://commons.apache.org/proper/commons-cli/

Post popolari in questo blog

Se excel non aggiorna le formule

Oggi in ufficio è capitata una richiesta particolare. In un documento excel dopo aver eseguito un copia-incolla di una formula non si aggiornavano i risultati nelle celle interessate. Dopo attimi di perplessità dal fondo dell'ufficio il capo ci illumina con una funzione ai più sconosciuta e che ha risolto il problema: il tasto F9. Scusate la mia ignoranza in excel ma questo blog è pensato proprio per appuntare esperienze di vita informatica. Tutto sta nel fatto che i "calcolatori d'un tempo" non disponevano di una adeguata potenza di calcolo e nelle operazioni di copia-incolla si verificavano lunghe attese per l'aggiornamento. La soluzione adottata da MS è stata quella di inserire un'opzione per impedire l'aggiornamento automatico e forzarlo con una combinazione di tasti... il tasto F9!
Combinazioni utili per il calcolo delle formule F9 = calcola le formule modificate dall'ultimo calcolo in tutte le cartelle e fogli di lavoro aperte. MAIUSC + F9 = c…

Dove si trova il mio ISP?

Il link di oggi è My IP Address Lookup. Questo servizio spagnolo mostra dove si trova fisicamente il vostro ISP. Quando vi collegate ad internet in realtà prima fate una richiesta (il vostro modem o router) ad una macchina del vostro ISP e poi vi viene assegnato un indirizzo IP. Se volete sapere dove si trova la macchina che vi permette di accedere alla rete visitate pure
http://www.ip-adress.com/

Potrete inoltre conoscere il vostro IP e il provider che ve lo offre

RaspberryPi: Controllare il desktop da remoto con VNC

Premessa
A volte può essere utile avere l'accesso da remoto ad un desktop grafico sul nostro raspberrypi. Il metodo più diffuso è quello di installare un server VNC e collegarsi poi con un client da un altro computer. Per il raspberrypi possiamo scegliere tra due strade a seconda dell'utilizzo che se ne vuole fare:

Installare TightVNC Server: crea una sessione diversa per ogni connessione non cifrataInstallare x11vnc: permette di comandare il desktop dell'utente corrente sul raspberrypi
Tra i due metodi ho preferito il secondo visto che il mio raspi è collegato direttamente ad un televisore CRT. In questo modo posso navigare in internet su schermo grande direttamente dal tablet comodamente seduto sul divano. Unica nota negativa è che questo meccanismo non funziona per pilotare XBMC, per il quale è meglio utilizzare il client per android per esempio.

Installare TightVNC Server
1. Da linea di comando eseguire
sudo apt-get install tightvncserver
2. Avviare il server con il coman…