Zona informaticienilor

tehnologiA informațiilor și comunicațiilor

#lumeavirtuala #informatii #comunicatii #it #software #hardware #serviciicomputerizate

DOMENII CREATIVE: publicitate & marketing, arhitectură, meșteșuguri, design de produs & grafic și de modă, modă, film, TV & video, radio și fotografie, IT & software și servicii computerizate, activități editoriale, muzee, galerii & bibliotecimuzica, artele spectacolului, arte vizuale.

Sursa definiției și clasificării industriilor creative: Wikipedia (conform DCMS, 2015)

NU-ȚI TRĂI VIAȚA ÎN MOD VIRTUAL! Maxim 8 ore pe zi ar trebui să petreci pe internet!                  

spre ECHILIBRISTICA ÎN LUMEA VIRTUALĂ
INFORMAȚII/ DATE ÎN LUMEA REALĂ și ÎN LUMEA VIRTUALĂ

INFORMAȚIILE/ DATELE ÎN LUMEA REALĂ sunt interpretate de om sau de alte viețuitoare, chiar și de plante prin semnale, cuvinte, sunete, imagini.

INFORMAȚIILE/ DATELE ÎN LUMEA VIRTUALĂ (= biți digitali) sunt interpretate, stocate în calculatoare/ alte dispozitive și transmise între acestea sub forma unei serii de biți, reprezentate digital prin coduri (fiecare BIT - ”cifră binară”, cea mai mică unitate de date/ unitate de bază - poate avea valoarea 0 sau 1 - stări binare sau discrete, precum un comutator poate fi oprit sau pornit).

ASCII (American Standard Code for Information Interchange) este un cod binar folosit de calculatoare pentru a reprezenta și interpreta litere, cifre și caractere speciale (fiecare caracter este reprezentat de 8 biți = octet).

1 = 00110001

a = 01100001

A = 01000001

Datele transformate în serii de biți digitali trebuie convertite în semnale/ impulsuri electrice, optice sau unde wireless (radio/ cu infraroșu/ cu microunde) pentru a fi transmise prin mediul de rețea (suportul fizic, adică fir de cupru, cablu de fibră optică sau unde electromagnetice).

Datele cu caracter personal pot fi oferite voluntar (exemplu: rețele sociale), date observate (capturate - cum ar fi cele privind locația) sau date deduse (care se bazează pe analiza de date oferite sau observate).

 Calculator

HARDWARE
BIOS
Basic Input Output System
SISTEM DE OPERARE
Basic Input Output System
PROGRAME/ APLICAȚII
TRANSMITEREA INFORMAȚIILOR

 Exemplu de comunicație efectivă/ directă - CE

MESAJUL ÎN LUMEA REALĂ 

Exemplu de comunicare prin transmiterea unui mesaj scris între două persoane care cunosc limbi diferite -fiecare persoană are nevoie de un asistent care redactează mesajele (primul nivel al comunicării mesajului), acesta îl dictează traducătoarei (alt nivel al transmiterii mesajului), apoi paginile sunt numerotate și se alcătuiesc mai multe scrisori, care merg la poștă, Poșta  transmite plicurile la oficiul poștal al biroului destinatar, poștașul îl duse la destinație, mesajul este preluat de secretara destinatarului, acesta îl predă șefului ei. (Mesajul între cei doi șefi de firmă este virtual, deoarece nu comunică direct. Rutele pentru fiecare plic pot fi diferite.)

MESAJUL ÎN LUMEA VIRTUALĂ 

Exemplu de comunicare a unei informații prin intermediul unei rețele de calculatoare sau alte dispozitive inteligente - două persoane folosesc două calculatoare-gazdă (calculatoarele sunt gazdă pentru aplicații) - calculatoarele nu au legături directe între ele, ci prin mai multe routere (care implementează 3 niveluri: fizic, legături de date, rețea), urmând protocoale (mesajul pleacă de la calculatorul Expeditorului  - ajunge la server - apoi la routerul rețelei de care este legat serverul - în funcție de IP-ul de destinație, din tabela de routare, alege următorul router din internet - ajunge la destinație)

NIVELURILE COMUNICAȚIEI EFECTIVE ALE FIECĂRUIA DINTRE CELE DOUĂ CALCULATOARE (la fiecare există protocoale de comunicație, seturi de reguli care guvernează formatul și semnificația unităților de date de protocol schimbate între ele de către echipamente care comunică). Pe baza protocoalelor, aceste niveluri pereche - echipamentele - comunică între ele prin intermediul unei interfețe - comunicare virtuală - CV) 

1. FIZIC
La nivel fizic se transmit și se recepționează biți - fără interpretare - prin mediul de comunicație (prin fir, cu cablu sau fără fir, între calculatoare gazdă și echipamente intermediare). - reprezentarea valorilor binare - pentru a circula ghidat prin cablu de cupru (UTP sau coaxial - ca semnal dreptunghiular sau semnal sinusoidal, folosindu-se un modem) sau de fibră optică (comunicația se face prin impulsuri luminoase, de putere mare - cu laser, pentru distanțe mari sau led pentru distanțe mici); - tipul de cablu/ conector - fiecare interfață de comunicație are un soclu care se potrivește cu anumite tipuri de cablu și de conectori; - viteza de comunicație (în mod serial, măsurată în biți/ secundă, ritmul în care transmițătorul lansează în mediul de comunicație biții trebuie să corespundă cu ceea ce este citit de receptor) - trebuie să poată fi suportată de mediul fizic, care are o anumită lățime de bandă.
2. LEGĂTURĂ DE DATE
(Data Link) pentru traficul din interiorul unei rețele locale: - Accesul la mediul de comunicație - la rețele clasice era partajat (folosit în comun - cablul se conecta direct la toate interfețele de comunicație) Protocol MAC (Medium Access - privind accesul la mediul de comunicație) Echipamentele care comunică folosesc unități de date de protocol = Protocol Data Units (PDU) Cadru (Frame - PDU de nivel 2): - Antet (informații despre părțile care comunică, identitatea lor - adresa transmitățorului și a receptorului - pentru a se evita confuziile - echipamentul-receptor trebuie să interpreteze antetul pentru a înțelege că mesajul îi este adresat), Date, Trailer - delimitarea cadrelor (la început va exista un delimitator de start și se încheie cu delimitator de stop - delimitatoare necesare pentru a se deosebi 2 stări posibile: mediu liber sau ocupat); - adresarea Adresă fizică (înscrise în electronica interfeței de comunicație - echivalente datelor referitoare la nume-prenume, CNP ale unei persoane fizice); - detecția erorilor.
3. REȚEA
PACHET (PDU de nivel 3): structura antetului: adresa sursei și a destinației și date - dirijarea pachetelor prin subrețeaua de comuniație (rețele conectate) pentru a găsi calea cea mai bună de la sursă la destinație; - adresarea (adrese logice - echivalente unei adrese de domiciliu în cazul unei persoane); - evitarea congestionărilor (traficul poate fi blocat din cauza aglomerării - ca în trafic rutier - se pot folosi algoritmi de evitare a congestionărilor); - fragmentarea MTU (Maximul Transfer Unit - dimensiunea maximă a unui pachet care poate fi transmis pe o conexiune) - pachetele mari pot fi fragmentate în pachete mai mici la nivelul routerelor, apoi se reasamblează; - contabilizarea traficului.

Următoarele niveluri sunt specifice calculatoarelor gazdă

4. TRANSPORT
SEGMENT (- PDU de nivel 4 - primul nivel la care are loc o comunicație de tip capăt-la-capăt între calculatoarele gazdă) - fiecare segment are un antet (conține numerele de port - care identifică aplicația care generează segmentele și aplicația căreia îi sunt destinate datele); - segmentare - operație similară MTU - împărțirea unei informații mari în segmente; - stabilirea/ încheierea de conexiuni; - controlul fluxului; - multiplexare (prin aceeași conexiune de rețea se pot vedea mai multe aplicații - un tab cu email, unul cu un browser etc. - ca niște plicuri diferite de dimensiuni diferite); - numere de port - servicii sigure. bazate pe conexiune, fără erori și în ordinea în care au fost transmisă cu o probabilitate apropiată de 100% (exemplu: legătura telefonică) - prin segmentare are sunt confirmate la destinație și retransmitere - servicii de tip datagrama au antete mai simple pentru rapiditatea transmiterii datelor (de exemplu, serviciu radio online) și eficiență - protocolul UDP (User Datagram Protocol)

Următoarele 3 niveluri sunt comasate într-unul singur în modelul TCP/ IP (sunt operațiuni specifice aplicațiilor

5. SESIUNE în modelul OSI
- gestionarea jetonului (mecanism de control) - resursă logică care permit anumite proprietărți - asigură acces ordonat la o resursă partajată; - controlul dialogului - determină cine, când, cum poate trimite date îmtr-o sesiune activă; - sincronizarea - inserarea de puncte de control în cadrul unei sesiuni de comunicare (în cazul unei întreruperi, se poate relua transferul de date de la un punct intermediar
6. PREZENTARE
- datele sunt convertite între formatele utilizate de aplicații și formatul standard folosit pentru transmiterea în rețea (formate de caractere - ASCII și EBCDIC, formate numerice - little-endian și big-endian, structuri de date complexe - reprezentări grafice sau obiecte); - autentificare; - criptare; - compresie.
7. APLICAȚIE
- aplicații spre serviciile rețelei folosite pentru a trimite, primi și interpreta datele într-un format înțeles de utilizator, dar și de alte aplicații de rețea (protocoale: http/ https - pentru navigare pe web; ftp - pentru transfer de fișiere; SMTP/ POP3? IMAP - pentru e-mail; DNS - pentru rezolvarea numelor de domeniu; SSH/ Telnet - pentru acces la distanță)

MEDIU DE COMUNICAȚIE PARTAJAT într-un spațiu, în atmosfera comună se propagă sunete, așadar trebuie să existe o ordine în comunicare a celor prezenți (pentru exactitate, se poate menționa nume, prenume și CNP - echivalentul adreselor fizice din nivelul Legături de date).

PROTOCOL MAC (Medium Access) - într-un mediu fizic pe cupru sau wireless trebuie să există reguli (protocol) de transmitere a informațiilor (acces la mediul de comunicație)

ZGOMOTE ÎN COMUNICARE

DETECTAREA ERORILOR - ZGOMOTE ÎN TRANSMITEREA DATELOR ÎN MEDII FIZICE - recepționarea incorectă a informațiilor la destinație, verificarea făcându-se prin calcularea unei sume de control pe baza datelor (cu algoritmi) . Dacă apar erori, nu se fac corecții la nivelul Data Link, doar la următoarele niveluri.

MESAJUL REDUNDANT - spune același lucru de mai multe ori, fără să adauge informații noi.

REDUNDANȚĂ ÎN TRANSMITEREA UNUI MESAJ ÎN REȚEA - mai multe căi de transmitere a mesajului către o destinație printr-o rețea cu comutare de pachete (un mesaj - e-mail/ flux video etc. - este împărțit în blocuri video). Așadar, dacă o cale eșuează, mesajele sunt trimise pe altă cale (rețea tolerantă la erori).

Rețeaua Internet (global)
Conform Wikipedia: „desemnează o rețea mondială unitară de calculatoare și alte aparate cu adrese computerizate, interconectate conform protocoalelor (regulilor) de comunicare Transmission Control Protocol și Internet Protocol, numite împreună stiva TCP/IP.”

Calculatorul/ telefonul (alt dispozitiv) conectat la rețeaua Internet (printr-un dispozitiv conectat la rețeaua globală se poate comunica sau accesa informații/ date) 

TCP
- Transmission Control Protocol (Protocolul de control al transmisiei) - gestionează conversațiile individuale, garantează livrarea informațiilor și gestionează controlul fluxului între dispozitivele finale.
Adresa IP
- identificator numeric unic al fiecărui dispozitiv dintr-o rețea, necesar în comunicare (exemplu: 192.168.1.10) - indică și rețeaua la care este atașată gazda
PROTOCOALE ȘI STANDARDE (modele arhitecturale) pentru comunicație în rețea (detalii OSI, TCP/ IP și Netware)
- STANDARDE, PROTOCOALE și SERVICII pentru comunicarea în rețea MODELE ARHITECTURALE: - OSI (Open Systems Interconnection) ISO (International Standards Organization) - face recomandări detaliate privind funcțiile pe care ar trebui să le îndeplinească echipamentele unei rețea - TCP/IP (Transmission Control Protocol / Internet Protocol) – urmează recomandările OSI definind standarde - IETF Internet Engineering Task Force (cu RFC - Request For Comments = se poate contribui cu comentarii) - Netware (propus de compania Novell) - este mai vechi decât modelul OSI - echipamentele de rețea sunt organizate ca un PC - în 4 niveluri: nivelul N este furnizor pentru nivelul N+1 și consumator de resurse pentru nivelul N-1 - UDP (User Datagram Protocol); - DNS (Domain Name System) - serviciu care traduce numele de domeniu în adrese IP, permite astfel accesarea serverelor după nume, nu după IP; - IP Adres
Backbone internațional (rețea fizică globală de cabluri)
= (șira spinării) rețea globală de cabluri submarine și terestre conectate la routere în noduri majore, în marile centre de date internaționale/ stații sol pentru sateliți (sateliții sunt gestionați de un operator, care transmite la o stație sol - poate fi și un ISP)
Tier (deținător/ operator al unei rețele fizice globală de cabluri, furnizor principal de Internet)
TIER 1 - este categoria de deținător independent de rețele fizice, care dau mai departe acces la rețea către furnizori din categoriile TIER 2 (rețele mari) sau TIER 3 (ISP locale)
ISP (furnizor local - DIGI, TELEKOM/ VODAFONE, ORANGE etc. - client al unui Tier)
= furnizori de rețea la care se conectează dispozitive. Opțiuni de conectare la un furnizor ISP: - cablul de bandă largă, - linia digitală de abonat (DSL) de bandă largă, - rețelele WAN wireless - serviciile mobile Opțiuni business: - DSL business, - linii închiriate - Metro Ethernet
WAN (folosind medii de comunicație - Network Media - cu cabluri sau fără cabluri) 
- (Wide Area Network) - rețea pentru arii largi, ca exemplu fiind cele administrate de ISP sau de o companie mare, un campus universitar (care poate fi organizat ca intranet) etc. O rețea WAN poate interconecta rețele LAN.

Internetul este o colecție de rețele LAN și WAN interconectate.

(un dispozitiv final se poate conecta direct la satelit, dar fără flux de date complet și cu viteze mici)

CONECTARE LA INTERNET

cu calculator sau IoT

Router - Home/ Default Gateway
- HOME GATEWAY = dispozitiv care este punct central de conectare a rețeie locale cu rețeaua internet; DEFAULT GATEWAY = adresa IP a router-ului care permite accesul din rețeaua locală către alte rețele
LAN (folosind medii de comunicație - Network Media - cu cabluri sau fără cabluri) 
- (Local Area Network) rețea locală într-un spațiu mic (casă, spațiu mic pentru birouri) - se utilizează cel mai frecvent interfata Ethernet pentru conectarea dispozitivelor cu cablu
Peer to Peer
= comunicare în rețea de tip egal la egal - în cazul calculatoarelor având ambele roluri: ca servere și clienți în rețea (de exemplu: un PC care este conectat la imprimantă printr-un cablu USV, iar la rețea printr-o placă de interfață de rețea - NIC)
Calculator gazdă (Host Roles)/ dispozitiv final
- calculatorul/ dispozitivul gazdă conectat la rețea (Internet), putând fi dispozitiv final (gazdă), căruia i se alocă un număr de indentificare în comunicare (IP)
Server (calculator)
- calculator cu software care permite furnizarea de informații (e-mailuri sau pagini web) către alte dispozitive - are rolul de a asigura servicii altor dispozitive din rețea (clienți gazdă - DHCP, DNS, HTTP care au software pentru solicitarea și afișarea informațiilor - un browser web, de exemplu, dar, în același timp, și o fereastră pentru e-mail sau altceva)
Concentrator (Switch)
- conectează mai multe dispozitive într-o rețea locală (LAN), permițându-le să comunice între ele
Dispozitiv de destinație (End Device)
- fiecare dispozitiv de destinație (sursă sau destinație a mesajului transmis prin rețea) are o adresă

sau

IoT (Internet of Things)
Rețea de dispozitive (aparate electrocasnice, senzori, camere video, smartphone etc.) conectate prin internet, cu rolul de a colecta și schimba date. - HOME GATEWAY - asigură conectivitatea rețelei interne a locuinței la internet. - IoT Server - element al rețelei care primește date de la dispozitivele casei și permite controlul lor pntr-o interfață web.

CONECTARE LA INTERNET

cu telefon

Smartphone
= (nivel/ strat)
SANCȚIONAREA PIRATERIEI DIGITALE ÎN LEGISLAȚIA ROMÂNEASCĂ 
Legea 8/ 1996: închisoare de la 1 la 4 ani pentru instalare ilegală de software și închisoare de la 3 la 12 ani pentru comercializare

UTILIZATOR ANONIM

UTILIZATOR CU CONT

(click pe + sau - pentru a desfășura sau restrânge conținutul reperelor)

CRIPTOGRAFIE

= ştiinţa scrisului secret (cryptos- ascuns şi grafie- scriere), cu scopul de a ascunde semnificaţia unui mesaj (studiul metodelor matematice legate de securitatea informaţiei).

 CRIPTANALIZĂ
= ştiinţa de a sparge criptosistemele.
 CONFIDENȚIALITATEA și AUTENTICITATEA mesajelor
- plaintext (text clar) un mesaj în forma sa originală. - criptare - rescrierea de către expeditor a textului clar folosind o metodă cunoscută numai de el (eventual şi de destinatar) - text criptat (cyphertext) - mesaj obţinut prin criptare - sistemele de criptare actuale folosesc în general chei de 1024 biţi sau chiar mai mult. - sistem de criptare - algoritmul care realizează operaţiile de criptare şi decriptare (printre primele sisteme de criptare este cifrul lui Cezar)

SISTEME DE CRIPTARE

 A/ 0

 B/ 1

 C/ 2

 D/ 3

 E/ 4

 F/ 5

 G/ 6

 H/ 7

 I/ 8

 J/ 9

 K/ 10

 L/ 11

M/ 12

 N/ 13

 O/ 14

 P/ 15

Q/ 16

R/ 17

S/ 18

U/ 19

T/ 20

 V/ 21

W/ 22

X/ 23

Y/ 24

Z/ 25

 .

 .

 .

 .

 .

 .

 SIMETRICE CLASICE

 Cifrul de permutare
- textul clar se împarte în blocuri (se consideră şi caracterul spaţiu, notat ∗), după care fiecărui bloc i se aplică o permutare fixată (Ex. text clar: SECURITATE, cheia de criptare: permutarea 1234/ 4321 - se împarte textul clar în grupuri de câte patru caractere: SECU - RITA - TE**; se permuta intre ele literele din grupuri: UCES - ATIR - **ET
 Cifrul de permutare Hill (Matricea de criptare)
- cheia de criptare este o matrice pătratică, nesingulară, de dimensiune d (inversa matricei devine cheia de decriptare); - textul clar se împarte în blocuri de lungime d, dacă e cazul ultimul bloc (ultima linie) se completează până se obţine lungimea d; - cele doua matrici se inmultesc pentru a se obtine codul (mod 26) (Ex. text clar: SECURIZAT, cheia de criptare - matricea: 1 2 1 3 1 2 1 3 1 (SEC) = (18 4 2) (URI) = (19 17 8) (ZAT) = (25 0 20) - la rezultatul fiecărei linii se aplică modulo 26, apoi cifrele rezultate se asociază cu literele alfabetului.
Cifrul de substituție Cezar (monoalfabetic)
- cheia de criptare se adună la cifrele asociate literelor din alfabet (Ex.: cheia de criptare: 13; textul clar SECURIZAT; se obține vectorul: 18 4 2 19 17 8 25 0 20; se aplică cheia de criptare: 31 17 15 32 30 21 48 13 33; se aplica mod26: )
Cifrul de substituție AFIN
Funcție de criptare AFIN = ecuația de gradul 1: e (x) = ax+b (mod 26); funcția de decriptare: d(y) = a−1y+a−1(26−b) (mod 26). (Ex.: chei de criptare: a = 7 si b = 2; textul clar SECURIZAT; la vectorul: 18 4 2 19 17 8 25 0 20; se aplică cheile de criptare - inmultit cu 7, iar adunat cu 2

 SIMETRICE CLASICE

Cifrul de substituție Polybios
Cifrul de substituție polialfabetic Vigenere
(polialfabetic = folosește mai multe alfabete tabula recta). Pasul 1: aranjarea literelor alfabetului într-o matrice pãtraticã cu L linii si L coloane, unde L este numãrul de simboluri ale alfabetului. Prima linie a matricei este formatã din literele alfabetului în ordine lexicograficã, iar urmãtoarele L - 1 linii sunt obþinute fiecare din linia precedentã printr-o permutare la stânga cu o poziþie. Se observã cã un caracter nu apare decât o singurã datã pe o linie sau o coloanã si fiecare linie sau coloanã contine toate literele alfabetului considerat. Se alege un cuvant-cheie (ar fi ideal ca lungimea parolei sã fie mai mare sau cel puþin egalã cu lungimea textului care urmeazã a fi criptat); SECURIZAT, iar mesajul: M E S A J C R I P T A T S E C U R I Z A T S E C (se aduna literele aferente de la ambele randuri: de ex: M = 12, S = 17, deci M+S=29...) - cifrele rezultate se schimba cu literele aferente din alfabet - la decriptare, cifrele rezultatului obtinut prin criptare se scad cu cifrele cuvantului cheie.
Cifrul de substituție homofonic
(Sistemul de criptare homofonic este un sistem intermediar între sistemele mono şi cele polialfabetice). - exemplu: sistemul Book cipher
Cifrul de substituție Playfair
(unul dintre cele mai cunoscute sisteme de cifrare digrafice - transformă un grup de două litere într-un grup de alte două litere).

 CU CHEIE FLUIDĂ

Sistemul de criptare cu cheie fluidă Vernam
nu se foloseşte aceeaşi cheie pentru a cripta toate simbolurile textului clar, ci se foloseşte un şir fluid (stream) de chei care se aplică simbolurilor. Cu alte cuvinte, într-un sistem de criptare fluid simbolurile (biţii) se criptează individual. - Sistemul Vernam criptează secvenţe binare şi foloseşte chei binare

 

DES

 

 AES

 CU CHEIE PUBLICĂ

DOMENII CREATIVE: publicitate & marketing, arhitectură, meșteșuguri, design de produs & grafic și de modă, modă, film, TV & video, radio și fotografie, IT & software și servicii computerizate, activități editoriale, muzee, galerii & bibliotecimuzica, artele spectacolului, arte vizuale.

Sursa definiției și clasificării industriilor creative: Wikipedia (conform DCMS, 2015)

CREATIVI @ ROSFERA

(profesioniști din Rețeaua creativilor sau amatori din Cercul pasionaților) sunt susținuți prin implicarea în proiectele derulate și promovarea lor sau a activităților lor. 

Zona O.N.G  @ Rosfera

Partenerii noștri  au ca pasiune binele.

Hardware & REȚELE

RAM (Random Access Memory)
- memorie volatilă care conține confirgurația curentă și alte date temporare
NVRAM (Non Volatile RAM)
- memorie permanentă care conține configurația de pornire

 REȚELE - medii de comunicație

PACKET TRACER
Simulează funcționarea internă a unei rețele (adăugarea unor dispozitive în rețea și modul de conectare a acestora - prin cablu sau wireless; este posibilă selectarea, inspectarea, etichetarea, ștergerea sau gruparea de componente în rețea; se poate gestiona rețeaua, realizarea unei topologii logice sau fizice, modificarea profilului de utilizator sau a unor setări - în File - Open Sample sunt exemple) - descărcare: https://www.netacad.com/resources/lab-downloads

Meniul: - DISPOZITIVELE DIN REȚEA (Network Devices): rutere, comutatoare (Switches), hub-uri, dispozitive wireless (Home Gateway este DLC100), securitate, emulare WAN; - DISPOZITIVE TERMINALE - IoT pentru uz personal sau pentru casă/ dedicate orașelor inteligente/ destinate industriei/ pentru rețeaua electrică; - COMPONENTE pentru IoT - plăci, actuatoare, senzori; - CONEXIUNI - pentru interconectarea dispozitivelor în rețea, incluzând și cablarea structurată - în panouri de conexiuni (Patch Panels) sau suporturi pe perete; - MISCELLANEOUS (Diverse) - dispozitive cu cerințe specifice; CONEXIUNI MULTIUTILIZATOR - conectarea cu alți utilizatori din rețea sau o conexiune la o rețea de arie largă

ACȚIUNI SIMULATE ÎN PACKET TRACER: - CABLARE STRUCTURATĂ; - INSPECT Front sau Rear (cu această funcție se pot identifica porturile disponibile); CONFIG TAB (Fila de configurare) - unde se pot activa sau dezactiva porturi, se pot seta interfețe, SSID-uri, parole, adrese IP, alți parametrii de configurare a rețelei - MANAGE ALL CABLES ON RACK - cu această opțiune se pot organiza automat cablurile în dulap (rack); - CREATE BENDPOINT - opțiune care permite fixarea cablurilor în anumite puncte ale unui spațiu fizic
Terminal Emulation Program - Putty, Tera Term, SecureCRT
- se pot utiliza pentru conectare la un dispozitiv de rețea fie printr-o conexiune serială printr-un port de consolă, fie printr-o conexiune SSH/Telnet.
COMPONENTE ALE REȚELEI & CONEXIUNI

Componente ale rețelei (Gazdă - Host Roles, comunicarea în rețea de tip egal-la-egal - Peer to Peer, dispozitive intermediare - Switch, Wireless Router -, dispozitive de destinație - End Devices, medii de comunicație - Network Media - cu cabluri sau fără cabluri) 

Medii de comunicație (Network Media - căile prin care informația ajunge de la destinatar la expeditor)

CONEXIUNI (cu cabluri metaliceserial - conectarea fizică între un calculator și un router sau

Cablu cu fire metalice 
- datele sunt transmise prin impulsuri electrice
Cablu cu fibre optice 
- fibre de stică sau plastic - datele sunt transmise prin impulsuri de lumină
Wireless
- (fără fir) datele sunt transmise prin modularea unor frecvențe specifice ale undelor electromagnetice.
Lățimea de bandă (biți care pot fi transmiși pe secumundă - bps)
- dacă apare congestia rețelei (cererea de lungime de bandă depășește capacitatea acesteia), dispozitivele vor păstra pachetele de date în memorie până când vor exista resurse pentru a fi transmise)
QoS (= Quality of Service) - mecanism din rețele - router - care controlează și prioritizează traficul
- dacă apare congestia rețelei (cererea de lungime de bandă depășește capacitatea acesteia), dispozitivele vor păstra pachetele de date în memorie până când vor exista resurse pentru a fi transmise. De exemplu, apelurile au prioritate față de paginile web.

Conexiune de consolă (serial - conectarea fizică între un calculator și un router sau un switch se face cu un cablu de consolă, care poate fi USB sau serial, nefiind necesară o adresă IP)

Emulator de terminal (Terminal Emulator)
- aplicație software pentru interacțiune cu dispozitivele din rețea

Cablare structurată (adăugarea de cabluri în panoul de conexiuni și în prize într-un scenariu fizic) - echipamente și componente hardware

Panou de conexiuni (Patch Panel)
- montat pe un suport cu cadru, cuprinzând switch-uri sau alte echipamente, pentru conectarea cablurilor unei rețele
Dulap metalic pentru echipamente de rețea (Rack/ Equipment Cabinet)
- montarea în mod organizat a echipamentelor de rețea (switch-uri, patch panel-uri, servere etc.)
Priză sau alt element de conectare cu montare pe perete (Wall Mount/ Copper Wal Mount)
- fiind conectat la un panou de conexiuni, este util pentru a lega dispozitivele la rețea prin cabluri de cupru
 Interfață
- dispozitivul de rețea cuprinde porturi destinate conexiunilor individuale
Placă de interfață de rețea (NIC)
- Network Interface Card - pentru conectarea dispozitivului la rețea
Port fizic
- un conector pe un dispozitiv de rețea destinat conectării la un dispozitiv final sau la alt dispozitiv de rețea
Porturi de rețea de mare viteză de 1 Gbps (Gigabit Ethernet - G1/0/x) 
- de pe un switch sau un server, utilizate pentru conectarea echipamentelor de rețea
Cablu Ethernet (Copper Straight-Through Cable) 
- folosit pentru a conecta dispozitive (de exemplu: PC la switch, switch la router sau la patch panel)
Fast Ethernet (FE)
- interfață de rețea prin cablu pentru IoT, asigurând viteze până la 100 Mbps - cel mai frecvent utilizată în rețele LAN
SSH
- o metodă în bandă și recomandată pentru stabilirea de la distanță a unei conexiuni CLI securizate, printr-o interfață virtuală, printr-o rețea
Telnet
- o metodă nesigură, în bandă, de stabilire de la distanță a unei sesiuni CLI, printr-o interfață virtuală, printr-o rețea (nu oferă o conexiune criptată și securizată).
Concentrator (Switch)
- conectează mai multe dispozitive într-o rețea locală (LAN), permițându-le să comunice între ele - acesta poate fi configurat (global config mode)
Conector (Punchdown)
- folosit pentru conectarea cablurilor în patch panel sau wall mount - fiecare conector corespunde unui port Ethernet
Default (Home) Gateway - ex.: 192.168.1.1 
- HOME GATEWAY = dispozitiv care este punct central de conectare a rețeie locale cu rețeaua internet; DEFAULT GATEWAY = adresa IP a router-ului care permite accesul din rețeaua locală către alte rețele
Adresa IP
- identificator numeric unic al fiecărui dispozitiv dintr-o rețea, necesar în comunicare (exemplu: 192.168.1.10) - indică și rețeaua la care este atașată gazda
 IPV4 (configurare) - ex.: 192.168.1.10
- sunt atribuite dispozitivelor individuale conectate la o rețea.- notație zecimală punctată (patru numere zecimale între 0 și 255); - configurare IPv4 pentru un calculator gazdă cu Windows: Panoul de control > Centru de partajare rețea > Modificare setări adaptor (apoi: clic dreapta și selectare Proprietăți pentru a afișa Proprietățile Conexiunii locale) - Selectare Internet Protocol versiunea 4 (TCP/IPv4) și clic pe Proprietăți pentru a deschide fereastra Proprietăți Internet Protocol versiunea 4 (TCP/IPv4)
IPV6
Adresele IPv6 au o lungime de 128 de biți și sunt scrise ca un șir de valori hexazecimale (fiecare grup de 4 biți este reprezentat de o singură cifră hexazecimală). Grupurile de patru cifre hexazecimale sunt separate prin două puncte (:). - Opțiunile de adresare și configurare IPv6 sunt similare cu cele pentru IPv4
Mască de rețea (Subnet Mask) - ex.: 255.255.255.0 
- definește ce parte a adresei IP identifică rețeaua și ce parte identifică dispozitivul (exemplu: 255.255.255.0). - O mască de subrețea IPv4 este o valoare pe 32 de biți care diferențiază porțiunea de rețea a adresei de porțiunea de gazdă.
Server DHCP
- DHCP (Dynamic Host Configuration Protocol) - (protocol de configurare dinamică a gazdei din rețea) elimină necesitatea configurării manuale a fiecărui dispozitiv, alocând AUTOMAT ADRESE IP, masca de rețea, gateway și DNS dispozitivelor din rețea
Web Server
- pentru pagini web, accesate de clienți prin protocolul HTTP
DNS (Domain Name System)
- serviciu traduce numele domeniu în adresă IP
Conectarea unor dispozitive utilizând tehnologii wireless
WLAN (Wireless Local Area Network)
- rețea locală fără fir, în care dispozitivele pot comunica între ele sau să acceseze internetul prin unde radio, conectându-se la un punct de acces (Acces Point) sau un router WiFI
3G/ 4G/ 5G Cell Interface
- interfață a unui telefon mobil prin care se conectează la rețeaua celulară a operatorului de telefonie mobilă
Wireless Module
- modul hardware utilizat într-o rețea wireless pentru a permite dispozitivelor să se conecteze la rețea
SSID (Service Set Identifier)
- numele unei rețele WIFI afișat în lista de rețele disponibile în momentul conectării unui dispozitiv
Access Point (AP)
- dispozitiv conectat la rețeaua cablată, folosit pentru crearea unei rețele WLAN, care permite conectarea altor dispozitive wireless
Tether/ Tethering
- o funcție a unui dispozitiv prin care poate partaja conexiunea sa la internet unui alt dispozitiv
WPA-PSK (Wi-FI Protected Access - Pre-shared Key)
- o funcție pentru securitatea conexiunilor wireless folosindu-se o parola comună PSK
1. CONFIGURARE CALCULATOR (Settings)

(este necesară existența unui modul wiress în dotarea calculatorului)

- Networks & Internet > Wi-FI > Hardware Properties (aici se văd numele rețelei SSID, la care calculatorul se poate conecta dacă se cunoaște parola; se poate verifica adresa IP)

Conectarea unui calculator prin bluetooth la un alt dispozitiv

(este necesară existența unui modul bluetooth în dotarea calculatorului)

1. CONFIGURARE (Settings)
Bluetooth
- Tehnologie (wireless) pentru comunicații la distanțe mici, care se poate folosi pentru a conecta dispozitive făr a folosi internet sau router
Bluetooth Pairing (asociere)
- două dispozitive având Bluetooth se identifică reciproc și stabilesc o conexiune sigură pentru a transfera date sau a partaja resurse

- Bluetooth & Devices > Bluetooth ON (activarea este necesară la ambele dispozitive) > Add a Device (Pair) > click pe numele dispozitivului care apare în listă

Configurare router wireless integrat și un client wireless care să se conecteze la Internet (în siguranță)
IPv4 IPv6
SISTEME PENTRU A TESTA ȘI DEPANA O CONEXIUNE LA REȚEA
SANCȚIONAREA PIRATERIEI DIGITALE ÎN LEGISLAȚIA ROMÂNEASCĂ 
Legea 8/ 1996: închisoare de la 1 la 4 ani pentru instalare ilegală de software și închisoare de la 3 la 12 ani pentru comercializare
KERNEL 
- componenta sistemului de operare care face legătura cu hardware - gestionează procesorul, memoria RAM și dispozitivele hardware - prin drivere
SHELL 
- interfața prin care utilizatorul comunică cu sistemul de operare (cu kernel) - printr-o comandă text în interfața CLI sau printr-un meniu, într-o interfață GUI (este de preferat să se folosească interfața CLI, fiind mai stabilă și necesitând mai puține resurse).

Software

FIRMWARE
- software de bază, care gestionează funcționarea unui hardware (inclusiv a unui router)
SISTEM DE OPERARE 
= arată utilizatorului printr-o interfață cum sunt controlate și gestionate componentele unui calculator sau dispozitiv electronic și cum rulează programele
DRIVERE
Aplicații software:
Aplicații pentru calculator
Aplicații pentru telefon și alte dispozitive
Aplicații web

PROGRAMAREA = crearea unui produs-program:

- descrierea algoritmilor 

&

- codificarea algoritmilor într-un limbaj de programare

ALGORITM = o succesiune finită de blocuri  (pași)
= o metodă sau o procedură de calcul, alcătuit dintr-o succesiune finită de BLOCURI = pași (operații, instrucțiuni), clar definiți, care trebuie parcurși, într-o anumită ordine (reprezentată grafic prin săgeți), pentru a rezolva o problemă (de la intrare la ieșire)

 Problemă?

(click pe + sau - pentru a desfășura sau restrânge conținutul reperelor)

PAȘI ÎN REZOLVAREA UNEI PROBLEME (SOFTWARE)

 1. Definirea și analizarea problemei

- CITEȘTE (în matematică = ce se dă?): se comunică algoritmului informații (cu enunț clar, precis al problemei - specificarea cerințelor și datelor de intrare și ieșire)

2. Algoritm

- SCRIE (în matematică = ce se cere?): algoritmul comunică informații - un set de date

 - PROIECTAREA ALGORITMULUI - Stabilirea metodei de rezolvare pas cu pas

3. Codificarea într-un limbaj de programare

 

Codarea informației în sistem binar 
- tranzistorul (un întrerupător microscopic) controlează fluxul de curent electric: 1 = închis (curentul nu trece); 0 = deschis (curentul trece) - grup de 8 biți = 1 byte (1 octet) - 1 KB (kilobyte) = 1024 byte sau 1024 x 8 biți - 1 MB = 1024 kb - 1 GB = 1024 mb - 1 TB (terabyte) = 1024 gb Codul ASCII (American Standard Code for Information Interchange) se foloseste pentru transformarea fiecarui caracter într-un byte (într-o secvenţă de lungime fixă (8 cifre binare) Conversii numerice in sistem binar (Tabel 432/ 4321, IEEE 754)

- limbaj (binar) între om și mașină (calculator sau alt dispozitiv), o sintaxă specifică utilizată pentru scrierea programelor

- COD SURSĂ (text scris într-un limbaj de programare - de exemplu: C, C++, C#, Python, Java etc., folosindu-se un fișier text, cum ar fi Notepad)

(DESCOMPUNEREA CODULUI: se recomandă ca problema/ CODUL să fie împărțit în bucăți bine izolate, care să fie codificate fiecare sub forma unei funcții - astfel se poate testa fiecare funcție separat)

Biblioteci

- COMPILATOR - analizează textul programului și îl traducere în program (cod sursă - compilator - cod executabil/ mașină) - programul poate fi executat și fără a folosi un compilator, viteza de executare este mai ridicată (date de intrare - program executabil - date de ieșire)

- INTERPRETATOR - analizează și execută în același timp instrucțiunile (date de intrare & cod sursă - interpretator - date de ieșire)

 

- rezultă un PROGRAM = reprezentarea unui algoritm într-un limbaj - un fișier binar (cu extensia .exe în Windows), care presupune descrierea datelor și definirea unor instrucțiuni de procesare, adică se poate executa (lansa în execuție) sau rula

(timpul de rulare și dimensiunea memoriei folosite trebuie să fie cât mai mici)

- DEBUGGER/ DEPANATOR - rulându-se pas cu pas, se poate DEPANA programul creat (folosindu-se un breakpoint, se găsesc la fiecare pas rezultate intermediare) - PyCharm conține și un depanator, care permite interogarea pas cu pas a codului

4. Testarea și validarea programului

- rulează și se comportă conform așteptărilor?

- oferă rezultate conform cerințelor stabilite?

 5. Întocmirea documentației

Principalele activități într-un proiect software

1. ACTIVITĂȚI DE MANAGEMENT AL PROIECTULUI

IDEEA - descrierea proiectului propus:
1. ce aduce nou/ interesant proiectul? 2. care ar fi alte trei proiecte similare si ce diferențe ar avea noul proiect?
3. în cazul unui site/ aplicații, ce funcționalități ar avea fiecare utilizator?

2. ACTIVITĂȚI TEHNICE

MACHETA 

a. Definirea cerințelor utilizatorului

Diagrame UML

DIAGRAME UML (The Unified Modeling Language) = este un limbaj de modelare (unificat) obiect si nu o metodă-obiect - o modalitate de a dezvolta modele bogate, care descriu funcționalitățile unui sistem software sau hardware, rezultând documentația necesară unui proiect de dezvoltare (Care sunt entitățile? - Care sunt relațiile dintre ele?).

Diagrama cazurilor de utilizare (Use Case Diagram) - modelează serviciile, sarcinile, funcția pe care un sistem trebuie să le îndeplinească:

- elemente: Actor (o entitate care interacționează cu sistemul - un utilizator, de exemplu), Use Case (caz de utilizare reprezintă o funcționalitate distinctă a unui sistem, a unei componente, a unui pachet sau a unei clase - după analiza întregului sistem, se stabilește o funcționalitate de bază, apoi se organizează cazurile de utilizare, se stabilesc diverși actori sau lucruri care vor interacționa cu sistemul) și Asociere

- relații între use case-uri (relația fiecărui autor cu cazul de utilizare sau cu un sistem): trebuie identificat numărul total de moduri în care un actor ar putea interacționa cu sistemul (este posibil să interacționeze cu mai multe cazuri de utilizare simultan, dar dacă un caz de utilizare sau un actor are mai multe relații, trebuie afișate doar interacțiunile semnificative). 

EXEMPLU DE USE CASE DIAGRAM/ DIAGRAMĂ DE UTILIZARE - Zona ONG

ZONA ONG (actori: ONG-SPECIALIST)

 ACTOR

USE CASE (funcționalitate)

 ACTOR

ONG (= utilizator-beneficiar) 

1. funcționalitate: problemă de rezolvat (ex. depunere declarație)

SPECIALIST (ex. contabil)

-

2. funcționalitate: rezolvare problemă (ex. depunere declarație)

SPECIALIST (ex. contabil = utilizator implicat)
ONG (= utilizator-beneficiar) 

3. funcționalitate: status/ stadiu rezolvare (use case de includere)

SPECIALIST (ex. contabil)
ONG (= utilizator-beneficiar) 

4. funcționalitate: recenzie pentru specialist (use case de extensie - opțional)

-

Pe baza specificațiilor definite, se poate crea macheta (mockup) proiectului (aplicație/ website etc.), folosindu-se instrumente precum FIGMA, BALSAMIQ etc.).

b. Definirea cerințelor software-ului (programului/ aplicației) > Document de cerințe software (Specificația de sistem)

c. Proiectare arhitecturală

d. Proiectare detaliată

e. Implementarea unităților programului (modulele)

f. Integrarea

g. Testarea de sistem

h. Testarea de acceptare

i. Întreținerea și operare

3. ACTIVITĂȚI DE ASIGURARE A CALITĂȚII

 

Medii vizuale de programare

SCRATCH (limbaj de programare vizual, util începătorilor - și copiilor - pentru a crea jocuri, animații, alte mici proiecte și a înțelege noțiuni de bază ale limbajelor de programare, precum tipuri de date, variabile, instrucțiuni de control etc.) - se poate folosi on line sau descărca pe calculator
(https://scratch.mit.edu)

(click pe + sau - pentru a desfășura sau restrânge conținutul reperelor)

Realizarea unui joc ”Prinde mingea”
1. SPRITE - ALEGEREA PERSONAJULUI (SAU A UNUI OBIECT) CARE PRINDE MINGEA

(în colțul din dreapta-jos al ecranului) CLICK PE CAPUL PISICII > se alege personajul (pisica este personaj implicit)

2. CREAREA DE BLOCURI (PENTRU REALIZAREA COMENZILOR - acțiuni, sunete etc.)

(se trag piesele din coloana stângă în partea centrală) - acțiunea începe dacă se face click pe steagul verde - se adaugă în block din secțiunea EVENIMENTE (EVENTS - cu bulină galbenă) CÂND SE FACE CLICK PE STEAGUL VERDE (WHEN FLAG CLICKED) 

- schimbarea poziției pisicii: din secțiunea MOTION (cu bulina albastră) > se trage CHANGE/ MODIFICĂ x CU 10 (apăsând tasta săgeata dreapta)

MIT APP Inventor (mediu de programare vizual, pe înțelesul tuturor, cu care se pot realiza aplicații pentru telefon sau tabletă) - crearea aplicațiilor în mediul online (https://login.appinventor.mit.edu)
Realizarea unei aplicații ”Prinde mingea”
1. CREAREA APLICAȚIEI

(în colțul din stanga-sus al ecranului) CREATE APPS (necesită crearea unui cont) > în meniul de sus: PROJECTS > START NEW PROJECTS > CREATE NEW APP INVENTOR PROJECT

2. SETAREA ECRANULUI

- (setarea ecranului fără derulare - pentru ca ecranul interfeței să fie corect poziționat) > în meniul din stânga: DRAWING AND ANIMATION > CANVAS (se trage în coloana din mijloc a ecranului) > în dreapta ecranului, prima coloană - click pe SCREEN1 > în dreapta ecranului, a doua coloană - în DESIGNER - Scrollable trebuie să fie debifat

- (setarea dimensiunilor ecranului interfeței) > în meniul din stânga: DRAWING AND ANIMATION > CANVAS (se trage în coloana din mijloc a ecranului) > în dreapta ecranului, prima coloană - click pe CANVAS1 > în dreapta ecranului, a doua coloană - în DESIGNER - la HEIGHT și la WEIGHT, de bifat FILL PARENT

3. ADĂUGAREA UNEI MINGI

- în meniul din stânga: DRAWING AND ANIMATION > BALL (se trage în coloana din mijloc a ecranului) > în dreapta ecranului, prima coloană - click pe BALL1 > în dreapta ecranului, a doua coloană - în DESIGNER - se poate schimba dimensiunea mingii la RADIUS

- în dreapta ecranului, a doua coloană - click BLOCKS > în stânga ecranului: SCREEN1 CANVAS1  > BALL (se adaugă blocuri) > se trage în centrul ecranului blocul ”when - Ball 1 -.Flung ... x y speed heading xvel yvel... do” - marcat cu maro (Flung declanșează la o glisare rapidă cu degetul pe ecran acțiunea de aruncare a mingii - aruncare = flinging)

- SETAREA DIRECȚIEI ȘI A VITEZEI MINGII: în stânga ecranului: SCREEN1 CANVAS1  > BALL (se adaugă blocuri) > se trag în centrul ecranului blocurile ”sett - Ball 1 - Speed - to” (se setează viteza mingii la aceeași valoare cu a gestului de glisare a degetului pe ecran) și ”sett - Ball 1 - Heading - to” (se setează direcția mingii, care să fie aceeași cu a gestului de glisare a degetului pe ecran) - marcate cu verde > cele două blocuri pentru viteză (speed) și direcție (heading) trebuie să fie (conectate) în interiorul blocului .Flung > cu click pe parametrii SPEED și HEADING se adaugă blocurile GET SPEED și GET HEADING (cu portocaliu)

- SETAREA ACȚIUNII MINGII DE A LOVI MARGINILE ECRANULUI (se folosește argumentul EDGE): în stânga ecranului: SCREEN1 CANVAS1  > BALL (se adaugă blocul) > se trag în centrul ecranului blocurile ”when - Ball 1 -.EdgeReached”

4. TESTAREA APLICAȚIEI PE TELEFON SAU PE TABLETĂ

- se instalează pe device aplicația (din App Store/ Magazin Play...) MIT APP INVENTOR > din mediul de programare de pe desktop, în meniul de sus - CONNECT AI COMPANION > se generează un QR CODE care se poate scana cu aplicația instalată pe device sau un cod care se poate introduce în aplicație.

NODE RED (mediu de programare vizual, bazat pe fluxuri de date) (https://nodered.org/)
 Rulare în Windows (instalare pentru Windows)
API Hello, World cu Node Red (+ Echo HTTP)

(înainte de a începe, se deschide din Start > Node.js Command Prompt (în folder Node.js) > se tastează comanda node-red 

1. DESCHIDEREA UNUI PROIECT NOU

(în browser) http://localhost:1880 - se va deschide o fereastră Flow1

2. API ”Hello” + Echo HTTP

- (din secțiunea stângă a ecranului) se trag nodurile: http in (method: GET, url: /hello) click Done - function (msg.payload = { message: "Hello, World!" }; return msg; ) click Done - json (Property: msg.payload) click Done - http request (poate rămâne necompletat) - se creează  legături între ele

- (tot din secțiunea stângă a ecranului) se trag nodurile: http in (method: POST, url: /echo) click Done json (Property: msg.payload) click Done - function (return msg; ) click Done json (Property: msg.payload) click Done http request (poate rămâne necompletat) - se creează  legături între ele

3. Deploy

- (în dreapta sus a ecranului) click DEPLOY

4. Afișare

(în browser) http://localhost:1880/hello - se va deschide o fereastră cu conținutul Hello, World

 

Limbaje de programare

 Limbaj de marcare
Utilizează simboluri sau etichete într-un text. delimitând, identificând și descriind informații specifice.

HTML - limbaj de marcare (a textului astfel încât să poată fi afișat) pentru publicarea documentelor pe internet

- se folosește un set fix de marcaje (tag-uri = un șir de caractere delimitat de caracterele ”<" și ”>") prestabilite pentru a se defini modul în care este afișat conținutul pe internet (nu se referă la tipul informației conținută în document)

CEL MAI SIMPLU (MINIMALIST) WEBSITE - "Hello, World!" cu HTML

<!DOCTYPE html>

<html>

  <head>

    <title>Heading Example</title>

  </head>

  <body>

    <h1>Hello, World!</h1>

  </body>

</html>

XML - limbaj de marcare extensibil (generic) - marcare a datelor pentru a fi înțelese/ procesate automat de calculator, destinat structurării (de date ierarhice folosind etichete personalizte) și schimbului de date (transportului/ transferului) între sisteme și aplicații diferite

- se folosesc (tag-uri = un șir de caractere delimitat de caracterele ”<" și ”>") care conțin date caracter - marcajele și datele caracter formează un DOCUMENT XML.

- un FIȘIER XML este format din: PROLOG (instrucțiune de procesare, care indică versiunea - 1.0, encodarea setului de caractere - UTF-8), DEFINIȚIA TIPULUI DE DOCUMENT (opțională) și ELEMENTUL RĂDĂCINĂ, care este unic (în exemplul ”Hello, World!” ceea ce este cuprins între tag-urile <message> și </message>).

- formatul XSD arată că este un fișier XML, în care s-a folosit o schemă pentru definirea structurii, conținutului și regulilor de validare ale unui document xml.

Descărcarea (gratuit) editorului XML COPY EDITOR: http://xml-copy-editor.sourceforge.io

"Hello, World!" cu XML

<?xml version="1.0" encoding="UTF-8"?>
<message>
     <greeting>Hello, World!</greeting>
</message>

Exemplul BIBLIOTECA, de document XML care conține date

<?xml version="1.0"?>
<BIBLIOTECA>
     <CARTE>
           <TITLU>Poezii</TITLU>
           <AUTOR>Mihai Eminescu</AUTOR>

     </CARTE>
</BIBLIOTECA>

Crearea unui fișier XML cu Excel
  •  1. Realizarea unei liste (NU TABEL!) într-o foaie de calcul Excel

TITLU

Poezii

AUTOR

Mihai Eminescu

  •  2. Activarea opțiunii DEVELOPER în meniul Excel

 În File > Options > Customize Ribbon > se bifează (în partea dreaptă) Developer

  •  3. Crearea unui fișier XML pentru mapare

 Folosind un editor (XML COPY EDITOR sau altul), se scrie o structură XML pentru mapare  (salvare ca format .xml). Sunt necesare cel puțin două înregistrări (blocuri de date) în structură pentru a se genera fișierul XML.

<?xml version="1.0"?>
<BIBLIOTECA>
     <CARTE>
           <TITLU>Poezii</TITLU>
           <AUTOR>Mihai Eminescu</AUTOR>

     </CARTE>
     <CARTE>
           <TITLU>Jurnalul fericirii</TITLU>
           <AUTOR>N. Steinhardt</AUTOR>

     </CARTE>
</BIBLIOTECA>

  •  4. Încărcarea fișierului XML creat pentru mapare și maparea coloanelor din Excel

În meniul Excel: Developer > butonul Source > (în partea dreapta a ecranului se va deschide XML Source > XML Maps > Add > (se adaugă fișierul XML creat cu editorul) > se trage cu cursorul câmpurile din structura XML încărcate în dreapta spre titlurile coloanelor > se exportă fișierul Excel cu format XML Data (.xml).

* Dacă se adaugă noi titluri și autori în lista Excel, aceste date vor apărea în noul fișier exportat în format XML, care poate fi deschis cu editorul XML.

(despre  XAML la .NET)
 Bază de date = o colecție de obiecte
= un ansamblu de date integrat, un sistem organizat pentru stocarea, gestionarea și interogarea datelor, iar structura descrierii este numită dicționar de date sau metadate.
 SQL (Standard Query Language)
- limbaj standard de interogare
 Arhitectura unu sistem de gestione a bazelor de date (SGBD)  
Componente: - baza/ baze de date (colecții de date, indecșii); - sistemul de gestiune a bazei/ bazelor de date (programe de gestiune a SGBD) - proceduri manuale sau automate (aplicații), utilizatori, reglementări administrative etc. Arhitectura internă a unui SGBD are 3 niveluri: 1. nivelul intern/ fizic (VIZIUNEA INGINERULUI - structura fizică a datelor în baza de date) - unde se descriu detaliile complete ale stocării și modul de acces la date; 2. nivelul conceptual (VIZIUNEA ADMINISTRATORULUI - descrierea structurii bazei de date, dar sunt acunse detalii privind stocarea fizică): - descrierea entităților, a tipurilor de date, a relațiilor între date, a restricțiilor de asociere în mod independent de aplicații; 3. nivelul extern/ logic (AL PROGRAMATORULUI - vizual - la care are acces utilizatorul) - se realizează cartografierea (mapping) - procesul de transfer a cererilor și rezultatelor între niveluri
 Entitate logică (în bază de date) 
= un obiect sau ceva din lumea reală, cu o existență independentă (tabel), având anumite proprietăți (atribute), care descriu entitatea și despre care există date înregistrate (o mulțime de n-upluri distincte), fiind reprezentate de câmpuri ale tabelului (fiecare entitate are o cheie primară ca identificator unic). - Atributele = au valori pentru (înregistrări în tabel) a se putea identifica entitatea. - Atribut complex sunt compuse din mai multe părți cu semnificație independentă (de exemplu, o adresă). - Atribute atomice nu sunt compuse, iar prin concatenarea acestora se formează atribute complexe. - Atribute cu o singură valoare: CNP; - Atribute cu mai multe valori: culorile; - Atribute derivate - se pot determina din alte atribute (de exemplu, data nașterii se poate deduce din CNP). Atributul NULL- entitatea nu are nici o valoare asociată
 SCHEMA CONCEPTUALĂ A BAZEI DE DATE
Structura și regulile de organizare a bazei de date: 1. TABELE; 2. COLOANE (câmpuri); 3. CHEI PRIMARE; 4. CHEI STRĂINE; 5. REGULI PENTRU VALIDAREA DATELOR; 6. RELAȚII sau RESTRICȚII ÎNTRE DATE (1:1, 1:N, N.M)

* pentru a lucra cu baze de date, se pot folosi XAMPP și DBeaver

TIPURI DE DATE

1. TIPURI DE DATE NUMERICE (ÎNTREGI)

*pot avea definit atributul UNSIGNED

- TINYINT

- SMALLINT

- MEDIUMINT

- INT

- BIGINT

- Clauza ZEROFILL - se completează la stânga până se ajunge la numărul de cifre specificat (de exemplu, pentru INT(7) ZEROFILL: valoarea 10 va fi afișată 0000010

2. TIPURI DE DATE NUMERICE (DECIMAL) *suportă UNSIGNED

3. TIPURI DE DATE NUMERICE - FLOAT și DOUBLE PRECISION

4. TIPURI DE DATE BIT

5. TIPURI DE DATE TEMPORALE

- DATE

- TIME

- DATETIME

- TIMESTAMP

- YEAR

6. TIPURI DE DATE ȘIR DE CARACTERE

- CHAR

- VARCHAR

- BLOB

- TEXT

6. TIPURI DE DATE ENUM

- CHAR

- VARCHAR

- BLOB

- TEXT

 Pași instalare XAMPP
- se descarcă gratuit și se instalează MySQL, Apache - se instalează și phpMyAdmin; - la Action: START Apache și MySQL, apoi click ADMIN MySQL

(ATENȚIE! pentru a se vedea modificările în baza de date, este necesar click dreapta - REFRESH)


 MySQL 

 MySQL 
CONECTARE LA SERVERUL SQL (în DBeaver)

1. CONECTARE LA SERVERUL SQL (în DBEAVER): Database - New Database Connection - click MySQL - Next - Main - Host: Localhost - Port: 3306 - Test Connection - Download

CREAREA UNEI BAZE DE DATE ȘI REALIZAREA (proiectarea logică/ modelarea) SCHEMEI BAZEI DE DATE (în DBeaver)
 Proiectarea unei baze de date
= elaborarea schemei conceptuale (descrierea concisă a datelor utilizatorului: descrierea detaliată a tipurilor de date, a relațiilor și restricțiiloe), utilizând un model de nivel înalt. PROIECTAREA LOGICĂ a bazei de date = transpunerea schemei conceptuale în modelul de date al SGBD folosind un limbaj SQL. PROIECTAREA FIZICĂ a bazei de date = alegerea structurilor de memorare și de acces la fișierelor (timp de răspuns, spațiu de memorare, capacitate de tranzacționare)

1. CREAREA BAZĂ DE DATE: (în noua conexiune) click dreapta Databases - Create New Database - Database Name: Exemplu (crearea unei baze de date, dar și a obiectelor se poate face și făcând un script nou (click dreapta pe conexiune - SQL Editor - New SQL Script: CREATE DATABASE Exemplu) sau folosind un script SQL existent (File - Open - se deschide scriptul SQL). Import bază de date deja existentă (un fișier Dump): click dreapta pe baza de date creată - Tools - Restore Database - selectare fișier - Start

 Modelul entitate-relație
= (model conceptual de nivel înalt) schema conceptuală a bazei de date realizată cu ajutorul entităților și a relațiilor dintre ele
 Relație între entități
- corespondență între entități din una sau mai multe mulțimi; Gradul unei relații (= numărul de mulțimi de entități asociate): binare (între 2 mulțimi de entități: - one to one, - one to many (cheia străină se află în tabelul din partea many; exemple: editură-localitate, cititor-localitate, cititor-categorie cititor), - many to many - se folosesc tabele intermediare pentru a stoca cheile străine ale ambelor tabele = exemple: profesor-materie, carte-autor, carte-editură, carte-categorie) sau multiple (între mai mult de 2 mulțimi de entități).
 n-uplu = înregistrare

2. CREARE TABELE - click dreapta pe Tables - Create New Table - Table Name...

MODIFICARE TABELE cu SQL script - (dacă este cazul, înainte se va adăuga USE nume_baza_de_date;) ALTER TABLE carte

DESIGN-ul TABELULUI: 3. ADĂUGAREA DE COLOANE (câmpuri) ÎN TABEL (nume, dată etc.): click dreapta pe Columns - Create New Column - Save - Refresh (necesită selectarea coloanei)

CONSTRÂNGERI/ CONSTRAINTS (reguli/ restricții în cadrul unui tabel/ între tabele - asupra valorilor dintr-un tabel/ dintr-o coloană pentru a nu exista date invalide sau greșite - exemplu: vârsta negativă):

4. PRIMARY KEY (cheia primară) dă unicitate fiecărui rând (de exemplu, nu pot exista două persoane cu același nume) și nu permite să fie Null, adică să lipsească - ALTER TABLE carte ADD CONSTRAINT pk_carte PRIMARY KEY (id); AUTO_INCREMENT se folosește pentru a se genera automat valori consecutive, de obicei pentru chei primare - ALTER TABLE carte

MODIFY id INT AUTO_INCREMENT;

5. FOREIGN KEY - cheia străină creează o relație/ legătura între două tabele, asigurând existența valorii în tabelul părinte, adică o înregistrare dintr-un tabel trebuie să se regăsească în al doilea tabel (Exemple: coloana mea trebuie să existe în alt tabel, deci FOREIGN KEY (coloana_mea) REFERENCES alt_tabel (coloana_lui) sau în tabelul editura există coloana id_localitate, care are legătură cu tabelul localitate: ALTER TABLE editura ADD FOREIGN KEY (id_localitate) REFERENCES localitate(id); )

 (pe diagrama creată, se poate selecta cheia primară dintr-un tabel, se trage cu mouse-ul de la rândul selectat spre columna echivalentă din tabelul vizat pentru relație);

* în relația many-to-many este necesară o tabelă intermedială, care conectează tabele independente prin chei străine, iar într-o astfel de relație găsim chei străine doar în tabela intermediară, nu și în tabelele independente (exemplu: o carte are mai multe categorii, o categorie are mai multe cărți)ALTER TABLE carte_categorie

    ADD CONSTRAINT fk_carte

    FOREIGN KEY (id_carte) REFERENCES carte(id);

și

ALTER TABLE carte_categorie

    ADD CONSTRAINT fk_categorie

    FOREIGN KEY (id_categorie) REFERENCES categorie(id);

6. CONSTRÂNGERI DE COLOANĂ SAU DE INTEGRITATE/ REGULI PENTRU VALIDAREA DATELORUNIQUE - pentru a nu permite duplicate într-o coloană (exemple: pentru logarea într-un cont se permite o adresă email unică, dar data nașterii unui autor poate fi aceeași pentru mai mulți - (dacă este cazul, înainte se va adăuga 

USE nume_baza_de_date;) ALTER TABLE carte

ADD CONSTRAINT uq_carte_isbn UNIQUE (isbn);

- ceea ce înseamnă că se modifică tabelul carte adăugându-se constrângerea pentru unicitate ISBN); NOT NULL - nu permite să lipsească valori, iar ID-ul, care este Primary Key, este NOT NULL (exemple de folosire NOT NULL: orice persoană are nume; nume obligatoriu pentru autor - ALTER TABLE autor MODIFY nume VARCHAR(100) NOT NULL; - se poate adăuga în aceeași instrucțiune MODIFY id INT(11) NOT NULL; (NULL = lipsă de informație - de exemplu, cei care locuiesc la casă nu completează numărul apartamentului); DEFAULT - valoare implicită; 7. CONSTRÂNGERI DE VERIFICARE: CHECK - impune o condiție): click dreapta pe Column Name - Check Constraint, de exemplu - se completează în General - Expressions - de adăugat și coloana referentă cu condiția Gen = 'M' sau 'F'

(Acțiuni referențiale - proiecții la ștergere: CASCADE, SET NULL, RESTRICT/ NO ACTION)

(* modificările referitoare la constrângeri apar în Constraints - este necesar click dreapta - REFRESH)

AFIȘARE ÎN DIAGRAMĂ A DETALIILOR UNUI TABEL cu MySQL - click dreapta pe baza de date - View Diagram (diagrama se poate salva ca imagine cu click dreapta - Sava diagram as...

 Pași instalare SQL SERVER ȘI SETĂRI
- SQL SERVER INSTALATION CENTER - Installation - New SQL Server standalone installation... - la INSTANCE CONFIGURATION - alegere Named instance SQL EXPRESS - la SERVER CONFIGURATION - Service Accounts - Service: SQL Service Database Engine; Account Name: NTSERVICE\MSSQL$SQLEXPRESS; Startup Type: Automatic; iar la Collation - SQL Latin1_General_CP1_CI_AS (1520 caractere diacritice pentru limba română); - Database Engine Configuration - Server Configuration - de bifat Mixed Mode (se poate seta parolă)

- cu SQL SERVICE CONFIGURATION MANAGER - SQL Server Services - SQL Server (SQLEXPRESS) - Running - Automatic (se poate seta din Properties - click dreapta), iar la SQL SERVER NETWORK CONFIGURATION - Protocols for SQLEXPRESS se poate activa protocolul TCP/IP (pentru a da acces clienților din rețea - valoarea implicită a portului este TCP 1433, dar este recomandat să se aleagă altă valoare pentru a se evita atacurile în rețea) - atenție la configurarea Firewall; - TCP/IP PROPERTIES - Protocol - Enabled YES, Listen All YES; IP ADRESSES: - IPAH - TCP Port - 1433

 MICROSOFT SQL SERVER 

 TransactSQL 
= extensie a limbajului SQL folosită în Microsoft SQL Server, care permite programare în serverul de baze de date (folosirea de variabile, bucle, condiții)
CONECTARE LA SERVERUL SQL (în DBEAVER și în SQL SERVER MANAGEMENT STUDIO)

1. CONECTARE LA SERVERUL SQL (în DBEAVER): Database - New Database Connection - click Microsoft SQL SERVER - Next - Main - a) Authentication: Windows Authentication  - la Setting se bifează Trust Server Certificate (de la Test Connection - Download Driver files); b) Authentication: SQL SERVER AUTHENTICATION (se completează user și parola) - la Setting se bifează Trust Server Certificate (de la Test Connection - Download Driver files)

2. CONECTARE LA SERVERUL SQL (în SQL SERVER MANAGEMENT STUDIO - https://learn.microsoft.com/en-us/ssms/install/install): File - Connect Object Explorer... - Server Name: .\SQLEXPRESS - Authentication: a) Windows Authentication/ b) SQL Server Authentication (cont administrativUsername: sa, Password: ... - Connect;)

COMENTARE în SQL SERVER: /* comentare */

CREAREA UNEI BAZE DE DATE ȘI REALIZAREA SCHEMEI BAZEI DE DATE

1. CREAREA BAZEI DE DATEDatabase - New Database - General - Database Name: Exemplu - proprietarul  bazei de date poate fi schimbat de la owner (Setări - de la Options: Collation: Romania CI_AS; Compatibility level recomandat - SQL Server 2014) - crearea unei baze de date, dar și a obiectelor se poate face și folosind un script SQL (File - Open - se deschide scriptul SQL)

2. CREARE TABELE - click dreapta pe Tables - New - Table... (cheile primare nu trebuie să aibă bifat Allow Nulls, dar pot fi setate cu autoincrementare - în partea de jos a paginii, la Column Properties - Identity Specification - Is Identity - Yes - cheia primară poate să nu fie autoincrementabilă când are valoare definită prin litere; activarea cheiței din meniu - este necesară selectarea întregului rând ID_Angajat) - Salvarea noului tabel - click Refresh în Object Explorer - se poate genera script SQL cu click dreapta pe tabelul creat - Script Table as... - Create to... - New Query Editor Window - Save (* dacă apare mesajul Saving changes is not permitted, în meniu - Tools - Options - Designers - Table Options - bifare Prevent saving changes that require table re-creation)/ Crearea tabelelor folosind script SQL: se selecteaza baza de date - File - Open - selectare script - click Execute

DESIGN-ul TABELULUI: 3. ADĂUGAREA DE COLOANE (câmpuri) ÎN TABEL (nume, dată etc.): click dreapta pe Columns - New Column - Save - Refresh (necesită selectarea coloanei)

CONSTRÂNGERI/ CONSTRAINTS (reguli/ restricții asupra valorilor dintr-un tabel/ dintr-o coloană pentru a nu exista date invalide sau greșite - exemplu: vârsta negativă):

4. PRIMARY KEY (cheia primară) dă unicitate fiecărui rând și nu permite să fie Null, adică să lipsească; 5. FOREIGN KEY - cheia străină creează o relație/ legătura între două tabele, asigurând existența valorii în tabelul părinte (pe diagrama creată, se poate selecta cheia primară dintr-un tabel, se trage cu mouse-ul de la rândul selectat spre columna echivalentă din tabelul vizat pentru relație); 6. REGULI PENTRU VALIDAREA DATELORUNIQUE - pentru a nu permite duplicate într-o coloană; NOT NULL - nu permite să lipsească valori (NULL = lipsă de informație); DEFAULT - valoare implicită; CHECK - impune o condiție): click dreapta pe Column Name - Check Constraint, de exemplu - se completează în General - Expressions - de adăugat și coloana referentă cu condiția Gen = 'M' sau 'F'

RELAȚIILE ÎNTRE TABELE (1:1, 1:N, N.M)

AFIȘARE ÎN DIAGRAMĂ A DETALIILOR UNUI TABEL cu SQL SERVER - în SSMS (dacă se cere Install Diagram Support, click pentru instalare): după crearea diagramei, click dreapta pe titlul tabelului - Table View - alegerea modului de afișare: Standard... (se poate face export diagramă cu click dreapta pe diagramă - Copy Diagram to Clipboard; în DBEAVER: click dreapta pe Tables - View Diagram

GENERARE SCRIPT SQL EXPORT (doar structura sau structura și date) - în fișier .sql - click dreapta pe baza de date - Tasks - Generate Script - Set Script Options - Advanced - Types of data to script

EDIT TOP 200 ROWS: click dreapta pe tabel - select Edit Top 200 Rows - permite vizualizarea/ verificarea rapidă a datelor, editare/ modificare rapidă a datelor, adăugare sau ștergere de rânduri

SELECT TOP 200 ROWS: click dreapta pe tabel - select Select Top 1000 Rows - permite doar vizualizarea/ verificarea rapidă a datelor, nu și editare/ modificare 

DESIGN (comandă utilă pentru a analiza structura unui tabel: denumiri ale coloanelor și ordinea acestora, tipuri de date, acceptarea valorilor NULL): click dreapta pe tabel - Design

 NORMALIZAREA DATELOR - identificarea entităților logice (exemple: tabelul PRODUSE - cu coloanele: IDProdus, Produs, Stoc -, tabelul COMENZI - cu coloanele: IDComanda, NumeClient, Data etc.) și a proprietăților acestora, ulterior putându-se organiza într-o bază de date, cu realizarea relațiilor între tabele 
= organizarea datelor în tabele pentru a se evita redundanța (repetarea inutilă) și erorile

- prin aducere la forma normală a datelor (descompunerea valorilor complexe/ compuse în valori atomice), se va obține o bază de date relațională (mai multe tabele, cu chei primare și operații logice între ele)

 INTEROGARE SQL (comandă/ query în limbajul SQL folosită pentru a comunica cu o bază de date - printr-o fereastră de interogare - click dreapta pe baza de date - New Query - scrierea setului de comenzi, de exemplu USE Bazadedate GO SELECT * FROM Comenzi - click Execute - se afisează rezultate din baza de date într-un DataGridView - click Save - se salvează un fișier script sql cu setul de comenzi) 
- prin interogare, se poate obține într-o bază de date: afișare, adăugare/ modificare/ ștergere de date, structurare sau gestionare de tabele - fereastră de interogare (SqlQuery Window) = editor pentru comenzi în limbajul SQL (queries) adresate serverului SQL, cu referire la o anumită bază de date, indicată prin comanda USE (din limbajul Transact-SQL)

- rezultatele afișate în urma unei interogări în DataGridView se pot copia, după selectare - click dreapta pe selecție - copiere sau salvare cu Save Results As... (datele pot fi copiate sau inserate într-un foaie Excel)

COMENZI/ QUERIES și SUBQUERIES (subinterogări) în fereastra de interogare
 Comanda SELECT -
= extrage date

Afișarea tuturor datelor din tabel - fără filtrare, fără ordonare

SELECT *

FROM Customers

Afișarea anumitor date din tabel - fără filtrare, fără ordonare (coloanele pot fi scrise una sub alta, dar cu spațiu înainte de virgulă sau se pot pune virgulele înaintea coloanelor)

SELECT CustomerID, Address, City, Phone

FROM Customers

Afișarea rezultatelor ordonate crescător după City

SELECT CustomerID, Address, City, Phone

FROM Customers

ORDER BY City ASC

Afișarea rezultatelor folosind comanda SELECT împreună cu clauza DISTINCT pentru a evita duplicate/ repetarea rezultatelor

SELECT DISTINCT City

FROM Customers

ORDER BY City

Afișarea rezultatelor folosind comanda SELECT împreună cu clauza AS (alias) pentru a afișa alt nume pentru o coloană

SELECT City AS Oras

FROM Customers

ORDER BY City

Afișarea rezultatelor folosind comanda SELECT împreună cu clauza WHERE pentru a filtra datele - a afișa doar acele înregistrări care îndeplinesc o anumită condiție

SELECT CustomerID, Address, City, Phone

FROM Customers

WHERE City = 'Cluj'

ORDER BY City

 Comanda INSERT - comanda se aplică la tabelele care nu au valoare de incrementare (Identity Increment bifat cu Yes, adică se autoincrementează, deci trebuie să fie No)
= adaugă date

Adăugarea de date cu comandă rapidăclick dreapta pe tabel - Script table as - Insert to - New Query Editor Window (se modifică datele care urmează după VALUES, puse între '...')

 Comanda UPDATE 
= modificarea unor date existente în tabel

Actualizare de date cu comandă rapidăclick dreapta pe tabel - Script table as - Update to - New Query Editor Window (se modifică datele care urmează după VALUES, puse între '...')

 Comanda DELETE 
= ștergerea unor date existente în tabel, dar să includă clauza WHERE

Ștergerea de date cu comandă rapidăclick dreapta pe tabel - Script table as - Delete to - New Query Editor Window (se modifică datele care urmează după VALUES, puse între '...')

 SUBINTEROGARE (Subquery)
- aparține de o interogare exterioară, însă codul subinterogării poate fi separat sau integrat în interogarea exterioară; - SUBINTERGOGARE SCALARĂ - returnează o singură valoare, de un anumit tip - poate fi poziționată în interogarea exterioară (în comanda SELECT sau în clauza WHERE etc.) - se poate folosi o variabilă temporară; - SUBINTEROGARE ÎNCORPORATĂ - poate înlocui folosirea unei variabile (de exemplu, scriind în clauza WHERE o sub-interogare scalară - se returnează o valoare scalară, nu un set de valori); - o subinterogare care nu returnează nici o valoare returnează un răspuns NULL; - SUBINTEROGARE MULTIVALOARE returnează mai multe valori (de exemplu, folosind clauza WHERE și predicatul IN (iar dacă se folosește NOT IN, se obține efectul invers)
 Diferența dintre comanda SELECT și afișarea folosind VIEW
- folosind interogarea SELECT, datele sunt afișate, dar cu VIEW, afișarea tabelară a datelor va putea fi salvată și refolosită sau arătată altor utilizatori (fiind un tabel virtual, fără acces la date, oferă securitate)
VEDERI asupra datelor existente (afișare cu salvarea listei) - folosire Query Builder
 VEDERE/ VIEW = tabel virtual, în care se văd doar date selectate, diferența față de simpla interogare cu SELECT fiind că se poate salva și reutiliz
= o chestionare a datelor din mai multe tabele, care se poate repeta, rezultatul fiind o situație privind datele în momentul chestionării

PREGĂTIREA CHESTIONĂRII: Crearea unei vederi folosind Query Builder (înseamnă construirea unei comenzi SELECT): click dreapta pe baza de date - New Query sau pe View - New View - Add Table (alegerea tabelelor) - pentru a vedea Lista tuturor clienților, se bifează All columns sau doar coloanele necesare în funcție de situație - la Output, apare bifare True sau False (panourile 1 și 2 sunt sincronizate, iar modificările se transmit automat în comanda SELECT din panoul 3; de asemenea, modificările la comanda SELECT se transmit în panourile 1 și 2). 

/* Lista tuturor clientilor */

SELECT *

FROM Customers

* pentru a obține ordinea alfabetică, se selectează în coloana Sort Type - pe același rând cu CustomerID

/* Lista tuturor clientilor */

SELECT *

FROM Customers

PREGĂTIREA CHESTIONĂRII: Configurarea sortării/ ordonării datelor: în panoul 2 - pe coloana Sort Type (echivalentul clauzei ORDER BY - modul de sortare a datelor)/ pe coloana Sort order (se poate face sortare multiplă, după număr de ordine); - în coloana Filter se notează condiția de filtrare: = 'Germany' pe randul aferent valorii Country - se folosește clauza WHERE; - în panoul 3, click dreapta pe script - Execute (pentru a afișa rezultatele sortării în panoul 4) 

/* Lista tuturor clientilor */

SELECT *

FROM Customers

* pentru a obține lista clienților din țări cu U, se modifică WHERE (Country LIKE 'U%')

* pentru a obține lista clienților din țări cu nume diferite, se modifică WHERE (Country IN (N'France', N'Germany'))

* pentru a obține lista clienților din alte țări decât Canada: 

WHERE (dbo.Customers.Country NOT LIKE ('Canada')) sau WHERE dbo.Customers.Country <> 'Germany'

* pentru a obține lista clienților cu nume care încep cu litere A, D, se adaugă WHERE (Country IN (N'France', N'Germany')) AND (CustomerName LIKE N'A%' OR

             CustomerName LIKE N'D%')

/* Lista tuturor clientilor */

SELECT *

FROM Customers

* pentru a obține lista filtrată după an și lună WHERE (YEAR(dbo.Orders.OrderDate) = 2022) AND (MONTH(dbo.Orders.OrderDate) = 5)

* pentru a obține lista filtrată pentru o perioadă între doi ani: WHERE (YEAR(HireDate) BETWEEN 2016 AND 2017)

VIZIBILITATEA DATELOR UNEI VEDERI CREATE:  Deschiderea unei vederi: View (Refresh) - dbo.View - Design

FUNCȚII ÎNCORPORATE în SQL Server
 Funcții încorporate (scalare): LEN, UPPER, ROUND, ISNULL
= sunt predefinite în sistemele de baze de date și nu este necesară definirea lor de către utilizator; - prelucrează fiecare rând în parte, returnând o valoare pentru fiecare; - Pot fi folosite în SELECT, WHERE, ORDER BY.
 FUNCȚII MATEMATICE
= funcții scalare pentru efectuarea unui calcul folosind parametrii de intrare (argumente), rezultând o valoare numerică.
 FUNCȚII PENTRU ȘIRURI DE CARACTERE
= argumentul primit este un șir de caractere, rezultând un șir sau o valoare numerică
 FUNCȚII PENTRU VALORI DE TIP DATE și TIME
= returnează dată calendaristică și timp
 FUNCȚII PENTRU CONVERSIA TIPURILOR DE DATE
Conversie implicită; Conversie explicită cu CAST și CONVERT (se poate converti o dată care este variabilă de tip DateTime în formatul României - ZZ.LL.AAAA sau pentru ca toate mărimile din formulă să fie de același tip)
FUNCȚII DE AGREGARE în SQL Server

* interogările se fac în fereastra Designer

 Funcții de agregare: COUNT,  SUM
- prelucrează un grup de rânduri (realizează un set de calcule asupra unui set de date, adică aplică o anumită funcție) și returnează o singură valoare sintetică. În comanda SELECT funcțiile de agregare sunt folosite împreună cu clauza GROUP BY. Cu excepția funcției COUNT, funcțiile de agregare ignoră valorile NULL.
 FUNCȚIA COUNT
- determină numărul de rânduri rezultat în urma unei interogări (de exemplu: numărul de rânduri dintr-un tabel sau numărul de țări selectați pe țări (se va folosi clauza DISTINCT pentru a arăta numărul de țări și nu numărul total de clienți)
 FUNCȚIA SUM
- returnează suma unor valori numerice, ignorând valorile NULL (de exemplu: valoarea fiecărei comenzi sau totalul încasat de la un client pentru toate comenzile lui)
PROGRAMARE PROCEDURALĂ (pas cu pas)
- pentru a realiza un cod, se folosesc secvențe de program organizate în unități distincte (proceduri sau funcții), independente și reutilizabile (modulare), fiecare rezolvând o anumită sarcină.
PROGRAMARE ORIENTATĂ PE OBIECTE
- variabilele sunt închise în obiecte
 Polimorfismul
= (din greacă: ”cu mai multe forme”), adică ”o singură interfață, mai multe metode” - permite existența unei interfețe care să fie cu acces la un grup generic de acțiuni
 Încapsularea
Mecanismul combină datele și codul prin care acestea sunt gestionate, păstrându-se integritatea lor față de influențe exterioare prin crearea unui OBIECT (în cadrul căruia, codul și datele pot fi private - sunt accesibile doar în cadrul aceluiași obiect - sau private - pot fi utilizate și din părți ale programului care există în afara respectivului obiect).
 Clasa (unitate fundamentală a încapsulării) = un șablon
(exemplu: clasa este categoria Mașină, iar obiectul este echivalent unei mărci, chiar model al unei mărci - Dacia Logan) = indică datele și codul care gestionează datele - un șablon care definește aspectul și comportamentul viitorului obiect (care este o instanță a clasei) - conțin MEMBRI: proprietăți (descriu atributele unui obiect - ASPECT), metode (descriu operațiile specifice pe care le poate efectua un obiect - COMPORTAMENT), câmpuri private (variabile vizibile în cadrul obiectului - VIZIBILITATE), constante, constructori (cu sau fără parametri - poartă numele clasei și sunt apelați pentru crearea unui nou obiect - CREARE), evenimente, tipuri încorporate
 Obiecte (fac parte dintr-o clasă - sunt instanțe ale unor clase) = un rezultat obținut cu șablonul 
(exemplu: din clasa mașină, obiectul este echivalentul unui model Dacia Logan 2008) - pot fi create mai multe instanțe ale aceleiași clase (mai multe obiecte în aceeași clasă, în același program); - aspectul unei instanțe poate fi diferit - exprimat prin aceleași proprietăți, dar cu valori diferite; - fiecare instanță are comportament identic, având aceleași metode și poate efectua aceleași acțiuni
 Moștenirea
= un obiect primește caracteristicile obiectului părinte
 Reutilizarea
= o clasă nou creată poate fi utilizată pentru a crea o mulține de noi alte obiecte

- limbaj de programare de nivel mediu (programare procedurală) 

Tipuri de date

DATA TYPES (succesiuni de biți - 0 sau 1, măsurate în octeți - BYTE, adică 8 biți) = zone/ bucăți din memoria RAM dedicate unei instrucțiuni) 

VARIABILE

VARIABILELE (pot fi imaginate ca niște cutii cu conținut variat) = zone/ bucăți din memoria RAM dedicate unei instrucțiuni) - șiruri alfanumerice, având un NUME și o VALOARE (sunt senzitive la litere mari sau mici, care, în acest limbaj, nu pot începe cu cifră, nu pot conține caractere speciale, nu pot fi separate prin spații (spațiul este înlocuit cu _)

Variabile scalare 

VARIABILE NUMERICE (int = număr fără virgulă și float = număr cu virgulă)

- funcțiile int () și float () se folosesc pentru a converti un șir într-un număr

VARIABILE DE TIP CARACTER (string)

(string înseamnă șir)

ATENȚIE LA CUVINTELE REZERVATE (CHEIE)! 
Este de preferat să se evite folosirea cuvintelor rezervate ca denumire de variabilă! - in - yield - nonlocal - assert - def = definește (folosit în structura funcțiilor, pentru a da nume funcției)

- funcția str () se poate folosi pentru a converti un număr într-un șir - str(number)

(nu se pot amesteca variabile numerice cu variabile de tip string, dar cele numerice se pot converti în string)

OPERATORI sunt folosiți pentru a da valori variabilelor

Structuri de date liniare

ȘIRURI (un tip de dată de bază format din caractere numerice)

(pentru editare de coduri, se pot folosi Code Blocks sau CLion)

C++ este un limbaj de nivel înalt, adică programare orientată pe obiecte)

 Structuri de date neliniare

GRAFURI

GRAF  = elementele unei mulțimi sau grup de obiecte/ set de puncte, adică NODURI, unite sau conectate, două câte două, prin MUCHII sau CURBE(pe baza unei relații).

GRAF NEORIENTAT (G) = o pereche ordonată de mulțimi de noduri (notate X - nodes) și de muchii (notate U - edges). LANȚ AL UNUI GRAF = o succesiune de vârfuri, unde oricare două vârfuri consecutive sunt adiacente. GRAF PARȚIAL AL UNUI GRAF INIȚIAL = un graf obținut prin eliminarea uneia sau mai multor muchii. SUBGRAF AL GRAFULUI INIȚIAL - un graf obținut prin eliminarea unor noduri șia muchiilor incidente lor. GRAF COMPLET = oricare două noduri sunt adiacente. CICLU ELEMENTAR = toate nodurile sunt diferite, cu excepția primului și ultimului. NODUL IZOLAT = are gradul 0. MATRICE DE ADIACENȚĂ a[i][j], unde 1 se notează dacă există muchie între i și j, (i,j aparține mulțimii de muchii U), iar 0 se notează daca nu există muchie între i și j (i, j nu aparține mulțimii de muchii U). LISTE DE VECINI = se notează nodurile vecine fiecărui nod

 

EXEMPLU
Harta - graf ponderat (fiecare muchie are asociată o valoare numită cost = lungime, capacitate etc.)
ARBORI (structuri arborescente)

ARBORE = colecție de noduri, unde fiecare nod are asociată o anumită informație și o colecție de descendenți (fii - nodul care urmează imediat sub nodul-părinte). Rădăcina unui arbore = un nod unic, care nu are părinte.

ARBORI BINARI = fiecare nod are maxim doi descendenți, știindu-se exact care este fiul stâng și fiul drept (nodurile fără fii sunt frontieră a arborelui).

 PYTHON - este un limbaj de nivel înalt, adică programare orientată pe obiecte

(pentru editarea liniilor de cod se poate folosi mediul de dezvoltare PyCharm - acesta permite navigarea prin proiect și cod, vizualăzări de specialitate ale codurilor, structurii fișierelor și salturi între fișiere, clase, metode)

Opțiuni din meniul Pycharm 
- RUN - rularea unui fișier

- este obligatorie identarea codului (tab)

comentariile în Python se notează cu #

Tipuri de date

VARIABILE

VARIABILELE (pot fi imaginate ca niște cutii cu conținut variat) = DATE/ DATA TYPES (succesiuni de biți - 0 sau 1, măsurate în octeți - BYTE, adică 8 biți) = zone/ bucăți din memoria RAM dedicate unei instrucțiuni) - șiruri alfanumerice, având un NUME și o VALOARE (sunt senzitive la litere mari sau mici, care, în acest limbaj, nu pot începe cu cifră, nu pot conține caractere speciale, nu pot fi separate prin spații (spațiul este înlocuit cu _)

Variabile scalare 

VARIABILE NUMERICE (int = număr fără virgulă și float = număr cu virgulă)

- funcțiile int () și float () se folosesc pentru a converti un șir într-un număr

VARIABILE DE TIP CARACTER (string)

(string înseamnă șir)

ATENȚIE LA CUVINTELE REZERVATE (CHEIE)! 
Este de preferat să se evite folosirea cuvintelor rezervate ca denumire de variabilă! - in - yield - nonlocal - assert - def = definește (folosit în structura funcțiilor, pentru a da nume funcției)

- funcția str () se poate folosi pentru a converti un număr într-un șir - str(number)

(nu se pot amesteca variabile numerice cu variabile de tip string, dar cele numerice se pot converti în string)

Refactorizarea Python 
include redenumirea, metoda de extragere, introducerea variabilei, introducerea constantei, mutarea în sus sau în jos etc.
OPERATORI

OPERATORI sunt folosiți pentru a da valori variabilelor

(în ordine de prioritate - operațiile în paranteze au prioritate)

ARITMETICI

** (exponent/ ridicarea la putere: x **y, de exemplu: 2 la puterea 6 - 2 ** 6)
* (înmulțire)
/ (împărțire)
// (împărțire întreagă)
% (modulorestul împărțirii)
+ (adunare: x+y)
- (scădere)
EXEMPLE
2**3**2=512;
(2**3)**2=64

LOGICI 

and (ȘI logic)
or (SAU logic)
not (NU logic)

DE ATRIBUIRE

= (operator de atribuire)
Funcția
este un bloc de cod, adică o grupare de mai multe comenzi/ instrucțiuni care pot da o valoare (pași comunicați procesorului sub formă de date - biți -, folosind un anumit spațiu în memoria RAM) = rezultă îndeplinirea unei sarcini când funcția este apelată. - Unii spun că o funcție bine scrisă ar trebui văzută în întregime dintr-o singură privire .
Structura funcției
Funcția începe întotdeauna cu: 1. PRIMA LINIE: - cuvântul-cheie def - urmează numele funcției - apoi o pereche de paranteze rotunde - linia trebuie să se încheie cu două puncte def myfunction () 2. CORPUL FUNCȚIEI - date intrare (linia care urmează după prima linie def) - instrucțiuni imbricate 3. AFIȘARE - print = date ieșire (se va pune între paranteze și ghilimele conținutul care trebuie afișat)
Funcția PRINT
- este o funcție încorporată în Python, care afișează datele introduse

DE COMPARARE

PRECEDENȚA OPERATORILOR

(majoritatea operatorilor sunt considerați ca nivel de importanță de la stânga la dreapta, cu excepția operatorului exponent)

OPERAȚII (adunare, scădere etc.)

(în ordine de prioritate - operațiile în paranteze au prioritate)

Structuri de date liniare

ȘIRURI

ȘIRURI (un tip de dată de bază format din caractere numerice încapsulate în formate ASCII, UNICODE -UTF 8 etc., încadrate printr-o pereche de apostrof sau ghilimele)

INDEXARE

- este asociat caracterelor din șir

[-1] (arată ultima poziție din șir)

SEGMENTARE

- este asociat caracterelor din șir

[::] (arată toate caracterele din șir)
[x::] (arată caracterele din șir de la poziția indicată până la final)
[::-1] (arată caracterele din șir în ordine inversă)
[::2] (arată pozițiile impare din șir)
[1::2] (arată pozițiile pare din șir)
[2::3] (arată pozițiile divizibile cu 3 din șir)
Concatenare (Concationation) 
= însumarea a două sau mai multe șiruri într-unul singur (+) sau o combinare de caractere și cifre/ calcul de cifre
Metodă
este un tip specific de funcție, dar acționează diferit
Metoda .replace(`x`, `y`)
- returnează șirul înlocuit cu noul șir de n ori
Metoda .upper()
- returnează șirul cu toate caracterele transformate în majuscule
Metoda .lower()
- returnează șirul cu toate caracterele transformate în minuscule
Funcția
este un bloc de cod, adică o grupare de mai multe comenzi/ instrucțiuni care pot da o valoare (pași comunicați procesorului sub formă de date - biți -, folosind un anumit spațiu în memoria RAM) = rezultă îndeplinirea unei sarcini când funcția este apelată. - Unii spun că o funcție bine scrisă ar trebui văzută în întregime dintr-o singură privire .
Funcția INPUT
- este o funcție încorporată în Python, care citește de la tastatură variabile - date de intrare (rezultatul funcției Input este un șir de caractere introduse de la tastatură, cuprinzând un mesaj)
LISTE

LISTE  - se pun între paranteze drepte, iar intre valori trebuie să fie virgule = este o colecție de elemente scalare

- tipurile de date cuprinse în liste pot fi diferite

Metodă
este un tip specific de funcție, dar acționează diferit
Metoda .count(x)
- returnează de câte ori apare elementul x din listă

INDEXARE

Funcția
este un bloc de cod, adică o grupare de mai multe comenzi/ instrucțiuni care pot da o valoare (pași comunicați procesorului sub formă de date - biți -, folosind un anumit spațiu în memoria RAM) = rezultă îndeplinirea unei sarcini când funcția este apelată. - Unii spun că o funcție bine scrisă ar trebui văzută în întregime dintr-o singură privire .
Funcția LEN
- returnează numărul de obiecte din listă (lungimea listei)
Structura funcției
Funcția începe întotdeauna cu: 1. PRIMA LINIE: - cuvântul-cheie def - urmează numele funcției - apoi o pereche de paranteze rotunde - linia trebuie să se încheie cu două puncte def myfunction () 2. CORPUL FUNCȚIEI - date intrare (linia care urmează după prima linie def) - instrucțiuni imbricate 3. AFIȘARE - print = date ieșire (se va pune între paranteze și ghilimele conținutul care trebuie afișat)

SEGMENTARE

IF

(execută o singură dată)

STRUCTURI REPETITIVE

BUCLĂ CU WHILE (repetă execuția atâta timp cât condiția evaluează cu TRUE)

BUCLĂ CU FOR (utilă pentru seturi mai de date)

Funcția RANGE
stochează exact o valoare dată la un moment dat
Funcția
este un bloc de cod, adică o grupare de mai multe comenzi/ instrucțiuni care pot da o valoare (pași comunicați procesorului sub formă de date - biți -, folosind un anumit spațiu în memoria RAM) = rezultă îndeplinirea unei sarcini când funcția este apelată. - Unii spun că o funcție bine scrisă ar trebui văzută în întregime dintr-o singură privire .

 JAVA este un limbaj de nivel înalt, de programare orientată pe obiecte

IDE (mediu de dezvoltare integrat)
(Integrated Development Environment) = un program util pentru a scrie, a testa și a depana coduri; IntelliJ este preferat de programatorii Java.
Framework 
= o structură predefinită, oferind instrumente/ componente, cum ar fi aspect, butoane, formulare etc. și reguli
Mediul de lucru - Tech Stack
= set de tehnologii pentru mediul tehnic de lucru: limbaje de programare, structuri/ instrumente predefinite - framework-uri -, alte soluții software folosite pentru realizarea proiectului
Java EE versus Jakarta EE
= nume diferite pentru aceeași tehnologie: Java EE (Java Enterprise Edition) a fost lansată în 2013 - rulează pe servere mai vechi (de exemplu, Tomcat 9), iar apoi, în 2017 a apărut Jakarta EE
Aplicație web Hello World folosind Java Server Faces (JSF) și Bootsfaces, generator Maven Archetype, Java EE și server Tomcat 9

(ATENȚIE! pentru tehnologia JAVA EE se folosește server Tomcat 9, altfel apar erori, iar pentru Jakarta EE - Tomcat 10)

Front-end
Back-end
JSF (Java Server Faces - framework)
- Logica de business JSF are structura compusă (ce date există) din: 1. INTERFAȚA/ VIEW - componente (< h:inputText>, < h:commandButton> etc.) în fișiere .xhtml (component-based), 2. BEAN - Managed Beans (logica realizată cu cod Java - clase Java care fac legătura între UI și backend, rezultând navigare între pagini) și 3. MODEL (datele/ entitățile - DB - sunt accesate prin clase Java simple - POJO). 4. CONFIGURAȚII (web.xml și faces-config.xml). Ciclul de viață al cererilor (6 pași) - modul de funcționare (cum sunt procesate datele dintre UI și model): 1. Utilizatorul deschide (ÎNCARCĂ) o pagină (.xhtml), 2. Utilizatorul introduce date/ transmite informații într-un formular (aplicația CITEȘTE date), 3. JSF preia datele, le VERIFICĂ și le validează dacă sunt corecte; 4. Datele sunt transmise la bean (în model) - sunt SALVATE; 5. Se apelează metoda din bean (ceea ce trebuie să se proceseze) - SE EXECUTĂ; 6. metoda folosește modelul, se returnează/ SE AFIȘEAZĂ REZULTATUL în altă pagină.
Bootsfaces (componente pentru interfață)
(bibliotecă de componente, cum ar fi grid system, tabele etc.) = contribuie la aspectele legate de prezentare într-o aplicație, permițând înlocuirea unui CSS manual

ETAPA 1: CONFIGURAREA PROIECTULUI - MAVEN 

1. CREAREA UNUI PROIECT NOU 

(în IntelliJ) CREATE NEW PROJECT - (în partea stânga, la Generators, se alege:) MAVEN ARCHETYPE - org.apache.maven.archetypes:maven-archetype-webapp - (JDK - versiunea 17) - click CREATE

2. Frontend: ADĂUGAREA DEPENDENȚELOR (biblioteci externe - pentru a utiliza componente vizuale predefinite) 

(în pom.xml, dependețele trebuie să fie descrise astfel:)

 <dependencies>


<!-- JSF -->
<dependency>
<groupId>org.glassfish</groupId>
<artifactId>javax.faces</artifactId>
<version>2.3.9</version>
</dependency>

<!-- BootsFaces -->
<dependency>
<groupId>net.bootsfaces</groupId>
<artifactId>bootsfaces</artifactId>
<version>1.5.0</version>
</dependency>

<!-- Servlet API -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>

<dependency>
<groupId>org.jboss.weld.servlet</groupId>
<artifactId>weld-servlet-core</artifactId>
<version>3.1.9.Final</version>
</dependency>

</dependencies>

ETAPA 2: CREAREA LOGICII (MANAGED BEAN) 

3. Backend: ADĂUGAREA CLASEI MANAGED BEAN 
Managed Bean
= o clasă Java folosită în JSF care face legătura între interfața grafică și logica aplicației (codul Java)

CREARE PACHET JAVA (în folderul proiectului din src-main - click dreapta pe folderul java - echivalentul Sources Packages) - New - Package - nume: com.example.bean

CREARE CLASA JAVA (click dreapta pe pachetul com.example.bean) - New - Java Class - HelloBean - tasta Enter

package com.example;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;

@ManagedBean
@RequestScoped
public class HelloBean {

private String name;
private String message;

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String getMessage() {
return message;
}

public void sayHello() {
message = "Hello " + name;
}
}

 ETAPA 3: DEFINIREA INTERFEȚEI (.xhtml) 

4. ADĂUGAREA UNUI DIRECTOR (webapp - dacă nu a fost generat automat)

(click dreapta pe directorul src) NEW - DIRECTORY - Name (webapp)

5. ADĂUGAREA index.xhtml

(click dreapta pe directorul src) NEW - DIRECTORY - Name (webapp)

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:b="http://bootsfaces.net/ui">

<h:head>
<title>Hello JSF BootsFaces</title>
</h:head>

<h:body>

<b:container>

<b:jumbotron>

<h1>Hello World</h1>
</b:jumbotron>

<h:form>

<b:inputText value="#{helloBean.name}" placeholder="Enter name"/>

<b:commandButton value="Say Hello"
action="#{helloBean.sayHello}"
update="@form"/>

<br/><br/>

<h:outputText value="#{helloBean.message}"/>

</h:form>

</b:container>

</h:body>

</html>
6.  ÎN WEBAPP - web.xml

<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">

<display-name>HelloWorld</display-name>

<welcome-file-list>
<welcome-file>index.xhtml</welcome-file>
</welcome-file-list>

<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.xhtml</url-pattern>
</servlet-mapping>

</web-app>
7.  ÎN WEBAPP - beans.xml

<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee"
bean-discovery-mode="all">
</beans>

STRUCTURA PROIECTULUI (cele cu roșu necesită modificări)

Hello

- pom.xml

- src - 

          - main - 

                          - java

                                      - com

                                                - example

                                                           - HelloBean.java

                         - resources - 

                         - webapp - 

                                      - index.xhtml

                                     - WEB-INF

                                                - beans.xml

                                                - web.xml

Configurarea serverului: RUN - EDIT CONFIGURATION - (se adaugă) TOMCAT SERVER - LOCAL - (Deploy) ARTIFACT -HelloWorld:war exploded

După modificări: BUILD - REBUILD PROJECT și (din bara dreapta) MAVEN - Reload All Maven Projects

(ATENȚIE! pentru ca datele să fie păstrate la restart server este nevoie de integrare a unei baze de date - datele din memoria BEAN nu persistă)

* interacțiunea cu datele se face prin JPA și printr-un server de aplicații

Conectarea la o bază de date a unei aplicații web JSF (cu Bootsfaces), prin Java EE (JPA și JDBC)

* este nevoie de un driver JDBC pentru baza de date, cum este MySQL

1. CREAREA UNEI BAZE DE DATE

- în XAMPP (se descarcă gratuit și se instalează MySQL, Apache - se instalează și phpMyAdmin) - la Action: START Apache și MySQL, apoi click ADMIN MySQL 

- Local Host - numele serverului pe calculator: - adresa Local Host (afișată sus: Server 127.0.0.1

- pe serverul MySQL (Server 127.0.0.1 - în meniu BAZĂ DE DATE / DATABASES se CREEAZĂ baza de date: în căsuța Database name se notează exercitiu 

2. CREAREA UNUI CONT PE SERVERUL MYSQL (pentru conectarea aplicației)

- pe serverul MySQL (Server 127.0.0.1 - în meniu CONTURI UTILIZATOR/ USER ACCOUNTS se CREEAZĂ utilizator: utilizator și parola: parolaTa (la Nume gazdă se poate selecta Orice gazdă și se completează alăturat %) - administratorul trebuie să acorde toate privilegii Userului) are activat protocolul TCP/IP și lucrează pe portul TCP 3306;

3. ADĂUGARE DE INFORMAȚII ÎN BAZA DE DATE (realizarea de tabele și adăugarea da date în tabele)

- o bază de date nou creată nu conține tabele sau date, acestea trebuie create - de exemplu: username și password (se poate folosi un script SQL pentru importul tuturor tabelelor cu date) - în baza de date exercitiu - Import - se alege fișierul din calculator; în meniu - la Structură se va vedea conținutul bazei de date, al tabelelor;

- vizualizarea DIAGRAMEI - din meniu - More - Designer;

- INTEROGARE - din meniu - SQL

4. ADĂUGAREA DEPENDENȚELOR NECESARE PENTRU BAZA DE DATE în pom.xml

<!-- Exemplu pentru MySQL -->

<dependency>

    <groupId>mysql</groupId>

    <artifactId>mysql-connector-java</artifactId>

    <version>8.0.33</version>

</dependency>

<!-- JPA -->

<dependency>

   <groupId>java.persistence</groupId>

    <artifactId>java.persistence-api</artifactId>

    <version>2.2</version>

</dependency>

<dependency>

    <groupId>org.hibernate</groupId>

    <artifactId>hibernate-core</artifactId>

    <version>5.6.15.Final</version>

</dependency>

<dependency>

    <groupId>org.hibernate</groupId>

    <artifactId>hibernate-entitymanager</artifactId>

    <version>5.6.15.Final</version>

</dependency>

5. CREARE DIRECTOR resources - META-INF și fișier persistence.xml

* arată cum se face conectarea la baza de date

<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence
http://xmlns.jcp.org/xml/ns/persistence/persistence_2_2.xsd"
version="2.2">

<persistence-unit name="myPU" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>

<class>com.exercitiu.model.User</class>

<properties>
<property name="javax.persistence.jdbc.driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/exercitiu"/>
<property name="javax.persistence.jdbc.user" value="utilizator"/>
<property name="javax.persistence.jdbc.password" value="parolaTa"/>

<property name="hibernate.dialect" value="org.hibernate.dialect.MySQL8Dialect"/>
<property name="hibernate.hbm2ddl.auto" value="update"/>
<property name="hibernate.show_sql" value="true"/>
</properties>

</persistence-unit>

</persistence>

* dacă se folosește XAMPP, spațiul pentru parola root poate fi necompletat, dar fără a lăsa spații libere între ghilimele (

value="")

* dacă MySQL este instalat separat, este necesară parola aleasă la instalare

* se poate folosi Hibernate cu MySQL pentru a se evita erorile (de exemplu, hibernate.hbm2ddl.auto=update va crea automat tabela users în MySQL) 

6. CREARE. COMPLETARE  CLASA JAVA ENTITY JPA (fișierul User.java)

* adnotarea entității pentru a marca în această clasă ca fiind un tabel în baza de date

package com.exercitiu.model;

import javax.persistence.*;
import java.io.Serializable;

@Entity
@Table(name = "utilizatori")
public class User implements Serializable {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@Column(unique = true, nullable = false)
private String username;

@Column(nullable = false)
private String password;

// ======================
// Getters / Setters
// ======================
public Long getId() { return id; }
public void setId(Long id) { this.id = id; }

public String getUsername() { return username; }
public void setUsername(String username) { this.username = username; }

public String getPassword() { return password; }
public void setPassword(String password) { this.password = password; }
}
7. CREARE/ COMPLETARE CLASA JAVA BEAN MANAGED (JSF)

package com.exercitiu.bean;

import com.exercitiu.model.User;
//import com.exercitiu.service.UserService;
import javax.inject.Named; // Folosim CDI
import javax.enterprise.context.SessionScoped; // Folosim CDI
import javax.persistence.*;
import java.io.Serializable;
import java.util.List;

@Named(value = "userBean")
@SessionScoped
public class UserBean implements Serializable {

private String username;
private String password;
private User loggedUser;

// Factory-ul poate fi static
private static final EntityManagerFactory emf = Persistence.createEntityManagerFactory("myPU");

public UserBean() {}

public String login() {
// Creăm EntityManager-ul doar când avem nevoie de el
EntityManager em = emf.createEntityManager();
try {
TypedQuery<User> query = em.createQuery(
"SELECT u FROM User u WHERE u.username=:username AND u.password=:password", User.class);
query.setParameter("username", username);
query.setParameter("password", password);

List<User> result = query.getResultList();

if (result.isEmpty()) return "login?faces-redirect=true&error=true";

loggedUser = result.get(0);
return "dashboard?faces-redirect=true";
} catch (Exception e) {
e.printStackTrace();
return "login?faces-redirect=true&error=exception";
} finally {
em.close(); // Foarte important să îl închizi!
}
}
public String register() {
EntityManager em = emf.createEntityManager();
try {
em.getTransaction().begin();

User newUser = new User();
newUser.setUsername(this.username);
newUser.setPassword(this.password);

em.persist(newUser);
em.getTransaction().commit();

return "login?faces-redirect=true";
} catch (Exception e) {
if (em.getTransaction().isActive()) {
em.getTransaction().rollback();
}
e.printStackTrace();
return "register?faces-redirect=true&error=exception";
} finally {
em.close();
}
}
public String logout() {
loggedUser = null;
username = null;
password = null;
return "login?faces-redirect=true";
}

// Getters / Setters (Rămân la fel)
public String getUsername() { return username; }
public void setUsername(String username) { this.username = username; }
public String getPassword() { return password; }
public void setPassword(String password) { this.password = password; }
public User getLoggedUser() { return loggedUser; }
}
8. CREARE/ COMPLETARE CLASA JAVA LOGIN
package com.exercitiu.bean;
import com.exercitiu.model.User;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.persistence.*;
import java.io.Serializable;

@ManagedBean(name="loginBean")
@SessionScoped
public class LoginBean implements Serializable {

@PersistenceContext(unitName = "MyPU")
private EntityManager em;

private String username;
private String password;
private User loggedUser;

public String login() {
try {
loggedUser = em.createQuery(
"SELECT u FROM User u WHERE u.username=:u AND u.password=:p", User.class)
.setParameter("u", username)
.setParameter("p", password)
.getSingleResult();

return "projects.xhtml?faces-redirect=true";
} catch (NoResultException e) {
loggedUser = null;
return "login.xhtml?faces-redirect=true";
}
}

public String logout() {
loggedUser = null;
return "login.xhtml?faces-redirect=true";
}

public boolean isLoggedIn() { return loggedUser != null; }
public User getLoggedUser() { return loggedUser; }
public String getUsername() { return username; }
public void setUsername(String username) { this.username = username; }
public String getPassword() { return password; }
public void setPassword(String password) { this.password = password; }
}
9. CREARE/ COMPLETARE index.xhtml

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:b="http://bootsfaces.net/ui">
<h:head>
<title>Exercitiu - Home</title>
</h:head>
<h:body style="padding-top: 60px; background-color: #f5f5f5;">
<b:container>
<b:jumbotron>
<h1>Bun venit!</h1>
<p>Pentru a accesa platforma, te rugăm să te autentifici sau să îți creezi un cont nou.</p>
<br/>
<b:button value="Login" look="primary" size="lg" outcome="login.xhtml" style="margin-right: 10px;"/>
<b:button value="Înregistrare Cont" look="success" size="lg" outcome="register.xhtml"/>
</b:jumbotron>
</b:container>
</h:body>
</html>
9. CREARE/ COMPLETARE register.xhtml

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:f="http://xmlns.jcp.org/jsf/core"
xmlns:b="http://bootsfaces.net/ui">
<h:head>
<title>Înregistrare User</title>
</h:head>
<h:body style="padding-top: 60px; background-color: #f5f5f5;">
<b:container>
<h:form id="registerForm">
<b:panel title="Creare cont nou" style="max-width: 400px; margin: auto;" look="success">

<b:inputText value="#{userBean.username}" label="Utilizator" required="true">
<f:facet name="prepend"><b:icon name="user" /></f:facet>
</b:inputText>

<b:inputSecret value="#{userBean.password}" label="Parolă" required="true">
<f:facet name="prepend"><b:icon name="lock" /></f:facet>
</b:inputSecret>

<b:commandButton value="Înregistrare" action="#{userBean.register}" look="success" style="width:100%" />

<hr/>
<b:navLink value="Ai deja cont? Login" outcome="login.xhtml" />

<b:messages />
</b:panel>
</h:form>
</b:container>
</h:body>
</html>
10. CREARE/ COMPLETARE login.xhtml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:f="http://xmlns.jcp.org/jsf/core"
xmlns:b="http://bootsfaces.net/ui">

<h:head>
<title>Login</title>
</h:head>

<h:body>
<h:form id="loginForm">
<b:container>
<b:panel title="Login" style="max-width: 400px; margin: auto; margin-top: 50px;">
<b:inputText label="Username" value="#{userBean.username}" required="true" />
<b:inputSecret label="Password" value="#{userBean.password}" required="true" />
<b:commandButton value="Login" action="#{userBean.login}" look="primary" style="width:100%" />

<b:messages />
</b:panel>
</b:container>
</h:form>
</h:body>
</html>

11. CREARE faces-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<faces-config xmlns="http://xmlns.jcp.org/xml/ns/javaee"
version="2.3">
</faces-config>

* în directorul WEB-INF să existe beans.xml și web.xml

ASPECTUL UNEI APLICAȚII JSF (cu Bootsfaces)

* BootsFaces folosește Bootstrap (este un html în JSF), dar se poate realiza și CSS clasic

NAVIGAȚIE

Navigație simplă: b:button

Navigație cu logică (ex. Logout): b:commandButton

Navigație JSF: h:link

CENTRAREA UNUI TEXT:

<h:panelGroup layout="block" style="text-align:center;">

    <h2>Servus, #{userBean.loggedUser.username}</h2>

</h:panelGroup>

ADĂUGARE FEREASTRĂ POPUP

- în fișierul .xhtml

<h:form>

<!-- Buton care deschide popup-ul -->
<b:commandButton value="Deschide descriere"
onclick="$('.modalPseudoClass').modal('show'); return false;" />

<!-- Modal (popup) -->
<b:modal styleClass="modalPseudoClass" title="Descriere" closable="true">

<h:outputText value="Se afișează o descriere needitabilă." />

<f:facet name="footer">
<b:button value="Închide" dismiss="modal" />
</f:facet>

</b:modal>

</h:form>

- și

<h:outputText value="#{descriereBean.descriere}" />

- în backend - Java

public class DescriereBean {
public String getDescriere() {
return "Descriere (needitabilă)";
}
}

ADĂUGARE FEREASTRĂ POPUP ÎN CARE SĂ SE EDITEZE TEXT (cu salvare)

- în fișierul .xhtml

<h:form id="formProiect">


    <!-- Buton pentru adăugare/modificare descriere -->

    <h:panelGroup style="display:flex; align-items:center; gap:10px;">

        <h3 style="margin:0;">Descriere proiect</h3>

        <b:commandButton value="#{empty projectBean.selectedProject.description ? 'Adaugă descriere' : 'Editează descriere'}"

                         look="primary"

                         onclick="$('.modalDescriere').modal('show'); return false;" />

    </h:panelGroup>


    <br/>


    <!-- Afișare descriere existentă -->

    <h:outputText id="descriereOutput"

                  value="#{empty projectBean.selectedProject.description ? 'Nu există descriere' : projectBean.selectedProject.description}"

                  escape="false"/>


    <!-- Popup unic -->

    <b:modal styleClass="modalDescriere"

             title="#{empty projectBean.selectedProject.description ? 'Adaugă descriere' : 'Modifică descriere'}"

             closable="true"

             modal="true">


        <h:panelGrid columns="1" cellpadding="5">


            <h:outputLabel value="Descriere proiect:" for="descriereInput"/>

            

            <!-- Text editabil -->

            <b:inputTextarea id="descriereInput"

                             value="#{projectBean.selectedProject.description}"

                             rows="6"

                             style="width:100%;" />


            <br/>


            <!-- Salvează modificările -->

            <b:commandButton value="Salvează"

                             action="#{projectBean.saveDescription}"

                             update=":formProiect:descriereOutput"

                             look="success"

                             oncomplete="$('.modalDescriere').modal('hide');" />


        </h:panelGrid>


    </b:modal>


</h:form>

- în backend - Java

public Project getSelectedProject() {
return selectedProject;
}

public void setSelectedProject(Project selectedProject) {
this.selectedProject = selectedProject;
}

// Metodă pentru salvarea descrierii în DB
public void saveDescription() {
if (selectedProject == null) return;

try {
em.getTransaction().begin();
em.merge(selectedProject);
em.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
if (em.getTransaction().isActive()) em.getTransaction().rollback();
}
}

ADĂUGARE IMAGINE (exemplu: banner)

- în fișier .xhtml

<h:graphicImage library="images"
                        name="HelloWorldNASA-ReidWiseman.JPG"
                        styleClass="banner-img"/>

- în fișier css

.banner-img {
    width: 100%;
    height: 250px;
    object-fit: cover;
}

ARHITECTURA .NET FRAMEWORK (platforma Microsoft pentru dezvoltare de aplicații pentru Windows sau pentru Web)

 (ATENȚIE! * rulează numai cu Windows)

BASE CLASS LIBRARY (BCL)
= Biblioteca de clase cuprinde oferă un set de interfețe de programare și tipuri pentru funcționalități comune (citirea și scrierea fișierelor, conectarea la baze de date etc.)
COMMON LANGUAGE RUNTIME (CLR)
= motorul de execuție care controlează aplcațiile rulate (mediul de execuție al codului .NET, în care se gestionează memoria, accesul la resursele sistemului, securitatea resurselor și a codului executat).
Tehnologii destinate datelor (Data Tier) - ADO.NET, LINQ, XML
- pentru acces la date, interogarea datelor etc.
Tehnologii destinate comunicațiilor - WCF (Windows Communication Foundation), WF (Workflow Foundation)
Service Oriented Architecture - SOA
Tehnologii pentru interfețe grafice - GUI (Graphical User Interface): WinForms - proiecte de tip Windows Forms Application, WPF, ASP.NET, SilverLight
Service Oriented Architecture - SOA - proiectele construite folosind Windows Forms (WinForms) pot conține butoane, casete de text, etichete, liste, meniuri, ferestre etc.
Limbaje de programare: C#, F#, Visual Basic, altele - aplicațiile .NET sunt scrise în limbajele C#, F# sau Visual Basic
- rezultând fișiere cu extensia .dll sau .exe
ARHITECTURA .NET CORE (un framework destinat aplicațiilor pentru Windows, Linux, MacOS)

 (ATENȚIE! * rulează numai cu Windows)

Limbaje de programare: C#, F#, Visual Basic, XAML, TypeScript
- rezultând fișiere cu extensia .dll sau .exe
BASE CLASS LIBRARY (BCL)
= Biblioteca de clase cuprinde oferă un set de interfețe de programare și tipuri pentru funcționalități comune (citirea și scrierea fișierelor, conectarea la baze de date etc.)
VISUAL STUDIO (IDE - mediu integrat de dezvoltare a aplicațiilor software: scriere, editare, rulare, depanare, testare de coduri în diverse limbaje de programare - C#, C++, Python, JavaScript, TypeScript etc. și implementare de aplicații, cu asistență prin GitHub și inteligență arificială)
Indicații pentru instalare (versiunea 2022)
(este pe 64 biți) - la rularea Visual Studio Install - în meniu -WORKLOADS se bifează .NET desktop development; - la INDIVIDUAL COMPONENTS trebuie bifate: Class Designer; C# and Visual Basic Roslyn compilers; MSBuild; Text Template Transformation; SQL Server ODBC Driver; SQL Server Express 2019 LocalDB; Conectivity and publishing tools; SQL Server Command Line Utilities; SQL Server Data Tools; Data Sources for SQL Server support; Live Share; LINQ to SQL tools. - resetarea setărilor - meniu - Tools - Import and Export Settings - Reset all settings (se alege No...)

Fiecare PROIECT în Visual Studio generează un ANSAMBLU privat sau partajat (o unitate logică, având cod executabil - fișier cu extensia .exe și bibliotecă de clase - fișier cu extensia .dll), iar la crearea acestuia, numele devine și spațiul de nume/ NAMESPACE pentru toate clasele conținute (regiunile din codul clasei se pot extinde sau restrânge - o astfel de metodă a organizării codului are ca scop evitarea suprapunerii de nume folosite pentru clase și obiecte). METADATELE sunt informații care descriu tipurile și metodele existente în codul unui ansamblu).

 TIPURI DE ANSAMBLURI în .NET
- Executable Assembly (.exe) - rezultă fișier .exe, care rulează direct și conține metoda Main () - Aplicație de tip Console sau WPF sau WinForms; - Library Assembly (.dll) - rezultă fișier .dll, dar nu rulează singur, fiind folosit de alte proiecte - proiect de tip Class Library; - Dynamic Link Library (dll partajat), care poate fi reutilizat în mai multe aplicații și poate fi distribuit separat; - Single-file Assembly - aplicație în .NET 8, rulează într-un singur .exe, fiind auto-conținută (self-contained), fiind framework dependent

C# (C sharp este un limbaj de nivel înalt, adică programare orientată pe obiecte - limbaj puternic tipizat, deci clasele sunt tipuri referință)

 * comentarea în C# cu combinația de taste CTRL+K+C, iar decomentarea cu CTRL+K+U

TERMENI FRECVENȚI:

 Clasa (unitate fundamentală a încapsulării; - în C#, clase sunt tipuri referință) - obiectele sunt parte dintr-o clasă 
(vezi anterior despre CLASĂ, la ”Programare orientată pe obiecte”) Exemplu. CLASS Persoana Proprietăți/ câmpuri: Nume; Prenume; DataNasterii; LoculNasterii; Domiciliul Metode: Persoana(); CalculeazăVarsta(); NumeComplet()
 Obiecte în C# (- fac parte dintr-o clasă - instanțe ale unor clase) se creează cu operatorul new și indicarea constructorului clasei 
(vezi anterior despre OBIECT, la ”Programare orientată pe obiecte”) - are rolul de a preciza un comportament - prin implementarea unei interfețe, o clasă își schimbă comportamentul conform unor obligații stabilite anterior; - clasa implementează o interfață (poate implementa mai multe interfețe, implementând toate metodele precizate în interfețe), apoi se vor crea obiecte din clasa respectivă, care vor avea funcționalități definite de interfață - nu conține cod, ci conține doar semnătura unor metode și proprietăți; - nu poate avea câmpuri private; (exemplu: din clasa mașină, obiectul este echivalentul unui model Dacia Logan 2008)
 Metodă (- arată ce fac elementele din clasă)
de exemplu: elevul învață
 Interfață (”un contract” cu clasele - se folosește în situații când se utilizează un set de metode care încapsulează funcționalități specifice) 
Exemplu. CLASS Persoana Proprietăți: Nume; Prenume; DataNasterii; LoculNasterii; Domiciliul Metode: Persoana(); CalculeazăVarsta(); NumeComplet()
 Modificatorii de acces în C# (stabilesc accesibilitatea obiectelor și a membrilor acestora - apar în codul clasei)
- public - private - protected - internal
 Directiva Using
- directivele Using nefolosite se vor șterge, iar cele rămase vor fi sortate alfabetic.
 Diagrama unei clase
Diagrama reprezintă componentele clasei (de exemplu: proprietăți publice, metode publice).
 Tablouri de date (Arrays) - Clasa ARRAY/ System.Array
= structuri de date care stochează mai multe valori de același tip CLASA ARRAY oferă metode pentru crearea, manipularea, căutarea și sortarea tablourilor de date - Proprietatea Rank arată numărul de dimensiuni al tabloului (1=tablou unidimensional, 2=tablou bidimensional, 3, 4...) - Proprietatea Length arată numărul total de elemente din tabloul de date, din toate dimensiunile. - Metoda GetValue(int, int) returnează dintr-un tablou bidimensional valoarea corespunzătoare celor 2 indecși int. * un array are marginea inferioară zero (adică indexul primului element), în mod implicit, dar se poate declara o altă margine inferioară.
 Colecții de obiecte - clasele din spațiul de nume System.Collections & Interfața ICollection (interfața IEnumerable) & exemple de colecții de obiecte (ArrayList, Hashtable, SortedList, Stack, Queue)
- (conceptul de colecție este superior celui de tablou de date) - pentru manipularea datelor similare numeroase - față de clasa Array, cu System.Collections sunt posibile operațiile de adăugarea, ștergerea, repoziționarea unui anumit element într-o colecție. - Metoda pentru ADĂUGAREA UNUI OBIECT sau a mai multor obiecte: metode Add/ AddRange. - Metoda pentru ȘTERGEREA UNUI OBIECT sau a mai multor obiecte: Remove/ RemoveAt/ RemoveRange. - Metoda pentru VERIFICAREA EXISTENȚEI UNUI OBIECT în colecție: Contains. - Metoda pentru REGĂSIREA ELEMENTELOR în colecție: IndexOf. - Metoda CopyTo pentru a copia elementele din colecție într-un tablou (array) unidimensional (ordinea în care sunt scrise elementele în noul array este dată de ordinea în care le returnează iteratorul, iar indexarea noului array începe cu zero) CARACTERISTICILE COLECȚIILOR CARE IMPLEMENTEAZĂ interfața ICOLLECTION: - interfața ICollection, implementată de colecțiile din .NET Framework, permite existența unui iterator (pointer care indică un element din colecție) care parcurge colecția (instrucțiunea Foreach și interogarea cu LINQ) * toate colecțiile indexate din spațiul de nume System.Collections au marginea inferioară zero, adică indexul primului element (engl. 0-indexed collections) - CAPACITATEA UNEI COLECȚII (numărul de elemente pe care-l poate conține la un moment dat) este o valoare ajustabilă când capacitatea curentă a fost atinsă (memoria este realocată, iar elementele sunt copiate din vechea colecție în cea nouă) EXEMPLE DE COLECȚII DE OBIECTE: - ArrayList - o mulțime de obiecte poate crește (prin adăugare de noi obiecte) - Hashtable - colecție care conține perechi Key/ Value pentru fiecare obiect stocat (fiecare obiect are o cheie unică) - SortedList - colecție care conține perechi Key/Value pentru fiecare obiect conținut. Obiectele sunt căutate după Key sau după index. Colecția operează cu noțiunea de „ordine a elementelor”. - Stack (stivă) - colecție de obiecte care poate crește după regula LIFO = Last In First Out. - Queue (coadă de așteptare) - colecție de obiecte care poate crește după regula FIFO = First In First Out.
 Colecții generice (doar pentru un tip de obiecte - cum ar fi doar produse) & exemple & membri ai clasei List< T >  
- colecții de obiecte dintr-un anumit tip (Type T), indicat explicit de la început; - stochează doar obiecte de tipul indicat în declarație (nu se acceptă simultan obiecte de diferite tipuri - ca în colecțiile ArrayList); - este necesară menționarea în cod a spațiului de nume System.Collections.Generic (se indică în directiva using). EXEMPLE: - List< T > - listă de obiecte de tip T; - HashSet< T > - set de obiecte de tip T; - Stack< T > - stivă de obiecte de tip T, poate crește după regula LIFO = Last In First Out.; - Queue< T > - coadă (de așteptare) de obiecte de tip T, poate crește după regula FIFO = First In First Out. - Dictionary< TKey, TValue > - colecţie de tip dicţionar, în care fiecare obiect de tip ; MEMBRI AI CLASEI List< T >: - int Count = proprietate care returnează numărul de elemente din colecţie; - void Add(T item) = metodă care adaugă la colecţie elementul indicat (item); - void Clear() = metodă care şterge toate elementele din colecţie; - bool Contains(T item) = metodă care verifică dacă elementul indicat (item) este conţinut în colecţie şi întoarce un rezultat logic, boolean (true / false); - int IndexOf(T item) = metodă care returnează indexul elementului indicat (item) în cadrul colecţiei (sau –1 dacă elementul nu este în colecţie); - void Insert(int index, T item) = metodă care inserează în colecţie elementul indicat (item) în poziţia indicată prin valoarea întreagă index; - bool Remove(T item) = metodă care şterge din colecţie elementul indicat (item) şi returnează true. Dacă elementul indicat nu există în colecţie, atunci metoda returnează false. - void RemoveAt(int index) = metodă care şterge din colecţie elementul cu indexul indicat
 Crearea unei aplicații cu C#
- orice aplicație creată cu C# necesită întâi crearea unui proiect și a unei soluții (în Solution Explorer sunt afișate fișierele acestora), apoi se editează codul funcției Main în fereastra Program.cs; - în PROPRIETĂȚI (Properties) se afișează elementele și controalele proiectului, care se pot modifica aici

(* Este hașurată cu galben structura minimă a unui program)

 Aplicația de tip Console
- rulează într-o fereastră de linie comandă (Console), afișând doar text, nu o interfață grafică
Realizarea aplicației HELLO WORLD cu Visual Studio (cu C#, pentru sistem Windows, aplicație de tip Console)
1. CREAREA UNUI PROIECT NOU DE TIP CONSOLE APP, pentru PLATFORMA .NET FRAMEWORK

CREATE A NEW PROJECT > se alege CONSOLE APP (.NET FRAMEWORK) > (în fereastra Configure your new project - Project Name: HELLO WORLD, - Solution Name: HELLO WORLD_CS)

În panoul SOLUTION EXPLORER (se află de obicei în dreapta ecranului) se afișează structura proiectului.

2. FUNCȚIA Main - punctul de început al execuției programului

În fereastra Program.cs, în cod s-a generat namespace HELLO WORLD.

SCRIEREA CODULUI: pentru instrucțiuni se folosesc: cuvinte-cheie ale limbajului de programare (class, static, string etc.), denumiri de clase (ex. Program, Console... - editorul oferă posibilitatea completării automate după scrierea primelor litere din cuvintele-cheie, datorită suportului IntelliSense), metode apelate (ex. WriteLine, ReadLine), variabile (ex. args = argumentele funcției Main), valori (șirul de caractere Hello World), alte elemente (//comentariu - este un element care nu este luat ]n considerare la rularea programului).

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;


namespace HELLO_WORLD

{

    internal class Program

    {

        private static object console;


        static void Main(string[] args)

        {

            Console.WriteLine("Hello, World!");  //comentariu

            Console.WriteLine("Press ENTER to exit...");

            Console.ReadLine();

        }

    }

}

Dacă se fac modificări în cod, este necesară o nouă compilare a proiectului sau a soluției din MENIU > BUILD (tasta F6)

3. COMPILAREA ȘI RULAREA PROGRAMULUI

În MENIU se alege DEBUG > START DEBUGGING (se va deschide o fereastră în care se afișează: Hello, World! Press ENTER to exit...

4. OPRIREA FORȚATĂ ȘI DEPANAREA PAS CU PAS A APLICAȚIEI

Pentru oprirea forțată se alege butonul STOP DEBUGGING. 

Depanarea pas cu pas se face folosind comenzile STEP INTO sau STEP OVER

INTEROGĂRI ALE COLECȚIILOR DE DATE (LINQ)

 LINQ (pentru interogare de date - lucru cu colecții, baze de date, fișiere XML)
(Language Integrated Query) = set de tehnologii care integrează capabilități de interogare a colecțiilor de date direct în limbajul de programare (model de programare care permite scrierea de instrucțiuni pentru manipularea datelor folosind o sintaxă unitară, expresivă și inteligibilă - face.operații asupra colecțiilor de date, interogări/ solicitări de date dintr-o colecție = queries făcute direct din limbajul de programare); - posibilitatea de a folosi instrucțiuni cu aceeași sintaxă chiar dacă sursele de date sunt foarte diferite: colecții de obiecte, baze de date SQL, documente XML (introduce șabloane standard pentru interogarea şi actualizarea datelor); - prin directiva using se indică spațiul de nume System.Linq. INTEROGĂRI LINQ (operații de bază): - indicarea sursei date - clauza from; - filtrarea datelor - clauza where; - ordonarea/ sortarea datelor = clauza orderby; - proiecția datelor = clauza select; - gruparea datelor = clauza group; - reunirea datelor = clauza join; - operații de setare a datelor.

 - folosește CUVINTE-CHEIE (inspirate din SQL): var (variabile care vor conține reultate ale interogărilor LINQ), from, where, select etc. 

 (PAȘI: 1. crearea unei liste genericeList<Angajat> angajati = new List<Angajat>();

 2. adăugarea de elemente în lista angajaților;

 3. pregătirea interogării:

  var query = from a in angajari

  where a.AnNastere 
>= 1970

 orderby a.Nume, a.Prenume

 select a;

 Tablouri de date (Arrays) - Clasa ARRAY/ System.Array
= structuri de date care stochează mai multe valori de același tip CLASA ARRAY oferă metode pentru crearea, manipularea, căutarea și sortarea tablourilor de date - Proprietatea Rank arată numărul de dimensiuni al tabloului (1=tablou unidimensional, 2=tablou bidimensional, 3, 4...) - Proprietatea Length arată numărul total de elemente din tabloul de date, din toate dimensiunile. - Metoda GetValue(int, int) returnează dintr-un tablou bidimensional valoarea corespunzătoare celor 2 indecși int. * un array are marginea inferioară zero (adică indexul primului element), în mod implicit, dar se poate declara o altă margine inferioară.
 Colecții de obiecte - clasele din spațiul de nume System.Collections & Interfața ICollection (interfața IEnumerable) & exemple de colecții de obiecte (ArrayList, Hashtable, SortedList, Stack, Queue)
- (conceptul de colecție este superior celui de tablou de date) - pentru manipularea datelor similare numeroase - față de clasa Array, cu System.Collections sunt posibile operațiile de adăugarea, ștergerea, repoziționarea unui anumit element într-o colecție. - Metoda pentru ADĂUGAREA UNUI OBIECT sau a mai multor obiecte: metode Add/ AddRange. - Metoda pentru ȘTERGEREA UNUI OBIECT sau a mai multor obiecte: Remove/ RemoveAt/ RemoveRange. - Metoda pentru VERIFICAREA EXISTENȚEI UNUI OBIECT în colecție: Contains. - Metoda pentru REGĂSIREA ELEMENTELOR în colecție: IndexOf. - Metoda CopyTo pentru a copia elementele din colecție într-un tablou (array) unidimensional (ordinea în care sunt scrise elementele în noul array este dată de ordinea în care le returnează iteratorul, iar indexarea noului array începe cu zero) CARACTERISTICILE COLECȚIILOR CARE IMPLEMENTEAZĂ interfața ICOLLECTION: - interfața ICollection, implementată de colecțiile din .NET Framework, permite existența unui iterator (pointer care indică un element din colecție) care parcurge colecția (instrucțiunea Foreach și interogarea cu LINQ) * toate colecțiile indexate din spațiul de nume System.Collections au marginea inferioară zero, adică indexul primului element (engl. 0-indexed collections) - CAPACITATEA UNEI COLECȚII (numărul de elemente pe care-l poate conține la un moment dat) este o valoare ajustabilă când capacitatea curentă a fost atinsă (memoria este realocată, iar elementele sunt copiate din vechea colecție în cea nouă) EXEMPLE DE COLECȚII DE OBIECTE: - ArrayList - o mulțime de obiecte poate crește (prin adăugare de noi obiecte) - Hashtable - colecție care conține perechi Key/ Value pentru fiecare obiect stocat (fiecare obiect are o cheie unică) - SortedList - colecție care conține perechi Key/Value pentru fiecare obiect conținut. Obiectele sunt căutate după Key sau după index. Colecția operează cu noțiunea de „ordine a elementelor”. - Stack (stivă) - colecție de obiecte care poate crește după regula LIFO = Last In First Out. - Queue (coadă de așteptare) - colecție de obiecte care poate crește după regula FIFO = First In First Out.
 Colecții generice (doar pentru un tip de obiecte - cum ar fi doar produse/ furnizori/ clienti etc.) & exemple & membri ai clasei List< T >  
- colecții de obiecte dintr-un anumit tip (Type T), indicat explicit de la început; - stochează doar obiecte de tipul indicat în declarație (nu se acceptă simultan obiecte de diferite tipuri - ca în colecțiile ArrayList); - este necesară menționarea în cod a spațiului de nume System.Collections.Generic (se indică în directiva using). EXEMPLE: - List< T > - listă de obiecte de tip T; - HashSet< T > - set de obiecte de tip T; - Stack< T > - stivă de obiecte de tip T, poate crește după regula LIFO = Last In First Out.; - Queue< T > - coadă (de așteptare) de obiecte de tip T, poate crește după regula FIFO = First In First Out. - Dictionary< TKey, TValue > - colecţie de tip dicţionar, în care fiecare obiect de tip ; MEMBRI AI CLASEI List< T >: - int Count = proprietate care returnează numărul de elemente din colecţie; - void Add(T item) = metodă care adaugă la colecţie elementul indicat (item); - void Clear() = metodă care şterge toate elementele din colecţie; - bool Contains(T item) = metodă care verifică dacă elementul indicat (item) este conţinut în colecţie şi întoarce un rezultat logic, boolean (true / false); - int IndexOf(T item) = metodă care returnează indexul elementului indicat (item) în cadrul colecţiei (sau –1 dacă elementul nu este în colecţie); - void Insert(int index, T item) = metodă care inserează în colecţie elementul indicat (item) în poziţia indicată prin valoarea întreagă index; - bool Remove(T item) = metodă care şterge din colecţie elementul indicat (item) şi returnează true. Dacă elementul indicat nu există în colecţie, atunci metoda returnează false. - void RemoveAt(int index) = metodă care şterge din colecţie elementul cu indexul indicat
1. CREAREA UNUI PROIECT (a unei aplicații)

CREATE NEW PROJECT (de ex. - de tip CLASS LIBRAY .NET Framework) - se definește numele proiectului (de ex. Clase).

2. CREAREA UNEI SOLUȚII

Codul programului conține instrucțiuni - cuprinzând cuvinte-cheie, denumiri de clase, de metode apelate, de variabile, valori introduse în cod, comentarii, alte elemente.

SOLUȚIE Visual Studio = un container cu unul sau mai multe proiecte (un folder care conține fișierul *.sln și câte un subfolder pentru fiecare proiect, bin și obj cu cod compilat - unul dintre proiecte de tip aplicație .exe este START UP - apare cu bold în panoul Solution Explorer).  Folderul soluției apare în C:\Users\UserName\source\repos

COMANDA BUILD SOLUTION în Visual Studio = determină crearea ansamblului EXE și a celui DLL (în folderul bin\Debug)

La pasul descris anterior (CREATE NEW PROJECT), în aceeași fereastră se completează și noua soluție - se definește numele soluției: Clase_CS.

În Solution Explorer se șterge Class1.cs.

3. ADĂUGAREA UNUI PROIECT LA O SOLUȚIE

În panoul SOLUTION EXPLORER (click dreapta) sau în meniu - FILE - ADD - NEW PROJECT, se pot adăuga alte proiecte la o soluție (de ex. - de tip CONSOLE APP .NET Framework, numit Obiecte, care se va seta ca Startup Project cu click dreapta, click Set as Startup Project - va fi evidențiat cu caractere îngroșate).

(Într-o soluție Visual Studio cu mai multe proiecte, unul dintre proiectele de tip aplicație EXE este PROIECT PRINCIPAL - STARTUP PROJECT - apare cu caractere îngroșate în panoul Solution Explorer.

Într-un proiect de tip Windows Forms Application, o fereastră este o clasă.

Codul programului principal - Program.cs din proiectul principal OBIECTE

(Codul conține apeluri către anumite metode)

În panoul SOLUTION EXPLORER (dublu click pe numele Program.cs din proiectul Obiecte pentru a deschide codul acesteia - este programul principal).

using System;

using Clase;

using System.Text;


namespace Obiecte

{

     class Program

    {

       static void Main(string[] args)  

             // PAS 1

             CreeazaObiecteDinClasaPersoana();


            // PAS 2

            CreeazaObiecteDinClasaStudent();


           // PAS 3

          TransmiteObiecteInApelulFunctiilor();


          Console.WriteLine(" \n\n Apasă ENTER pentru a termina programul." );

          Console.ReadLine();


// aici se termina programul principal

// urmează codul metodelor apelate

    }

        private static void CreeazaObiecteDinClasaPersoana() // metodă

        {

            string mesaj = "1. Rulează metoda CreeazaObiecteDinClasaPersoana()";

            Console.WriteLine("\n" +mesaj + "\n");


            // creare obiect pentru clasa Persoana si particularizare (varianta1) 

            Persoana p1 = new Persoana();

            p1.Nume = "Pop";

            p1.Prenume = "Ion";

            p1.AnNastere = 1990;


            // afisarea descrierii obiectului

            Console.WriteLine(p1.Descriere() + "\n");

        }


        private static void CreeazaObiecteDinClasaStudent() // metodă

        {

            string mesaj = "2. Rulează metoda CreeazaObiecteDinClasaStudent()";

            Console.WriteLine("\n" + mesaj + "\n");


            // creare obiect pentru clasa Student si particularizare (varianta1) 

            Student s1 = new Student();

            s1.Nume = "Pop";

            s1.Prenume = "Ion";

            s1.AnNastere = 1990;

            


            // afisarea descrierii obiectului

            Console.WriteLine(s1.Descriere() + "\n");

        }

        private static void TransmiteObiecteInApelulFunctiilor()

        {

        }


        private static void AfiseazaDetaliiDespreObiect(object param)

        {

        }


    }

}

Dacă se fac modificări în cod, este necesară o nouă compilare a proiectului sau a soluției din MENIU > BUILD (tasta F6)

 Obiecte (fac parte dintr-o clasă - sunt instanțe ale unor clase) 
- pot fi create mai multe instanțe ale aceleiași clase (mai multe obiecte în aceeași clasă, în același program); - aspectul unei instanțe poate fi diferit - exprimat prin aceleași proprietăți, dar cu valori diferite; - fiecare instanță are comportament identic, având aceleași metode și poate efectua aceleași acțiuni (exemplu: din clasa mașină, obiectul este echivalentul unui model Dacia Logan 2008)

CREAREA UNUI OBIECT se face în codul Program.cs (folosindu-se operatorul NEW și indicându-se constructorul clasei)

Proprietățile arată atributele obiectelor (aspectul). Metodele arată operațiile pe care le poate face un obiect (comportamentul). Constructorii sunt apelați pentru a crea noi obiecte. Câmpurile private sunt variabile care indică vizibilitatea.

4. STABILIREA UNEI REFERINȚE în proiectul OBIECTE către proiectul CLASE 

În panoul SOLUTION EXPLORER, click dreapta pe proiectul OBIECTE - ADD - REFERENCE - PROJECTS - se bifează CLASE

5. ADĂUGAREA UNUI FIȘIER NOU ÎNTR-UN PROIECT / CREAREA UNEI CLASE
 Clasa (unitate fundamentală a încapsulării; - în C#, clase sunt tipuri referință) - obiectele (PERSOANA1, PERSOANA2 etc.) sunt parte dintr-o clasă
(vezi anterior despre CLASĂ, la ”Programare orientată pe obiecte”) Exemplu. CLASS Persoana Proprietăți: Nume; Prenume; DataNasterii; LoculNasterii; Domiciliul Metode: NumeComplet(); CalculeazăVarsta(); Descriere()

În panoul SOLUTION EXPLORER (click dreapta) sau în meniu - PROJECT - ADD - NEW ITEM - CLASS (se poate redenumi cu click dreapta pe clasa nou creată - RENAME - de exemplu, PERSOANA)

CODUL UNEI CLASEI și adăugarea proprietăților în codul clasei PERSOANA

(Proprietățile descriu atributele unui obiect - ASPECTUL)

În panoul SOLUTION EXPLORER (dublu click pe numele clasei pentru a deschide codul acesteia).

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;


namespace Clase

{ // Crearea clasei

    public class Persoana

    {

        // Proprietățile publice ale clasei

       public string Nume { get; set; }

       public string Prenume { get; set; }

       public int AnNastere { get; set; }

       public string LocNastere { get; set; }

       public string Domiciliu { get; set; }   

     }

}

Dacă se fac modificări în cod, este necesară o nouă compilare a proiectului sau a soluției din MENIU > BUILD (tasta F6)

Adăugarea câmpurilor private în codul clasei PERSOANA

(Câmpurile private sunt variabile vizibile în cadrul obiectului - VIZIBILITATE)

// Campurile private ale clasei

private int anCurent;

Adăugarea constructorului în codul clasei PERSOANA

(Constructorul poartă numele clasei și este apelat pentru crearea unui nou obiect - CREARE)

        // Constructorul clasei

       public Persoana(string nume, int anNastere)     

{
   Nume = nume;
    AnNastere = anNastere;
}

      {

            Console.WriteLine("a fost apelat constructorul clasei...");

      }   

Crearea de obiecte
class Program
    {
        static void Main(string[] args)
        {
        Produs p1 = new Produs("Ac", 1);
        Console.WriteLine(p1.Denumire + " - " + p1.Pret + " lei");
        }
    }

 Metodă în C# (definește acțiunea făcută de un obiect)
- o funcție dintr-o clasă (realizează o acțiune); - are 4 puncte: 1. modificator de acces (public, privat sau protected, internal); 2. tip returnat: void (nu returnează nimic), int, string, bool etc.; 3. numele metodei (prima literă să fie majusculă); 4. parametrii (opțional)
Adăugarea metodelor publice în codul clasei PERSOANA

(Metodele descriu operațiile specifice pe care le poate efectua un obiect - COMPORTAMENT)

//Metodele publice ale clasei

public string NumeComplet()

{

    string numeComplet;

    numeComplet = $"{Nume} {Prenume}";

    return numeComplet;

}

public int Varsta()

{

     anCurent = DateTime.Now.Year;

     return anCurent - AnNastere;}

}

public string Descriere()

{

      string descriere;

     descriere = $"PERSOANA {Nume} {Prenume}, " + $"anul nasterii {AnNastere}";

      return descriere;

}   

Codul CLASEI DERIVATĂ (clasa STUDENT derivată din clasa PERSOANA)

(Studentul este o Persoană, deci preia toate proprietățile și metodele clasei Persoana)

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;


namespace Clase

{

    public class Student : Persoana

    {

        // Proprietatile publice ale clasei:

        public int AnAdmitere { get; set; }


        // Constructorul clasei

        public Student()

        {

            Console.WriteLine(”a fost apelat constructorul clasei...”);

        }


        // Metodele publice ale clasei

        public string Descriere()

        {

            string descriere;

            descriere = $"STUDENT {Nume} {Prenume}, " + $"anul nasterii: {AnNastere}, anul admiterii {AnAdmitere}";

            return descriere;

        }

    }


6.  CREAREA DIAGRAMEI CLASEI

 - necesită instalarea instrumentului CLASS DESIGNER

 Diagrama unei clase
Diagrama reprezintă componentele clasei (de exemplu: proprietăți publice, metode publice). Exemplu: UML - diagramă de clasă

În panoul SOLUTION EXPLORER (click dreapta pe proiect - CLASE) sau în meniu - PROJECT - ADD - NEW ITEM - CLASS DIAGRAM 

 Constructorul clasei 
- metodă specială care se execută automat atunci când este creat un obiect al acelei clase, așadar inițializează obiectul (valorile câmpurilor, proprietăților etc.).
Proiect Date în colecții generice obținute din ansamblul DataLayer.dll, prelucrate cu interogări Linq

(Datele furnizate de ansamblul DataLayer.dll, stocate în colecții generice, sunt prelucrate cu interogări LINQ - filtrare, sortare, grupare)

 LINQ (pentru interogare de date - lucru cu colecții, baze de date, fișiere XML)
(Language Integrated Query) = set de tehnologii care integrează capabilități de interogare a colecțiilor de date direct în limbajul de programare (model de programare care permite scrierea de instrucțiuni pentru manipularea datelor folosind o sintaxă unitară, expresivă și inteligibilă - face.operații asupra colecțiilor de date, interogări/ solicitări de date dintr-o colecție = queries făcute direct din limbajul de programare); - posibilitatea de a folosi instrucțiuni cu aceeași sintaxă chiar dacă sursele de date sunt foarte diferite: colecții de obiecte, baze de date SQL, documente XML (introduce șabloane standard pentru interogarea şi actualizarea datelor); - prin directiva using se indică spațiul de nume System.Linq. INTEROGĂRI LINQ (operații de bază): - indicarea sursei date - clauza from; - filtrarea datelor - clauza where; - ordonarea/ sortarea datelor = clauza orderby; - proiecția datelor = clauza select; - gruparea datelor = clauza group; - reunirea datelor = clauza join; - operații de setare a datelor.
 DataLayer.dll (stratul de acces la date în aplicație, conectare la bază de date - Data Layer)
= o bibliotecă Class Library
1. CREAREA (ADĂUGAREA LA UN PROIECT ANTERIOR) UNUI PROIECT de tip Class Library (.NET Framework)

CREATE NEW PROJECT (de ex. - de tip CLASS LIBRAY .NET Framework) - se definește numele proiectului (DataLayer).

ADĂUGAREA LA UN PROIECT A UNUI ANSAMBLU .DLL: în File Explorer - copy pentru fișierul .dll > în Solution Explorer - click dreapta pe numele proiectului - Paste - setări în Properties: Build action > None, Copy to Output Directory > Copy if newer. 

2. STABILIREA UNEI REFERINȚE în Startup Project către proiectul DataLayer

În panoul SOLUTION EXPLORER, click dreapta pe proiectul principal - ADD - REFERENCE - PROJECTS - se bifează DataLayer (în proiectul principal va apărea - la References - Data Layer)

3. EDITAREA CODULUI CLASEI Partener.cs (din DataLayer) - proprietățile clasei, constructor  - adăugare obiecte

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;


namespace DataLayer

{

    public class Partener

    {

        public int ID { get; set; }

        public string Nume { get; set; }

        public int CodFiscal { get; set; }

        public string Localitate { get; set; }

        public string Descriere

        {

            get { return $"{Nume}, {Localitate}"; }

        }


        // constructor Implicit

        public Partener()

        {

        }


        // constructor Specialist

        public Partener(int id, string nume, int codFiscal,

                       string localitate)

        {

            this.ID = id;

            this.Nume = nume;

            this.CodFiscal = codFiscal;

            this.Localitate = localitate;

        }

    }

}

4. ADĂUGAREA CLASEI DataRepository.cs (în DataLayer) 

În panoul SOLUTION EXPLORER (click dreapta) sau în meniu - PROJECT - ADD - NEW ITEM - CLASS (se poate redenumi cu click dreapta pe clasa nou creată - RENAME)

using System.Collections.Generic;


namespace DataLayer

{

    public static class DataRepository

    {

        public static List<Partener> GetTotiPartenerii()

        {

            return new List<Partener>

            {

                new Partener(1, "Partener A", 123, "Bucuresti"),

                new Partener(2, "Partener B", 456, "Cluj"),

                new Partener(3, "Partener C", 789, "Bucuresti")

            };

        }

    }

}

5. ADĂUGAREA UNEI FERESTRE/ PAGINI în proiectul principal pentru afișarea datelor 

ADĂUGAREA UNEI PAGINI NOI LA PROIECT: În panoul SOLUTION EXPLORER (din dreapta ecranului), click dreapta pe numele proiectului > Add > Page (WPF) > redenumirea acesteia PAGEDATA

Codul pentru PAGEDATA.xaml

<Page x:Class="HelloWorldWPF.PageData"

      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 

      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 

      xmlns:local="clr-namespace:HelloWorldWPF"

      mc:Ignorable="d" 

      d:DesignHeight="550" d:DesignWidth="900"

      Title="PageData">


    <Grid Style="{DynamicResource GridStyleHello}" Background="Ivory">

        <StackPanel Margin="10">


            <Button Content="Afiseaza toti partenerii"

            Click="BtnToti_Click"

            Margin="0,0,0,5"/>


            <StackPanel Orientation="Horizontal">

                <TextBox x:Name="txtLocalitate" Width="150" Margin="0,0,5,0"/>

                <Button Content="Cauta dupa localitate"

                Click="BtnLocalitate_Click"/>

            </StackPanel>


            <ListBox x:Name="lstParteneri"

         Margin="0,10,0,0"/>

        </StackPanel>

    </Grid>

</Page>

Codul pentru PAGEDATA.xaml.cs

using DataLayer;

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.Windows;

using System.Windows.Controls;

using System.Windows.Data;

using System.Windows.Documents;

using System.Windows.Input;

using System.Windows.Media;

using System.Windows.Media.Imaging;

using System.Windows.Navigation;

using System.Windows.Shapes;


namespace HelloWorldWPF

{

    /// <summary>

    /// Interaction logic for PageData.xaml

    /// </summary>

    public partial class PageData : Page

    {

        public PageData()

        {

            InitializeComponent();

        } 


    private void BtnToti_Click(object sender, RoutedEventArgs e)

        {

            lstParteneri.Items.Clear();


            foreach (var p in DataRepository.GetTotiPartenerii())

            {

                lstParteneri.Items.Add(p.Descriere);

            }

        }


        private void BtnLocalitate_Click(object sender, RoutedEventArgs e)

        {

            lstParteneri.Items.Clear();


            // LINQ aplicat pe colecția de date, NU pe ListBox

            var parteneriDinLocalitate = DataRepository

                .GetTotiPartenerii();


            foreach (var p in parteneriDinLocalitate)

            {

                lstParteneri.Items.Add(p.Descriere);

            }

        }

    }

}

6. ADĂUGAREA UNEI TRIMITERI CĂTRE PAGEDATA din altă fereastra/ pagină

În codul .xaml se adaugă - text box cu text link

<TextBlock 

    Grid.Row="2"

    Foreground="Blue"

    Cursor="Hand"

    TextWrapping="Wrap"

    MouseLeftButtonUp="buttonLink_Click">

    Exemplu date organizate în colecții generice obținute din ansamblul DataLayer.dll

</TextBlock>

În codul .xaml.cs se adaugă

private void buttonLink_Click(object sender, RoutedEventArgs e)

{

    this.Content = new PageData();

}

 DataGrid - un control folosit pentru a afișa date în mod tabelar
- se pot afișa date din List ; - rezultate din baze de date; - date din fișiere
 Colecții generice (doar pentru un tip de obiecte - cum ar fi doar produse/ furnizori/ clienti etc.) & exemple & membri ai clasei List< T >  
- colecții de obiecte dintr-un anumit tip (Type T), indicat explicit de la început; - stochează doar obiecte de tipul indicat în declarație (nu se acceptă simultan obiecte de diferite tipuri - ca în colecțiile ArrayList); - este necesară menționarea în cod a spațiului de nume System.Collections.Generic (se indică în directiva using). EXEMPLE: - List< T > - listă de obiecte de tip T; - HashSet< T > - set de obiecte de tip T; - Stack< T > - stivă de obiecte de tip T, poate crește după regula LIFO = Last In First Out.; - Queue< T > - coadă (de așteptare) de obiecte de tip T, poate crește după regula FIFO = First In First Out. - Dictionary< TKey, TValue > - colecţie de tip dicţionar, în care fiecare obiect de tip ; MEMBRI AI CLASEI List< T >: - int Count = proprietate care returnează numărul de elemente din colecţie; - void Add(T item) = metodă care adaugă la colecţie elementul indicat (item); - void Clear() = metodă care şterge toate elementele din colecţie; - bool Contains(T item) = metodă care verifică dacă elementul indicat (item) este conţinut în colecţie şi întoarce un rezultat logic, boolean (true / false); - int IndexOf(T item) = metodă care returnează indexul elementului indicat (item) în cadrul colecţiei (sau –1 dacă elementul nu este în colecţie); - void Insert(int index, T item) = metodă care inserează în colecţie elementul indicat (item) în poziţia indicată prin valoarea întreagă index; - bool Remove(T item) = metodă care şterge din colecţie elementul indicat (item) şi returnează true. Dacă elementul indicat nu există în colecţie, atunci metoda returnează false. - void RemoveAt(int index) = metodă care şterge din colecţie elementul cu indexul indicat
Afișarea unei colecții generice de obiecte folosind controlul DataGrid

(obținerea unui context de date care conține o colecție de obiecte Produse)

1. ADĂUGAREA UNUI PROIECT de tip Class Library (.NET Framework) ȘI ADĂUGAREA UNEI REFERINȚE

CREATE NEW PROJECT (de ex. - de tip CLASS LIBRAY .NET Framework) - se definește numele proiectului (DataLayer).

În panoul SOLUTION EXPLORER, click dreapta pe proiectul principal - ADD - REFERENCE - PROJECTS - se bifează DataLayer (în proiectul principal va apărea - la References - Data Layer)

2.  CREAREA CLASEI CU ROL DE DATA CONTEXT DIAGRAMEI CLASEI
 DataContext
- obiect-sursă de date (controalele primesc indicații automat de unde să ia date)

În panoul SOLUTION EXPLORER (click dreapta) sau în meniu - PROJECT - ADD - NEW ITEM - CLASS (se poate redenumi cu click dreapta pe clasa nou creată - RENAME - DATACONTEXT) - clasa cu rol de DataContext poate fi Program.cs - se adaugă în codul clasei:

class Program

    {

    static DataContext context; //denumirea contextului in date


    static void Main(string[] args)

    {


    // se creează contextul de date

        context = new DataContext();


    // se încarcă datele

        context.LoadData();


        //folosire date

        foreach (var produs in context.Produse)

        {

              Console.WriteLine($"{produs.Denumire} - {produs.Pret} lei");

        }

    }


3.  DIAGRAMA CLASELOR

În panoul SOLUTION EXPLORER (click dreapta pe proiect - CLASE) sau în meniu - PROJECT - ADD - NEW ITEM - CLASS DIAGRAM 

WPF (Windows Presentation Foundation - aplicații n-tier sau multi-layer, care sunt client desktop, cu un cadru UI - interfață utilizator) - această platformă/ mediu de dezvoltare se bazează pe un set larg de caracteristici: 

 Pachete NuGet în proiecte WPF (.NET 8)
NuGET = manager de pachete pentru .NET - aceste pachete sunt utile pentru descărcare/ adăugare de biblioteci externe, gestionarea versiunilor, rezolvarea automată a dependențelor. CLICK DREAPTA PE PROIECT - Manage NuGet Packages - alegere pachet și selectare versiune - INSTALL (pentru actualizare se folosește Update; pentru ștergere - Uninstall); (În proiectele .NET 8 se folosește PackageReference în .csproj)

APLICAȚII N-TIER (MULTYLAYER)

Presentation Layer (ferestre, pagini, controale): - afișarea datelor; - afișarea comenzilor; - ferestre/ casete de dialog; - introducerea/ modificarea datelor; - notificări etc.

 - după ce se încarcă toate elementele apare Window Loaded (eveniment)

Business Logic Layer (prelucrarea datelor): - selectarea datelor necesare; - operații specifice aplicației.

Data Layer: - definire tipuri de date (Data Models); - colecții de date (Context, Repository); - acces la date externe (fișiere locale, fișiere la distanță, servere de baze de date cu SQL, servicii web prin http)

- o FEREASTRĂ WPF sau o PAGINĂ este descrisă (definită) prin 2 fișiere - unul cu cod XAML (care descrie interfața - conținutul și aspectul - prin toate elementele, cu atribute și prin stiluri) și unul cu cod C# (în spate - Code Behind) - care descrie ce se face în fereastră (comportamentul ferestrei/ al componentelor vizuale) prin gestionarea metodelor (funcțiilor) și evenimentelor.

XAML - (eXtensible Application Markup Language) limbaj de marcare specializat, creat de Microsoft ca variantă la XML, pentru descrierea (și editarea facilă) unei interfețe grafice (UI).

 Metodă în C# (definește acțiunea făcută de un obiect)
- o funcție dintr-o clasă (realizează o acțiune); - are 4 puncte: 1. modificator de acces (public, privat sau protected, internal); 2. tip returnat: void (nu returnează nimic), int, string, bool etc.; 3. numele metodei (prima literă să fie majusculă); 4. parametrii (opțional)

 WINDOW - fereastra principală sau secundară a aplicației

- container de nivel superior, fereastra principală găzduind aplicația, iar o fereastră secundară poate conține informații despre aplicație, de exemplu;

- are bară de titlu, butoane Minimize/ Maximize;

- conține orice control - dialoguri (Login etc.);

- când se închide fereastra, se închide aplicația.

Stil de fereastră
1. DEFINIREA STILULUI în Window.Resources

Înainte de a defini Grid (sau alt panou), se va scrie elementul XAML <Window.Resources> pentru stabilirea proprietăților unui stil.

<!-- Definirea stilului -->

<Window.Resources>

    <Style TargetType="Border" x:Key="RoundedBorderStyle">

        <Setter Property="CornerRadius" Value="10 10 10 10" />

    </Style>


    <Style TargetType="Button" x:Key="RoundedButtonStyle">

        <Setter Property="Background" Value="DarkBlue"/>

        <Setter Property="Foreground" Value="White"/>

        <Setter Property="FontSize" Value="14"/>

        <Setter Property="Height" Value="30"/>

        <Style.Resources>

            <Style TargetType="Border" BasedOn="{StaticResource RoundedBorderStyle}"/>

        </Style.Resources>

    </Style>

</Window.Resources>

 Grid (panou pentru aspect recomandat pentru ferestre, pagini etc.) 
= aspect al unui container organizat în coloane și rânduri (ca într-un tabel), util pentru gestiona cu exactitate conținutul
 Grid.ColumnDefinitions 
= împărțirea panoului în coloane - este definit modul în care spațiul este împărțit pe orizontală (fără ColumnDefinitions, Grid are o singură coloană); (* - indică spațiu flexibil, deci coloana umple spațiul în mod automat, în funcție de redimensionarea ferestrei); Grid.Column="0" - arată că elementul este plasat în prima coloană; - Grid.ColumnSpan="2" - inseamnă că elementul ocupă 2 coloane
 Grid.RowDefinitions 
= împărțirea panoului în rânduri - este definit modul în care spațiul este împărțit pe verticală (fără RowDefinitions, Grid are un singur rând); Grid.Row="0" - arată că elementul este plasat în primul rând;
 Stack Panel (panou pentru aspect pentru controale unul după altul)
= aspect al unui container în care controalele se aliniază UNUL DUPĂ ALTUL, orizontal sau vertical (implicit), fiind util pentru meniuri, de exemplu
CREAREA UNUI BUTON CU XAML (și setarea unor proprietăți)
< Button x:Name="myButton" Height="50" Width="100" Content="WPF ! " FontSize="20" Foreground="Yellow" Background="Green" />

CREAREA UNUI BUTON CU C# (și setarea unor proprietăți)
Button myButton = new Button();
myButton.Height = 50;
myButton.Width = 100;
myButton.FontSize = 20;
myButton.Content = "WPF !";
myButton.Foreground = new
SolidColorBrush(Colors.Yellow);
myButton.Background = new
SolidColorBrush(Colors.Green);

 Element XAML
= instanță a unui obiect sau control într-o aplicație - sunt folosite pentru a se crea instanțe de obiecte din clasele definite de cadrul aplicației, cum ar fi controale UI (exemple de elemente XAML: Button, TextBox etc.) sau pentru a descrie o structură ierarhică a interfeței
< Button Height="50" Width="320" Content="WPF ! " FontSize="20"
    Foreground="Yellow" >
    <Button.Background>
        <LinearGradientBrush>
            <GradientStop Color="DarkGreen" Offset="0"/>
            <GradientStop Color="LightGreen" Offset="1"/>
        </LinearGradientBrush>
    </Button.Background>
</Button> 
 Atribute XAML
= o proprietate a unui element XAML, folosită pentru a configura comportamentul, aspectul sau alte caracteristici ale acelui element - sunt folosite pentru a stabili valori pentru proprietăți ale obiectului
< Button Height="50" Width="100" Content="WPF ! " FontSize="20"
Foreground="Yellow" Background="Green" />

 Controale WPF (componente vizuale)

 FRAME (cadru/ container de navigare) - conținut navigabil în fereastră

- container folosit pentru a conține pagini, permițând navigarea între ele (înainte de Frame, în fereastră sau pagină se poate adăuga un meniu fix (MainFrame = fereastră principal.

 PAGINA 1

- control LABEL (etichetă pentru alt control - folosită pentru a afișa într-un TextBox text static, care nu poate fi modificat de utilizator)

- control TEXTBLOCK - cadru unde se afișează text care nu poate fi modificat de utilizator

 Creare text cu link către pagină externă pe internet
În fișierul XAML: PROIECT ROSFERA (exemplu link spre o pagină pe Internet) în fișierul xaml.cs - link spre o pagină pe internet: private void Hyperlink_RequestNavigate(object sender, RequestNavigateEventArgs e) { Process.Start(new ProcessStartInfo { FileName = e.Uri.AbsoluteUri, UseShellExecute = true }); e.Handled = true; }
 Creare text cu link către pagină pe internet
În fișierul XAML: PROIECT ROSFERA (exemplu link spre o pagină pe Internet) în fișierul xaml.cs - link spre o pagină pe internet: private void Hyperlink_RequestNavigate(object sender, RequestNavigateEventArgs e) { Process.Start(new ProcessStartInfo { FileName = e.Uri.AbsoluteUri, UseShellExecute = true }); e.Handled = true; }

- control TEXTBOX - chenar unde utilizatorul poate completa cu text

- control BUTTON - buton cu care se poate realiza o acțiune

 PAGINA 2

 Folosirea stilurilor în WPF 

- definirea unui stil pentru un buton cu colțuri rotunjite, de exemplu, va fi utilă pentru a nu repeta scrierea proprietăților pentru alte butoane de același tip (pentru colțuri rotunjite este necesar un ControlTemplate, nu este suficient cu stil simplu)

- Control.Resources - stilul se folosește doar pentru un singur control;

- Window.Resources - stilul se folosește doar pentru o fereastră (de exemplu, pentru toate butoanele din fereastră);

- App.xaml - stilul se folosește în întreaga aplicație (de exemplu, pentru toate butoanele din aplicație)

Stil de pagină
1. DEFINIREA STILULUI în Page.Resources

Înainte de a defini Grid (sau alt panou), se va scrie elementul XAML <Page.Resources> pentru stabilirea proprietăților unui stil.

    <Page.Resources>


        <Style x:Key="PageTitleStyle" TargetType="TextBlock">

            <Setter Property="FontSize" Value="24"/>

            <Setter Property="FontWeight" Value="Bold"/>

            <Setter Property="Foreground" Value="DarkBlue"/>

            <Setter Property="HorizontalAlignment" Value="Center"/>

            <Setter Property="Margin" Value="0,10"/>

        </Style>


        <Style x:Key="MenuButtonStyle" TargetType="Button">

            <Setter Property="Background" Value="DarkSlateBlue"/>

            <Setter Property="Foreground" Value="White"/>

            <Setter Property="Margin" Value="5"/>

            <Setter Property="Padding" Value="10,5"/>

            <Setter Property="Width" Value="150"/>

        </Style>


    </Page.Resources>

APLICAREA  STILULUI ȘI ROTUNJIREA COLȚURILOR UNUI BUTON

În interiorul panoului Grid (sau alt panou), în descrierea butonului deja existent se va adăuga:

Style="{StaticResource RoundedButtonStyle}"/>

Sau click dreapta pe buton existent sau nou adăugat, Edit Template > Apply Resource > RoundedButtonStyle

 Crearea unei aplicații WPF cu C#
(configurare IDE - la lansarea Visual Studio, în ferestra de pornire, se poate selecta ”Continuați fără cod” - se deschide mediul de dezvoltare, cu instrumente, meniuri și fereastra principală) sau ”Create a new project” - pentru language, se va selecta WPF App (.NET Framework) - orice aplicație creată cu C# necesită întâi crearea unui proiect și a unei soluții (în Solution Explorer sunt afișate fișierele acestora); - în PROPRIETĂȚI (Properties) se afișează elementele și controalele proiectului, care se pot modifica aici; - INTERFAȚA CU UTILIZATORUL (UI - cu WPF) - adăugarea de componente/ controale (butoane, texte etc.) în fereastra principală - editarea CODULUI
 Metoda event handler (pentru evenimente cum ar fi click pe buton și nu numai - pentru apel către alte ferestre)
- reacționează la o acțiune a utilizatorului sau la un eveniment al sistemului
Realizarea proiectului HELLO, WORLD (în C#, aplicație de tip WPF .NET Framework în Visual Studio)
1. CREAREA UNUI PROIECT NOU DE TIP WPF pentru PLATFORMA .NET FRAMEWORK

CREATE A NEW PROJECT > se alege WPF APP (.NET FRAMEWORK) > (în fereastra Configure your new project - Project Name: HelloWorldWPF, - Solution Name: HelloWorldWPF_CS)

În panoul SOLUTION EXPLORER (se află de obicei în dreapta ecranului) se afișează structura proiectului.

2. PROIECTAREA INTERFEȚEI CU UTILIZATORUL (UI)/ ADĂUGAREA DE COMPONENTE (controale) ÎN FEREASTRA PRINCIPALĂ (ASPECTUL FERESTREI PRINCIPALE)

În fereastra principală, care se editează, cu aspect grafic de pagină/ tablă albă (Designer - Main Window) se pot adăuga componente/ controale fie prin scrierea directă a codului XAML, fie prin tragerea din panoul Tool Box (care va apărea în partea stângă a ecranului prin activare din Meniu > View > Toolbox) - sub fereastră se văd opțiunile (secțiunile) Design sau XAML (pentru editarea codului/ personalizarea controalelor) - numele controalelor se pot modifica din Proprietăți

- textBlockHello

- textBoxUsername

- buttonSayHello

În vizualizarea (marcajul) XAML va apărea (MainWindow.xaml):

<Window x:Class="HelloWorldWPF.MainWindow"

xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

xmlns:d="http://schemas.microsoft.com/expression/blend/2008"

xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"

xmlns:local="clr-namespace:HelloWorldWPF"

mc:Ignorable="d"

WindowStartupLocation="CenterScreen"

MinHeight="260" MinWidth="380"

Height="320" Width="520"

Title="Hello, World!" >

    <Grid Background="Ivory">

        <TextBlock x:Name="textBlockHello"

        Background="Khaki"

        Margin="140,90,0,0"

        VerticalAlignment="Top" HorizontalAlignment="Left"

        TextWrapping="Wrap"

        Text="Hello, World!" FontSize="36" TextAlignment="Center" />


        <TextBox x:Name="textBoxUsername"

        Margin="140,154,0,0"

        VerticalAlignment="Top" HorizontalAlignment="Left"

        Width="210" Height="30"

        IsTabStop="True" TabIndex="1"

        TextWrapping="Wrap"

        Text="" FontSize="10" Foreground="Gray" TextChanged="textBoxUsername_TextChanged" />


        <Button x:Name="buttonSayHello"

        Background="WhiteSmoke"

        Margin="140,194,0,0"

        VerticalAlignment="Top" HorizontalAlignment="Left"

        Width="210" Height="40" 

        IsTabStop="True" TabIndex="2"

        Click="buttonSayHello_Click"

        Content="Scrie numele pentru a primi salut"

        FontSize="14" />

   </Grid>

</Window>

SELECTAREA IMPLICITĂ A UNUI BUTON (un buton dintre mai multe este activat implicit) - în secțiunea XAML de sub (Designer), pentru HelloButton, de exemplu, se adaugă atributul IsCheked, setat cu True (adică: IsChecked="True").

3. EDITAREA CODULUI C# (code behind - determină evenimentele din fereastră) în MainWindow.xaml.cs

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.Windows;

using System.Windows.Controls;

using System.Windows.Data;

using System.Windows.Documents;

using System.Windows.Input;

using System.Windows.Media;

using System.Windows.Media.Imaging;

using System.Windows.Navigation;

using System.Windows.Shapes;


namespace HelloWorldWPF

{

    /// <summary>

    /// Interaction logic for MainWindow.xaml

    /// </summary>

    public partial class MainWindow : Window


    // constructorul implicit al clasei

    {

        public MainWindow()

        {

            InitializeComponent();


            // se setează primul control selectat

            textBoxUsername.Focus();

        }


        // METODE PRIVATE AJUTĂTOARE

        private void SayHello()

        {

           

           string username = textBoxUsername.Text.Trim();

            if (string.IsNullOrEmpty(username))

                {

                username = "World";

                }

            string message = $"Hello, {username}!";

            string caption = "Hello...";

            MessageBox.Show(message, caption,

                MessageBoxButton.OK,

                MessageBoxImage.Information);

            textBlockHello.Text = message;

        }


        // EVENIMENTE

        private void buttonSayHello_Click(object sender, RoutedEventArgs e)

        {

            SayHello();

        }

       private void textBoxUsername_TextChanged(object sender, TextChangedEventArgs e)

       {

       }   
   }

}

4. COMPILAREA ȘI RULAREA PROGRAMULUI

În MENIU se alege DEBUG > START DEBUGGING (se va deschide o fereastră în care se afișează: Hello, World! Press ENTER to exit...

5. OPRIREA FORȚATĂ ȘI DEPANAREA PAS CU PAS A APLICAȚIEI

Pentru oprirea forțată se alege butonul STOP DEBUGGING. 

Depanarea pas cu pas se face folosind comenzile STEP INTO sau STEP OVER

 -* cu proprietatea TextWrapping="Wrap" un control text trece textul pe rândul următor când nu încape pe un rând (nu este valabil la controlul Label!)

Adăugarea unei ferestre la un proiect WPF App, cu buton către aceasta din fereastra principală (folosire Frame)

ADĂUGAREA UNEI FERESTRE NOI LA PROIECT: În panoul SOLUTION EXPLORER (din dreapta ecranului), click dreapta pe numele proiectului > Add > Window (WPF) > redenumirea acesteia Window_Informatii

În fereastra principală, se adaugă - din Tool Box - un panou StackPanel pentru un meniu destinat butonului pentru NAVIGARE către noua fereastră și un cadru Frame., care să asigure navigarea spre fereastra secundară.

În vizualizarea (marcajul) XAML (MainWindow.xaml) va apărea - pe lângă codul anterior al proiectului HELLO, WORLD (se va adăuga după <Grid Background="Ivory">:

<StackPanel x:Name="buttonsPanel" Orientation="Horizontal"

    VerticalAlignment="Top" Height="50" Background="Ivory">


    <Button x:Name="buttonInformatii" Content="INFORMAȚII UTILE" 

    HorizontalAlignment="Left"

    Margin="15,5,0,5"

    FontSize="11" 

    Background="DarkSlateGray"

    Foreground="White"

    Height="30" Width="102"

    Click="buttonInformatii_Click" />

    

 </StackPanel>


<Frame x:Name="MainFrame" Margin="15 75 15 15"

NavigationUIVisibility="Hidden"/>

În codul C# (MainWindow.xaml.cs) se va adăuga la codul anterior al proiectului HELLO, WORLD, după metoda buttonSayHello_Click, pentru a se realiza acțiunea de navigare la noua fereastră cu INFORMAȚII:

private void buttonInformatii_Click(object sender, RoutedEventArgs e)

{

    Window_Informatii win = new Window_Informatii

    {

        WindowStartupLocation = WindowStartupLocation.CenterScreen

    };

    win.Show();

}

În vizualizarea (marcajul) XAML al noii ferestre (Window_Informatii.xaml) va apărea:

<Window x:Class="HelloWorldWPF.Window_Informatii"

        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

        Title="Informatii"

        Height="300"

        Width="500">

    <Grid>

        <Label x:Name="labelTitle" Background="AliceBlue"

           Margin="0" Height="40" 

           Content="Fereastra INFORMATII UTILE" Foreground="Navy"

           VerticalAlignment="Top"

           FontSize="20"

           HorizontalContentAlignment="Center" />


        <Label Content="*Aceasta este o etichetă (Label) - text care nu poate fi modificat de utilizator." 

            HorizontalAlignment="Center" 

            Margin="0,45,0,0" 

            FontSize="10"

            VerticalAlignment="Top" VerticalContentAlignment="Center"/>

    </Grid>

</Window>

În codul C# (Window_Informatii.xaml.cs):

using System.Windows;


namespace HelloWorldWPF

{

    public partial class Window_Informatii : Window

    {

        public Window_Informatii()

        {

            InitializeComponent();

        }

    }

}

Adăugarea unei pagini într-un proiect WPF App

ADĂUGAREA UNEI PAGINI NOI LA PROIECT: În panoul SOLUTION EXPLORER (din dreapta ecranului), click dreapta pe numele proiectului > Add > Page (WPF) > redenumirea acesteia LoginPage

În vizualizarea (marcajul) XAML (MainWindow.xaml) va apărea - pe lângă codul anterior al proiectului HELLO, WORLD (se va adăuga după <Grid Background="Ivory">, în StackPanel de la Window_Informatii)::

<Button x:Name="buttonLogin" Content="LOGIN"

Margin="270,5,0,5"

FontSize="15" 

Background="DarkBlue"

Foreground="White"

Height="30" Width="105"

Click="buttonLogin_Click" />

În codul C# (MainWindow.xaml.cs) se va adăuga la codul anterior al proiectului HELLO, WORLD, după metoda buttonInformatii_Click:

private void buttonLogin_Click(object sender, RoutedEventArgs e)

{

    this.Content = new LoginPage();

}

În vizualizarea (marcajul) XAML al noii ferestre (LoginPage.xaml) va apărea:

<Page x:Class="HelloWorldWPF.LoginPage"

      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 

      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 

      xmlns:local="clr-namespace:HelloWorldWPF"

      mc:Ignorable="d" 

      d:DesignHeight="450" d:DesignWidth="800"

      Title="Login">


    <Grid Background="Ivory">

        <StackPanel Grid.Row="0">

            <Label x:Name="labelTitle"

           Background="AliceBlue"

           Height="40"

           Content="LOGIN"

           Foreground="Navy"

           FontSize="20"

           HorizontalContentAlignment="Center"/>

            

            <Grid Height="100" Margin="0,20,0,0">

                <Grid.ColumnDefinitions>

                    <ColumnDefinition/>

                    <ColumnDefinition Width="20"/>

                    <ColumnDefinition Width="2*"/>

                </Grid.ColumnDefinitions>


                <Grid.RowDefinitions>

                    <RowDefinition Height="*"/>

                    <RowDefinition Height="10"/>

                    <RowDefinition Height="*"/>

                </Grid.RowDefinitions>


                <TextBlock Text="Username"

                VerticalAlignment="Center" HorizontalAlignment="Right"

                FontSize="16" TextAlignment="Center"

                Grid.Row="0" Grid.Column="0" />


                <TextBlock Text="Password"

                VerticalAlignment="Center" HorizontalAlignment="Right"

                Grid.Row="2" Grid.Column="0"

                FontSize="16" TextAlignment="Center" />


                <TextBox x:Name="textBoxUsername"

                Margin="0,5,20,5"

                VerticalContentAlignment="Center"

                Grid.Row="0" Grid.Column="2"

                FontSize="16" />

                    

                <PasswordBox x:Name="passwordBox"

                FontSize="16"

                Margin="0,5,20,5"

                VerticalContentAlignment="Center"

                Grid.Row="2" Grid.Column="2" />

            </Grid>


            <StackPanel Orientation="Horizontal" HorizontalAlignment="Center" 

                Margin="0,20,0,0" Height="auto">


                <Button x:Name="buttonOK" Content="OK"

                    FontSize="16" IsDefault="True"

                    Background="WhiteSmoke"

                    Margin="10,0" Height="40" Width="120"

                    Click="buttonOK_Click" />

                <Button x:Name="buttonCancel" Content="Cancel"

                    FontSize="16" IsCancel="True"

                    Margin="10,0" Height="40" Width="120"

                    Click="buttonCancel_Click" />

            </StackPanel>

        </StackPanel>

    </Grid>

</Page>

În vizualizarea (marcajul) XAML al noii ferestre (LoginPage.xaml.cs) va apărea:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.Windows;

using System.Windows.Controls;

using System.Windows.Data;

using System.Windows.Documents;

using System.Windows.Input;

using System.Windows.Media;

using System.Windows.Media.Imaging;

using System.Windows.Navigation;

using System.Windows.Shapes;


namespace HelloWorldWPF

{

    public partial class LoginPage : Page

    {

        public string Username { get; private set; }

        public string Password { get; private set; }

        public LoginPage()

        {

            InitializeComponent();

            textBoxUsername.Focus();

        }


        private void buttonOK_Click(object sender, RoutedEventArgs e)

        {

            string username = textBoxUsername.Text;

            string password = passwordBox.Password;


            MessageBox.Show($"Username = {username} \n Password = {password}",

                "Login",

                MessageBoxButton.OK, 

                MessageBoxImage.Information);

        }


        private void buttonCancel_Click(object sender, RoutedEventArgs e)

        {

            NavigationService?.GoBack();

        }

    }

}

Entity Frame Core (framework și O/R Mapper) și MySQL în aplicații WPF de tip .NET 8

(mod de lucru: Database First - pe platforma .NET 8).

* cu EF se creează automat tabele

1. CREAREA UNUI BAZE DE DATE

- în XAMPP (se descarcă gratuit și se instalează MySQL, Apache și phpMyAdmin - se instalează și phpMyAdmin) - la Action: START Apache și MySQL, apoi click ADMIN MySQL 

- Local Host - numele serverului pe calculator: - adresa Local Host (afișată sus: Server 127.0.0.1

- pe serverul MySQL (Server 127.0.0.1 - în meniu BAZĂ DE DATE / DATABASES se CREEAZĂ baza de date: în căsuța Database name se notează Exercitiu 

2. CREAREA UNUI CONT PE SERVERUL MYSQL (pentru conectarea aplicației)

- pe serverul MySQL (Server 127.0.0.1 - în meniu CONTURI UTILIZATOR/ USER ACCOUNTS se CREEAZĂ utilizator: user și parola: parolaTa (la Nume gazdă se poate selecta Orice gazdă și se completează alăturat %) - administratorul trebuie să acorde toate privilegii Userului) are activat protocolul TCP/IP și lucrează pe portul TCP 3306;

3. ADĂUGARE DE INFORMAȚII ÎN BAZA DE DATE (realizarea de tabele și adăugarea da date în tabele)

- o bază de date nou creată nu conține tabele sau date, acestea trebuie create (se poate folosi un script SQL pentru importul tuturor tabelelor cu date) - în baza de date Exercitiu - Import - se alege fișierul din calculator; în meniu - la Structură se va vedea conținutul bazei de date, al tabelelor;

- vizualizarea DIAGRAMEI - din meniu - More - Designer;

- INTEROGARE - din meniu - SQL

4. CREAREA UNEI APLICAȚII WPF PENTRU .NET 8

CREATE A NEW PROJECT > FILE - NEW PROJECT - Project Name: HelloWorldWPF, - Solution Name: HelloWorldWPF_CS - se alege WPF APP (. NET8.0) 

(în codul XAML al ferestrei principale - MainWindow.xaml)

 <Window x:Class="HelloWorldWPF"

        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"

        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"

        xmlns:local="clr-namespace:HelloWorldWPF"

        mc:Ignorable="d"

        Title="HelloWorldWPF - MainWindow"

        Height="550" Width="800"

        ResizeMode="CanResizeWithGrip"

        WindowStartupLocation="CenterScreen">


    <Grid>


    </Grid>

</Window>

5. ADĂUGAREA PACHETELOR NUGET PENTRU CONECTARE LA BAZA DE DATE

(în SOLUTION EXPLORER se creează un folder DATA - click dreapta pe proiect) ADD > NEW FOLDER > Rename... ;

(adăugarea la proiect a pachetelor NuGet - click dreapta pe proiect) MANAGE NUGET PACKAGES > Microsoft.EntityFrameworkCore (v.8.0.22), Microsoft.EntityFrameworkCore.Design (v.8.0.22), Microsoft.EntityFrameworkCore.Proxies (v.8.0.22), Microsoft.EntityFrameworkCore.Tools (v.8.0.22), Pomelo.EntityFrameworkCore.MySQL (v.8.0.3 - dacă se folosește MySQL), Microsoft.EntityFrameworkCore.SqlServer (v.8.0.22 - dacă se folosește MS SQL Server), System.Text.JSON (v.8.0.6) > BUILD

6. DEFINIREA UNUI ȘIR DE  CONECTARE LA BAZA DE DATE 

Prima modalitate: TOOLS  > NuGet Package Manager > Package Manager Console Scaffold-DbContext "Server=localhost;Port=3306;Database=Exercitiu;Uid=user;Pwd=ParolaTa" Pomelo.EntityFrameworkCore.MySql -OutputDir Models -ContextDir Data -Context ExempluContext 

A doua modalitate (fără Scaffold-DbContext): se creează manual - în folderul Data - clasa DbContext

7. CREAREA UNUI CONTEXT DE DATE PENTRU ACCESUL LA O BAZĂ DE DATE ȘI A CLASELOR-ENTITĂȚI (clasa context de date DbContext)
8. AFIȘAREA ÎN APLICAȚIE A UNOR DATE PRELUATE DIN BAZA DE DATE
 Pachete NuGet pentru conectare la baze de date
- în SOLUTION EXPLORER - se adaugă folderul nou DATA; - pachete NuGet adăugate (click dreapta pe proiect - Manage NuGet Packages): Microsoft.EntityFrameworkCore v.8.0.22, Microsoft.EntityFrameworkCore.Design v.8.0.22, Microsoft.EntityFrameworkCore.Proxies v.8.0.22, Microsoft.EntityFrameworkCore.Tools v.8.0.22, Pomelo.EntityFrameworkCore.MySQL v.8.0.3 (dacă se folosește MySQL), Microsoft.EntityFrameworkCore.SqlServer v.8.0.22 (dacă se folosește MS SQL Server), System.Text.JSON v.8.0.6 - comanda BUILD
 Entity Frame Core (framework open source - o structură predefinită, oferind instrumente și reguli  gratuit, multiplatformă, pentru creare de aplicații și servicii cloud) - dezvoltat (pentru .NET 8) pentru acces la date
- permite dezvoltatorilor de aplicații să lucreze cu LINQ (Language Integrated Query), un set de instrucțiuni de interogare a colecțiilor de date, integrate în limbaje de programare de nivel înalt, care permite dezvoltatorilor să scrie interogări eficiente în limbajul C#.
 O/R Mapper (ORM) 
- un sistem de adaptare (potrivire, conversie) a datelor între modul de lucru obiectual (clase, obiecte, colecții de obiecte și limbaj de programare de nivel înalt) și modul de lucru relațional (tabele, rânduri, coloane și interogări SQL).
 Aplicații de administrare a bazelor de date MySQL: phpMyAdmin, DBeaver, HeidiSQL, Navicat, SQLyog, dbForge for MySQL 

V-au fost de folos informațiile din această pagină? 

Susțineți-ne (www.rosfera.ro/sustine) să putem susține acest proiect si celelalte activități de la RoSfera

* distribuind postările noastre, iar dacă aveți posibilitatea

* fie să redirecționați din impozitul pe venit personal sau afacerii,

* fie să sponsorizați (*cheltuielile unei persoane juridice cu sponsorizările se scad din impozitul pe profit datorat, fără a depăși 20% din acesta și nici 0,75% din cifra de afaceri -sunt cheltuieli nedeductibile integral). sau

* să donați, fiind ONG, depindem de implicarea celor care ne apreciază activitatea pe care o desfășurăm împreună cu colaboratorii.

Voluntariat/ Parteneriate

Implicare în proiectele și activitățile noastre 

Găzduirea unor activități în spații/ ateliere 

  • VOLUNTARII (creativi și nu numai) sunt promovați pe căile noastre și pot beneficia de diverse oportunități din activitățile noastre sau din partea partenerilor

  • PARTENERII (companii, organizații, instituții) sunt piloni de bază ai activității noastre și dorim să le susținem activitatea, la rândul nostru, prin metode și căi agreate reciproc.

 

 

Financiar

Donații

Sponsorizări

 Redirecționare 3,5% sau 20% 

  • SPONSORII ȘI CEI CARE NE SUSȚIN CU DONAȚII vor avea de câștigat accesul la valorile pe care le promovăm și la activitățile pe care le derulăm, precum și beneficii anunțate în cadrul fiecărei activități în parte.

  • Donații putem primi și în contul ASOCIAȚIEI ROSFERA (înregistrată la Registrul Comerțului/ Asociațiilor și Fundațiilor nr. 341/ 25.05.2021, C.I.F. 44439483):

RO27 CARP 0250 0160 0650 RO01, deschis la PATRIA BANK, iar pentru sponsorizări vă rugăm să ne contactați pentru contract.

Ne-ar putea fi utile

Servicii sau donații de cărți, materiale sau obiecte care pot fi refolosite/ recreate

  •  În PUNCTELE DE CULTURĂ sau în atelierele noastre ne-ar fi de folos implicarea prin servicii sau donații, astfel ne susțineți activitățile și proiectele și putem, la rândul nostru, să susținem creativii.

 

 

PARTENERI

care ni s-au alăturat

 

Apreciem și pe această cale implicarea celor care ni s-au alăturat în proiecte sau activități:

Editura Saga

www.editurasaga.ro