Lucrare de disertaț ie [600983]

UNIVERSITATEA DIN BUCUREȘTI
FACULTATEA DE MATEMATICĂ ȘI INFORMATICĂ

Lucrare de disertaț ie
Servicii web gă zduite î n Azure app
services

COORDONATOR ȘTIINȚIFIC:
Conf. Dr. Kevorchian C ristian

ABSOLVENT: [anonimizat]
2017

Cuprins

Capitolul 1 ………………………….. ………………………….. ………………………….. ………………….. 4
1.1 Introducere ………………………….. ………………………….. ………………………….. ……… 4
Capitolul 2 ………………………….. ………………………….. ………………………….. ………………….. 5
2.1 Inceputurile c loud computing ………………………….. ………………………….. …………… 5
2.2 Microsoft Azure ………………………….. ………………………….. ………………………….. …. 6
2.2.1 Facilități ………………………….. ………………………….. ………………………….. ……… 6
Capitolul 3 ………………………….. ………………………….. ………………………….. ………………… 10
3.1 .NET Framewo rk ………………………….. ………………………….. ………………………….. 10
3.1.1 Aspecte generale ………………………….. ………………………….. …………………….. 10
3.1.2 Cum sunt executate programele ………………………….. ………………………….. … 10
3.2 SQL Server ………………………….. ………………………….. ………………………….. ………. 12
3.2.1 ADO.NET – Aspecte generale ………………………….. ………………………….. ….. 12
3.2.2 Cum sunt executate comenzile SQL ………………………….. ………………………. 12
3.3 Limbajul C# ………………………….. ………………………….. ………………………….. …….. 14
3.3.1 Conectarea la baza de date (clasa SqlConnection) ………………………….. …… 15
3.3.2 Returnarea rezultatelor (clasa SqlDataAdapter) ………………………….. ………. 15
3.3.3 Accesarea datelor (clasa DataSet) ………………………….. ………………………….. 15
3.4 JSON – JavaScript object notation ………………………….. ………………………….. ….. 15
3.5 Representational state transfer – REST ………………………….. …………………………. 17
3.6 Azure Machine learning ………………………….. ………………………….. …………………. 18
3.6.1 Rularea experimentelor ………………………….. ………………………….. ……………. 20
3.6.2 Algoritmi de machine learning ………………………….. ………………………….. …. 20

3.6.3 Testarea modelelor ………………………….. ………………………….. ……………………… 21
3.6.4 Deploy -ul modelului ………………………….. ………………………….. ……………….. 22
3.6.5 Consumarea serviciului web ………………………….. ………………………….. …….. 22
Capitolul 4 ………………………….. ………………………….. ………………………….. ………………… 23
4.1 Descriere generală ………………………….. ………………………….. …………………………. 23
4.2 Ap licația client ………………………….. ………………………….. ………………………….. …. 23
4.3 Aplicația server ………………………….. ………………………….. ………………………….. … 29
4.4 Baza de date ………………………….. ………………………….. ………………………….. …….. 30
4.5 API ML ………………………….. ………………………….. ………………………….. …………… 31
4.7 Sistemul de autentificare ………………………….. ………………………….. ………………… 37
4.6 Inovația adusă de aplicație ………………………….. ………………………….. ……………… 39
Bibliografie ………………………….. ………………………….. ………………………….. ………………. 40

Capitolul 1
1.1 Introducere
Aplicațiile au evoluat favorabil utilizatorului o dată cu trecerea timpului. Dacă în
anii 2000 o aplicație era îndeajuns să stocheze date și să le afișeze la cererea
utilizatorului, în aplicațiile moderne doar afișare și stocarea nu mai sunt îndeajuns.
Tehnologia a devenit din ce în ce mai avansată așa că și feature -urile aplicațiilor
trebuie să evolu eze concomitent.
În aplicațiile moderne bazele de date numai reprezintă doar spații de stocare ci
reprezintă un adevarat set de date pentru algoritmii folosiți pentru prezicerea datelor.
Algoritmii de inteligență artificială au început sa fie foarte folos iți în majoritatea
aplicațiilor din diverse domenii cum ar fi: muzică, economie, computer vision, detectare
facială etc.
În continuare vom prezenta succint capitolele din această lucrare, astefel capitolul
1 prezinta o scurtă motivare a lucrarii.
Capitolul 2 ne va introduce în domeniul cloud computing -ului, serviciu ce a fost
folosit în elaborarea proiectului, astfel cuprinde informații esențiale pentru a înțelege
conceptul.
În capitolul 3 vom explica limbajele și tehnologiile folosite, în timp ce în capito lul
4 se va afla descrierea aplicației.

Capitolul 2
2.1 Inceputurile cloud computing
În cei mai simpli termeni serviciile cloud computing înseamă stocarea și
accesarea datelor și aplicațiilor prin intermediul procoalelor de comunicație HTTP și
HTTPS. C loud computing este serviciul care se bazează pe a impartăși resurse de
procesare și date către computere sau alte dispozitive.
În timpul anilor 60, conceptul inițial de impărtașire a devenit popular prin RJE
(Remote Job Entry ) aceată terminologie a fost în mare parte asociată cu vendori mari
precum IBM și DEC. Soluțiile de împărtășire au fost disponibile încă de la începutul
anilor 70 pe platforme precum Multics, Cambrige CTSS de asemenea și pe porturile
UNIX.
La începutul anilor 90, companiile de telec omunicații, care mai înainte au oferit
circuite punct la punct dedicate, au început sa ofere servicii virtual private network
(VPN) la prețuri scăzute. Redirecționând traficul datelor, oamenii de știință au
descoperit că pot folosi mult mai eficient lațime a de bandă. Aceștia au început să
folosească simbolul norului pentru a delimita punctul dintre atribuțiile provider -ului și
atribuțiile utilizatorilor. Pe măsură ce computerele au devenit mult mai răspândite,
cercetătorii și tehnologiștii au explorat cai d e a crea arii foarte mari de putere de calcul
raspândite la mai mulți utilizatori prin time-sharing . Oamenii de știință au experimentat
algoritmi de optimizare a infrastructurii, platformei și aplicațiilor pentru a crește eficieța
utilizatorilor finali.
Din anul 2000 a apărut un serviciul destinat utilizatorilor finali sub numele de
cloud computing . Încă din anul 2008, NASA a creat primul software open -source pentru
a face deploy . În acelaș an, eforturile au fost focalizate pe livrarea serviciilor la cea m ai

înaltă calitate în infrastructura cloud -ului, în infrastructura IRMOS se gasește primul
mediu de lucru în timp real.
În august 2006 Amazon a introdus serviciul Elastic Compute Cloud. Microsoft
Azure a fost anunțat în octombrie 2008 și a fost livrat pe 1 februarie 2010 sub numele
de Windows Azure, acesta fiind redenumit în Microsoft Azure pe 25 martie 2014. Pentru
o porțiune din instorie, Azure a fost în TOP500 pe lista supercomputerelor, înainte sa
fie devansat de oponențiilui săi.
Pe 1 martie 2011, IBM a anunțat scoaterea unui nou produs cu numele IBM
SmartCloud, acesta fiind un framework pentru proiectul Smarter Planet . Pe 7 iunie
2012 Oracle a lansat Oracle cloud. Această platforma precum și cele enumerate mai sus
oferă utilizatorilor accesul la un set de soluții IT, incluzând aplicații SaaS, platforme
PaaS și infrastructuri IaaS.
2.2 Microsoft Azure
În continuare vom trece printr -o descriere a serviciului cloud folosit pentru
elaborarea proiectului.
Microsoft Azure este un serviciu de computing creat de către Microsoft pentru a
construi, testa, gazdui și a intreține aplicațiile și serviciile prin o rețea de centre de date.
Acest servicu oferă utilizatorilor facilități precum software as a service (SaaS), platform
as a ser vice (PaaS) și infrastucture as a service (IaaS). De asemenea suportă o
multitudine de limbaje de programare, unelte și framework -uri.
2.2.1 Facilități
Calculare
 Mașini virtuale, încadrate ca IaaS utilizate pentru a lansa mașini de test având
instalate sis teme de operare precum Microsoft Windows sau Linux.

 Servicii , încadrate ca PaaS este un mediu în care dezvoltatorii pot ușor să
publice și sa intrețină web site -urile
 Site-uri web, această facilitate ajută programatorii să creeze site -uri web folosind
limbaje de programare precum ASP.NET, PHP, Node.js, sau Phyton. Acestea pot
fi instalate pe server cu ajutorul protocolul FTP, sau prin soluții de versionare
cum ar fi: GIT, Mercurial, Team foundation server sau urcate prin portalul
utilizatorilor.
 Job-uri w eb, sunt aplicații care sunt instalate și au ca scop implementarea de
procese ce se desfașoară în background . Acestea pot fi invocate după o anumită
planificare, la cerere sau pot rula continuu. Serviciile precum blob -urile, tabelele
și cozile sunt utiliza tre pentru a comunica între aplicații.
Serviciile mobile
 Acestea coloctează în timp real date care infățișează comportamentul
utilizatorilor. De asemenea oferă utilizatorilor facilitatea de push notification ,
facilitate în care sunt afisate mesaje de atent ionare sau de informare pe
dispozitivele mobile.
 HockeyApp poate fi folosită în dezvoltarea, distribuirea și testarea aplicațiilor
mobile.
Servicii de stocare
 Oferă API-uri REST sau SDK -uri pentru stocarea și accesarea datelor din cloud.
 Blob -urile facili tează programele să stocheze text nestructurat și date binare ca
blob-uri care pot fi accesate prin protocolul de comunicare HTTP(S). Serviciul
blob mai asigură și mecanisme de securitate pentru a controla accesul la date.
 Serviciile queue asigură comunica re asincronă între aplicații prin mesaje folosind
cozi.
 Serviciu de fisiere asigură stocarea și accesarea datelor din cloud utilizând API-
uri REST sau SDK -uri.
Managementul datelor

 Azure search , ajută dezvoltatorii oferind servicii de cautare în text utilizând API
–uri REST sau SDK -uri.
 DocumentDB este o baza de date NoSQL care implementeaza un subset al
limbajului SQL pe documente de tipul JSON.
 Redis cache este un cache stocat in cloud.
 StorSimpe întreține task -uri de stocare între dispozitive on -premises și stocare în
cloud.
 SQL Database, formal este cunoscut sub numele de SQL Azure Database,
utilizeaza Microsoft SQL Server pentru a extinde utilizarea aplicațiilor în cloud.
 SQL Data Warehouse este un serviciu warehouse pentru a manevra interogări
pe seturi de date care depășesc 1 TB.
Serviciile media
Acest tip de serviciu este unul PaaS care este utilizat pentru encoding, protejarea
conținutului, streaming sau analiză.
CDN
Acesta facilitate a pr odusului cloud -ului de la Microsoft este abreviat CDN,
content delivery network este folosit pentru fisiere audio, video, aplicații și imagini.
Poate fi folosit ca un cache static pentru site -urile web aflate aproape din punct de
vedere geografic de cli enți, pentru a imbunătăți performanța.

Dezvoltator
 Application insights
 Visual studio team services , ajută dezvoltatorii dar și scrum masteri să planuiască
sprinturile SCRUM , să versioneze codul, să creeze task -uri, bug -uri.

Management
Azure automation oferă o cale utilizatorilor sa automatizeze procese lungi și
anevoioase, care sunt predispuse la apariția erorilor, care sunt frecvent repetate și sunt
monotone.
Machine learning
Microsoft Azure Machine Learning (Azure ML) este un serviciu care face par te
din Cortana Intellingence Suite care ajută dezvoltarii să creeze algoritmi de inteligentă
artificială.

Capitolul 3
3.1 .NET Framework
3.1.1 Aspecte generale
.NET Framework este un framework software dezvoltat de către Microsoft și
rulează în special pe sistemul de operare Microsoft Windows. Framework -ul include o
varietate largă de clase cunoscută sub numele de Framework Class Library (FCL). FCL
conține clase pentru interfața grafică cu utilizatorul, acces la date, conectivitate la baza
de date, criptare a datelor, posibilitatea de a construi o aplicație WEB și comunicații în
rețea. Aplicațiile dezvoltate în .NET Framework sunt produse prin combinarea codului
scris de programator cu librariile din .NET și alte librării importate.
3.1.2 Cum sunt executate programele
Framework -ul .NET conține o colecție de clase reutilizabile, interfețe și tipuri de
valori aflate î n FCL. Fundamentele F CL se află într -un nucleu n umit Base Class Library
(BCL) unde se află namespace -uri de bază pentru limbaj, cum ar fi: System,
System.CodeDom, System.Collections, System.Data, System.Globalization, System.IO
si System.Text.
Namespace -ul System conține clase fundamentale care define sc principalele
tipuri de date, evenimente ș i handlere de evenimente, interfețe, atribute ș i procesarea
excepțiilor.
Intrând î n nucleul limbajului există namespace -ul System.CodeDom care este
alcătuit din clase folosite la repr ezentarea elementelor ș i stucturii codului sursă aflat într-
un document. System.Collections conține interfețe care definesc diferite colecții de
obiecte, cum ar fi liste, cozi, vectori, tabele hash și dicționare. System.Data extinde
principalul namespace System prin clase necesare pentru definirea conexiunii la diferite

surse de date. System.Globalization include formatări pentru dată , valută, numere ș i
pentru sortarea variabilelor de tip string. System.IO conține ti puri care fac posibilă
citirea ș i scrier ea în ș i din fisiere, de asemenea asigură fluxul de date. System.Text este
namespace -ul care conține clase care reprezintă codificarea ASCII si Unicode.
Codurile sursă scrise cu ajutorul FCL sunt mai î ntâi compilate de către Common
Language Infrastructure (CLI). CLI funcționează pe baza unui mediu virtual de
executare comparabil cu cel de la Sun Microsystems pentru limbajul Java. Acestă
importantă componentă al lui .NET utilizează un compilator pentru a procesa codul
sursă intr -o formă preliminară de cod executabil numit si Comm on Intermidiate
Language (CIL). Î n momentul acesta mașina nu poate executa codul pentru ca înca nu
se află î n limbaj mașină. Astfel Common Language Runtime (CLR) transformă codul
intermediar î n cod mașină care, de această dată se poate executa pe platforma curentă.
Resursele [6,7] oferă mai multe informații.

Figura de mai sus reprezintă schema compilării si executării programelor .Net

3.2 SQL Server
Microsoft SQL Server este un sistem de management al bazelor de date
relaționale dezoltat de catre Microsof t. Este un produs software care are ca principa lă
atribuție sa depoziteze și să returneze informații interoga te de alte aplicații software.
Există mai multe versiuni diferite pentru acest produs astfel primul a apărut in
anul 1989 sub denumirea de SQL Ser ver 1.0 cu o arhitectură pe 16 bit, urmat de SQL
Server 1.1 pe aceeași arhitectură. Doi ani mai târziu iese pe piață versiunea 4.21
funcțional pe sistemul de operare Windows NT.
3.2.1 ADO.NET – Aspecte generale
ADO.NET este un set de componente software pe care programatorii le folosesc
pentru a îsi defini sesiunea cu ajutorul careia au acces la sisteme de baze de date
relaționale. Fiind parte din Base Class Library (BCL) este inclusă automat î n soluțiile
software pe care specialiștii le dezvoltă.
ADO.NET i nclude funcționalități pentru a deschide o conexiune la baza de date, executa
comenzi SQL și de a obține rezultate sub formă de seturi de date. Aceste rezult ate sunt
plasate î ntr-un obiect ADO.NET numit DataSet .
3.2.2 Cum sunt executate comenzile SQL
Procesul prin care trece o comandă SELECT este unul elaborat și are 5 faze.
Primul pas constă î n scana rea comenzii pe care parser -ul îl face pentru a î mpăr ți unitățile
logice î n cuvinte cheie, expresi i, operatori și identificatori.
Folosind rezultatele pas ului anterior este format un arbore de secvență, î n concordanță
cu logica comenzii parsate. Arborele format este folosit pe ntru a transforma sursa de
date î n formatul cerut de comandă.

Optimizatorul d e comenzi analizează diferite că i de acces pentru tabelele sursă. Este
reținută cea mai rapidă cale de acces a tabelelor sursă folosind resurse minime, cu
această cale este actualizat arborele. Versiune actualizată a arb orelui de secvență este
numită ș i plan de executare.
Motorul relațional pornește planu l de executare. Acesta cere m otorului de stocare a
datelor să î i returneze acele linii care sunt satisfăcute de planul de executare.
În final motorul relațional procesează datele primite de l a motorul de stocare a
datelor în formatul cerut, ca apoi să fie returnate că tre client.
Pentru co manda:
select s.FirstName , s.LastName , p.Value
from Students s join Association a on (s.StudentUID = a.StudentUID )
join Payments p on (a.PaymentUID = p.PaymentUID )
where p.Value > 1000
Arborele de secveță asociat este:

Planul de executare pentru arborele de mai sus:

Figura de mai sus reprezintă planul de executare a comenzii descrise mai sus
Procedura de executa re a comenzilor INSERT, UPDATE ș i DELETE se bazează
pe executatarea comenzii SELECT. Astfel UPDATE ș i DELETE au ambele ca și țintă
setul de rânduri care trebuie modificate sau șterse. Procesul de indentificare a acestor
rânduri este același cu cel pentru indentificarea rândurilor care contribuie la setul de date
dat ca și ră spuns comenzii SELECT. UPDATE și INSERT conțin ambele comanda
SELECT implementată pentru a returna rândurile cu date care vor tr ebui inserate sau
actualizate. Mai multe informații se pot găsite în resursele [8,9,10].
3.3 Limbajul C#
C# este un limbaj de programare care cuprinde o multi tudine de paradigme de
programare cuprinzând programare imperativă, declarativă, funcțională, generică,
orientă pe obiecte și orientată pe com ponente. A fost dezvoltată de că tre Microsoft la
sfârșitul anilor 90. A fost conceput ca un concurent pentru limb ajul Java, ambele fiind
un derivat al limbajului de programare C++.

3.3.1 Conectarea la baza de date (clasa SqlConnection)
Un obiect de tipul SqlConnection reprezintă o unică sesiune către sursa de date
SQL Server. Clasa SqlConnection este folosită împreună cu urmatoarele clase
SqlDataApdater și SqlCommand pentru a face posibilă executarea comenzilor SQL.
3.3.2 Returnarea rezultatelor (clasa SqlDataAdapter)
SqlDataAdapter reprezintă un pod î ntre un obiect de tip set de date și SQL Server,
oferind posibilitatea de a salva ș i de a returna date. Legătura dintre această clasă ș i setul
de date se face prin metoda Fill care populeaza setul de date cu datele din tabelul
interogat. Setul de date trebuie sa fie de tipul DataSet.
3.3.3 Accesarea datelor (c lasa DataSet)
O componentă majoră a arhitecturii ADO.NET este clasa DataSet care este o
colecție de obiecte DataTable. Fiecare obiect poate fi apelat în parte și astfel se poate
lucra cu rezultatele comenzilor SQL care intorc mai mult de un tabel. Resursel e
[11,12,13,14] conțin mai multe informații despre C# si clasele acestuia.
3.4 JSON – JavaScript object notation
JSON este abreviarea de la JavaScript Object Notation și este un tip de date cu
care se poate comunica între părțile aplicațiilor, fiind ușor p entru oameni de citit și de
scris, de asemenea acele două calități se mențin și pentru mașinării fiind ușor de parsat
și de generat. Acestă reprezentare a datelor are bazele pe un subset al limbajului de
programare JavaScript, standardul ECMA -262 a treia e diție din decembrie 1999. JSON
este un format de text care este independent din punct de vedere al limbajelor de
programare, dar folosește convenții familiare limbajelor de programare din familia C,
incluzând C, C++, C#, Java, JavaScript, Perl, Python și m ulte altele. Aceste proprietăți
ale acestui tip îl fac limbajul ideal pentru intershimbarea datelor între aplicații sau în
interiorul acestora.

JSON este construit bazânduse pe două structuri:
O colecție de perechi de tipul nume -valoare. În multe limbaje, aceasta este
realizată ca un obiect, record, structură de date, dicționar, tabelă de hash , listă de chei
sau vectori.
O listă de valori odonată. In cele mai multe limbaje, acest fapt este asigurat de un
vector sau o lista sau o secvență.
Fiind un text for matat sub forma unei structuri de date devenită universală, toate
limbajele de programare conțin suport pentru JSON intr -o formă sau alta.
În continuare vom prezenta cum sunt generate obiectele JSON.
Un obiect este un set de date neordonat a cărui tip este perechea nume/valoare.
Un obiect începe cu ”{” și se termină cu ”}”. În interiorul acoladelor sunt definite
perechile. Membrul stâng al perechii este numele câmpului despărțit de membrul drept
prin ”:” unde se află valoarea.

Figura prezintă schematic g enerarea unui obiect JSON în acord cu pagina web json.org
O altă structură care se poate obține este un vector ca este o colecție ordonată de valori.
Un vector începe cu ”[” și se termină cu ”]”. Între parantezele pătrate sunt introduse valorile
vectorulu i desparțite prin caracterul virgulă. Valorile pot fi string, number, object, array, true,
false, null.

Figura reprezintă formarea vectorilor în acord cu pagina web json.org

Prin astfel de procedee se obțin datele sub formă de JSON. Mai multe detalii se află la
resursa [19] a biliografiei.
3.5 Representational state transfer – REST
Representational state transfer (REST) este una calea prin care computerele
comunică cu ajutorul internetului. Documentele sau fisierele au fost primele resurse web
definite pe world wide web indentifi cate prin URL -uri, însă în ziua de azi acestea au
definiț ii mult mai abstracte încluzând ori ce poate fi indentificat, numit, adresat. Într -un
serviciu web RESTful apelurile sunt trimise către un URI care va returna un răspuns
care poate sa fie de tipul XML, HTML, JSON sau alt format definit. Răspunsul poate
să confirme că procedura s -a realizat cu succes și poate sa returneze hypertext care face
legătura cu alte resurse. Apelurile către serviciile RESTful se pot realiza prin
următoarele verbe GET, POST, PUT, DELETE.
Verbul GET este folosit pentru a citi date de pe server returnând un cod de stat us
cu numărul 200 pentru un apel încheat cu success. Verbul POST este folosit numai în
situațiile în care sunt trimise date de pe client pe server. PUT este folosit pentru
actualizarea datelor, în timp ce DELETE este folosit pentru stergerea datelor din lo cul
un de sunt stocate resursele.
În dezvoltarea proiectului s -au folosit apeluri către un API creat în limbajul .NET,
acesta fiind stocat în Azure. API -ul apelează la randul său un serviciu web care conține
algoritmul de machine learning.

3.6 Azure Machine learning
Datale pot păstra secrete, în special dacă există o multitudine de linii cu date.
Având foarte multe date despre un anumit eveniment și folosind resursele disponibile
într-un mod inteligent putem găsi un regulă în datele pe care le deținem . Regulile datelor
sunt mult prea complicat de văzut cu ochiul liber și din acet motiv trebuie sa apelăm la
metode avansate.
Acest tip de știință examinează un număr imens de date și caută o regulă în datele
pe care le deținem. Algoritmii aplică tehnici st atistice pe setul de date, cautând cea mai
bună regulă pentru a ne rezolva problema, apoi genereaza o implementare a codului care
recunoaște pattern -ul gasit . Acest cod generat se numește model și poate fi apelat de
către aplicațiile care doresc sa rezolve aceeași problemă. De exemplu detectarea
faudării, o aplicație trebuie să trimită informații corecte despre tranzacție, cum ar fi anul,
valoarea, locul unde cardul a fost emis și unde a fost folosit. Un model este creat cu
ajutorul machine learning și apoi returnează un indicator dacă acea transzactie este
fraudată sau nu.
Azure machine learning este un serviciu cloud care ajută dezvoltatorii să creeze
si să execute algoritmii de machine learning. Indiferent dacă un dezvoltator folosește
Azure ML sau altă a bordare procesul este asemănător. Următoarea figură ilustrează
procesul prin care datele sunt procesate pentru a putea antrena algoritmul.

După cum se poate vedea primul pas pentru a realiza o predicție este sa avem un
set de date. Datele sunt trimise c ătre un procesator caer decide ce date va folosi mai
departe algoritmul. Acest pas este foarte important deoarece alegerea datelor va
influenta antrenarea algoritmului și implicit rezultatul acestuia. După ce datele sunt
procesate noul set este trimis cătr e antrenarea algoritmului de inteligență artificială ca
mai departe acesta să returneze rezultatul dorit.
Azure ML facilitează dezvoltarea de algoritmi de inteligență artificială
introducând module pentru preprocesarea datelor, module pentru algoritmii de
inteligență artificială dar și pentru deploy -ul aplicațiilor ca API. Aceste module sunt
reprezentate în următoarea figură:

Figura arat ă uneltele care pot fi găsite în Azure ML

Azure ML oferă programatorilor și oamenilor de știință posibilitatea de a crea
mai multe versiuni ale algoritmului, numite experimente. Un experiment este o incercare
de utilizare a algoritmului antrenat de intregul proces. Toate experimentele pot fi
structurate pe proiecte.

3.6.1 Rularea experimentelor
În continuare vom expl ica mai indeaproape procele necesare pentru ca modelul
să ne poată oferi răspunsuri exacte.
De îndată ce ce datele sunt pregătite, intervine pa rtea de rulare a experimentelor.
Fiecare experiment poate rula unul sau mai mulți algoritmi. Urmatoarea figură ilustrează
rularea unui experiment.

Figura arată procesul care este efectuat în timpul rulării experimentului

După cum arată și figura oamenii de știință poate alege ce feature -uri sa aleaga
pentru antrenarea algoritmului. În acest exemplu au fost alese feature -urile 1,3,6. Aceste
feature -uri sunt trimise către antrenare indiferent ce algoritm a fost ales. În pasu l 2 este
creat modelul antrenat. După cum se poate observa pe prima săgeată setul de date este
trimis în proporție de 75% din date pentru antrenare și restul sunt reținute pentru testare.
3.6.2 Algoritmi de machine learning
Azure ML pune la dispoziție un set foarte larg de algoritmi. Serviciul conține un
set de algoritmi folosiți pentru clasificare cum ar fi Multiclass Decision Jungle, Two –
Class Boosted Decision Tree etc. Utilizarea algoritmilor se efectuează după o analiză a

setului de date și o analiză a problemei pe care algoritmul trebuie să o resolve, din meniul
din stanga spațiului de lucru.
Un alt grup de algoritmi necesari pentru probleme de regresie există în Azure. De
exemplu dacă dorim să analizăm cererea unui produs în viitor bazândune pe cerer ile
anterioare, trebuie folosit un algoritm pentru regresie.
Realizarea predictiei datelor se face prin utilizarea de date istorice despre relația
dintre cerere și alte date de intrare. Azure ML suportă următorii algoritmi destinați
predictiei datelor, cu m ar fi : Bayesian Linear Regression, Boosted Decision Tree
Regression, Neural Network Regression.
Există și al treilea set de algoritmi destinați problemelor de clustering . Azure ML
suportă doar un singur algoritm de clustering acesta fiind K -Means Clust ering.
3.6.3 Testarea modelelor
După ce modelul a fost antrenat următorul pas este să testăm modelul. Pentru a
îndepli această sarcină putem utiliza date din setul de date deoarece la antrenare am
utilizat doar 75% din date restul de 25% le -am păstrat pen tru testare . Testarea se poate
vedea în următoarea imagine:

Procesul începe prin a trimite date de testare către model (pasul 1) ca apoi
modelul să genereze valori țintă din datele de intrare. Apoi oamenii de știință pot
compara datele returnate de model cu datele trimise spre analiză. Dacă compararea ne
oferă un rezultat bun atunci modelul poate fi utilizat mai departe în aplicații. Dacă
modelul antrenat nu returnează valori asemanatoare cu datele de intrare atunci trebuie
să alegem o nouă combinație de feature -uri pentru a reantrena algoritmul.
3.6.4 Deploy -ul modelului
O dată ce modelul a fost antrenat și testat trebuie să fie accesibil aplicațiilor.
Astfel Azure ML pune la dispoziția dezvoltatorilor un set de tool -uri prin care modelul
poate fi deploy -at ca serviciu web. Acesta fiind consumat mai departe de aplicații terțe
prin apeluri REST. Acest lucru este ilustrat de următoarea figură:

3.6.5 Consumarea serviciului web
De îndată ce ce serviciul web este funcțional acesta poate primi apeluri. Servic iul
web are nevoie de date corecte pentru a returna rezultatul dorit. Astfel aplicația trebuie
sa trimită date pentru feature -uri.

Capitolul 4
4.1 Descriere generală
Aplicația este structurată într -o parte de client și o parte de server. Clientul a fost
dezvoltat cu ajutoru l tehnologiilor precum Angular 4 , Typescript, HTML, CSS,
Boostrap. În timp ce partea de server este compusă din doua servicii web destinate
aprovizionării aplicației cu date. Serviciul web destinat gazduirii algoritmului de
intelig ență artificială a fost dezvoltat cu utilitarul Azure ML Studio. Cel de -al doilea
serviciu web a fost dezvoltat în .NET Core și are rolul de a face apeluri către serviciul
de predicție a datelor. Acest serviciu comunică cu o bază de date găzduită de un ser ver
Sql Server aflat în cloud în care se află date de intrare necesare algoritmului de predicție.
Api-ul în prealabil trimite un request către API -ul de Accuweather pentru a obține date
reale despre condițiile meteo.
Soluția are ca scop estimarea viitoar elor cerereri de închirieri de biciclete.
Estimarea se efectuează cu ajutorul algoritmului de inteligență artificială care folosește
un set de date pus la dispoziția de către firma Capital bikeshare care a pus la dispoziția
cercetătorilor informațiile desp re numărul de inchirieri corelate cu informații
meteorologice și de sezon.
4.2 Aplicația client
În Angular, un modul este un mecanism de grupare a componentelor, directivelor
și serviciilor care sunt asociate cu acesta, în așa fel încât combinate cu alte module crează
aplicația.
O analogie între framework -ul Angular și alte limbaje pot fi făcute prin
asemănarea modulelor cu clasele din limbajele orientate obiect. Astfel metodele publice

sunt API -uri care alte parți pot comunica cu acestea în timp ce metode le private sunt
implementări ale detaliilor interfeței care sunt ascunse de alte module. De asemenea
modulele pot exporta sau ascunde componentele, directivele, pipe -urile sau serviciile.
Exportarea modulelor se efectuează cu ajutorul cuvântului cheie „ex port”. Un
modul care este decorat cu un astfel de cuvant devine vizibil pentru altele, acestea
putândui folosi codul.
Unul dintre cele mai importante module ale soluției este reprezentat de modulul
de client. Acesta are rolul de a afisa datele către utiliz atorul final. Aplicația de client,
sau „clientul” cum va fi numit în continuare, este structurat pe module .Astfel de module
au rolul de a împărți codul pe feature -uri. Avantajul lor este că aplicația devinde mai
ușor de întreținut și comportamentul acestor a poate fi extins cu ușurință.
De asemenea fiecare modul are una sau mai mult e componente Angular care
asigură afiș area în browser a codului HT ML. O aplicație web dezvoltată cu Angular
trebuie să reutilizeze aceste componente acolo unde este necesar. Ast fel acest feature al
framework -ului mai are rolul de a permite reutilizarea parților de interfață și pe alte
pagini.
În continuare vom explica codul aplicației de client pornind de la fisierul de
configurări numit angular -cli.json . Acest fisier conține un obiect JSON cu toate
configurările care fac aplicația sa pornească. Acesta are o proprietate numită „apps” în
care se găsesc configurari precum „root” care conține numele folderului unde se gasesc
fisierele destinate interfetei, în proprietatea „assets” s e va găsi numele folderului unde
sunt stocate fisierele CSS, proprietatea „index” este responsabilă cu stocarea denumirii
fisierului rădăcină, de cele mai multe ori acesta se numește index.html dar dezvoltatorul
poate redenumi fisierul, cu precizarea ca tr ebuie modificat și în fișierul de configurări,
o altă proprietate importantă este „main” în care se găseste fisierul de backend pentru
pagina index.
Astfel fiind descris ă acestă parte, următorul pas este descrierea punctului central
din care aplicația în cepe să funcționeze, și anume fisierul main.ts . După cum se observă

acesta are extensia ts care provine de la prescurtarea limbajului TypeScript. Conținutul
fisierului main.ts nu este lung însă este important pentru pornirea aplicației . Linia de cod
platformBrowserDynamic().bootstrapModule(AppModule);
face ca aplicația să pornească având ca modul principal, modulul cu numele
AppModule . Însă pentru a nu exista erori de compilare trebuie importat
platformBrowserDynamic care face parte din nucleul Angularului . Urmatoarea linie de
cod va rezolva orice problemă apărută la compilare:
import { platformBrowserDynamic } from ’@angular/platform -browser -dynamic’;
Faza următoare în afisarea paginii este injectarea modulului AppModule, în
fisierul index.html în interio rul tag -ului cu numele app-route . În interiorul lui
AppModule se găsesc referințele către celelalte module definite în aplicație dar și a
componentelor, directivelor și pipe -urilor.
În continuare vom explica conținutul unui modul de dashboard .
import { BrowserModule } from '@angular/platform -browser';
import { NgModule } from '@angular/core';
import { RouterModule } from '@angular/router';
import { DashboardComponent} from './dashboard/dashboard.component';
import { HttpModule } from '@angular/http';
import {DashBoardService} from './dashboard/dashboard.service';

import { AppComponent } from './app.component';

@NgModule({
imports: [
BrowserModule,
HttpModule,
RouterModule.forRoot([
{path: 'dashboard', component: DashboardComponent }
])
],
declarations: [
AppComponent,
DashboardComponent
],

providers: [DashBoardService],
bootstrap: [AppComponent]
})
export class AppModule { }

Un modul este o clasă careia i s -a aplicat decoratorul @NgModule . Acest
decorator es te o funcție care face parte din @angular/core asa cum se poate observa în
zona de importuri. Această funcție are patru parametri:
 imports : unde se declară alte module importate. În acest caz sunt importate
modulele BrowserModule, HttpModule și RouterModul e. Modu lul
BrowserModule ne oferă facilitatea de a folosi directivele din angular cum
ar fi ngIf, ngFor etc., directive foarte utile în momentul în care o bucată de
cod HTML se repetă de un număr de ori sau în cazul ngIf dacă dorim să
afisăm cod -ul HTML sa u nu. Modulul Http ne oferă facilitatea de a trimite
apeluri către server iar modulul Router ne oferă facilitatea de navigare
printre componente.
 declarations reprezintă un vector în care sunt declarate componentele
utilizate în modulul respectiv.
 providers reprezintă un vector în care sunt declarate serviciile care sunt
injectate în componentă. Injectarea se produce cu ajutorul dependency
injection .
 boostrap este un vector care conț ine componenta care va fi afișată în
browser.
Următorul pas și ultimul pentru a ne fi afiș ată interfața este definirea un ei
componente. Astfel vom elebora componenta dashboard, în care sunt afișate informații
generale. Componenta va fi creată sub folderul src în interiorul folderului app
respectând no rmele de denumire, astfel o vom denumi dashboard.component.ts .
O componentă este o clasă decorată cu funcția @Component care face parte din
@angular/core . În continuare vom detalia corpul fisierului astfel:

import {Component ,OnInit} from "@angular/core";
import {DashBoardService} from './dashboard.service';

import {IMLResponse} from './IMLResponse'
@Component({
selector: 'dashboard',
templateUrl: 'dashboard.component.html'
})
export class DashboardComponent implements OnInit{
title = 'Dashboar d';
response: string = "Response";
errorMessage: string;

constructor(private _machineLearningAlgorithmAPI: DashBoardService){}

ngOnInit(): void {
this._machineLearningAlgorithmAPI.getMLResponse()
.subscribe(response => { t his.response = response},
error => this.errorMessage = <any>error);

}
}

Codul de sus reprezintă definirea componentei, după cum se poate vedea este
necesară decorarea clasei typescrip cu functia Component ce are ca argumente
parametrul selector și templateUrl dar se pot defini multi alți parametri. În codul de mai
sus valoarea proprietății selector reprezintă numele tag -ului HTML care va fi general la
compilare iar templateUrl reprezintă calea către fisierul care conține codul HTML
pentru această componentă. Proprietățile din interiorul clasei sunt afișate prin procedeul
interp olare , procedeu specific Angular. În acest exemplu se poate observa ca pe
contructor se trimite un parametru de tipul DashBoardService , acest parametru
facilitează principiul dependency injection pe care Angular il deține incorporat în
nucleul său.
Metoda ngOnInit face ca la inițializarea componentei să facă un apel REST către
API Core pentru obținerea datelor prezise de algoritmul de machine learning. În
continuare vom explica cum se construiește un serviciu în limbajul TypeScript.

import {Injectab le} from '@angular/core';
import {Http, Response} from '@angular/http';
import {Observable} from 'rxjs/Observable';
import 'rxjs/add/operator/map';
import 'rxjs/add/operator/do';
import 'rxjs/add/operator/catch';
import {IMLResponse} from './IMLResponse';

@Injectable()
export class DashBoardService
{
private _mlAlgorithmUrl =
'http://bikerentalplanningapi.azurewebsites.net/machineLearningAPI/predict';

constructor(private _http: Http){}

getMLResponse():Observable<string> {
return this. _http.get(this._mlAlgorithmUrl)
.map((response: Response) => response.toString())
.do(data => console.log('All: ' + JSON.stringify(data)))
.catch(this.handleError);
}

private handleError(error: Response)
{
console.error(error);
return Observable.throw(JSON.stringify(error));
}
}

În exemplul de mai sus putem observa construcția serviciului folosit în deschierea
componentei dashboard. Un serviciu este o clasă Typescript care este decorată folosind
cuvântul cheie Injectable . Acest decorator marchează clasa ca fiind bună de injectare.
În general un injector raportează o eroare când încearcă sa instantieze o clasă care nu
este marcată cu @Injectable().
La runtime, sistemul de injecție al Angul arului poate citi metadatele din codul
JavaScript și folosește tipul parametului din constructor ca să determine ce clasă să
injecteze în interiorul constructorului.

4.3 Aplicația server
Aplic ația server este împarțită în două componenete: API -ul realizat în .NET
Core, care în continuare o vom numi API Core și API -ul realizat în tool -ul Azure
Machine Learning pe care o vom denumi API ML.
API Core este o aplicație realizată în .NET Core care are ca scop interceptarea
apelurilor de la client către API ML. Acesta are rolul de a trimite request -uri către API
Accuweather pentru a obține condițiile meteo pentru perioada interogată. În continuare
pe lângă condițiile meteo API Core calculează un număr de parametri necesari apelului
către API ML cu aju torul inter ogării bazei de date unde se află setul de date .
În continuare vom examina apelul către API ML din API Core. Acest lucru se
execută prin a declara o variabila de tipul HttpClient, și vom folosi un using pentru a se
apela automat metoda Dispose() la sfârș itul execuției codului. Pasul următor este
asignarea URL -ului variabilei client și crearea unui header pentru apelul REST care să
conțină Api key -ul serviciului din Azure ML. Un api key este o cheie unică p e care
fiecare API o deține și este folosit pentru a indentifica programu care a făcut apelul,
dezvoltatorul, sau utilizatorul web site -ului. In general API key sunt folosite pentru a
stabili o statistică a cazurilor de utilizare pentru a împiedica folosirea API -ului abuziv.
Url-ul către se va efectua ap elul este:
var url =
https://ussouthcentral.services.azureml.net/workspaces/2920f6919efb4971b91f07a830
709cde/services/fa9efad612db43feaba6fec3420061ca/execute?api –
version=2.0&format=swagger ;

iar api key -ul serviciului este de forma :
var apiKey =
qjaAs+ 80V7LuQ9gXLWKq8EP+q8Xparf8zVo9jyD3SkwH2GYtvz644Yib5Wivh4ROeY
dOYIXuyr1SBHQUWnZp5w== ;

client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue
("Bearer", apiKey);
client.BaseAddress = new Uri(url);

Liniile de cod de mai sus reprezintă asi gnarea url -ului ș i api key -ului header –
ului obiectului care va face apelul către API ML.
Urmatorul pas este apelul în sine :

HttpResponseMessage response = await client.PostAsync(url, new
StringContent(JsonConvert.SerializeObject(scoreRequest)));

Codul de mai sus returnează raspunsul apelului REST și este de tipul
HttpResponseMessage . Apelul este unul asincron avand nevoie ca parametri url -ul și un
obiect JSON format din datele obținute de la API Accuweather precum și datele obținute
din interogare a bazei de date din cloud. Feature -urile necesare estimării numărului de
biciclete închiriate
Codul de status al apelului este verificat și dacă este diferit de 200 atunci metoda
va returna codul de status nu rezultatul primit de la API ML în vederea dia gnosticării .
În cazul în care apelul s -a terminat cu succes JSON -ul primit ca răspuns este parsat și
apoi sunt extrase date le necesare . Răspunsul apelului REST este înapoiat aplicației de
client care a executat apelul.
Apeluri cum am descris mai sus se ef ectuează și pentru apelarea API
Accuweather în vederea obținerii datelor meteorologice.
4.4 Baza de date
Într-o aplicație profesionistă baza de date reprezintă punctul de început. Acesta
este una dintre cele mai importante componente ale aplicațiilor fii nd organizată dintr -o
colecție de scheme, tabele, interogări, rapoarte, view -uri, proceduri stocate și funcții.
Tabela din schema dbo cu numele DataSet conține date vitale de calculare
anumitor feature -uri. Datele pot fi vizualizate prin interogarea bazei prin următoarea
comandă:

SELECT [instant] , [season] , [yr], [mnth] , [hr], [holiday] , [weekday] , [workingday]
,[weathersit], [ temp] , [atemp] , [hum] , [windspeed] , [casual] , [registered] , [cnt]
FROM [dbo].[DataSet]

În imaginea de mai sus se poate observa setul de date, numele serverului
icqufha2ra.database.windows.net și utilizatorul bazei de date.
4.5 API ML
Aplicație moderne trebuie să fie inteligente, iar acest lucru se face prin
implementarea de formule care e fectuează calcule dificile, greu de obținut de oameni.
Aplicațiile inteligente a zilelor noastre înglobează algor itmi de inteligență artificială
pentru a prezice sau clasifica diverse probleme.
Algoritmul a fost realizat prin folosirea card -urilor preprog ramate într-o ordine
corectă pentru returnarea unui rezultat având o eroare minimă. Intrarea principală în
algoritm este reprezentată de setul de date care trebuie importat în Azure ML Studio.
Acest set de date este bazat pe date reale culese de la compani a Capital Bikeshare care
deține o rețea de închirieri de biciclete în capitala Statelor Unite ale Americii,
Washington. Câmpul pe care algoritmul este antrenat să îl prezică este cnt care conține
valori din intervalul inchis [1,997], reprezentând numărul d e inchirieri dintr -o anumită
oră. Prezicerea se va face în funcție de feature -uri precum condițiile meteo, conținând
valori ale temperaturii, umidității, viteza vantului și precipitații. Alte feature -uri folosite
pentru prezicere sunt reprezentate de valor i în functie de perioada anului, ș i anume dacă
este vacanta sau nu, în funcție de anotimp, ora la care s -a efectuat inchirierea, luna și

ziua din săptămână. Astfel umătorul card este absolut necesar facând parte din pasul de
pre-procesare al datelor. Acesta are ca scop să convertească două coloane numerice
weathersit și season în variabile de categorie și să elimine patru coloane mai puțin
relevante cum ar fi instant, dteday, casul, registered . Coloana instant conținea numărul
de rand curent din setul de date, dteday conținea data curentă, casual reprezenta numărul
de inchirieri în care clienții nu dețineau un cont de client iar registered reprezenta
numărul d e inchirieri în care clie ntii dețineau un cont de client.
Schema algoritmului, pană în acest pas este reprezentată de următoarea schemă

în care primul card reprezintă setul de date, următorul card este reponsabil cu
transformarea coloanelor în categori i iar ultimul este o proiecție a coloanelor care vor fi
folosite în continuare.
Umătorul pas pe care il vom face în dezvoltarea algoritmului nostru este de a
genera noi feature -uri bazate pe datele anterioare. Acest lucru il vom realiza cu ajutorul
unui s cript în limbajul R.

dataset < – maml.mapInputPort(1)

previous < – 12
orig_names < – names(dataset)
n_rows < – dim(dataset)[1]

base < – 13
for (i in 1:previous) {
dataset[(i+1):n_rows,base+i] < – dataset[1:(n_rows -i),base]
dataset[1:i,base+i] < – dataset[1:i,base+i -1]
}

base2 < – base+previous
for (i in 1:previous) {
dataset[(i*24+1):n_rows,base2+i] < – dataset[1:(n_rows -i*24),base]
dataset[1:(i*24),base2+i] < – dataset[1:(i*24),base2+i -1]
}

a <- -1:-previous
new_names1 <- paste("demand in hour",a)
new_names2 < – paste("demand in day",a)
names(dataset) < – c(orig_names,new_names1,new_names2)

maml.mapOutputPort("dataset")

Rezultatul acestui script concateneaza la feature -urile existente alte feature -uri
compuse din valorile inchirierilor din urmă cu 12 zile la aceeași oră și din urma cu cu
12 ore.

Figura arată cardul cu scriptul R

În continuare trebuie să alegem un alg oritm pentru a analiza datele. Ținta
algoritmului este de a prezice o valoarea numerică așa că am ales un model de regresie.
Încă un motiv pentru alegerea acestui model a fost din cauza numărului mic de feature –
uri, acesta fiind sub 100. Astfel am ales mod ulul Boosted Decision Tree Regression .
Parametri trimisi algoritmului sunt :

Datele de test și cele de antrenare au fost separate cu ajutorul modulului Split. Iar
antrenarea o efectuează cardul Train Model acesta trimițând datele mai departe cardului
Score Model pentru afisarea rezultatelor așa cum putea vedea în următoarea imagine:

Singurul lucru care ne mai rămâne de facut este să rulăm experimentul apăsând
butonul Run din partea de jos a aplicației și rezultatul poate fi consultat prin apăsarea
butonului Visualize a cardului Score Model .
O vedere generală a algoritmului se poate vedea în următoarea schemă:

API este generat în urma adăugarii cardului Web service in put și Web service
output necesare pentru ca API -ul să poată primi date de input și să poate returna
rezultatul predicției.
O imagine generală asupra API ML se poate vedea în următoarea schemă:

4.7 Sistemul de autentificare
În orice aplicație modernă sistemul de autentificare trebuie să fie unul
profesional, fară greseli și durabil în timp. Compania Google a reusit să dezvolte un
sistem de autentificare și a fost pus la dispoziția tuturor dezvoltatorilor de software prin
intermediul unui serviciu web.
Autentificare prin Google este un sistem de autentificare securizat prin care se
economisește timpul de dezvoltare a unui sistem de login pentru dezvoltatori.
Utilizatorii nu vor mai fi nevoiți să își creeze alte conturi pentru autentificarea în
aplicați e ci vor folosi aceleași conturi pe care le folosesc pentru Gmail, Google play sau
alte servicii Google.
API-ul Google folosește protocolul Oauth 2.0 pentru autentificare și autorizare.
Google suportă scenarii precum autentificarea pentru servere web, apl icații instalate și
aplicații client. În cazul nostru autentificarea a fost implementată pe o aplicație client.
În schema de mai jos este descris fiecare pas pentru ca autentificarea să se producă cu
succes.

Primul pas în implementarea autentificării cu Google este reprezentată de
obținerea de credențiale din consola Google. Credențiale ce conține clientId ce
reprezintă un cod unic ce va reprezenta aplicația client.
În continuare va trebui să introducem scrip turile necesare care fac apelul către
serverele Google. Pentru a executa aceste apeluri avem nevoie să declarăm libraria
javascript, Google Platform.
<script src="https://apis.google.com/js/platform.js" async defer></script>
<meta name="google -signin -clien t_id" content="1018253951921 –
fkdfa45dlgue7kbu9banb1ckomt9jhdh.apps.googleusercontent.com">

Prima linie de cod dintre cele mai de sus reprezintă scriptul în care se vor găsi
metodele necesare autentificării, în timp ce a doua linie reprezintă o metadata c e conține
clientId -ul unde se va face apelul.

<div class="g -signin2" data -onsuccess="onSignIn"></div>

Codul de mai sus crează o buton pentru autentificare în care utilizatorul trebuie
să completeze numele de cont și parola. După care va fi atutentifica t. Pentru a afișa cine
s-a conectat impreună cu avatarul de la profilul de google, API -ul pune la dispoziț ie
urmatoarea funcție javascript:
function onSignIn(googleUser) {
var profile = googleUser.getBasicProfile();
console.log('ID: ' + profile.getId());
console.log('Name: ' + profile.getName());
console.log('Image URL: ' + profile.getImageUrl());
console.log(' Email: ' + profile.getEmail());
}

Cu ajutorul acestei funcții putem afișa numele impreună cu poza ut ilizatorului. Având
langa aceastea un link pentru log -out. Log -out-ul se efectuează prin funcția aflată mai
jos:

function signOut() {
var auth2 = gapi.auth2.getAuthInstance();
auth2.signOut().then(function () {
alert ('User signed out.');
});
}

Funcția are ca răspuns o fereastră pop -up în care ne este prezentat faptul ca
utilizatorul a fost delogat cu succes.
4.6 Inovația adusă de aplicație
Inovație, repiditate, acces ușor la informații sunt doar cuvinte care descriu lumea
modernă ce are nevoie ca resursele oricărei companii să fie bine organizate. Prin inovație
aplicația Bike rental planning ințelege că resursele se vor putea planifica în vi itor mult
mai precis decât oricând. Inteligența aplicației constă în algoritmul prezicere a datelor
iar apariția rapoartelor pentru bicicletele stricate face ca aplicația să fie foarte folositoare
pentru planificare.

Bibliografie
[1] http://json.org/
[2] https://en.wikipedia.org/wiki/Microsoft_Azure#Services
[3] http://en.wikipedia.org/wiki/.NET_Framework
[4] http://en.wikipedia.org/wiki/Framework_Class_Library
[5] https://msdn.microsoft.com/en -us/library/h43ks021( v=vs.110).aspx
[6] http://en.wikipedia.org/wiki/ADO.NET
[7] http://rusanu.com/2013/08/01/understanding -how-sql-server -executes -a-query/
[8] https://msdn.microsoft.com/en –
us/library/system.data.dataset%28v=vs.110%29.aspx
[9] https://msdn.microsoft.com/en –
us/library/system.data.sqlclient.sqlconnection%28v=vs.110%29.aspx
[10] https://msdn.microsoft.com/en -us/library/System.Data(v=vs.110).aspx
[11] Programming ASP.NET MVC 4 – Jess Chadwick, Todd Snyder, Hrusikesh
Panda
[12] https://www.ibm.com/developerworks/library/wa -implement -a-single -page –
application -with-angular2/index.html

Similar Posts