Android Studio, Java e Stanley Kubrick: trova le differenze

web design umbria

All indirizzo https://it.wikipedia.org/wiki/Stanley_Kubrick facciamo conoscenza più da vicino con Stanley Kubrick, non è un caso che sia stato integrato come modello conoscitivo per spiegare chi è Android Studio e cosa fa. Sappiamo che oltre ad essere uno dei registi al top nella storia del cinema, Kubrick ha anche fatto numerosi mestieri, come lo scenografo, lo sceneggiatore, il montatore video etc etc, tutte attività che ruotano intorno al mondo del cinema. L’analogia é chiara: la IDE di Android studio fa tutti questi mestieri per costruire un App nativa con java o kotlin, ossia impacchettata e organizzata così bene il codice sotto ogni punto di vista che gli manca solo la funzionalità di raccogliere ordini vocali per far risparmiare la fatica all’ umano programmatore. La verità è che comunque iniziare a programmare per fare APP NATIVE con JAVA non é facile e conoscere la forma mentis di Android Studio richiede tempo, senza contare i problemi di hardware, vedere per esempio articolo https://umbriawayvendita.wordpress.com/2020/06/03/la-donna-che-programmo-due-volte-prima-in-java-e-poi-in-kotlin-perche-android-studio-e-piu-facile-da-inquadrare-di-un-film-di-hitchcock/ dove si chiarisce che per gestire tutto fluidamente servono almeno 16 di RAM, per esempio. La prima parte di configurazione dell’ ambiente è stata risolta con l’articolo citato da web design umbria (ad esempio i processori AMD inibiscono la funzionalità di studio android di poter disporre di un device virtuale), adesso bisogna sporcarsi le mani e costruire una APP concretamente per vedere che tipo di disagio si richiede al neofita che inizia a familiarizzare con l’ambiente. La prima difficoltà è palese: java che è che si è meritato il primo posto della lista come linguaggio di programmazione, perché sicuro e adatto al modello enterprise aziendale, ha una curva di apprendimento dispendiosa e non é certo javascript come approccio, accomodarsi alle sue grazie non si ottiene con uno schiocco di dita anche perchè è il RE del paradigma OOP. Imparare Java è la prima difficoltà da superare e non è semplicissimo, analizziamo il seguente codice:

package eu.umbriaway.greatkubrick;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}

public void esaltami (View v)
{
EditText et= (EditText) findViewById(R.id.kubrick);
Toast.makeText (this, “Great cult movie ” +et.getText().toString(),Toast.LENGTH_LONG).show();
}
}

web design umbriaA un primo impatto è come per Champollion decodificare i geroglifici, si vedono delle cose già abbastanza complicate come un ogetto che viene esteso con una classe su un figlio (AppCompatActivity) che eredità tutti i metodi principali e che ha potere di sovrascriverli con un @ovverride; ci vorrebbe una stele che semplifica il lavoro di criptazione! Forse l’unica cosa che si capisce è che chi ha fatto questa prima applicazione mobile sta lavorando su Kubrick per esaltarne il suo genio creativo con un activity che prende in ingresso una informazione immessa dall’ utente per restituirla tale e quale con qualche modifica in mezzo a un componente TOAST che nel mondo android è un metodo che spedisce a video un messaggio istantaneo. In sostanza il lavoro per mettere in piedi una APP primordiale è la prima volta duplice e ricorda un atleta che fa sollevamento pesi e che carica il suo fardello in due fasi distinte: da un lato cerca di sollevare il tutto da terra prima dell’ ultimo sforzo, poi raccoglie le energie e sincronizza il respiro per sollevarsi in posizione eretta e portare il peso in verticale sopra la testa. web design umbriaAnche noi dobbiamo procedere con questa logica: prima installare quello che serve, poi configurare l’ambiente con SDK e ADV in modo da avere anche un telefonino grafico per vedere come reagisce il nostro codice scritto e infine aprire un progetto, aprire la prima interfaccia grafica che vedrà l’utente appunto inserendo una nuova activity empty, poi collegare anche a questa activity la parte di codice java, il tutto senza dimenticare alcune sfumature: ad esempio quando si crea l’activity bisogna ricordarsi di fleggare in MainActivity presente nel file AndroidManifest.xml che è responsabile dell’ inclusione dei layout poi in fase di visualizzazione. Alla fine la nostra applicazione che cosa deve fare di fatto: saluta all’ inizio e dice qualcosa, poi propone al regista di segnalare il suo film migliore dopodichè la sua risposta sarà catturata in un contenitore variabile e riutilizzata come valore per estrapolare una frase simbolica tramite un COMPONENTE TOAST che ha la particolarità di lanciare un messaggio a video TEMPORANEO che può essere breve o lungo (qui abbiamo utilizzato la seconda cioé il metodo Toast.LENGTH_LONG ), solo per vedere se questa prima finalizzazione andrà in porto l’onere di costruire la prima APP come fa l’atleta con i pesi arrivando sul podio. Quindi quali elementi abbiamo bisogno di materializzare come prima APP? Lasciamo parlare direttamente l’activity_main presente nelle risorse alla voce layout:

<?xml version=”1.0″ encoding=”utf-8″?>

<LinearLayout xmlns:android=”http://schemas.android.com/apk/res/android&#8221;
android:layout_width=”match_parent”
android:layout_height=”match_parent”
android:orientation=”vertical”
android:padding=”20dp”>

<TextView android:layout_width=”wrap_content”
android:layout_height=”wrap_content”
android:textSize=”20sp”
android:text=”@string/text”
android:layout_gravity=”center_horizontal” />

<EditText android:layout_width=”150dp”
android:layout_height=”wrap_content”
android:textSize=”20sp”
android:id=”@+id/kubrick”
android:layout_gravity=”center_horizontal” />

<Button
android:layout_width=”wrap_content”
android:layout_height=”wrap_content”
android:layout_gravity=”center_horizontal”
android:onClick=”esaltami”
android:text=”Frasi Mitiche!” />

</LinearLayout>

Abbiamo quindi un LinearLayout, un componente TextView, un altro che riceverà i dati da memorizzare che si chiama EditText e servirà anche un pulsante BUTTON che farà il lavoro sporco utilizzando un evento da intercettare con il metodo onClick che metterà in moto una funzione che si chiama “esaltami” che vista in dettaglio suona come vista prima così:

public void esaltami (View v)
{
EditText et= (EditText) findViewById(R.id.kubrick);
Toast.makeText (this, “Great cult movie ” +et.getText().toString(),Toast.LENGTH_LONG).show();
}

ossia c’è una funzione pubblica che con il metodo VOID che richiama la superclasse View come argomento e che ritorna un valore di ritorno che è composto dalla invocazione della casella di testo et, variabile presente nell’ activity agganciata tramite un ID che va a pescare nella classe R identificativo id la risorsa di nome kubrik che dall’ altra parte , sull’ interfaccia grafica è dichiarata come android:id=”@+id/kubrick”. Ok respira , respira pensò l’atletà! Dopodiché l’istruzione seguente non fa altro che utilizzare il valore memorizzato per formare una stinga composita che viene materializzata in un FUGACE post. Quindi in realtà la difficoltà di tutta questa APP a livello di interazione dinamica sta tutta qua, anche se non è facile districarsi sulla parte di codice presente sul componente LinearLayout che ha come caratteristica quella di disporre gli elementi in orizzontale e in verticale. Per esempio queste due istruzioni iniziali sono molto importanti oltre che indispensabili dove match_parent sta a significare attaccati al parente genitore, ossia adatta la cornice al parent:

android:layout_width=”match_parent”
android:layout_height=”match_parent”

dopodichè possiamo anche dare un orientamento alla nostra cornice esterna con:

android:orientation=”vertical”

e posso anche impostare dei padding per esempio in dp che si usa per i layout

android:padding=”20dp”

mentre per la grandezza del font come testo si usa prevalentemente come unità di misura più performante sp, per esempio nel nostro EditText si legge:

android:textSize=”20sp”

si noti poi la differenza tra le seguenti due espressioni:

android:text=”Frasi Mitiche!” /> e
<string name=”text”>il tuo film migliore?</string>

web design umbriala seconda espressione attinge all’ armadio risorse, in un cassetto chiamato stringhe con un valore identificato come name=”text” mentre la prima crea al volo un testo senza estrapolare nulla da nessuna parte. Inutile dire che a livello di organizzazione di codice bisogna sfruttare la seconda soluzione. Del resto Android Studio dal punto di vista della compattazione del codice è impeccabile, tutto il contenuto di APP ha le sue sezioni specifiche cok repository e bisogna sare che espressioni del tipo setContentView(R.layout.activity_main); di fatto non fanno altro che estrapolare dalla cartella res, identificata tramite la casse R nella sezione layout l’activity che prende il nome di activity_main. Questo perchè abbiamo un luogo dove poter prendere elementi grafici, altri per settare i vestiti con i css, altri per inserire valori stringa e cassetti che si occupano di gestire i layout, insomma un universo complesso che all’ inizio crea molti dubbi del tipo: ma non ho modo più facile per creare APP? In questo ambiente mi sembra di avere a che fare non con una trama di un film di Kubrick ma con tutta la sua produzione contemporaneamente! Senza contare che l’interfaccia grafica di suo è molto complessa e che cliccando inavvertitamente nel posto sbagliato si finirebbe per modificare la stessa IDE con disorientamenti acuti a corredo e perplessità non facilmente risanabili. Android Studio è un pachiderma ma ha il vantaggio di essere molto sicuro e affidabile soprattutto se supportato dalla RAM! Qui di seguito segue la gallery che testimonia gli sforzi progettuali del neofita di fronte la sua iniziazione e il prodotto finale (alla fine è il risultato che conta) dove la centralità dell’ opera di Kubrick non può essere messa in discussione. Naturalemente siamo di fronte a un punto di partenza, qui è stato agganciato un solo evento senza traumi. Ma che succederà quando le complicazioni nel codice aumenteranno di intensità? Non resta che scoprirlo, cimentandosi alla conquista di pesi maggiori da valorizzare!

Questo slideshow richiede JavaScript.

Ho comprato 3 libri di scacchi sulla pirc e 6 sulla owen per distribuirli ai miei alunni: allora stai programmando con un linguaggio che non è scomparso con i dinosauri!

Python è un linguaggio largamente diffuso e anche antico se vogliamo. Nato tra gli anni ottanta e novanta il suo modo di esprimersi ispira anche aggettivi come PYTHONIC per indicare un gergo incisivo. Si tratta di un linguaggio non compilato, quindi INTERPRETATO, viaggia su tutte le piattaforme e possiamo anche pensare di programmare ad oggetti. Pyton ha una struttura dati intermente basata su oggetti. Posso anche inserire moduli esterni nella nostra piattaforma di lavoro é quindi estensibile. Viene definito general-purpose ossia fuori dai contesti tradizionali, quindi si può integrare in qualunque campo. Può dare qualsiasi contributo in ogni tipo di progetto. E’ molto usato nei big data, flussi e analisi dati su larga scala. Usa i database e Python non è mai escluso ancora oggi dall’ utilizzo pratico. Si usa molto nel Machine Learning per obbligare una macchina a compiere le nostre acrobazie. Python ha una sintassi particolare, scarnificata all’ osso, non si vedono parentesi graffe per definire blocchi di codice, con la sola identazione si definiscono le istruzioni. Quindi salta subito all’ occhio una maggiore leggibilità. Usa in maniera invasiva solo i due punti e questo significa maggiore velocità nello scrivere codice e anche facilità di comprensione nel leggerlo. Python usa una console interattiva e questo rende felice molti programmatori che potranno invocare con il comando pyton la nostra interfaccia shell. Ci verrà mostrata la versione e siamo già pronti all’ utilizzo, ad esempio possiamo usare lo spazio come una calcolatrice del tipo 2 + 3 che definisce uno spazio di elaborazione. Per stampare in output una stringa usiamo print (‘ciao mondo’). Poi molto diffusa é la funzione help() che ci supporta per compiere determinate operazioni. Con quite() siamo di nuovo usciti dalla shell interattiva di Python. Quindi se volessi stampare a video il mio primo programma ufficiale nella forma più distorta per esempio? Ecco: print(‘il mattino ha l’oro in bocca’) . Ok ma ripartiamo dall’ inizio intanto andare su https://www.python.org/ dove c’è la sezione download e scarichiamo la versione giusta per noi che ci viene proposta dove alla fine si indirizza l’installatore verso https://docs.python.org/3.8/tutorial/ ; Il programma verrà installato in C:\Users\nomeutente\AppData\Local\Programs\Python\Python38-32 ; quando siamo sulla macchina ci accorgiamo che sul menù lista delle applicazioni in basso a sinistra ha aggiunto Pyton e che dentro ci sono varie opzioni oltre al manuale e la shell ide oltre la tradizionale finestra richiamabile da cmd. Noi clicchiamo sulla shell ideo o l’altra e siamo dentro. Se per esempio vorrei delucidazioni su come usare il comando print posso digitare:

>>> help(print)
Help on built-in function print in module builtins:

print(…)
print(value, …, sep=’ ‘, end=’\n’, file=sys.stdout, flush=False)

Prints the values to a stream, or to sys.stdout by default.
Optional keyword arguments:
file: a file-like object (stream); defaults to the current sys.stdout.
sep: string inserted between values, default a space.
end: string appended after the last value, default a newline.
flush: whether to forcibly flush the stream.
>>

il vantaggio di lavorare sulla ide è che posso avere in alto la famosa barra dei menù dove posso produrre per esempio dei file esterni digitando per esempio nuovo e scrivendo al suo interno le istruzioni, per esempio print (‘il mattino ha l’oro in bocca’), scelgo dove salvare e per eseguire faccio open semplicemente da ide (ambiente di sviluppo integrato). Per eseguire il programma devo andare sul menù RUN e scelgo la prima azione RUN MODULE al chè lui parte ad elaborare il contenuto della nostra istruzione che in fase di esecuzione di darà errore! Perché? Ci segnala una anomalia sull’ apostrofo che ovviamente crea conflitti con gli altri due apostrofi che delimitano la stringa. Noi che conosciamo PHP a livello condominiale abbiamo intuito che per risolvere il problema bastava inserire un carattere di escape correggendo l’istruzione in print(‘il mattino ha l\’oro in bocca’) e a video comparirà come per magia il risultato finale di tutte le nostre elucubrazioni:

================== RESTART: C:\Users\Nomeutente\Desktop\oro.py ==================
il mattino ha l’oro in bocca
>>>

Ricordiamo che in rete ci sono ottimi siti che spiegano bene questo primordiale linguaggio di programmazione, come per esempio https://www.w3schools.com/python/default.asp; il comando eseguibile può essere lanciato anche dall’ esterno per esempio desktop digitando pyton nomefileconestensionepy oppure in altri casi python seguito da nome versione e nome file. Può accadere che in fase di installazione vengano riscontrate delle problematiche sul path del file windows che manda in esecuzione i programmi. In questo caso come consigliano sempre i tecnici più pagati che quando vengono interpellati suggeriscono di spegnere e accendere il computer per resettarlo, noi ci limitiamo a suggerire di cercare in rete le risposte da parte di chi ha affrontato l’analogo problema. Bè adesso possiamo alzare il tiro, facciamo un programma serio che chiede una informazione e mi rispedisce indietro una affermazione, scriverò quindi nel mio file caruana.py:

name = input(‘Ciao, come ti chiami?\n’)
print (‘Bravo se non andavi in America restavi terza naz eh %s.’ % name)

quando mando in esecuzione il tutto lui prima mi chiede il nome e poi arriverà una frase di ritorno come un boomerang, a video vedrò:

================ RESTART: C:\Users\Umbriaway\Desktop\caruana.py ================
Ciao, come ti chiami?
Fabiano
Bravo se non andavi in America restavi terza naz eh Fabiano.
>>>

Portentoso questo linguaggio sembra di giocare con il basic dell’ era dinosauri! Adesso ci stiamo provando gusto proviamo qualcosa di più forte:

prices = {‘pircbook’: 12.40, ‘owenbook’: 11.50}
my_purchase = {
‘pircbook’: 3,
‘owenbook’: 6}
book_bill = sum(prices[book] * my_purchase[book]
for book in my_purchase)
print (‘I owe the pusher $%.2f’ % book_bill)

sostanzialmente sono andato dal libraio di fiducia a comprare un pò di libri di scacchi da distribuire ai miei alunni e a video verrà emessa la fattura:

================== RESTART: C:/Users/Umbriaway/Desktop/wow.py ==================
I owe the pusher $106.20
>>>

per una analisi dettagliata della sintassi base di Python rimandiamo a una prossima sintassi con un altro post tematico sui portali Umbriaway Consulting, per ora abbiamo fatta parecchia strada, abbiamo visto come installare, come scrivere i primi programmi, come salvarli su file esterni e mandarli in esecuzione. Roma non è stata costruita in un giorno. Per sparare un satellite su Plutone con Pyton serve ancora da guardare in dettaglio la sintassi!

Come rendere un primordiale acronimo CRUD interessante e coinvolgente con HTML, CSS, BOOTSTRAP, PHP e MySQL!

Quello che può fare un semplice CRUD con PHP e MySQL ha del miracoloso! CRUD è l’acronimo di C-REATE R-EAD U-PDATE D-ELETE ossia le quattro operazioni base che un web developer junior inizia a conoscere quando si inserisce verso la meta del web developer senjor. Un CRUD è l’essenza di un applicativo che legge i dati con la famosa query SELECT (quindi READ), che aggiorna i dati con la famosa query UPDATE, che cancella i dati con la query o il comando DELETE e che legge i dati con la quintaessenza della programmazione dinamica: una semplice query SELECT, un imperioso comando che costringe la pagina a piegarsi alla volontà del suo creatore sciorinando dati a destra e a manca! Okweb developer umbria ma bando alle chance e parliamo di cose concrete e pratiche. Nell’ applicativo costruito tenendo come base un CRUD sono state inserite diverse funzionalità aggiuntive che abbelliscono il tutto anche con i ccs. L’applicativo ha uno scopo, quello di permettere a un giocatore di scacchi di fissare il suo repertorio di aperture per studiarle, quindi l’esempio del CRUD calza a pennello per lanciare un messaggio chiaro e ineluttabile: il CRUD nasce per soddisfare a esigenze concrete del quotidiano, poco importa che sia lavoro o svago piuttosto che economia locale o della comunità europea. Vediamo come nasce l’applicativo. E’ chiaro che la prima parte della costruzione dell’ architettura è già svelata: l’utente deve essere in grado di modificare i suoi dati dopo averli creati e anche di aggiornali e cancellarli se durante lo studio delle sue aperture scacchistiche qualcosa nopn gli sconfifferà. Il problema piu angosciante per un aspirante web developer junior è: e adesso come faccio a fare la connessione con il database? Intanto devo poter disporre di un DB in rete o in locale (essendo un applicativo disegnato sulle esigenze personali può funzionare anche solo con XAMP) poi ho bisogno di un editor per creare i file che non saranno tanti come si può intuire visto che l’applicativo avrà bisogno di una index che legge i dati in ingresso, di una pagina ADD che inserisce i dati creati, di una che fa l’aggiornamento UPDATE, di una che cancella impartendo il comando DELETE. Ma prima di fare questo dobbiamo studiare la struttura del database che in questo caso avrà quattro campi:

  • una chiave primaria autoincrementante progressiva definita classicamente come intero ID
  • un campo nel quale scriveremo la prospettiva di studio del nostro impianto di gioco, ossia se vogliamo focalizzarci dalla parte del bianco o del nero con un campo stringa definito come COLORE
  • un campo o colonna definito come NOME per indicare il tipo di apertura che voglio giocare e studiare come stringa nel tipo di dato e lunga un centinaio di caratteri, come il precedente colore.
  • un campo descrittivo che ha le stesse caratteristiche delle ultime due COLORE E NOME ribattezzato DESCRIZIONE che avrà questa volta un ampiezza di dati large ossia trecento caratteri

OVVIAMENTE prima di fare queste definizioni all’ interno del DB servirà un nuovo database da creare entro il quale bisogna costruire una tabella che conterrà i nostri dati definiti dai nomi di campo o colonna descritti sopra.

Formalizzata questa semplice questione del database in dieci minuti, non ci resta che creare le pagine. Risolviamo subito la questione del collegamento ai dati nel file db, dove andrò a istanziare una variabile a cui verrà applicata il metodo connect che prende quattro parametri ossia chi è il server, come si chiama l’utente che si collega sulla macchina, quale pwd utilizza e infine dove va l’utente fisicamente in quale database, nel mio caso:

$db = new Mysqli;

$db->connect(‘localhost’,’root’,”,’crud’);

if(!$db){
echo “error”;
}

Abbiamo aggiunto anche un prototipo di controllo da perfezionare che dice: se la variabile è diversa da $db, ossia se non vede al suo interno dei dati, restituisci un messaggio di errore che ci avvisi di un malfunzionamento. Questa funzione andrebbe migliorata e ampliata ma al momento limitiamoci a stare dentro le tematiche del CRUD. Quindi il problema è risolto perchè ora sulla pagina index scriverò l’inclusione a questa pagina con:

<?php include ‘db.php’; >

con queste due semplici operazioni, ossia la creazione dei parametri di collegamento e l’inclusione alla pagina che leggerà i dati (READ nel paradigma acronimo crud) abbiamo praticamente fatto tanta roba! A questo punto non ci resta che impartire i nostri comandi SQL sul database, ossia per leggere i dati uso una SELECT espressa in queste modalità $sql = “select * from nometabella, ossia sto dicendo alla macchina di tirarmi fuori tutti i dati (asterisco o carattere jolly) dalla tabella che li contiene. Ora a livello di idea progettuale ne consegue che ogni pagina del CRUD avrà la sua query:

nella index.php: $sql = “select * from tasks
nella pagina add.php : $sql = “insert into nometabella (colore, name, descrizione) values (‘$colore’,’$name’,’$descrizione’)”;
nella pagina delete.php: $sql = “delete from tasks where id = ‘$id'”;
nella pagina update.php: sql2 =”update nometabella set colore=’$colore’, name=’$task’, descrizione=’$descrizione’ where id =’$id'”;

Per poter passare da una pagina all’ altra i valori da modificare o da aggiornare hanno bisogno di fare riferimento a un ID univoco che viene passato tra le pagine appunto e che ricade sulla pagina di interesse, ecco perché vediamo la clausola where id = ‘$id’, ossia fai questa operazione dove id è uguale al record corrispondente. La cattura dei valori degli id avviene con questo meccanismo o variabile GET:

$id= (int)$_GET[‘id’];

$sql = “select * from nome tabella where id=’$id'”;

Ora a grandi linee un CRUD ha questa impalcatura, è chiaro che poi ci saranno delle tabelle che raggruppano i dati, è palese che serviranno i tag HTML da intercalare con quelli PHP per recuperare i valori dei dati dopo aver fatto la classica FETCH con espressioni del tipo:

<input type=”text” required name=”descrizione” value=”<?php echo $row[‘descrizione’];?>” class=”form-control”><br/>

dove in questo caso abbiamo fatto quello che in VUE si chiama PROPS ossia iniettare i dati all’ interno del nostro campo di testo descrizione nell’ espressione: value=”<?php echo $row[‘descrizione’];?>” situazione che andrà ripetuta per tutte le circostanze anche per i campi nome e apertura.

Sostanzialmente le basi del crud sono legate appunto alle quattro semplici query che formano una base solida sulla quale appoggiarsi per costruire belle applicazioni: in questo caso sono state implementate anche funzionalità di paginazione (comunque complicate perchè la pagina va segmenetata in record quando si supera un certo limite di inserimento), stampa e ricerca tutte situazioni che arricchiscono ulteriormente con i CSS e l’immagine di background in modalità cover di sfondo le funzionalità delle mie creazioni. L’articolo vuole solo offrire un potenziale di sviluppo sulle modalità espresse dalla tecnologia PHP MYSQL CRUD senza entrare nei dettagli della costruzione che comunque è ridotta all’ osso, ma esteticamente aggraziata grazie al framework responsivo BOOTSTRAP (facile da riconoscere per il colore dei bottoni): sei file con l’aggiunta di una immagine ma con elementi grafici come finestra modale e altro da non sottovalutare. Se volessi crescere ulteriormente con la mia applicazione dovrei implementare altri parti tipo: prima di cancellare posso aprire una finestra di dialogo che dice all’ utente di fare attenzione e di essere consapevole di quello che sta facendo? E se volessi ordinare i dati delle colonne come faccio con php e mysql? E’ roba per web developer senior? Volendo integrarie tecnologia AJAX con JQuery per rendere la modalità di visualizzazione dei dati asincrona per non andare incontri a rallentamenti rendering del client potrei farlo? Ce la posso fare?

Buon CRUD a tutti!

Sei STATIC? Allora dovresti fare ginnastica: OOP e PHP, perché i richiami alle variabili statiche offrono flessibilità alle applicazioni, settima puntata

Nelle ultime puntate di OOP e PHP come https://umbriawayincrementa.wordpress.com/2020/04/22/pubblico-o-privato-questo-non-e-un-film-sugli-enti-dislocati-sulla-penisola-ma-oop-e-php/   abbiamo esplorato il potenziale offerto dai progetti che presentano una visibilità delle variabili (o proprietà) pubbliche o private, dipende molto anche dalle caratteristiche del progetto. A questo punto c’è una nuova parola che entra in scena STATIC. Ma di che stiamo parlando? Supponiamo che nella nostra classe GM debba trovarmi nella necessità di creare un account utente per un sito che ospita un area riservata magari con dei servizi a pagamento. Sappiamo che le classi hanno la funzione di proporre una riutilizzabilità del codice per cui potrei usare la classe ACCOUNT anche in altri progetti, quindi inizierò ad avere una classe che ospiterà un paio di variabili canoniche del tipo username e password:

class Account
{
private $username;
private $password;

}

supponiamo che ogni volta che un oggetto si istanzi su questo oggetto io voglia tenere il conto delle nuove istanze istanziate (è un gioco di parole ma rende l’idea). Quanti nuovi oggetti sono stati creati su quella classe? Sappiamo che una classe è un qualcosa di unico nel suo genere e che non possiamo prendere come riferimento ogni oggetto per fare un conto centralizzato del numero che ci interessa, quindi per forza dovremmo introdurre all’ interno della classe una proprietà universale che ha un valore assoluto che mai verrà modificato. Quindi ci viene in aiuto il nostro STATIC, una parola chiave che fa proprio al caso nostro perchè conosciamo i limiti dei metodi private perché leggono solo i membri privati dove vengono definiti, mentre in questo caso la nostra esigenza è un altra, ci serve una variabile contatore che si incrementa ogni volta che una nuova istanza viene creata. per cui iniziamo a introdurre una nuova voce nella nostra classe, private static $count;

class Account
{
private $username;
private $password;
private static $count;
}

A questo punto ci serve un metodo che prende in ingresso l’oggetto istanziato e lo incrementa ogni volta che l’operazione di un nuovo oggetto creato si ripete, quindi siccome abbiamo anche visto quale è l’utilità di un costruttore, cioé quella di inizializzare in automatico delle operazioni al momento della creazione dell’ oggetto, ci inventiamo una funzione (o metodo) __construct (è il modo convenzionale di implementare un costruttore) che fa al caso nostro, inserendo anche un nuovo elemento quella della costante PREFIX (per convenzione si scrivono in maiuscolo) che farà da separatore prima del numero incrementato:

class Account
{
private $username;
private $password;
private static $count;

const PREFIX=”user_”;

function __construct($u, $p=”12345″)
{
$this->username=self::PREFIX.$u;
$this->password=$p;

self::$count++;
printf(“Creato $this->username: account n. %d <br>”, self::$count);
}
}

Che fa sostanzialmente questo costruttore? Accetta due parametri di ingresso, in cui nel secondo quello della password ($p) diciamo arbitrariamente che ha un valore universale se non viene inserito, in questo modo quando verrà creato l’ogetto io dovrò soltanto digitare $u, ossia lo username. Poi assegno i parametri degli argomenti inseriti tra parentesi a delle assegnazioni dell’ oggetto account, tenendo appunto presente che grazie alla costante prefisso avrò poi un separatore con il numero incrementale nel conteggio delle istanze create. Il tutto sembra più difficile da raccontare che a farsi in quanto una volta istanziati i nostri oggetti e ottenuto il nostro script, grazie a http://phptester.net/ a video otterremo:

class Account
{
private $username;
private $password;
private static $count;
const PREFIX=”user_”;

function __construct($u, $p=”12345″)
{
$this->username=self::PREFIX.$u;
$this->password=$p;

self::$count++;
printf(“Creato $this->username: account n. %d <br>”, self::$count);
}
}

$a=new Account(“Svidler”);
$b=new Account(“Aronian”);
$c=new Account(“Carlsen”);
$d=new Account(“Piscopo”);

RISULTATO A VIDEO e risposta alla domanda quanti oggetti sono stati istanziati:

Creato user_Svidler: account n. 1
Creato user_Aronian: account n. 2
Creato user_Carlsen: account n. 3
Creato user_Piscopo: account n. 4

Da notare infine il sibilinno simbolo arcano geroglifico o assiro babilonese %d che funziona solo da SEGNAPOSTO per lasciare spazio a self::$count ossia la nostra variabile statica. Se ne deduce quindi che i caratteri i due punti ripetuti sono proprio un modo caratteristico nella sintassi di PHP di riconoscere le proprietà statiche di una classe che sono per l’appunto dei valori assoluti presenti nella classe come riferimento per tutti gli oggetti che verranno istanziati

La Juventus ha perso la champions? Per forza i giocatori non si allenavano!

Allegri ha capito perchè ha perso champions, perchè tra un allenamento e l’altro qualcuno tagliava. Ma adesso per vincere il triplete prossimo anno ecco lo strumento che serve per monitorare la situazione: il nuovo potentissimo applicativo FWD traccia il potenziale campione, che consiste nel fare l’appello ogni mattina a Vinovo prima degli allenamenti! Bonucci c’è stamattina? Presente! Bernardeschi è di nuovo andato dalla ragazza? No, ce sta anche lui! De Sciglio si vede stamattina? SI non manca mai è uno di quelli che ha bisogno di allenarsi di più! Stavolta sono tutti sgamati e la champions non sfuggirà il prossimo anno. E dire che tutto ciò è stato reso possibile seguendo i tutorial di Umbriaway Consulting su PHP e MySQL. Quindi con un approccio pratico andiamo subito al sodo e diamo scacco matto in poche mosse ai problemi di Allegri.

Mossa numero 1: procurarsi un editor di testo, che sia Atom piuttosto che Visual Studio Code piuttosto che Sublime Tetx poco importa.

Mossa numero 2: scaricare XAMPP il server locale per testare l’applicazione

Mossa numero 3: iniziare a pensare alla struttura del progetto come file system e preoccuparsi di creare un file di configurazione per il nostro collegamento al DB, che chiameremo config.php

Mossa numero 4 scaricare dalla rete il noto framework bootstrap nella sua forma sintetica e inserire il nuovo file di nome inequivocabile bootstrap.min.css all’ interno di una cartella che chiameremo inc come inclusione, quindi il path completo del file sarà: inc\bootstrap.min.css ; per includere bootstrap nei nostri progetti serve anche il file JS che si può scaricare in rete quindi all’ interno della cartella INC troveremo alla fine anche inc\bootstrap.min.js

Mossa numero 5, includere JQuery nei nostri progetti, dalla rete scaricare il file jquery.min.js (il suo contenuto per fare copia e incolla in locale) e inserirlo nella stessa cartella di inclusione per cui avremo inc\jquery.min.js

Mossa numero 6, creare una nuova cartella che conterrà due nuovi file, Studenti.php e Database.php, il primo ci servirà per la gestione dei calciatori juventini e sul secondo avremo le coordinate di connessione al DB sfruttando le costanti presenti nel file di configurazione

Mossa N 7, creare nella root del file system appena creato il file primario definito come index.php e scrivere il codice strutturale tipico usando la semantica dei tag html, head, title, body, div includendo nell’ head anche il framework bootstrap con le sue classi da utilizzare nel body , quindi la parte superiore della ns pagina sarà:

/*
<?php include ‘inc/header.php’;
include ‘lib/Student.php’;
?>

Serial Student Student Roll Attendance
01 Rugani 10 P
A

03 Bernardeschi 11 P
A

04 De Sciglio 12 P
A

</div>

<?php include ‘inc/footer.php’ ?>

*/

Mossa numero otto, identificare la data degli allenamenti, questo si ottiene aggiungendo subito dopo la classe panel-body il seguente DIV con la classe predefinita di bootstrap:

/*

Date:

*/

Mossa numero 9, aggiungere il php dinamico con la funzione date per la stampa

/*

Date:

*/

Mossa numero dieci, aggiungere lo stile in linea per rendere esteticamente visibile la stampa video dell’ oggeto date:

/*

Date:

*/

A questo punto la parte statica del progetto é completata e non ci resta che dinamicizzare il tutto con il registro delle presenze dei calciatori in una delle prossime puntate. Buona champions a tutti!