Modulo e probabilità

L’ultima volta che abbiamo parlato di operatori matematici è stato un po’ di tempo fa. Prima di procedere con nuovi argomenti, però, è necessario studiare ancora un paio di cose legate al mondo della matematica: con il post di oggi approfondiremo l’operatore modulo e scopriremo come effettuare un semplice calcolo di probabilità nei nostri sketch.

Modulo

L’operatore modulo – che viene indicato dal simbolo di percentuale % – si trova in tutti i linguaggi di programmazione e ci aiuta a esprimere una funzione matematica molto semplice che conosciamo da quando studiamo le divisioni alle elementari: il calcolo del resto.

Possiamo utilizzare questo operatore sia con numeri o variabili di tipo integerfloat:

println(10/5);
println(10%5);

Queste due linee di codice mostreranno nella console due risultati differenti: la prima, infatti, è una normale divisione: 10 diviso 5 restituisce 2. La seconda linea restituirà 0 perché la divisione non ha resto.

println(11/5);
println(11%5);

In questo secondo esempio, invece, la prima riga di codice ci restituirà ancora 2 mentre la seconda darà come risultato 1.

Perché l’operatore modulo è utile ai fini della programmazione? La risposta è abbastanza semplice: se usato in combinazione con il controllo del frame rate – ovvero il numero di volte al secondo che la funzione draw() ridisegna lo schermo – possiamo dare un ritmo al nostro programma.

frameRate() e frameCount

La funzione frameRate() posizionata all’interno di setup() imposta il numero di frame per secondo (fps) a cui girerà il nostro programma. Ricordo che di default Processing lavora a 60fps. Richiamando la variabile di sistema frameCount, invece, ci verrà restituito il numero di frame che sono trascorsi dall’avvio del programma.

/*
 * Esempio dell'utilizzo di frameRate() e frameCount.
 * In questo esempio, imposto il programma affinché giri a 30fps
 * e visualizzo in console il numero di frame che sono trascorsi
 * dall'avvio.
*/
void setup() {
  frameRate(30);
}

void draw() {
  println(frameCount);
}

Mettiamo insieme quanto visto finora e facciamo in modo che il colore di sfondo del nostro sketch cambi ogni 30 frame (ovvero ogni secondo).

 /*
 * Modulo, frameRate e frameCount
 * In questo programma impostiamo il frameRate a 30fps
 * e cambiamo colore di sfondo una volta ogni secondo.
*/

void setup() {
  frameRate(30);
}

void draw() {
  if(frameCount%30 == 0) {
    background(255, 0, 0);
  } else {
    background(255);
  }
}
Sign up for free 

Se volessimo modificare il programma in modo che il cambio avvenga ogni 2 secondi, sarebbe sufficiente modificare la riga numero 12 così: if(frameCount%60 == 0)

Probabilità

In programmazione e, in particolare, quando si tratta di creative coding, può essere utile implementare un semplice calcolo di probabilità per stabilire quando far eseguire una certa porzione di codice. Come si fa a stabilire quante possibilità ci sono che un dato evento avvenga? Bisogna dividere il numero di volte che una cosa possa accadere per il numero totale di probabilità.

Quindi, per fare un esempio, quante possibilità abbiamo che lanciando una moneta esca testa? Su una moneta ci sono due facce: una testa e una croce, quindi 1/2 = 50%.

Per simulare un sistema casuale ci aiutiamo con la funzione random(), di cui abbiamo già parlato in passato. Modifico il programma precedente facendo sì che il cambio di colore di sfondo avvenga con una probabilità del 20%:

/*
 * Calcolo delle probabilità
*/

void setup() {
  frameRate(30);
}

void draw() {
  float prob = 0.2;
  float random = random(1);
  if(random < prob) {
    background(255, 0, 0);
  } else {
    background(255);
  }
}

Librerie: estendere le funzionalità di Processing

È possibile estendere le funzionalità di base di Processing utilizzando delle librerie esterne. Una libreria non è altro che un insieme di classi, funzioni e variabili pensate e progettate con il preciso scopo di semplificare l’esecuzione di determinate operazioni che, se programmate da zero, renderebbero il nostro programma troppo verboso.

L’idea che sta alla base delle librerie è di fare in modo di non appesantire troppo i programmi che non le richiedono motivo per cui, quando decidiamo di usarne una, dobbiamo usare una sintassi ben precisa per dire al programma “carica questa libreria perché ho intenzione di usarla”.

Librerie built-in

Esistono una serie di librerie che sono incluse già all’interno del pacchetto di Processing:

  • Serial: quando dobbiamo interfacciare il nostro sketch con hardware esterno attraverso la porta seriale
  • Network: per creare applicazioni client e server comunicanti via internet
  • PDF: per grafiche di alta qualità esportate in formato PDF
  • DXF: per esportare grafiche in formato DXF

Ci sono poi le librerie Sound Video che sono sviluppate dalla Processing Foundation ma che è necessario scaricare attraverso il menu Sketch > Import Library > Add Library.

Contributed Libraries

Librerie disponibili nel Contribution Manager

Oltre quelle sviluppate dalla Processing Foundation, esistono numerose librerie di terze parti. Partendo dal menu Sketch > Import Library > Add Library è possibile scaricarle e installarle sul nostro computer. Le contributed libraries che compaiono nel Contribution Manager rispettano degli standard ben precisi che possono essere consultati sul repository ufficiale di GitHub e sono progettate per segnalare automaticamente eventuali aggiornamenti.

Scorrendo rapidamente la lista di tutte le librerie disponibili potete notare la quantità di funzionalità che possono essere aggiunte ai nostri programmi; per fare degli esempi: integrazione di messaggi MIDI, OSC, creazione di GUI, utilizzo di hardware esterno (Leap Motion, Microsoft Kinect), simulazioni di engine 2D e molto altro.

In futuro dedicherò alcuni articoli e guide a quelle più conosciute e utilizzate, nel frattempo, però, potete consultare gli esempi che trovate nel menu File > Examples > Libraries / Contributed Libraries che vengono installati insieme alla libreria.

Installare librerie manualmente

Tutte le librerie vengono installate all’interno della cartella ~/Documents/Processing/libraries (su Mac) o Documents/Processing (su Windows). Nel caso in cui vogliate installare delle librerie di terze parti non presenti nel Contribution Manager che, generalmente, si trovano in formato .jar è sufficiente copiare i file nella cartella di riferimento. È buona norma inserire il file .jar in una sottocartella con lo stesso nome. Una volta completata l’installazione è necessario riavviare Processing per poterle utilizzare.

Utilizzare le librerie installate

Il comando di cui parlavo all’inizio del post per dire al nostro programma “carica la libreria perché voglio utilizzarla” è molto semplice: import a cui bisogna aggiungere i componenti che vogliamo caricare.

Processing Importa Libreria

Attraverso il menu Sketch > Import Library, selezionando la libreria, Processing aggiungerà automaticamente il codice necessario nel nostro sketch.

Ricominciamo?

Sono passati un paio di mesi dall’ultimo articolo su Processing che ho pubblicato qui. Come avevo scritto nel post di conclusione della prima parte ho sentito la necessità di fermarmi a riflettere su come continuare questo progetto.

I problemi emersi erano principalmente due: quali argomenti trattare e come ristrutturare i contenuti fin qui pubblicati (più quelli futuri) per renderli più accessibili. Se devo essere sincero, non sono arrivato a una conclusione definitiva per nessuna delle due questioni. Non avendo mai focalizzato la mia attività solo sulla scrittura di codice, ho sempre vissuto la programmazione non tanto come un’attività da portare a termine con consegne e scadenze definite quanto, piuttosto, come uno sviluppo di idee creative o un esercizio di risoluzione di problemi che io stesso mi ponevo (i nomi dei progetti nella mia sketch folder di Processing sono un esempio palese).

La mia sketch folder di Processing

Sulla questione nuovi contenuti la situazione è la seguente: mi ritrovo con una (lunga) lista di argomenti che vorrei trattare e, a differenza degli articoli scritti fino ad ora, il problema risiede nel fatto che queste nuove idee non sono consequenziali. Una volta acquisiti i principi di base che abbiamo trattato nei 30 articoli già pubblicati, il punto ora è risolvere problemi apparentemente più complessi utilizzando le stesse tecniche. Questo, in fondo, è il bello della programmazione.

Per tutti questi motivi penso che la soluzione giusta sia cercare di sviluppare i nuovi argomenti per “tema” prediligendo una sviluppo più “a sentimento” e meno ponderato. Per qualcuno, forse, sarà più complicato seguire i nuovi argomenti ma sono sicuro che, prima o dopo, tutti riusciranno a collegare i puntini e a utilizzare le informazioni che si trovano sul blog. Da parte mia, cercherò di fare più riferimenti possibile tra un argomento e l’altro linkando i vari temi.

In merito alla riorganizzazione dei contenuti penso che la soluzione più comoda ed efficace sia trasferire tutto su GitHub. Cos’è GitHub? Come funziona? Le risposte a queste due domande richiederebbero una serie di post a parte. La risposta breve è che GitHub è una piattaforma pensata per condividere codice e incentivare la collaborazione tra programmatori.

È utile perché chiunque può collaborare a un progetto suggerendo modifiche, aggiunge e quant’altro. Daniel Shiffman, uno dei miei mentori ed eroi personali, utilizza GitHub in modo davvero incredibile per sviluppare i contenuti che tratta nei suoi video tutorial. Di recente ha realizzato una serie di video dal titolo “GitHub for Poets” che sono visionabili su YouTube. Se capite l’inglese e volete imparare a utilizzare questa piattaforma, vi consiglio caldamente di vedere questi brevi video-tutorial.

Uno degli obiettivi delle prossime settimane sarà organizzare questa nuova piattaforma e trasferire lì tutti i contenuti già pubblicati. Come al solito, per non perdere pezzi, consiglio vivamente di iscrivervi alla newsletter “Creative Coding” per ricevere nella vostra casella e-mail aggiornamenti e nuovi post.