OGGETTO Olivo, METODO raccolta: quando la natura ti suggerisce la realizzazione di un nuovo progetto Codeigniter!


In questi giorni di raccolta delle olive (l’oggetto OLIVO viene forse istanziato con la parola chiave NEW?) dove rastrellare i rami diventa un gesto automatico (il metodo dentro la definizione della classe!) in modalità multitasking mi sono chiarito le idee sul nuovo progetto da mettere in piedi. Dopo aver fatto breccia nel muro Codeigniter Framework con il progetto Western Gallery all’ indirizzo http://umbriawayformazione.altervista.org/ l’idea successiva é stata quella di mettere in piedi http://umbriawayformazione.altervista.org/ci_project_competenze/ un progetto che introduce nuovi elementi di studio rispetto al suo predecessore.


Si dovrebbe lavorare per obiettivi, per cui per migliorare la prestazione precedente mi basta concludere tutto in 24 giorni (un giorno in meno rispetto al Parent) e visto che parliamo di un progetto molto piccolo c’è parecchio tempo da dedicare allo studio e alla formazione, cosa carente in western gallery, in questo modo posso introdurre nuovi elementi di implementazione per costruire i miei edifici digitali approfondendo CI. Il progetto di per se intende offrire LATO front end delle informazioni generali legati ai mestieri digitali, con descrizione generica per ogni categoria e contemporaneamente vuole offrire parte back end dopo il login l’accesso a informazioni riservate legate alle valutazioni conoscitive del candidato, area utile sia a selezionatori ma anche al candidato che focalizza dove deve intervenire per migliorare il suo cv. Tecnicamente l’atterragio dopo il login avviene su due pagine diverse per semplificare, se il login non riesce rimani nella pagina delle informazioni generali mentre se si ha accesso con le credenziali guarda pure le informazioni riservate ma suppongo che si possa fare anche tutto con una sola pagina mandando in OUTPUT pezzi di costruzione HTML sulla condizione IF-ELSE, cosa che qui non mi interessa fare per lasciare il progetto il più possibile ristretto alle funzionalità minime (la complessità negli scacchi per esempio la si può gestire quando si palleggiano bene tutte le basi, quindi fare il minimalista con CI per scomporre almeno gli elementi primari è d’obbligo!). Nel frattempo si può imparare dalla NATURA la programmazione orientata agli oggetti perché se la pianta é estesa ci vuole un grande rastrello per arrivare ai rami alti mentre il metodo rastrello normale può adempiere alla ripulitura delle zone basse!

I 64 percorsi della salute MTB, itinerario “f2”: da Colle di Nocera Umbra a frazione Roveto CAP 06023 passando per la via Flaminia e ritorno al mittente sulla strada panoramica degli uliveti via Boschetto e Gaifana

web design umbriaBicicletta MTB che passione! Certo , ma non sempre si può pedalare in modo agevole come indicato dai percorsi E6 e C7 come indicato rispettivamente da https://umbriawayincrementa.wordpress.com/ e https://umbriawayinfo.wordpress.com/ . Sappiamo anche che autoetichettandoci a quella nuova disciplina sportiva denominata ciclismo condominiale, pedalando non dobbiamo dimostrare di essere forti, alti belli e con gli occhi azzurri e magari con il codice IBAN al top. Il ciclista condominiale usa la bici per ammirare il paesaggio, conoscere il territorio, scattare fotografie, respirare odori salutari (quando non attraversa allevamenti di cavalli!) e godersi il misterioso NEXUS dei circoli virtuosi panoramici che abbiamo già investigato nei percorsi per l’appunto e6 e c7. Parliamo sempre di tragitti relativamente brevi che in questa fase non oltrepassano la linea di demarcazione dei venti km e anche qui per l’appunto siamo di fronte a quei dieci/quindici km di puro turismo sulle due ruote che a tratti nella parte finale obbliga il ciclista a scendere dalla sella per particolari punti scoscesi e difficoltosi, come per esempio la parte finale che collega la strada panoramica degli uliveti che collega Roveto alla parte posteriore della chiesa di Boschetto. Mettiamo subito l’accento sulle I visto che a breve una famosa trasmissione della RAI dedicata al GREEN metterà in onda un servizio esclusivo che noi possiamo già pregustare transitando per questa strada collinare di campagna decisamente scomoda e stretta con la sua carreggiata stretta sterrata e i suoi rovi laterali e che ricorda per certi tratti per caratteristiche proprio la vecchia Flaminia del percorso E6. Forse converrebbe provare l’effetto che fa anche farla da semplici escursionisti per gustarsela alla Herman Hesse con i suoi temi naturalistici dove il viandante cerca nella pace delle location attraversate un alchimia interiore per ritrovare e riorganizzare se stesso. Nell’ ottocento la figura del viandante era sacra, ricordiamo per esempio “Il Viandante sul mare di nebbia” il quadro del 1818 di Caspar David Friedrich (1774-1840) dove c’è tutta la tematica dell’ uomo esploratore che parte e va da qualche parte simbolicamente attraversando la parte spirituale. Ma anche con la propria MTB a due ruote a tratti da trascinare lateralmente come se fosse un cavallo meccanico non può che trasparire la bellezza del paesaggio e l’armonia della natura, il che fa apprezzare l’Umbria in versione estiva in tutta la sua longilinea-genuina-trasparente-illuminante psicoespressione. E’ percorso fotografico quello che viene proposto, tolti i primi cinque km dove scendendo da Colle di Nocera Umbra e incanalandosi con tutte le cautele del caso sulla trafficata Flaminia bisogna pedalare in modo scomodo fino a Roveto attraversando Gaifana e la sua stazione. Qui si entra nella strada in salita sulla destra indicata dal cartello e si sale e si sale e si sale non senza riposarsi per riprendere fiato visto che nessun ciclista condominiale orientato alle brevi distanze turistiche che non è nato cannibale come Eddy Merx non deve dimostrare nulla se non un pò di passione e divertimento profano per le due ruote. Arrivati a Roveto Basso si giunge in prossimità di una chiesetta i cui anfratti posteriori nascondono nella toponomastica di stradine sconosciute la VIA DEGLI ULIVETI che sale dolcemente per tagliare le colline da ROVETO fino a BOSCHETTO. Tra l’altro anche proseguendo anche dall’ altra parte verso Rigali questa ragnatela di stradine permette all’ appassionato MTB di giungere come asseriscono alcune voci non solo fino a Gualdo Tadino incrociando tutti paesi ma anche di arrivare fino al SERRASANTA su percorsi specialistici, cosa decisamente proibitiva rispetto agli obiettivi che ci eravamo prefissati inventando il ciclismo condominiale che ha uno statuto basato sulla condanna di tutti i crampi dovuti alle salite abbastanza rigido! Ok ma quando sei lassù e stai per ritornare a Colle di Nocera Umbra, che come sanno tutti i sassi è una location perfetta per fare turismo di prossimità aumentata (se vogliamo metterla sul virtuale da questo avamposto strategico in pochi minuti sei al mare, in altrettanti pochi minuti sei vicino a città tra le più belle d’Italia tipo Firenze e Roma che puoi raggiungere anche in treno, senza contare che a pochi minuti di macchina hai l’esclusiva di apprezzare bellissime città storiche come Perugia, Spoleto, Gubbio e tanto altro, senza citare le Marche e Urbino per esempio che sono niente affatto proibitive dove per esempio Fabriano è solo a 40 km!) che cosa vedi? Vedi nel tuo microcosmo quello che ti viene propinato all’ ora dei pasti dalla RAI nelle sue trasmissioni domenicali a volo di elicottero, ossia panorami  mozzafiato con lo sguardo che si perde sulla linea dell’ orizzonte per rimanere storditi e assuefatti da tanta bellezza naturalistica, che sarà anche autoreferenziale ma che bene fa ai polmoni! Da uno a dieci indicando come DIECI il massimo livello di difficoltà e SEI la posizione dove il ciclista non sente sofferenza durante le sue scorribande, qui dobbiamo segnalare un sette/otto ma solo perchè l’ultimo km su strade antiche di brigantaggio non consente di andare in bici (o meglio lo possono fare solo persone particolarmente temprate dall’ esperienza che vogliono arrivare a casa intatte!). Guardiamo il lato positivo: quando si riaffiora a Boschetto dietro la chiesa quasi come se fossimo nella parte finale dell’ esodo del mar Rosso, davanti a noi esausti troneggia un bel Negozio-bar rifregerante che alla Wolf risolve tutti i problemi. Dopo aver strafocato in abbondanza il ciclista condominiale in MTB può così avviarsi con una strada agevole in discesa fino a Gaifana dove ci sono come al solito diverse alternative per rientrare (volendo c’è anche una terza opzione che parte da Boschetto che analizzeremo in un dei prossimi tragitti come intenzione esplorativa!) o LA SALITA DEI DANNATI, così ribatezzata IN GERGO CONDOMINIALE perchè costringe a coniare epiteti blasfemi mentre la si scala tentando di farla tutta di un fiato o la classica Flaminia dove oltrepassato il distributore con la svolta a SX si rientra dalla missione. In ogni caso le vedute che si godono dalla via sopra Roveto oltre agli uliveti mostra una toponomastica mozzafiato che è bene assimilare e valorizzare e non abbiamo riscontrato nemmeno ingorghi onomatopeici di insetti e puzzette varie e assortite. L’ennesima riconferma che bicicletta e turismo costituiscono un accoppiata vincente, ben venga questo progetto chiacchierato che dovrebbe collegare FOSSATO DI VICO a Foligno con una ciclovia dedicata! Come al solito nel taccuino del viaggiatore Umbriaway Consulting devono comparire spunti e riflessioni per approfondire e conoscere il territorio (profilo storico-geografico) con altre missioni: ma questa strada che collega Boschetto direttamente a Colle San Angelo e quell’ altra diramazione verso vocabolo Rigali? Inosmma per la tipologia di percorso variegato del manto stradale F2 potrebbe funzionare un famoso aforisma di Herman Hesse: “la musica si fonda sull’armonia fra cielo e terra, sulla concordanza fra il torbido e il chiaro”.

Sono anni che programmo in Ajax disse il candidato. Avanti il prossimo rispose il selezionatore!

Ajax non è un linguaggio di programmazione: ecco spiegato il motivo perchè l’ennesimo Head Hunter abbia deciso di tagliare corto e non perdere tempo proseguendo la selezione. Ma come, cercate di abbozzare voi, io come programmatore esperto Senior di Ajax posso aggiornare una pagina Web senza ricaricare la pagina, posso richiedere dati da un server dopo che la pagina è stata caricata, posso ricevere dati da un server dopo che la pagina è stata caricata e inviare dati a un server in background. Ma ormai il danno è fatto perchè Ajax è solo un oggetto del browser il cui acronimo sta a significare AJAX = JavaScript asincrono e XML, è un oggetto quindi che permette comunicazioni asincrone ma non é un linguaggio di programmazione: utilizza solo una combinazione di XMLHttpRequest incorporato nel browser (per richiedere dati da un server Web) e JavaScript e HTML DOM (per visualizzare o utilizzare i dati). Certo è anche fuorviante perché le applicazioni AJAX potrebbero utilizzare XML per trasportare dati, ma è altrettanto comune trasportare altro come formato JSON per esempio. Il meccanismo di Ajax è semplice: ci sono due tennisti, uno serve, l’altro al di là della rete pronto a rispondere. Quando la palla passa la rete la richiesta del primo tennista si trasforma in risposta per l’altro che a sua volta battendo la palla invia i dati con una COMUNICAZIONE SINCRONA, costringendo al rendering della pagina e al blocco di risorse quindi. Ma Ajax è una magia come le palle tirate da Federer, per cui quando a fondo campo si ritrova a rispondere fa un colpo assurdo: anzichè mandare la palla dall’ altra parte, sembra sparare un colpo che va fuori dal campo, poi vediamo la palla impennarsi lontano e ricadere infine a terra svincolandosi dal perimetro di gioco rientrando misteriosamente in campo cadendo dal cielo e toccando l’incrocio delle linee avversarie. Vediamo il progetto di studio ispirato dalla bibbia di tutti gli sviluppatori, il sito https://www.w3schools.com/ . Sfruttando la versatilità di un componente che viene riconosciuto dagli sviluppatori come ACCORDION, all’ indirizzo https://www.farwebdesign.com/projectajax/ nella prima voce LOAD TEXT, abbiamo un caso reale: https://www.farwebdesign.com/projectajax/loadtxt.html. Analizziamo il contenuto del BODY:

<div id=”demo”>
<h1>The XMLHttpRequest Object</h1>
<button type=”button” onclick=”loadDoc()”>Change Content</button>
</div>

<script>
function loadDoc() {
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
document.getElementById(“demo”).innerHTML =
this.responseText;
}
};
xhttp.open(“GET”, “ajax_info.txt”, true);
xhttp.send();
}

l’oggetto viene istanziato con variable = new ActiveXObject(“Microsoft.XMLHTTP”); a questo punto abbiamo a disposizione come allegato diversi metodi e diverse proprietà come evidenziato dalle immagine incluse. Per inviare una richiesta a un server, utilizziamo i metodi open () e send () dell’oggetto XMLHttpRequest per trasportare dati come testo semplice o testo JSON. AJAX consente alle pagine Web di essere aggiornate in modo asincrono scambiando dati con un server Web dietro le quinte. Ciò significa che è possibile aggiornare parti di una pagina Web, senza ricaricare l’intera pagina:

xhttp.open(“GET”, “ajax_info.txt”, true);
xhttp.send();

In questo esempio l’oggetto istanziato xhttp riceve una richiesta dopodichè una funzione verifica se si stabilisce il collegamento dati e se ci sono errori nella pagina, dopodichè se tutto a posto il contenuto della pagina viene caricato in RISPOSTA sul blocco divisore identificato come identificativo unico ID=”DEMO”. Fine della fiaba. A questo punto sorgono molti interrogativi tipo: ma è meglio spedire i dati in GET o in POST? E soprattutto le richieste devono per forza indirizzarsi sui file testo come risorsa? No, vediamo ad esempio che xhttp.open(“GET”, “demo_get.asp”, true); xhttp.send(); é una semplice richiesta GET che punta a una pagina ASP che dall’ altra parte evidentemente farà qualcosa. Vediamo che posso anche spedire dati sulla URL con xhttp.open(“GET”, “demo_get2.asp?fname=Henry&lname=Ford”, true); xhttp.send(); per esempio. O anche posso fare richieste in POST con xhttp.open(“POST”, “demo_post.asp”, true); xhttp.send(); dove potrebbe sorgere la domanda critica: ma adesso come faccio a spedire i dati  coppie nome/valore come facevo con il GET usando i punti interrogativi? Niente paura Ajax lo può fare con la sequenza di istruzioni xhttp.open(“POST”, “demo_post2.asp”, true); xhttp.setRequestHeader(“Content-type”, “application/x-www-form-urlencoded”); xhttp.send(“fname=Henry&lname=Ford”); il dio AJAX alla fine della fiera inviando in modo asincrono con JavaScript non deve attendere la risposta del server, ma può invece eseguire altri script in attesa della risposta e gestire il tutto quando i dati sono impacchettati! Adesso usiamo uno script che impiega una funzione per rispondere, esempio LOAD TEXT FUNCTION presente nel progetto all’ indirizzo https://www.farwebdesign.com/projectajax/loadtxtfunction.html:

<div class=”topnav”>
<a class=”active” href=”index.html”>Home</a>
<a href=’txt/loadtxtfunction.txt’ target=’_blank’>download example</a>
</div>

<div id=”demo”>
<h1>The XMLHttpRequest Object</h1>
<button type=”button” onclick=”loadDoc()”>Change Content</button>
</div>

<script>
function loadDoc() {
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
document.getElementById(“demo”).innerHTML =
this.responseText;
}
};
xhttp.open(“GET”, “txt/ajax_info.txt”, true);
xhttp.send();
}
</script>

Con l’oggetto XMLHttpRequest è possibile definire una funzione da eseguire quando la richiesta riceve una risposta. La funzione è definita nella proprietà onreadystatechange dell’oggetto XMLHttpResponse. Posso anche disabilitare true e portarlo a falso per rendere la chiamata SINCRONA per esigenze di lavoro, del tipo che dobbiamo ricaricare la pagina con il rendering per vedere la differenza con quella asincrona per esempio, ossia quando Federer deve rispondere a un servizio tirando la palla direttamente dall’ altra parte senza liberare il colpo della scuola di Hokuto che abbiamo visto sopra. Ma attenzione il FALSE non è raccomandato perché JavaScript si interromperà fino a quando la risposta del server non sarà pronta. Se il server è occupato o lento, l’applicazione si bloccherà o si arresterà. XMLHttpRequest sincrono è in procinto di essere rimosso dallo standard Web, ma questo processo può richiedere molti anni. I moderni strumenti di sviluppo sono incoraggiati a mettere in guardia sull’utilizzo di richieste sincrone e possono generare un’eccezione InvalidAccessError quando si verifica.


CONCLUSIONI
: alla fine del tutorial ispirato dal bellissimo sito di supporto didattico https://www.w3schools.com/, abbiamo capito che la risposta da dare al selezionatore al prossimo colloquio non è programmo in Ajax da tanti anni, ma quella corretta conosco le chiamate asincrone Ajax e so destreggiarmi con chiamate post e get se serve implementare questa situazione nei mie progetti. in uno dei prossimi articoli di approfondimento con Umbriaway Consulting vedremo le funzioni di callback, ossia una funzione passata come parametro a un’altra funzione. Se in un sito Web sono presenti più attività AJAX, è necessario creare una funzione per l’esecuzione dell’oggetto XMLHttpRequest e una funzione di richiamata per ciascuna attività AJAX. La chiamata di funzione deve contenere l’URL e quale funzione chiamare quando la risposta è confezionata e pronta per essere rispedita al mittente.

Piacere sono Docker, faccio nascere container!

Docker risolve un problema pratico: mai capitato di passare da un ambiente di test in locale in cui il software gira meravigliosamente bene a uno di produzione in cui subentrano i problemi? La traduzione di docker non è certo idilliaca ma sta ad indicare che fa sempre il suo di lavoro sporco quello più impegnativo ed efficace. Un container è un ambiente di esecuzione per una singola applicazione, un luogo concettualmente perfetto perchè isolato, ottimizzato, in ultima analisi efficiente perché richiede solo il minimo delle risorse indispensabili. Le macchine sono diverse, i sistemi operativi anche e non sempre quando si passa l’applicazione al cliente tutto funziona alla grande. Spostare le applicazioni dal luogo di nascita all’ ambiente di produzione non è sempre una operazione a lieto fine. A questa necessità risponde Docker, lo scaricatore di porto dalla concezione a container. Le macchine virtuali potrebbero risolvere? Virtualizzazione vs containerizzazione! Si ma hanno anche degli svantaggi come operazioni di mantenimento dell’ ambiente che non è fisso ma richiede cura attenzioni e aggiornamenti. Non solo le macchine virtuali assorbono tantissime risorse a livello di RAM! I container invece sono simili alla grafica vettoriale minimalista alla Carver: c’è solo quello che serve ridotto ai minimi termini, massima efficienza con poca benzina! La macchina virtuale astrae l’hardware, il container astrae il sistema operativo come una vaso di terra bagnata che ospita il seme di una piantina. Anche le macchine virtuali e i container possono convivere e spesso queste soluzioni si mettono in atto. Docker ottimizza al massimo l’esportazione e la gestione di applicazioni. Poi può segmentare software monolitici per migliorare le prestazioni. Si tratta di un progetto open source che nasce nel 2013 scritto in GO. Linux è il suo ambiente culla nativo, ma parliamo comunque di una soluzione multipiattaforma che abbraccia windows, MacOs e Linux, macchine desktop e server, piattaforme Cloud, Datacenter. Docker viene fornito in due versioni, la comunity edition e la enterprise edition, dove nella seconda si abbracciano funzionalità più ampie e articolate per le aziende di grandi dimensioni. Il centro nevralgico della tecnologia è Docker Engine che contiene due componenti un docker client e il docker server separato da un hamburger costituito da REST API. L’installazione è intuitiva, si procede con l’installer e al termine si avvia il servizio. Per Windows si usa Docker for Desktop e occorre Windows 10 Pro, abilitazione alla virtualizzazione perchè una parte di RAM va assegnata al programma. Per linux ci sarà un docker.dmg come estensione di file per l’installazione in ogni caso esiste un ampia documentazione per districarsi tra i vari sistemi. Per verificare se l’installazione ha avuto successo è interrogare il sistema per sapere quale versione di docker abbiamo a disposizione con il comando docker –version oppure anche docker version che ci offre un output decisamente più abbondante. I due comandi sono molto diversi perchè nel primo caso chiediamo qualcosa di specifico con i due trattini, ma nel secondo caso non abbiamo passato nessuna opzione e quindi chiesto complessivamente con chi avremo a che fare. Il sistema nel secondo comando ci mostrerà molte informazioni e in particolare sul client docker engine e il server docker engine. Dopo aver effettuato la prova ZERO con la version in due modalità diverse, proviamo un container di prova. Usiamo il comando docker container run hello-world, il primo gradino valido per tutti i software gestiti da shell. Il comando è intuitivo perchè RUN chiarisce bene quello che vogliamo fare (aho esegui il programma!). Questo container viene messo a disposizione dal programma come prova inserita appositamente a sistema. Il comando genererà molto output perchè simula il ciclo di vita di un container, dall’ istanza come immagine, la macchina non vede l’istanza e quindi noi scarichiamo l’immagine dal repository (magazzino di risorse) e il tutto viene materializzato a video! A questo punto il nostro container è stato attivato, anche se in questa prima prova pratica non abbiamo interagito di fatto con l’ambiente ma visualizzato solo l’output con le sue invocazioni del client fino alla nascita effettiva del container.

link utili:

https://www.docker.com/

https://linuxcontainers.org/

https://github.com/rkt/rkt

https://docs.microsoft.com/en-us/virtualization/windowscontainers/about/

https://get.docker.com

Imparare le classi in PHP in cinque minuti, seconda puntata

web developer umbriaImpossibile imparare le classi in cinque minuti. Tuttavia abbiamo capito in pochi secondi anche occhieggiando a https://umbriawaydesign.wordpress.com/2020/04/20/diventa-esperto-in-cinque-minuti-con-php-e-la-programmazione-orientata-agli-oggetti/ che le classi usando una metafora divina sono frutto di un dio primordiale che è intenzionato a creare fiori, alberi, persone, animali, location e tutto quello che è creabile quindi l’intero infinito. Ma la mente umana per racchiudere una idea ha bisogno di insiemi e perimetri e luoghi chiusi quindi ecco le classi. Dentro non ci trovo una divinità ma solo una definizione di categoria fatta di metodi e proprietà. I metodi sono semplici funzioni che hanno un nome, accettano parametri in ingresso e restituiscono qualcosa. Le classi dovranno essere autonome e proteggere e gestire tutto il loro patrimonio interiore. Ecco una prima illuminazione: all’ interno delle classi trovo fattibile tutto quello che funziona nel procedurale, per cui uso di variabili per definire le proprietà, uso delle funzioni per trasformarle in metodi etc etc. Vediamo ad esempio il famoso esempio precedente riadattato per capire che le normali operazioni che svolgevamo prima non ci sono precluse. Ipotizziamo di voler fare dei confronti tra GM partecipanti a un torneo. Ossia di stampare a video dei messaggi legati all’ età dei partecipanti facendo dei confronti con delle istruzioni condizionali, quindi riadattiamo il nostro codice rispetto alle esigenze presenti in https://umbriawaydesign.wordpress.com/2020/04/20/diventa-esperto-in-cinque-minuti-con-php-e-la-programmazione-orientata-agli-oggetti/ e facciamolo diventare sempre tra i tag di apertura e chiusura di PHP:

class gm
{
public $nome;
public $cognome;
public $eta;
}

$gm=new gm();
$gm->nome=”Fabiano”;
$gm->cognome=”Caruana”;
$gm->eta=27;

$altrogm=new gm();
$altrogm->nome=”Peter”;
$altrogm->cognome=”Svidler”;
$altrogm->eta=59;

if ($gm->eta > $altrogm->eta)
echo “$gm->nome maggiore di $altrogm->nome”;
elseif ($gm->eta < $altrogm->eta)
echo “$gm->nome minore di $altrogm->nome”;
else
echo “$gm->nome e $altrogm->nome sono coetanei”;

questa comparazione fa parte dei normali flussi presenti nelle istruzioni condizionali ossia si fa un confronto di età tra due partecipanti e si cerca la soluzione a una domanda che potrà avere tre risposte: nel caso reale presentato a video con http://phptester.net/ vedrò:

Fabiano minore di Peter //(risultato 1)

proviamo a livello sperimentale a dire che Peter ha 27 anni, a video vedrò

Fabiano e Peter sono coetanei //(risultato 2)

stessa verifica potrei farla invertendo le età dell’ esperimento originario per ottenere quindi:

Peter minore di Fabiano //(risultato 3)

A questo punto potrebbero sorgere dei dubbi con domande lecite: ma questi due oggetti che io ho creato, sono completamente diversi anche se hanno le stesse proprietà? Certo! Ho istanziato due oggetti che hanno due nomi diversi anche se arrivano dalla stessa idea divina platonica (ossia la classe gm) e che FISICAMENTE OCCUPANO DUE SPAZI DI MEMORIA quindi DIVERSI. Alla domanda: ma se io volessi personalizzare l’oggetto lo posso fare? Proviamo in pratica, cioè voglio che nel caso di Caruana mi servisse un numero di telefono come recapito, mentre nel caso di Svidler voglio vedere solo una mail di contatto, lo posso fare ? Vediamo nella pratica modificando il codice e vedendo il risultato come di consueto in http://phptester.net/

class gm
{
public $nome;
public $cognome;
public $eta;
}

$gm=new gm();
$gm->nome=”Fabiano”;
$gm->cognome=”Caruana”;
$gm->eta=27;
$gm->cellulare=”334 – 1234589″;

$altrogm=new gm();
$altrogm->nome=”Peter”;
$altrogm->cognome=”Svidler”;
$altrogm->eta=59;
$altrogm->email=”svid.pet@gmail.com”;

printf(” $gm->nome $gm->cognome ha come cellulare il numero $gm->cellulare”);
printf(“<br>”) ;
printf(“$altrogm->nome $altrogm->cognome ha $altrogm->email”);

a video vedrei se non ho commesso errori legati alla sintassi con i punti e virgola e se ho scritto bene il nome delle proprietà (ad esempio si veda cosa succeda se al posto di email richiamassi mail) questo risultato:

Fabiano Caruana ha come cellulare il numero 334 – 1234589
Peter Svidler ha svid.pet@gmail.com

ok, da questi esempi se ne deduce che quello che facevamo prima in precuderali qui si può fare comunque. Ipotizziamo adesso di dover inserire un secondo numero di cellulare di Caruana come faccio? Bene allora all’ interno della classe GM vado a definire dunque un array con: public $recapitiTel=array(); e poi inserirò i valori variegati nell’ oggetto istanziato di riferimento. Il tutto diventa quindi:

class gm
{
public $nome;
public $cognome;
public $eta;
public $recapitiTel=array();
}

$gm=new gm();
$gm->nome=”Fabiano”;
$gm->cognome=”Caruana”;
$gm->eta=27;
$gm->recapitiTel[0]=”3341234589″;
$gm->recapitiTel[1]=”3311534787″;

$altrogm=new gm();
$altrogm->nome=”Peter”;
$altrogm->cognome=”Svidler”;
$altrogm->eta=59;
$altrogm->email=”svid.pet@gmail.com”;

var_dump($gm);
printf(“<br><hr>”);
printf(“$gm->nome $gm->cognome ha %d recapiti telefonici”,
count($gm->recapitiTel));

il risultato a video dopo aver impostato il var_dump sarà il seguente:

object(gm)#1 (4) { [“nome”]=> string(7) “Fabiano” [“cognome”]=> string(7) “Caruana” [“eta”]=> int(27) [“recapitiTel”]=> array(2) { [0]=> string(10) “3341234589” [1]=> string(10) “3311534787” } }
________________________________________________________
Fabiano Caruana ha 2 recapiti telefonici

Javascript e la modellazione degli array: ovvero quando non sai quale GM invitare al prossimo torneo di scacchi che si terrà a Nocera Ombrosa

web developer UmbriaGli armadi e i cassetti in essi contenuti pieni di dati che formano un array si possono analizzare, modellare e modificare dinamicamente. Javascript mette a disposizioni molti metodi utili per individuare elementi di un array, separarli, aggiungere dati e rimuoverli in cima o in testa all’ armadio etc etc. Si tratta di prendere familiarità con questi metodi prima di poter dare una risposta alla domanda del titolo nella nostra esercitazione finale: posso invitare qualche GM al mio prossimo torneo di scacchi ma quali tra loro mi assicurà più risonanza pubblicitaria visto che devo ospitarli a mie spese? Vedremo di affrontare questa spinosa questione nella parte finale, al momento limitiamoci a risolvere questioni secondarie, mattoni che se risolti consentono di mettere in piedi autentici grattacieli. Primo quesito: come faccio a stampare i dati a video? Evocando il nome dell’ array dal nostro metodo di stampa.

// inizio script

var numeri= [12, 6, 9, 32, 14, 9, 5];

document.write(numeri);
document.write(“<br><br>”);

in questo modo a browser vedrò tutta la mia lista di soldatini allineati partendo da INDICE ZERO. Se volessi sapere quale indice contrassegna per esempio l’informazione racchiusa nel numero nove, posso capire in quale cassetto di memoria ho archiviato il nostro dato? Si usando il metodo dell’ oggetto array indexOf

document.write(“Indice di 9 … “+numeri.indexOf(9));
document.write(“<br><br>”);

in questo modo dopo aver mandato in esecuzione il codice a video ottengo due, visto che si inizia a contare da zero quindi vedrò il mio bel Indice di 9 … 2 come risultato finale. E se dovessi cercare l’indice di un dato inesistente?

document.write(“Indice di 87 … “+numeri.indexOf(87));
document.write(“<br><br>”);

riceverei un bel -1 come risposta che equivale a falso. Se volessi separare tutto il contenuto dei cassetti con un separatore come faccio? Usando il metodo join:

document.write(numeri.join(” ; “));
document.write(“<br><br>”);

in questo modo ottengo 12 ; 6 ; 9 ; 32 ; 14 ; 9 ; 5. Ipotizziamo ora di trovarci nella necessità di aggiungere un elemento all’ inizio del nostro array, come faccio? Usando il metodo unshift

numeri.unshift(77);
document.write(numeri);
document.write(“<br><br>”);

ottenendo 77,12,6,9,32,14,9,5

e se volessi rimuovere l’ultimo elemento inserito lo posso fare? Si con shift()

numeri.shift();
document.write(numeri);
document.write(“<br><br>”);

tornando alle condizioni originarie con 12,6,9,32,14,9,5 Ma posso anche concatenare delle stringhe? Certo con concat:

var altroNumeri = [112, 99, 7, 28];
document.write(numeri.concat(altroNumeri));
document.write(“<br><br>”);

ottenendo a video: 12,6,9,32,14,9,5,112,99,7,28

e se volessi filtrare i dati che so magari tirare fuori solo i numeri pari che una volta divisi per due danno come resto zero? Uso il metodo filter in combinazione con l’operatore matematico %:

pari = numeri.filter(function(e) {return e%2 == 0; });
document.write(pari);
document.write(“<br><br>”);

per ottenere a video 12,6,32,14 . E se volessi raddoppiare il valore dell’ array di partenza?

raddoppiati = numeri.map(function(e) {return e*2; });
document.write(raddoppiati);
document.write(“<br><br>”);

ottenendo a video 24,12,18,64,28,18,10 rispetto all’ originale 12,6,9,32,14,9,5 . Se volessi invertire i valori dell’ array lo posso fare con il metodo reverse():

document.write(numeri.reverse());
document.write(“<br><br>”);

ottenendo a video 5,9,14,32,9,6,12 . Con le ultime versioni di ecma script abbiamo anche includes per capire se un elemento esiste o meno, utilizza il booleano per dire se un numero esiste con TRUE oppure no (False)

document.write(numeri.includes(32));
document.write(“<br><br>”);

darà vero , mentre

document.write(numeri.includes(329));
document.write(“<br><br>”);

stamperà falso. A questo punto dobbiamo investigare il modo in cui questi dati vengono ciclati e con quali numerose risorse messe a disposizione da JS. Vediamo quindi il caso di partenza di un ciclo normale con while e stampa verticale con l’aggiunta del tag <br>:

var numeri = [12, 6, 9, 32, 14, 9, 5];
document.write(numeri);
document.write(“<br><br>”);

che stamperà a video quello visto sopra cioé 12,6,9,32,14,9,5 . Per mettere in moto il ciclo utilizzo una variabile contatore da incrementare in sincronia con l’operatore di incremento ++ che faràù scorrere tutto l’array fino a quando si verificherà la condizione di false, ossia quando la lunghezza degli elementi finisce:

cont = 0;
while (cont<numeri.length)
document.write(numeri[cont++]+”<br>”);
document.write(“<br><br>”);

A video vedrò quello di cui sopra solamente esteso verticalmente

Avrei anche potuto scrivere diversamente usando la formula classica inizializzazione, condizione incremento usando FOR al posto del WHILE:

for (i=0; i<numeri.length; i++)
document.write(numeri[i]+”<br>”);
document.write(“<br><br>”);

e nel browser vedrei quanto sopra, oppure per tottenere lo stesso risultato potrei semplificarmi ulteriormente la vita con:

for (n in numeri)
document.write(numeri[n]+”<br>”);
document.write(“<br><br>”);

per ottenere lo stesso effetto o ancora sempre con lo stesso scopo:

for (n of numeri)
document.write(n+”<br>”);
document.write(“<br><br>”);

e se proprio mi sento un purista del codice potrei ciclare il tutto su una riga di codice usando una e ad indicare l’elemento da scorrere come argomento di una funzione:

numeri.forEach( function(e){document.write(e+”<br>”);} );

insomma a questo punto possiamo tornare alla nostra questione iniziale. Sono l’organizzatore di un grande torneod i scacchi e per dare risonanza all’ evento posso far soggiornare a mie spese tre forti GM che serviranno a creare risonanza pubblicitaria, con quale criterio scelgo questi fortunati nomi? Supponiamo di avere questo array di nome grandimaestri che contiene al suo interno il nominativo e il cv di conoscenze che li hanno resi famosi:

var grandimaestri= [
{ nominativo:”Magnus Carlsen”,
competenze: “aperture indiane, partita di re, partita ortodossa”},
{ nominativo:”Ivan Sbrodolov”,
competenze: “berlinese”},
{ nominativo:”Michele Godena”,
competenze: “svesnikov, arcangelo, partita di donna”},
{ nominativo:”Miriam Rossi”,
competenze: “owen”},
{ nominativo:”Eva Bianchi”,
competenze: “pirc”},
{ nominativo:”Fabiano Caruana”,
competenze: “benoni, francese, reti”},
];

ora supponiamo che vogliamo invitare solo i grandi maestri che hanno più conoscenze consolidate nell’ ambito della teoria delle aperture e che decidessimo di invitare solo quei giocatori famosi per conoscere almeno tre aperture diverse. Va da sè che chi nel nostro elenco ha solo una competenza verrà automaticamente scartato dalla nostra selezione, quindi applicherò filtri e cicli per risolvere il dilemma, mi creerò una variabile contenitore battezzata selezionati e applicando un metodo filter tipico dell’ oggetto array andrò a farmi ritornare il valore dell’ argomento e (che sta per elemento dell’ array) splittato da una virgola e che segua il criterio dell’ almeno tre competenze:

selezionati = grandimaestri.filter(
function (e)
{
return e.competenze.split(“,”).length>=3;
}
);

dopodichè usando i cicli visti in precedenza posso stampare a video questi fortunati per contattarli:

selezionati.forEach(
function(e)
{
document.write(e.nominativo+”<br>”);
}
);

mandando in esecuzione a video il nostro script mi ritroverò la soluzione di tutti i miei dilemmi esistenziali, ossia le tre persone da contattare per invitarle a giocare il nostro torneo pagando loro le spese di soggiorno, dopo aver escluso quei GM che avevano poche competenze nel loro curriculum vitae:

Magnus Carlsen
Michele Godena
Fabiano Caruana

VUE JS: template, interpolazione, direttive, stili, data binding, istruzioni condizionali, booleani

Vue JS sulla presentazione della pagina offre un modo semplice per separare contenuto dal contenitore offrendo una semplificazione nella gestione del codice. All’ interno del body della pagina HTML statica ci basta identificare un DIV con un ID in questo modo:

<body>
<div id=”myapp”>
<!– Vue –>
</div>
https://cdn.jsdelivr.net/npm/vue/dist/vue.js
http://index.js
</body>

ora per creare il template mi basta evocare il metodo template dal costruttore richiamando la zona di interesse per l’aggancio sotto i DATA e i METHODS quindi per la nostra applicazione di apprendimento didattico https://www.farwebdesign.com/vue/app/ avremo nel nostro file JS esterno una situazione del tipo:

……………………………………..
template: `
<section class=”todoapp”>
<header class=”header”>
<h1>todos</h1>
<input @input=”handleEvent” class=”new-todo” autofocus autocomplete=”off” placeholder=”What needs to be done?”>
</header>
<section class=”main”>
<ul class=”todo-list”>
<li class=”todo”>
<div class=”view”>
<input class=”toggle” type=”checkbox”>
<label>{{todos[0].title}}</label>
<button class=”destroy”></button>
</div>
</li>
<li class=”todo”>
<div class=”view”>
<input class=”toggle” type=”checkbox”>
<label>{{todos[1].title}}</label>
<button class=”destroy”></button>
</div>
</li>
<li class=”todo”>
<div class=”view”>
<input class=”toggle” type=”checkbox”>
<label>{{todos[2].title}}</label>
<button class=”destroy”></button>
</div>
</li>
</ul>
</section>
</section>
`
});

Sostanzialmente TEMPLATE insieme a DATA e METHODS è un attributo dell’ oggetto istanziato dal costruttore che ci consente di creare applicazioni pulite senza alterare anche la parte graqfica con i CSS. A questo punto diamo un occhiata elle interpolazioni, ossia al modo in cui VUE scrive le nostre cose sulla pagina. In un primo esempio abbiamo capito che all’ interno delle due graffe possiamo scrivere qualsiasi cosa, dei dati, un messaggio, una istruzione di controllo con un operatore ternario e molto altro tipo evocare delle funzioni dichiarate all’ esterno. Vediamo esempi di interpolazione dati:

{{messaggio}}
la forma più elementare di messaggio

{{todos[0].title}]
una semplice espressione javascript richiama l’attributo titolo presente nel primo elemento contrassegnato da posizione o indice zero dell’ array. Da notare che potrei banalmente scrivere anche {{2+2}} per ottenere un valore 4.

{{stampaCinque()}}
qui richiamo un metodo inscritto proprio nella sezione METHODS dell’ oggetto istanziato in VUE che mi ritorna un valore 5, ne consegue che la nostra funzione richiamata fuori dall’ HTML sarà del tipo:

stampaCinque() {
return5
}

<label>{{false ? “ok” : “ko”}}</label>
esempio di operatore ternario dove si può scegliere una delle due opzioni in base alla verità o alla falsità dell’ espressione indicata

<label>{{ ‘message’.split(”).reverse().join(”) }}</label>
dove una semplice stringa come per esempio MESSAGGIO viene stampata al contrario come OIGGASSEM

naturalmente ci sono delle eccezioni come per esempio var a = 1 all’ interno delle doppie graffe manderebbe in tilt il framework.

Se volessi modificare dinamicamente un valore di un attributo tipo la proprietà AUTOFOCUS da off a on del campo INPUT come dovrei fare? Bisogna introdurre l’uso delle DIRETTIVE, nel senso che nel campo DATA definisco una variabile autofocus inizializzata a un valore che poi verrà richiamata automaticamente nella parte dei tag INPUT tramite la nostra direttiva V-BIND (bind sta per collegamento dati). VUE JS contempla anche una scorciatoia per la sintassi V-BIND si può più semplicemente sostituire con i due punti che sono equivalenti. Grazie alla direttiva V-BIND posso anche crearmi nel campo DATA una classe dinamica con più valori tramite un array per esempio. Nel nostro programma il disabled è legato al cambiamento di una classe o allo stato enable/attivazione. Posso anche lasciare abilitata una variabile a TRUE nel campo data e poi cambiare lo stato con delle espressioni ternarie per esempio. Anche l’attributo :style ha la sua importanza in VUE, basterà impostare questo oggetto all’ interno del campo DATA con l’accoppiata chiave valore del tipo colore, valore. Questo serve nel caso in cui dichiarando oggetti con nomi diversi volessimo ad esempio impostare proprietà diverse dal background-color, piuttosto che al font-size etc. Poi queste dichiarazioni del campo data verranno richiamate nel punto esatto in cui si vuole ottenere l’effetto pensato.

Le basi per programmare in C#: terza puntata

All’ indirizzo https://umbriawayinfo.wordpress.com/2020/03/18/le-basi-per-programmare-in-c-seconda-puntata/ abbiamo visto in particolare i cicli e altro adesso andiamo avanti nell’ analizzare le funzionalità base offerte da questo tagliente linguaggio osservando gli armadi o i vettori o i famosi array della programmazione universale paragonabili a cassetti del nostro armadio contenenti non vestiti ma dati di ogni tipo. Questi array sono di ogni tipo, esistono anche quelli multidimensionali e un array può contenere come un vagone del treno altri array o cabine. Come gestire questi insiemi di dati? Un vettore è una grande variabile divisa al suo interno in sottovariabili se vogliamo. Il vantaggio di un vettore è che se hai una classe da gestire puoi avere il vettore classe con dentro trenta alunni con il loro valore senza dover gestire trenta variabili diverse. L’identificazione delle celle dove sono contenute le variabili avviene tramite indice e si parte da zero. Quindi se ho un armadio voti e nella prima casella memorizzo il valore di dieci per richiamare quel valore dovrò scrivere voti[0]. Ma vediamo in pratica:

qui il ciclo for gestisce un vettore di dieci caselle o variabili. Adesso facciamo un programma dove inseriti il numero di debiti avuti dagli studenti in uscita abbiamo delle risposte legate a quanti di loro saranno promossi, rimandati o bocciati.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
int[] debiti = new int[10];
int i;
int nstudenti;

Console.WriteLine(“benvenuti nel nostro programma”);
Console.Write(“inserisci il numero di studenti: “);

do
{
nstudenti = Convert.ToInt32(Console.ReadLine());
} while (nstudenti < 1);

for (i = 0; i < nstudenti; i = i + 1)
{
do
{
Console.Write(“inserisci il numero di debiti del ” + (i + 1) + ” ° studente: “);
debiti[i] = System.Convert.ToInt32(Console.ReadLine());
} while (debiti[i] < 0);

}

for (i = 0; i < nstudenti; i = i + 1)
{
if (debiti[i] > 3)
{
Console.WriteLine(“il ” + (i + 1) + ” ° studente è stato bocciato”);
}
else if (debiti[i] > 0)
{
Console.WriteLine(“il ” + (i + 1) + ” ° studente è stato rimandato con ” + debiti[i] + ” debiti”);
}
else
{
Console.WriteLine(“il ” + (i + 1) + ” ° studente è stato promosso”);
}
}

Console.ReadKey();
}
}
}

sotanzialmente con le condizioni IF gli fissiamo delle condizioni per cui se lo studente ha più di tre debiti va a casa ed è bocciato, se lo studente ha un numero di debiti che va da zero a tre è rimandato altrimenti viene promosso di default. Adesso vediamo come trovare un numero minimo e un numero massimo all’ interno di un vettore.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
int[] numeri = new int[10];
int massimo;
int minimo;
int i;
int x;
float media;

do
{
Console.Write(“quanti numeri vuoi inserire ? “);
x = Convert.ToInt32(Console.ReadLine());
}while (x > 10);

for (i = 0; i < x; i = i + 1)
{
Console.Write(“Inserisci il ” + (i +1) +” # numero: “);
numeri[i] = Convert.ToInt32(Console.ReadLine());
}

minimo = numeri[0];
massimo = numeri[0];
media = numeri[0];

for (i = 0; i < x; i++)
{
if (numeri[i]> massimo)
{
massimo = numeri[i];
}
else
{
if (numeri[i] < minimo)
{
minimo = numeri[i];
}
}
media = media + numeri[i];
}
media = media / x ;
Console.WriteLine(“il massimo é: ” + massimo);
Console.WriteLine(“il minimo é: ” + minimo);
Console.WriteLine(“la media é: ” + media);

Console.ReadKey();
}
}
}

Adesso studiamo l’istruzione switch. Facciamo un programmino dove in virtù di una scelta fatta a video il programma esegue un blocco istruzioni , in caso di zero esce dal programma e saluta, in caso di 1 l’utente avrà la possibilità di immettere due numeri e sommarli, questo si potrebbe fare facilmente con una espressione IF :

namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
int scelta;
Console.WriteLine(“Cosa vuoi fare?”);
Console.WriteLine(“0 – ti saluto”);
Console.WriteLine(“1 – faccio la somma tra due numeri”);
Console.Write(“scelgo l’opzione: “);
scelta = Convert.ToInt32(Console.ReadLine());

if (scelta == 0)
{
Console.WriteLine(“ciao”);
}
else if (scelta == 1)
{
int n1, n2;
Console.Write(“inserisci il primo numero: “);
n1 = Convert.ToInt32(Console.ReadLine());
Console.Write(“inserisci il secondo numero: “);
n2 = Convert.ToInt32(Console.ReadLine());
Console.WriteLine(“la somma é ” + (n1 + n2));
}
Console.ReadKey();
}
}
}

proviamo invece a farlo con lo SWITCH:

scelta = Convert.ToInt32(Console.ReadLine());

switch (scelta)
{
case 0:
Console.WriteLine(“ciao”);
break;

case 1:
int n1, n2;
Console.Write(“inserisci il primo numero: “);
n1 = Convert.ToInt32(Console.ReadLine());
Console.Write(“inserisci il secondo numero: “);
n2 = Convert.ToInt32(Console.ReadLine());
Console.WriteLine(“la somma é ” + (n1 + n2));
break;
}

Console.ReadKey();
}
}
}

 

 

 

Ferrovie dello stato ed emergenza pubblica: ovvero quando i decreti si fanno ma non vengono rispettati, con gravi conseguenze per la salute dei cittadini.

Che in questi giorni di coronavirus si siano create psicosi imprenscindibili e si commettano atti sconsiderati soprattutto da parte del gregge non ci piove (ad esempio ho visto un vecchietto claudicante salire su un bus e portarsi verso l’autista per parlare, ma l’autista che vedeva la linea di sicurezza oltrepassata rispondeva in modo velleitario al poveraccio che doveva stare zitto e distante senza rispondere perchè quella di stare zitti in questo periodo è una direttiva del governo Conte). Ma da qui a essere minacciati di morte soprattutto da servizi pubblici nel trasporto ce ne dovrebbe correre, invece l’esempio peggiore nell’ attuazione arriva proprio da loro che per primi dovrebbero essere esempio e modello di efficienza organizzativa. Evidentemente questi enti non hanno le risorse interne come personale per fronteggiare alcunché, ma solo per tutelare la loro di salute, quella individuale. A onor del vero la mia rabbia è rivolta verso quell’ uno per cento di dirigenti delle ferrovie dello stato che si dimostra incapace sulle scelte da compiere  per tutelare i loro clienti (e che dovrebbero retrocedere di grado quando sbagliano in maniera grave) e non certo al personale addetto che vive sul campo lo scempio quotidiano di incongruenze e direttive alle quali sono estranei e che devono solo eseguire. A questi disgraziati va solo un sentito ringraziamento anche se tra loro non possono mancare i soliti furbetti, dove i controlli in questi giorni di pandemia non vengono effettuati in maniera democratica, tanto da tutelare come è successo a me sul treno Roma-Torino stralunati passeggeri saliti sul vagone di prima classe senza biglietto e poterla fare franca fino a destinazione risparmiando 132 euro che il sottoscritto sul treno frecciarosso 9618, carrozza 3, posto 10D, ha invece pagato come prevede il copione del cittadino che acquista un bene per avere un servizio. Evidentemente le leggi non valgono per tutti, tanto che in unica conversazione finale avuta con il soggetto in questione a Porta Susa, il gaglioffo gaudente si vantava di averla fatta ai controlli, facendo dei danni non solo a me come contribuente ma allo stato dei furboni clonati avvezzi a trovare escamotage per farsi beffe delle istituzioni. Ma non è colpa loro, lo sappiamo, è colpa della globalizzazione a pozzanghere lqiuide BCE che impone alla persone che stanno dentro al flipper di trovare soluzioni ingegnose per sopravvivere, ma questa è un altra storia.
Arma letale (Lethal Weapon) è un film del 1987 diretto da Richard Donner e interpretato da Mel Gibson e Danny Glover. Potremmo paragonarlo al coronavirus. Poi venne arma letale due, film del 1989 diretto da Richard Donner e interpretato da Mel Gibson, Danny Glover e Joe Pesci che potremmo paragonare alle ferrovie dello stato. Insieme le due armi sono invincibili, ne è la dimostrazione quanto accaduto in data Venerdì 13 marzo 2020 dove per necessità contingenti e dimostrabili da uno stato di necessità con tanto di lettera del notaio dopo aver adempiuto all’ incombenza torinese ero costretto a prendere il primo treno utile per l’Umbria e cioè il devastante InterCityNotte 1575 diretto a Reggio Calabria, servizio seconda classe (la prima era spropositata con una richiesta assurda di 199 euro), carrozza 2, posto 84. La mia meta era un cambio da fare circa sei ore dopo (il treno è partito alle ore 13,23) a Firenze Campo di Marte. La mattina del tredici ero transitato presto in una Porta Nuova deserta per informarmi in anticipo sul treno che avrei dovuto prendere nel primo pomeriggio visto che in questi giorni i treni vengono cancellati improvvisamente, ma i due poliziotti allo sbarramento mi facevano presente di arrivare solo mezz’ ora prima della partenza e di prenotare tramiti dispositivi digitali, cercando di evitare il più possibile il contatto con altre fonti (ah, ha, alla luce di quello che succede poi questa è una peperlizia!). E qui inizia il nostro action-movie dove al posto dei due protagonisti poliziotti di Los Angeles ritroviamo nel tritacarne, un manipolo di sfigati giunti a loro insaputa nel luogo sbagliato e nel momento sbagliato appositamente per farsi infettare da assembramenti anomali. Certo chi poteva mai sospettare che la minaccia di infezione potenziale era esclusiva di Ferrovie dello Stato che per prima vista la delicatezza della situazione dovrebbe predisporre misure straordinarie per far rispettare la salute pubblica tanto declamata dalla direttiva Conte? Ma non tergiversiamo, atteniamoci ai fatti vostro onore. Nel mio scompartimento per le prime due ore sono in compagnia di due simpatici ragazzi che nel corso di un breve esaustivo dialogo dimostravano le loro peplessità indicando i sei numeri tutti attivi della prenotazione dello scomparto. Al primo controllo di un rubicondo controllore scopriamo che si, purtroppo tutti i posti sono occupati ma che in caso di necessità ci possiamo spostare nello scomparto a fianco e lo dice sogghignando intuendo le nostre rimostranze. Comunque le prime due ore passano tranquille con lo scomparto occupato da sole tre persone, il metro di distanza come misura cautelativa è facilmente rispettato. Origlio di nascosto la telefonata del ragazzo che chiama la nonna in zona Tiburtina per comunicargli che passerà di casa solo per prendere degli indumenti per trasferirsi a casa del padre, in modo da tutelarla da eventuali contatti. Gli dice anche sollecitato da una domanda che possiamo intuire che lo scomparto sembra destinato a riempirsi visto che l’assegnazione dei posti per prenotazione coinvolge tutti a sei le postazioni. Lasciamo la porta aperta per far circolare l’aria. Tutto viaggia in serenità fino all’ arrivo in serenità di due ragazzi indiani (o pakistani?) che muniti di mascherina occupano altri due posti nello scomparto prima di Milano. Io e i ragazzi ci guardiamo stralunati di fronte all’ ambiente che si satura anche perchè ad intervalli regolari di quindici minuti l’altoparlante continua a ripetere che in ottemperanza del decreto Conte (ah ah un’ altra barezelletta praticamente) tutti dovevano avere pronta la famosa autocertificazione accompagnata da carta di identità per eventuali controlli delle forze di polizia (una palese minaccia del tutto inattuabile, dal momento che il vagone si stava riempendo velocemente rendendo difficili anche i transiti sul corridoio senza contatti, dal momento che le persone per cercare refrigerio e sottrarsi dagli spazi chiusi si sedevano fuori cabina). Fatto sta che ripassa una controllora (chissà se me lo passa l’accademia della crusca) e convalida SENZA FARE ATTENZIONE i biglietti dei due pseudoindiani, in quanto i numero di posto erano corrispondenti (vabbè l’errore umano ci può stare non è qui che bisogna puntare il dito indice per vedere la luna). Quindi si convive in cinque per diverse ore non senza difficolta all’ interno dell’ ambiente perchè anche le possibilità di movimento vengono limitate fino a quando in zona Parma sale un lavoratore edile tra l’altro molto gentile che in seguito ci ha fornito delle mascherine che va ad occupare il sesto posto vagante, ma che per sentirsi più libero preferisce stare in piedi nel corridoio. Ottimo! Ma la gente continua a salire e a riempire gli spazi chiusi e muoversi diventa sempre più complicato a causa anche dell’ elevato numero di bagagli che ciascun passeggero porta per necessità con se. In ogni caso si arriva presto alla saturazione al contatto ravvicinato inevitabile ed esplode la bomba, quando in zona Bologna due nuovi passeggeri rivendicano un posto in cabina (una ragazza che anche lei si lamenta telefonicamente con un parente stretto di quello che sta accadendo sul treno e un personaggio robusto diretto al sud pieno di valigie pesantissime che faticano a trovare una collocazione). Si genera una situazione di tensione e deve intervenire un addetto delle FS. Una breve interlocuzione del controllore evidenzia come di fatto i posti assegnati ai due indiani erano in realtà sbagliati (non scopriremo mai se hanno fatti gli gnorri o semplicemente sbagliato la lettura del biglietto), in quanto riferiti alla carrozza NUMERO SETTE e NON alla carrozza NUMERO DUE. Dove stava con la testa la povera controllora che in precedenza li aveva ligittimati a restare nel nostro scomparto inficiando le direttive del decreto? Non solo ma a questo punto la bomba esplode e qualche dirigente dopo Bologna capendo la gravità della situazione fa passare l’ordine che solo tre passeggeri possono occupare gli spazi chiusi. Peccato che da qui in avanti succede un pandemonio nel pandemonio e viene generato da questa direttiva folle (era da inizio tratta che si doveva imporre tre soli passeggeri per scomparto ma evidentemente i soldi delle prenotazioni schifo non fanno eh? Il decreto Conte impone anche la necessità di tagliare i treni mi verrebbe da chiedere da profano?) un kaos dove le persone entrano purtoppo a contatto a prescindere, sia che indossino guanti e mascherina, sia che usino l’amuchina per le mani. Nella bolgia infernale che viene creata da dirigenti sconsiderati da rimandare in gavetta di corsa ecco che il rispetto per un decreto diventa l’occasione fertile per favorire il contagio, vive congratulazioni a tutti voi delle ferrovie dello stato. Io fortunatamente avevo solo pochi minuti per scendere (immagino lo strazio di quelli costretti a sopportare ore e ore di treno come martirio), tanto che quando mancava mezz’ ora compresso dagli spazi chiusi e caduto in sudorazione a causa della folla preferivo spostarmi verso la porta di uscita in un luogo isolato cercando di riprendermi dall’ ansia e dall’ affanno e studiare le fermate prossime. E qui mi si avvicina una stronza con tanto di spalline FS che mi dice che io lì non ptevo stare e allora gli dico guardi non mi sento bene ho bisogno di avere più aria intorno e poi sto per scendere e quella mi fa che non stavo rispettando le misure di sicurezza quando tutti intorno correvano a destra e a sinistra non senza colorite imprecazioni smistati da disorientati controllori incapaci di gestire l’emergenza sovraffollamento che si era venuta a creare. Per cinque ore mi fai viaggiare a contatto con altri buoi dentro la stalla e poi mi vieni a fare la morale l’ultima mezz’ ora sulla scorrettezza del mio comportamento? Morite tutti mi verrebe da dire. Allora mentre lei cerca di portarmi verso uno scomparto per mettere in sicurezza il corridoio dove lei deve transitare quasi trascinandomi per un braccio io faccio il movimento opposto per sottrami e gli dico in una maniera spontanea “guardi voi dovreste essere tutti denunciati” al che quella ha il tempo di guardarmi bene, valuta il mio sguardo come onesto e mi risponde con altrettanta sincerità “ha ragione”, desistendo dal suo tentativo di ficcarmi in qualche ambiente viziato (in quel momento reganava un putiferio dantesco per le nuove sistemazioni non ancora assestate con tutto il disagio annesso di scomodossime e grandi valigie che bloccavano il passaggio e obbligavano a contatti deleteri). Dopodichè quando l’ho vista allontanarsi ho pensato vuoi vedere che sta stronza adesso torna con un poliziotto per impormi di stare chiuso un quarto d’ora prima della fermata in qualche cubicolo saturo di ossigeno viziato? La stronza poi ha pensato bene di non farsi rivedere perchè forse ha visto nel sottoscritto in quel momento una rabbia pericolosamente esplosiva a ivello latente, fatto sta che come quelli che scrivono sui social andrà tutto bene, della comprensione sfoderata insita nell’ espressione della stronza “ha ragione” quasi per scusarsi del disordine provocato dalla sua azienda non so che farmene. Se i miei polmoni hanno ingerito della merda lo devo grazie alle ferrovie dello stato che in questa circostanza non aveva gli strumenti per far rispettare le direttive di salute del decreto Conte. Però questo si che è uno scoop: ammazzato da un ente pubblico che dovrebbe avere come filosofia preganante il bene per i suoi clienti! Un vero ossimoro! Non è compito mio definire se un treno possa bastare per evitare criticità negli spostamenti, immagino che ci siano molti dirigenti profumatamente pagati per risolvere questo tipo di problemi. Nel frattempo a me non resta che un vaffanculo finale che non è liberatorio, in quanto quello che ho vissuto ieri può avere gravissime conseguenze per la mia salute e quel famoso andrà tutto bene è solo retorica buonista se non viene accompagnato per primo da comportamenti responsabili da parte degli addetti ai lavori che nel servizio pubblico dovrebbero tutelare per primi la salute dei cittadini. A questo punto ci si dovrebbe aspettare l’entrata in scena di Mel Gibson che impugnando un cannone e individuati i cattivi riscatta i buoni da ogni afflizione, invece il finale del film vede solo me atterrare stralunato e pallido a Firenze campo di Marte come in quei famosi film di fantascienza degli anni sessanta, tipo VIAGGIO ALLUCINANTE, dove però l’atterraggio non avviene su un lontano pianeta alieno ricco di opportunità, ma in terra italica, dove la violazione delle leggi basiche rimane fatto primario.

PS: a diverse ore dalla scrittura dell’ articolo tutte le tessere del puzzle emergono a delineare un quadro più completo ed esaustivo, che va a integrarsi a una prima reazione emotiva dove istintivamente si è portati a dare la colpa a tizio caio o sempronio per sbollire una rabbia acquisita. Certamente il grege anche in questo caso ha maggiori responsabilità rispetto alla decisione scellerata da parte di FS di far partire il treno con i sei posti attivi a scomparto (bastava subito fissare dei paletti sanitari imponendo i tre passeggeri a cabina da Torino perchè il caos è stato generato dagli spostamenti conseguenti all’ attuazione di questa regola imposta solo da Bologna). Per contro tutta la grandissima quantità di valige che non riuscivo a spiegarmi ieri, oggi alla luce di numerosi articoli apparsi su varie testate dove si parla di nuovo esodo di massa dal nord, indica probabilmente che su quel treno viaggiavano decine e decine di dichiarazioni “leggere” non verificate (alla stazione di Torino la mia autocertificazione per esempio non mi è stata ritirata per successive verifiche). Quindi manca all’ articolo un riferimento ad arma letale tre sostanzialmente, anche se l’incipit non esclude la sua presenza. Inoltre a poche ore dal fatto sembrano delineate anche nuove strategie per impedire fughe non aturorizzate con soppressione di treni notturni.

Il ministero delle ultime ombre di Mariangela Cerrino

La Cerrino prende un sasso che non può essere levigato ma pieno di angoli e dalla struttura architettonica caotica e lo scaglia nel lago della creative-writing e che effetto provoca sui lettori del IL MINISTERO DELLE ULTIME OMBRE? Dipende. La moderna psicologia asserisce che la reazione emotiva può essere variopinta come il mondo interiore e la storia personale di chi la manifesta. La risposta è: risonanze. Un’ altra risposta potrebbe essere che i libri sono fatti di altri libri. Un’ altra risposta ancora è quella che fornisce l’autrice stessa come prologo inesplicabile: leggimi e niente sarà più come prima. Avventurandomi in questo labirinto complesso (di che genere stiamo parlando? Giallo, Thriller, Noir, Fantasy o Fantascienza ??? O forse di una sommatoria di tutti i generi citati?) saltano subito all’ occhio alcune risonanze dall opera di re king per esempio (il tema del doppio interno / esterno come nella metà oscura o la famosa novella che ha ispirato il film rear window, in cui la personalità unitaria dell’ individuo si scinde per comporre due antagonisti che hanno in mente solo la soppressione dell’ avversario o alter ego), la stessa novella di Stevenson che parla di scissione con Mr. Hide e ancora prima il Wiliam Wilson di Poe, tutte idee conflittuali dove non è raro incontrare proprio gente che viene descritta con il mestiere di scrittore. E poi la fantascienza, con le famose stringhe parallele tracciate da Evangelisti con il suo Eymerich e ancora Eco e il suo nome della rosa per la contrapposizione proposta tra i due personaggi principali, il cattivo inquisitore Janis orientato a sopprimere non solo il protagonista principale della produzione letteraria del Simon che guida l’auto narrativa con il suo alter ego che vola nel tempo Ademar de Cly. Proprio per questa enorme ricchezza il lettore ha l’impressione nelle prime pagine di perdersi in un gioco di rimandi in cui le poche pagine per descrivere il tutto (anche la meccanica quantistica, soprattutto la fisica delle particelle e dei destini potenziali) sembrano essere troppo poche e prolisse per narrare una storia dentro la storia che deve essere modificata (visto che il romanzo inizia con la fatalità della morte della famiglia di Simon, sopravvissuto per puro caso alla tragedia per una serie di circostanze fortuite che nel finale verranno fortunatamente mutate in perfetto stile Star Trek). Per chi ama la fantascienza e il fantasy e il tecnologico (Bender è davvero un cattivo che non ha nulla da invidiare ad esempio all’ efferato antagonista dell’eroe per esempio della metà oscura, e non a caso un sacco di ordigni esplosivi minacciano di fare grandi danni alla cittadina di Montreax) e tutte le idee sul tempo che si combina in diversi finali possibili implodendo tra passato presente e futuro, il libro c’è, anche perchè le descrizioni e le espressioni letterarie della Cerrino sono efficaci dal punto di vista vettoriale e rappresentano una unicità che non può essere rimandata a nessuno degli autori sopra citati che sembrano avere direttamente o indirettamente ispirato l’intera trama. Insomma se all’ inizio il giovane virgulto lettore si scoraggia perdendosi in idee letterarie che sembrano far parte di un brodino già visto (la contrapposizione tra Bernardo Gui il terribile inquisitore e Guglielmo da Baskerville scienziato della natura figlio di Bacone di echiana memoria parla da sola per esempio, in una delle tanto contrapposizioni proposte), arrivato a metà narrazione, superata indenne una fase forse un pò intrisa di pregiudizi sull’ autrice evocati da libri terzi, il tutto carbura e si combina in maniera autonoma e originale, portando via il lettore e la sua insaziabile curiosità verso un finale a lieto fine dove alla fine anche le passioni amorose vengono valorizzate. Forse siamo lieti che il famoso accelleratore di particelle del CERN scopritore del bosone di Dio, alla fine facendo cilecca, incanali tutta la storia verso un aggiustamento impossibile che minacciava di riempire di ombre definitive la Storia con la S maiuscola. La Cerrino si ama strada facendo, anche Eco alla fine parla di Bacone e rimanda a libri di altri libri e cosi fan tutti e tutte! Valutazione positiva per l’efficacia della prosa, un mix ben riuscito di fumettistica filosofica e classicismo narrativo di ampie vedute! Il Tempo è il protagonista di questa storia, un tichettare flessibile che si può incanalare verso sentieri variabili a seconda delle scelte effettuate. Originale il finale del libro, con le stesse pagine riprodotte pari pari di quelle nefaste iniziali ma con una piccola differenza che determinerà un altro futuro possibile. Quello sano, quello giusto. Voto sette anche per lo spessore della dedica finale. Sito web dell’ autrice: https://www.mariangelacerrino.it/