I numeri in Ruby

Guida alla programmazione con Ruby

Ogni numero in Ruby rappresenta un oggetto, o più precisamente un’istanza di una delle classi numeriche di Ruby; a tal proposito la classe Numeric rappresenta la classe di base  per i numeri. In essa è possibile individuare poi la classe Fixnum che viene utilizzata per rappresentare i numeri interi di lunghezza fissa, che occupano un numero di bit non superiore a quello nativo relativo alla macchina in uso (ad esempio 32 bit per una macchina a 32 bit).

La classe Bignum viene utilizzata per rappresentare i numeri interi più grandi di quelli che possono essere contenuti nella classe Fixnum. Risulta opportuno precisare che la transizione tra le due classi avviene in modo del tutto automatico e cioè l’interprete Ruby, in base alle dimensioni del numero da rappresentare associa lo stesso alla classe opportuna.

Per comprendere meglio il significato di quanto detto analizziamo nel dettaglio un esempio; in particolare utilizzeremo un ciclo per moltiplicare un numero a se stesso in modo tale da aumentare progressivamente le dimensioni del numero, contestualmente poi stamperemo la classe con cui il numero viene rappresentato. Per fare questo utilizzeremo il codice seguente:

num = 2
for i in 1..8
   print i, “ “, num.class, " ", num, "\n"
   num *= num
end

dove il simbolo *= viene utilizzato appunto per moltiplicare il numero a se stesso ed assegnarli il risultato. Per visualizzare in tempo reale i risultati forniti dall’interprete ci serviremo del software irb che ci fornisce, come precedentemente già introdotto, una consolle interattiva dove digitare codice Ruby e vedere immediatamente i risultati.

irb(main):001:0> num = 2
=> 2
irb(main):002:0> for i in 1..8
irb(main):003:1> print i, " ", num.class, " ", num, "\n"
irb(main):004:1> num *= num
irb(main):005:1> end
1 Fixnum 2
2 Fixnum 4
3 Fixnum 16
4 Fixnum 256
5 Fixnum 65536
6 Bignum 4294967296
7 Bignum 18446744073709551616
8 Bignum 340282366920938463463374607431768211456
=> 1..8

Nell’esempio appena proposto è possibile verificare che fino alla quinta iterazione il numero è di dimensioni tali da farlo contenere nel range appartenente alla classe Fixnum, relativa alla macchina in uso; dalla sesta iterazione in poi il numero supera i bit nativi e l’interprete in modo automatico effettua la transizione alla classe Bignum.

LINK DI APPROFONDIMENTO PER L’ARGOMENTO:

Nomi di variabili in Python

python

I nomi delle variabili in Python rispettano le regole già viste per gli identificatori Python, ricordiamo poi che Python è case sensitive, nel senso che le lettere maiuscole e minuscole rappresentano entità differenti. Allora i nomi Luigi, luigi e LUIGI si riferiscono a tre variabili diverse. Infine è opportuno segnalare che le parole riservate non possono essere utilizzate come nomi di variabile in Python.

Lista delle parole riservate in Python

and continue else for import not raise
assert def except from in or return
break del exec global is pass try
class elif finally if lambda print while

Per la maggior parte dei compilatori, un nome di variabile può contenere fino a 31 caratteri, in modo da poter adottare per una variabile un nome sufficientemente descrittivo, in Python tale limite non viene indicato. La scelta del nome assume un’importanza fondamentale al fine di rendere leggibile il codice; questo perché un codice leggibile sarà facilmente mantenibile anche da persone diverse dal programmatore che lo ha creato.

LINK DI APPROFONDIMENTO PER L’ARGOMENTO:

Disegnare un ellisse in Autocad

autocad

In questa lezione vedremo come disegnare un ellisse in Autocad. Il comando AutoCAD ellisse è facile da usare. Ricordiamo che un ellisse è una sorta di cerchio schiacciato. Matematicamente, un’ellisse è definito da un asse maggiore e un asse minore. Questi assi determinano la lunghezza dell’ellisse, la sua larghezza, e il grado di curvatura. Un arco ellittico è un arco intercettato da un’ellisse.

Il comando AutoCAD ellisse fornisce un modo semplice per disegnare un’ellisse. È possibile specificare i due punti finali di uno dei suoi assi e quindi specificare un punto finale sull’altro asse. Come il comando Arco, tuttavia, il comando Ellisse offre diverse altre opzioni:

  • Arco: genera un arco ellittico, non un’ellisse completa. Si definisce un arco ellittico proprio come si definisce un un’ellisse completa.
  • Centro: Richiede che si definisca il centro dell’ellisse e poi il punto finale di un asse. È quindi possibile inserire la lunghezza dell’altro asse o specificare una rotazione attorno all’asse maggiore. Se si sceglie la seconda opzione, è possibile inserire un angolo di rotazione specifico per il secondo asse che, a sua volta, definisce completamente l’ellisse.
  • Rotazione: Specifica un angolo che definisce la curvatura dell’ellisse. 

L’esempio seguente ci fa vedere cosa appare sulla riga di comando quando  si crea un’ellisse utilizzando i punti finali di default del metodo assi. Inserisci ellisse e premere Invio o fare clic sul pulsante ellisse:

Specify axis endpoint of ellipse or [Arc/Center]: Pick or type the first endpoint of one axis.

Specify other endpoint of axis: Pick or type the other endpoint of one axis.

Specify distance to other axis or [Rotation]: Pick or type the endpoint of the other axis.

LINK DI APPROFONDIMENTO PER L’ARGOMENTO:

Commenti in Ruby

Guida alla programmazione con Ruby

Al fine di rendere leggibile il codice, sarà possibile inserire delle righe di commento in Ruby, che precedute dal simbolo # (cancelletto), non saranno considerate dall’interprete  ma serviranno esclusivamente a spiegare lo scopo dell’istruzione.

È opportuno precisare che Ruby ci permette di inserire dei commenti in due differenti modi: il primo classico prevede l’inserimento del simbolo # (hash) all’inizio del commento, il codice inserito a partire da tale punto sarà ignorato dall’interprete. Esempi dell’utilizzo di tale procedura sono riportati di seguito:

# Questo è un commento
nome = “Luigi”   # Questo è un commento

Negli esempi precedenti abbiamo potuto verificare che un commento in Ruby può essere inserito anche nella stessa riga contenente del codice. Vediamo ora invece come procedere nel caso si volessero inserire dei commenti su più righe; in tal caso si può utilizzare ancora il simbolo # (hash):

# Primo commento 
# Secondo commento 
# Terzo commento

Oppure utilizzare il blocco commento utilizzando le parole chiave =begin ed =end:

=begin    
 Questo è    
 un commento    
 su più righe 
=end

È da notare che nei commenti in Ruby disposti su più righe, =begin ed =end devono trovarsi all’inizio della riga, senza alcuna indentazione.

LINK DI APPROFONDIMENTO PER L’ARGOMENTO:

Come disegnare una spline in Autocad

autocadIn questa lezione vedremo come disegnare una spline in Autocad. Dal menu Disegna scegliendo la voce SPLINE potremo creare un tipo di spline detto curva B-spline razionale non uniforme (NURBS). Una curva NURBS produce una curva uniforme tra i punti di controllo.

Le curve spline ci danno la possibilità di  creare superfici NURBS per la modellazione 3D. Per creare superfici, è possibile eseguire la rivoluzione, il loft, l’estrusione e lo sweep di spline chiuse e aperte.

I comandi disponibili in autocad ci consentono di disegnare una spline in diversi modi:

- Mediante i vertici di controllo (seguire la seguente procedura):

1.Fare clic su scheda Superficie - gruppo - CurveVC spline.
2.Fare clic nell'area di disegno per creare la spline. 
3.Al termine dell'operazione, premere INVIO.

- Mediante i punti di adattamento (seguire la seguente procedura):

1.Fare clic su scheda Superficiegruppo CurveNodo spline.
2.Fare clic nell'area di disegno per creare la spline. 
3.Al termine dell'operazione, premere INVIO.

Per approfondire l’argomento:

Operatori logici in Ruby

Guida alla programmazione con Ruby

Gli operatori logici in Ruby combinatori sono operatori con uno o due operandi logici che forniscono un risultato di tipo logico. Gli operatori logici in Ruby sono riportati nella tabella successiva.

Operatore Tipo di Operazione
! Negazione logica
&& Congiunzione logica
|| Disgiunzione logica inclusiva

Se la relazione espressa dall’operatore è vera, l’operatore fornisce come risultato .TRUE. altrimenti .FALSE. Nella gerarchia delle precedenze vengono per ultimi.

Abbiamo detto che gli operatori logici si applicano ad operandi di tipo logico, allora vediamo di capire in base al valore assunto dagli operandi quale sia il risultato dell’espressione. Siano A e B due variabili di tipo logico, applichiamo ad esse gli operatori logici in Ruby:

  • !A – il risultato è .true. se A è .false. altrimenti è .false.
  • A && B – il risultato è .true. se A e B sono entrambi pari a .true. altrimenti è .false.
  • A || B – il risultato è .true. se almeno uno tra i valori di A o B assume il valore .true. altrimenti è .false.

LINK DI APPROFONDIMENTO PER L’ARGOMENTO:

Operatori relazionali in Ruby

Guida alla programmazione con Ruby

Gli operatori relazionali in RUBY operano su operandi numerici e di caratteri e forniscono come risultato un valore logico (vero o falso).

In un espressione logica in cui compare un operatore relazionale, gli operatori coinvolti vengono confrontati e dalla relazione tra di essi scaturisce il risultato. Gli operatori relazionali previsti dal Ruby sono elencati di seguito:

== Uguale
!= Non uguale
. < Minore
<= Minore o uguale
> Maggiore
>= Maggiore o uguale

Allora una tipica espressione logica che presenta un operatore relazionale assumerà la forma seguente:

var1 > var2
var1 < var2

 Se la relazione imposta dall’operatore su var1 e var2 risulta vera, allora il risultato sarà .TRUE. altrimenti sarà .FALSE.

Come riportato nella Tabella precedente l’operatore relazionale in Ruby di uguaglianza è rappresentato dal simbolo == (due segni di uguale); a differenza del simbolo =  (un solo segno di uguale) che invece viene adoperato per l’istruzione di assegnazione. Spesso, infatti, si commette l’errore di utilizzare il simbolo = per indicare l’operatore relazionale di uguaglianza.

LINK DI APPROFONDIMENTO PER L’ARGOMENTO:

Il namespace in Python

python

Con la parola namespace in Python, che tradotto suonerebbe come spazio dei nomi, si intende un dizionario Python che contiene i nomi delle variabili (chiavi) ed i valori di tali variabili (valori) in modo da tenere traccia delle variabili utilizzate in quel particolare contesto.

In generale, uno spazio dei nomi (a volte chiamato anche contesto) è un sistema di denominazione per creare dei nomi univoci onde evitare ambiguità. Tutti noi utilizziamo nella vita quotidiana un sistema del tipo namespace, vale a dire l’identificazione di persone attraverso nome cognome. Un altro esempio è relativo alle reti: ogni dispositivo di rete (workstation, server di stampa, …) ha bisogno di un nome e di un indirizzo univoco. Ancora un altro esempio è la struttura delle directory del file system. Lo stesso nome file può essere utilizzato in diverse directory, i file sono accessibili unicamente attraverso dei percorsi.
Molti linguaggi di programmazione usano spazi dei nomi o contesti per gli identificatori. Un identificatore definito in un namespace è associato a quel namespace. In questo modo, lo stesso identificatore può essere definito indipendentemente in più domini. (Come gli stessi nomi di file in directory nei differenti linguaggi di programmazione), che supportano spazi dei nomi, possono avere regole diverse che determinano a quale spazio dei nomi un identificatore appartiene.

Alcuni spazi dei nomi in Python (namespace in Python) sono:

  • global names
  • local names
  • built-in names

Ed allora ogni blocco di un programma Python, dispone dei suoi namespace, ad esempio una funzione ha il suo namespace, denominato namespace locale, che contiene i riferimenti a tutte le variabili utilizzate dalla funzione, ed i suoi argomenti. Così come un modulo ha il suo namespace, denominato questa volta namespace globale, in quanto contiene i riferimenti alle variabili del modulo, alle funzioni, alle classi, ed infine ai moduli importati. C’è poi il namespace built-in, accessibile da ogni modulo, che contiene le funzioni built-in e le eccezioni.

LINK DI APPROFONDIMENTO PER L’ARGOMENTO:

Guida alla programmazione con R

python

Guida alla programmazione con R rappresenta un manuale di semplice consultazione destinato agli utenti alle prime armi che vogliono affrontare i rudimenti della programmazione utilizzando una piattaforma di programmazione in ambiente R. R si sta sempre più diffondendo nell’ambiente della programmazione in quanto si compone di un linguaggio e di un ambiente di runtime con un’interfaccia grafica, un debugger, l’accesso ad alcune funzioni di sistema, e offre la possibilità di eseguire programmi memorizzati in file di script. Ma R è molto di più, rappresenta infatti un vero linguaggio di programmazione, anzi un linguaggio di programmazione molto avanzato, e ciò permette di adattarlo ad ogni nostra esigenza.

Nella Guida alla programmazione con R sono affrontati tutti gli argomenti necessari per iniziare a programmare in R, in maniera semplice ed immediata partendo da zero. Ricca di esempi ed esercizi la guida ci aiuta nel percorso di apprendimento di un nuovo linguaggio di programmazione senza la necessità di competenze preventive sull’argomento.

Tra gli argomenti trattati nel testo:

-Variabili ed operatori
-Array e matrici
-Liste e dataframe
-Strutture per il controllo del flusso
-Operazioni di ingresso/uscita
-Gestione delle eccezioni
-Visualizzazione dei dati
-Tipi di grafici

L’autore
Ingegnere chimico, svolge la sua attività di tecnico presso la Seconda Università degli Studi di Napoli. Esperto di acustica, vanta una vasta esperienza nella docenza di corsi professionali di informatica e nel campo dell’e-learning; autore e titolare del sito www.ciaburro.it. Ha al suo attivo diverse publicazioni: monografie, riviste scientifiche e convegni tematici.

Elenco degli script R a corredo del testo:

- quadrato : Programma per il calcolo del quadrato di un numero
- calcolo_medie : Programma per il calcolo della media aritmetica e geometrica di due numeri
- radice : Programma per il calcolo della radice quadrata di un numero
- fattoriale : Programma per il calcolo del fattoriale di un numero
- triangolo : Programma per il calcolo dell’ipotenusa del triangolo
- mese : Programma per l’inserimento del numero di un mese da una lista
- solv_eq : Programma per la risoluzione di un’equazione di secondo grado
- uscita : Programma per l’uscita da un ciclo while
- write : Programma per la scrittura di dati in un file
- read : Programma per la scrittura di dati in un file e successiva lettura
- read2 : Programma per la scrittura di dati una riga per volta
- print : Programma per la stampa della lunghezza di ogni linea presente in un file
- aggiungi_testo : Programma per aggiungere del testo ad un file
- aggiungi_testo2 : Programma per aggiungere del testo su più linee

Per scaricare i file cliccare sul link seguente:

Script contenuti nella Guida alla programmazione con R

Link utili:

- Sito ufficiale del progetto R (Download del programma)
- R Studio (Piattaforma Open Source per la programmazione in R)
-The R Journal (Il giornale ufficiale del progetto consultabile gratuitamente)

Le variabili in Python

python

Con il termine variabile ci si riferisce ad un tipo di dato il cui valore è variabile nel corso dell’esecuzione del programma, in questo articolo ci occuperemo delle variabili in Python. È però possibile assegnarne un valore iniziale, si parlerà allora di inizializzazione della variabile. La fase di inizializzazione, assume un importanza fondamentale in quanto rappresenta il momento in cui la variabile viene creata, tale momento coincide con quello in cui ad essa viene associato un dato valore. A differenza dei linguaggi cosiddetti compilativi tale procedura può essere inserita in qualunque punto dello script, anche se i significati possono assumere valori differenti.

Con il termine variabile ci si riferisce ad un tipo di dato il cui valore è variabile nel corso dell’esecuzione del programma. È però possibile assegnarne un valore iniziale, si parlerà allora di inizializzazione della variabile. La fase di inizializzazione, assume un importanza fondamentale in quanto rappresenta il momento in cui la variabile viene creata, tale momento coincide con quello in cui ad essa viene associato un dato valore. A differenza dei linguaggi cosiddetti compilativi tale procedura può essere inserita in qualunque punto dello script, anche se i significati possono assumere valori differenti.

Le variabili in Python possono essere di due tipi di variabili:

  1. variabili globali;
  2. variabili locali;

Come si può intuire, le variabili globali risultano accessibili a livello globale all’interno del programma, le variabili locali invece assumono significato solo ed esclusivamente nel settore di appartenenza, risultando visibili solo all’interno del metodo in cui vengono inizializzate.

Python utilizza due funzioni built-in: locals e globals per specificare i diversi tipi di variabili; tali funzioni forniscono un accesso basato sui dizionari alle variabili locali e globali. 

LINK DI APPROFONDIMENTO PER L’ARGOMENTO:

 

Requisiti hardware di Rstudio

python

L’ambiente integrato Rstudio ci consente di avviare il calcolo al suo interno di modo da risultare completo; per fare questo però non richiede un grande sforzo in termini di potenza di calcolo da parte della macchina in uso. Dopo aver scaricato il software, per installare il programma sul nostro pc dovremo necessariamente conoscere i requisiti hardware di RStudio.

Ne deriva che i requisiti hardware richiesti per far funzionare RStudio sono minimi, quindi il numero di core, la velocità dei core e la quantità di ram di cui avremo bisogno dipenderà esclusivamente dalla mole di lavoro che l’analisi che stiamo eseguendo necessiterà. Ricordiamo a tal proposito che R è a thread singolo, e come tale, non potrà beneficiare di core aggiuntivi a meno che non si abbia familiarità con le varie librerie che ci consentono di parallelizzare il lavoro e sono quindi in grado di sfruttare più core.

Rstudio

Rstudio

Gli utenti alle prime armi nell’analisi dei dati, è improbabile che avvertano l’esigenza di un processore a più core, se non quelli attualmente installati sulle macchine in commercio e più di 1 gb di ram. Tuttavia, se si ha intenzione di analizzare insiemi di dati di grandi dimensioni (> 1gb) allora la macchina in uso avrà bisogno di una maggiore disponibilità di memoria ram. In generale, la maggior parte delle persone non sfruttano la parallelizzazione in R, e così risulta conveniente avere un processore con un minor numero di core che sono più veloci rispetto a quelli a più core.

Per approfondire l’argomento: