Zona informaticienilor @ Rosfera
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 & biblioteci, muzica, 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Ă
(click pe + sau - pentru a desfășura sau restrânge conținutul reperelor)
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).
SISTEM DE CALCUL - tematică științifică pentru predare
HARDWARE
BIOS (Firmware)
Basic Input Output System
SOFTWARE (sistem de operare & drivere & programe/ aplicații)
COMUNICAREA/ 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ă
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
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 OFERĂ:
Accesare informații
WORLD WIDE WEB (WWW)
- (= ”pânză de păianjen cât lumea de mare”) sistem de fișiere (pagini web/ website) legate între ele prin rețea. Folosind un browser (program folosit pentru informații de pe Internet), utilizatorul accesează informații în format text, video sau audio.
* paginile web sunt structurate folosindu-se limbajul de marcare HTML
Server și domeniu web
- numele de domeniu este unic și indică un server web (unde sunt stocate informații ce pot fi accesate) conectat la rețeaua Internet
Browser web
Motoare de căutare
HTTP (HTTPS)
(Hyper Text Transfer Protocol) - protocolul fiind un set de reguli pentru transferul de date între browser și serverul web (care conține pagini web); - HTTPS - versiunea securizată (transfer de date criptat)
Pagină web/ Website minim (resursă având URL = Uniform Resurse Locator)
- URL-ul paginii = adresa web a paginii/ site-ului
HTML (poate fi folosit pentru o simplă pagină de prezentare sau website minim pentru Internet)
Pagină/ Website web
HTML
CSS (util pentru a îmbunătăți aspectul unui website sau al unei aplicații web)
Aplicație web simplă
HTML
CSS
JavaSCRIPT
Aplicație web complexă
Frontend
Framework SVELTE
Backtend
Limbaje Javascript + Node.js
Framework SFAST API
Baza de date
Mysql
Comunicare
MESAGERIE ȘI POȘTĂ ELECTRONICĂ (E-mail)
APLICAȚII DE CHAT ȘI VOCE (VoIP)
PLATFORME DE SOCIALIZARE
REȚELE DE CALCULATOARE - tematică științifică pentru predare
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)
Tieru (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 REȚEAUA INTERNET
cu calculator sau IoT
Router - Home/ Default Gateway3e
- 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 REȚEAUA INTERNET
cu telefon
Smartphone
= (nivel/ strat)
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Ă

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
u003cbru003e
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, SecureCRTu003c/emu003e
- 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
u003cemu003eCablu cu fire metaliceu0026nbsp;u003c/emu003e
- datele sunt transmise prin impulsuri electrice
u003cemu003eCablu cu fibre opticeu0026nbsp;u003c/emu003e
- fibre de stică sau plastic - datele sunt transmise prin impulsuri de lumină
u003cemu003eWirelessu003c/emu003e
- (fără fir) datele sunt transmise prin modularea unor frecvențe specifice ale undelor electromagnetice.
u003cemu003eLățimea de bandă (biți care pot fi transmiși pe secumundă - bps)u003c/emu003e
- 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)
u003cemu003eQoS (= Quality of Service) - mecanism din rețele - router - care controlează și prioritizează traficulu003c/emu003e
- 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)
u003cemu003eEmulator de terminal (Terminal Emulator)u003c/emu003e
- 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
u003cemu003ePanou de conexiuni (Patch Panel)u003c/emu003e
- montat pe un suport cu cadru, cuprinzând switch-uri sau alte echipamente, pentru conectarea cablurilor unei rețele
u003cemu003eDulap metalic pentru echipamente de rețea (Rack/ Equipment Cabinet)u003c/emu003e
- montarea în mod organizat a echipamentelor de rețea (switch-uri, patch panel-uri, servere etc.)
u003ciu003ePriză sau alt element de conectare cu montare pe perete (Wall Mount/ Copper Wal Mount)u003c/iu003e
- fiind conectat la un panou de conexiuni, este util pentru a lega dispozitivele la rețea prin cabluri de cupru
u003cemu003eu0026nbsp;Interfațău003c/emu003e
- dispozitivul de rețea cuprinde porturi destinate conexiunilor individuale
u003cemu003ePlacă de interfață de rețea (NIC)u003c/emu003e
- Network Interface Card - pentru conectarea dispozitivului la rețea
u003cemu003ePort fizicu003c/emu003e
- un conector pe un dispozitiv de rețea destinat conectării la un dispozitiv final sau la alt dispozitiv de rețea
u003cemu003ePorturi de rețea de mare viteză de 1 Gbps (Gigabit Ethernet - G1/0/x)u0026nbsp;u003c/emu003e
- de pe un switch sau un server, utilizate pentru conectarea echipamentelor de rețea
u003cemu003eCablu Ethernet (Copper Straight-Through Cable)u0026nbsp;u003c/emu003e
- folosit pentru a conecta dispozitive (de exemplu: PC la switch, switch la router sau la patch panel)
u003cemu003eFast Ethernet (FE)u003c/emu003e
- interfață de rețea prin cablu pentru IoT, asigurând viteze până la 100 Mbps - cel mai frecvent utilizată în rețele LAN
u003ciu003eSSHu003c/iu003e
- o metodă în bandă și recomandată pentru stabilirea de la distanță a unei conexiuni CLI securizate, printr-o interfață virtuală, printr-o rețea
u003cemu003eTelnetu003c/emu003e
- 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ă).
u003cemu003eConcentrator (Switch)u003c/emu003e
- conectează mai multe dispozitive într-o rețea locală (LAN), permițându-le să comunice între ele - acesta poate fi configurat (global config mode)
u003cemu003eConector (Punchdown)u003c/emu003e
- folosit pentru conectarea cablurilor în patch panel sau wall mount - fiecare conector corespunde unui port Ethernet
u003cemu003eDefault (Home) Gateway - ex.: 192.168.1.1u0026nbsp;u003c/emu003e
- 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
u003cemu003eAdresa IPu003c/emu003e
- 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
u003cemu003eu0026nbsp;IPV4 (configurare) - ex.: 192.168.1.10u003c/emu003e
- 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)
u003cemu003eIPV6u003c/emu003e
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
u003cemu003eMască de rețea (Subnet Mask) - ex.: 255.255.255.0u0026nbsp;u003c/emu003e
- 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ă.
u003cemu003eServer DHCPu003c/emu003e
- 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
u003cemu003eWeb Server u003c/emu003e
- pentru pagini web, accesate de clienți prin protocolul HTTP
u003cemu003eDNS (Domain Name System)u003c/emu003e
- serviciu traduce numele domeniu în adresă IP
Conectarea unor dispozitive utilizând tehnologii wireless
u003cemu003eWLAN (Wireless Local Area Network)u003c/emu003e
- 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
u003cemu003e3G/ 4G/ 5G Cell Interfaceu003c/emu003e
- interfață a unui telefon mobil prin care se conectează la rețeaua celulară a operatorului de telefonie mobilă
u003cemu003eWireless Moduleu003c/emu003e
- modul hardware utilizat într-o rețea wireless pentru a permite dispozitivelor să se conecteze la rețea
u003cemu003eSSID (Service Set Identifier)u003c/emu003e
- numele unei rețele WIFI afișat în lista de rețele disponibile în momentul conectării unui dispozitiv
u003cemu003eAccess Point (AP)u003c/emu003e
- dispozitiv conectat la rețeaua cablată, folosit pentru crearea unei rețele WLAN, care permite conectarea altor dispozitive wireless
u003cemu003eTether/ Tetheringu003c/emu003e
- o funcție a unui dispozitiv prin care poate partaja conexiunea sa la internet unui alt dispozitiv
u003cemu003eWPA-PSK (Wi-FI Protected Access - Pre-shared Key)u003c/emu003e
- o funcție pentru securitatea conexiunilor wireless folosindu-se o parola comună PSK
u003cstrongu003eu003cuu003e1. CONFIGURARE CALCULATOR (Settings)u003c/uu003eu003c/strongu003e
(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)
u003cstrongu003eu003cuu003e1. CONFIGURARE (Settings)u003c/uu003eu003c/strongu003e
u003cemu003eBluetoothu003c/emu003e
- Tehnologie (wireless) pentru comunicații la distanțe mici, care se poate folosi pentru a conecta dispozitive făr a folosi internet sau router
u003cemu003eBluetooth Pairing (asociere)u003c/emu003e
- 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
u003cemu003eSISTEME PENTRU A TESTA ȘI DEPANA O CONEXIUNE LA REȚEAu003c/emu003e
FIRMWARE
- software de bază (stocat permanent într-un cip de pe placa de bază), care gestionează funcționarea unui hardware (inclusiv a unui router)
BIOS - pornește calculatorul
- firmware stocat pe placa de bază, software care se execută imediat după pornirea calculatorului, acționând componentele hardware și încărcând sistemul de operare
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
- aplicații sau programe informatice, care comandă și controlează sisteme de calcul
INGINERIE SOFTWARE = procesul de dezvoltare a unui produs-program:
- include analiza cerințelor, proiectarea, programarea, testarea, documentarea, implementarea și mentenanța
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
SISTEM DE OPERARE
= arată utilizatorului printr-o interfață grafică moduk în care sunt controlate și gestionate componentele hardware ale unui calculator (procesor, memorie etc.) sau ale unui dispozitiv electronic și cum rulează programele; - Elemente de interfață ale unui sistem de operare: bară de aplicații, având iconițe sau pictograme pentru fiecare program sau aplicație (există și posibilitatea de a folosi scurtături - shortcut - pe Desktop); - butonul Start; - Desktop - suprafață de lucru care cuprinde iconițe pentru fișiere, directoare, programe sau scurtături către acestea.
(Fereastră)
= zonă dreptunghiulară destinată unui program sau aplicații, ca cuprinde elemente pentru executarea unor operații: bară de titlu, buton pentru închidere
DRIVERE
APLICAȚII SOFTWARE
Aplicații pentru calculator
Aplicații pentru telefon și alte dispozitive
Aplicații webu003c/emu003e
(click pe + sau - pentru a desfășura sau restrânge conținutul reperelor)
ALGORITMI - tematică științifică pentru predare
ALGORITM = o succesiune finită de blocuri (minim 4 pași), având o ordine bine definită
= 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); - în informatică, pas = instrucțiune (citește/ scrie) sau operație, care se găsesc în price algoritm
STRUCTURA LINIARĂ
- secvență/ șir de instrucțiuni care se execută o singură dată, de la prima până la ultima instrucțiune din șir
CITEȘTE
- se comunică algoritmului informații = ce se cere (DATE DE INTRARE)
prin algoritm prelucrează datele de intrare
SCRIE
- algoritmul comunică informații (DATE DE IEȘIRE)
ATRIBUIRE
- o variabilă primește ca valoare rezultatul obținut prin evaluarea unei expresii, valoarea altei variabile sau valoarea unei constante); PAȘI ÎNTR-UN ALGORITM CARE REZOLVĂ O PROBLEMĂ: 1. se citește enunțul problemei; 2. se identifică ce se dă și ce se cere; 3. se rezolvă problema pentru câteva cazuri particulare; 4. se descrie soluția; 5. se detaliază descrierea pentru a fi clar ce trebuie făcut la fiecare pas
DATELE DE INTRARE ȘI DE IEȘIRE pot fi
EXPRESII ARITMETICE (combinații de date/ operanzi și operații)
- între operanzi se află niște simboluri numiți operatori; - un operand care este o expresie va fi delimitat între paranteze rotunde
PROPRIETĂȚI ALE ALGORITMILOR
FINITITUDINE
- se termină după un număr finit de pași (să aibă o rezolvare)
GENERALITATE
- algoritmul rezolvă probleme de același tip (un ceai se prepară la fel indiferent de plantele folosite)
CLARITATE
- algoritmul descrie la fiecare pas clar ce trebuie făcut și următorul pas care se va realiza
Metode de reprezentare a unui algoritm: SCHEMA LOGICĂ și LIMBAJUL PSEUDOCOD
PROGRAMAREA = scrierea codului (apoi testare și depanare) pentru a realiza funcționalități ale unui software
- descrierea algoritmilor
&
- codificarea algoritmilor:
Limbaj de programare
= mijloc de counicare între programator și calculator (un limbaj folosit de un sistem de calcul, care are: un VOCABULAR și un SET DE REGULI SINTACTICE)
folosindu-se
Mediu de dezvoltare
= aplicație compleză care permite scrierea de programe (într-un limbaj de programare)
MANAGEMENT DE PROIECT
PROIECT (managament de proiect)
ETAPELE PROCESULUI DE DESIGN DE PRODUS
(crearea sau îmbunătățirea unui produs/ serviciu)
IDEEA
(problema)
DA, VREAU PROFIT - Definește PUBLICUL/ DIFUZAREA
NU VREAU PROFIT - Definește SCOPUL ȘI OBIECTIVELE acestei creații…
CONCEPT
(procesul de creație)
- IDEI SIMILARE?
- NEVOILE/ CERINȚELE care sunt satisfăcute de acest produs?
- Stabilirea caracteristicilor/ specificațiilor
- Generare de concepte
- Testarea conceptelor
- Selectarea conceptelor
- Stabilirea sistemului de calitate
PROIECTARE/ PLANIFICARE
(procesul de creație**)**
- Imaginea proiectului - definirea aspectelor tehnice
ELABORAREA/ DEZVOLTATEA PRODUSULUI
(procesul de creație)
- realizarea interfețelor
- proiectarea bazei de date
IMPLEMENTAREA/ TESTAREA PRODUSULUI
(proces tehnic**)**
- instalare și testare
FINANȚAREA PRODUSULUI &
ASPECTE JURIDICE/ ECONOMICE
FINANȚAREA DIN ALTĂ SURSĂ (cedarea drepturilor de autor)
ASUMAREA COSTURILOR (păstrarea drepturilor de autor - soluții de finanțare)
- plan de afacere
PRODUCȚIE
PRODUCĂTORUL gestionează procesul de producție
- producția se realizează din finanțări obținute din diverse surse
PROMOVARE & DISTRIBUȚIE & VÂNZARE
PRODUCĂTORUL promovează și distribuie produsele (pe căile proprii - website/ evenimente sau în rețea de distribuție)
- promovarea și vânzarea prin intermediul resurselor proprii
Idee/ 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
u003cemu003eCodarea informației în sistem binaru003c/emu003eu0026nbsp;
- 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)
u003cbu003eBiblioteciu003c/bu003e
- 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
- 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
a. Definirea cerințelor utilizatorului
Pe baza specificațiilor definite, se poate crea macheta (mockup) proiectului (aplicație/ website etc.), folosindu-se instrumente precum FIGMA, BALSAMIQ etc.).
MACHETA
b. Definirea cerințelor software-ului (programului/ aplicației) > Document de cerințe software (Specificația de sistem)
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
u003cemu003eONG (= utilizator-beneficiar)u0026nbsp;u003c/emu003e
1. funcționalitate: problemă de rezolvat (ex. depunere declarație)
u003cemu003eSPECIALIST (ex. contabil)u003c/emu003e
-
2. funcționalitate: rezolvare problemă (ex. depunere declarație)
u003cemu003eSPECIALIST (ex. contabil = utilizator implicat)u003c/emu003e
u003cemu003eONG (= utilizator-beneficiar)u0026nbsp;u003c/emu003e
3. funcționalitate: status/ stadiu rezolvare (use case de includere)
u003cemu003eSPECIALIST (ex. contabil)u003c/emu003e
u003cemu003eONG (= utilizator-beneficiar)u0026nbsp;u003c/emu003e
4. funcționalitate: recenzie pentru specialist (use case de extensie - opțional)
-
c. Proiectare arhitecturală
d. Proiectare detaliată
e. Implementarea unităților programului (modulele)/ componentelor
(click pe + sau - pentru a desfășura sau restrânge conținutul reperelor)
* Realizarea unei pagini de prezentare pe Internet sau website minim (statice) folosind doar HTML (fără CSS și fără Javascript)
HTML (HyperText Markup Language)
Pagină web de prezentare doar cu HTML
1. CREAREA PAGINII WEB folosind Notepad
File - New tab
<body>
Hello, World!
</body>
* O pagină HTML folosește pentru început tagul (eticheta) și se încheie cu tagul (eticheta)
** Tagul
ANTET furnizează informații pentru browser despre pagină (titlu, caracterele speciale afișate etc.)*** Între etichetele
și se afișează conținutul propriu-zis (corpul paginii)Etichete (tag-uri) pentru pagini HTML
titluri (
,
, …) paragrafe (
) imagini () () linkuri () (Acasă) meniuri (
**** Tagul (eticheta)
marchează un titlu principal
2. Salvare pentru a se deschide pagina în browser
La salvare - se selectează All files și se adaugă extensia .html
3. Deschiderea fișierului în browser
În Windows Explorer - click dreapta pe fișier - Open with… (se selectează browser)
* Realizarea unei pagini de prezentare pe Internet sau a unui website simplu (statice), cu aspect mai atractiv (cu HTML, CSS și fără Javascript)
HTML + CSS (Cascading Style Sheets)
Pagină web de prezentare, cu CSS în Header
1. CREAREA PAGINII WEB folosind Notepad
File - New tab
<body>
Hello, World!
</body>
* O pagină HTML folosește pentru început tagul (eticheta) și se încheie cu tagul (eticheta)
** Tagul
ANTET furnizează informații pentru browser despre pagină (titlu, caracterele speciale afișate etc.), inclusiv stilul definit cu CSS*** Între etichetele
și se afișează conținutul propriu-zis (corpul paginii)Etichete (tag-uri) pentru pagini HTML
titluri (
,
, …) paragrafe (
) imagini () () linkuri () (Acasă) meniuri (
**** Tagul (eticheta)
marchează un titlu principal
Pagină web de prezentare, cu CSS inline - direct pe un element din body
<body>
<h1 style=“color: blue;”>Hello, World!
<p style=“font-size: 18px;”>Acesta este un paragraf.
</body>
2. Salvare pentru a se deschide pagina în browser
La salvare - se selectează All files și se adaugă extensia .html
3. Deschiderea fișierului în browser
În Windows Explorer - click dreapta pe fișier - Open with… (se selectează browser)
Pagină web de prezentare, cu CSS salvat în alt fișier (cea mai frecventă soluție)
4. Fișier nou style.css, iar în fișierul html se adaugă - în<head>: <link rel=“stylesheet” href=“style.css”>
body {
background-color: #f0f8ff;
font-family: Arial, sans-serif;
}
h1 {
color: darkblue;
text-align: center;
}
p {
font-size: 18px;
}
* HTML folosit pentru o pagină de prezentare sau website cu aspect mai atractiv și dinamice și cu interactivitate (cu CSS și cu Javascript: afișează mesaje și notificări, meniuri interactive, verifică formulare, schimbarea instantă a textului sau a altor elemente, galerie sau slideshow fără reîncărcarea paginii, comunică pentru preluarea de date cu un server și API-uri)
XAML cu .NET
f. Integrarea
g. Testarea de sistem
h. Testarea de acceptare
i. Întreținerea și operare
3. ACTIVITĂȚI DE ASIGURARE A CALITĂȚII
BAZE DE DATE - tematică științifică pentru preda
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ă
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
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
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
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
* Verificarea user-ului conectat la baza de date: SELECT CURRENT_USER(); - REZULTAT: root@localhost
CREAREA UNEI BAZE DE DATE/ IMPORT Ș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_bazadedate (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
USER pentru baza de date (se poate verifica existența unui user cu: SELECT user, host FROM mysql.user;)
- cu script SQL: CREATE USER ‘exempluuser’@‘localhost’ IDENTIFIED BY ‘1234’;
GRANT ALL PRIVILEGES ON Exemplu_bazadedate.* TO ‘exempluuser’@‘localhost’;
FLUSH PRIVILEGES;
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…
- folosind SQL script: New SQL script:
USE Exemplu_bazadedate; sau CREATE DATABASE IF NOT EXISTS Exemplu_bazadedate; CREATE TABLE Exemplu_bazadedate.persoana (…); sau
CREATE TABLE persoana (id INT); - Execute… - click Refresh
MODIFICARE TABELE cu SQL script - (dacă este cazul, înainte se va adăuga USE nume_baza_de_date;) ALTER TABLE persoana RENAME TO user; Execute… - click Refresh
ȘTERGERE TABELE cu SQL script - (dacă este cazul, înainte se va adăuga USE nume_baza_de_date;) DROP TABLE persoana; Execute… - click Refresh/ ÎNLOCUIRE TABELĂ: USE om_date;
DROP TABLE utilizatori; (apoi se creează din nou tabela)
DESIGN-ul TABELULUI: 3. ADĂUGAREA DE COLOANE (câmpuri) ÎN TABEL (nume, dată etc.): click dreapta pe Columns - Create New Column - ALTER TABLE nume_bazadedate.persoana ADD nume varchar(100) NULL;
- 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 asigura integritatea datelor și a nu exista date invalide sau greșite - exemplu: vârsta negativă):
4. CONSTRÂNGERE DE ENTITATE PRIMARY KEY (cheia primară - în View Data, este însoțită de o iconiță reprezentând o cheie**) - și UNIQUE -** se aplică la nivelul rândurilor, dând 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 persoana ADD CONSTRAINT pk_persoana PRIMARY KEY (id); AUTO_INCREMENT se folosește pentru a se genera automat valori consecutive, de obicei pentru chei primare - ALTER TABLE persoana
MODIFY id INT AUTO_INCREMENT;
5. CONSTRÂNGERI REFERENȚIALE (impuse de dependențe de date) FOREIGN KEY - cheia străină creează o relație/ legătura între două tabele, asigurând integritatea între tabele, deci 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 DOMENIU SAU DE COLOANĂ SAU DE INTEGRITATE/ REGULI PENTRU VALIDAREA SAU CORECTITUDINEA DATELOR (se referă la atribute): UNIQUE - impune valori unice, pentru a nu permite duplicate într-o coloană, dar poate permite valori NULL (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 - stabilește o valoare implicită; 7. CONSTRÂNGERI DE VERIFICARE: CHECK - impune o condiție (exemple: prețuri cu valoare pozitivă, impunerea unui interval valoric - anul de naștere să fie mai mare de 2000; statusul împrumutului - împrumutat sau returnat, adresa să fie doar în Baia Mare): ALTER TABLE cititor ADD CONSTRAINT chk_adresa CHECK (adresa IN (‘Baia Mare’));
* ID-urile cu AUTO_INCREMENT nu necesită CHECK (validare) și nici cheile străne
(Acțiuni referențiale - proiecții la ștergere: CASCADE sau ON DELETE CASCADE (propagă ștergerile sau modificările asupra înregistrărilor dependente - ștergerea automată a înregistrărilor dependente), SET NULL, RESTRICT/ NO ACTION)
(* modificările referitoare la constrângeri apar în Constraints - este necesar click dreapta - REFRESH)
INSERARE DATE ÎN TABEL - click dreapta pe baza de date - View Data - (click dreapta pe tabelul afișat) Edit…
AFIȘARE A SCHEMEI UNEI BAZE DE DATE (a tabelelor) ÎN DIAGRAMĂ cu MySQL - click dreapta pe baza de date - View Diagram (diagrama se poate salva ca imagine cu click dreapta - Save diagram as…)
INTEROGAREA/ AFIȘAREA/ REGĂSIREA/ VERIFICAREA TUTUROR TABELELOR USE nume_bazadedate; SHOW TABLES sau a DATELOR din una (click dreapta pe tabel - View Data) sau mai multe tabele, nu și editare/ modificare - exemplu de afișare a tuturor datelor/ înregistrărilor/ informațiilor introduse în baza de date: USE nume_bazadedate; SELECT * FROM numele_tabelului; - (se pot adăuga mai multe tabele cu aceeași comandă)
*
EXPORT BAZA DE DATE (Dump) - click dreapta pe baza de date - Tools - Dump database
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)
COMENTARE în SQL SERVER: /* comentare */
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 (îCrearea unui cont de utilizator SQL Server pentru conectarea unei aplicații - https://learn.microsoft.com/en-us/ssms/install/install**) -** numele instanței de SQL Server este SQLEXPRESS: File - Connect Object Explorer… - Server Name: .SQLEXPRESS - Authentication**: a) Windows Authentication/ b) SQL Server Authentication** (cont administrativ în rolul de administrator al serverului SQL, - Username: sa, Password: … - Connect;)
3. CREAREA UNUI CONT DE UTILIZATOR SQL SERVER PENTRU CONECTAREA UNEI APLICAȚII (un cont de Login) - creat de către un administrator al SERVER SQL (rol pe server de db_creator - permisiunea de creare baze de date- pentru conectarea unei anumite aplicații) - (în SSMS) - după Conectarea la server (cu Windows Authentication sau cu SQL Server Authentication) - (în Object Explorer) Security - click dreapta Logins - New Login - Nume (se alege SQL Authentication)
(ATENȚIE! Aplicațiile nu trebuie conectate la serverul SQL cu conturi de administrator!)
Verificarea funcționării sistemului SQL Server (pentru Database Engine) cu SQL Server Configuration Manager
- verificarea protocoalelor de conectare - activare Shared Memory, TCP/IP sau ambele - în SQL SERVER SERVICES - SQL Server (SQL EXPRESS) - State: Running (sus, sub meniu se va vedea o iconiță activă, care poate fi oprită cu Stop Service)
CREAREA UNEI BAZE DE DATE ȘI REALIZAREA SCHEMEI BAZEI DE DATE în SQL SERVER
1. CREAREA BAZEI DE DATE: Databases - 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)
- în OBJECT EXPLORER - după conectarea la server - Security - Logins - dublu click pe utilizator - User Mapping - se bifeaza baza de date și rolurile db_datareader, db_datawriter sau db_owner);
USER pentru baza de date
- în OBJECT EXPLORER - după conectarea la server - Security - Logins - dublu click pe utilizator - User Mapping - se bifeaza baza de date și rolurile db_datareader, db_datawriter sau db_owner);
Verificare rol user (conectarea utilizatorului cu baza de date)
- din OBJECT EXPLORER - după conectarea la server - Security - Logins - dublu click pe utilizator - User Mapping - se bifeaza baza de date și rolurile db_datareader, db_datawriter sau db_owner); - Student - Security - Roles - Database Roles - db_owner (dublu click) să fie bifat
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) sau cu script SQL: ALTER TABLE NumeTabel
ADD NumeColoana TipDate; (sau alt tip)
SCHIMBARE DENUMIRE COLOANĂ: click dreapta pe coloană - Modify
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ă (click dreapta pe tabel - Design - selectare coloană - click dreapta pe coloană - Set Primary Key - Salvare) sau cu script SQL: (în cauzul modificării) ALTER TABLE USER
ADD CONSTRAINT PK_USER
PRIMARY KEY (USERId);;
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 DATELOR: UNIQUE - pentru a nu permite duplicate într-o coloană (cheia primară este implicit unică) - ALTER TABLE USER
ADD CONSTRAINT UNIQUE_USER Nume UNIQUE (Nume); 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 SCHEMEI TABELELOR ÎN DIAGRAMĂ 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; INTEROGAREA/ AFIȘAREA/ REGĂSIREA/ VERIFICAREA TUTUROR TABELELOR SELECT name FROM sys.tables; sau SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES; sau a structurii unei tabele: USE nume_bazadedate; SELECT * FROM numele_tabelului;
SELECT TOP 1000 ROWS - permite doar afișarea/ vizualizarea/ verificarea rapidă a datelor, nu și editare/ modificare: click dreapta pe tabel - select Select Top 1000 Rows
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
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
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 (Select specific objects…), apoi ‘Schema and Data’ , NU ‘Schema only’.
NORMALIZAREA DATELOR
NORMALIZAREA DATELOR - modele de structurare a bazelor de date
- identificarea entităților logice din realitate (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)
Forma normală de ordin 1 (FN1 = prima normalizare**)**
= toate atributele trebuie specificate o singură dată - nu sunt permise atribute cu mai multe valori (set de valori), atribute compuse sau combinații ale acestora - domeniul atributelor include doar valori atomice și indivizibile - așadar fiecare coloană conține valori atomice, nu există coloane repetitive, are PRIMARY KEY;
Exemplu: Înregistrare împrumut de carte de la bibliotecă, având 3 cărți - tabel IMPRUMUT având cărțile în aceeași coloană sau 3 coloane cu valori similare - nu îndeplinește FN1 fiind un set de valori care se repetă, nu valori atomice - trebuie înregistrări diferite pentru fiecare carte (deci coloanele vor fi: ID - fiind cheie primară; numar_imprumut (aici acelasi numar) - carte (fiecare titlu în parte)
PROCES NORMALIZARE
(pornind de la o bază de date care necesită normalizare)
1. Analizarea bazei de date
- generarea diagramei - identificarea redundanțelor sau a grupurilor repetitive: 1. fiecare rând are o cheie primară unică; 2. fiecare coloană conține o valoare unică (valoare atomică); 3. există grupuri repetitive?
2. Găsirea soluției de normalizare
- descompunerea grupurilor repetitive de atribute sau a seturilor de valori în valori atomice (este necesară împărțirea în tabele în care coloanele să conțină valori atomice)
3. Crearea unei noi baze de date
- click dreapta pe Databases - Create New Database - (apoi) click dreapta pe Tables - … (vezi CREAREA BAZEI DE DATE…)
Forma normală de ordin 2 (FN2)
- un atribut depinde de identificatorul unic al entității care o descrie (este necesar să fie îndeplinite și condițiile de la FN1;
Exemplu: La înregistrarea împrumutului de carte de la bibliotecă anterior, pe lângă datele de la FN1, se vor adăuga nume client, data împrumutului etc.
Forma normală de ordin 3 (FN3)
- fiecare tabelă are o singură cheie primară, de care depind datele (o formă de FN3 este și Forma Normală Boyce-Code)
Exemplu: Atributul vârstă a cititorului poate deriva din atributul data nașterii.
INTEROGARE SQL (comandă/ query în limbajul SQL folosită pentru a comunica cu o bază de date)
- prin interogare, se poate obține într-o bază de date: afișare, adăugare/ modificare/ ștergere de date, structurare sau gestionare de TABELE - se folosesc queries adresate serverului SQL, cu referire la o anumită bază de date, indicată prin comanda USE
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)
INTEROGARE ÎN MySQL cu DBeaver (query), folosind SQL Editor, cu referire la o anumită bază de date, indicată prin comanda USE : - click dreapta pe baza de date - SQL Editor - New SQL Script - scrierea setului de comenzi, de exemplu USE Bazadedate; SHOW TABLES; SELECT * FROM Utilizatori - click dreapta pe script - Execute (doar query sau întreg scrptul) - se afisează rezultate din baza de date într-un DataGridView - click Save - se salvează un fișier script sql cu setul de comenzi) - rezultatele afișate în urma unei interogări în DataGridView se pot copia, după selectare - click dreapta pe selecție - Export data (format .csv pot fi deschise în Excel)
INTEROGARE ÎN SQL SERVER (query) adresată serverului SQL, cu referire la o anumită bază de date, indicată prin comanda USE (din limbajul Transact-SQL): - printr-o fereastră de interogare (SqlQuery Window) - 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) - 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-o foaie Excel)
COMENZI/ QUERIES DE INTEROGARE și SUBQUERIES (subinterogări)
Comanda INSERT (adaugă date)
- comanda se aplică la tabelele care nu au valoare de incrementare (în Server SQL, Identity Increment bifat cu Yes, adică se autoincrementează, deci trebuie să fie No)
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 ‘…’)
Comanda/ clauza SELECT
= regăsirea/ extragerea datelor din una sau mai multe tabele - alege coloanele afișate FROM indică tabela sursă (select_expr = lista coloanelor care vor fi afișate prin interogare); TABLE_REFERENCES = indica tabela sau tabelele din care se vor prelua informatii
COMENZI/ QUERIES DE INTEROGARE folosind SELECT
AFIȘAREA/ VIZUALIZAREA/ VERIFICAREA DATELOR - permite doar afișarea/ vizualizarea/ verificarea rapidă a datelor, nu și editare/ modificare - exemplu de afișare a tuturor datelor din baza de date: USE nume_bazadedate; CREATE VIEW view_toate_datele AS; SELECT * FROM persoana p;
(dacă sunt mai multe tabele, se vor trece toate cu SELECT * FROM numele tabelei) - vezi detalii despre vederi (VIEW)
Afișarea - folosind SELECT - a tuturor datelor (returnarea tuturor coloanelor) dintr-un 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
Clauza/ expresia ORDER BY
- se folosește pentru sortarea datelor în funcție de diferite criterii (filtrează rândurile)
**Afișarea rezultatelor ordonate (**aranjate cu clauza ORDER BY) crescător (ASC) 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
Clauza ALIAS
- oferă denumiri alternative pentru coloane sau tabele
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
Clauza/ expresia WHERE
- filtrează rezultatul interogării, adică rândurile, evaluând fiecare coloană/ înregistrare din tabelele implicate, returnându-se rezultate de la cele care îndeplinesc condițiile
Afișarea rezultatelor folosind comanda SELECT împreună cu clauza WHERE pentru a filtra datele - a afișa doar acele înregistrări care îndeplinesc condiția: clienți din Cluj
SELECT CustomerID, Address, City, Phone FROM Customers
WHERE City = ‘Cluj’
Afișarea rezultatelor folosind comanda SELECT împreună cu clauza WHERE pentru a filtra datele cu constrângerea/ condiția IS NULL sau IS NOT NULL (doar datele unde NU ESTE completat orașul sau ESTE completat orașul)
SELECT CustomerID, Address, City, Phone FROM Customers
WHERE City IS NULL (sau) WHERE City IS NOT NULL
Afișarea rezultatelor folosind comanda SELECT împreună cu clauza WHERE pentru a filtra datele cu constrângerea/ condiția AND (datele care corespund condițiilor menționate - clienți din Cluj ȘI având numele Pop)
SELECT CustomerID, Address, City, Phone FROM Customers
WHERE City = ‘Cluj’ and Name = ‘Pop’
Afișarea rezultatelor folosind comanda SELECT împreună cu clauza WHERE pentru a filtra datele cu constrângerea/ condiția OR (datele care corespund condițiilor menționate - clienți din Cluj ȘI având numele Pop SAU Popescu)
SELECT CustomerID, Address, City, Phone FROM Customers
WHERE City = ‘Cluj’ and Name = ‘Pop’ OR Name = ‘Popescu’
Afișarea rezultatelor folosind comanda SELECT împreună cu clauza WHERE pentru a filtra datele cu constrângerea/ condiția IN - care poate înlocui OR când sunt mai multe variante (datele care corespund condițiilor menționate - clienți din Cluj ȘI având numele Pop, Popescu)
SELECT CustomerID, Address, City, Phone FROM Customers
WHERE City = ‘Cluj’ AND Name IN (‘Pop’, ‘Popescu’);
Afișarea rezultatelor folosind comanda SELECT împreună cu clauza WHERE pentru a filtra datele cu condiția LIKE sau NOT LIKE (datele care corespund condițiilor menționate - clienți din orașe care încep cu litera P sau excluzând orașe care încep cu litera P)
SELECT CustomerID, Address, City, Phone FROM Customers
WHERE City LIKE ‘P%’; (sau) WHERE City NOTLIKE ‘P%’;
Afișarea rezultatelor folosind comanda SELECT împreună cu clauza WHERE pentru a filtra datele cu constrângerea/ condiția BETWEEN (clienți care au făcut comenzi între anii 2016 și 2017, iar folosind LIMIT/ FETCH NEXT 10 ROWS ONLY - rezultatele - numărul maxim - sunt LIMITATE la 10 afișări)
SELECT CustomerID, Address, Phone, Data_comanda FROM Customers
WHERE (YEAR(Data_comanda) BETWEEN 2016 AND 2017 LIMIT 10);
Afișarea rezultatelor folosind comanda SELECT împreună cu clauza UNION din tabele având același număr de coloane și tipuri compatibile (nume autori și cititori, eliminându-se duplicatele)
SELECT nume FROM cititor
UNION
SELECT nume FROM autor;
OFFSET
- indică numărul de înregistrări de la care se face afișarea (valoarea predefinit[ este 0)
Clauza JOIN
= utilă pentru a combina date din două sau mai multe tabele (poate fi folosită de mai multe ori într-o interogare dacă este necesar): INNER JOIN = returnează rândurile care se regăsesc în ambele tabele; FULL JOIN = returnează rândurile din ambele tabele, inclusiv cele fără corespondență (fără condiție de legătură); LEFT JOIN = afișează rândurile din tabelul din stânga; RIGHT JOIN = afișează rândurile din tabelul din dreapta;
OPERATORI LOGICI
Operatorul EXIST pentru verificare subquery
- se verifică existența (cu da sau nu) - dacă se returnează cel puțin un rezultat; - spre deosebire de JOIN, EXIST nu produce duplicate;
Afișarea rezultatelor folosind comanda SELECT 1 împreună cu clauza WHERE și cu operatorul EXIST în care există cel puțin o comandă pentru un client (pentru clienta Maria există comanda 1)
SELECT COUNT(*) AS TotalClientiCluj FROM Customers
WHERE City = ‘Cluj’
SELECT Name FROM Customers
WHERE EXISTS (
SELECT 1 FROM Orders
WHERE Orders.id_Customers = Customers.id
);
FUNCȚII DE AGREGARE (COUNT, SUM, AVG, MIN, MAX)
*În SQL Server, interogările se pot face în fereastra Designer
Funcții de agregare: AVG,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 pot fi 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/ linii 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 poate folosi clauza DISTINCT pentru a arăta numărul de țări și nu numărul total de clienți)
Afișarea rezultatelor folosind comanda SELECT împreună cu clauza WHERE și cu funcția COUNT pentru a obține totalul clienților din Cluj
SELECT COUNT(*) AS TotalClientiCluj FROM Customers
WHERE City = ‘Cluj’
COUNT(DISTINCT)
- returnează numărul de linii cu valori distincte
Clauza GROUP BY
- sortarea/ gruparea datelor în funcție de coloanele indicată/ de tipul de date din coloanele indicate
Expresia HAVING
- se aplică doar coloanelor menționate, fiind scrisă după clauza GROUP BY și înainte de expresia HAVING.
Afișarea rezultatelor folosind comanda SELECT împreună cu clauzele GROUP BY și HAVING și cu funcția COUNT pentru a obține numărul clienților din fiecare oraș, în care sunt mai mult de 2 clienți
SELECT City, COUNT(*) AS Total FROM Customers
GROUP BY City
HAVING COUNT(*) > 2;
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)
SELECT SUM(ValoareComanda) AS TotalIncasari FROM Comenzi;
FUNCȚIA GROUP_CONCAT(col)
- determină concatenarea valorilor din mai multe rânduri într-un singur șir de caractere (separatorul implicit este virgula)
SELECT nume, GROUP_CONCAT(atribut, ‘:’,valoare) from Produs, Produs_atribute WHERE Produs.id=Produs_atribute.Product_id GROUP BY nume,
FUNCȚIA AVG()
- determină valoarea medie a valorilor argumentului
FUNCȚIA MIN()
- returnează valoarea minimă obținută în rezultate
FUNCȚIA MAX()
- returnează valoarea maximă obținută în rezultate
FUNCȚII ÎNCORPORATE (conversie tipuri de date - CAST)
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 PENTRU CONVERSIA TIPURILOR DE DATE (implicită și explicită cu CAST și CONVERT)
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);
(conversia datelor la un anumit tip de dată) CAST(expr AS type):
convertire din șir de caractere în număr (5+5=10):
SELECT 5+‘5’;
-> 10
convertire din număr în șir de caractere - CONCAT unește argumentele în forma în care apar scrise:
SELECT CONCAT(10,’ DB’);
-> ‘10 DB’
se convertește cu CAST valoarea numerică într-un șir de caractere:
SELECT 5.1, CAST(5.1 AS CHAR);
-> 5.1, ‘5.1’
(CONVERT cu USING pentru trecerea la alt tip de caractere (de exemplu, utf8 - pentru folosirea diacriticelor):
SELECT CONVERT (‘Clienți’ USING utf8);
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
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
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 reutiliza
= 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 AFIȘĂ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).
* pentru a obține ordinea alfabetică, se selectează în coloana Sort Type - pe același rând cu CustomerID
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 alte țări decât Canada:
WHERE (Customers.Country NOT LIKE (‘Canada’)) sau WHERE 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%’)
* pentru a obține lista filtrată după an și lună WHERE (YEAR(Orders.OrderDate) = 2022) AND (MONTH(Orders.OrderDate) = 5)
VIZIBILITATEA DATELOR UNEI VEDERI CREATE: Deschiderea unei vederi: View (Refresh) - View - Design
ACCESAREA BAZEI DE DATE MySQL DINTR-O APLICAȚIE
- prin intermediul unui driver JDBC
ACCESAREA BAZEI DE DATE SQL SERVER dintr-o aplicație WPF (pe .NET 8)
- prin intermediul framework-ului EF Core, care permite folosirea LINQ
Entity Framework Core (dezvoltat pentru .NET)
= (open source, care poate rula pe mai multe platforme - cross platform) sistem O/ R Mapper (ORM) folosit pentru adaptarea/ conversia datelor între modul de lucru obiectual (folosind obiecte și clase de obiecte) și cel relațional (al bazelor de date).
* Pachetele NuGet instalate - vezi Entity Framework Core și Syncfusion WPF
În proiectul din Visual Studio, se creează App.config: (în Solution Explorer) click dreapta pe proiect - Add - New Item (selectare Application Configuration File)
<add name=“StudentConnection”
connectionString=“Server=SERVER1;Database=Student;User Id=AplicatieUser;Password=ParolaComplexa123!;”
providerName=“System.Data.SqlClient” />
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ă instrucțiuni de interogare a colecțiilor de date direct în limbaje de programare de nivel înalt, precum C# (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 conțin reultate ale interogărilor LINQ), from, where, select etc.
(PAȘI: 1. crearea unei liste generice: List
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 u0026amp; Interfața ICollection (interfața IEnumerable) u0026amp; 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.) u0026amp; exemple u0026amp; membri ai claseiu003c/strongu003eu003cfont color=u0022rgba(0, 0, 0, 0.99)u0022u003eu003cspan style=u0022font-size: 11px;u0022u003eu003cstrongu003eu0026nbsp;Listu0026lt; T u0026gt;u0026nbsp;u003c/strongu003eu003c/spanu003eu003c/fontu003eu003cstrongu003eu0026nbsp;u003c/strongu003e
- 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
(ATENȚIE! pentru a se vedea modificările în baza de date, este necesar click dreapta - REFRESH)
(click pe + sau - pentru a desfășura sau restrânge conținutul reperelor)
LIMBAJE DE PROGRAMARE: PASCAL/ C/ C++ - tematică științifică pentru predare
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)
u003cemu003eATENȚIE LA CUVINTELE REZERVATE (CHEIE)!u0026nbsp;u003c/emu003e
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)
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
PASCAL - este un limbaj de programare
C este un limbaj de nivel mediu (programare procedurală)
(pentru editare de coduri, se pot folosi Code Blocks sau CLion)
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)
OPERATORI sunt folosiți pentru a da valori variabilelor
Structuri de date liniare
ȘIRURI (un tip de dată de bază format din caractere numerice)
C++ este un limbaj de nivel înalt, adică programare orientată pe obiecte), utilizat pentru aplicații
Mediu de dezvoltare: CODE BLOCK
= aplicație compleză care permite scrierea de programe (într-un limbaj de programare)
FORMA GENERALĂ A UNUI PROGRAM scris cu C++
< (Directive de procesare) >
< (Directive de preprocesare - #include
using namespace std //se utilizează toate numele din secțiunea std a fișierului iostream - în general, fără cele două linii cu care începe un program nu se pot citi și afișa un program
int main ()
{
< Declarații, instrucțiuni >
cout<< Salut << endl;
return 0;
}
Structuri de date neliniare
Teoria grafurilor
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) = colecții 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).
METODE DE PROGRAMARE
Metoda Greedy
ALOCAREA DINAMICĂ A MEMORIEI
Operații
Medii vizuale de programare
(click pe + sau - pentru a desfășura sau restrânge conținutul reperelor)
Realizarea unui joc ”Prinde mingea”
u003cstrongu003eu003cuu003e1. u003ciu003eSPRITE -u0026nbsp;u003c/iu003eALEGEREA PERSONAJULUI (SAU A UNUI OBIECT) CARE PRINDE MINGEAu003c/uu003eu003c/strongu003e
(în colțul din dreapta-jos al ecranului) CLICK PE CAPUL PISICII > se alege personajul (pisica este personaj implicit)
u003cstrongu003eu003cuu003e2. u003cemu003eCREAREA DE BLOCURIu003c/emu003eu0026nbsp;(PENTRU REALIZAREA COMENZILOR - acțiuni, sunete etc.)u003c/uu003eu003c/strongu003e
(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)
Realizarea unei aplicații ”Prinde mingea”
u003cstrongu003eu003cuu003e1. u003ciu003eCREAREA APLICAȚIEIu003c/iu003eu003c/uu003eu003c/strongu003e
(î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
u003cstrongu003eu003cuu003e2. u003cemu003eSETAREA ECRANULUIu003c/emu003eu003c/uu003eu003c/strongu003e
- (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
u003cstrongu003eu003cuu003e3. u003cemu003eADĂUGAREA UNEI MINGIu003c/emu003eu003c/uu003eu003c/strongu003e
- î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”
u003cstrongu003eu003cuu003e4. u003cemu003eTESTAREA APLICAȚIEI PE TELEFON SAU PE TABLETĂu003c/emu003eu003c/uu003eu003c/strongu003e
- 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.
u0026nbsp;u003cstrongu003eu003cuu003eRulare în Windowsu0026nbsp;u003c/uu003eu003c/strongu003eu003cspan style=u0022font-size: xx-small; text-align: center;u0022u003e(u003c/spanu003eu003cstrong style=u0022padding: 0px; margin: 0px; overflow-wrap: break-word; color: rgb(97, 97, 97); font-size: xx-small; text-align: center;u0022u003eu003cu style=u0022padding: 0px; margin: 0px; overflow-wrap: break-word;u0022u003eu003ca href=u0022https://nodered.org/docs/getting-started/windowsu0022 style=u0022color: rgb(209, 74, 43); transition-property: all; padding: 0px; margin: 0px; overflow-wrap: break-word;u0022u003einstalare pentru Windowsu003c/au003eu003c/uu003eu003c/strongu003eu003cspan style=u0022font-size: xx-small; text-align: center;u0022u003e)u003c/spanu003e
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
u003cstrongu003eu003cuu003e1. u003cemu003eDESCHIDEREA UNUI PROIECT NOUu003c/emu003eu003c/uu003eu003c/strongu003e
(în browser) http://localhost:1880 - se va deschide o fereastră Flow1
u003cstrongu003eu003cuu003e2. u003cemu003eAPI ”Hello” + Echo HTTPu003c/emu003eu003c/uu003eu003c/strongu003e
- (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
u003cstrongu003eu003cuu003e3. u003cemu003eDeployu003c/emu003eu003c/uu003eu003c/strongu003e
- (în dreapta sus a ecranului) click DEPLOY
u003cstrongu003eu003cuu003e4. u003cemu003eAfișareu003c/emu003eu003c/uu003eu003c/strongu003e
(în browser) http://localhost:1880/hello - se va deschide o fereastră cu conținutul Hello, World
Limbaje de marcare
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
Hello, World!
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
- 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
Exemplul BIBLIOTECA, de document XML care conține date
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.
- 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.
XAML cu .NET
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
Încapsulareau003c/strongu003e
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 u003c/strongu003e(unitate fundamentală a u003cstrongu003eîncapsulăriiu003c/strongu003e) =u0026nbsp;u003cbu003eun șablonu003c/bu003e
(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
u003cstrongu003eu0026nbsp;Obiecte u003c/strongu003e(fac parte dintr-o clasă - sunt instanțe ale unor clase) = un rezultat obținut cu șablonulu0026nbsp;
(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
u0026nbsp;u003cstrongu003eMoștenireau003c/strongu003e
= un obiect primește caracteristicile obiectului părinte
u0026nbsp;u003cstrongu003eReutilizareau003c/strongu003e
= o clasă nou creată poate fi utilizată pentru a crea o mulține de noi alte obiecte
Framework
= o structură predefinită, oferind instrumente/ componente, cum ar fi aspect, butoane, formulare etc. și reguli
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)
u003cemu003eOpțiuni din meniul Pycharmu003c/emu003eu0026nbsp;
- RUN - rularea unui fișier
- este obligatorie identarea codului (tab)
- comentariile în Python se notează cu #
Tipuri de date
- în funcție de posibilitate de a-și schimba valoarea
VARIABILE
VARIABILELE (își pot schimba valoarea pe parcursul execuției algoritmului - de exemplu: pozițiile pieselor pe tabla de șah)
- 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 _)
u003cemu003eVariabile scalareu003c/emu003eu0026nbsp;
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)
u003cemu003eATENȚIE LA CUVINTELE REZERVATE (CHEIE)!u0026nbsp;u003c/emu003e
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)
u003cemu003eRefactorizarea Pythonu003c/emu003eu0026nbsp;
include redenumirea, metoda de extragere, introducerea variabilei, introducerea constantei, mutarea în sus sau în jos etc.
CONSTANTELE (NU își pot schimba valoarea pe parcursul execuției algoritmului - de exemplu: dimensiunea tablei de șah)
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)
u003ciu003eFuncțiau003c/iu003e
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 .
u003ciu003eStructura funcțieiu003c/iu003e
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)
u003ciu003eFuncția PRINTu003c/iu003e
- 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)
u003cemu003eConcatenare (Concationation)u003c/emu003eu0026nbsp;
= însumarea a două sau mai multe șiruri într-unul singur (+) sau o combinare de caractere și cifre/ calcul de cifre
u003ciu003eMetodău003c/iu003eu003cbru003e
este un tip specific de funcție, dar acționează diferit
u003cemu003eMetoda .u003cstrongu003ereplace(`x`, `y`)u003c/strongu003eu003c/emu003eu003cbru003e
- returnează șirul înlocuit cu noul șir de n ori
u003cemu003eMetoda .u003cstrongu003eupper()u003c/strongu003eu003c/emu003eu003cbru003e
- returnează șirul cu toate caracterele transformate în majuscule
u003cemu003eMetoda .u003cstrongu003elower()u003c/strongu003eu003c/emu003eu003cbru003e
- returnează șirul cu toate caracterele transformate în minuscule
u003ciu003eFuncțiau003c/iu003e
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 .
u003ciu003eFuncția INPUTu003c/iu003e
- 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
u003ciu003eMetodău003c/iu003eu003cbru003e
este un tip specific de funcție, dar acționează diferit
u003cemu003eMetoda .u003cstrongu003ecount(x)u003c/strongu003eu003c/emu003eu003cbru003e
- returnează de câte ori apare elementul x din listă
INDEXARE
u003ciu003eFuncțiau003c/iu003e
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 .
u003ciu003eFuncția LENu003c/iu003e
- returnează numărul de obiecte din listă (lungimea listei)
u003ciu003eStructura funcțieiu003c/iu003e
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)
u003ciu003eFuncția RANGEu003c/iu003e
stochează exact o valoare dată la un moment dat
u003ciu003eFuncțiau003c/iu003e
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 .
FastAPI
* este un framework în Python, util pentru backend și pentru API-uri web (identifică ruta (adresa) solicitată, verifică metoda HTTP folosită și execută funcția corespunzătoare)
API
- un set de reguli prin care două aplicatii pot comunica intre ele (de exemplu, frontend dezvoltat cu Svelte comunică cu realizat cu FastAPI
Interfața Swagger UI pentru testare backend
- endpoint-urile definite in aplicatie apar automat in Swagger si pot fi testate fara a scrie cod suplimentar
Decorator
- instructiune care modifica comportamentul functiei asupra careia este aplicat. In FastAPI, decoratorii sunt utilizati pentru a specifica ruta si metoda HTTP care trebuie asociate unei functii. Exemplu: @app.get(“/”) def home(): return {“mesaj”: “Aplicatia functioneaza”} In acest caz, atunci cand este accesata ruta principala a aplicatiei, functia home() este executata iar rezultatul este trimis automat sub forma unui raspuns JSON.
Prin intermediul unor endpoint-uri = funcționalități ale aplicației (- rute, adică adrese la care clientul poate trimite cereri, fiecare fiind asociat unei funcții Python prin intermediul unui decorator - care returneaza dictionare Python, care sunt executate și transformate automat în răspunsuri JSON), un server creat primește cereri de la aplicații sau pagini web, procesează date, comunică cu baze de date și generează răspunsuri.
Programare asincronă (folosită de FastApi)
- funcțiile asincrone, folosite în Python cu comanda async (pentru comunicarea cu servicii externe sau accesarea unor resurse aflate la distanta), permit procesarea mai eficienta a unui numar mare de cereri simultane
PASUL în folosirea FastAPI = importarea bibliotecii si crearea obiectului principal al aplicatiei: from fastapi import FastAPI app = FastAPI()
- prin protocol HTTP, se folosesc metodele GET (pentru citirea informațiilor, când avem nevoie de rezultate de la server, dar fără a modifica date), POST (pentru a trimite noi date către server, când se completează formulare sau se transmit informații către backend), PUT (actualizează date existente), DELETE (elimină date).
Exemplu: Ruta este /salut, iar endpoin este asocierea dintre metoda GET și rută
@app.get(“/salut”) def salut(): return {“mesaj”: “Salut”}
Folosind http://localhost:8000/salut, FastAPI execută funcția Salut() și returnează răspunsu definit în interiorul funcției.
Tipuri de date folosite cu FastAPI
• str pentru texte, • int pentru numere intregi, • float pentru numere reale, • bool pentru valori logice. FastAPI foloseste informatiile despre tipurile de date pentru validarea automata a valorilor primite. Exemplu (parametrul id este declarat ca fiind un numar intreg. Daca utilizatorul trimite o valoare care nu poate fi convertita la tipul int, se va genera automat o eroare): @app.get(“/student/{id}”) def student(id: int): return {“id”: id}
** se generează automat documentația (http://localhost:8000/docs)
JAVA - este un limbaj de nivel înalt, de programare orientată pe obiecte
u003cemu003eIDE (mediu de dezvoltare integrat)u003c/emu003e
(Integrated Development Environment) = un program util pentru a scrie, a testa și a depana coduri; IntelliJ este preferat de programatorii Java.
u003ciu003eMediul de lucru - Tech Stacku003c/iu003e
= set de tehnologii pentru mediul tehnic de lucru: limbaje de programare, structuri/ instrumente predefinite - framework-uri -, alte soluții software folosite pentru realizarea proiectului
Framework
= o structură predefinită, oferind instrumente/ componente, cum ar fi aspect, butoane, formulare etc. și reguli
u003ciu003eJava EE versus Jakarta EEu003c/iu003e
= 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)
u003cemu003eFront-endu003c/emu003e
u003cemu003eBack-endu003c/emu003e
u003cemu003eJSF (Java Server Faces - framework)u003c/emu003e
- 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ă.
u003cemu003eBootsfaces (componente pentru interfață)u003c/emu003e
(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
u003cstrongu003eu003cuu003e1. CREAREA UNUI PROIECT NOUu0026nbsp;u003c/uu003eu003c/strongu003e
(î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
u003cstrongu003eu003cuu003e2. Frontend: ADĂUGAREA DEPENDENȚELOR (biblioteci externe - pentru a utiliza componente vizuale predefinite)u0026nbsp;u003c/uu003eu003c/strongu003e
(în pom.xml, dependețele trebuie să fie descrise astfel:)
ETAPA 2: CREAREA LOGICII (MANAGED BEAN)
u003cstrongu003eu003cuu003e3. Backend: ADĂUGAREA CLASEI MANAGED BEANu0026nbsp;u003c/uu003eu003c/strongu003e
u003ciu003eManaged Beanu003c/iu003e
= 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)
u003cstrongu003eu003cuu003e4. ADĂUGAREA UNUI DIRECTORu0026nbsp;u003c/uu003eu003c/strongu003eu003cspan style=u0022font-size: 12px;u0022u003e(webapp - dacă nu a fost generat automat)u003c/spanu003e
(click dreapta pe directorul src) NEW - DIRECTORY - Name (webapp)
u003cstrongu003eu003cuu003e5. ADĂUGAREA index.xhtmlu003c/uu003eu003c/strongu003e
(click dreapta pe directorul src) NEW - DIRECTORY - Name (webapp)
<h:head>
</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>
u003cstrongu003eu003cuu003e6.u0026nbsp; ÎN WEBAPP - web.xmlu003c/uu003eu003c/strongu003e
<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”>
u003cstrongu003eu003cuu003e7.u0026nbsp; ÎN WEBAPP - beans.xmlu003c/uu003eu003c/strongu003e
<beans xmlns=“http://xmlns.jcp.org/xml/ns/javaee”
bean-discovery-mode=“all”>
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
u003cstrongu003eu003cuu003e1. CREAREA UNEI BAZE DE DATEu003c/uu003eu003c/strongu003e
- î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
u003cstrongu003eu003cuu003e2. CREAREA UNUI CONT PE SERVERUL MYSQL (pentru conectarea aplicației)u003c/uu003eu003c/strongu003e
- 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;
u003cstrongu003eu003cuu003e3. ADĂUGARE DE INFORMAȚII ÎN BAZA DE DATE (realizarea de tabele și adăugarea da date în tabele)u003c/uu003eu003c/strongu003e
- 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
u003cstrongu003eu003cuu003e4. ADĂUGAREA DEPENDENȚELOR NECESARE PENTRU BAZA DE DATE în pom.xmlu003c/uu003eu003c/strongu003e
u003cstrongu003eu003cuu003e5. CREARE DIRECTOR resources - META-INF și fișier persistence.xmlu003c/uu003eu003c/strongu003e
* 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>
* 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)
u003cstrongu003eu003cuu003e6. CREARE. COMPLETAREu0026nbsp; CLASA JAVA ENTITY JPA (fișierul User.java)u003c/uu003eu003c/strongu003e
* 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; }
}
u003cstrongu003eu003cuu003e7. CREARE/ COMPLETARE CLASA JAVA BEAN MANAGED (JSF)u003c/uu003eu003c/strongu003e
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; }
}
u003cstrongu003eu003cuu003e8. CREARE/ COMPLETARE CLASA JAVA LOGINu003c/uu003eu003c/strongu003e
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; }
}
u003cstrongu003eu003cuu003e9. CREARE/ COMPLETARE index.xhtmlu003c/uu003eu003c/strongu003e
Bun venit!
Pentru a accesa platforma, te rugăm să te autentifici sau să îți creezi un cont nou.
u003cstrongu003eu003cuu003e9. CREARE/ COMPLETARE register.xhtmlu003c/uu003eu003c/strongu003e
<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>
u003cstrongu003eu003cuu003e10. CREARE/ COMPLETARE login.xhtmlu003c/uu003eu003c/strongu003e
<h:head>
</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>
u003cstrongu003eu003cuu003e11. CREARE faces-config.xmlu003c/uu003eu003c/strongu003e
<faces-config xmlns=“http://xmlns.jcp.org/xml/ns/javaee”
version=“2.3”>
* î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;”>
Servus, #{userBean.loggedUser.username}
</h:panelGroup>
ADĂUGARE FEREASTRĂ POPUP
- în fișierul .xhtml
<h:form>
<b:commandButton value=“Deschide descriere”
onclick=“$(‘.modalPseudoClass’).modal(‘show’); return false;” />
<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”>
<h:panelGroup style=“display:flex; align-items:center; gap:10px;”>
Descriere proiect
<b:commandButton value=“#{empty projectBean.selectedProject.description ? ‘Adaugă descriere’ : ‘Editează descriere’}”
look=“primary”
onclick=“$(‘.modalDescriere’).modal(‘show’); return false;” />
</h:panelGroup>
<h:outputText id=“descriereOutput”
value=“#{empty projectBean.selectedProject.description ? ‘Nu există descriere’ : projectBean.selectedProject.description}”
escape=“false”/>
<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”/>
<b:inputTextarea id=“descriereInput”
value=“#{projectBean.selectedProject.description}”
rows=“6”
style=“width:100%;” />
<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;
}
JAVASCRIPT - este un limbaj de nivel înalt, de programare orientată pe obiecte
JSON (JavaScript Object Notation)
- format pentru schimbul de date intre aplicatii, construit pe baza perechilor cheie-valoare; - JSON poate contine numere, texte, valori booleene, liste si alte obiecte JSON. Exemplu: { “nume”: “Ion”, “varsta”: 20, “activ”: true, “materii”: [“Programare”, “Baze de date”] }
Frontend-ul trimite date catre backend, de obicei in format, iar raspunsurile primite de la backend sunt returnate tot in format JSON
Exemplu: “nume” si “varsta” reprezinta cheile, iar “Ion” si 20 reprezinta valorile asociate.
{ “nume”: “Ion”, “varsta”: 20 }
SVELTE - este un framework JavaScript, cu sintaxă simplă și asemănătoare cu cea folosită de HTLM, CSS și JAVASCRIPT standard - folosit la construirea interfețelor pentru utilizator
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)u003c/emu003e
= 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.)
u003cemu003eCOMMON LANGUAGE RUNTIME (CLR)u003c/emu003e
= 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).
u003cemu003eTehnologii destinate datelor (Data Tier) - ADO.NET, LINQ, XMLu003c/emu003e
- pentru acces la date, interogarea datelor etc.
u003cemu003eTehnologii destinate comunicațiilor - WCF (Windows Communication Foundation), WF (Workflow Foundation)u003c/emu003e
Service Oriented Architecture - SOA
u003cemu003eTehnologii pentru interfețe grafice - GUI (Graphical User Interface): WinForms - u003cstrongu003eproiecte de tip Windows Forms Applicationu003c/strongu003e, WPF, ASP.NET, SilverLightu003c/emu003e
Service Oriented Architecture - SOA - proiectele construite folosind Windows Forms (WinForms) pot conține butoane, casete de text, etichete, liste, meniuri, ferestre etc.
u003cemu003eLimbaje de programare: C#, F#, Visual Basic, altele - aplicațiile .NET sunt scrise în limbajele C#, F# sau Visual Basicu003c/emu003e
- 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**)**
u003cemu003eLimbaje de programare: C#, F#, Visual Basic, XAML, TypeScriptu003c/emu003e
- rezultând fișiere cu extensia .dll sau .exe
u003cemu003eBASE CLASS LIBRARY (BCL)u003c/emu003e
= 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.)
Link pentru instalare VISUAL STUDIO: https://visualstudio.microsoft.com
u003ciu003eIndicații pentru instalare (versiunea 2022)u003c/iu003e
(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).
u0026nbsp;u003cbu003eTIPURI DE ANSAMBLURI în .NETu003c/bu003e
- 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 u003cstrongu003eîncapsulării; - u003c/strongu003eîn C#, clase sunt u003cstrongu003eu003cemu003etipuri referințău003c/emu003eu003c/strongu003e) - u003cstrongu003eobiectele u003c/strongu003esunt parte dintr-o clasău0026nbsp;
(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()
u003cstrongu003eu0026nbsp;Obiecte în C#u0026nbsp;u003c/strongu003e(- fac parte dintr-o clasă - instanțe ale unor clase) se creează cu operatorul u003cstrong style=u0022font-style: italic;u0022u003enewu003c/strongu003e și indicarea constructorului claseiu0026nbsp;
(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)
u003cstrongu003eu0026nbsp;Metodău0026nbsp;u003c/strongu003e(- arată ce fac elementele din clasă)
de exemplu: elevul învață
u0026nbsp;u003cstrongu003eInterfațău0026nbsp;u003c/strongu003e(”un contract” cu clasele - se folosește în situații când se utilizează un set de metode care încapsulează funcționalități specifice)u0026nbsp;
Exemplu. CLASS Persoana Proprietăți: Nume; Prenume; DataNasterii; LoculNasterii; Domiciliul Metode: Persoana(); CalculeazăVarsta(); NumeComplet()
u003cstrongu003eu0026nbsp;Modificatorii de acces în C#u0026nbsp;u003c/strongu003e(stabilesc accesibilitatea obiectelor și a membrilor acestora - apar în codul clasei)
- public - private - protected - internal
u0026nbsp;Directivau0026nbsp;u003cstrongu003eu003cuu003eUsingu003c/uu003eu003c/strongu003e
- directivele Using nefolosite se vor șterge, iar cele rămase vor fi sortate alfabetic.
u0026nbsp;u003cstrongu003eDiagrama u003c/strongu003eunei clase
Diagrama reprezintă componentele clasei (de exemplu: proprietăți publice, metode publice).
u0026nbsp;u003cbu003eTablouri 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ă.
u0026nbsp;u003cstrongu003eColecții de obiecteu003c/strongu003e - clasele din spațiul de nume System.Collections u0026amp; Interfața ICollection (interfața IEnumerable) u0026amp; 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.
u0026nbsp;u003cstrongu003eColecții generice (doar pentru un tip de obiecte - cum ar fi doar produse) u0026amp; exemple u0026amp; membri ai claseiu003c/strongu003eu003cfont color=u0022rgba(0, 0, 0, 0.99)u0022u003eu003cspan style=u0022font-size: 11px;u0022u003eu003cstrongu003eu0026nbsp;Listu0026lt; T u0026gt;u0026nbsp;u003c/strongu003eu003c/spanu003eu003c/fontu003eu003cstrongu003eu0026nbsp;u003c/strongu003e
- 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
u0026nbsp;u003cstrongu003eu003cu style=u0022background-color: rgb(255, 255, 204);u0022u003eCrearea unei aplicații cu C#u003c/uu003eu003c/strongu003e
- 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**)**
u0026nbsp;u003cbu003eAplicația de tip Consoleu003c/bu003e
- 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)
u003cbu003eu003cuu003e1. CREAREA UNUI PROIECT NOU DE TIP CONSOLE APP, pentru PLATFORMA .NET FRAMEWORKu003c/uu003eu003c/bu003e
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.
u003cstrongu003eu003cuu003e2. FUNCȚIA Main - punctul de început al execuției programuluiu003c/uu003eu003c/strongu003e
Î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)
u003cstrongu003eu003cuu003e3. COMPILAREA ȘI RULAREA PROGRAMULUIu003c/uu003eu003c/strongu003e
În MENIU se alege DEBUG > START DEBUGGING (se va deschide o fereastră în care se afișează: Hello, World! Press ENTER to exit…
u003cstrongu003eu003cuu003e4. OPRIREA FORȚATĂ ȘI DEPANAREA PAS CU PAS A APLICAȚIEIu003c/uu003eu003c/strongu003e
Pentru oprirea forțată se alege butonul STOP DEBUGGING.
Depanarea pas cu pas se face folosind comenzile STEP INTO sau STEP OVER
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ȚIIu003c/uu003eu003c/strongu003e
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:UsersUserNamesourcerepos
COMANDA BUILD SOLUTION în Visual Studio = determină crearea ansamblului EXE și a celui DLL (în folderul binDebug)
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.
u003cstrongu003eu003cuu003e3. ADĂUGAREA UNUI PROIECT LA O SOLUȚIEu003c/uu003eu003c/strongu003e
Î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(“ nn 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)
u003cstrongu003eu0026nbsp;Obiecte u003c/strongu003e(fac parte dintr-o clasă - sunt instanțe ale unor clase)u0026nbsp;
- 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.
u003cstrongu003eu003cuu003e4. STABILIREA UNEI REFERINȚE în proiectul OBIECTE către proiectul CLASEu0026nbsp;u003c/uu003eu003c/strongu003e
În panoul SOLUTION EXPLORER, click dreapta pe proiectul OBIECTE - ADD - REFERENCE - PROJECTS - se bifează CLASE
u003cstrongu003eu003cuu003e5. ADĂUGAREA UNUI FIȘIER NOU ÎNTR-UN PROIECT / CREAREA UNEI CLASEu003c/uu003eu003c/strongu003e
u0026nbsp;u003cstrongu003eClasa u003c/strongu003e(unitate fundamentală a u003cstrongu003eîncapsulării; - u003c/strongu003eîn C#, clase sunt u003cstrongu003eu003cemu003etipuri referințău003c/emu003eu003c/strongu003e) - u003cstrongu003eobiecteleu003c/strongu003e (PERSOANA1, PERSOANA2 etc.)u0026nbsp;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“);
}
}
u0026nbsp;u003cstrongu003eMetodă în C# (definește acțiunea făcută de un obiect)u003c/strongu003e
- 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;
}
}
u003cstrongu003eu003cuu003e6.u0026nbsp; CREAREA DIAGRAMEI CLASEIu003c/uu003eu003c/strongu003e
- necesită instalarea instrumentului CLASS DESIGNER
u0026nbsp;u003cstrongu003eDiagrama u003c/strongu003eunei 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
u0026nbsp;u003cstrongu003eConstructorul claseiu003c/strongu003eu003cstrongu003eu0026nbsp;u003c/strongu003e
- 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)
u0026nbsp;u003cstrongu003eLINQ u003c/strongu003e(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.
u0026nbsp;u003cstrongu003eDataLayer.dllu0026nbsp;u003c/strongu003e(stratul de acces la date în aplicație, conectare la bază de date - Data Layer)
= o bibliotecă Class Library
u003cstrongu003eu003cuu003e1. CREAREA (ADĂUGAREA LA UN PROIECT ANTERIOR) UNUI PROIECT de tip Class Library (.NET Framework)u003c/uu003eu003c/strongu003e
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.
u003cstrongu003eu003cuu003e2. STABILIREA UNEI REFERINȚE în Startup Project către proiectul u003cemu003eDataLayeru003c/emu003eu003c/uu003eu003c/strongu003e
Î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)
u003cstrongu003eu003cuu003e3. EDITAREA CODULUI CLASEI Partener.cs (din DataLayer) - proprietățile clasei, constructoru0026nbsp; - adăugare obiecteu003c/uu003eu003c/strongu003e
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;
}
}
}
u003cstrongu003eu003cuu003e4. ADĂUGAREA CLASEI DataRepository.cs (în DataLayer)u0026nbsp;u003c/uu003eu003c/strongu003e
Î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
{
return new List
{
new Partener(1, “Partener A”, 123, “Bucuresti”),
new Partener(2, “Partener B”, 456, “Cluj”),
new Partener(3, “Partener C”, 789, “Bucuresti”)
};
}
}
}
u003cstrongu003eu003cuu003e5. ADĂUGAREA UNEI FERESTRE/ PAGINI în proiectul principal pentru afișarea dateloru0026nbsp;u003c/uu003eu003c/strongu003e
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”>
<Button Content=“Afiseaza toti partenerii”
Click=“BtnToti_Click”
Margin=“0,0,0,5”/>
<Button Content=“Cauta dupa localitate”
Click=“BtnLocalitate_Click”/>
<ListBox x:Name=“lstParteneri”
Margin=“0,10,0,0”/>
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
{
///
/// Interaction logic for PageData.xaml
///
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);
}
}
}
}
u003cstrongu003eu003cuu003e6. ADĂUGAREA UNEI TRIMITERI CĂTRE PAGEDATA din altă fereastra/ paginău003c/uu003eu003c/strongu003e
Î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
Î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 tabelaru003c/strongu003e
- se pot afișa date din List ; - rezultate din baze de date; - date din fișiere
u0026nbsp;u003cstrongu003eColecții generice (doar pentru un tip de obiecte - cum ar fi doar produse/ furnizori/ clienti etc.) u0026amp; exemple u0026amp; membri ai claseiu003c/strongu003eu003cfont color=u0022rgba(0, 0, 0, 0.99)u0022u003eu003cspan style=u0022font-size: 11px;u0022u003eu003cstrongu003eu0026nbsp;Listu0026lt; T u0026gt;u0026nbsp;u003c/strongu003eu003c/spanu003eu003c/fontu003eu003cstrongu003eu0026nbsp;u003c/strongu003e
- 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)
u003cstrongu003eu003cuu003e1. ADĂUGAREA UNUI PROIECT de tip Class Library (.NET Framework) ȘI ADĂUGAREA UNEI REFERINȚEu003c/uu003eu003c/strongu003e
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)
u003cstrongu003eu003cuu003e2.u0026nbsp; CREAREA CLASEI CU ROL DE DATA CONTEXT DIAGRAMEI CLASEIu003c/uu003eu003c/strongu003e
u0026nbsp;u003cstrongu003eDataContextu003c/strongu003e
- 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”);
}
}
u003cstrongu003eu003cuu003e3.u0026nbsp; DIAGRAMA CLASELORu003c/uu003eu003c/strongu003e
Î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).
u0026nbsp;u003cstrongu003eMetodă în C# (definește acțiunea făcută de un obiect)u003c/strongu003e
- 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ă
u003cstrongu003eu003cuu003e1. DEFINIREA STILULUI în Window.Resourcesu003c/uu003eu003c/strongu003e
Înainte de a defini Grid (sau alt panou), se va scrie elementul XAML <Window.Resources> pentru stabilirea proprietăților unui stil.
<Window.Resources>
<Style.Resources>
</Style.Resources>
</Window.Resources>
u0026nbsp;u003cstrongu003eGrid (panou pentru aspect recomandat pentru ferestre, pagini etc.)u0026nbsp;u003c/strongu003e
= aspect al unui container organizat în coloane și rânduri (ca într-un tabel), util pentru gestiona cu exactitate conținutul
u0026nbsp;u003cstrongu003eGrid.ColumnDefinitionsu0026nbsp;u003c/strongu003e
= î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
u0026nbsp;u003cstrongu003eGrid.RowDefinitionsu0026nbsp;u003c/strongu003e
= î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;
u0026nbsp;u003cstrongu003eStack Panel (panou pentru aspect pentru controale unul după altul)u003c/strongu003e
= 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);
u0026nbsp;u003cstrongu003eElement XAMLu003c/strongu003e
= 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>
</Button.Background>
u003cbu003eu0026nbsp;Atribute XAMLu003c/bu003e
= 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
u0026nbsp;u003cstrongu003eCreare text cu link către pagină externă pe internetu003c/strongu003e
Î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; }
u0026nbsp;u003cstrongu003eCreare text cu link către pagină pe internetu003c/strongu003e
Î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ă
u003cstrongu003eu003cuu003e1. DEFINIREA STILULUI în Page.Resourcesu003c/uu003eu003c/strongu003e
Înainte de a defini Grid (sau alt panou), se va scrie elementul XAML <Page.Resources> pentru stabilirea proprietăților unui stil.
<Page.Resources>
</Page.Resources>
APLICAREA STILULUI ȘI ROTUNJIREA COLȚURILOR UNUI BUTONu003c/uu003eu003c/strongu003e
Î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
(Dacă aplicația WPF va folosi o bază de date, după Create New Project, se alege WPF App (.NET) (de preferat .NET 8 - varianta cu C#)****)
Metoda event handler (pentru evenimente cum ar fiu003cstrongu003e click pe buton u003c/strongu003eș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 FRAMEWORKu003c/uu003eu003c/strongu003e
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)u003c/uu003eu003c/strongu003e
Î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!” >
<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” />
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 u003cspan style=u0022background-color:#cce0f5;u0022u003eMainWindow.xaml.csu003c/spanu003eu003c/uu003eu003c/strongu003e
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
{
///
/// Interaction logic for MainWindow.xaml
///
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)
{
}
}
}
u003cstrongu003eu003cuu003e4. COMPILAREA ȘI RULAREA PROGRAMULUIu003c/uu003eu003c/strongu003e
În MENIU se alege DEBUG > START DEBUGGING (se va deschide o fereastră în care se afișează: Hello, World! Press ENTER to exit…
u003cstrongu003eu003cuu003e5. OPRIREA FORȚATĂ ȘI DEPANAREA PAS CU PAS A APLICAȚIEIu003c/uu003eu003c/strongu003e
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ă
<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” />
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”>
<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”/>
Î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ă
<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”>
<Label x:Name=“labelTitle”
Background=“AliceBlue”
Height=“40”
Content=“LOGIN”
Foreground=“Navy”
FontSize=“20”
HorizontalContentAlignment=“Center”/>
<Grid.ColumnDefinitions>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
</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” />
<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” />
Î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 MYSQL
- î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”>
(în codul - MainWindow.xaml.cs)
using System.Windows;
namespace ZonaONG
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
}
}
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
DEFINIREA UNUI ȘIR DE CONECTARE LA BAZA DE DATE (EF Core generează folderul Models)
Prima modalitate de conectare la baza de date - folosind SQL SERVER: TOOLS > NuGet Package Manager > Package Manager Console > (se selecează proiectul) - apoi PM> Scaffold-DbContext “Server=.\SQLEXPRESS;Database=nume_bazadedate;User Id=sa;Password=parola;TrustServerCertificate=True;” Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models -ContextDir Data -Context AppDbContext (se va genera un folder Data - cu AppDbContext - face legătura cu baza de date) și Models - cu conținuturi aferente
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 - se creează automat folosind prima modalitate de conectare de la punctul 6)
8. AFIȘAREA ÎN APLICAȚIE A UNOR DATE PRELUATE DIN BAZA DE DATE - în codurile create la punctul 4 se vor introduce MENIUL și BUTOANE spre pagini create conform tabelelor din baza de date (fișierele create în folderul Models - fiecare page reprezintă un tabel)
(se adaugă în codul - MainWindow.xaml - UI = frame + meniu)
<Button Content=“Parteneri”
Click=“BtnParteneri_Click”/>
(se adaugă în codul pentru logica de navigare - MainWindow.xaml.cs)
private void BtnParteneri_Click(object sender, RoutedEventArgs e)
{
MainFrame.Navigate(new ParteneriPage());
}
Pachete u003cspan style=u0022background-color: rgb(204, 232, 204); color: rgb(0, 0, 0);u0022u003eNuGet pentru conectare la baze de dateu003c/spanu003eu003c/uu003eu003c/strongu003e
- î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 Coreu0026nbsp;u003c/strongu003eu003cspan style=u0022font-size: 12px; text-align: center; background-color: rgb(255, 255, 102);u0022u003e(framework open source - o structură predefinită, oferind instrumente și reguliu0026nbsp; gratuit, multiplatformă, pentru creare de aplicații și servicii cloud)u003c/spanu003eu0026nbsp;- 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#.
u0026nbsp;u003cstrongu003eO/R Mapper (ORM)u0026nbsp;u003c/strongu003e
- 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).
u0026nbsp;u003cb style=u0022color: rgba(0, 0, 0, 0.99); font-size: 13px;u0022u003eAplicații de administrare a bazelor de date MySQL: u003c/bu003eu003cspan style=u0022font-size: 13px;u0022u003eu003cbu003ephpMyAdmin, DBeaver, HeidiSQL, Navicat, SQLyog, dbForge for MySQLu003c/bu003eu003c/spanu003eu003cbu003eu0026nbsp;u003c/bu003e
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%
www.redirectioneaza.ro/rosfera
-
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
