Wiki Ubuntu-it

Indice
Partecipa
FAQ
Wiki Blog
------------------
Ubuntu-it.org
Forum
Chiedi
Chat
Cerca
Planet
  • Pagina non alterabile
  • Informazioni
  • Allegati
  • Differenze per "Fcm/Edizione/GruppoC5"
Differenze tra le versioni 73 e 87 (in 14 versioni)
Versione 73 del 31/05/2012 13.25.08
Dimensione: 35568
Commento:
Versione 87 del 01/03/2013 08.15.12
Dimensione: 31657
Commento:
Le cancellazioni sono segnalate in questo modo. Le aggiunte sono segnalate in questo modo.
Linea 1: Linea 1:
## page was renamed from Fcm/Edizione/HowTo6
#acl GruppoAdmin:admin,read,write,revert GruppoOperatori:admin,read,write,revert GruppoEditori:read,write,revert CristianoLuinetti:admin,read,write,revert MarcoBuono:admin,read,write,revert AldoLatino:admin,read,write,revert PaoloGarbin:admin,read,write,revert GruppoFcm:read,write,revert -All:read -Known:read
#acl GruppoAdmin:admin,read,write,revert GruppoOperatori:admin,read,write,revert GruppoEditori:read,write,revert GruppoFcm:read,write,revert new.life:admin,read,write,revert paolettopn:admin,read,write,revert Known:read All:read
Linea 4: Linea 4:
= Testo inglese =

LibreOffice Part 23: Base Form Enhancements with Macros

by Elmer Perry

For the previous four parts of this series, we have slowly built a database document using LibreOffice's Base module. We have a database with forms to enter our data, and queries and reports for extracting the data. We now have a usable document for recording our book library. However, our current design has one flaw we need to overcome. If we need to enter a new author or media type while we are in the books form, we have to close the book form and open one of the others. If we could enter new authors and media types directly from the books form, it would behave more like an application and make data entry even easier. We can accomplish this through a few short macros.
The LibreOffice Basic language is very similar to other Basic languages, such as Visual Basic for Applications. To manipulate the underlying LibreOffice document, we access the Uno framework controlling the document. The Uno framework is quite complex, but I will explain, as best I can, the properties and objects we will use. The goal is not to teach you how to write LibreOffice macros, but how you can use them.
Macro Security and Options

While macros allow us to do cool things in our documents, they can also cause problems. Some people use macros to compromise other people's systems, therefore, we need to take a few minutes to talk about macro security. Whether you are running LibreOffice on Linux, Mac, or Windows, malicious code in a macro can compromise your data and possibly your entire system.

Macro security in LibreOffice is simple. Tools > Options opens the Options dialog for LibreOffice. Under LibreOffice, select Security. Click on the Macro Security button to pop up the macro security options. You have four options. Never use the Low security option – it will run macros without asking you. I recommend the Medium security level. With this level, you are prompted whether to run the macros when you open a document containing macros. The High and Very High options require a certificate or folder you designate as trusted. While this is great, I believe nothing trumps the instincts of the user. You usually know whether you were expecting a document to contain macros. When in doubt, click No. Click OK to save your choice and OK to close the options dialog.
Now, on to the fun stuff.
The Macros

We will write four macros for our database document. Three will deal with opening forms, and the last will update the list boxes for authors and media types. The general idea behind macros is to accomplish tasks that are not built into the program, or to simplify complex tasks. Our macros really accomplish both, as we will simplify the tasks of adding authors and media types and provide functionality not built into the program.
Before we can begin to write our macros, we need a container to hold them. Macros are contained in a module. Modules can live in the program itself or within a document. Since our macros are specific to our database file, we will embed them in the document. Macros embedded in a document are available only when the document is loaded. Macros contained in the program are available as long as the program is running.
Tools > Macros > Organize Macros > LibreOffice Basic. The LibreOffice Basic Macros dialog pops up. Select book.odb from the Macro from-list. Click the New button. A dialog pops up asking you for a name for the module. Name it FormCalls. Click OK. This brings up the LibreOffice macro editor. The macro comes with a default main subroutine. We will not use this subroutine. Highlight Sub main and End Sub and press the backspace key to delete them.
Our first macro is a generalized subroutine for opening a form. A generalized subroutine is written for reuse. We will call this routine twice from other routines we write. Type this subroutine into the editor:
{{{
Sub OpenAForm (FormName as String)
 Dim GetForm as Object
 GetForm = ThisDatabaseDocument.FormDocuments.GetByName(FormName)
 GetForm.Open
End Sub
}}}
The first line of the subroutine is called the signature. The signature determines how the subroutine is called. A signature starts with the keyword Sub, which defines this call as a subroutine. Next, the name of the subroutine. In our case, OpenAForm is the name of the subroutine. Finally in the parenthesis, we have the arguments used when calling this subroutine. In our case, we have a variable named FormName which is a type String. In the second line of the subroutine, Dim is another keyword. Dim initializes a variable as a type, and, optionally, a value. We define a variable named GetForm as a type Object. The third line assigns a value to the variable GetForm through a chain of commands in the Uno framework. ThisDatabaseDocument refers to the currently open database document. In our case, book.odb. FormDocuments is a collection of all the forms in the document. Finally, GetByName retrieves a specific form object from the collection. Notice, we pass the variable FormName from the signature to this method. Once the call is complete, the variable GetForm is the object of the form name passed to the subroutine. The fourth line calls the Open method of the form. On the fifth line, we tell Basic this is the end of the subroutine with the command End Sub.
We will call the OpenAform subroutine twice. Once to open the authors form, and once to open the media form. Add these two subroutines to your editor:
{{{
Sub OpenAuthorsForm(oEv As Object)
 OpenAForm("Authors")
End Sub

Sub OpenMediaForm(oEv As Object)
 OpenAForm("Media")
End Sub
}}}
The signature on these two subroutines are a little different. Since we will call them from a control within a form, we need to pass the object making the call as an argument, even though we do not use it. The argument oEv is a reference to the object making the call. We will use this to our advantage later, in the last subroutine, but here we do it because it is required. These two subroutines are pretty simple. We just make a call to OpenAForm passing the name of the form we want to open, Authors or Media.
The final subroutine deals with our problem of refreshing the data in the list boxes for authors and media when we add authors or media using the two subroutines above:
{{{
Sub ListRefresh(oEv as Object)
 oEv.source.model.Refresh
End Sub
}}}
Once again, since we will call this subroutine from a control, we need a reference to the control making the call. However, this time we will actually use the object. This subroutine makes a method call to the underlying model of the list box and refreshes the data in the list, thus updating our list of authors or media types.
Save your module and close the Basic editor.

Making Connections to Macros

At this point, our macros do nothing. We need to connect them to objects in our form to activate them when needed. First, we will connect the open form subroutines to buttons in our form, and then we will connect the ListRefresh to the list boxes.
In the database pane, click on Forms. Right-click the Books form and select edit. Add two push buttons to the form, one under the Authors table and another under the Media table. Right-click the button under the Authors table and select Control to bring up the buttons properties dialog. On the General tab, change the name to AddAuthors and the Label to Add Authors. On the Events tab, click the ellipses (…) button next to Execute Action – which brings up the Assign Action dialog. Click the Macro button to bring up the Macro Selector dialog. In the tree list under Library, select book.odb > Standard > FormCalls. Select OpenAuthorsForm from the Macro Name list and click OK. Click OK to close the Assign Action dialog. Close the buttons properties dialog.
Do the same with the button under the Media table, only name it AddMedia, make the label Add Media Type, and assign the macro OpenMediaForm to the Execute Action event.
Finally, we need to add the refresh subroutine to our list boxes. Right-click the Authors column in the authors table and select Column. On the Events tab, click the ellipse (…) button beside “When receiving focus”. In the Assign Action button, use the Macro button to assign the ListRefresh macro to the action. This will cause the list to update data from the Authors table when you click on a list box in the column.
Do the same for the Media column in the media table.
Save your changes to the Books form and close it.

Testing Your Changes

Any time we make changes to our forms, we will want to test them and make sure we got everything right, especially in cases where we have used macros. One simple typo could cause things to not work. Double-click the Books form to open it. Add a new book with an author and media type you have not added already. Click the Add Authors button to make sure it opens the form. Add some authors. Close the Authors form. Click on the authors dropdown list box and verify that the authors you added are there. Do the same test with the Add Media Type button and listbox.
Final Thoughts and References

Again, I would like to emphasize that writing macros in LibreOffice Basic is complex. Documentation is pretty sparse, but it is out there. If you are interested in taking up the challenge, here are some references to get you started:
LibreOffice Basic Guide: http://wiki.documentfoundation.org/images/d/dd/BasicGuide_OOo3.2.0.odt
Andrew Pitonyak's OpenOffice Macro Information: http://www.pitonyak.org/oo.php
You can find the macros used in this How-To on pastebin.com at http://pastebin.com/MU2Ztizi
Next time, we will move on to another part of the LibreOffice suite and explore the Math module.
Linea 7: Linea 74:
HOW-TO
Scritto da Kevin O'Brien

Usare Il Comando TOP

Uno dei grandi vantaggi nell'utilizzare Linux è che sono disponibili alcuni grandi strumenti che ci aiutano a capire cosa sta succedendo al nostro computer e a diagnosticare eventuali problemi. Uno dei più utili è il comando Top. Tratterò di alcune delle cose che si possono fare e forse menzionerò altresì uno o due ulteriori comandi.

Innanzitutto, tanto per tirarlo fuori, c'è un'alternativa chiamata htop e pianifico di trattarlo in un secondo momento. Però, generalmente, htop ha bisogno di essere installato prima di di poterlo usare, mentre top dovrebbe già essere presente sul proprio sistema, rendendolo un buon punto di partenza. L'uso del comando è semplice: basta aprire un terminale/console e digitare top. Il risultato sarà qualcosa simile all'immagine mostrata a destra.

Ci sono molte informazioni in questa schermata, quindi ci vorrà un po' di tempo per passare in rassegna tutte le opzioni. Quello che possiamo vedere subito è che elenca i processi in esecuzioni sul proprio computer e che mostra l'identificativo di ciascun processo, ecc. Inoltre sopra a questa lista è visibile ogni sorta di numero criptico. Tratteremo di ognuno di essi in questo articolo o nei successivi, ma per farlo dobbiamo andare avanti.

Uso della CPU

Per impostazione predefinita, top elenca i processi in ordine di quantità di CPU che ciascuno di questi utilizza, espressa come percentuale sul totale disponibile. È importante da sapere, poiché se la propria CPU arriva al limite, se ne vedranno degradare le prestazioni. Ciò si può manifestare con ritardi nella risposta a richieste tramite tastiera e/o mouse, scatti nella riproduzione audio o nel video, ecc. Sul mio desktop Kubuntu, ho un pannello laterale impostato per il monitoraggio sull'uso della CPU, della temperatura, della memoria e dell'area di Swap utilizzata e del traffico di rete, così da poter controllare tali funzioni critiche ed evitare che la situazione mi sfugga di mano. Ho visto situazioni in cui l'uso della CPU ha raggiunto il limite del 100% e li è rimasta (generalmente è un risultato di Flash, che non può morire troppo presto, ma questo è uno sfogo per un altro giorno). Quando ciò accade, il comando top mi permette di controllare velocemente e vedere qual'è l'applicazione problematica così posso terminarla.

Una cosa bella del comando top è che interagisce per tutto il tempo che lo si ha nel terminale. Quindi, possiamo uccidere un processo in maniera facile premendo semplicemente la k con un terminale aperto su cui top è in esecuzione. Ciò farà apparire un cursore lampeggiante al di sopra della lista dei processi. Basterà inserire l'ID del processo relativo all'applicazione che si comporta in modo anomalo ed è fatta.

Ora, se guardiamo la schermata di top in esecuzione sul mio computer, potremmo notare alcune cose. Ho detto che dà la percentuale di CPU utilizzata rispetto al totale. E se guardiamo attentamente potremmo osservare che la somma delle percentuali supera il 100%. Come può essere, vi chiederete? Bene, la risposta è che la si sta guardando come percentuale del core sul quale il processo è in esecuzione. Poiché il computer è una macchina dual-core, ha due processori e può distribuire i processi individuali su qualunque core desidera. Così avrei potuto teoricamente vedere fino al 200% se avessi sommato i numeri qui di seguito (anche se sarebbe un male perché indicherebbe che siamo al limite). Se avessi un quad-core, potrei avere fino al 400%, ecc.

Priorità e precisione

L'idea di precisione è di determinare quali processi dovrebbero ottenere altri incentivi quando sono in esecuzione e quali dovrebbero essere messi in background. In altre parole, di impostare alcune priorità di accesso alla CPU. Questo avviene utilizzando un numero di precisione, che appare nella colonna NI. Nella schermata possiamo vedere che tutti i processi sono in esecuzione con numero di precisione zero. Ciò significa che sono in esecuzione con la priorità predefinita, che non è stata alterata in alcun modo. I numeri di precisione vanno da -20 a +19, con -20 come priorità più alta. Ho detto che 0 è la scelta predefinita, ma possiamo verificarlo sul sistema eseguendo il comando nice senza nessun argomento. Ciò che restituisce è il valore predefinito del numero di precisione. Per il momento mi fermo qui con questo argomento, ma se volete saperne di più c'è una buona pagina web presso http://www.ibm.com/developerworks/linux/library/l-lpic1-v3-103-6/. Questo articolo spiegherà come poter cambiare il livello del numero di precisione per alcuni processi, se si desidera farlo.

Memoria

Nella schermata, vicino alla colonna relativa all'uso della CPU c'è quella della memoria utilizzata, sempre espressa come percentuale del totale disponibile. In questo caso, accade che il processo che sta utilizzando maggiore CPU è anche quello che sta utilizzando più memoria, il che non è inusuale. Ma se vogliamo vedere i processi allineati per ordine di memoria consumata? Bene, come ho detto sopra, il comando top è interattivo. Per cambiare l'ordinamento basta premere la lettera maiuscola O mentre il comando è in esecuzione in un terminale. Questo porterà a una utilissima schermata di opzioni di ordinamento (mostrata sotto).

Con questa schermata aperta possiamo premere la lettera minuscola n, dare quindi invio e ottenere l'elenco di ordine di percentuale di memoria utilizzata. Oppure possiamo ordinarlo per altri modi, se necessario.

Di nuovo, è utile se notiamo che stiamo per esaurire la memoria e dobbiamo sapere cosa sta succedendo. Se un processo sta inaspettatamente utilizzando molta memoria, sarebbe sicuramente un'indicazione. Questo non implica che si ha una qualche idea di cosa sia il normale in queste situazioni. Il modo migliore di dare un senso a ciò è di controllare periodicamente e osservare cosa sta succedendo. Nel mio caso, ho portato la mia macchina a 16GB di RAM, così da non aspettarmi di vedere, nella maggior parte dei casi, percentuali di utilizzo molto alte. Per esempio, giusto ora ho i mio pannello inferiore pieno di icone di programmi aperti (al momento sono 18) e un veloce controllo dell'output di top mostra che sto utilizzando il 35-40% del totale della memoria.

Nella schermata, si vede un divoratore di memoria, ma ciò, di fatto, è previsto. Ho VirtualBox che esegue una macchina virtuale, configurata per usare 4GB di RAM (più altre risorse, ovviamente). Quindi, in questo caso, vedevo ciò che mi aspettavo di vedere. Ma se vedevo Firefox che utilizzava troppa memoria, avrei saputo che c'era un problema e l'avrei prontamente chiuso.

q per Quit

Se si ha top avviato nel proprio terminale, si potrebbe voler sapere come uscirne ed è semplice, basta premere la lettera q (per Quit) e si ritornerà al prompt del terminale. Si possono ottenere ulteriori informazioni in questi due modi: il metodo stile vecchia scuola è di digitare 'man top' nel terminale, ma il nuovo metodo, migliorato, è di digitare 'info top'. Tuttavia penso che otterrete lo stesso risultato con entrambi i modi. Il punto è che si tratta di un comando fertile con molte opzioni.

Interpretazione dei Dati di Sistema

Abbiamo visto alcuni concetti base del comando top e ci siamo concentrati nell'esaminare la lista dei processi per individuare e correggere eventuali errori. Questa è ancora una cosa molto utile, naturalmente, ma nell'output ci sono anche molti dati di sistema utili. Riprendiamo la schermata usata l'ultima volta per mostrare il risultato di questo comando (mostrata sotto).

Ora vogliamo concentrarci su quei numeri in cima che stanno rappresentando alcuni dati di sistema molto utili. Quindi partiamo dall'alto (letteralmente):

Riga 1, la riga in cima

Sulla prima riga (sopra) abbiamo il tempo di funzionamento. Effettivamente, questa è un informazione che si potrebbe ottenere usando il comando uptime così:

Quindi questo è un indizio che il comando top è una raccolta di informazioni disponibili singolarmente da altri comandi, riuniti in un unico pacchetto di bontà impressionante. Ciò è molto conveniente.

Così siamo in grado di vedere che sono le 15:52:05 e che il computer è in piedi da 17 giorni. Ci sono due utenti in questo momento, il che è normale. Uno di questi è root, ma non si dovrebbe mai usarlo per le attività ordinarie. È una pratica insicura e pericolosa. Mentre siamo registrati come root, ogni software avviato sul sistema ha il livello di privilegio di root. Il modo migliore è di creare un utente ordinario che non abbia un così ben alto livello di privilegio e registrarsi come tale utente. In questo caso l'utente è kevin. A proposito, Ubuntu rende molto difficile fare qualcosa che sia diversa da questa procedura. Se necessitate di diritti più alti, usate il comando sudo per darvi privilegi temporanei.

L'ultima parte di questa riga è chiamata load. Questi tre numeri stanno fornendo il carico per i precedenti 1, 5 e 15 minuti. Ma cos'è il carico? È il numero medio di processi che sono eseguibili, o non si possono interrompere. Semplicemente, senza entrare troppo nel tecnico, è come viene occupata la CPU per la maggior parte del tempo. Ma il trucco è che non è regolato (normalizzato) per il numero di CPU. Ciò significa che un sistema a singola CPU con un carico di 1 viene caricato tutto il tempo. Ma sul mio sistema dual-core, non ho mai avuto 2, quindi sono a posto. Se si avesse un quad-core, il numero magico sarebbe 4 e cosi via.

Riga 2, Attività

Non c'è nulla di interessante da vedere qui. Quell'ultima categoria, zombie, può sembrare per lo meno interessante, ma in realtà non lo è. I processi zombie sono avvii che hanno terminato l'esecuzione e saranno presto chiusi.

Riga 3, CPU

Questa è meritevole di un'occhiata o due. L'ultima volta abbiamo osservato i processi in fondo all'output del comando top per vedere se qualcuno di loro stava monopolizzando la situazione. Su questa riga, anziché guardare al singolo processo, osserveremo l'intero quadro di ciò che sta succedendo. E qui non dobbiamo preoccuparci di quanti core abbiamo, questi numeri aggregano tutti i dati di tutti i core.

La prima statistica è %us, che in questo caso è 32.0%. Questa è la percentuale dei cicli di CPU impegnati dai processi dell'utente. Non significa necessariamente quelli che una persona ha avviato, possono essere processi lanciati da Apache, MySQL, ecc. Se questa percentuale è molto alta, può essere l'indicazione di un problema, poiché abbiamo altre richieste da considerare. Per esempio, la prossima statistica è %sy, che è la percentuale di cicli CPU impegnati dal kernel e da altri processi di sistema. Ovviamente dobbiamo avere a disposizione alcuni cicli per essi o non avremo un computer funzionante. La terza, %id, è la percentuale del tempo di inattività della CPU, più è elevata meglio è (entro limiti ragionevoli, dobbiamo di fatto usare il computer!). Fintanto che abbiamo una ragionevole disponibilità di tempo di inattività, non avremo verosimilmente problemi. Possiamo ricontrollarlo osservando la quarta statistica, %wa. È la percentuale di tempo di attesa di un processo per l'accesso alla CPU. In questo caso, .2% è buono. Non sarà piacevole vederlo troppo spesso a 0.0%, poiché, data la natura del calcolatore, i processi sono in competizione per il tempo di CPU, ma un elevato numero qui indicherebbe di sicuro un problema. Il resto delle statistiche si possono quasi ignorare, in quanto si occupano di questioni davvero oscure, ma si possono esaminare nella pagina di man per top.

Righe 4 e 5, Memoria e Area di Swap

Queste due righe è meglio trattarle congiuntamente, poiché è necessario combinare queste informazioni per raccontare una storia completa. Quello che dobbiamo sapere è quanta memoria è stata usata e quanta è disponibile, in ogni momento. È importante perché la carenza di RAM è la causa più comune di un computer lento e pigro. A volte può sembrare un problema completamente diverso, questo perché è importante osservare i dati reali. Per esempio, se notiamo che il disco rigido è costantemente 'rumoroso' (noto come thrashing) possiamo pensare di avere un problema di I/O al disco stesso, ma in realtà ciò è più comunemente causato da una mancanza di RAM. Quando non c'è abbastanza RAM per contenere tutto il codice dei programmi e i dati attualmente in uso, alcuni di essi vengono copiati sul disco rigido (detto paging) per liberare spazio per altro codice e dati. Lo spazio in cui tali dati sono copiati è chiamato area di swap. Per cui quando il disco rigido è costantemente rumoroso generalmente significa che il codice e i dati sono continuamente scritti e letti da e per l'area di swap e ulteriore RAM potrebbe eliminare il problema.

Ora, una delle cose che dobbiamo capire per interpretare questi dati è che scrivere sul disco rigido e leggere dal medesimo è approssimativamente più lento di 4 mila milioni di volte rispetto allo scrivere e leggere sulla RAM. Quindi vogliamo minimizzare l'uso dell'area di swap per motivi prestazionali. Ma proprio perché la RAM è così tanto più veloce del disco rigido, il sistema operativo preferisce usarla ogni volta che è possibile. Un modo di accelerare le cose è di mantenere il codice in memoria finché non si chiude il programma. Dopotutto, possiamo riaprirlo, e rimuoverlo dalla RAM lo accelererebbe molto. Quindi il sistema operativo immagazzina nella RAM molto codice che non è effettivamente usato in maniera attiva. A causa di ciò, il resoconto sulla RAM utilizzata sarà simile a quando è sul punto di esaurirsi, anche se potrebbe non essere questo il caso. Dobbiamo osservare tutti i dati per valutarlo.

In questo caso, abbiamo iniziato notando che la macchina ha 15.949.272k di RAM. In altre parole, 16GB, come sapevo perché era quella che ci avevo installato. E il numero successivo dice che praticamente tutti i 16GB sono stati utilizzati. Questo è un problema? Non proprio. Se osserviamo la seconda riga, vediamo che ci sono 6GB di spazio swap, ma sono a mala pena utilizzati (sto usando poco meno di 2MB di RAM). E l'ultimo numero racconta la storia. Dei miei 16GB di RAM, una buona metà, 8GB, è stata usata per depositarci il codice. Se volessi aprire un programma che era già in memoria, grande, il codice è già li e si aprirà velocemente. Se voglio aprire qualche altro programma, il sistema operativo cancellerà parte del codice depositato in memoria per liberare spazio, quindi non c'è problema.

Htop, l'alternativa

In realtà preferisco top, ma ad alcune persone piace di più htop e penso che vedrete il perché. Per alcune cose è più facile lavorarci, in particolare se si necessita di fare alcune operazioni inerenti ai processi. Notate però che su molti sistemi non lo si trova già installato, per cui lo si deve prima installare. Su macchine Ubuntu, si installa con

sudo apt-get install htop

Innanzitutto, si può notare che presenta quasi gli stessi dati sui singoli processi del comando top. I processi, per scelta predefinita, sono sempre elencati in ordine di utilizzo della CPU, si può ancora vedere l'ID del processo, gli utenti, le percentuali di utilizzo della CPU e della memoria, proprio come prima. Possiamo vedere il comando che ha lanciato il processo, invece del solo nome del programma. Diversamente da top, htop permette lo scorrimento orizzontale usando i tasti freccia.

Su htop, abbiamo una interessante aggiunta, che è un visualizzatore grafico separato sull'utilizzo della CPU, per ciascuna di esse o per i core che si hanno, in questo caso 1 e 2 poiché si tratta di una macchina dual-core. E possiamo vedere l'utilizzo della memoria e dell'area di swap in una maniera che potremmo trovare facile da leggere. Tempo di funzionamento, carichi e attività sono mostrati in alto a destra.

Il vero vantaggio di htop si ha quando si vuole far qualcosa su uno o più dei propri processi. Basta semplicemente usare i tasti freccia su e giù per evidenziare i processi e usare quindi uno dei tasti funzione mostrati sul fondo. Per esempio, se si evidenzia un processo e si preme poi F9 si ucciderà il processo. Premendo F7 (Nice-) si abbasserà il numero di precisione, incrementando così la priorità (si, non è intuitivo). E premendo F8 si ridurrà la priorità alzando il numero di precisione. Ma teniamo presente che per dare una priorità molto alta a un processo avremmo bisogno di accedere come root, magari utilizzando il comando

sudo htop

Personalmente, non ho molti motivi di pasticciarci, ma il peggio che potrebbe succedere è che potrebbe essere necessario riavviare il computer se davvero roviniamo tutto.

Altri tasti funzione ci permettono di cambiare rapidamente l'ordinamento, il campo su cui ordinare e così via.

Ricapitolando, penso che htop sia molto utile, ma tendo a usare molto più spesso top per due motivi. Il primo è che mi piacciono le più dettagliare informazioni che fornisce. Il secondo è che lo avrò disponibile su qualsiasi sistema davanti al quale probabilmente mi siedo, mentre htop necessiterà di essere installato e ciò vuol dire una connessione internet funzionante, che potrei anche non avere. Ma, in generale, questi due comandi fanno spesso le stesse cose e sono una cruciale aggiunta ai propri strumenti Linux.
Nelle precedenti quattro parti di questa serie abbiamo lentamente creato un documento di database usando il componente Base di LibreOffice. Abbiamo un database con i formulari per inserire i dati e con query e report per estrarli. Possiamo ora usare il documento per registrare i libri della nostra libreria. Comunque, l'attuale progettazone ha un difetto che dobbiamo superare. Se dobbiamo inserire un nuovo autore o media mentre siamo nel formulario di inserimento libri, siamo costretti a chiudere quest'ultimo per aprire uno degli altri due. Se potessimo inserire nuovi autori e media direttamente dal formulario libri, si comporterebbe più come una applicazione, rendendo ancora più facile l'inserimento dei dati. Possiamo raggiungere tale obiettivo attraverso poche brevi macro.
Il linguaggio Basic di LibreOffice è molto simili al Basic di altri linguaggi quali Visual Basic for Applications. Per manipolare il documento in parola, accediamo al framework UNO che controlla il documento. Il framework UNO è piuttosto complesso, ma vi spiegherò, meglio che posso, le proprietà e gli oggetti che useremo. L'obiettivo non è di insegnarvi come scrivere le macro LibreOffice, ma come poterle usare.
Opzioni di Sicurezza delle Macro
Sebbene le macro ci permettono di fare cose fantastiche nei documenti, possono anche causare problemi. Alcune persone le usano per compromettere i sistemi degli altri, perciò dobbiamo prenderci alcuni minuti per parlare della sicurezza delle macro. Sia che si esegua LibreOffice su Linux, che su Mac o Windows, il codice maligno in una macro può compromettere i propri dati e forse l'intero sistema.
In LibreOffice la sicurezza delle macro è semplice. In Strumenti > Opzioni si apre la finestra Opzioni per LibreOffice. Nella scheda LibreOffice selezionare Sicurezza. Fare clic sul pulsante 'Sicurezza delle macro...' per far apparire le opzioni sulla sicurezza delle macro. Ci sono quattro opzioni. Non usare mai l'opzione 'Basso', avvia le macro senza chiedercelo. Raccomando il livello 'Medio'. Con tale livello ci verrà richiesto se avviare le macro quando si apre un documento che le contiene. Le opzioni 'Alto' e 'Molto alto' richiedono un certificato o una cartella designata come affidabile. Sebbene è una gran cosa, credo che nulla batta l'istinto dell'utente. Generalmente sappiamo di aspettarci che un documento contenga o meno delle macro. Nel dubbio, fare clic su No. Fare clic su OK per salvare le scelte e nuovamente OK per chiudere la finestra.
Ora, addentriamoci nelle cose divertenti.
Le Macro
Scriveremo quattro macro per il nostro documento di database. Tre avranno a che fare con l'apertura dei formulari e l'ultimo aggiornerà le caselle di scelta per autori e media. L'idea di massima dietro alle macro è di svolgere i compiti che non sono integrati nel programma, o di semplificare i lavori complessi. Le nostre macro svolgeranno effettivamente entrambe le cose, poiché semplificheremo il compito di aggiungere autori e media e forniremo funzionalità non integrate nel programma.
Prima di poter iniziare a scrivere le macro, ci serve un contenitore per tenerle. Le macro sono contenute in un modulo. I moduli possono esistere nel programma stesso o all'interno del documento. Poiché le nostre macro sono specifiche per il nostro file di database, le integreremo nel documento. Le macro integrate nel documento sono disponibili soltanto quando viene caricato il documento stesso. Quelle contenute nel programma sono disponibili fintanto che il programma è in esecuzione.
Strumenti > Macro > Organizza macro > LibreOffice Basic farà apparire la finestra Macro LibreOffice Basic. Selezionare libri.odb dalla lista 'Macro da'. Fare clic sul pulsante 'Nuovo'. Comparirà una finestra di dialogo nella quale inserire il nome del modulo. Chiamarlo 'FormCalls' e premere OK. Ciò vi porterà all'editor per le macro di LibreOffice. La macro è fornita di una funzione principale predefinita. Non la useremo. Evidenziare Sub main e End Sub e premere il tasto backspace (←) per cancellarli.
La nostra prima macro è una funzione generalizzata per aprire un modulo. Una funzione generalizzata è scritta per il riuso. Richiameremo questa routine un paio di volte da altre routine che scriveremo. Digitare questa funzione nell'editor:
Sub OpenAForm (FormName as String)
    Dim GetForm as Object
    GetForm = ThisDatabaseDocument.FormDocuments.GetByName(FormName)
    GetForm.Open
End Sub
La prima riga della funzione è chiamata la firma. Essa determina il modo in cui chiamare la funzione stessa. La firma inizia con la parola chiave Sub, che definisce questa chiamata come funzione. Segue il nome della funzione. Nel nostro caso, è 'OpenAForm'. Infine, tra le parentesi, ci sono i parametri usati quando si chiama questa funzione. Nel nostro caso abbiamo una variabile di nome FormName che è di tipo String. Nella seconda riga, Dim è un'altra parola chiave che inizializza una variabile assegnandogli una tipologia e, opzionalmente, un valore. Definiamo la variabile di nome GetForm come tipo Object. Nella terza riga viene assegnato un valore alla variabile GetForm attraverso una catena di comandi nel framework UNO. ThisDatabaseDocument si riferisce all'attuale documento di database aperto, nel nostro caso book.odb. FormDocuments è la collezione di tutti i formulari nel documento. Infine, GetByName recupera uno specifico oggetto formulario dalla collezione. Notare il passaggio della variabile FormName dalla firma a questo metodo. Una volta che la chiamata è completa, la variabile GetForm è l'oggetto con il nome del formulario passato alla funzione. La quarta riga chiama il metodo Open del modulo. Nella quinta riga diciamo a Basic che qui termina la funzione, con il comando End Sub.
Richiameremo la funzione OpenAForm un paio di volte. Una per aprire il formulario Autori e l'altra per aprire quello Media. Aggiungere queste due funzioni nell'editor:
Sub OpenAuthorsForm(oEv As Object)
    OpenAForm("Autori")
End Sub
Sub OpenMediaForm(oEv As Object)
    OpenAForm("Media")
End Sub
                                   
La firma di queste due funzioni è leggermente diversa. Poiché le invocheremo da un controllo all'interno del formulario, dovremo passargli come argomento l'oggetto che effettua la chiamata, anche se non lo usiamo. L'argomento oEv è un riferimento all'oggetto che effettua la chiamata. Lo useremo più tardi a nostro vantaggio, nell'ultima funzione, qui lo facciamo perché è necessario. Queste due funzioni sono abbastanza semplici. Effettuiamo solo una chiamata a OpenAForm passandogli il nome del formulario che vogliamo aprire, Autori o Media.
L'ultima funzione affronta il problema di ricaricare i dati nelle caselle di scelta per autori e media quando li aggiungiamo utilizzando le due funzioni di cui sopra:
Sub ListRefresh(oEv as Object)
        oEv.source.model.Refresh
End Sub
Di nuovo, dato che chiameremo questa funzione da un controllo, c'è bisogno di un riferimento al controllo che effettui la chiamata. Comunque, questa volta useremo effettivamente l'oggetto. Questa funzione fa una chiamata di metodo al modello di base della casella di scelta e rinnova i dati nella lista, quindi aggiorna la nostra lista di autori e media.
Salvare il modulo e chiudere l'editor Basic.
Effettuare Connessioni alle Macro
A questo punto, le macro non fanno nulla. Dobbiamo connetterle agli oggetti nei formulari per attivarle quando necessario. Innanzitutto, collegheremo ai pulsanti dei nostri formulari le funzioni che aprono i moduli e poi collegheremo la funzione ListRefresh alle caselle di scelta.
Fare clic su Formulari nel pannello Database. Clic con il tasto destro sul modulo Libri e selezionare Modifica. Aggiungere due pulsanti al modulo, uno sotto alla tabella Autori e l'altro sotto la tabella Media. Fare clic con il tasto destro sul pulsante sotto la tabella Autori e selezionare 'Campo di controllo...' per aprire le finestra delle proprietà del pulsante. Sulla scheda Generale, cambiare il nome in AddAuthors e la didascalia in 'Aggiungi Autori'. Sulla scheda Eventi, premere il pulsante ellittico (...) vicino a 'Eseguire Azione', che farà apparire la finestra 'Azione assegnata'. Premere il pulsante 'Macro...' per aprire la finestra 'Selettore Macro'. Nell'elenco ad albero sotto 'Libreria', selezionare libro.odb > Standard > FormCalls. Selezionare OpenAuthorsForm dalla lista 'Nome macro' e premere OK. Premere ancora OK per chiudere la finestra 'Assegna Azione'. Chiudere le finestra Proprietà del pulsante.
Fare la stessa cosa con il pulsante sotto la tabella Media, solo che il nome è AddMedia, la didascalia è 'Aggiungi Media' e si deve assegnare la macro OpenMediaForm all'evento Esegui azione.
Infine, si deve aggiungere la funzione ListRefresh alle caselle di scelta. Fare clic con il tasto destro sulla colonna Autori nella tabella autori e selezionare 'Colonna'. Sulla scheda Eventi, premere il pulsante ellittico (...) accanto a 'Al ricevimento del punto focale'. Usare il pulsante Macro, sotto ad 'Assegna:', per assegnare la macro ListRefresh all'azione. Questo farà si che la lista aggiorni i dati dalla tabella Autori quando si fa clic su una casella di riepilogo nella colonna.
Fare la stessa cosa per la colonna Media nella tabella media.
Salvare i cambiamenti al modulo Libri e chiuderlo.
Verificare i cambiamenti
Ogni volta che effettuiamo dei cambiamenti ai nostri moduli, vorremmo verificarli per assicurarci che tutto sia corretto, specialmente nei casi in cui abbiamo utilizzato le macro. Un semplice errore di battitura potrebbe essere causa di malfunzionamenti. Fare doppio clic sul formulario Libri per aprirlo. Aggiungere un nuovo libro, un autore e un tipo di media non già presenti. Premere il pulsante 'Aggiungi Autori' per assicurarsi che apra il formulario. Aggiungere alcuni autori. Chiudere il formulario autori. Fare clic sulla casella a comparsa autori e verificare che ci siano gli autori aggiunti. Effettuare la stessa verifica con il pulsante 'Aggiungi Media' e la casella a comparsa.
Conclusioni e Riferimenti
Vorrei nuovamente enfatizzare il concetto che scrivere macro in LibreOffice Basic è complesso. La documentazione è abbastanza sparsa, ma è la fuori. Se siete interessati a raccogliere la sfida, qui ci sono alcuni riferimenti per iniziare:
LibreOffice Basic Guide: http://wiki.documentfoundation.org/images/d/dd/BasicGuide_OOo3.2.0.odt
Informazioni di Andrew Pitonyak su OpenOffice Macro: http://www.pitonyak.org/oo.php
Potete trovare le macro usate in questo tutorial su pastebin.com presso: http://pastebin.com/MU2Ztizi
La prossima volta ci sposteremo su un'altra parte della suite LibreOffice ed esploreremo il componente Math.
Linea 102: Linea 125:
Linea 105: Linea 127:
HOW-TO
Scritto da Kevin O'Brien

Usare Il Comando TOP

Uno dei grandi vantaggi nell'utilizzare Linux è che sono disponibili alcuni grandi strumenti che ci aiutano a capire cosa sta succedendo al nostro computer e a diagnosticare eventuali problemi. Uno dei più utili è il comando Top. Tratterò di alcune delle cose che si possono fare e forse menzionerò altresì uno o due ulteriori comandi.

Innanzitutto, tanto per tirarlo fuori, c'è un'alternativa chiamata htop e pianifico di trattarlo in un secondo momento. Però, generalmente, htop ha bisogno di essere installato prima di di poterlo usare, mentre top dovrebbe già essere presente sul proprio sistema, rendendolo un buon punto di partenza. L'uso del comando è semplice: basta aprire un terminale/console e digitare top. Il risultato sarà qualcosa simile all'immagine mostrata a destra.

Ci sono molte informazioni in questa schermata, quindi ci vorrà un po' di tempo per passare in rassegna tutte le opzioni. Quello che possiamo vedere subito è che elenca i processi in esecuzioni sul proprio computer e che mostra l'identificativo di ciascun processo, ecc. Inoltre sopra a questa lista è visibile ogni sorta di numero criptico. Tratteremo di ognuno di essi in questo articolo o nei successivi, ma per farlo dobbiamo andare avanti.

Uso della CPU

Per impostazione predefinita, top elenca i processi in ordine di quantità di CPU che ciascuno di questi utilizza, espressa come percentuale sul totale disponibile. È importante da sapere, poiché se la propria CPU arriva al limite, se ne vedranno degradare le prestazioni. Ciò si può manifestare con ritardi nella risposta a richieste tramite tastiera e/o mouse, scatti nella riproduzione audio o nel video, ecc. Sul mio desktop Kubuntu, ho un pannello laterale impostato per il monitoraggio sull'uso della CPU, della temperatura, della memoria e dell'area di Swap utilizzata e del traffico di rete, così da poter controllare tali funzioni critiche ed evitare che la situazione mi sfugga di mano. Ho visto situazioni in cui l'uso della CPU ha raggiunto il limite del 100% e li è rimasta (generalmente è un risultato di Flash, che non può morire troppo presto, ma questo è uno sfogo per un altro giorno). Quando ciò accade, il comando top mi permette di controllare velocemente e vedere qual'è l'applicazione problematica così posso terminarla.

Una cosa bella del comando top è che interagisce per tutto il tempo che lo si ha nel terminale. Quindi, possiamo uccidere un processo in maniera facile premendo semplicemente la k con un terminale aperto su cui top è in esecuzione. Ciò farà apparire un cursore lampeggiante al di sopra della lista dei processi. Basterà inserire l'ID del processo relativo all'applicazione che si comporta in modo anomalo ed è fatta.

Ora, se guardiamo la schermata di top in esecuzione sul mio computer, potremmo notare alcune cose. Ho detto che dà la percentuale di CPU utilizzata rispetto al totale. E se guardiamo attentamente potremmo osservare che la somma delle percentuali supera il 100%. Come può essere, vi chiederete? Bene, la risposta è che la si sta guardando come percentuale del core sul quale il processo è in esecuzione. Poiché il computer è una macchina dual-core, ha due processori e può distribuire i processi individuali su qualunque core desidera. Così avrei potuto teoricamente vedere fino al 200% se avessi sommato i numeri qui di seguito (anche se sarebbe un male perché indicherebbe che siamo al limite). Se avessi un quad-core, potrei avere fino al 400%, ecc.

Priorità e precisione

L'idea di precisione è di determinare quali processi dovrebbero ottenere altri incentivi quando sono in esecuzione e quali dovrebbero essere messi in background. In altre parole, di impostare alcune priorità di accesso alla CPU. Questo avviene utilizzando un numero di precisione, che appare nella colonna NI. Nella schermata possiamo vedere che tutti i processi sono in esecuzione con numero di precisione zero. Ciò significa che sono in esecuzione con la priorità predefinita, che non è stata alterata in alcun modo. I numeri di precisione vanno da -20 a +19, con -20 come priorità più alta. Ho detto che 0 è la scelta predefinita, ma possiamo verificarlo sul sistema eseguendo il comando nice senza nessun argomento. Ciò che restituisce è il valore predefinito del numero di precisione. Per il momento mi fermo qui con questo argomento, ma se volete saperne di più c'è una buona pagina web presso http://www.ibm.com/developerworks/linux/library/l-lpic1-v3-103-6/. Questo articolo spiegherà come poter cambiare il livello del numero di precisione per alcuni processi, se si desidera farlo.

Memoria

Nella schermata, vicino alla colonna relativa all'uso della CPU c'è quella della memoria utilizzata, sempre espressa come percentuale del totale disponibile. In questo caso, accade che il processo che sta utilizzando maggiore CPU è anche quello che sta utilizzando più memoria, il che non è inusuale. Ma se vogliamo vedere i processi allineati per ordine di memoria consumata? Bene, come ho detto sopra, il comando top è interattivo. Per cambiare l'ordinamento basta premere la lettera maiuscola O mentre il comando è in esecuzione in un terminale. Questo porterà a una utilissima schermata di opzioni di ordinamento (mostrata sotto).

Con questa schermata aperta possiamo premere la lettera minuscola n, dare quindi invio e ottenere l'elenco di ordine di percentuale di memoria utilizzata. Oppure possiamo ordinarlo per altri modi, se necessario.

Di nuovo, è utile se notiamo che stiamo per esaurire la memoria e dobbiamo sapere cosa sta succedendo. Se un processo sta inaspettatamente utilizzando molta memoria, sarebbe sicuramente un'indicazione. Questo non implica che si ha una qualche idea di cosa sia il normale in queste situazioni. Il modo migliore di dare un senso a ciò è di controllare periodicamente e osservare cosa sta succedendo. Nel mio caso, ho portato la mia macchina a 16GB di RAM, così da non aspettarmi di vedere, nella maggior parte dei casi, percentuali di utilizzo molto alte. Per esempio, giusto ora ho i mio pannello inferiore pieno di icone di programmi aperti (al momento sono 18) e un veloce controllo dell'output di top mostra che sto utilizzando il 35-40% del totale della memoria.

Nella schermata, si vede un divoratore di memoria, ma ciò, di fatto, è previsto. Ho VirtualBox che esegue una macchina virtuale, configurata per usare 4GB di RAM (più altre risorse, ovviamente). Quindi, in questo caso, vedevo ciò che mi aspettavo di vedere. Ma se vedevo Firefox che utilizzava troppa memoria, avrei saputo che c'era un problema e l'avrei prontamente chiuso.

q per Quit

Se si ha top avviato nel proprio terminale, si potrebbe voler sapere come uscirne ed è semplice, basta premere la lettera q (per Quit) e si ritornerà al prompt del terminale. Si possono ottenere ulteriori informazioni in questi due modi: il metodo stile vecchia scuola è di digitare 'man top' nel terminale, ma il nuovo metodo, migliorato, è di digitare 'info top'. Tuttavia penso che otterrete lo stesso risultato con entrambi i modi. Il punto è che si tratta di un comando fertile con molte opzioni.

Interpretazione dei Dati di Sistema

Abbiamo visto alcuni concetti base del comando top e ci siamo concentrati nell'esaminare la lista dei processi per individuare e correggere eventuali errori. Questa è ancora una cosa molto utile, naturalmente, ma nell'output ci sono anche molti dati di sistema utili. Riprendiamo la schermata usata l'ultima volta per mostrare il risultato di questo comando (mostrata sotto).

Ora vogliamo concentrarci su quei numeri in cima che stanno rappresentando alcuni dati di sistema molto utili. Quindi partiamo dall'alto (letteralmente):

Riga 1, la riga in cima

Sulla prima riga (sopra) abbiamo il tempo di funzionamento. Effettivamente, questa è un informazione che si potrebbe ottenere usando il comando uptime così:

Quindi questo è un indizio che il comando top è una raccolta di informazioni disponibili singolarmente da altri comandi, riuniti in un unico pacchetto di bontà impressionante. Ciò è molto conveniente.

Così siamo in grado di vedere che sono le 15:52:05 e che il computer è in piedi da 17 giorni. Ci sono due utenti in questo momento, il che è normale. Uno di questi è root, ma non si dovrebbe mai usarlo per le attività ordinarie. È una pratica insicura e pericolosa. Mentre siamo registrati come root, ogni software avviato sul sistema ha il livello di privilegio di root. Il modo migliore è di creare un utente ordinario che non abbia un così ben alto livello di privilegio e registrarsi come tale utente. In questo caso l'utente è kevin. A proposito, Ubuntu rende molto difficile fare qualcosa che sia diversa da questa procedura. Se necessitate di diritti più alti, usate il comando sudo per darvi privilegi temporanei.

L'ultima parte di questa riga è chiamata load. Questi tre numeri stanno fornendo il carico per i precedenti 1, 5 e 15 minuti. Ma cos'è il carico? È il numero medio di processi che sono eseguibili, o non si possono interrompere. Semplicemente, senza entrare troppo nel tecnico, è come viene occupata la CPU per la maggior parte del tempo. Ma il trucco è che non è regolato (normalizzato) per il numero di CPU. Ciò significa che un sistema a singola CPU con un carico di 1 viene caricato tutto il tempo. Ma sul mio sistema dual-core, non ho mai avuto 2, quindi sono a posto. Se si avesse un quad-core, il numero magico sarebbe 4 e cosi via.

Riga 2, Attività

Non c'è nulla di interessante da vedere qui. Quell'ultima categoria, zombie, può sembrare per lo meno interessante, ma in realtà non lo è. I processi zombie sono avvii che hanno terminato l'esecuzione e saranno presto chiusi.

Riga 3, CPU

Questa è meritevole di un'occhiata o due. L'ultima volta abbiamo osservato i processi in fondo all'output del comando top per vedere se qualcuno di loro stava monopolizzando la situazione. Su questa riga, anziché guardare al singolo processo, osserveremo l'intero quadro di ciò che sta succedendo. E qui non dobbiamo preoccuparci di quanti core abbiamo, questi numeri aggregano tutti i dati di tutti i core.

La prima statistica è %us, che in questo caso è 32.0%. Questa è la percentuale dei cicli di CPU impegnati dai processi dell'utente. Non significa necessariamente quelli che una persona ha avviato, possono essere processi lanciati da Apache, MySQL, ecc. Se questa percentuale è molto alta, può essere l'indicazione di un problema, poiché abbiamo altre richieste da considerare. Per esempio, la prossima statistica è %sy, che è la percentuale di cicli CPU impegnati dal kernel e da altri processi di sistema. Ovviamente dobbiamo avere a disposizione alcuni cicli per essi o non avremo un computer funzionante. La terza, %id, è la percentuale del tempo di inattività della CPU, più è elevata meglio è (entro limiti ragionevoli, dobbiamo di fatto usare il computer!). Fintanto che abbiamo una ragionevole disponibilità di tempo di inattività, non avremo verosimilmente problemi. Possiamo ricontrollarlo osservando la quarta statistica, %wa. È la percentuale di tempo di attesa di un processo per l'accesso alla CPU. In questo caso, .2% è buono. Non sarà piacevole vederlo troppo spesso a 0.0%, poiché, data la natura del calcolatore, i processi sono in competizione per il tempo di CPU, ma un elevato numero qui indicherebbe di sicuro un problema. Il resto delle statistiche si possono quasi ignorare, in quanto si occupano di questioni davvero oscure, ma si possono esaminare nella pagina di man per top.

Righe 4 e 5, Memoria e Area di Swap

Queste due righe è meglio trattarle congiuntamente, poiché è necessario combinare queste informazioni per raccontare una storia completa. Quello che dobbiamo sapere è quanta memoria è stata usata e quanta è disponibile, in ogni momento. È importante perché la carenza di RAM è la causa più comune di un computer lento e pigro. A volte può sembrare un problema completamente diverso, questo perché è importante osservare i dati reali. Per esempio, se notiamo che il disco rigido è costantemente 'rumoroso' (noto come thrashing) possiamo pensare di avere un problema di I/O al disco stesso, ma in realtà ciò è più comunemente causato da una mancanza di RAM. Quando non c'è abbastanza RAM per contenere tutto il codice dei programmi e i dati attualmente in uso, alcuni di essi vengono copiati sul disco rigido (detto paging) per liberare spazio per altro codice e dati. Lo spazio in cui tali dati sono copiati è chiamato area di swap. Per cui quando il disco rigido è costantemente rumoroso generalmente significa che il codice e i dati sono continuamente scritti e letti da e per l'area di swap e ulteriore RAM potrebbe eliminare il problema.

Ora, una delle cose che dobbiamo capire per interpretare questi dati è che scrivere sul disco rigido e leggere dal medesimo è approssimativamente più lento di 4 mila milioni di volte rispetto allo scrivere e leggere sulla RAM. Quindi vogliamo minimizzare l'uso dell'area di swap per motivi prestazionali. Ma proprio perché la RAM è così tanto più veloce del disco rigido, il sistema operativo preferisce usarla ogni volta che è possibile. Un modo di accelerare le cose è di mantenere il codice in memoria finché non si chiude il programma. Dopotutto, possiamo riaprirlo, e rimuoverlo dalla RAM lo accelererebbe molto. Quindi il sistema operativo immagazzina nella RAM molto codice che non è effettivamente usato in maniera attiva. A causa di ciò, il resoconto sulla RAM utilizzata sarà simile a quando è sul punto di esaurirsi, anche se potrebbe non essere questo il caso. Dobbiamo osservare tutti i dati per valutarlo.

In questo caso, abbiamo iniziato notando che la macchina ha 15.949.272k di RAM. In altre parole, 16GB, come sapevo perché era quella che ci avevo installato. E il numero successivo dice che praticamente tutti i 16GB sono stati utilizzati. Questo è un problema? Non proprio. Se osserviamo la seconda riga, vediamo che ci sono 6GB di spazio swap, ma sono a mala pena utilizzati (sto usando poco meno di 2MB di RAM). E l'ultimo numero racconta la storia. Dei miei 16GB di RAM, una buona metà, 8GB, è stata usata per depositarci il codice. Se volessi aprire un programma che era già in memoria, grande, il codice è già li e si aprirà velocemente. Se voglio aprire qualche altro programma, il sistema operativo cancellerà parte del codice depositato in memoria per liberare spazio, quindi non c'è problema.

Htop, l'alternativa

In realtà preferisco top, ma ad alcune persone piace di più htop e penso che vedrete il perché. Per alcune cose è più facile lavorarci, in particolare se si necessita di fare alcune operazioni inerenti ai processi. Notate però che su molti sistemi non lo si trova già installato, per cui lo si deve prima installare. Su macchine Ubuntu, si installa con

sudo apt-get install htop

Innanzitutto, si può notare che presenta quasi gli stessi dati sui singoli processi del comando top. I processi, per scelta predefinita, sono sempre elencati in ordine di utilizzo della CPU, si può ancora vedere l'ID del processo, gli utenti, le percentuali di utilizzo della CPU e della memoria, proprio come prima. Possiamo vedere il comando che ha lanciato il processo, invece del solo nome del programma. Diversamente da top, htop permette lo scorrimento orizzontale usando i tasti freccia.

Su htop, abbiamo una interessante aggiunta, che è un visualizzatore grafico separato sull'utilizzo della CPU, per ciascuna di esse o per i core che si hanno, in questo caso 1 e 2 poiché si tratta di una macchina dual-core. E possiamo vedere l'utilizzo della memoria e dell'area di swap in una maniera che potremmo trovare facile da leggere. Tempo di funzionamento, carichi e attività sono mostrati in alto a destra.

Il vero vantaggio di htop si ha quando si vuole far qualcosa su uno o più dei propri processi. Basta semplicemente usare i tasti freccia su e giù per evidenziare i processi e usare quindi uno dei tasti funzione mostrati sul fondo. Per esempio, se si evidenzia un processo e si preme poi F9 si ucciderà il processo. Premendo F7 (Nice-) si abbasserà il numero di precisione, incrementando così la priorità (si, non è intuitivo). E premendo F8 si ridurrà la priorità alzando il numero di precisione. Ma teniamo presente che per dare una priorità molto alta a un processo avremmo bisogno di accedere come root, magari utilizzando il comando

sudo htop

Personalmente, non ho molti motivi di pasticciarci, ma il peggio che potrebbe succedere è che potrebbe essere necessario riavviare il computer se davvero roviniamo tutto.

Altri tasti funzione ci permettono di cambiare rapidamente l'ordinamento, il campo su cui ordinare e così via.

Ricapitolando, penso che htop sia molto utile, ma tendo a usare molto più spesso top per due motivi. Il primo è che mi piacciono le più dettagliare informazioni che fornisce. Il secondo è che lo avrò disponibile su qualsiasi sistema davanti al quale probabilmente mi siedo, mentre htop necessiterà di essere installato e ciò vuol dire una connessione internet funzionante, che potrei anche non avere. Ma, in generale, questi due comandi fanno spesso le stesse cose e sono una cruciale aggiunta ai propri strumenti Linux.
Nelle precedenti quattro parti di questa serie abbiamo lentamente creato un documento di database usando il componente Base di LibreOffice. Abbiamo un database con i formulari per inserire i nostri dati e con le query e i report per estrarli. Abbiamo ora un documento usabile per registrare i libri della nostra libreria. Comunque, l'attuale progettazone ha un difetto che dobbiamo superare. Se dobbiamo inserire un nuovo autore o media mentre siamo nel formulario di inserimento libri, siamo costretti a chiudere quest'ultimo per aprire uno degli altri due. Se potessimo inserire nuovi autori e media direttamente dal formulario libri, si comporterebbe più come una applicazione, rendendo ancora più facile l'inserimento dei dati. Possiamo raggiungere tale obiettivo attraverso poche brevi macro.

Il linguaggio Basic di LibreOffice è molto simili al Basic di altri linguaggi quali Visual Basic for Applications. Per manipolare il documento in parola, accediamo al framework Uno per controllare il documento. Il framework Uno è piuttosto complesso, ma vi spiegherò, meglio che posso, le proprietà e gli oggetti che useremo. L'obiettivo non è di insegnarvi come scrivere le macro LibreOffice, ma come poterle usare.

Opzioni di Sicurezza delle Macro

Sebbene le macro ci permettono di fare cose fantastiche nei documenti, possono anche causare problemi. Alcune persone le usano per compromettere i sistemi degli altri, perciò dobbiamo prenderci alcuni minuti per parlare della sicurezza delle macro. Sia che si esegua LibreOffice su Linux, che su Mac o Windows, il codice maligno in una macro può compromettere i propri dati e forse l'intero sistema.

In LibreOffice la sicurezza delle macro è semplice. In Strumenti > Opzioni si apre la finestra Opzioni per LibreOffice. Nella scheda LibreOffice selezionare Sicurezza. Fare clic sul pulsante 'Sicurezza delle macro...' per far apparire le opzioni sulla sicurezza delle macro. Avete quattro opzioni. Non usate mai l'opzione 'Basso', avvia le macro senza chiedercelo. Raccomando il livello 'Medio'. Con tale livello ci verrà richiesto se avviare le macro quando si apre un documento che le contiene. Le opzioni 'Alto' e 'Molto alto' richiedono un certificato o una cartella designata come affidabile. Sebbene è una gran cosa, credo che nulla batta l'istinto dell'utente. Generalmente sappiamo di aspettarci che un documento contenga o meno delle macro. Nel dubbio, fare clic su No. Fare clic su OK per salvare le scelte e nuovamente OK per chiudere la finestra.

Ora, addentriamoci nelle cose divertenti.

Le Macro

Scriveremo quattro macro per il nostro documento di database. Tre avranno a che fare con l'apertura dei formulari e l'ultimo aggiornerà le caselle di scelta per autori e media. L'idea di massima dietro alle macro è di svolgere i compiti che non sono integrati nel programma, o di semplificare i lavori complessi. Le nostre macro svolgeranno effettivamente entrambe le cose, poiché semplificheremo il compito di aggiungere autori e media e forniremo funzionalità non presenti nel programma.

Prima di poter iniziare a scrivere le macro, ci serve un contenitore per tenerle. Le macro sono contenute in un modulo. I moduli possono esistere nel programma stesso o all'interno del documento. Poiché le nostre macro sono specifiche per il nostro file di database, le integreremo nel documento. Le macro integrate nel documento sono disponibili soltanto quando viene caricato il documento stesso. Quelle contenute nel programma sono disponibili fintanto che il programma è in esecuzione.

Strumenti > Macro > Organizza macro > LibreOffice Basic farà apparire la finestra Macro LibreOffice Basic. Selezionare libri.odb dalla lista 'Macro da'. Fate clic sul pulsante 'Nuovo'. Comparirà una finestra di dialogo nella quale inserite il nome del modulo. Chiamatelo 'FormCalls' e premete OK. Ciò vi porterà all'editor per le macro di LibreOffice. La macro è fornita di una funzione principale predefinita. Non la useremo. Evidenziare Sub main e End Sub e premere il tasto backspace (←) per cancellarli.

La nostra prima macro è una funzione generalizzata per aprire un modulo. Una funzione generalizzata è scritta per il riuso. Richiameremo questa routine un paio di volte da altre routine che scriveremo. Digitare questa funzione nell'editor:
{{{
code


Sub OpenAForm (FormName as String)
    Dim GetForm as Object
    GetForm = ThisDatabaseDocument.FormDocuments.GetByName(FormName)
    GetForm.Open
End Sub
}}}

La prima riga della funzione è chiamata la firma. Essa determina il modo in cui chiamare la funzione stessa. La firma inizia con la parola chiave Sub, che definisce questa chiamata come funzione. Segue il nome della funzione. Nel nostro caso, è 'OpenAForm'. Infine, tra le parentesi, ci sono i parametri usati quando si chiama questa funzione. Nel nostro caso abbiamo una variabile di nome FormName che è di tipo String. Nella seconda riga, Dim è un'altra parola chiave che inizializza una variabile assegnandogli una tipologia e, opzionalmente, un valore. Definiamo la variabile di nome GetForm come tipo Object. Nella terza riga viene assegnato un valore alla variabile GetForm attraverso una catena di comandi nel framework Uno. ThisDatabaseDocument si riferisce all'attuale documento di database aperto, nel nostro caso book.odb. FormDocuments è la collezione di tutti i formulari nel documento. Infine, GetByName recupera uno specifico oggetto formulario dalla collezione. Notare il passaggio della variabile FormName dalla firma a questo metodo. Una volta che la chiamata è completa, la variabile GetForm è l'oggetto con il nome del formulario passato alla funzione. La quarta riga chiama il metodo Open del modulo. Nella quinta riga diciamo a Basic che qui termina la funzione, con il comando End Sub.

Richiameremo la funzione OpenAForm un paio di volte. Una per aprire il formulario Autori e l'altra per aprire quello Media. Aggiungete queste due funzioni mostrate sotto nell'editor.
                                   
La firma di queste due funzioni è leggermente diversa. Poiché le invocheremo da un controllo all'interno del formulario, dovremo passargli come argomento l'oggetto che effettua la chiamata, anche se non lo usiamo. L'argomento oEv è un riferimento all'oggetto che effettua la chiamata. Lo useremo più tardi a nostro vantaggio, nell'ultima funzione, qui lo facciamo perché è necessario. Queste due funzioni sono abbastanza semplici.
Effettuiamo solo una chiamata a OpenAForm passandogli il nome del formulario che vogliamo aprire, Autori o Media.


L'ultima funzione affronta il problema di ricaricare i dati nelle caselle di scelta per autori e media quando li aggiungiamo utilizzando le due funzioni di cui sopra.

{{{
code
}}}

Di nuovo, dato che chiameremo questa funzione da un controllo, c'è bisogno di un riferimento al controllo che effettua la chiamata. Comunque, questa volta useremo effettivamente l'oggetto. Questa funzione fa una chiamata di metodo al modello di base della casella di scelta e rinnova i dati nella lista, quindi aggiorna la nostra lista di autori e media. Salvare il modulo e chiudere l'editor Basic.

Effettuare Connessioni alle Macro

A questo punto, le macro non fanno nulla. Dobbiamo connetterle agli oggetti nei formulari per attivarle quando necessario. Innanzitutto, collegheremo ai pulsanti dei nostri formulari le funzioni che aprono i moduli e poi collegheremo la funzione ListRefresh alle caselle di scelta.

Fate clic su Formulari nel pannello Database. Clic con il tasto destro sul modulo Libri e selezionare Modifica. Aggiungete due pulsanti al modulo, uno sotto alla tabella Autori e l'altro sotto la tabella Media. Fate clic con il tasto destro sul pulsante sotto la tabella Autori e selezionate 'Campo di controllo...' per aprire le finestra delle proprietà dei pulsanti. Sulla scheda Generale, cambiate il nome in AddAuthors e la didascalia in 'Aggiungi Autori'. Sulla scheda Eventi, premete il pulsante con i puntini (...) vicino a 'Eseguire Azione', che farà apparire la finestra 'Azione assegnata'. Premete il pulsante 'Macro...' per aprire la finestra 'Selettore Macro'. Nell'elenco ad albero sotto 'Libreria', selezionate libro.odb > Standard > FormCalls. Selezionate OpenAuthorsForm dalla lista 'Nome macro' e premete OK. Premete ancora OK per chiudere la finestra 'Assegna Azione'. Chiudete le finestra Proprietà del pulsante.

Fate la stessa cosa con il pulsante sotto la tabella Media, solo che il nome è AddMedia, la didascalia è 'Aggiungi Media' e assegnate la macro OpenMediaForm all'evento Esegui azione.

Infine, dobbiamo aggiungere la funzione di riaggiornamento alle caselle di scelta. Fate clic con il tasto destro sulla colonna Autori nella tabella autori e selezionare 'Colonna'. Sulla scheda Eventi, premete il pulsante con i puntini (...) accanto a 'Al ricevimento del fuoco'. Usate il pulsante Macro, sotto ad 'Assegna:', per assegnare la macro ListRefresh all'azione. Questo farà si che la lista aggiorni i dati dalla tabella Autori quando si fa clic su una casella di riepilogo nella colonna.
Fate la stessa cosa per la colonna Media nella tabella media.
Salvate i cambiamenti al modulo Libri e chiudetelo.

Verificare i cambiamenti

Ogni volta che effettuiamo dei cambiamenti ai nostri moduli, vorremmo verificarli per assicurarci che tutto sia corretto, specialmente nei casi in cui abbiamo utilizzato le macro. Un semplice errore di battitura potrebbe essere causa di malfunzionamenti. Fare doppio clic sul formulario Libri per aprirlo. Aggiungere un nuovo libro, un autore e un tipo di media che non sono già presenti. Premete il pulsante 'Aggiungi Autori' per assicurarsi che apra il formulario. Aggiungete alcuni autori. Chiudere il formulario autori. Fare clic sulla casella a comparsa autori e verificare che ci siano gli autori aggiunti. Effettuate la stessa verifica con il pulsante 'Aggiungi Media' e la casella a comparsa.

Conclusioni e Riferimenti

Vorrei nuovamente enfatizzare il concetto che scrivere macro in LibreOffice Basic è complesso. La documentazione è abbastanza sparsa, ma è la fuori. Se siete interessati a raccogliere la sfida, qui ci sono alcuni riferimenti per iniziare:
LibreOffice Basic Guide: http://wiki.documentfoundation.org/images/d/dd/BasicGuide_OOo3.2.0.odt
Informazioni di Andrew Pitonyak su OpenOffice Macro: http://www.pitonyak.org/oo.php

Potete trovare le macro usate in questo tutorial su pastebin.com presso: http://pastebin.com/MU2Ztizi

La prossima volta ci sposteremo su un'altra parte della suite LibreOffice ed esploreremo il componente Math.
Linea 198: Linea 202:

Testo inglese

LibreOffice Part 23: Base Form Enhancements with Macros

by Elmer Perry

For the previous four parts of this series, we have slowly built a database document using LibreOffice's Base module. We have a database with forms to enter our data, and queries and reports for extracting the data. We now have a usable document for recording our book library. However, our current design has one flaw we need to overcome. If we need to enter a new author or media type while we are in the books form, we have to close the book form and open one of the others. If we could enter new authors and media types directly from the books form, it would behave more like an application and make data entry even easier. We can accomplish this through a few short macros. The LibreOffice Basic language is very similar to other Basic languages, such as Visual Basic for Applications. To manipulate the underlying LibreOffice document, we access the Uno framework controlling the document. The Uno framework is quite complex, but I will explain, as best I can, the properties and objects we will use. The goal is not to teach you how to write LibreOffice macros, but how you can use them. Macro Security and Options

While macros allow us to do cool things in our documents, they can also cause problems. Some people use macros to compromise other people's systems, therefore, we need to take a few minutes to talk about macro security. Whether you are running LibreOffice on Linux, Mac, or Windows, malicious code in a macro can compromise your data and possibly your entire system.

Macro security in LibreOffice is simple. Tools > Options opens the Options dialog for LibreOffice. Under LibreOffice, select Security. Click on the Macro Security button to pop up the macro security options. You have four options. Never use the Low security option – it will run macros without asking you. I recommend the Medium security level. With this level, you are prompted whether to run the macros when you open a document containing macros. The High and Very High options require a certificate or folder you designate as trusted. While this is great, I believe nothing trumps the instincts of the user. You usually know whether you were expecting a document to contain macros. When in doubt, click No. Click OK to save your choice and OK to close the options dialog. Now, on to the fun stuff. The Macros

We will write four macros for our database document. Three will deal with opening forms, and the last will update the list boxes for authors and media types. The general idea behind macros is to accomplish tasks that are not built into the program, or to simplify complex tasks. Our macros really accomplish both, as we will simplify the tasks of adding authors and media types and provide functionality not built into the program. Before we can begin to write our macros, we need a container to hold them. Macros are contained in a module. Modules can live in the program itself or within a document. Since our macros are specific to our database file, we will embed them in the document. Macros embedded in a document are available only when the document is loaded. Macros contained in the program are available as long as the program is running. Tools > Macros > Organize Macros > LibreOffice Basic. The LibreOffice Basic Macros dialog pops up. Select book.odb from the Macro from-list. Click the New button. A dialog pops up asking you for a name for the module. Name it FormCalls. Click OK. This brings up the LibreOffice macro editor. The macro comes with a default main subroutine. We will not use this subroutine. Highlight Sub main and End Sub and press the backspace key to delete them. Our first macro is a generalized subroutine for opening a form. A generalized subroutine is written for reuse. We will call this routine twice from other routines we write. Type this subroutine into the editor:

Sub OpenAForm (FormName as String)
        Dim GetForm as Object
        GetForm = ThisDatabaseDocument.FormDocuments.GetByName(FormName)
        GetForm.Open
End Sub

The first line of the subroutine is called the signature. The signature determines how the subroutine is called. A signature starts with the keyword Sub, which defines this call as a subroutine. Next, the name of the subroutine. In our case, OpenAForm is the name of the subroutine. Finally in the parenthesis, we have the arguments used when calling this subroutine. In our case, we have a variable named FormName which is a type String. In the second line of the subroutine, Dim is another keyword. Dim initializes a variable as a type, and, optionally, a value. We define a variable named GetForm as a type Object. The third line assigns a value to the variable GetForm through a chain of commands in the Uno framework. ThisDatabaseDocument refers to the currently open database document. In our case, book.odb. FormDocuments is a collection of all the forms in the document. Finally, GetByName retrieves a specific form object from the collection. Notice, we pass the variable FormName from the signature to this method. Once the call is complete, the variable GetForm is the object of the form name passed to the subroutine. The fourth line calls the Open method of the form. On the fifth line, we tell Basic this is the end of the subroutine with the command End Sub. We will call the OpenAform subroutine twice. Once to open the authors form, and once to open the media form. Add these two subroutines to your editor:

Sub OpenAuthorsForm(oEv As Object)
        OpenAForm("Authors")
End Sub

Sub OpenMediaForm(oEv As Object)
        OpenAForm("Media")
End Sub

The signature on these two subroutines are a little different. Since we will call them from a control within a form, we need to pass the object making the call as an argument, even though we do not use it. The argument oEv is a reference to the object making the call. We will use this to our advantage later, in the last subroutine, but here we do it because it is required. These two subroutines are pretty simple. We just make a call to OpenAForm passing the name of the form we want to open, Authors or Media. The final subroutine deals with our problem of refreshing the data in the list boxes for authors and media when we add authors or media using the two subroutines above:

Sub ListRefresh(oEv as Object)
        oEv.source.model.Refresh
End Sub

Once again, since we will call this subroutine from a control, we need a reference to the control making the call. However, this time we will actually use the object. This subroutine makes a method call to the underlying model of the list box and refreshes the data in the list, thus updating our list of authors or media types. Save your module and close the Basic editor.

Making Connections to Macros

At this point, our macros do nothing. We need to connect them to objects in our form to activate them when needed. First, we will connect the open form subroutines to buttons in our form, and then we will connect the ListRefresh to the list boxes. In the database pane, click on Forms. Right-click the Books form and select edit. Add two push buttons to the form, one under the Authors table and another under the Media table. Right-click the button under the Authors table and select Control to bring up the buttons properties dialog. On the General tab, change the name to AddAuthors and the Label to Add Authors. On the Events tab, click the ellipses (…) button next to Execute Action – which brings up the Assign Action dialog. Click the Macro button to bring up the Macro Selector dialog. In the tree list under Library, select book.odb > Standard > FormCalls. Select OpenAuthorsForm from the Macro Name list and click OK. Click OK to close the Assign Action dialog. Close the buttons properties dialog. Do the same with the button under the Media table, only name it AddMedia, make the label Add Media Type, and assign the macro OpenMediaForm to the Execute Action event. Finally, we need to add the refresh subroutine to our list boxes. Right-click the Authors column in the authors table and select Column. On the Events tab, click the ellipse (…) button beside “When receiving focus”. In the Assign Action button, use the Macro button to assign the ListRefresh macro to the action. This will cause the list to update data from the Authors table when you click on a list box in the column. Do the same for the Media column in the media table. Save your changes to the Books form and close it.

Testing Your Changes

Any time we make changes to our forms, we will want to test them and make sure we got everything right, especially in cases where we have used macros. One simple typo could cause things to not work. Double-click the Books form to open it. Add a new book with an author and media type you have not added already. Click the Add Authors button to make sure it opens the form. Add some authors. Close the Authors form. Click on the authors dropdown list box and verify that the authors you added are there. Do the same test with the Add Media Type button and listbox. Final Thoughts and References

Again, I would like to emphasize that writing macros in LibreOffice Basic is complex. Documentation is pretty sparse, but it is out there. If you are interested in taking up the challenge, here are some references to get you started: LibreOffice Basic Guide: http://wiki.documentfoundation.org/images/d/dd/BasicGuide_OOo3.2.0.odt Andrew Pitonyak's OpenOffice Macro Information: http://www.pitonyak.org/oo.php You can find the macros used in this How-To on pastebin.com at http://pastebin.com/MU2Ztizi Next time, we will move on to another part of the LibreOffice suite and explore the Math module.

Traduzione italiana

Nelle precedenti quattro parti di questa serie abbiamo lentamente creato un documento di database usando il componente Base di LibreOffice. Abbiamo un database con i formulari per inserire i dati e con query e report per estrarli. Possiamo ora usare il documento per registrare i libri della nostra libreria. Comunque, l'attuale progettazone ha un difetto che dobbiamo superare. Se dobbiamo inserire un nuovo autore o media mentre siamo nel formulario di inserimento libri, siamo costretti a chiudere quest'ultimo per aprire uno degli altri due. Se potessimo inserire nuovi autori e media direttamente dal formulario libri, si comporterebbe più come una applicazione, rendendo ancora più facile l'inserimento dei dati. Possiamo raggiungere tale obiettivo attraverso poche brevi macro. Il linguaggio Basic di LibreOffice è molto simili al Basic di altri linguaggi quali Visual Basic for Applications. Per manipolare il documento in parola, accediamo al framework UNO che controlla il documento. Il framework UNO è piuttosto complesso, ma vi spiegherò, meglio che posso, le proprietà e gli oggetti che useremo. L'obiettivo non è di insegnarvi come scrivere le macro LibreOffice, ma come poterle usare. Opzioni di Sicurezza delle Macro Sebbene le macro ci permettono di fare cose fantastiche nei documenti, possono anche causare problemi. Alcune persone le usano per compromettere i sistemi degli altri, perciò dobbiamo prenderci alcuni minuti per parlare della sicurezza delle macro. Sia che si esegua LibreOffice su Linux, che su Mac o Windows, il codice maligno in una macro può compromettere i propri dati e forse l'intero sistema. In LibreOffice la sicurezza delle macro è semplice. In Strumenti > Opzioni si apre la finestra Opzioni per LibreOffice. Nella scheda LibreOffice selezionare Sicurezza. Fare clic sul pulsante 'Sicurezza delle macro...' per far apparire le opzioni sulla sicurezza delle macro. Ci sono quattro opzioni. Non usare mai l'opzione 'Basso', avvia le macro senza chiedercelo. Raccomando il livello 'Medio'. Con tale livello ci verrà richiesto se avviare le macro quando si apre un documento che le contiene. Le opzioni 'Alto' e 'Molto alto' richiedono un certificato o una cartella designata come affidabile. Sebbene è una gran cosa, credo che nulla batta l'istinto dell'utente. Generalmente sappiamo di aspettarci che un documento contenga o meno delle macro. Nel dubbio, fare clic su No. Fare clic su OK per salvare le scelte e nuovamente OK per chiudere la finestra. Ora, addentriamoci nelle cose divertenti. Le Macro Scriveremo quattro macro per il nostro documento di database. Tre avranno a che fare con l'apertura dei formulari e l'ultimo aggiornerà le caselle di scelta per autori e media. L'idea di massima dietro alle macro è di svolgere i compiti che non sono integrati nel programma, o di semplificare i lavori complessi. Le nostre macro svolgeranno effettivamente entrambe le cose, poiché semplificheremo il compito di aggiungere autori e media e forniremo funzionalità non integrate nel programma. Prima di poter iniziare a scrivere le macro, ci serve un contenitore per tenerle. Le macro sono contenute in un modulo. I moduli possono esistere nel programma stesso o all'interno del documento. Poiché le nostre macro sono specifiche per il nostro file di database, le integreremo nel documento. Le macro integrate nel documento sono disponibili soltanto quando viene caricato il documento stesso. Quelle contenute nel programma sono disponibili fintanto che il programma è in esecuzione. Strumenti > Macro > Organizza macro > LibreOffice Basic farà apparire la finestra Macro LibreOffice Basic. Selezionare libri.odb dalla lista 'Macro da'. Fare clic sul pulsante 'Nuovo'. Comparirà una finestra di dialogo nella quale inserire il nome del modulo. Chiamarlo 'FormCalls' e premere OK. Ciò vi porterà all'editor per le macro di LibreOffice. La macro è fornita di una funzione principale predefinita. Non la useremo. Evidenziare Sub main e End Sub e premere il tasto backspace (←) per cancellarli. La nostra prima macro è una funzione generalizzata per aprire un modulo. Una funzione generalizzata è scritta per il riuso. Richiameremo questa routine un paio di volte da altre routine che scriveremo. Digitare questa funzione nell'editor: Sub OpenAForm (FormName as String)

End Sub La prima riga della funzione è chiamata la firma. Essa determina il modo in cui chiamare la funzione stessa. La firma inizia con la parola chiave Sub, che definisce questa chiamata come funzione. Segue il nome della funzione. Nel nostro caso, è 'OpenAForm'. Infine, tra le parentesi, ci sono i parametri usati quando si chiama questa funzione. Nel nostro caso abbiamo una variabile di nome FormName che è di tipo String. Nella seconda riga, Dim è un'altra parola chiave che inizializza una variabile assegnandogli una tipologia e, opzionalmente, un valore. Definiamo la variabile di nome GetForm come tipo Object. Nella terza riga viene assegnato un valore alla variabile GetForm attraverso una catena di comandi nel framework UNO. ThisDatabaseDocument si riferisce all'attuale documento di database aperto, nel nostro caso book.odb. FormDocuments è la collezione di tutti i formulari nel documento. Infine, GetByName recupera uno specifico oggetto formulario dalla collezione. Notare il passaggio della variabile FormName dalla firma a questo metodo. Una volta che la chiamata è completa, la variabile GetForm è l'oggetto con il nome del formulario passato alla funzione. La quarta riga chiama il metodo Open del modulo. Nella quinta riga diciamo a Basic che qui termina la funzione, con il comando End Sub. Richiameremo la funzione OpenAForm un paio di volte. Una per aprire il formulario Autori e l'altra per aprire quello Media. Aggiungere queste due funzioni nell'editor: Sub OpenAuthorsForm(oEv As Object)

  • OpenAForm("Autori")

End Sub Sub OpenMediaForm(oEv As Object)

  • OpenAForm("Media")

End Sub

La firma di queste due funzioni è leggermente diversa. Poiché le invocheremo da un controllo all'interno del formulario, dovremo passargli come argomento l'oggetto che effettua la chiamata, anche se non lo usiamo. L'argomento oEv è un riferimento all'oggetto che effettua la chiamata. Lo useremo più tardi a nostro vantaggio, nell'ultima funzione, qui lo facciamo perché è necessario. Queste due funzioni sono abbastanza semplici. Effettuiamo solo una chiamata a OpenAForm passandogli il nome del formulario che vogliamo aprire, Autori o Media. L'ultima funzione affronta il problema di ricaricare i dati nelle caselle di scelta per autori e media quando li aggiungiamo utilizzando le due funzioni di cui sopra: Sub ListRefresh(oEv as Object)

  • oEv.source.model.Refresh

End Sub Di nuovo, dato che chiameremo questa funzione da un controllo, c'è bisogno di un riferimento al controllo che effettui la chiamata. Comunque, questa volta useremo effettivamente l'oggetto. Questa funzione fa una chiamata di metodo al modello di base della casella di scelta e rinnova i dati nella lista, quindi aggiorna la nostra lista di autori e media. Salvare il modulo e chiudere l'editor Basic. Effettuare Connessioni alle Macro A questo punto, le macro non fanno nulla. Dobbiamo connetterle agli oggetti nei formulari per attivarle quando necessario. Innanzitutto, collegheremo ai pulsanti dei nostri formulari le funzioni che aprono i moduli e poi collegheremo la funzione ListRefresh alle caselle di scelta. Fare clic su Formulari nel pannello Database. Clic con il tasto destro sul modulo Libri e selezionare Modifica. Aggiungere due pulsanti al modulo, uno sotto alla tabella Autori e l'altro sotto la tabella Media. Fare clic con il tasto destro sul pulsante sotto la tabella Autori e selezionare 'Campo di controllo...' per aprire le finestra delle proprietà del pulsante. Sulla scheda Generale, cambiare il nome in AddAuthors e la didascalia in 'Aggiungi Autori'. Sulla scheda Eventi, premere il pulsante ellittico (...) vicino a 'Eseguire Azione', che farà apparire la finestra 'Azione assegnata'. Premere il pulsante 'Macro...' per aprire la finestra 'Selettore Macro'. Nell'elenco ad albero sotto 'Libreria', selezionare libro.odb > Standard > FormCalls. Selezionare OpenAuthorsForm dalla lista 'Nome macro' e premere OK. Premere ancora OK per chiudere la finestra 'Assegna Azione'. Chiudere le finestra Proprietà del pulsante. Fare la stessa cosa con il pulsante sotto la tabella Media, solo che il nome è AddMedia, la didascalia è 'Aggiungi Media' e si deve assegnare la macro OpenMediaForm all'evento Esegui azione. Infine, si deve aggiungere la funzione ListRefresh alle caselle di scelta. Fare clic con il tasto destro sulla colonna Autori nella tabella autori e selezionare 'Colonna'. Sulla scheda Eventi, premere il pulsante ellittico (...) accanto a 'Al ricevimento del punto focale'. Usare il pulsante Macro, sotto ad 'Assegna:', per assegnare la macro ListRefresh all'azione. Questo farà si che la lista aggiorni i dati dalla tabella Autori quando si fa clic su una casella di riepilogo nella colonna. Fare la stessa cosa per la colonna Media nella tabella media. Salvare i cambiamenti al modulo Libri e chiuderlo. Verificare i cambiamenti Ogni volta che effettuiamo dei cambiamenti ai nostri moduli, vorremmo verificarli per assicurarci che tutto sia corretto, specialmente nei casi in cui abbiamo utilizzato le macro. Un semplice errore di battitura potrebbe essere causa di malfunzionamenti. Fare doppio clic sul formulario Libri per aprirlo. Aggiungere un nuovo libro, un autore e un tipo di media non già presenti. Premere il pulsante 'Aggiungi Autori' per assicurarsi che apra il formulario. Aggiungere alcuni autori. Chiudere il formulario autori. Fare clic sulla casella a comparsa autori e verificare che ci siano gli autori aggiunti. Effettuare la stessa verifica con il pulsante 'Aggiungi Media' e la casella a comparsa. Conclusioni e Riferimenti Vorrei nuovamente enfatizzare il concetto che scrivere macro in LibreOffice Basic è complesso. La documentazione è abbastanza sparsa, ma è la fuori. Se siete interessati a raccogliere la sfida, qui ci sono alcuni riferimenti per iniziare: LibreOffice Basic Guide: http://wiki.documentfoundation.org/images/d/dd/BasicGuide_OOo3.2.0.odt Informazioni di Andrew Pitonyak su OpenOffice Macro: http://www.pitonyak.org/oo.php Potete trovare le macro usate in questo tutorial su pastebin.com presso: http://pastebin.com/MU2Ztizi La prossima volta ci sposteremo su un'altra parte della suite LibreOffice ed esploreremo il componente Math.

Note alla traduzione

Revisione

Nelle precedenti quattro parti di questa serie abbiamo lentamente creato un documento di database usando il componente Base di LibreOffice. Abbiamo un database con i formulari per inserire i nostri dati e con le query e i report per estrarli. Abbiamo ora un documento usabile per registrare i libri della nostra libreria. Comunque, l'attuale progettazone ha un difetto che dobbiamo superare. Se dobbiamo inserire un nuovo autore o media mentre siamo nel formulario di inserimento libri, siamo costretti a chiudere quest'ultimo per aprire uno degli altri due. Se potessimo inserire nuovi autori e media direttamente dal formulario libri, si comporterebbe più come una applicazione, rendendo ancora più facile l'inserimento dei dati. Possiamo raggiungere tale obiettivo attraverso poche brevi macro.

Il linguaggio Basic di LibreOffice è molto simili al Basic di altri linguaggi quali Visual Basic for Applications. Per manipolare il documento in parola, accediamo al framework Uno per controllare il documento. Il framework Uno è piuttosto complesso, ma vi spiegherò, meglio che posso, le proprietà e gli oggetti che useremo. L'obiettivo non è di insegnarvi come scrivere le macro LibreOffice, ma come poterle usare.

Opzioni di Sicurezza delle Macro

Sebbene le macro ci permettono di fare cose fantastiche nei documenti, possono anche causare problemi. Alcune persone le usano per compromettere i sistemi degli altri, perciò dobbiamo prenderci alcuni minuti per parlare della sicurezza delle macro. Sia che si esegua LibreOffice su Linux, che su Mac o Windows, il codice maligno in una macro può compromettere i propri dati e forse l'intero sistema.

In LibreOffice la sicurezza delle macro è semplice. In Strumenti > Opzioni si apre la finestra Opzioni per LibreOffice. Nella scheda LibreOffice selezionare Sicurezza. Fare clic sul pulsante 'Sicurezza delle macro...' per far apparire le opzioni sulla sicurezza delle macro. Avete quattro opzioni. Non usate mai l'opzione 'Basso', avvia le macro senza chiedercelo. Raccomando il livello 'Medio'. Con tale livello ci verrà richiesto se avviare le macro quando si apre un documento che le contiene. Le opzioni 'Alto' e 'Molto alto' richiedono un certificato o una cartella designata come affidabile. Sebbene è una gran cosa, credo che nulla batta l'istinto dell'utente. Generalmente sappiamo di aspettarci che un documento contenga o meno delle macro. Nel dubbio, fare clic su No. Fare clic su OK per salvare le scelte e nuovamente OK per chiudere la finestra.

Ora, addentriamoci nelle cose divertenti.

Le Macro

Scriveremo quattro macro per il nostro documento di database. Tre avranno a che fare con l'apertura dei formulari e l'ultimo aggiornerà le caselle di scelta per autori e media. L'idea di massima dietro alle macro è di svolgere i compiti che non sono integrati nel programma, o di semplificare i lavori complessi. Le nostre macro svolgeranno effettivamente entrambe le cose, poiché semplificheremo il compito di aggiungere autori e media e forniremo funzionalità non presenti nel programma.

Prima di poter iniziare a scrivere le macro, ci serve un contenitore per tenerle. Le macro sono contenute in un modulo. I moduli possono esistere nel programma stesso o all'interno del documento. Poiché le nostre macro sono specifiche per il nostro file di database, le integreremo nel documento. Le macro integrate nel documento sono disponibili soltanto quando viene caricato il documento stesso. Quelle contenute nel programma sono disponibili fintanto che il programma è in esecuzione.

Strumenti > Macro > Organizza macro > LibreOffice Basic farà apparire la finestra Macro LibreOffice Basic. Selezionare libri.odb dalla lista 'Macro da'. Fate clic sul pulsante 'Nuovo'. Comparirà una finestra di dialogo nella quale inserite il nome del modulo. Chiamatelo 'FormCalls' e premete OK. Ciò vi porterà all'editor per le macro di LibreOffice. La macro è fornita di una funzione principale predefinita. Non la useremo. Evidenziare Sub main e End Sub e premere il tasto backspace (←) per cancellarli.

La nostra prima macro è una funzione generalizzata per aprire un modulo. Una funzione generalizzata è scritta per il riuso. Richiameremo questa routine un paio di volte da altre routine che scriveremo. Digitare questa funzione nell'editor:

code


Sub OpenAForm (FormName as String)
    Dim GetForm as Object
    GetForm = ThisDatabaseDocument.FormDocuments.GetByName(FormName)
    GetForm.Open
End Sub

La prima riga della funzione è chiamata la firma. Essa determina il modo in cui chiamare la funzione stessa. La firma inizia con la parola chiave Sub, che definisce questa chiamata come funzione. Segue il nome della funzione. Nel nostro caso, è 'OpenAForm'. Infine, tra le parentesi, ci sono i parametri usati quando si chiama questa funzione. Nel nostro caso abbiamo una variabile di nome FormName che è di tipo String. Nella seconda riga, Dim è un'altra parola chiave che inizializza una variabile assegnandogli una tipologia e, opzionalmente, un valore. Definiamo la variabile di nome GetForm come tipo Object. Nella terza riga viene assegnato un valore alla variabile GetForm attraverso una catena di comandi nel framework Uno. ThisDatabaseDocument si riferisce all'attuale documento di database aperto, nel nostro caso book.odb. FormDocuments è la collezione di tutti i formulari nel documento. Infine, GetByName recupera uno specifico oggetto formulario dalla collezione. Notare il passaggio della variabile FormName dalla firma a questo metodo. Una volta che la chiamata è completa, la variabile GetForm è l'oggetto con il nome del formulario passato alla funzione. La quarta riga chiama il metodo Open del modulo. Nella quinta riga diciamo a Basic che qui termina la funzione, con il comando End Sub.

Richiameremo la funzione OpenAForm un paio di volte. Una per aprire il formulario Autori e l'altra per aprire quello Media. Aggiungete queste due funzioni mostrate sotto nell'editor.

La firma di queste due funzioni è leggermente diversa. Poiché le invocheremo da un controllo all'interno del formulario, dovremo passargli come argomento l'oggetto che effettua la chiamata, anche se non lo usiamo. L'argomento oEv è un riferimento all'oggetto che effettua la chiamata. Lo useremo più tardi a nostro vantaggio, nell'ultima funzione, qui lo facciamo perché è necessario. Queste due funzioni sono abbastanza semplici. Effettuiamo solo una chiamata a OpenAForm passandogli il nome del formulario che vogliamo aprire, Autori o Media.

L'ultima funzione affronta il problema di ricaricare i dati nelle caselle di scelta per autori e media quando li aggiungiamo utilizzando le due funzioni di cui sopra.

code

Di nuovo, dato che chiameremo questa funzione da un controllo, c'è bisogno di un riferimento al controllo che effettua la chiamata. Comunque, questa volta useremo effettivamente l'oggetto. Questa funzione fa una chiamata di metodo al modello di base della casella di scelta e rinnova i dati nella lista, quindi aggiorna la nostra lista di autori e media. Salvare il modulo e chiudere l'editor Basic.

Effettuare Connessioni alle Macro

A questo punto, le macro non fanno nulla. Dobbiamo connetterle agli oggetti nei formulari per attivarle quando necessario. Innanzitutto, collegheremo ai pulsanti dei nostri formulari le funzioni che aprono i moduli e poi collegheremo la funzione ListRefresh alle caselle di scelta.

Fate clic su Formulari nel pannello Database. Clic con il tasto destro sul modulo Libri e selezionare Modifica. Aggiungete due pulsanti al modulo, uno sotto alla tabella Autori e l'altro sotto la tabella Media. Fate clic con il tasto destro sul pulsante sotto la tabella Autori e selezionate 'Campo di controllo...' per aprire le finestra delle proprietà dei pulsanti. Sulla scheda Generale, cambiate il nome in AddAuthors e la didascalia in 'Aggiungi Autori'. Sulla scheda Eventi, premete il pulsante con i puntini (...) vicino a 'Eseguire Azione', che farà apparire la finestra 'Azione assegnata'. Premete il pulsante 'Macro...' per aprire la finestra 'Selettore Macro'. Nell'elenco ad albero sotto 'Libreria', selezionate libro.odb > Standard > FormCalls. Selezionate OpenAuthorsForm dalla lista 'Nome macro' e premete OK. Premete ancora OK per chiudere la finestra 'Assegna Azione'. Chiudete le finestra Proprietà del pulsante.

Fate la stessa cosa con il pulsante sotto la tabella Media, solo che il nome è AddMedia, la didascalia è 'Aggiungi Media' e assegnate la macro OpenMediaForm all'evento Esegui azione.

Infine, dobbiamo aggiungere la funzione di riaggiornamento alle caselle di scelta. Fate clic con il tasto destro sulla colonna Autori nella tabella autori e selezionare 'Colonna'. Sulla scheda Eventi, premete il pulsante con i puntini (...) accanto a 'Al ricevimento del fuoco'. Usate il pulsante Macro, sotto ad 'Assegna:', per assegnare la macro ListRefresh all'azione. Questo farà si che la lista aggiorni i dati dalla tabella Autori quando si fa clic su una casella di riepilogo nella colonna. Fate la stessa cosa per la colonna Media nella tabella media. Salvate i cambiamenti al modulo Libri e chiudetelo.

Verificare i cambiamenti

Ogni volta che effettuiamo dei cambiamenti ai nostri moduli, vorremmo verificarli per assicurarci che tutto sia corretto, specialmente nei casi in cui abbiamo utilizzato le macro. Un semplice errore di battitura potrebbe essere causa di malfunzionamenti. Fare doppio clic sul formulario Libri per aprirlo. Aggiungere un nuovo libro, un autore e un tipo di media che non sono già presenti. Premete il pulsante 'Aggiungi Autori' per assicurarsi che apra il formulario. Aggiungete alcuni autori. Chiudere il formulario autori. Fare clic sulla casella a comparsa autori e verificare che ci siano gli autori aggiunti. Effettuate la stessa verifica con il pulsante 'Aggiungi Media' e la casella a comparsa.

Conclusioni e Riferimenti

Vorrei nuovamente enfatizzare il concetto che scrivere macro in LibreOffice Basic è complesso. La documentazione è abbastanza sparsa, ma è la fuori. Se siete interessati a raccogliere la sfida, qui ci sono alcuni riferimenti per iniziare: LibreOffice Basic Guide: http://wiki.documentfoundation.org/images/d/dd/BasicGuide_OOo3.2.0.odt Informazioni di Andrew Pitonyak su OpenOffice Macro: http://www.pitonyak.org/oo.php

Potete trovare le macro usate in questo tutorial su pastebin.com presso: http://pastebin.com/MU2Ztizi

La prossima volta ci sposteremo su un'altra parte della suite LibreOffice ed esploreremo il componente Math.

Note alla revisione

Errata Corrige


CategoryComunitaFcm