Visto nel Web – 76

Oggi, impegni sociali permettendo, installo la nuova versione di Ubuntu, ma prima ecco cosa ho visto nel Web.

BI2mn1iCEAAq9w1

U.S. House of Representatives Shamefully Passes CISPA; Internet Freedom Advocates Prepare for a Battle in the Senate
::: Electronic Frontier Foundation

InvFactor, anche tu genio. Per tutti, sotto i 20 anni
::: Linguaggio Macchina

Saviano incontra Assange “Le nostre vite blindate”
::: la Repubblica

20791_629064573775882_855097641_n

Why Firefox OS may bring balance back to the smartphone industry
::: GigaOM

GNU/Linux e gli ambienti grafici leggeri, bene dell’umanità
::: Gusions

Citizenville. Gavin Newsom. Come decidere per la convivenza
::: Luca De Biase

65725_10151314978847382_1340255612_n

Japanese Police Urge ISPs To Block Tor
::: Slashdot

Google+ rilascia il sistema di commenti per il nostro blog
::: StartByZero

Raspberry Pi – Faire un backup de sa carte SD
::: Nicolargo

521980_629064623775877_1089671252_n

Stampa 3D: Doodle3D è il kit di stampa 3D dei bimbi geek
::: leo Hi tech

Ack 2.0 enhances the “grep for source code”
::: The H

Apple’s iWatch Would Sell Well
::: Slashdot

522480_464697336937334_649462570_n

Go after four months #golang
::: Graham King

Some Windows XP Users Can’t Afford To Upgrade
programmi non compatibili, già sentita parecchie volte
::: Slashdot

Wikipedia Moved To MariaDB 5.5
::: Slashdot

524642_349000868553795_1874714396_n

Tweet From Hacked AP Account Causes High Freq. Traders To Drop DOW 150 Points
::: Slashdot

The BlackBerry Q10 Is A QWERTY Keyboard Smartphone Comeback Worth Waiting For
::: TechCrunch

How To Build a $30M Startup Without Spending Any of Your Money
::: Slashdot

BHOo3BoCMAAgRKa

MariaDB: SkySQL e Monty Program Ab uniscono le forze contro Oracle
::: oneOpenSource

Hackspace security system
::: Raspberry Pi

Why feed reading is an open web problem, and what browsers could do about it
::: Luis Villa

ee5303298a118e70ea92643dad4d5a0f

Master PDF Editor 1.8.20 approda nei repository ufficiali di Ubuntu 12.10 e 13.04
::: lffl

What’s Actually Wrong With DRM In HTML5?
::: Slashdot

Amazon Reportedly Working On Set-Top Box
::: Slashdot

Random-facts-about-life-and-the-universe6

You probably shouldn’t use a spreadsheet for important work
::: Daniel Lemire

10 Things to Do After Installing Ubuntu 13.04
::: OMG! Ubuntu!

What Python developers need to know before migrating to Go(lang)
::: Repustate

SpaceInvaders

Emacs text-editor setup for Python development plus a total beginner’s guide
::: caisah

How to Switch to Vim
::: Naildrivin5

MySQL Founders Reunite To Form SkySQL
::: Slashdot

use-eyes-stretch_1350298i (1)

Book Review: The New Digital Age
Eric Schmidt and Jared Cohen begin their new nonfiction book, The New Digital Age, with a rather bold pronouncement: ‘The Internet is the largest experiment involving anarchy in history.’
::: Slashdot

CenturyLink Providing DoD’s Equivalent of Internet2
::: Slashdot

Open source central to management of Rome’s Sapienza University’ services
::: Joinup

541570_459848484091758_206279057_n

Tree-like output in ls
::: Bash One-Liners

Trip Report: ISO C++ Spring 2013 Meeting
::: isocpp

Come installare Ubuntu o altra distribuzione Linux su pc con Windows 8 preinstallato
::: lffl

8286_481924628528759_1013527986_n

Wolfram Alpha Drills Deep into Facebook Data
::: Slashdot

The Real Story of Samsung v. Google
::: Tech Nerd Corner

Wearable Electronics Market Could Prove a Winner
::: Slashdot ::: Slashdot

Gabriella Brini

Gabriella Brini

Google: Governments More Censorship-Happy Than Ever Before
il web sta diventando importante e la politica se ne sta accorgendo
::: Slashdot

Is It Time For Servers in Space?
::: Slashdot

Non sono gli avvocati a salvare i giornali. Gli editori e Google. Giua, Barron, Ingram… #Ijf13
::: Luca De Biase

il rugby è uno sport violento

“Right click and save as” needs to go away
::: Jonathan Svärdén

Intel pronta a rilasciare netbook con Android X86 preinstallato a meno di 200 dollari
::: lffl

528292_10151554602037180_1856758857_n

OK, chiudo tutto, ci vediamo con la nuova versione, RR, confido in FSM, RAmen ;-)

Comandi sconosciuti

Qualche giorno fa un vecchio collega, anzi un capo, mi telefona per confermarmi un meeting di cui si parlava da tempo. E per invogliarmi, il bieco, di dice “Ah, cercando altro in cantina ho trovato un mucchio di vecchi manuali del Prime“, il mio primo ‘puter :-D
In realtà non erano così vecchi e il pezzo forte non l’ho visto: erano fogli di quelli per i contenitori ad anelli, ancora cellofanati in bundle, si vedeva che erano diversi per via delle copertine in cartoncino. L’ha mandato così intonso a un museo, sigh! Tutto quello che sappiamo era che il primo manuale raccontava di ratfor, e che anche il resto non doveva essere così importante se nessuno si è curato di aprire il malloppo.

Il Prime aveva un sistema operativo suo, Primos, derivato da Multics ma appena prima di chiudere aveva tentato di passare a Unix, senza successo. Sigh.

Il linguaggio ratfor è una cosa strana, non credo sia mai stato utilizzato da nessuno. Si trattava di scrivere con una sintassi quasi simile al C e ratfor convertiva il codice in Fortran. E c’era, sul Prime, prima del passaggio a Unix, mi ricordo di aver letto qualcosa e di averlo giudicato tra le cose inutili.

ratfor - rational FORTRAN dialect.
C’è naturalmente anche con Linux, no, non lo installo.

ratfor

Invece l’altro giorno, in attesa che la riunione iniziasse io e l’ex-capo abbiamo passato in rassegna il SysV Command Reference. Anche lì cose mai viste, attivo la modalità nostalgia e ne racconto un po’.

cxref - generate C program cross-reference.
Provato a installarlo, pasticciato un pochino ma non sono riuscito a farlo funzionare.

dc - desk calculator.
Questo lo conosco, ci ho dedicato un post in passato: dc = desk calculator, antenato di bc, calc e altri ancora.
Ci sono alternative molto più user friendly ma –siamo in nostalgia mode ricordate– ecco un esempio:

dc

expr - evaluate arguments as an expression.
Sì, mah, forse…

expr

hostname - set or print name of current host system.
Questo lo sapevo, come pure basename e dirname.

hostname

spline - interpolate smooth curve.
Installato, installando plotutils. Non facilissimo da usare, anzi sono ricorso a The spline Program per capirci qualcosa. Chissà perché non lo usavamo allora? A parte che avevamo tutta una serie di programmi fatti da noi, uno per ogni caso. Oggi poi c’è Gnuplot.

splinegsp0gsp1

units - conversion program.
Installato, OK, anche se oggi c’è il Web e Google e Wikipedia e Wolfram|Alpha.
In ogni caso si può usare così:

units-0

o così:

units-1

OK, nostalgia --off --back-to-the-present :-)

Ruby – iniziamo con gli script

r3Finora abbiamo usato Ruby nella versione interattiva:

s0
anzi, per non avere roba inutile nella versione:

s1
e per non dover scrivere ogni volta irb --simple-prompt abbiamo visto come fare per creare un comando personalizzato:

s2
procedura che dipende dal sistema operativo, come spiegato nelle prime lezioni, andate a quei post se necessario.

Ma oggi si cambia tutto, iniziamo con gli script, i programmi, come fanno i veri programmatoriTM.

Apriamo un documento di testo che salveremo con il nome hw.rb (con Blocco note, Notepad2 o qualcosa di simile con Windows, con Gedit, Nano, Geany su Linux) e scriviamoci dentro le nostre istruzioni, così

puts "Hello World!"

Potremo eseguire lo script nel terminale in questo modo:

hw

Questo è un passo obbligatorio quando si inizia a raccontare di un nuovo linguaggio. Fin dai tempi di K&R (Kernighan e Ritchie, tanto tempo fa quando ero ggiovane).

Vediamo qualcosa di più articolato:

# qualche calcolo semplice
# per impratichirci

val1 = 17
val2 = 5
somma = val1 + val2
print val1, ' + ', val2, ' = ', somma
puts ''

prodotto = val1 * val2
print val1, ' * ', val2, ' = '
puts prodotto

quoz = val1 / val2
resto = val1 % val2

print val1, ' / ', val2, ' = ', quoz, ' con resto ', resto, "\n"

sc0

OK?

Ci sono parecchie cose nuove, vediamone qualcuna.
Il carattere # e tutto quello che segue fino alla fine della riga indica un commento e viene ignorato da Ruby. Ma serve a noi, non immaginate quanto! Ogni script potrà o dovrà essere modificato in futuro, urgentemente, vi sarete certo dimenticati di com’è fatto e se è più lungo di poche righe sarà tedioso doverlo rileggere tutto.
Avremmo potuto inserire commenti come # definizione dei dati, # calcolo della somma, etc..
È possibile inserire righe vuote, vengono ignorate dall’interprete ma servono a noi.

Sempre in previsione di quando dovremo aggiornare lo script usiamo dei nomi significativi per le variabili, come somma, prodotto, quoz (sarebbe quoziente ma non sono stato abbastanza paziente) e resto.

Di puts e print ne abbiamo parlato nei post precedenti, entrambi scrivono sul terminale. La differenza è che puts va a capo dopo ogni dato che scrive, print no.
Per cui si può far scrivere tutto a print e mettere un puts vuoto, come nelle righe 7 e 8 oppure dare tutto in pasto a print tranne l’ultimo dato, come nelle righe 11 e 12.
Se poi uno vuole fa come in riga 17, se si ricorda delle differenze tra apici e virgolette e delle sequenze di escape.

Adesso una cosa che vale solo per Linux, chi usa Windows chiuda gli occhi per le prossime righe.
Scrivere ogni volta ruby nome.rb è faticoso! Ma c’è un rimedio, questo:

#!/usr/bin/ruby
print "Hello World!\n"

La prima riga sembra un commento (e lo è) ma in realtà è anche la shebang che ci consente di rendere eseguibile lo script così:

sb

Il comando chmod dobbiamo darlo solo una volta, possiamo anche verificare se l’abbiamo già dato:

ls

Notare la x (sta per execute) presente nei permessi, solo per sb.rb.

OK, fine particolarità solo per Linux.

Un’ultima cosa importante, guardate questo script:

prima = "Hello "
seconda = "world!"

print prima seconda
puts

err

OPS! errore alla riga 4, correggere così

prima = "Hello "
seconda = "world!"

print prima, seconda
puts

err-c

Queste cose a me capitano spesso. tanto spesso che penso che il ‘puter ce l’abbia con me ;-)

Eple per chi vuole cominciare da piccolo

It stands for “apple” in norwegian and it is an acronym for
EPLE Programming Learning Environment

unica

Quando io dovevo iscrivermi al secondo anno del Poli (in realtà era già tardi ma prima non lo sapevo ancora, e poi tutti i miei amici di Poli…) ho dichiarato che volevo andare su ingegneria informatica.
“Cos’è quella roba lì?” chiese mio padre.
“Quella che si occupa dei calcolatori” risposi, me l’ero preparata. In realtà dissi “cervelli elettronici” perché allora si chiamavano così.
Sapevo che mio padre sarebbe stato molto contrario e mi stupì che non dicesse niente. Ma, forse, era solo stato preceduto dalla mamma che mi convinse con “è una moda passeggera, tempo un paio d’anni e non ne sentiremo più parlare”.
Continuai con ingegneria civile, credo che oggi si chiami edile. Ma ho sempre trafficato con i ‘puter. Di diversi tipi e dimensioni, sempre più piccole, fino a quando non c’è più stato spazio per la tastiera.

E, naturalmente, per me calcolatore = cosa che serve a fare calcoli, quelli che farli a mano sarebbe troppo lungo. Anche se devi saperli fare, per controllare le istruzioni che gli dai, lo chiamano debug.
Quando ho cominciato a lavorare io c’erano ormai i TTY, sì a volte ancora le schede ma era roba del passato. Un’altra cosa che sarebbe dovuta essere del passato e invece no erano le due generazioni precedenti di operatori: quella che lavorava in assembler (si dovrebbe dire assembly, lo so e lo so che lo sapete) e quella che lavorava in FORTRAN IV, proprio come se fosse assembler (assembly). E siccome erano i capi comandavano loro.

Poi a un certo punto sono usciti i personal, cosine costose e inguardabili se viste adesso. Ma con loro è nata una generazione di giovani (non si chiamavano digitali ma lo erano) che dopo un po’ smettevano di giocare e facevano cose in Basic. Programmi orrendi per come erano scritti, tipo tante istruzioni sulla stessa riga separate da due-punti fino a quando la riga stessa diventava troppo lunga. C’era chi iniziava il FOR con dichiarazione del ciclo, poi ci metteva tutto il corpo e il NEXT finiva da solo su una nuova riga. Ma il mondo sarebbe stato loro.
Poi anche il Basic è passato di moda: oggi con il SO (operating system) non te lo danno, e è anche difficile trovarlo. E allora se una ragazza o un ragazzo come si deve vuole imparare fin da subito?
C’è qualcosa in giro, da parecchio tempo. E ultimamente c’è una novità: la tesi di Pier Giuliano Nioi, piergiu.

eple

È quasi un peccato che io sappia già trafficare con il ‘puter (anche se in realtà non mi capisce quasi mai) perché il piergiu (io lo pronuncio con l’accento sulla u) ha sviluppato un’app decisamente bella. Ho tentato per qualche giorno di farne un riassunto, una recensione ma vi conviene vederla da lui. Trovate il PDF che vi dice tutto e l’applicazione completa qui: An Interactive Environment for the Didactical Manipulation of Programs.

Ditegli che vi mando io (“Juhan send me“) se volete, ma anche no.

education

Adesso non so a se piergiu piaccia questo post messo così ma dovevo farlo, guarda oggi che cinguettio ho visto: Localized (Visual) Programming Language For Kids?

Quando si dice la combinazione ;-) :-D

Visto nel Web – 75

Grande confusione sotto il cielo (cit.).
Ma c’è anche del buono (giù in fondo), per intanto ecco cosa ho visto nel Web.

clark kent

Facebook Home: come installarlo su qualunque smartphone
per chi non ne può fare a meno
::: leo Hi tech

Apple Near Deal For Radio Service
::: Slashdot

The Hacker Lifecycle
::: Slashdot

644655_530251003685454_477113098_n

Impossible! This is a Mac
::: 9GAG

KDE passa a Git (definitivamente)
::: Bl@ster’s

15 Must-Have High Quality Free Flat Icon Sets
::: Desizn Tech

BG1RKk7CIAAEVp8

Kindle is not good for textbooks
io lo dico da sempre :-D
::: Inside 233

La Biblioteca Civica di Fermo passa ad Ubuntu Linux
dovrebbe essere una cosa tanto normale da non fare notizia, invece…
::: lffl

Google Glass, caratteristiche ufficiali comunicate direttamente da Google
::: Tutto Android

hovard_berman_09

More Python 3.3 downloads than Python 2.7 for past 3 months
::: Entrepreneurial Geekiness

pipe Unix-like pipelines for Go
::: Labix

Veusz – A Scientific Plotting Package
pronuncia views, ne riparlerò
::: Veusz

524564_509676945760723_451455802_n

Ad Apple il brevetto per cartelle e organizzazione delle icone
::: telefonino.net ::: Muktware

ZDNet Proclaims “Windows: It’s Over”
o no?
::: Slashdot ::: Slashdot

Sony Launches Internet Service Offering Twice the Speed of Google Fiber
::: Slashdot

229547_10151275582776667_1565491111_n

How to Make Your Android Phone Look Like Ubuntu Phone
::: TechSource

Did Tech Websites Exploit the Boston Marathon Bombing?
::: Slashdot

Perché Bitcoin è pronto a cambiare la società più di quanto abbia fatto Internet
::: Extropolitica ::: Slashdot

20130410

Over 80 European organisations demand protection for Net neutrality
::: EDRI

Super batteria per smartphone, si ricarica in pochi secondi
sarà vero?
::: tom’s ::: Slashdot

Open source is taking over the software world, survey says
::: PCWorld

BHj0OAYCEAIAi8O

Why It’s So Hard To Make a Phone Call In Emergency Situations
::: Slashdot

Motorola developing Android phones with stock software, ‘just right’ size
::: The Verge

Cinnarch abbandona Cinnamon e sceglie GNOME 3.8
::: oneOpenSource

AngryKim

Da Twitter #linux in biblioteca, il servizio di #Fermo TV
::: YouTube

If It Ain’t Broke, Don’t Fix It: Ancient Computers in Use Today
OK, non così vecchio ma un Sun di mia conoscenza è stato pensionato solo recentemente, ancora funzionante, quasi; perè questi sono pazzi
::: PCWorld

Twitter, il tam tam che insidia la politica
autocelebrativo del giornale ma è OK, imho: Twitter rulez!
::: LASTAMPA

59689_290036657795638_745329590_n

Yahoo Is Going To Stop Email Service In China
::: Slashdot

IBM In Talks To Sell x86 Server Business To Lenovo
::: Slashdot

Best Screen Capture Tools for Ubuntu
::: TechSource

587FEC4A-7DA2-4C3A-B605-48766BA52880

First edition Unix: Its creation and restoration
::: epublications

LLVM Clang Compiler Now C++11 Feature Complete
::: Slashdot

Steve Jobs vs. Dennis Ritchie
::: Google+

logo-m

Ah! quasi dimenticavo: questo l’avete già saputo? Prossimamente…

programmer-an-organism-1

Pronti per Lubit?

logo-m

Allora ne so ancora poco perché il team (wonderful team!) non ha ancora postato molto, solo immagini, principalmente su Twitter, di lavoro durante lo sviluppo, eccone qualcuna:

lo

menu

doc

pics

Da oggi c’è il sito ufficiale, Lubit Linux @ http://lubit.org/ (che per adesso è vuoto ma prossimamente…

Intanto il mio in bocca al pinguino (lo so che non è granché, non me n’è venuto niente di meglio), presto una recensione come si deve.

E se posso dare un consiglio alla squadra lo faccio citando le parole del mio amico Albert: everything should be made as simple as possible, but not simpler.

Interprete Lisp in Python

Un post un po’ particolare, insolito. Ma ultimamente sono attivi due autori über-bravi, Robitex e Dikiyvolk e allora vado con questa cosa difficile da definire.lambdaRecentemente sono finito invischiato in una cosa che non so bene come raccontare. E che continuava a venirmi in mente anche quando pensavo a altro, insomma ne sono stato completamente invischiato. E vorrei coinvolgere anche voi. Comincio con il presentare l’autore: Michael Nielsen un australiano che sta negli USA e si definisce a writer, scientist, and programmer.

Allora c’è questo post Lisp as the Maxwell’s equations of software (code repository) che parte con un paio di reminescenze personali per finire in un progetto inutile in ultima analisi ma fantastico: costruire un interprete Lisp minimale, funzionante e completo e farlo in Python.

C’è riuscito e molto bene. Per onestà occorre dire che si è basato su una cosa simile di Peter Norvig di cui ho già accennato in passato ma conto di tornarci (dipende ovviamente dalle reazioni a questo post) e c’è riuscito benissimo.setIntanto parte con un minicorso del suo interprete Tiddlylisp (tiddlywinks è un vecchio gioco, ormai in disuso, conosciuto da noi come pulci). Tiddlylisp è piccolo ma completo. Certo mancano delle cose che in un interprete serio professionale si danno per scontate; un’istruzione dev’essere contenuta in una riga, per esempio e mancano costrutti usuali. Ma funziona e il corso di Michael è preciso e esauriente. Chi non conosce il Lisp può farsi un’idea precisa, tanto poi se passa a una versione vera scopre che ci sono i dialetti e ogni implementazione è una cosa a se e che ogni utente personalizza la sua copia fino a diventare incompatibile con il resto del mondo.

Se invece di usare interattivamente l’interprete gli si da un file di codice da eseguire la limitazione dell’istruzione monoriga cade e abbiamo (come Michael ci dimostra) la possibilità di risolvere compiti più complessi.pythonQuesta è la prima parte del post (sì è lungo, molto più lungo di quello che si trova di solito nei blog). Ma adesso viene il bello, cioè no, si continua ma adesso con Python. E c’è il codice e la descrizione che è non banale ma, in fondo, molto più semplice di quello che mi sarei immaginato.

Per finire si parla di costruire un interprete Lisp in (esatto) Lisp. E i commenti dei lettori ampliano ancora il discorso. Tutti più bravi di me, ovviamente.

Ecco, che ne pensate? Forse sono solo io a stupirmi di questo modo di intendere la programmazione, o è il mantra “Lisp is a programmable programming language“.

Poi, certo, si usano altre cose, C++, Java, Python, …
Io per diversi anni avevo solo il Fortran. Poi le cose sono peggiorate: è arrivato il Basic (non c’è mai limite al peggio).

Ancora una nota: lo cita anche Michael ma è troppo bello devo farlo anch’io: The Roots of Lisp di Paul Graham.

Sei un programmatore Ruby principiante se…

Rieccomi!!! Butto giusto uno spunto di riflessione sui post di Juhan riguardo Ruby. Un po’ di tempo fa su linkedin mi arrivò questo argomento di discussione:

“Sei un programmatore Ruby principiante se pensi che la seguente espressione:

ruby -e 'a=(true and false) or (true and true); puts a'

restituisca true.”

Leggendola così su due piedi… ho pensato perché non dovrebbe restituire true… la risposta è semplice, in ruby esistono degli operatori “ripetuti” (chiamiamoli così, gli esperti non mi insultino) che hanno lo stesso funzionamento, ma differente priorità. Per cui abbiamo che “or” può essere scritto come “or” o come “||” e l’”and” come “and” o come “&&”. Solo che gli opertori “and” e “or” hanno minore priorità dell’operatore “=” per cui nel nostro esempio avremo che l’assegnazione alla variabile “a” avverrà prima che venga eseguito l’or. A varrà quindi il risultato di (true and false).

Questa è una tabella che ho copiato da “Programming Ruby 1.9 & 2.0″ di “The Pragmatic Bookshelf” con l’elenco degli operatori e della loro priorità:

Elenco degli operatori Ruby con le loro priorità

Elenco degli operatori Ruby con le loro priorità

Se si fosse scritto:

ruby -e 'a=(true && false) || (true && true); puts a'

o

ruby -e 'a=(true and false) || (true and true); puts a'

Avremmo ottenuto “true” come da copione :) o da abitudinario come me :)

Ho faticato un po’ a capire il perché degli operatori “duplicati”, ovviamente la mia prima risposta è stata:

“Ruby è sviluppato da un giapponese e i giapponesi ogni tanto fanno delle scelte che a noi non giapponesi sembrano strane” :) se non mi credete fatevi un giro per Tokyo (ci sono stato 2 volte) e vi ricrederete… :D
La risposta invece logica è che gli operatori “&&” e “||” si usano per operazioni booleane (i nostri amici if e famiglia), mentre “and” e “or” si usano per il controllo del flusso (come in perl).
Per dettagli e approfondimenti qui è spiegato tutto benissimo.

Post brevissimo… diciamo un aperitivo per i prossimi post di Juhan :)

La varietà di variabili in Go

Scarica l’articolo per la stampa nel formato pdf: golang_tipi_variabili1.pdf

Sommario

Faremo un excursus sul significato delle variabili chiarendone il loro funzionamento nei moderni linguaggi di programmazione, in particolare con riferimento al Go. Ci soffermeremo sul concetto di variabile valore e su quello di variabile riferimento.
Per la comprensione e l’esecuzione degli esperimenti proposti, è necessario solo un po’ di concentrazione e la lettura dei post sul linguaggio Go apparsi su questo stesso blog.

Variabili

Tutti o quasi tutti i linguaggi di programmazione comprendono tra i concetti di base quello di variabile. Il nome stesso ci dice che è un qualcosa che può cambiare durante l’esecuzione del programma e quel qualcosa è il dato che la variabile rappresenta.

Per fare un esempio di codice in un linguaggio generico, possiamo in modo molto naturale assegnare il valore numerico 10 alla variabile v e sottrarre poi 5:

-- in un linguaggio generico...
v = 10
print( v )  --> stampa 10

v = v - 5
print( v )  --> stampa 5

Se provo a creare una seconda variabile q con il valore della prima mi aspetto che riceva il valore che v conteneva al momento dell’assegnazione. Ma se poi la prima variabile cambia che ne è della seconda?
Il codice seguente chiarisce il dubbio sul comportamento delle variabili:

-- sempre scrivendo il codice
-- in un linguaggio generico
v = 10
q = v

print(q) --> stampa 10

-- poi v cambia...
v = v - 5
print(q) --> stampa 10 o 5?

Ci si può attendere due soli risultati:

  1. la seconda variabile non cambia mantenendo il valore 10;
  2. la seconda variabile cambia cambiando a sua volta in 5 come la prima.

Dal C, al C++, a Java

Siamo partiti da un concetto piuttosto semplice: dare un nome al contenitore di un dato che può cambiare durante l’esecuzione del programma — ovvero a “run-time” — ma ben presto ci siamo resi conto che è necessario scegliere come effettivamente rappresentare le informazioni, e queste scelte influenzeranno nel bene e nel male le applicazioni.

Ogni linguaggio dunque affronta problemi di progettazione complessi, con esigenze spesso opposte, come ben testimonia la loro evoluzione storica, per esempio dal C, al C++, a Java. Ad ogni generazione l’ingegneria del software mette a frutto anni di lavoro e l’esperienza di milioni di righe di codice in un nuovo linguaggio.

Tipi di variabili

Eravamo rimasti al dubbio se nel nostro ipotetico linguaggio sia opportuno o meno agganciare il valore della seconda variabile a quello della variabile da cui era stata costruita. Verifichiamo subito qual è stata la scelta dei progettisti del Go :-)

Per una variabile di tipo intero la verifica è:

package main

import "fmt"

func main() {
    v := 10
    q := v
    // modo compatto di scrivere v = v - 5
    v -= 5

    // stampa 10 o stampa 5?
    fmt.Println(q)
}

invece per una variabile di tipo []int, ovvero uno slice la verifica è:

package main

import "fmt"

func main() {
    // uno slice:
    v := []int{10}
    q := v
    v[0] -= 5
    // stampa [10] o stampa [5]?
    fmt.Println(q)
}

Otteniamo tutti e due i comportamenti! Verificate per esercizio a quale dei due esempi corrispondono i casi (non vi farà male e vi ruberà solo un minuto se utilizzate Go Playground).

Variabili valore

Se la variabile è intesa come il contenitore stessso in cui si trova il dato, creandone una per mezzo di un’assegnazione di un’altra variabile verrà creato semplicemente un nuovo contenitore con il dato in quel momento contenuto in quest’ultima.
Stiamo parlando delle variabili valore che forniscono l’accesso diretto al dato.

Quello che abbiamo definito contenitore è in sostanza il segmento di memoria che contiene la rappresentazione binaria del dato. Nella figura di seguito è rappresenta la dinamica della creazione e della modifica delle variabili valore v e q del codice di esempio.

Schema di funzionamento delle variabili valore

Schema di funzionamento delle variabili valore

…e le strutture?

Questo ve lo posso dire: le strutture in Go sono memorizzate in variabili valore, lascio a voi scrivere per utile esercizio il breve codice che lo verifica…

Variabili riferimento

Se la variabile è intesa come il nome del contenitore in cui si trova il dato, allora creandone una per mezzo di un’assegnazione da un’altra variabile, verrà copiato il nome del contenitore nella nuova. Si tratta delle variabili riferimento che forniscono un accesso indiretto al dato tramite informazioni riguardanti il contenitore.

Anche le variabili riferimento sono di tipo valore nel senso che dopotutto contengono direttamente le informazioni solo che non rappresentano il dato ma solo quello che serve al compilatore per raggiungerlo.

Ecco una rappresentazione schematica dello stesso codice precedente che coinvolge le variabili v e q ma stavolta di classe reference.

Schema di funzionamento delle variabili riferimento

Schema di funzionamento delle variabili riferimento

Il terzo tipo: i puntatori

Non dovrebbe esistere un terzo tipo di variabili perché all’inizio del post abbiamo riscontrato che ci possono essere solo due situazioni che poi abbiamo associato alle variabili valore ed alle variabili riferimento.

In Go sono disponibili, come in C ed in C++, i puntatori ed in effetti non costituiscono un terzo tipo di variabile perché (almeno in Go) sono contenuti in normali variabili valore. Per convincerci eseguiamo il solito programma di prova:

package main

import "fmt"

func main() {
    n, m := 10, 5 // tipi int

    p1 := &n // tipo *int
    p2 := p1

    p1 = &m
    fmt.Println(*p1) // stampa 5
    fmt.Println(*p2) // stampa 10
}

I puntatori quindi sono variabili valore che contengono l’indirizzo grezzo di memoria dove si trova un dato. Dal punto di vista del linguaggio possiamo considerare i puntatori come delle variabili riferimento primitive. Con i puntatori infatti, gestiamo esplicitamente indirizzi di memoria ottenendoli con l’operatore & come abbiamo appena visto nel listato precedente, ed indichiamo esplicitamente il valore puntato deferenziando il puntatore con l’operatore *.

Se affermiamo questo, possiamo anche dire in modo speculare che le variabili riferimento sono un tipo evoluto di puntatore perché nel codice le scriviamo come normali variabili. È il compilatore che svolge il lavoro “primitivo” per noi elaborando nel modo opportuno le informazioni effettive celate nella variabile riferimento.

Possiamo a questo punto rispondere a queste domande:

  1. due variabili riferimento di uno stesso oggetto avranno lo stesso indirizzo di memoria?
  2. sapendo che in Go alle funzioni vengono passate le copie degli argomenti, cosa accade se modifichiamo una variabile riferimento all’interno di una funzione?
  3. in Go, conviene passare ad una funzione un puntatore a slice o lo slice stesso?

Risposta uno

Due variabili riferimento di uno stesso oggetto avranno lo stesso indirizzo di memoria?

Se una variabile riferimento è veramente una variabile valore che contiene un riferimento ad un dato in memoria, ne segue che avrà un proprio indirizzo di memoria diverso da quello di qualsiasi altra variabile dello stesso tipo anche se si riferisce allo stesso oggetto.
Verifichiamo per prima cosa se possiamo conoscere facilmente l’indirizzo di memoria di una variabile valore e di una variabile riferimento con questo minicodice:

package main

import "fmt"

func main(){
    val := 10
    // stampa --> 'val' address: 0x10d50038
    fmt.Println("'val' address:", &val)

    ref := []int{1, 2, 3}
    // stampa --> 'ref' address: &[1 2 3]
    fmt.Println("'ref' address:", &ref)
}

L’operatore & restituisce il puntatore con l’indirizzo di memoria di una variabile qualsiasi, ma la funzione fmt.Println() esegue giustamente una stampa ad alto livello del puntatore alla variabile riferimento rispettandone la natura.
Anziché far decidere alla funzione tuttofare fmt.Println() il formato di stampa possiamo farlo esplicitamente usando il segnaposto %p (consulta la documentazione del pacchetto fmt):

package main

import "fmt"

func main() {
    // una slice, due variabili reference
    s1 := []int{1, 2, 3, 4 ,5}
    s2 := s1

    fmt.Printf("address di s1: %p\n", &s1)
    fmt.Printf("address di s2: %p\n", &s2)
    // stampano -->
    // address di s1: 0x10d6f100
    // address di s2: 0x10d6f0f0

    // verifichiamo che le due variabili
    // si riferiscono allo stesso slice
    s1[0]++
    s1[1]++
    s1[2]--
    s2[2]--
    s2[3]++
    s2[4]++
    fmt.Println(s1,s2)
    // stampa --> [2 3 1 5 6] [2 3 1 5 6]
}

La risposta iniziale è corretta: due variabili riferimento non sono puntatori non contenendo un riferimento diretto alla memoria ma contengono dati nascosti al programmatore ciascuna in un’area di memoria propria.

Risposta due

Sapendo che in Go alle funzioni vengono passate le copie degli argomenti, cosa accade se modifichiamo una variabile riferimento all’interno di una funzione?

Dunque, se l’argomento viene copiato all’interno della funzione la variabile riferimento sarà si una copia dell’originale, e conterrà quindi le stesse informazioni nascoste per l’accesso ai dati, ma un istruzione di modifica all’interno della funzione modificherà l’oggetto, l’unico oggetto, a cui sia l’argomento passato che l’argomento di funzione si riferiscono.

Utilizzando il tipo map[string]int lascio al lettore la scrittura del minicodice di verifica…

Risposta tre

In Go, conviene passare ad una funzione un puntatore a slice o lo slice stesso?

La variabile che contiene uno slice è reference, quindi passare un puntatore a slice è solo più complicato: non ci si guadagna nemmeno con la dimensione in memoria degli argomenti.

Una domanda per il lettore curioso

In Go le funzioni sono tipi di prima classe (come in Lua, copioni!). Questo significa che possiamo passare una funzione come argomento di un’altra e creare funzioni anonime.
La domanda è questa:

Le variabili che contengono una funzione in Go sono di tipo valore o di tipo riferimento?

Conclusione

Abbiamo studiato insieme le due classi di variabili in linguaggio Go, variabili valore e variabili riferimento, lasciando al lettore un po’ di utile lavoro da fare su alcuni esercizi.

Come regola generale i moderni linguaggi di programmazione fanno si che ai tipi di dato semplici come i numeri ed i booleani sia associato il tipo di variabile valore, mentre ai dati complessi come gli oggetti sia associato il tipo di variabile riferimento.

Un saluto.
R.

Ruby, le stringhe II

r4

Continua l’esame del trattamento delle stringhe con Ruby, iniziato qui.
Oggi si parla di sequenze di escape: vediamo un primo caso, semplice:

e0Le sequenze \n e \r sono sequenze di escape; la prima corrisponde all’a-capo Unix/Linux e funziona come ci si aspetta, la seconda al ritorno carrello, vale a dire “Hello” viene scritto, il cursore ritorna all’inizio della riga e sovrascrive “Word!” coprendo la scritta precedente. C’è da dire che per rendere la vita più interessante su Mac l’a-capo è \r e su Windows la coppia \r\n. Fino a un po’ di tempo fa l’editor testuale di Windows Blocco note o Notepad non interpretava correttamente \n; mi dicono che le cose sono cambiate anche se io continuo a consigliare sostituti freeware come Notepad2.

Ci sono poi altre sequenze di escape, ecco il tab:

e1

E se uno vuole mettere il carattere \ come deve fare?

e2

Chiaro no? backslash escappa (i fighi dicono quota) il carattere che segue immediatamente, se questo è speciale. Fare attenzione che i normali possono diventare speciali, cioè sequenze di escape.

e3

Domanda difficile: perché non ho usato \ per ogni carattere?

e4

Ci ricordiamo, vero, la differenza tra le stringhe delimitate da " rispetto quelle con ', come da esempio. E si può fare anche così:

e5

OK?
C’è ancora una cosa da dire sulle stringhe, caratteristico di Ruby (ma c’è qualcosa di simile nel mio linguaggio di scripting preferito, quello che mi fa perdere punti ogni volta che lo nomino): le quotature alternative (alternate quotes).

e6

Come si vede possiamo usare %q + un carattere a scelta al posto dell’apice e terminare la stringa con il carattere che abbiamo usato dopo q. E per le parentesi usiamo la coppia aperta all’inizio e chiusa alla fine.

Se %q + carattere sostituisce l’apice come faremo per le virgolette?

e7

Ci ricordiamo inoltre che possiamo mettere il valore di una variabile in una stringa quotata con le virgolette, cosa che abbiamo già visto ma forse serve un ripasso veloce:

e8

OK? E adesso basta con le stringhe! :-D

Iscriviti

Ricevi al tuo indirizzo email tutti i nuovi post del sito.

Unisciti agli altri 37 follower