Script file e function in Octave

11 03 2011

Comincia qui la seconda lezione di Octave
Script-file
Normalmente è possibile navigare nella cronologia dei comandi effettuati premendo il tasto su o giu, risulta però molto comodo salvare su dei file tutte le istruzioni date, con tanto di commenti, in modo da poter ritirare fuori, a distanza di giorni, mesi o anni, il proprio lavoro.

I file che introduciamo ora si chiamano script-file, per saranno file con estensione .m, e il loro contenuto è una sequenza di istruzioni, scritte come se fossero digitate direttamente in Octave.
Per eseguirli, da Octave, se ci si trova nella stessa cartella dello script-file, basta digitare il nome del file (senza l’estensione).

Notate che normalmente si deve ad uno script-file un nome diverso dalle funzioni già presenti in Octave, altrimenti Octave utilizzerà la funzione al posto del vostro script-file.
Per controllare se un nome esiste già potete dare il comando

exist('nome_file')

Se il comando esiste vi verrà riportato un numero diverso da 0.
Il seguente script-file calcola, ad esempio, la somma dei primi n numeri:
somma.m

%Questo script-file (somma.m) calcola la somma da 1 a n.

n=input('inserisci un numero intero positivo')
v=[1:n];
s=sum(v);
disp('somma= ')
disp(s)

I commenti sono normalmente preceduti da %, oppure, per chi conosce già il C o un minimo di bash, #. Tuttavia in Matlab non è possibile, quindi in questi tutorial, userò la sintassi compatibile con Matlab, appunto per mostrare quanto siano intercambiabili (almeno fino ad un certo livello) i due programmi. Come potete infatti notare, nella documentazione di Octave i commenti vengono dati antecedendo il simbolo ‘#’, mentre nella documentazione di Matlab si usa il simbolo ‘%’ che può appunto venir anche usato in Octave.

Function
Le function sono, normalmente, degli “script-file” che accettano dei parametri e danno un risultato. Normalmente vengono richiamate dagli script-file, inoltre la loro sintassi è leggermente diversa, in modo da essere facilmente interpretati da altri file.
L’intestazione deve avere la struttura
function [out_1,out_2,...out_n]=nomefunction(inp_1,inp_2,...,inp_n)

Il file deve avere il nome “nomefunction.m” e un file può contenere una e una sola function.
Per interrompere la function è consigliato usare la parola return, e i valori output1,output2,…outputn devono essere stati tutti assegnati.
Una function viene richiamata semplicemente nel seguente modo:

[value1, value2, ...valuen]=nomefunction(input1, input2, ...inputn)

A titolo di esempio scriviamo un function che, dato un vettore, riporta il minimo e massimo e elemento

function [min, max]=minmax(v)
%Questa function riporta il minimo e massimo elemento di un vettore
min=min(v);
max=max(v);
return

Come già scritto più volte in precedenza, uso questa sintassi per il Matlab, mentre per Octave sarebbero possibile anche altre soluzioni più specifiche che non presento, appunto per mantenermi compatibili con ambedue i programmi. Qui trovate ad esempio la documentazione per Octave, non sono però sicuro che Matlab riconosca il comando endfunction (purtroppo non possiedo Matlab e quindi non ho potuto controllare), per evitare questo problema vi do’ il link alla documentazione di Matlab.

In uno dei primi articoli ho scritto che avremmo dovuto creare una cartella dove avremmo posizionato le nostre function. Se non lo avete ancora fatte fatelo, e salvate la function minmax.m (assicuratevi di salvarla con il nome giusto!)

Cicli in Octave
Come in tutti i linguaggi di programmazione anche in Octave è possibile definire dei cicli. In sostanza si dice a Octave di ripetere un certo calcolo (in cui ovviamente i numeri dati varieranno) finché non accade una certa condizione preimpostata.

Cicli while
La sintassi è la seguente
while (condizione==true)
istruzione
end

un esempio sciocco

>n=0;
>while (n<5) >n=n+1
>end

Questo ciclo aumenta di 1 il numero n (che abbiamo impostato a 0 prima) finché esso è minore di 5, per n=0,1,2,3,4 questa condizione è vera, quando n=5 non lo è più e il ciclo si ferma.

Cicli for
La sintassi è la seguente:
for contatore=inizio:passo:fine
istruzioni
end
oppure al contatore possiamo assegnare i valori di un vettore.

In ambedue i casi nel ciclo for un istruzione viene eseguito un numero predefinito di volte per i valori che il contato assume.
ad esempio

>for i=1:10 %(oppure i=1:1:10)
>disp('ciao')
>end

Qui il ciclo viene eseguito 10 volte, e in ogni ciclo verrà visualizzata la scritta “ciao”

Normalmente in Octave è sconsigliato, quando si può, scrivere cicli.
Ovviamente gli esempi di prima sono poco significativi, supponiamo però di voler calcolare la media di un vettore v=[1 2 3 4 5 6]
con un ciclo for scriveremmo

>n=0
>for i=v %v è il vettore, i assume i valori presenti nel vettore
>n=n+i
>end
>media=n/lenght(v)

Un modo molto più elegante è quello di scrivere

>media=sum(v)/length(v)

oppure

>mean(v)

visto che in questo caso esiste la funzione apposita.
Evitare cicli, ma effettuare operazioni vettoriali o matriciali permette di risparmiare tempo, su vettori con pochi componenti, come tutti quelli tratti in esempio, la differenza sarà praticamente nulla, ma se si deve lavorare con centinaia di centinaia di valori, dati che vengono da un esperimento, allora anche risparmiare pochi decimi di secondo ad ogni operazione può significare di risparmiare ore e ore di elaborazione dei dati per un codice scritto in maniera più pulita e efficiente.

Operatori logici
In informatica vengono spesso usato operatori logici (oppure booleani), che riportano il valore 0 se una cosa è falsa, un numero diverso da 0 (per convenzione 1) se una cosa è vera.
Gli operatori logici in Octave sono:

>,<,>=,<=,==,~=

potete provare a definire un vettore (o un numero) a e b provare i comandi

>a==b
>a~=b

e via dicendo e osservare i risultato. Le operazioni vengono fatte per ogni componente.

Vi sono poi i seguenti operatori

& , ||, ~, xor

a & b vi da una condizione vera se gli vengono passate due condizioni vere (cioè due numeri diversi da 0, ad esempio
>6 & 3)
a||b da una condizione vera se almeno una delle due condizione che gli vengono passate è vera
xor(a,b) da vero se solo una delle due condizioni è vera/falsa
~a vi da la condizione opposta; da falso se gli passata un qualcosa di vero, da vero se gli passate qualcosa di falso.

Istruzioni if
la sintassi generica è
if (condizione1==true)
istruzione1
elseif (condizione2==true)
istruzione2
elseif …

else
istruzione3
end

In pratica Octave controlla se una condizione è vera (cioè se nella parentesi ha un numero diverso da 0), se lo è esegue una operazione, se non lo è va a controllare se è vera un’altra condizione per eseguire un’altra istruzione.
Esempio

if (n==5) %si vedano gli operatori logici per il significato
disp('n è uguale a cinque')
elseif (n>5)
disp('n è maggiore di cinque')
else
disp('n è minore di cinque')
end

Finita anche questa lezione, eccovi gli esercizi e le soluzioni. Ovviamente è un’ottima idea salvare anche tutti gli esercizi del capitolo precedente sotto forma di script-file, in modo da averli tutti salvati insieme ;)





PlayOnLinux – Wine ottimizzato

29 04 2010

Sicuramente tutti avrete sentito parlare almeno una volta di Wine (programma che tenta di installare (non emulare!) applicazioni pensate per Windows su Gnu/Linux), e chi lo ha provato ad usare si sarà accorto che purtroppo non sempre tutto funziona al primo colpo.
Magari per installare il primo programma dovete seguire qualche guida particolare e copiare vari files (e già qui si hanno le prime difficoltà), di seguito si vuole magari installare un secondo programma e di nuovo si seguono guide varie, e se si devono cambiare le configurazioni di Wine magari il primo non funziona più…
Insomma, installando più programmi possono nascere problemi di natura diversa (la soluzione migliore sarebbe non usare programmi installati con Wine, però magari vi accorgete che ne avete uno che vi serve in modo particolare e allora siete disposti a tentare…)

PlayOnLinux non è nient’altro che una applicazione che si può riassumere attraverso una sola immagine:

Quest’altra invece vi mostra come lavora wine (NB: PlayOnLinux lavora su wine!)

Come possiamo vedere, usando Wine i programmi sono installati tutti insieme, mentre con PlayOnLinux vengono creati dei “prefissi” differenti per ogni installazione, cosi ché se una va male, oppure se si deve configurare wine in modo particolare, questo non incida con le altre installazione già effettuate.
Anche la rimozione di un programma diventa così molto più semplice, basta infatti cancellare il prefisso, mentre da wine la disinstallazione di un programma non è mai andata a buon fine (parlando per esperienza personale).

Il secondo vantaggio di PlayOnLinux (il primo è quello dei prefissi separati), è quello di includere in se una raccolta di script che vi aiutano nell’installazione di vari programmi.
Se vogliamo ad esempio installare un gioco o un programma che appare nell’elenco, come ad esempio Firefox, basterà allora cliccare sull’aplicazione che c’interessa che una intuitiva interfaccia ci guiderà durante l’installazione, scaricherà da solo i file necessari reperibili in internet, e se necessario (ad esempio per un gioco su cd/dvd) chiederà dove si trovano i file d’installazione.

Chiaramente possiamo poi installare anche programmi che non appaiono nell’elenco, potendo così creare comunque un prefisso per ogni programma che tentiamo di installare.

Inoltre sul sito ufficiale sono presenti (pochi) plugins che possiamo installare per aumentare le potenzialità di PlayOnLinux, anche se sinceramente al momento non mi sembrano particolarmente interessanti (almeno nei miei casi).

Se vi state chiedendo perché in PlayOnLinux troviamo l’applicazione Firefox (oppure Blender, 7zip e altri), nonostante sappiamo tutti che esiste anche la versione nativa per Gnu/Linux (e quindi non oso immaginare chi lo installerebbe con Wine), beh, sappiate che nemmeno io ho risposta a questa domanda, se non forse per mostrare le potenzialità di Wine e avere un elenco applicazioni più lungo in PlayOnLinux ;)

Last but not least:
Un ultimo aspetto positivo, per chi sperimenta molto con wine, è la possibilità di inviare il proprio script al team di PlayOnLinux, così al posto di scrivere complicate e poco pratiche guide ai vostri lettori che vogliono installare un programma potete dire di aver “donato” lo script a PlayOnLinux, e per chi è comunque un po’ interessato a sapere come avete fatto potete tranquillamente spiegare il vostro sorgente pezzo per pezzo.

Se siete interessati (e ve lo consiglio fortemente se usate Wine) ad usare PlayOnLinux, vi rimando alla pagina di download che spiega molto bene come è possibile installare questo programma su quasi qualsiasi distro (oltre alla possibilità di poter scaricare i sorgenti, differenti edizioni di wine come estensioni per PlayOnLinux e altri script)