scanf e getchar: problema di input di dati per mescolanza di metodi diversi

Anche se si tratta di un problema abbastanza banale, ho notato che spesso si incespica in errori dovuti alla differente natura delle istruzioni di input del C, scanf e getchar, quando queste sono accodate l’una dopo l’altra per prelevare determinati valori inseriti dall’utente. Il problema è dato dal fatto che dopo una scanf rimane nel buffer della tastiera il  carattere di new line (nuova linea), ovvero, più semplicemente, la pressione del tasto “invio” stesso. Tale invio forza in automatico una “digitazione fantasma” nella eventuale successiva istruzione getchar.

Il piccolo programmino di seguito dovrebbe chiarire il problema e presentare la possibile soluzione:

#include <stdio.h>

#include <stdlib.h>

int main(int argc, char argv[])

{

printf(“INPUT DA ESAURIMENTO\n”);

char ch1, ch2;

printf(“Inserisci il primo carattere: “);

scanf(“%c”, &ch1);

printf(“Inserisci il secondo carattere: “);

ch2 = getchar();

printf(“ch1=%c, Valore ASCII = %d\n”, ch1, ch1);

printf(“ch2=%c, Valore ASCII = %d\n”, ch2, ch2);

 

printf(“RIPROVA, SARAI PIU’ FORTUNATO ;)\n”);

printf(“Inserisci il primo carattere: “);

scanf(“%c”, &ch1);

fflush(stdin);

printf(“Inserisci il secondo carattere: “);

ch2 = getchar();

 

printf(“ch1=%c, Valore ASCII = %d\n”, ch1, ch1);

printf(“ch2=%c, Valore ASCII = %d\n”, ch2, ch2);

 

system(“PAUSE”);

return 0;

}

 

Come si può vedere, il codice prima simula la situazione di errore e poi ci mette una pezza. Ci sono due modi principali per farlo.

Il primo è di usare la funzione

fflush(stdin);

che provvede a svuotare il buffer in questione, subito dopo la scanf e prima della getchar. Il problema che potremmo avere con tale funzione è che essa non è propriamente standard.

L’alternativa è di usare, al suo posto,  la riga di codice:

while ( getchar() != ‘\n’ );

che cicla fino a beccare, e mandare ramengo 😉 il newline.

Per rendere ancora più interessante l’esempio stampiamo anche il codice ASCII dei caratteri inseriti. Nella prima parte dell’esecuzione si può allora toccare con mano la problematica appena illustrata osservando che il carattere ch2 ha come codice ASCII il valore 10 che corrisponde proprio al LF (Line Feed – https://it.wikipedia.org/wiki/Ritorno_a_capo) .

Carlo A. Mazzone

 

Supportaci condividendo sui social il nostro articolo!
  • 3
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
    3
    Shares

Editor di testi per programmatori

Dovrebbe essere notorio che per sviluppare codice non è possibile usare editor “evoluti” come Microsoft Word oppure il Writer presente il LibreOffice e OpenOffice in quanto questi salvano i file NON in formato testo semplice ma aggiungono ai contenuti tutta una serie di codici proprietari che altererebbero il sorgente della nostra software. Abbiamo quindi bisogno di editor di testo puro.

Seppure, il Blocco Note possa risultare utile in un primissimo momento di avvicinamento allo specifico linguaggio, immediatamente dopo (e sto parlando di qualche minuto se non di pochi secondi ;), è il caso di munirsi di strumenti più efficienti. L’elenco di editor di testo all’interno del quale scegliere il proprio applicativo preferito è davvero vasto. Si tratta di ottimi software, spesso gratuiti, che consentono di scrivere, ad esempio  i tag HTML, con semplificazioni tipo la colorazione del codice, la possibilità di gestire più file aperti contemporaneamente e diversi altri strumenti. Di seguito suggerisco alcune possibilità.

Notepad++

Notepad++, scaricabile all’indirizzo http://notepad-plus-plus.org/, è un editor di testo gratuito che supporta diversi linguaggi. Come altri software del genere, esso è basato su un componente base noto come Scintilla, http://www.scintilla.org/, ed è realizzato usando il  linguaggio di programmazione C++ per l’ambiente Microsoft Windows.

Il codice HTML all’interno di NotePad++

 

 

PSPad

PSPad è un altro editor per Microsoft Windows che risulta utile in diverse circostanze in quanto, oltre alle classiche funzionalità, come la colorazione del codice o la possibilità di apertura contemporanea di diversi documenti, dispone di diversi strumenti aggiuntivi. Ad esempio, possiede un client FTP integrato che consente l’apertura e la modifica di file in remoto. Inoltre, esso incorpora un registratore di macro per registrare, memorizzare e riprodurre sequenze di operazioni ripetitive. Ancora, dispone di strumenti di selezione dei colori con la traduzione dei loro codici nelle differenti notazioni.

L'editor PSPad
L’editor PSPad

 

Atom

Un altro editor di sicuro interesse è Atom, il cui sito di riferimento è all’indirizzo atom.io. Atom è open source, multipiattaforma e quindi disponibile per OS X, Windows e Linux.  Gli autori di Atom tengono a sottolineare il fatto che il software in questione sia altamente personalizzabile adattando il cosiddetto “look and feel”  dell’interfaccia grafica ai propri specifici gusti.

 

L'editor Atom
L’editor Atom

 

Brackets

Brackets è un’altra alternativa di sicuro interesse. Si tratta di un edito di testi open source che strizza l’occhio agli sviluppatori web. Il sito di riferimento è brackets.io.

L'editor Brackets
L’editor Brackets

 

Microsoft Visual Studio Code

Visual Studio Code è un editor di codice sorgente che, in qualche modo in maniera sorprendente per essere un prodotto Microsoft, è disponibile, oltre che ovviamente per Windows, anche per Mac e Linux. Il sito di riferimento è code.visualstudio.com. Esso supporta in maniera nativa i linguaggi JavaScript e TypeScript ma gestisce una serie di estensioni per altri linguaggi come, ad esempio, C++, C#, Python e PHP. Inoltre, Visual Studio Code supporta lo sviluppo con diversi runtime tra i quali  Node.js e Unity.

Microsoft Visual Studio Code
Microsoft Visual Studio Code

 

Supportaci condividendo sui social il nostro articolo!
  • 12
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
    12
    Shares

Database e modellazione dei dati: una introduzione teorica

Nel contesto informatico un archivio di dati, inteso come collezione omogenea di elementi atti a contenere informazione, è noto con il termine database, letteralmente base di dati.

Database

Un classico e semplice esempio può essere rappresentato da un’agenda telefonica nella quale disponiamo di una serie di righe in cui inseriamo in una posizione un nominativo e nella posizione successiva il corrispondente numero telefonico:

 

Nominativo Telefono
Carlo Mazzone 347/9478…
Pippo De Pippis 333/1234…
…. ….
Ciccio Pasticcio 0824/7711…

 

L’intera organizzazione è nota come tabella, le singole righe vengono normalmente chiamate record mentre le singole caselle sono note come campi. In generale le tabelle posseggono una intestazione per ogni colonna che serve ad identificare i valori in essa inseriti. Nell’esempio proposto le intestazioni sono “nominativo” e “telefono”. Tali etichette sono anche note come “nome del campo”. Una o più tabelle sono sufficienti per la definizione di un database.

Spesso si confonde un database, che è “semplicemente” l’organizzazione dei dati, con l’intera applicazione predisposta a gestire gli archivi e i loro contenuti. Tale applicazione è, più propriamente, denominata con il termine DBMS (Database Management System) ovvero sistema per la gestione di database. Per intenderci, per chi conosce l’applicativo Microsoft Access, Access stesso è un DBMS mentre i file da esso prodotti (tipicamente con estensione .mdb) sono i veri e propri database.

Incidentalmente riportiamo il nome di una figura professionale di grande importanza connessa con i DB (abbreviazione per database) e i DBMS: il DBA ovvero Database Administrator. Il DBA è colui che si occupa della gestione e manutenzione di un database e ovviamente conosce le modalità operative del DBMS. Da notare che i DBMS, anche se in determinati contesti posseggono caratteristiche organizzative e di manutenzione simili, possono essere anche molto diversi tra loro.

Sono oggi disponibili vari applicativi DBMS (Microsoft SQL Server, Oracle, MySQL, PostgreSQL, …) e in generale un DBA è costretto a specializzarsi su di uno specifico prodotto. Tuttavia, voglio sottolineare come i concetti teorici siano sempre gli stessi ed è proprio a questi che bisogna concedere i massimi sforzi di comprensione al fine di poter, in caso di necessità, “migrare” ad una nuova soluzione software con il minimo sforzo.

E’ intuitivo pensare che, come quasi ogni oggetto che conosciamo, anche i DB prevedono una fase preliminare di creazione (a noi informatici piace molto questo aspetto “divino”) e una successiva fase operativa, di vera e propria gestione nella quale, ad esempio, preleviamo e modifichiamo specifici dati presenti nel nostro archivio.

Per ognuna di queste due fasi distinte esistono uno specifico linguaggio adatto allo scopo: DDL, ovvero Data Definition Language, con il quale costruiamo il nostro database e DML, Data Manipulation Language, con il quale gestiamo il database.

Entità, Attributi e Chiavi

Uno dei passi chiave per modellare in maniera corretta in un archivio una certa realtà è di individuare con precisione gli oggetti caratterizzanti la realtà stessa. Pensiamo, ad esempio, di dover costruire un archivio per la gestione degli ordini per un certo negozio, piuttosto che l’elenco dei dipendenti di una data azienda per la gestione di stipendi e altro ad essi attinente. E’ evidente la necessità di individuare con precisione tali oggetti e le loro singole caratteristiche. Per la gestione degli ordini ci saranno sicuramente clienti e fornitori così come per la gestione degli stipendi individuiamo immediatamente almeno l’insieme dei dipendenti. Tali oggetti prendono il nome di entità.

Come detto queste entità hanno delle proprie caratteristiche. Nel caso dei fornitori si può pensare, a titolo di esempio, al loro numero telefonico (dovessimo contattarli per qualche reclamo), il loro recapito postale e così via. Tali caratteristiche prendono il nome di attributi. La scelta degli attributi rilevanti è un altro passo critico nella creazione di un modello efficiente della realtà che vogliamo “codificare”.

Tra tutti gli attributi di un certa entità è necessario individuarne uno (o in alcuni casi più di uno) che sia in grado di caratterizzare l’entità in modo da renderla distinguibile, senza ambiguità, dalle altre entità. Mi spiego meglio: è necessario individuare una caratteristica unica dell’entità stessa in modo che tramite questa caratteristica sia possibile riferirsi all’entità in oggetto in modo univoco. Esempio: il codice fiscale è una caratteristica che identifica in modo univoco una data persona nel senso che, banalmente, non possono esistere due persone diverse aventi lo stesso codice fiscale. Queste particolari caratteristiche prendono il nome di chiavi primarie. A tali speciali attributi ci si riferisce spesso anche con la sigla PK, acronimo appunto di Primary Key.

In linea del tutto generale, gli attributi posseggono le seguenti caratteristiche:

  • formato
  • dimensione
  • opzionalità

Il formato specifica la tipologia dell’attributo. Ad esempio, se l’attributo è di tipo testuale, numerico, data-ora, ecc. In questo ambito mi sento di dover fare alcune precisazioni. Innanzitutto vi faccio notare che, sebbene determinati attributi abbiano una loro specifica natura, è sempre il progettista del database ad effettuare la scelta del tipo di formato.

Considerate, ad esempio, il caso di un numero telefonico. A prima vista si potrebbe pensare a tale attributo come avente un formato di tipo numerico. Ad una ulteriore analisi, un po’ più attenta, si potrebbe scoprire che se trattato in tale maniera sarebbe impossibile inserire numeri come il seguente: 0824/324343456. Ovvero, indicando nel numero il separatore “/” per la parte riguardante il prefisso. Infatti, tale separatore non è una cifra ed è quindi incompatibile con tale formato numerico.

Ma, sempre in relazione ai numeri telefonici, a volte questi sono espressi in una forma del tipo: +1-310-301-5800. Nello specifico questo è il numero dello IANA, l’organismo che ha responsabilità nell’assegnazione degli indirizzi IP nella rete Internet. Il simbolo + è il segnaposto per il codice per chiamate internazionali mentre il simbolo del trattino è un modo per rendere più leggibile il numero stesso. Vi renderete conto come un tale formato sia assolutamente incompatibile con quello di un normale numero che esprime delle quantità.

Vi faccio infine un ulteriore esempio: pensiamo al caso del CAP (il Codice di Avviamento Postale). Ebbene, anche in questa situazione si potrebbe effettivamente pensare ad un campo di formato numerico. Effettivamente la scelta potrebbe risultare opportuna in caso tale attributo sia riferito a CAP italiani. Tuttavia, se volessimo utilizzarlo per inserire CAP esteri in taluni casi, per quei codici che prevedono anche la presenza di lettere, tale scelta sarebbe assolutamente errata.

 

La dimensione di un attributo è un’altra caratteristica critica da valutare in fase di costruzione del nostro DB. Essa rappresenta, appunto, la dimensione da riservare per un dato attribuito.

Pensiamo, a titolo di esempio, all’attributo “cognome” nella definizione di una data entità “cliente”. In buona sostanza, dobbiamo decidere quanto potrà essere lungo al massimo un generico cognome, ovvero, quanti caratteri riservare per la sua memorizzazione. La prima cosa che potrebbe venirci in mente potrebbe essere quella di non voler correre rischi scegliendo così una dimensione sicuramente abbondante. Tuttavia, 255 caratteri, che in alcuni casi rappresenta la dimensione predefinita per i campi di tipo testuale, è sicuramente una scelta sproporzionata se riferita ad un cognome. Infatti, tale scelta, se da un lato ci consentirà di inserire cognomi di lunghezza qualsiasi, d’altra parte rappresenterà, in generale, un inutile spreco di spazio. Ma come dicevano i Latini “In medio stat virtus” ovvero “la virtù sta nel mezzo”. In altre parole è buona norma mediare tali situazioni scegliendo una dimensione che risulti comunque accettabile nei casi limite. A proposito di cognomi, ad esempio, può essere sorprendente scoprire quanto possa essere lungo un cognome di origine spagnola.

L’opzionalità si riferisce al fatto che un dato attributo possa avere o meno un certo valore. Più in generale, quindi, si considera la possibilità che un dato attributo possa avere un valore nullo. Pensiamo ad esempio all’attributo “codice fiscale”, oppure “data di nascita” di un certo individuo. Se la nostra progettazione prevedesse l’obbligatorietà di tali valori non sarebbe possibile inserire nessun dato relativo ad un certo individuo di cui non si conoscesse a priori la data di nascita.

Le precedenti, mi auguro semplici, considerazioni dovrebbero essere sufficienti per farvi intendere come la scelta di una serie di parametri sia a carico del progettista e di come tali scelte possano condizionare fortemente la struttura del nostro archivio di dati. Una buona e meditata progettazione renderà il nostro DB efficace ed efficiente consentendogli una certa flessibilità per eventuali future modifiche (si parla, in gergo tecnico, di scalabilità).

Associazioni e Relazioni

Di norma si è interessati non solo alle singole entità ma anche alle associazioni che esistono tra più entità. Un esempio servirà a chiarire meglio il concetto.

Se consideriamo l’archivio dei dipendenti è naturale immaginarsi un’associazione tra l’entità dipendente e l’entità stipendio. Tali associazioni prendono in generale anche il nome di relazioni. In tale contesto i termini associazione e relazione sono sinonimi.

Un aspetto di fondamentale importanza per quanto riguarda le relazioni tra entità è la loro classificazione. E’ possibile distinguere tre tipologie fondamentali:

  • uno a uno (one – one)
  • uno a molti (one – many )
  • molti a molti (many – many)

Vediamole allora di seguito in dettaglio:

Relazione uno a uno

Tale forma di relazione è la più semplice e al contempo la più scarsamente utilizzata. Essa consiste sostanzialmente nel fatto che per ciascuna entità in entrambi gli insiemi esiste esclusivamente un altro termine associato nell’altro insieme.

Un esempio potrebbe essere rappresentato da una relazione tra docenti e corsi.

Relazione uno a uno
Relazione uno a uno

 

E’ ovvio, tuttavia, che l’assunzione che deve essere effettuata, per considerare la precedente come relazione uno ad uno, è che ogni docente possa tenere un solo corso e che un singolo corso sia tenuto da un solo docente. Come si po’ intuire, questo tipo di situazione non è di norma presente nella realtà a conferma della rarità di questa tipologia di relazione.

Relazione uno a molti

La relazione di tipo uno a molti è probabilmente la più comune. In sostanza per ogni elemento di un primo insieme esistono più elementi correlati nel secondo insieme; d’altra parte ad ogni elemento del secondo insieme può corrispondere al più un elemento del primo insieme. Un esempio classico e chiarificatore può essere quello relativo ai due insiemi, cliente e ordine, schematizzati in figura.

Relazione uno a molti
Relazione uno a molti

 

Un cliente può ovviamente effettuare vari e differenti ordini ma ogni singolo ordine corrisponde ad un unico cliente.

Relazione molti a molti

La relazione molti a molti prevede che ad ogni elemento di un primo insieme possano corrispondere più elementi di un secondo insieme e, viceversa, per ogni elemento del secondo insieme possono corrispondere più elementi del primo insieme.

Tale tipo di relazione, se non trattata in maniera corretta, può creare diversi problemi sia di ridondanza, ovvero inutile ripetizione, di dati che di gestione durante aggiunte ed eliminazioni di elementi.

Relazione molti a molti
Relazione molti a molti

 

Come esempio vi porto l’associazione, visibile in figura, tra docente e studente relativamente all’attività di insegnamento. La relazione è di tipo “molti a molti” in quanto un docente insegna a differenti studenti. Inoltre, ogni studente ha più docenti.

I modelli di dati

Nel corso degli anni si sono evoluti tutta una serie di differenti modalità di organizzazione dei dati noti con il termine generico di modelli di dati. Tra questi è utile innanzitutto ricordare, ma solo per un aspetto di tipo storico, il modello reticolare ed il modello gerarchico.

Tali modelli sono stati ad un certo punto completamente soppiantati da un nuovo sistema di organizzazione dei dati noto come modello relazionale. Per diversi anni il relazionale ha costituito il modello assoluto di riferimento  per la realizzazione di archivi di dati. Probabilmente, uno dei motivi dell’indiscusso successo di questo modello è stato il linguaggio che lo accompagna in maniera indissolubile noto come SQL (Structured Query Language) che vedremo nel prosieguo del nostro viaggio. Tuttavia, negli ultimi anni si è sviluppato un movimento che cerca di affiancare alle soluzioni proposte dal relazionale nuove metodologie di organizzazione dei dati motivate, tra le altre cose, dalla necessità di gestire mole di dati a dir poco enormi che oggi vengono veicolate, ad esempio, dai social network. Infatti, il modello relazionale, a causa di una serie di vincoli intrinseci mal si adatta a situazioni che prevedono la gestione di quantità di dati così grandi da essere definite cin uno specifico nome come big data. Questo movimento alternativo al relazionale prende il nome di NoSQL. Il riferimento al linguaggio SQL è dovuto, come si intuisce, al fatto che Structured Query Language è per certi apsetti considerabile quasi come se fosse un sinonimo di relazionale. Tuttavia il No si NoSQL non significa Non SQL ma più precisamente Not Only SQL, ovvero, non solo SQL a voler rimarcare il fatto che non si prevede una sostituzione assoluta del “vecchio” modello relazionale che rimane valido, se non l’unica alternativa, in diverse e differenti situazioni. Fondamentalmente, i modelli NoSQL possono essere divisi in quattro tipologie fondamentali. Una prima tipologia nota come modelli a grafo (Graph Database) e fondamentalmente altri tre  modelli identificati come basato su Documenti, di tipo chiave-valore ed orientati alle colonne. In realtà, questi ultime tre modelli hanno un approccio abbastanza simile tanto da essere individuati nella loro totalità dal termine Aggregate Oriented Database. Di seguito un piccolo schema riassuntivo con relativi esempi di DBMS reali che implementano lo specifico modello.

 

Database basati su grafi (Graph database) Amazon Neptune, OrientDB
Database basato su Documenti (Document Database) MongoDB
Database chiave-valore (Key-Value) Redis
Database orientati alle colonne (Column oriented) Cassandra, HyperBase

 

Tuttavia la precedente classificazione non è esaustiva. A solo titolo di esempio un ulteriore modello di dati è rappresentato da quello noto come Object-oriented o più semplicemente modello ad oggetti. La sua peculiarità consiste nel fatto che gli oggetti di cui è composto il database contengono sia i dati sia la logica operazionale (i metodi di gestione dei dati) così come avviene nei linguaggi di programmazione che seguono il paradigma ad oggetti come il C++ o Java.

Carlo A. Mazzone

Supportaci condividendo sui social il nostro articolo!
  • 2
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
    2
    Shares

DevOps e programmazione Agile

Il termine DevOps deriva dalla fusione dei termini Development e Operations, dove il primo, development, fa riferimento alle attività di sviluppo software tipiche di un programmatore e il secondo, operations, focalizza l’attenzione su quelli che sono gli aspetti sistemistici e quindi di configurazione di macchine, di sistemi operativi e ambienti di gestione di dati. In generale, in questo contesto tali attività hanno come scopo principale quello di realizzare il cosiddetto deployment delle applicazioni ovvero quelle attività che consentono all’applicazione di essere spostate dall’ambente di produzione all’ambiente in cui l’applicazione viene create e testata all’ambiente in cui l’applicazione verrà eseguita e/o distribuita.

 

Figura – Una rappresentazione grafica del DevOps.

 

Il senso è che negli ultimi anni le figure di sviluppatore e sistemista, a volte in contrapposizione per impostazione lavorativa, si sono avvicinate sempre di più a causa delle evoluzioni dei sistemi, in particolare per quanto riguarda lo sviluppo in cloud e i vari ambienti di virtualizzazione. In realtà con tale contesto si fa riferimento ad un vero e proprio movimento che vede in DevOps una metodologia di gestione dei processi software che mirano all’ottimizzazione dello sviluppo di applicazioni guardando ai nuovi metodi previsti dalla programmazione Agile.

Quando si parla di sviluppo software si fa riferimento a tutto quell’insieme di attività, note anche come ciclo di vita del software, che partono dal livello di ideazione di un nuovo prodotto software e che, passando attraverso varie fasi di progettazione, sviluppo e collaudo (testing) arrivano fino al rilascio del prodotto in questione. Come si può facilmente intuire, l’insieme di queste fasi è di norma regolato da una serie di schemi standard noti come metodologie di sviluppo del software che rientrano nel più vasto contesto dell’ingegneria del software.

Potrà sembrare strano parlare di ingegneria per un prodotto non fisico ma in effetti lo sviluppo di un software viene visto come se si trattasse di un problema di tipo industriale in cui si cerca l’ottimizzazione dei processi produttivi rispetto ai tempi e ai costi degli stessi.

Ebbene, senza scendere eccessivamente nei dettagli della questione, le metodologie più vecchie (come ad esempio il modello a cascata) sono state in questi anni messe in crisi dalla velocità del mondo moderno che richiede software di qualità in tempi sempre più ristretti. DevOps, con il suo abbraccio alla metodologia Agile cerca di suggerire una possibile soluzione a tali problematiche. Già dal nome, Agile, si intuisce la volontà di sviluppare in modo dinamico. I fondatori di tale metodologia hanno stilato un vero e proprio manifesto (http://agilemanifesto.org) in cui sono elencati una serie di principi che si chiede di seguire per sviluppare software secondo questa nuova metodologia.

Di seguito un elenco tratto dal manifesto in questione:

 

  • La nostra massima priorità è soddisfare il cliente rilasciando software di valore, fin da subito e in maniera continua.
  • Accogliamo i cambiamenti nei requisiti, anche a stadi avanzati dello sviluppo. I processi agili sfruttano il cambiamento a favore del vantaggio competitivo del cliente.
  • Consegniamo frequentemente software funzionante, con cadenza variabile da un paio di settimane a un paio di mesi, preferendo i periodi brevi.
  • Committenti e sviluppatori devono lavorare insieme quotidianamente per tutta la durata del progetto.
  • Fondiamo i progetti su individui motivati. Diamo loro l’ambiente e il supporto di cui hanno bisogno confidiamo nella loro capacità di portare il lavoro a termine.
  • Una conversazione faccia a faccia è il modo più efficiente e più efficace per comunicare con il team ed all’interno del team.
  • Il software funzionante è il principale metro di misura di progresso.
  • I processi agili promuovono uno sviluppo sostenibile. Gli sponsor, gli sviluppatori e gli utenti dovrebbero essere in grado di mantenere indefinitamente un ritmo costante.
  • La continua attenzione all’eccellenza tecnica e alla buona progettazione esaltano l’agilità.
  • La semplicità – l’arte di massimizzare la quantità di lavoro non svolto – è essenziale.
  • Le architetture, i requisiti e la progettazione migliori emergono da team che si auto-organizzano.
  • A intervalli regolari il team riflette su come diventare più efficace, dopodiché regola e adatta il proprio comportamento di conseguenza.

Carlo A. Mazzone

Supportaci condividendo sui social il nostro articolo!
  • 8
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
    8
    Shares

L’origine di Java tra miti e leggende

Java affonda le proprie radici nei primi anni 90 quando la rete Internet come la conosciamo oggi era ancora solo immaginazione. Così come riportato dal sito di Oracle, azienda che ora controlla lo sviluppo di Java, nel 1991, un piccolo gruppo di ingegneri della società Sun Microsystem, chiamati il Green Team immaginarono possibile realizzare di superare le differenze presenti tra differenti dispositivi digitali e computer e per farlo iniziarono lo sviluppo un nuovo linguaggio di programmazione.

Guidato da James Gosling, il Green Team entrò nella storia dell’informatica  quando nel 1995 annunciò che il più diffuso  browser Internet dell’epoca, Netscape Navigator, avrebbe incorporato la nuova  tecnologia Java. Da notare come proprio in questo stesso anno il nome Java viene utilizzato per la prima volta andando a sostituire il primo nome scelto, ovvero Oak, a causa di problemi di copyright relativi al fatto che tale nome era già registrato dall’azienda Oak Technologies.

Figura  – James Gosling con una t-shirt con la scritta “Don’t Tell the Pope” Heretical Lecture Tour – 1632.

Come molte delle storie che hanno cambiato profondamente la società, anche la storia della nascita di Java si confonde a volte con storie che sfumano nella leggenda. Tanto per dirne una sembra che il nome Oak fosse stato scelto in riferimento ad un grande albero di quercia (oak, in lingua inglese) visibile dalla finestra degli uffici di cui lavorava Gosling presso Sand Hill Road, nella città di Menlo Park in  California, eletto come luogo di ritiro per il lavoro del Green Team.

Il nome Java, invece, sembra derivi da una lunga discussione per la scelta di un nuovo nome da sostituire, come detto, al nome Oak. Alla discussione  parteciparono diversi membri del Green Team e tra le varie proposte di nomi, tra cui DNA, Silk, Ruby e WRL prevalse alla fine il nome Java. Sembra che l’origine del  nome sia legata al fatto che uno dei membri del team, Chris Warth, stesse bevendo una tazza di Peet’s Java mentre partecipava alla discussione relativa alla scelta del nome. Java è infatti il nome  di una tipologia di caffè, così come lo è quello legato al nome “espresso”. Il nome del caffè Java in realtà deriva dal fatto che esso proviene dall’isola di Giava (Java in inglese), in Indonesia,  dove fu introdotto intorno al 1600 dagli olandesi. Ovviamente questo spiega anche il motivo per cui il simbolo di Java sia legato così strettamente al caffè.

 

Figura  – Il logo del linguaggio Java.

Sempre in tema grafico, in figura è visibile la mascotte del linguaggio di nome Duke. Dettagli sulla sua nascita sono presenti a questa URL: https://www.oracle.com/java/duke.html.

 

Figura  – Duke, la mascotte di Java.

Per quanto riguarda l’aspetto più tecnico relativo al linguaggio, la figura mostra quelle che potrebbero essere considerate le radici di Java che, come si può osservare, derivano da una parte dallo storico linguaggio Smalltalk di fedele osservazione dei principi della programmazione orientata agli oggetti e dall’altra dal mitico linguaggio C. Il tutto passa attraverso il C++ già, anch’esso, con una spiccata declinazione verso il paradigma di programmazione ad oggetti.

 

Figura  – Le origini di Java.

 

Carlo A. Mazzone

Supportaci condividendo sui social il nostro articolo!
  • 12
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
    12
    Shares

I colori del web e del mondo

La scelta dei colori da utilizzarsi nello sviluppo di un qualsiasi progetto è sempre un’operazione estremamente critica. In questa mini guida indico alcuni elementi che possono agevolare un giusto approccio alla problematica in questione. Ciò vale sia in un contesto specifico come quello relativo ad un progetto web sia più in generale in relazione ad un qualsiasi ambito produttivo.

In linea generale, con particolare riferimento al linguaggio HTML e quindi per lo sviluppo di pagine web, il valore di un colore può essere espresso sia attraverso un numero esadecimale che tramite uno dei seguenti sedici nomi di colori:

 

Black = “#000000” Green = “#008000”
Silver = “#C0C0C0” Lime = “#00FF00”
Gray = “#808080” Olive = “#808000”
White = “#FFFFFF” Yellow = “#FFFF00”
Maroon = “#800000” Navy = “#000080”
Red = “#FF0000” Blue = “#0000FF”
Purple = “#800080” Teal = “#008080”
Fuchsia = “#FF00FF” Aqua = “#00FFFF”

Il valore esadecimale deve essere preceduto dal simbolo # e si parla in questo caso di codifica RGB, dalle iniziali dei colori in lingua inglese:  Red, Green, Blue. Così, come facilmente osservabile dalla tabella in oggetto, il valore #FFFF00 e Yellow si riferiscono entrambi al giallo.

Il codice RGB  prevede la composizione di un unico colore attraverso le tre componenti fondamentali di rosso (Red), verde (Green) e blu (Blue) utilizzando un numero esadecimale a due cifre (da 00 a FF). Tale sistema è noto con modello additivo in quanto si passa dall’assenza di colore (il nero) alla massima espressione del colore (il bianco) aggiungendo man mano gradazioni di colore. Basta un attimo di riflessione per collegare questo sistema a quanto avviene con i classici sistemi di visualizzazione elettronici in cui si parte effettivamente dal nero, come elemento iniziale dello schermo di visualizzazione, nel momento in cui esso risulta spento.

Ogni colore in esadecimale è così espresso nella forma:

 

#RRGGBB

 

dove RR, GG, BB rappresentano rispettivamente le due cifre esadecimali per le componenti rosso, verde e blu. Si ha così che il codice #000000, avendo tutte le componenti a zero, indica il nero,mentre #FFFFFF, con tutte le componenti al valore massimo FF rappresenta il bianco, #FF0000 con la sola componente rossa al massimo rappresenta il rosso, e così via miscelando tra loro le varie componenti. Con tale sistema è possibile creare oltre 16 milioni di differenti combinazioni di colore.

Un diverso approccio alla gestione dei colori prevede un modello sottrattivo per cui si passa dalla massima presenza di colore, ovvero il bianco, all’assenza totale di colore, ovvero il nero. Il nome, sottrattivo, deriva appunto dall’aspetto per il quale si sottrae luminosità allo stato iniziale man mano che si aggiungono componenti di colore. Anche in questo caso è estremamente intuitivo collegare questo tipo di sistema ad una tecnologia di rappresentazione visiva riconoscendo tale approccio applicato normalmente alla stampa. Infatti, di norma, in fase di stampa partiamo dal foglio bianco per arrivare, come massima combinazione di colori al nero. I colori utilizzati in questo schema sono normalmente il ciano, il giallo e il magenta, in inglese, Cyan, Magenta, Yellow, da cui il nome dello schema CYM. Per produrre il nero si applicano al massimo le componenti dei tre colori citati. Tuttavia, il colore nero ottenuto non è sempre soddisfacente per cui a tali colori si aggiunge una quarta componente di nero puro ottenendo un sistema noto come CYMK.

Ovviamente, non è sufficiente conoscere i modelli ed i codici dei colori per produrre una composizione degli stessi che sia gradevole all’occhio e consistente per lo specifico progetto. In tale ambito, ci vengono in aiuto alcuni specifici strumenti che ci consentono di realizzare una scelta oculata grazie alla guida di una serie di vincoli che legano tra loro i colori. Infatti, la teoria dei colori è più complessa di quanto si possa immaginare. Per avere un’idea di tali strumenti e della complessità della scelta è possibile fare riferimento ai seguenti due strumenti web:

http://paletton.com/

https://color.adobe.com/

Si vedrà come risulta maggiormente agevole la scelta di determinate combinazioni in quanto guidati, ad esempio,  in modo automatico dal legame che esiste tra i colori cosiddetti primari  (così denominati in quanto essi non possono essere ottenuti dalla mescolanza di altri colori) ed i colori secondari che appunto si ottengono dalla combinazione di colori primari. Per agevolare tali operazioni i colori vengono disposti di norma su di una sorta di rosa dei colori (ache detta scala cromatica dei colori )in cui i colori si collocano per vicinanza cromatica. In tal modo, determinate coppie di colori possono essere scelte in base alla vicinanza oppure in base al fatto che si trovino ad essere in un certo senso completamente diversi tra loro. Tali colori collocati sulla rosa dei colori in posizione opposta vengono definiti colori complementari.

Per finire questo breve viaggio nel mondo dei colori vi segnalo un interessante post di Jesse Miller che potete trovare all’indirizzo:

https://www.jenreviews.com/color-meaning/

Il post ha come titolo “Color Meaning, Symbolism, And Psychology: What Do Different Colors Mean” ovvero il significato dei colori con un particolare accento rivolto all’ambito del simbolismo e del condizionamento psicologico che i colori realizzano su di noi. Un viaggio davvero interessante che vale la pena di fare a costo di un eventuale piccolo sforzo di traduzione dall’originale inglese.

 

Carlo A. Mazzone

Supportaci condividendo sui social il nostro articolo!
  • 9
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
    9
    Shares

Il successo di un tipo di dati: il casting delle variabili in C

di Carlo A. Mazzone

Il nome dell’articolo potrebbe suggerire un qualcosa collegato al mondo dello spettacolo: niente di più lontano dalla verità. Il casting, nel contesto informatico, non ha assolutamente a che fare con la selezione di un certo sviluppatore come attore in un qualche film ma piuttosto con l’attribuzione del tipo di dati più adatto ad una data variabile per una determinata circostanza implementativa.

Inizio con una semplice constatazione: talvolta il risultato di certe operazioni tra tipi di dati può dare risultati del tutto inaspettati. Ma andiamo con ordine ponendoci questa domanda: cosa accade quando assegno ad una variabile il valore di un’altra variabile appartenente ad un tipo di dati diverso?

Mi spiego meglio; quando scrivo qualcosa del tipo:

x=y;

se x ed y sono dello stesso tipo, semplicemente il valore di y viene copiato in x. Tuttavia, se x è ad esempio di tipo intero ed y di tipo float inevitabilmente la parte frazionaria di y verrà persa nell’assegnazione del valore ad x, al limite con un avvertimento (warning) da parte del compilatore.

Ad esempio, il seguente codice:

int main(int argc, char *argv[])

{

int x;

float y=5.5;

x=y;

printf(“Il valore di x e’: %d\n”, x );

printf(“Il valore di y e’: %.2f\n”, y );

return 0;

}

produrrà come output:

Il valore di x e’: 5

Il valore di y e’: 5.50

In generale, infatti, le uniche conversioni che non generano problemi sono quelle che consentono di ampliare la dimensione di una variabile. Ad esempio, nessun problema, ovviamente, nel caso contrario quello appena visto in cui assegniamo un intero ad una variabile float ottenendo come risultato che la variabile float avrà come parte intera il valore intero del numero assegnato e come parte frazionaria il valore zero.

Il valore di x e’: 6

Il valore di y e’: 6.00

Questi tipi di conversione vengono detti conversioni implicite in quanto realizzate automaticamente dal compilatore. In altri casi, però, è necessario “forzare” un tipo di variabile ad essere diversa da quella che risulterebbe in maniera naturale: si parla allora di conversione esplicita. Tali conversioni vengono definite in modo gergale cast oppure casting, ed usando a volte espressioni come “castare una variabile”.

Vi propongo allora una situazione tipica:

int main(int argc, char *argv[])

{

int x=7, y=2;

float d;

d=x/2;

printf(“Il valore di d e’: %.2f\n”, d );

return 0;

}

poiché d è stata dichiarata come float ci si aspetterebbe come risultato il valore 3,5. Sbagliato! L’operazione di divisione tra due interi viene appunto intesa come un fatto “privato” tra interi che da come risultato un valore intero, nel nostro caso il valore 3, che solo successivamente viene assegnato alla variabile con la virgola d. Tale problema è comunissimo e si verifica ad esempio nel caso in cui si deve calcolare la media di un dato numero di elementi interi per il quali, nonostante si prevede una variabile di tipo float si otterrà comunque un numero intero. Per risolvere la situazione si usa allora il casting di cui vi dicevo con la seguente sintassi:

(tipo_dati) espressione

Ad esempio, nel nostro caso sarà sufficiente scrivere:

d=(float)x/2;

per ottenere in stampa il valore desiderato ed atteso di 3,5.

Supportaci condividendo sui social il nostro articolo!
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  

CodeBlocks: installazione sotto Ubuntu

Code::Blocks è un ottimo IDE gratuito per scrivere applicazioni in C e C++. Esso è disponibile sia per Windows che per Linux. Tale caratteristica lo può far preferire in alcuni contesti rispetto a soluzioni come quelle offerte dall’ambiente Microsoft Visual C++ anch’esso gratuito nella versione Express .

L’installazione sotto Windows è estremamente semplice e non richiede nessun chiarimento particolare. In questo brevissimo tutorial vi propongo l’installazione dell’ambiente in questione sotto la distribuzione Linux Ubuntu.

Per prima cosa è necessario scaricare dal sito http://www.codeblocks.org/ la versione desiderata (32 o 64 bit). Da notare come siano disponibili pacchetti anche per le distribuzioni Debia, Fedora e Suse.

Il file scaricato è un archivio compresso (tar.gz). E’ quindi necessario decomprimerlo. A tal fine è possibile utilizzare il tasto destro del mouse sul file in questione e scegliere la voce “Estrai qui”. Verrà creata una cartella contenente i vari file necessari con estensione .deb

Un corretto ordine di installazione potrebbe essere il seguente:

libcodeblocks0_8.02-0ubuntu1_i386.deb
libwxsmithlib0_8.02-0ubuntu1_i386.deb
libwxsmithlib0-dev_8.02-0ubuntu1_i386.deb

e successivamente gli altri pacchetti. Questo a causa del fatto che alcuni pacchetti ne richiedono altri per l’installazione.

Per l’installazione dei singoli file/pacchetto è possibile fare doppio click sui singoli file nell’interfaccia grafica oppure usare (via terminale) il comando:

sudo apt-get install nomepacchetto

dove nomepacchetto è il nome dei vari file da installare.

A questo punto dovrebbe essere possibile lanciare l’ambiente CodeBlocks dal menu principale (voce Applicazioni -> Programmazione).

Provate a compilare una semplice applicazione di tipo console con il classico “Hello world!”.

Nel caso dovesse manifestarsi, con la prima compilazione, l’errore:

Linking console executable: bin/Debug/test1

/bin/sh: g++: not found

usate da terminale il comando:

sudo apt-get install g++

Buona programmazione a tutti.

Carlo Mazzone

Supportaci condividendo sui social il nostro articolo!
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  

Lorem ipsum e creazione di pagine web

Spesso in una pagina web, quando siamo alle prese con la disposizione dei contenuti, abbiamo bisogno di un insieme di testi di prova. E’ stato dimostrato che inserire in una data pagina contenuti testuali comprensibili distrae colui che li guarda; questi, infatti, viene incuriosito dai contenuti e perde di vista il “contenitore”. Ciò che si vuole ottenere durante la fase di creazione di un dato stile di pagina, al contrario, è di far concentrare l’osservatore sugli aspetti grafici ed organizzativi (colore del testo, disposizione ed allineamento dei paragrafi, ecc. ) .

In tutti questi casi si utilizza il cosiddetto “Lorem ipsum”. Si tratta di un insieme di parole della lingua latina utilizzate già a partire dal 1500 per prove di stampa. Più precisamente le parole sono estrapolate da un testo di Cicerone del 45 a.c.

Di seguito vi riporto una parte del brano originale dell’opera in cui sono evidenziate, in grassetto, le parole estrapolate.

 

«Sed ut perspiciatis, unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam eaque ipsa, quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt, explicabo. Nemo enim ipsam voluptatem, quia voluptas sit, aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos, qui ratione voluptatem sequi nesciunt, neque porro quisquam est, qui dolorem ipsum, quia dolor sit, amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt, ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem vel eum iure reprehenderit, qui in ea voluptate velit esse, quam nihil molestiae consequatur, vel illum, qui dolorem eum fugiat, quo voluptas nulla pariatur? [33] At vero eos et accusamus et iusto odio dignissimos ducimus, qui blanditiis praesentium voluptatum deleniti atque corrupti, quos dolores et quas molestias excepturi sint, obcaecati cupiditate non provident, similique sunt in culpa, qui officia deserunt mollitia animi, id est laborum et dolorum fuga…. »

Considerando solo le parole in grassetto si ottiene quanto segue:

«Lorem ipsum dolor sit amet, consectetur adipisici elit, sed eiusmod tempor incidunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquid ex ea commodi consequat. Quis aute iure reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint obcaecat cupiditat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.»

Il tutto è evidentemente incomprensibile anche per un latinista ; )

E’ da sottolineare comunque il fatto che trattandosi di un testo pseudocasuale ne esistono diverse versioni. In giro per la rete si trovano diversi servizi web (ed anche software) per generare il testo in questione: giusto per segnalarne uno vi riporto il sito www.lipsum.com .

Per maggior chiarezza vi riporto l’esempio reale di una pagina che utilizza il Lorem ipsum per mostrare la propria tipologia di impaginazione.

Carlo Mazzone

Supportaci condividendo sui social il nostro articolo!
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •