Dalla teoria all’hardware: come ti codifico l’informazione

Un calcolatore elettronico è sicuramente una macchina potente e complessa. Tuttavia essa si basa su principi abbastanza elementari. L’elementarità, dovrebbe a questo punto essere intuitivo, consiste nel fatto che i segnali elettrici (stati della tensione) da esso trattati sono soltanto due.

Per semplificare al massimo le cose, si può pensare al fatto che un elemento terminale di una sua componente in un dato istante abbia corrente, oppure, su di esso, la corrente non sia presente. A questi due stati normalmente si associano per convenzione rispettivamente i valori 1 e 0. Riuscendo a gestire questi due stati (e quindi dei simboli presi da un certo alfabeto binario) associabili a questi stati e sapendo che organizzando in vario modo tali simboli possiamo rappresentare ciò che vogliamo si aprono ai nostri occhi immensi panorami.

La cosa importante da notare è che non solo possiamo rappresentare determinati valori ma possiamo su di essi realizzare tutta una serie di operazioni.

L’esempio più semplice che possiamo immaginare è quello di trasformare un segnale (simbolo) da 1 a 0 e viceversa. Tale trasformazione si riflette, sul lato strettamente fisico, nel far si che la corrente scompaia da un certo terminale e al contrario, se assente, si renda nuovamente presente. Il modulo che realizza tale funzionalità (o funzione) è noto come invertitore ed è fisicamente realizzato con un unico transistor (un elemento di base dell’elettronica). La funzione stessa è nota con il termine tecnico NOT (negazione).

Come al solito, dietro quasi ogni elemento che incontriamo si nasconde un intero e più complesso mondo; è facile, infatti, intuire che tale semplice funzione non sia l’unica. Ma, non mi stancherò mai di ripeterlo, le cose devono essere comprese nei loro aspetti e concetti più semplici e fondamentali. Così facendo le difficoltà si sciolgono come neve al sole ed il sole stesso illuminerà lo scenario complessivo mostrandocelo in tutta la sua chiarezza.

Per semplificare l’analisi della funzione svolta dall’invertitore si può fare ricorso ad una sua forma tabellare:

 

ingresso

uscita

0

1

1

0

 

Tale tabella prende il nome di tavola di verità della funzione NOT. Per essere precisi la funzione svolta è una funzione binaria di variabili binarie (ha a che fare con solo due possibili valori) ed è detta anche funzione commutatoriale.

Boole e Shannon: algebra binaria e sua implementazione pratica

George Boole
George Boole

La precedente discussione mi serviva per introdurre un paio di argomenti tanto importanti quanto strettamente collegati.

Da una parte abbiamo tutta una serie di potenzialità teoriche che hanno a che fare con la possibilità di gestire stati (nel nostro contesto solo due) di variabili appunto binarie e dall’altro l’implementazione pratica di tali funzionalità.

Il matematico inglese George Boole (1815-1864) sviluppò un nuovo tipo di logica che utilizzava dei simboli (logica simbolica) associati a determinate parti del discorso (inteso come ragionamento).

Tali parti di un ragionamento sono delle proposizioni che devono risultare delle affermazioni. Queste affermazioni prendono il nome di enunciati.

E’ importante sottolineare come un enunciato sia una affermazione che può risultare vera oppure falsa ma non può essere contemporaneamente sia vera che falsa. Ad esempio, una proposizione del tipo: “imparate l’informatica!” non è un enunciato (ma piuttosto un saggio invito 😉 La richiesta che un enunciato possa essere o vero o falso rientra in quello che è definito come principio del terzo escluso (ovvero esistono due sole possibilità).

piove”, “quella matita è di colore rosso ”, “la macchina è in moto”, “10 è un numero pari”, “Benevento è una città”, ecc. sono tutti esempi di enunciati.

Boole introdusse inoltre degli operatori per mettere in relazione due affermazioni (quindi operatori binari) . Egli costruì una vera e propria algebra binaria denominata in suo onore algebra booleana (o algebra di Boole).

Boole propose quindi una nuova impostazione della logica: dopo aver rilevate le analogie fra oggetti dell’algebra e oggetti della logica, ricondusse le composizioni degli enunciati a semplici operazioni algebriche.

Claude Shannon
Claude Shannon

Nel 1938 Claude Elwood Shannon (1916-2001) ha dimostrato come l’algebra booleana potesse essere presa a fondamento per la progettazione di circuiti logici digitali, realizzando un passo fondamentale verso la concezione dei moderni computer (e questa mi sembra proprio la chiusura del cerchio). Shannon per tale eccezionale contributo è noto come il «padre del digitale».

Carlo A. Mazzone

Supportaci condividendo sui social il nostro articolo!

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!

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!

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!

Raspberry Mini HowTo

Questa mini guida illustra in maniera sintetica e diretta le modalità di preparazione di un sistema Raspberry.

Installazione di Raspbian con NOOBS

L’uso di NOOBS rappresenta il modo più facile per installare Raspbian su di una SD card. NOOBS, ovvero New Out Of Box Software, è un manager di installazione per i sistemi operativi compatibili con la Raspberry Pi. NOOBS è disponibile in due tipologie: offline e network install (versione Full)oppure solo network install (versione Lite).

La versione full include già Raspbian in modo che la si possa installare,direttamente sulla SD card, mentre la versione Lite di NOOBS necessità sempre di una connessione a internet per installare sua Raspian che un qualsiasi altro sistema operativo.

Ovviamente, la versione già presente del sistema operativo sulla versione full potrebbe essere non aggiornata nel caso un cui un un nuovo sistema dovesse essere stato appena rilasciato ma connettendosi ad Internet verranno mostrate le opzioni per il download dell’ultima versione eventualmente disponibile.

Download di NOOBS

L’URL di riferimento per lo scaricamento di una copia di NOOBS è:

www.raspberrypi.org/downloads/

Una volta raggiunta la pagina in questione cliccare sul link relativo a NOOBS.

A questo punto selezionare, per semplicità, l’opzione per lo scaricamento dello zip (o in alternativa usare un programma per il download dei file torrent).

Formattazione della SD Card

A questo punto sarà necessario preparare la scheda SD. Poichè la procedura prevede la cancellazione totale dei file presenti sulla scheda, se ritenuto opportuno, sarà necessario effettuare un backup dei dati eventualmente presenti.

In generale, la formattazione della scheda può essere realizzata con gli strumenti classici presenti nel sistema operativo. Tuttavia, tali strumenti non sono ottimizzati per le schede SD/SDHC/SDXC e ciò potrebbe comportare delle performance più basse.

Il consiglio è quindi quello di utilizzare uno strumento appositamente progettato per tale scopo, ovvero il “SD Memory Card Formatter 5.0 for SD/SDHC/SDXC” disponibile per il download, per Windows e Mac, qui:

https://www.sdcard.org/downloads/formatter_4/index.html

Sarà sufficiente seguire le istruzioni per il download e l’installazione del software e successivamente inserire la SD card nel proprio PC o laptop. Nel Formatter selezionare la lettera assegnata alla SD card e procedere con la formattazione.

Estrazione e copia di NOOBS

Ovviamente è ora necessario estrarre i file dallo zip NOOBS. Per farlo usate la vostra procedura preferita.

A questo punto utilizzando Explorer (per Windows) oppure il Finder (per Mac) spostatevi nella cartella dove è stato estratto lo zip. Sarà ora sufficiente farne il drag and drop oppure un copia e incolla nella radice della SD card.

A questo punto non resta che estrarre la scheda SD.

Avvio di NOOBS

Una volta copiati i file di NOOBS sulla micro SD Card sarà sufficiente inserire la scheda nella Raspberry Pi e collegarla all’alimentazione.

Una volta avviato il sistema potrete selezionare il box per il sistema Raspbian e quindi cliccare sula voce Install.

NOTA: L’utente di default in Raspbian è pi, e la corrispondente password, necessaria per scopi di amministrazione, è raspberry.

La cosa interessante da sapere è che l’elenco dei sistemi operativi disponibili per l’installazione, se non precedentemente installati, viene visualizzato solo nel caso in cui la Raspeberry sia collegata alla rete (via cavo o wireless). Nel caso di collegamento fisico con cavo la Raspberry ottiene un IP tramite DHCP mentre nel caso di collegamento wireless è necessario impostare i parametri della scheda tramite l’apposita icona relativa alla rete Wi-Fi.

Al riavvio della scheda è sempre possibile scegliere un nuovo sistema operativo da installare premendo il tasto Shift.

di Carlo A. Mazzone (Ver. 20180121A)

Supportaci condividendo sui social il nostro articolo!

Sottoprogrammi e programmazione procedurale in un file batch

Uno degli approcci più classici nello sviluppo software è quello che prende il nome di programmazione procedurale. In buon sostanza di tratta della pratica di suddividere il programma principale  in parti più piccole, note con il termine di sottoprogrammi (in inglese subroutine) ma anche procedure o funzioni a seconda dei diversi linguaggi di programmazione. Tutto ciò per facilitare la stesura e la manutenzione del programma stesso. Dopo questa introduzione sui sottoprogrammi dareste per scontato la loro disponibilità nei file batch. Ebbene, sbagliereste, in quanto tale possibilità non è contemplata nei file batch. Tuttavia, una possibilità di emulare tale comportamento è comunque possibile individuarla, innanzitutto nell’utilizzo del comando CALL che consente di richiamare un altro file batch. Supponiamo allora di avere un file batch di esempio che serve solo a produrre un messaggio a video:

 

@ECHO OFF

REM File saluta.bat

ECHO Salve a tutti

 

Chiameremo il file, come visibile nel commento precedente, saluta.bat.

Il nostro file principale non dovrà far altro che richiamare, con il comando CALL, il file che funge da sottoprogramma, così come mostrato di seguito.

 

@ECHO OFF

REM Sottoprogrammi

ECHO Io sono il file principale

CALL saluta.bat

ECHO Sono ancora il file principale

 

Banalmente, il risultato a video sarà il seguente:

 

Io sono il file principale

Salve a tutti

Sono ancora il file principale

 

Intuitivamente, si capisce come il relegare un dato comportamento in un file che funge da sottoprogramma consente di snellire e modularizzare il proprio codice in quanto sarà possibile registrare in un dato file batch un certo blocco di istruzioni da far ripetere anche più volte all’interno del nostro programma principale.

Tuttavia, oltre a quello mostrato, esiste un altro modo per inserire una sorta di sottoprogramma direttamente nel file batch. Tale approccio sfrutta il concetto di etichetta. Una etichetta (label in inglese) è una stringa di testo, da terminarsi con il simbolo dei due punti, che viene posizionata in una riga qualsiasi del file batch e che può così essere considerata un punto di salto per l’esecuzione del comando GOTO. Di seguito subito un esempio:

 

@ECHO OFF

:ritorno

CLS

TIME /T

GOTO ritorno

 

Nel  codice proposto, potete notare un’etichetta di nome ritorno subito dopo della quale viene invocato il comando CLS seguito da TIME che visualizza la data corrente del sistema e che grazie all’opzione /T non ne chiede l’impostazione. L’ultima istruzione è GOTO ritorno che forza l’esecuzione a riprendere proprio dal punto etichettato come ritorno creando quindi un loop (nome tecnico per indicare un ciclo), in questo caso infinito. Per interrompere l’esecuzione sarà necessario usare la combinazione di tasti CTRL+C. Una particolarità relativa alle etichette è che Il comando GOTO accetta l’etichetta speciale di destinazione :EOF, che trasferisce il controllo alla fine del file batch corrente. Ciò consente di uscire da uno script senza definire un’etichetta specifica. Credo sia inutile sottolineare che il precedente è un programma assolutamente stupido e realizzato al solo scopo di presentare un esempio di facile comprensione relativo al comando GOTO. Tuttavia, abbiamo ora uno strumento in più che ci consente di rendere i nostri script maggiormente interattivi. Per dimostrarlo supponiamo di voler realizzare una piccola utility (ovvero un programma di utilità) che consenta all’utente di selezionare un certo comando informativo sullo stato del sistema. Vi scrivo di seguito il codice che commentiamo subito dopo.

 

@ECHO OFF

:menu

CLS

ECHO ****************************************************

ECHO *            VERIFICA RETE

ECHO *

ECHO *  1. VISUALIZZA IMPOSTAZIONI DI RETE

ECHO *  2. TEST CONNESSIONE RETE LOCALE

ECHO *  3. TEST CONNESSIONE INTERNET

ECHO *

ECHO *  Q. Esce e torna al prompt dei comandi

ECHO ****************************************************

 

SET GW=192.168.1.1

SET /P scelta=SCEGLI:

 

IF %scelta%==1 GOTO ipconfig

IF %scelta%==2 GOTO gateway

IF %scelta%==3 GOTO internet

 

IF %scelta%==Q GOTO :EOF

IF %scelta%==q GOTO :EOF

 

:ipconfig

ECHO Rileviamo le configurazioni delle schede di rete

IPCONFIG /ALL

PAUSE

GOTO menu

 

:gateway

ECHO Eseguiamo un ping al default gateway

PING %GW%

PAUSE

GOTO menu

 

:internet

ECHO Test connessione Internet

PING 8.8.8.8

PAUSE

GOTO menu

 

La prima parte dello script è assolutamente banale. Con una serie di comandi ECHO mostriamo a video un menu con tre classiche possibilità per fare il cosiddetto troubleshooting, ovvero individuazione ed eliminazione di un problema, della nostra connessione di rete. Vi faccio tuttavia notare come abbia posto, in testa allo script, un’etichetta, :menu, che servirà come punto di richiamo per far visualizzare il menu alla fine di ogni comando. Successivamente, al fine di rendere più gestibile lo script, dichiariamo, la seguente variabile di ambiente:

 

SET GW=192.168.1.1

 

Tale variabile GW contiene uno dei classici default gateway. Con tale termine si indica l’indirizzo IP che viene utilizzato per uscire dalla nostra rete locale. Di norma esso è l’indirizzo del router ADSL della nostra connessione ad Internet. Nel caso in cui tale IP dovesse risultare diverso da quello impostato per la nostra specifica macchina sarà sufficiente modificarlo di conseguenza. L’istruzione successiva:

 

SET /P scelta=SCEGLI:

 

visualizza il messaggio “SCEGLI:” e memorizza la digitazione dell’utente in una variabile dal quasi scontato nome scelta. Tale variabile verrà testata con una serie di IF per individuare la selezione effettuata dall’utente. Ognuna di tali scelte termina nel codice con i comandi:

 

PAUSE

GOTO menu

 

che consentono appunto, dopo una pausa di visualizzazione, il ritorno ai comandi ECHO che ripropongo a video il menu con le scelte possibili. Per chi è abituato a smanettare con i comandi di rete, IPCONFIG e PING sono pane quotidiano. Nello specifico, IPCONFIG, che aveva già visto in precedenza, con l’opzione /ALL, visualizza in dettaglio tutte le informazioni sulla configurazione della macchina in uso. Il comando PING, invece, serve per capire se la nostra scheda di rete riesce a comunicare, in gergo tecnico pingare l’indirizzo IP che specifichiamo come argomento del comando in questione. Nel caso dell’etichetta :gateway “pinghiamo” il gateway di default. Se questo dovesse essere diverso da 192.168.1.1 lo potremmo scoprire proprio con il comando IPCONFIG e quindi modificheremmo la variabile di ambiente GW di conseguenza. Nel caso, invece, dell’etichetta :internet effettuiamo il ping  con l’IP 8.8.8.8. Tale IP corrisponde ad un server DNS di Google e quindi è sempre attivo su Internet. Ovviamente potremmo utilizzare un IP pubblico qualsiasi che sappiamo essere sempre in linea al fine di verificare la nostra connessione verso l’esterno. Per inciso, un server DNS è una macchina che consente la traduzione, nota come risoluzione, dall’indirizzo IP al nome di dominio del tipo www.exaple.com e viceversa.

 

Carlo A. Mazzone

Supportaci condividendo sui social il nostro articolo!

Linux e Windows 10: la shell Bash

Oltre alla soluzione che prevede l’installazione di Cygwin  (https://www.cygwin.com/) come ambiente di emulazione per Linux, per i sistemi Windows 10 esiste un’alternativa che prevede l’installazione della shell bash come applicativo nativo di Windows stesso. La bash su Windows fornisce così agli sviluppatori e sistemisti una shell Linux in  cui eseguire la maggior parte dei comandi Linux senza dover installare uno specifico emulatore esterno. Il prerequisito fondamentale per l’installazione di tale bash è che il nostro Windows sia una versione a 64-bit Anniversary Update build 14393 o superiore. Per verificare la versione del sistema in uso è sufficiente e l’architettura  della CPU della nostra macchina è sufficiente accedere a Impostazioni->Sistema-> Informazioni su.

Inoltre è necessario impostare manualmente il sistema operativo in Modalità sviluppatore (in inglese, Developer Mode). Per farlo è necessario seguire la sequenza Impostazioni -> Aggiornamento e sicurezza -> Per sviluppatori e selezionare l’opzione Modalità sviluppatore. A questo punto non rimane altro che installare la bash accedendo alla funzionalità Attiva o disattiva funzionalità di Windows e selezionando, così come mostrato in figura, la voce sottosistema Windows per Linux.

Per lanciare e utilizzare l’ambiente Linux sarà ora sufficiente aprire una console CMD e digitare il comando bash.

 

Carlo A. Mazzone

Supportaci condividendo sui social il nostro articolo!

Cron: il signore del tempo

In un sistema Linux, capita molto spesso di dover eseguire un certo file, un particolare comando oppure una serie di operazioni in uno specifico momento della giornata. Un caso classico è rappresentato da operazioni di backup dei dati da effettuarsi preferibilemente in orario notturno.

Per realizzare tali scopi i sistemi Linux mettono a disposizione il demone cron che, opportunamente istruito tramite specifici file di configurazione, è in grado di mandare in esecuzione tutto ciò di cui necessitiamo.

Il nome cron deriva probabilmente dal dio greco del tempo Chronos. In realtà l’origne del nome non è certa ed esso potrebbe anche essere l’acronimo derivante dalle espressioni “Commands Run On Notice” oppure “Commands Run Over Night”. In ogni caso il nostro demone legge uno specifico file noto come crontab (ovvero cron table) ed esegue alle temporizzazioni in esso indicate i comandi corrispondenti.

Un prima verifica dello stato del nostro sistema può essere effettuata usando l’apposito comando, chiamato appunto crontab, come mostrato di seguito:

carlo@foo:~$ crontab -l

dove carlo è (ovviamente) il nome dell’utente collegato al sistema e foo il nome della macchina.

L’opzione –l (ovvero il trattino seguito dalla lettera elle) consente di “listare” il contenuto del file di configurazione associato all’utente che lancia il comando in oggetto. Nel nostro caso, e nella situazione in cui il sistema non è ancora stato istruito ad eseguire comandi, dovremmo vedere in output un messaggio del tipo:

no crontab for carlo

Sebbene sia possibile editare direttamente i file di configurazione per i nostri job (attività da eseguire) è conveniente richiamare il file attraverso il comando crontab accodando l’opzione –e, come mostrato di seguito:

carlo@foo:~$ crontab -e

Tale comando aprirà un editor di testi per la modifica di un file predefinito. La prima volta che si richiama il comando in oggetto sarà possibile indicare l’editor di propria preferenza da una lista minimale all’interno della quale si suggerisce l’uso dell’editor nano. Il file di default visualizzato sarà il seguente:

 

# Edit this file to introduce tasks to be run by cron.

#

# Each task to run has to be defined through a single line

# indicating with different fields when the task will be run

# and what command to run for the task

#

# To define the time you can provide concrete values for

# minute (m), hour (h), day of month (dom), month (mon),

# and day of week (dow) or use ‘*’ in these fields (for ‘any’).#

# Notice that tasks will be started based on the cron’s system

# daemon’s notion of time and timezones.

#

# Output of the crontab jobs (including errors) is sent through

# email to the user the crontab file belongs to (unless redirected).

#

# For example, you can run a backup of all your user accounts

# at 5 a.m every week with:

# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/

#

# For more information see the manual pages of crontab(5) and cron(8)

#

# m h dom mon dow command

 

Ovviamente le linee che inziano con il simbolo di cancelletto non sono eseguite in quanto tale simbolo introduce un commento. L’ultima riga indica quale deve essere il formato da utilizzarsi per inserire i comandi da far eseguire al nostro demone. Come si può osservare nelle prime due posizioni indichiamo il minuto (tra 0 e 59) e l’ora (tra 0 e 59) in cui si vuole far eseguire il comando. Successivamente indichiamo il giorno del mese (tra 1 e 31) e il mese dell’anno (tra 1 e 12). Infine, prima del nome del comando possiamo indicare il giorno della settimana in cui verrà eseguito il comando, usando un numero da 0 a 6, dove 0 indica la domenica, 1 il lunedì e così a seguire con il 6 che indica il sabato.

Se si vuole eseguire un dato comando in un giorno qualsiasi è possibile usare un asterisco. Ad esempio la seguente riga:

00 01 * * * /sbin/miocomando

Eseguirà il comando indicato all’una di notte di tutti i giorni della settimana.

Una volta inserita la sequenza di comandi all’interno del file sarà sufficiente salvare il file con CTRL+O e una volta usciti dall’editor (CTRL+X) sarà tuttavia necessario riavviare il demone cron per fargli leggere la nuova configurazione. A tal fine usaremo il comando:

sudo /etc/init.d/cron restart

In alcuni casi, soprattutto quando si è in fase di testing della configurazione può essere utile porsi in ascolto sul log di sistema a caccia di eventuali errori che potrebbero verificarsi. A tal fine useremo il comando:

tail -f /var/log/syslog

A volte è sarà necessario schedulare delle attività che richiedono i permessi di root. In questo caso dovremo lanciare l’editing del file crontab con il prefisso sudo (superuser do) come mostrato di seguito:

carlo@foo:~$ sudo crontab -e

Una volta effettuate le modifiche del caso si procederà con il normale salvataggio prima dell’uscita dall’editor. Volendo visualizzare quindi il file di configurazione specifico per il superutente sarà sufficietne richiamare il comando crontab con l’opzione –l facendo però precedere tale comando dal sudo, come mostrato di seguito:

carlo@foo:~$ sudo crontab -l

Come è intuibile, le opzioni di configurazione sono molteplici. Ad esempio è possibile specificare orari multipli indicandoli separati da una virgola. Nello specifico la riga:

0,15,30,45 * * * * /sbin/miocomando

Schedula il comando per l’esecuzione ogni quarto di ora di ogni ora di ogni giorno.

Infine è possibile utilizzare il simbolo del trattino per indicare specifici intervalli di tempo. Ad esempio:

00 08 * * 1-5 /sbin/miocomando

Schedula il nostro comando per essere eseguito alle otto di mattina di tutti i giorni dal lunedì al venerdì.

 

Carlo A. Mazzone

Supportaci condividendo sui social il nostro articolo!

Abilitazione pagine web su Apache per singoli utenti con userdir

Può essere interessante in ambito laboratoriale o di sviluppo all’interno di un dato gruppo di lavoro abilitare su di una macchina Linux con web server Apache la possibilità per i singoli account utente di utilizzare una specifica cartella per i propri file html e php.
Per farlo è necessario innanzitutto abilitare il modulo userdir con lo specifico comando:

sudo a2enmod userdir

Analizzando il file di configurazione

/etc/apache2/mods-enabled/userdir.conf

si noterà come la cartella nella quale ci si aspetterà di organizzare i file è public_html.

II singolo utente creerà dunque i suoi file nella cartella /home/nomeutente/public_html/
Ovviamente dovrà innanzitutto creare tale cartella, trovandosi nella propria home, con il comando:

mkdir public_html

Per accedere via web con il proprio browser a tali file si userà l’URL:

http://127.0.0.1/~nomeutente/

sostituendo l’indirizzo localhost 127.0.0.1 con l’IP o il nome della macchina in questione.

Gestione PHP
Per abilitare all’esecuzione di script PHP è necessario editare il file:

/etc/apache2/mods-available/php5.conf

In esso bisogna commentare le righe seguenti:
#
#
# php_admin_value engine Off
#
#

Ovviamente bisognerà riavviare apache:

sudo service apache2 restart

Happy coding.

Carlo A. Mazzone

Supportaci condividendo sui social il nostro articolo!

Batch backup: un piccolo script per grandi backup

E’ esigenza diffusa realizzare copie di sicurezza di file personali e/o aziendali su una macchina diversa da quella in cui risiedono i file stessi. In questo micro post vi riporto un semplice script da utilizzarsi su macchine windows verso uno sharing di rete che può essere ospitato tanto su di un server Windows tanto su di una macchina Linux con server Samba.

Si tratta di un file batch molto semplice ma efficace ed efficiente.

Per prima cosa si definiscono un paio di variabili di ambiente che facilitano l’eventuale modifica del file. La variabile LOGFILE contiene il percorso ed il nome di un file di LOG in cui memorizzare le attività svolte dallo script. Una seconda variabile di nome REMOTEDISK indica la lettera di unità di volume dello sharing per la destinazione del backup.

Al lancio lo script accoda nel file di log data ed ora dell’inizio delle operazioni e verifica l’esistenza della destinazione. In caso negativo termina saltando all’etichetta :notarget. Le istruzioni ECHO sembrano ripetitive ma hanno uno scopo. La prima è per la visualizzazione a schermo durante l’esecuzione dello script mentre la seconda serve per accodare, tramite l’operatore di redirezione >>, il testo descrittivo nel file di log.

Se tutto procede come ci si attende le istruzioni xcopy, grazie all’opzione /D,copiano sulla destinazione i soli file modificati. Ciò consente una notevole efficienza dello script. L’opzione /E serve per copiare anche le cartelle vuote in modo da riportare sul disco di backup la reale struttura di origine. L’opzione /Y non chiede conferma per la sovrascrittura dei file.

Da notare l’uso dei doppi apici nel comando xcopy. Nell’esempio non sarebbero strettamente necessari ma risulterebbero indispensabili nel caso di percorsi con spazi presenti al loro interno.

Lo script può essere facilmente inserito nelle attività automatiche di Windows per essere lanciato, nel caso di server aziendali, preferibilmente di notte.

Carlo A. Mazzone

 

@ECHO OFF

CLS
ECHO ************************
ECHO *** BACKUP UTILITY ***
ECHO *** VER 1.1.3 ***
ECHO *** Carlo A. Mazzone ***
ECHO ************************

SET LOGFILE=c:\BackupLogs.txt
SET REMOTEDISK=X:

ECHO *********************** >> %LOGFILE%

DATE /T >> %LOGFILE%
TIME /T >> %LOGFILE%

ECHO Inizio operazioni …
ECHO Inizio operazioni >> %LOGFILE%

REM Test esistenza directory destinazione
IF not EXIST %REMOTEDISK% GOTO notarget

ECHO Copia CARTELLA_1 in corso …
ECHO COPIA CARTELLA_1 >> %LOGFILE%
xcopy “C:\CARTELLA_1\*.*” %REMOTEDISK%\DATI_BACKUP\ /E /D /Y >> %LOGFILE%

ECHO Copia CARTELLA_2 in corso …
ECHO COPIA CARTELLA_2 >> %LOGFILE%
xcopy “C:\CARTELLA_2\*.*” %REMOTEDISK%\DATI_BACKUP\ /E /D /Y >> %LOGFILE%

GOTO fine

:notarget
ECHO Errore – target NON disponibile >> %LOGFILE%
GOTO fine

:fine
DATE /T >> %LOGFILE%
TIME /T >> %LOGFILE%

ECHO Fine operazioni >> %LOGFILE%

ECHO *********************** >> %LOGFILE%

Supportaci condividendo sui social il nostro articolo!