domenica, ottobre 05, 2014

Programmazione in basic con LibreOffice

Se si vogliono fare degli esercizi di programmazione con strumenti multipiattaforma e senza avere la necessità di un ambiente di sviluppo troppo complesso, tra le alternative a disposizione c'è la suite LibreOffice / OpenOffice, che mette a disposizione un editor di macro e uno strumento di progettazione di finestre di dialogo che possono fare al caso nostro per piccoli esperimenti.

Quanto segue è stato testato su LibreOffice 4.2.6.3, ma dovrebbe funzionare senza problemi anche con altre versioni di LibreOffice / OpenOffice.

Creiamo un documento contenitore

Possiamo salvare il codice della nostra miniapplicazione sia nell'ambito del nostro spazio di lavoro personale sia in specifici documenti. Se vogliamo poter utilizzare ovunque il nostro codice, dovremo scegliere la seconda opzione.

Quindi, partiamo con il salvare un documento Calc (un foglio elettronico) con un nome, come ad esempio ProgrammareLOconVB.ods. Questo documento conterrà i nostri dati ma anche il codice che scriveremo e le finestre di dialogo che prepareremo.

Creare una finestra di dialogo

Per creare una finestra di dialogo, fare clic su Strumenti / Macro / Organizza finestre di dialogo....

Ci appare una finestra in cui possiamo lavorare con le nostre finestre di dialogo. Visto che ancora non ne abbiamo una, dobbiamo:

  1. selezionare il contenitore Standard del documento su cui stiamo lavorando;
  2. fare clic su Nuovo...;
  3. assegnare un nome alla finestra di dialogo (ad esempio, ShoppingListManager);
  4. fare clic su Modifica.

Si dovrebbe aprire l'editor delle finestre di dialogo, come nella seguente immagine:



Abbiamo a disposizione un insieme di controlli che potremo disporre nella finestra:



Se per caso non dovesse comparire, fare clic su Visualizza / Barre degli strumenti / Casella degli strumenti.

Aggiungere qualche controllo

Nella finestra di dialogo, aggiungiamo tre controlli, per preparare un esempio semplice: vogliamo una casella di testo in cui l'utente possa preparare una lista della spesa, scrivendo degli elementi in una casella di testo che verranno via via aggiunti alla lista (alla pressione di un pulsante).

Quando si seleziona un controllo, nella parte sinistra della finestra compare una scheda dove si possono definire le diverse proprietà. Attribuiamo un nome ai nostri tre controlli e impostiamo altre proprietà che desideriamo. Per selezionare la finestra di dialogo e cambiarne le proprietà, bisogna fare clic sul suo margine esterno.

Il risultato finale potrebbe essere simile al seguente:



Sono stati attribuiti i seguenti nomi ai controlli:

  • txtItem
  • cmdAddToItem
  • lstShoppingList

Far apparire la finestra

Il codice per far apparire la finestra, come riportato nel wiki di OpenOffice, è il seguente:

Dim oDialog AS Object

Sub StartShoppingListManagerDialog
  Dim oLibContainer As Object, oLib As Object
  Dim oInputStreamProvider As Object
  Const sLibName = "Standard"
  Const sDialogName = "ShoppingListManager"
  ' library container
  oLibContainer = DialogLibraries
  ' load the library
  oLibContainer.loadLibrary( sLibName )
  ' get library
  oLib = oLibContainer.getByName( sLibName )
  ' get input stream provider
  oInputStreamProvider = oLib.getByName( sDialogName )
  ' create dialog control
  oDialog = CreateUnoDialog( oInputStreamProvider )
  ' show the dialog
  oDialog.execute()
End Sub

Dove dobbiamo inserirlo? In un modulo, naturalmente. Nel documento Calc, fare clic su Strumenti / Macro / Organizza macro / LibreOffice Basic....
Selezionare il documento Calc, e fare clic su Nuovo. Viene chiesto un nome per il modulo. Possiamo confermare il nome Modulo1.
Sostituire il codice presente con quello riportato qui sopra. Si dovrebbe ottenere qualcosa di simile a questo:




Siamo pronti per far apparire la finestra di dialogo. È sufficiente, nel foglio di lavoro, fare clic su Strumenti / Macro / Esegui macro..., selezionare la macro StartShoppingListManagerDialog e fare clic su Esegui.

Se vogliamo, possiamo aggiungere un pulsante e un gestore di eventi al foglio elettronico Calc, in modo da velocizzare l'operazione. In Calc, far visualizzare i controlli per formulario (Visualizza / Barre degli strumenti / Controlli per il formulario), selezionare tra essi il pulsante e posizionarlo nel foglio di lavoro. Facendoci clic con il pulsante destro del mouse, si attiva la scheda per la definizione delle proprietà e degli eventi. Impostare un nome e un testo da far comparire; poi, nella scheda eventi, associare all'evento "Eseguire l'azione" la procedura di avvio della finestra di dialogo.



Attenzione: per poter provare il funzionamento del pulsante che abbiamo definito, bisogna fare clic su Modo bozza (sì/no) della barra degli strumenti Controlli del formulario.

Gestire gli eventi della finestra

Nella finestra di dialogo, possiamo associare al pulsante una macro per gestire l'evento "Eseguire l'azione". Visto che desideriamo che il valore presente nel campo di testo venga aggiunto alla lista, il codice sarà simile al seguente:

Sub cmdAddToList_click

  Dim txtItem as Object, lstShoppingList as Object
  txtItem = oDialog.getControl("txtItem")
  lstShoppingList = oDialog.getControl("lstShoppingList")

  lstShoppingList.addItem(txtItem.Text, lstShoppingList.getItemCount())

  txtItem.setText("")
  txtItem.setFocus()

End Sub

Dovremo poi associare la macro all'evento "Eseguire l'azione" del pulsante, come visto precedentemente.

Ulteriori informazioni

Una descrizione degli eventi gestibili per i vari controlli è disponibile nel wiki di LibreOffice.

Informazioni sulle proprietà e i metodi di caselle di riepilogo e caselle di testo sono nel wiki di OpenOffice.

Quando un oggetto viene istanziato, è possibile verificarne a tempo di esecuzione quali sono le sue proprietà, i suoi metodi e le sue interfacce.

Ad esempio, avendo a disposizione il nostro oggetto txtItem, potremo aggiungere al nostro codice

  MsgBox txtItem.dbg_methods
  MsgBox txtItem.dbg_supportedInterfaces
  MsgBox txtItem.dbg_properties
 
e far comparire i messaggi informativi che ci servono.

Note sulla sicurezza

L'esecuzione di una macro di cui non si conosce la provenienza è potenzialmente pericolosa. Per questo motivo, in LibreOffice / OpenOffice è disattivata.
Facendo clic su Strumenti / Opzioni / LibreOffice / Sicurezza e poi sul pulsante Sicurezza delle macro... viene offerta la possibilità di configurare il livello appropriato. Se si ricevono documenti con delle macro, ricordarsi di controllarne sempre il contenuto prima di eseguirle (impostando il livello di sicurezza su "Medio", all'apertura del documento viene chiesto se si vogliono eseguire, e potremo rispondere di no per dare un'occhiata al codice).

Esportazione del codice sorgente

Se si desidera esportare il codice sorgente di un'applicazione, ad esempio per utilizzare un sistema di controllo di versione, è possibile sfruttare il fatto che i file ods sono semplici file zip con all'interno dei documenti XML. In particolare, troveremo all'interno del file ods un file XML per ogni modulo visual basic e per ogni finestra di dialogo impostata.



File di esempio

Il file completo, ProgrammareLOconVB.ods, è disponibile nella sezione didattica / foglio elettronico del mio sito.

domenica, agosto 03, 2014

Le Frecce senz'apostrofo e senza trattini

Avete mai provato ad acquistare un biglietto ferroviario online, nel sito delle Frecce? La cosa è abbastanza semplice se, come capita a me, nome e cognome non comprendono caratteri particolari, dove per "particolare" intendo qualsiasi cosa non appartenga all'alfabeto latino/inglese A-Z. Quindi, ad esempio, niente lettere accentate e niente apostrofi.

Al momento della compilazione del campo del cognome, infatti, viene richiamato un piccolo codice Javascript che elimina i caratteri non validi. Immaginate di avere un cognome contenente un apostrofo e un trattino. L'apostrofo non riuscite a digitarlo, mentre il trattino è consentito.



Tutto bene? No, perché al momento del passaggio alla fase di pagamento non si riesce a procedere, ed un messaggio avverte che "Credentiale non e valido" (sic).


Che cosa si debba intendere per "credenziale", perché non sia valida, o come risolvere il problema non è dato sapere. Fra l'altro, dopo dieci minuti la sessione scade, e bisogna ricominciare tutto da capo, a partire dalla selezione delle stazioni di partenza e di arrivo.

Alla fine, l'acquisto è andato a buon fine, ma solo perché sono stati eliminati i trattini.



sabato, giugno 28, 2014

Visualizzazione di algoritmi

Bellissimo il post Visualizing Algorithms di Mike Bostock, che introduce con degli ottimi esempi l'importanza della visualizzazione dei risultati di un algoritmo, del grado di correttezza dello stesso o, semplicemente, dei passi che sono stati necessari per ottenere un determinato risultato.

Nella prima parte, dedicata alle tecniche di campionamento, Mike illustra tre diversi algoritmi per la generazione casuale di punti all'interno di un rettangolo, che si desiderano distribuiti in maniera da evitare pattern riconoscibili. Oltre a visualizzare il risultato, si può visualizzare a colpo d'occhio la bontà del risultato raggiunto. Si confrontino ad esempio queste due immagini

 

nelle quali le macchie più scure rappresentano le aree sottocampionate, e quelle più chiare le aree sovracampionate. Ci si rende conto facilmente che l'algoritmo alla base della seconda immagine è migliore.

Nella seconda parte, un'immagine mostra meglio di mille parole quale problema può nascere dall'utilizzo di un algoritmo usato per un mescolamento casuale di un mazzo di carte (o di qualsiasi altra cosa):

Se l'obiettivo è di avere una distribuzione equiprobabile delle carte, ci possiamo rendere conto, semplicemente visualizzando con diversi colori la distanza dall'obiettivo, quanto siamo lontani da un'implementazione corretta.

Nella terza parte Mark mostra come si possa visualizzare l'esecuzione "passo passo" di un algoritmo, tracciando un grafico che rappresenta la serie di scambi di un quick sort.

Nella quarta parte, forse la più divertente da vedere, sono poi presentati diversi algoritmi per la generazione di labirinti, con una rappresentazione di alberi e della lunghezza dei singoli percorsi basata su una scala di colori.

Come dice Mark, la visualizzazione degli algoritmi può essere un valido ausilio per l'intrattenimento (è divertente vedere gli algoritmi all'opera), per l'insegnamento, per il debugging e per la costruzione di un'interfaccia utente per l'input di dati che sono collegati reciprocamente tra di loro, come nel caso della scelta tra acquisto di una casa o affitto della stessa. Come dargli torto?


giovedì, giugno 05, 2014

Fatture in formato XML

Da domani chiunque emetterà fatture verso gli organi centrali della pubblica amministrazione in Italia, dovrà obbligatoriamente predisporre la fattura in formato XML.

Il Governo ha anche preparato un sito internet, www.fatturapa.gov.it, che offre la necessaria documentazione. E fin qui tutto bene.

Ma se si vanno a leggere le specifiche, si può vedere che tutti gli elementi previsti dal DTD sono in italiano, o in alcuni casi in un innaturale mix italiano-inglese. L'esempio di una fattura singola con una sola linea di fattura prevede elementi di questo tipo:


<CedentePrestatore>
<DatiAnagrafici>
<IdFiscaleIVA>
<IdPaese>IT</IdPaese>
<IdCodice>01234567890</IdCodice>
</IdFiscaleIVA>
<Anagrafica>
<Denominazione>Societa' alpha S.r.l.</Denominazione>
</Anagrafica>
<RegimeFiscale>RF01</RegimeFiscale>
</DatiAnagrafici>
<Sede>
<Indirizzo>Via Roma</Indirizzo>
<CAP>00166</CAP>
<Comune>Roma</Comune>
<Provincia>RM</Provincia>
<Nazione>IT</Nazione>
</Sede>
<StabileOrganizzazione>
<Indirizzo>Piazza Garibaldi</Indirizzo>
<CAP>00100</CAP>
<Comune>Roma</Comune>
<Provincia>RM</Provincia>
<Nazione>IT</Nazione>
</StabileOrganizzazione>
</CedentePrestatore>

racchiusi in improbabili elementi quali

FatturaElettronicaHeader e FatturaElettronicaBody.

Non sarebbe stato molto meglio avere uno standard informatico in inglese, magari condiviso a livello europeo / internazionale, in modo da agevolare la predisposizione di strumenti software comuni? Va bene la salvaguardia della lingua nazionale, ma questa dovrebbe riguardare l'interfaccia delle applicazioni, non la definizione degli standard con cui sono rappresentati i dati. Provate a pensarci: se un programmatore italiano volesse sviluppare un'applicazione per la generazione di fatture in formato XML per i vari paesi dell'Unione Europea, dovrebbe preoccuparsi di imparare il maltese, il finlandese, l'estone, il lituano, il greco, ecc.?

E poi, magari qualche standard per la definizione in formato XML delle fatture esiste. Per citarne uno, quello preparato dal Consorzio non-profit OASIS, disponibile all'indirizzo docs.oasis-open.org/ubl/os-UBL-2.1/UBL-2.1.html#T-INVOICE. Per quale motivo non si è seguito quello standard? Mi riprometto di indagare, ma per adesso noto che tra le FAQ non ci sono notizie in merito. (Se avete informazioni, segnalatemele e aggiornerò volentieri questo post.)