Archivio mensile:Dicembre 2021

Video Lezione n.5 Creare un’applicazione WxWidgets

Video Lezione n.5 C++ – Creare un’applicazione WxWdigets

Sommario della lezione:

  • Creare una semplice applicazione in C++ che sfrutta le potenzialità dell’interfaccia grafica grazie all’uso dei GUI in C++.
  • Utilizzare le librerie open source WxWidgets in C++ per gestire un menu e gli eventi. Tutto in salsa OOP (Programmazione Orientata agli Oggetti)

Configurare Linux come server di Desktop remoto

In questo breve articolo, ti spiego come configurare Linux come server RDP per accettare connessioni a desktop remoto via client RDP (Remote Desktop Protocol) anche da sistemi Windows/ChromeOS/Android e Mac.
Nella sostanza potrai accedere al tuo desktop Linux via rete LAN o WLAN o Internet per usare il computer con Linux come se tu fossi davanti al Calcolatore.
Ed ecco l’articolo:

Configurare Linux come Server di Desktop Remoto

Il sistema Linux come il sistema operativo Windows, prevede la possibilità di attivare i servizi di Desktop Remoto, funzione molto utile quando è necessario

connettersi al proprio computer linux da un’altra postazione magari anche da un altro sistema operativo.

Lo standard TCP/IIP prevede un protocollo per il Destkotp Remoto chiamato Remote Desktop Protocol (RDP) realizzato da Microsoft e portato anche su

sistema Linux. Tale protocollo prevede che il server ascolto sulla porta TCP 3389 (la porta è comunque personalizzabile), e i client accedono al loro Desktop

Remoto e operano come se fisicamente fossero davanti a quel calcolatore.  L’aspetto più interessante è la possibilità di utilizzare anche le periferiche

connesse al server comprese le periferiche di riproduzione multimediale oltre che la possibilità di accedere dal sistema client alle unità di memorizzazione

remote come se fossero collegate alla macchina cliente.

Nella rete LAN e comunque sul Server se presente un firewall occorre permettere il traffico TCP sulla porta 3389. Per permettere l’accesso da rete Internet, ad

esempio da una macchina esterna alla nostra rete occorre utilizzare alcune procedure aggiuntive:

  • abilitare Port Forwarding sul Router/Firewall perimetrale ovvero quello connesso ad Internet
  • abilitare un servizio tipo dynadns e simili per permettere l’accesso a Router/Firewall che hanno IP pubblico dinamico. Questo capita molto spesso con accessi a Internet residenziali o domestici.
  • Abilitare la crittografia che il protocollo prevede per lavorare in sicurezza.

Una seconda soluzione più sicura potrebbe prevedere una macchina bastione agganciata ad Internet e da questa poi si accede all macchina reale via RDP.

Per realizzare tutto ciò stiamo dicendo che si accede ad esempio su un Raspberry PI 3/4 che è configurato come server di Desktop Remoto dove però sono

presenti solo l’applicazione Server e non i nostri dati personali, e il client RDP verso la macchina Server Reale.

In questo modo un potenziale attaccante può avere più difficoltà per raggiungere i nostri dati, poichè deve prima compromettere la macchina bastione e poi

eventualmente accedere alla macchina reale.

Cosa occorre per configurare il Server RDP

Sul nostro sistema Linux ad esempio Ubuntu possiamo eseguire la seguente sequenza per configurare un applicativo client-server chiamo XRDP.

E’ quindi necessario eseguire i seguenti comandi da terminale:

sudo apt- get install xrdp

Nel nostro utente dobbiamo scegliere quale desktop enviroment DE scegliere. Ubuntu installa Unity che a mio avviso è un pò pesante se per esempio si pensa di accedere da Internet.

E’ possibile installare ad esempio il DE Mate o Xfce4. Nell’ipotesi di installare Mate, occorre eseguire il comando:

sudo apt-get install mate-desktop

Saranno installati una serie di pacchetti una volta che l’installazione è completata, scegliamo gli utenti che dovranno accedere via RDP al Server.

La configurazione di RDP con XRDP è per utente quindi significa che per ogni utente occorre creare una configurazione specifica.

Per fare questo immaginiamo di essere nell’utente specifico, lanciamo da linea di comando i seguenti comandi che creano due file di configurazione, molto

semplici:

echo mate-session > ~/.xsession

echo mate-session > ~/.Xclient

chmod +x ~/.xsession

chmodo +x ~/.Xclient

 Io consiglio Raspberry PI 4 per attivare il client REDP Remuina su Macchina Raspberry PI 4. IO uso a casa un Raspberry con Servizio Desktop Remoto da Internet e poi da questo dispositivo bastione mi collego alla mia macchina Server RDP con le mie utente.

Questi comandi creano due file di configurazione nella Home Directory dell’utente prescelto come accessibile via RDP e rendono eseguibili i due file di configurazione.

Il Client 

Il client in Windows è Desktop Remoto di Windows, basta andare in Accessori -> Connessione Desktop Remoto

Utilizzando il client di Windows occorre digitare l’indirizzo IP del server o il suo nome. POi occorrono le credenziali di accesso al sistema server Linux.

Ecco alcuni screenshot di quello che avviene in Windows attiva la connesione a desktop remoto (la terza schermata) inserendo indirizzo IP e/o nome DNS del PC da raggiungere, poi configurare il l’accesso RDP sulla macchina Linux che risponde a quell’indirizzo IP e/o nome host e scegliere nel campo Sessione Xorg, e inserire il nome utente e password accreditati sulla macchina Linux (schermata numero 2) che funge da RDP Server. Se tutto è stato fatto visualizzerai il DE di Linux (scherma numero 1).

Uso delle struct in C/C++

Le struct in linguaggio C/C++

Cosa sono le Struct ? Sono modelli di strutture dati definite dall’utente in relazione alla rappresentazione dati che occorre nel problema; nel linguaggi di programmazione di qualunque tipo sono sempre ammessi come tipologia di struttura dati. 
E’ definita una struttura dati eterogenea in quanto può essere composta da tipi di dati semplici o strutturati come ad esempio un array. 
Per poter utilizzare tale strutture l’utente deve dichiarare nel programma la struct con la dichiarazione:

struct nome struttura

{  tuoi1 nome dato;

  tipo 2 nome dato 2;

  …..

 tipo n nome dato n;

};

ad esempio

struct alunno {char nome[20];

 char cognome[20];
 char classe[4];
 char sezione[2];
 int age;
 float media_voti;
};

In questo caso è dichiarata una struttura dati contenente tipi di dati diversi definiti dall’utente in relazione al suo problema. Tale dichiarazione, va effettuata prima che il programmatore definisca delle variabili statiche o dinamiche legate all’uso del nuovo modello dati. 
Infatti, fintantoché la struttura non è dichiarata come variabile non è utilizzabile all’interno del programma e di suoi eventuali sotto programmi. 
La dichiarazione avviene in modo generico con la dichiarazione tipica:

struct nome struttura nome variabile;

oppure se è necessario dichiarare un array di strutture è possibile utilizzare la sintassi:

struct nome struttura nome variabile[dimensione];

La clausola typedef

In entrambi i casi le variabili dichiarate sono statiche e non dinamiche (non si è fatto uso dei puntatori).

typedef struct{

Una variante della dichiarazione, può essere ottenuta con la clausola typedef, la quale dichiara il nuovo tipo con un alias della struttura; in questo modo l’utente non è costretto a dichiarare la parola chiave struct quando dichiara la variabile di quel modello dati. 
Ad esemoio la dichiarazione della struttura di esempio diventa:

 char nome[20];
 char cognome[20];
 char classe[4];
 char sezione[2];
 int age;
 float media_voti;
}  alunno ;

In questo modo, l’utente dichiara la sua variabile indicando direttamente il nome della struttura come nuovo tipo. Ad esempio:

alunno a;

alunno a[100];

la prima dichiara una variabile di tipo alunno e la seconda un array composto da tante strutture alunno dello stesso tipo. 

Uso e accesso ai dati delle strutture

Per prima cosa, una volata dichiarate le strutture e le relative variabili associate con essa, il programmatore per accedere ai dati detti anche “campi” utilizza la seguente sintassi:

nome_variabile.campo

per assegnare un valore al campo è possibile utilizzare ad esempio la sintassi seguente:

alunno.cognome[]=”rossi”; 

o

alunno.cognome={‘r’,’o’,’s’,’s’,’i’,};

E’ utile notare che nel momento in cui è opportuno definire delle stringhe; ogni stringa termina con un carattere di terminazione ‘\0’, il quale si aggiunge come numero ai caratteri della stringa. In altre parole se il cognome è “rossi” la stringa avrà 6 caratteri e non 5 in quanto la memorizzazione avverrà nella seguente forma “rossi\0”.

Se in blocco si vuole assengare a tutti i campi della struttura un valore è possibile utilizzare la sintesssi:

nome variabile={valore1, valore2, …,valoren);

attribuendo i valori nei formati opportuni; nel senso che se è un numero non sono necessari le veirgolette, se trattasi di una stringa invece le virgolette sono necessarie. 


 Uso delle strutture

Le strutture possono essere definite anche come record ovvero  “registrazione”, la cui parola indica un aggregato di dati composto da dati di tipo diverso ognuno dei quali è caratterizzato da una dimensione. 
I dati che compongono la struttura detti “campi” concorrono insieme alla definizione di un informazione. 
Tali informazioni, possono a loro volta essere aggregati in array di record dette tabelle che ben si prestano alla memorizzazione in memoria RAM oppure su memoria di massa sotto forma di file di record. 

Esercizio

Realizzare un programma in C con l’uso delle function, che permetta di creare una tabella con record informativo, che contiene per ogni studente, il nome, il cognome, l’età, e la media che ha conseguito a fine anno. 
L’utente, inizialmente deve inserire i dati e poi attraverso un menù deve consentire le seguenti operazioni:

1- Stampa media dei voti con i dati degli alunni;

2- Visualizzazione della media di un alunno specifico

3- Visualizzazione dei dati degli alunni con voto massimo e minimo

4- Uscita dal programma

Realizzare una codifica in C

Esercizio svolto sulle struct in C/C++

Video Lezione C/C++ Le strutture cicliche

Video – Le strutture cicliche in C/C++

Argomenti:

  • La definizione di struttura ciclica
  • Classificazione delle strutture cicliche e rappresentazione con i flow-chart (diagramma di flusso)
  • Le strutture cicliche in C/C++
  • La ripetizione condizionale
  • La ripetizione iterativa