Bdg Gabriel Alexandru (2) [615822]
UNIVERSITATEA DIN BUCUREȘTI
FACULTATEA DE MATEMATICĂ ȘI INFORMATICĂ
SPECIALIZAREA INFORMATICĂ
RATE A JOB
Aplicație social -informativă și de
comunicare pentru platforma Android
COORDONATOR ȘTIINȚIFIC
CONF. DR. DENISA DIACONESCU
ABSOLVENT: [anonimizat], 2018
1
2
Cuprins
INTRODUCERE ………………………….. ………………………….. ………………………….. ………………………….. ………………….. 4
CAPITOLUL 1 – PREZEN TAREA PROBLEMEI ………………………….. ………………………….. ………………………….. …………. 6
1.1. PLATFORMA DE DEZVOLTA RE – ANDROID ………………………….. ………………………….. ………………………….. …………………. 7
1.2. APLICAȚII SIMILARE EX ISTENTE PE PIA ȚĂ ………………………….. ………………………….. ………………………….. ………………….. 9
1.2.1. Indeed Job Search ………………………….. ………………………….. ………………………….. ………………………….. ……. 9
1.2.2. Good&Co: Career match tests ………………………….. ………………………….. ………………………….. ………………. 10
1.2.3. Glassdoor : Job Search, Salaries & Reviews ………………………….. ………………………….. …………………………. 11
1.2.4. LinkedIn Job Search ………………………….. ………………………….. ………………………….. ………………………….. … 12
1.2.5. JOB TODAY – jobs in 24hrs ………………………….. ………………………….. ………………………….. …………………… 13
1.3. IMPACTUL ASUPRA UTILI ZATORILOR ………………………….. ………………………….. ………………………….. ……………………… 14
1.3.1. Utilizarea internetului ………………………….. ………………………….. ………………………….. …………………………. 14
1.3.2. Utilizarea unei aplicații mobile ………………………….. ………………………….. ………………………….. ……………… 15
1.4. OBIECTIV ………………………….. ………………………….. ………………………….. ………………………….. ……………………….. 16
1.5. CONCLUZIE ………………………….. ………………………….. ………………………….. ………………………….. ……………………… 17
CAPITOLUL 2 – TEHNOL OGII FOLOSITE ………………………….. ………………………….. ………………………….. ……………… 18
2.1. ANDROID ………………………….. ………………………….. ………………………….. ………………………….. ……………………….. 18
2.1.1. Istoric ………………………….. ………………………….. ………………………….. ………………………….. …………………… 18
2.1.2. Interfața utilizatorului ………………………….. ………………………….. ………………………….. …………………………. 19
2.1.3. Java ………………………….. ………………………….. ………………………….. ………………………….. ……………………… 20
2.1.4. Dezvoltar ea unui proiect Java pentru Android ………………………….. ………………………….. …………………….. 20
2.1.5. Resurse Android ………………………….. ………………………….. ………………………….. ………………………….. …….. 21
2.1.6. Baza de date – SQLite ………………………….. ………………………….. ………………………….. ………………………….. 22
2.1.7. Mediul de dezvoltare ………………………….. ………………………….. ………………………….. ………………………….. . 23
2.1.7.1 Crearea unui pachet de aplicație Android (APK) prin intermediul Gradle ………………………….. ………………………. 23
2.1.8. Librării Android ………………………….. ………………………….. ………………………….. ………………………….. ……… 24
2.1.8.1 Iconify și F ont Awesome ………………………….. ………………………….. ………………………….. ………………………….. ……. 25
2.1.8.2 Volley ………………………….. ………………………….. ………………………….. ………………………….. ………………………….. …. 26
2.1.8.3 Android -Image -Cropper ………………………….. ………………………….. ………………………….. ………………………….. ……. 27
2.2. FIREBASE ………………………….. ………………………….. ………………………….. ………………………….. ……………………….. 27
2.2.1. Baza de date NoSQL ………………………….. ………………………….. ………………………….. ………………………….. .. 28
2.2.2. Autentificarea utilizatorilor (Firebase Auth) ………………………….. ………………………….. ……………………….. 29
2.3. NODE.JS ………………………….. ………………………….. ………………………….. ………………………….. ………………………… 30
2.3.1. Lucrul cu thread -uri ………………………….. ………………………….. ………………………….. ………………………….. … 31
2.3.2. Heroku ………………………….. ………………………….. ………………………….. ………………………….. ………………….. 32
2.4. CONCLUZIE ………………………….. ………………………….. ………………………….. ………………………….. ……………………… 33
CAPITOLUL 3 – PREZEN TAREA TEHNICĂ A APLI CAȚIEI ………………………….. ………………………….. ……………………… 36
3.1. DESCRIERE ………………………….. ………………………….. ………………………….. ………………………….. ……………………… 37
3.1.1. Utiliza torul tip companie ………………………….. ………………………….. ………………………….. ……………………… 37
3.1.2. Utilizatorul tip persoană ………………………….. ………………………….. ………………………….. ……………………… 42
3.1.2.1. Căutarea unei companii ………………………….. ………………………….. ………………………….. ………………………….. ……. 43
3.1.2.2. Lista locurilor de muncă ………………………….. ………………………….. ………………………….. ………………………….. …… 45
3.1.2.3. Pagina de comentarii ………………………….. ………………………….. ………………………….. ………………………….. ……….. 46
3.1.2.4. Aplicația de angajare ………………………….. ………………………….. ………………………….. ………………………….. ……….. 49
3.1.2.5. Pagina de profil ………………………….. ………………………….. ………………………….. ………………………….. ……………….. 50
3.2. SISTEMUL DE RECOMANDĂ RI ………………………….. ………………………….. ………………………….. ………………………….. …. 51
3.2.1. MinHash ………………………….. ………………………….. ………………………….. ………………………….. ……………….. 52
3.2.3. Similar itatea Jaccard ………………………….. ………………………….. ………………………….. ………………………….. . 54
3
3.3. STRUCTURA BAZEI DE DA TE ………………………….. ………………………….. ………………………….. ………………………….. …… 55
3.4. PLANURI DE VIITOR PEN TRU ÎMBUNĂTĂȚIREA AP LICAȚIEI ………………………….. ………………………….. ………………………….. 59
CONCLUZIE ………………………….. ………………………….. ………………………….. ………………………….. …………………….. 60
BIBLIOGRAFIE ………………………….. ………………………….. ………………………….. ………………………….. …………………. 62
ANEXE ………………………….. ………………………….. ………………………….. ………………………….. ………………………….. .. 64
ANEXA 1 ………………………….. ………………………….. ………………………….. ………………………….. ………………………….. …. 64
4
Introducere
Ideea proiectului Rate A Job este construită pe principul întrajutorării interumane pentru
a simplifica procesul de atingere al scopului dorit. Având la dispoziție o metodă simplă și rapidă
de comunicare prin intermediul dispozitivelor inteligente, această aplicație are potențialul de a -și
îndruma utilizatorii că tre alegerea potrivită care, implicit, le poate schimba viața.
După cum spune și numele, Rate A Job sau în traducere „Evaluează un loc de muncă” ,
îndeamnă oamenii care au interacționat cu un anumit loc de muncă care le -a oferit, sau nu,
satisfacții, să -și împărtășească experiența dobândită din contactul cu mediul respectiv . De altfel
aplicația poate avea rol de canal de feedback pentru companii prin comentariile pro și contra aduse
de către persoanele cu care au interacționat. Fiecare companie dispune de un cont pe care un
reprezentant de -al său îl poate modera editând informații si socializând cu cei care au întrebări sau
cu cei care și -au exprimat deja un punct de vedere.
Astfel se creează o comunitate bazată pe ajutor recip roc în urma căruia se vor crea legături
mai strânse între angajator -angajat și vor spori încrederea de sine a intervievatului care se va
prezenta cu o bază de cunoștințe cel puțin minimă.
În continuarea lucrării voi expune abordarea folosită pentru rezolvarea problemei , compusă
din uneltele atent alese, compusul inovator, exemple de proiecte urmărite pentru inspirație și o
descriere detaliată al procesului de funcționare al aplicației.
Capitolul 2 prezintă motivul dezvoltării produsului în cauză și impactul pe care îl v a avea
asupra utilizatorilor . Acesta urmărește un obiectiv – acela de a -și ajuta utilizatorii, pe cât posibil ,
în obținerea informa ției dorite . Tot în acest capitol sunt expuse aplicații asemănătoare existente pe
piață care au rezolvat aceeași problemă dar dintr -o altă perspectivă .
În capitolul al 3 -lea sunt enumerate și explicate uneltele folosite pentru realizarea întregului
proiect, atât partea de client cât și cea de server. Primele trei mari subcapitole înglobează
componentele cele mai importante, acestea fiind Android – folosit pentru interacțiunea directă cu
utilizatorul, Firebase – unealta care găzduiește baza de date a aplicației și care permite
administrarea conturilor utilizatorilor.
5
Capitolul 4 descrie proiectul și modul său de funcționare sub denumirea de prezentare
tehnică a aplicației. Aici se regăsesc exp licații cu privire la utilitatea fiecărei funcționalități
implementate în aplicație . Una dintre cele mai importante este considerată algoritmul sistemului
de recomandări folosit pentru a oferi posibile opțiuni de interes pentru utilizator. De altfel, în ac est
capitol se regăsește explicat și modul de lucru în tandem al uneltelor prezentate în capitolul
anterior.
Produsul finit, aplicația mobilă Rate A Job, poate fi descărcată și folosită de către orice
persoana care deține un dispozitiv compatibil și este valabilă pentru categoriile de vârstă de peste
doisprezece ani, datorită limbajului vulgar ce poate apărea, incontrolabil, în discuțiile cu alți
utilizatori.
6
Capitolul 1 – Prezentarea problemei
Odată cu evoluția tehnologiei , a crescut ș i gradul de confort al omului. Acesta a simțit
nevoia de adaptare la noul mediu pentru propria bunăstare. Pentru a ține pasul, a căutat metode de
acces la informație, indiferent de împrejurare. Astfel a apărut cea mai utilă unealtă de comunicare
și ”entertainment ” mobil ă, telefonul inteligent.
Datorit ă faptului că educația individului s -a îmbunătățit odată cu progresul tehnologic, au
apărut o multitudine de locuri de muncă ce pot varia foarte mult , din punct de vedere al cerințelor
din partea anga jatorului .
Având la dispoziție uneltele și informațiile necesare, fiecare persoană înce arcă să găsească
un loc de muncă potrivit nevoilor și cunoștințelor sale. În cazul unei conexiuni reușite dintre
angajat și mediu l de lucru , din cadrul unei com panii, ambele părți vor avea de câștigat. Astfel că
individul va putea îmbina utilul cu plăcutul, dând dovadă de productivitate, iar compania va fi
capabilă de a servi produse de calitate superioară în timp util.
Analizând situația prezentată mai sus, am hotărât că pot da o mână de ajutor societății, prin
crearea unei platforme de comunicare , încadrată în acest subiect . Compatibilă cu telefoanele
inteligente , aceasta poate oferi mobilitatea de care utilizatorii au nevoie .
Scopul principal al aplicației prezentată în aceast ă lucrare, constă în ajutorul oferit
utilizatorilor în privința alegerii unui loc de muncă, potrivit standardelor sale . Acest lucru se va
realiza prin schimbul de informații cu foști sau actuali membrii din cadrul companiilor în cauză.
Conform unui studiu efectuat de către eMarketer (Fig.1), asupra utilizatori lor de telefoane
inteligente din Marea Britanie, a rezultat c ă aceștia petrec aproximativ două ore din zi pe telefon,
perioada crescând de la an la an. Acesta a fost unul dintre factorii care m -au determinat să utilizez
o tehnologie ce poate livra informația necesară către utilizator mai rapid. [1]
7
Fig.1 Media de timp, din zi,
petrecută pe un telefon inteligent
1.1. Platforma de dezvoltare – Android
Android ocupă în prezent locul înt âi pe piața sistemelor de operare dedicate dispozitivelor
mobile, depășind detașat competiția. Conform unui studiu realizat de către compania Gartner1
(Fig.2 ), Android a obținut conducerea pieței în primul semest ru al anului 2011, crescând
semnificativ de la an la an.
Acest lucru se datorează colaborării cu numeroși experți de nivel mondial în producerea de
dispozitive hardware și componente software compatibile. Având o interfață ușor de înțeles și
utilizat de către toate categoriile de vârstă , dar și un preț accesibil, fiind compatibil și cu dispozitive
mai puțin performante, Android s -a răspândit foarte ușor la nivel global.
Utilizatorii acestui sistem de operare pot beneficia de o multitudine de aplicaț ii de
comunicare, media, de tip joc și nu în ultimul rând, de salvare, stocare și sincronizare a datelor
între dispozitivele inteligente personale. Relația cu utilizatorii a fost constant îmbunătățită odată
cu trecere a timpului. Un bun exemplu ar f i implem entarea de către producătorii de software, a unor
algoritmi complecși, ca recunoașterea facială, detectarea amprentei sau un sistem de inteligență
artificială cu care consumatorii de produs pot comunica.
1 http://www.gartner.com
8
Fig.2 Cota de piață a sistemelor de operare
pentru telefoanele inteligente
Din punct de vedere al dezvoltatorului, Android reprezintă o sursă de unelte cu ajutorul
cărora poate da naștere unor produse destinate unei game largi de dispozitive, din care fac parte
atât telefoanele inteligente cât și televizoarele, ceasurile inteligente ș.a.m.d. Având acces la
anumite configurații de sistem, aceștia pot oferi utilizatorilor posibilitatea de a -și alege modelul
dorit de aplicație care să îndeplinească o anumită sarcină.
O punte de legătură dintre util izator și dezvoltator o reprezintă aplicațiile de tip magazin,
cea mai cunoscut ă fiind Google Play2. Aceasta oferă posibilitatea publicării și achiziționării de
produse tip aplicație. Utilizatorii au la dispoziție o gam ă variată de aplicații împărțite pe categorii,
de la aplicații de comunicare sau informative asupra anumitor domenii până la multimedia sau
jocuri.
Telefonul inteligent, un dispozitiv indispensabil pentru majoritatea populației, însoțit de o
multitudine de aplicații oferite de către dezvoltatori , a adunat destule dovezi pentru a demonstra
că aplicațiile sociale și de comunicare ocup ă majoritatea timpului unui utilizator. Subiect ul a fost
2 https://play.google.com
9
dezbătut într -un articol publicat de către American Press Institute3 (Fig.3), asupra unor statistici
efectuare de către Nielsen, pe baza inform ațiilor obținute de la utilizatorii de telefoane inteligente
din Statele Unite Ale Americii .
Fig.3 Aplicațiile de tip social media sunt cele mai populare
1.2. Aplicații similare existente pe piață
În continuare , voi prezenta câteva dintre cele mai populare aplicații care mi -au servit ca
inspirație în alegerea temei pentru această lucrare. Cu o mulțime de descărcări la activ, acestea au
reușit să -și atingă scopul, de a îndruma utilizatorul spre locul de muncă potr ivit nevoilor sale.
1.2.1. Indeed Job Search
Indeed este aplicația cu cea mai stufoasă bază de date ce conține informații despre locuri
de muncă disponibile. Aplicația poate fi folosită și fără un cont activ, dar cu funcționalități limitate
(Fig.4.1.) . Crearea unui cont oferă utilizatorului posibilitatea de a salva o list ă cu locuri de muncă
preferate, de a -și crea un Curriculum Vitae sau de a aplica pentru ocuparea unui post vacant.
Găsim ca opțiuni de înregistrare, două modalități – adresa de email și parolă sau înregistrare
prin intermediul Facebook API (Fig.4.2) . Cu un aspect ce oferă senzația utilizării paginii web
(Fig.4.3) , Indeed a reu șit să str ângă peste 50 de milioane de descărc ări pe Google Play.
3 https://www.americanpressinstitute.org/publications/reports/white -papers/mobile -and-social -media/
10
În urma căutărilor, atât ca utilizator înregis trat sau nu, aplicația va stoca local un istoric al
căutărilor recente. Pe baza acestora , dar și a informațiilor utilizatorului înregistrat, dacă este cazul,
Indeed pune la dispoziție un sistem de recomandări. Acesta oferă sugestii din baza de date a
locur ilor, libere, de muncă filtrate conform precizărilor anterioare. [2]
Fig.4.1 Fig.4.2 Fig.4.3
1.2.2. Good&Co: Career match tests
Good&Co are în prim plan găsirea unui loc de muncă potrivit personalității utilizatorului .
Pe baza unor chestionare psihologice (Fig.5.2) , acesta obține un rezultat, pe care îl poate compara
cu cerințele companiilor disponibile în aplicație (Fig.5.3) . Astfel utilizatorul poate afla daca este
compatibil atâ t cu o anumită companie , cât și cu angajații care o compun.
Aplicația pune la dispoziție datele necesare despre compania în cauză, dar nu asigur ă și
procesul de aplicare pentru un loc de muncă. Condiția pentru căutarea locurilor de muncă din
cadrul companiei este îndeplinită dacă utilizatorul a înregistrat profilul tehnic personal.
Cu o interfață foarte interactivă, Good&Co a reușit să strângă peste cinci sute de mii de
descărcări. Aplicația ne cesită înregistrarea unui cont activ și oferă posibilitatea de a crea unul cu
ajutorul informațiilor de pe rețele le de socializare, Facebook și Google+ , sau, prin metoda clasică,
email însoțit de parolă (Fig.5.1) . [3]
11
Fig.5.1 Fig.5.2 Fig.5.3
1.2.3. Glassdoor : Job Search, Salaries & Reviews
O aplicație mobilă care oferă detalii foarte amănunțite despre companiile servite în list ele
de căutare. Este împărțită î n patru mari categorii – companii, locuri de muncă, salarii și interviuri
(Fig.6.2) . Cea mai interesantă funcționalitate o regăsim în secțiunea de opinii , oferite de către foști
sau actuali angajați, asupra unei companii. Opiniile sunt împărțite la rândul lor pe diverse
subcategorii, de la salarii și interviuri , până la opinii generale. (Fig.6.3)
Glassdoor nu restricționează utilizarea aplicației prin intermediul unui cont activ, dar oferă
funcționalități limitate în cazul în care acesta nu există. Activar ea unui cont este posibilă atât prin
intermediul rețelelor de socializare populare, Facebook si Google+, dar ș i prin simpla utilizare a
unei adrese de email însoțite de către o parolă. (Fig.6.1)
O altă funcționalitate interesantă o găsim în secțiunea de c ăutare a locurilor de muncă. De
aici utilizatorul poate efectua căutări în funcție de abilitățile sale și orașul dorit. În plus, acesta
poate salva o sesiune de căutare, pentru a reveni asupra ei după o anumită perioadă de timp sau
pentru a fi notificat câ nd sunt disponibile rezultate noi.
Aplicația de angajare nu se realizează prin intermediul Glassdoor . Apăsând pe un buton,
utilizatorul este redirecționat către pagina de internet a companiei, de unde poate alege să aplice,
sau nu, pentru locul de muncă respectiv. Cu toate acestea, fiind destul de populară , Glassdoor a
reușit să acumuleze pe Google Play, peste cinci milioane de descărcări. [4]
12
Fig.6.1 Fig.6.2 Fig.6.3 Fig.6.4
1.2.4. LinkedIn Job Search
Cu peste zece milioane de descărcări, LinkedIn Job Search oferă utilizatorului toate
uneltele de care are nevoie pentru găsirea locului de muncă la care visează. Oportunitățile de lucru
sunt ușor de găsit cu ajutorul funcționalității de căutar e în funcție de zona geografică (Fig.7.4).
Aplicația oferă recomandă ri automate și notificări bazate pe istoricul de căutare al
utilizatorului , locuri de munc ă accesate pentru vizualizarea informațiilor , dar și pe datele obținute
de la aplicația de bază, LinkedIn .
LinkedIn Job Search folosește același motor de căutare ca aplicația de bază, LinkedIn, fiind
un beneficiu în rapiditatea și acuratețea rezultatelor. Filtrele sunt, de asemenea, într -un număr mare
și pot sorta rezultatele în funcție de companie, locuri de munc ă, experiența și multe altele.
Aplicarea la locurile de muncă oferite de către companii se poate face foarte ușor, din
numai câteva mișcări, dacă utilizatorul s -a conectat cu contul existent de LinkedIn (Fig.7.3) .
Locurile de muncă pot fi salvate într -o listă de preferințe (Fig.7.1) , iar aplicația va notifica
utilizatorul cu privire la statusul acestora, odată cu apariția eventualelor modificări (Fig.7.2) . [5]
13
Fig.7.1 Fig.7.2 Fig.7.3 Fig.7.4 4
1.2.5. JOB TODAY – jobs in 24hrs
Job Today este o aplicație cu o idee destul de interesantă , care schimbă modul în care se
fac angajări. Utilizatorii pot aplica foarte ușor, prin apăsarea unui singur buton, neavând nevoie de
un Curriculum Vitae sau de o scrisoare de recomandare, ci doar prin completarea unui profil
simplist. În urma aplicării, producătorii aplicației garantează un răspuns cererii în maximum 24 de
ore.
Aplicația pune la dispoziție dou ă tipuri de utilizatori, persoane în căutarea unui loc de
muncă și companii care au nevoie de resurse umane. Companiile își postează oferta, utilizatorul
aplică , iar cele două părți vor intra în contact într -un timp scurt, prin intermediul unei inte rfețe de
comunicare unu la unu.
În prezent, ofertele de muncă , oferite prin intermediul acestei aplicații , sunt valabile doar
în dou ă orașe ale Angliei, Londra și Manchester, promițând extinderea într -un viitor apropiat. În
ciuda răspândirii pe o arie destul de mică, Job Today a acumulat peste un milion de descărcăr i. [6]
4 Sursa imagini lor ce compun Fig.7 :
https://play.google.com/store/apps/details?id=com.linkedin.android.jobs.jobseeker
14
Fig.8.1 Fig.8.2 Fig.8.3
1.3. Impactul asupra utilizatorilor
1.3.1. Utilizarea internetului
Mediul online de recrutare al angajaților reprezintă o metodă simplă dar foarte eficientă,
atât din punct de vedere al resurselor financiare dar și al timpului investit în selectarea unei
persoane compatibile cu un anumit loc de muncă. Astfel , s-a creat un spațiu dedicat angajatului și
angajatorului, unde ac eștia pot comunica pe baza cunoștințelor dobândite în raport cu cerințele
locurilor de muncă disponibile.
Beneficiul const ă în varietatea opțiunilor pe care angajatul le are la dispoziție, datorate unui
număr mare de companii care preferă recrutarea online. La rândul său, angajatorul are acces la
profilul solicitanților pentru interviu și astfel poate decide dac ă, pe lângă aptitudinile tehnice,
aceștia se potrivesc și mediului social din cadrul companiei. Și totuși, această metodă poate aduce
dezavant ajul de interpretare greșită a personalității unei persoane. [7]
Un studiu efectuat în anul 2015, de către Pew Research Center5, evidențiază faptul că
oamenii , în căutarea locurilor de muncă , preferă și folosesc internetul ca principală sursă de
informare și căutare. (Fig.9) Conform majorității , este o metodă mai rapidă și mai accesibilă,
indiferent de împrejurări, având chiar și avantajul utilizării unui dispozitiv mobil inteligent.
5 http://www.pewinternet.org/2015/11/19/ searching -for-work -in-the-digital -era/
15
Fig.9 Studiu efectuat asupra populației Americii, referitor la
sursele de informare ale persoanelor in căutarea unui loc de muncă6
1.3.2. Utilizarea unei aplica ții mobile
Urmărind subiectele prezentate în secțiunile anterioare, putem observa că internetul ,
împreună cu utilizarea unui dispozitiv inteligent , ocupă o mare parte din timpul oamenilor. Aceast ă
combinație a condus la confortul fiecăruia, de a -și organiza evenimentele de zi cu zi, prin
intermediul ei.
Așadar, potrivit Jobvite7, 43 din 100 de persoane, în căutarea unui loc de muncă, preferă
utilizarea unui dispozitiv mobil (Fig. 10) , iar 27 la sută se așteaptă ca cererea de angajare să se
efectueze cu ajutorul unei aplicații mobile. Într-un număr destul de mare, ca sistem de operare,
iese din nou în câștig, platforma Android. [8]
Pentru a satisface nevoile clientului, dezvoltatorii aplicațiilor de succes, după cum putem
observa în subcapitolul anterior, au avut în vedere implementarea câtorva funcționalități esențiale:
• Recomandarea unor locuri de muncă potrivite cunoștințelor și nevoilor sale;
• Utilizarea unor metode rapide de înregistrare, spre exemplu utilizarea informațiilor
obținute prin intermediul rețe lelor de socializare sau al unei sesiuni de utilizator fără cont
activ, dar cu restricții asupra utilizării funcționalităților;
6 https://www.statista.com/chart/4078/the -internet -is-the-top-resource -for-modern -job-seekers/
7 https://www.jobvite.com/
16
• Asigurarea unei comunicări active, atât direct, prin intermediul aplicației, cât și indirect,
prin referințe și legături (ex: pa gină web, adresă de mail) între companie și persoana aflată
în căutarea unui loc de muncă.
Fig.10 Raportul utilizării telefonului
mobil în cadrul căutării unui loc de muncă8
1.4. Obiectiv
Pornind de la ideea creării unui mediu ambiant , de unde utilizatorul poate obține
informațiile dorite, în cazul de față, detalii despre un loc de muncă, această lucrare își propune
abordarea dezvoltării unei aplicații pentru platforma Android care să îndeplinească, pe cât posibil,
această condiție .
Accent ul va cădea asupra comunicării și actualizării informațiilor în timp real, dar mai ales
pe implementarea unui sistem de recomand ări, care va avea sarcina de a îndruma utilizatorul către
cele mai bune opțiuni, in funcție de istoricul si preferințele sale.
Rate A Job va fi o aplicație creată pentru sistemul de operare Android, în limbaj nativ.
Accesul la informațiile despre utilizatori va fi realizat prin intermediul Firebase. Acest serviciu
8 Sursa imagine: http://web.jobvite.com/rs/jobvite/images/2014 Job Seeker Survey.pdf
17
pune la dispoziție un spațiu de stocare pentru fișierele media și o bază de date NoSQL pentru restul
informațiilor.
Sistemul de recomandări va fi construit pe baza modelului hibrid, o combinație între
sistemul de recomandări cu filtrare colaborativă și cel cu filtrare bazată pe conținut , pentru o mai
bună acuratețe a rezu ltatelor . Recomandările corespunzătoare fiecărui utilizator vor fi calculate pe
un server scris in limbajul Node.js, găzduit de platforma web Heroku .
Spre deosebire de alte aplicații din această categorie, Rate A Job pune accentul pe crearea
unor conexiuni sociale între utilizatori . Aceste conexiuni au ca scop înrădăcinarea sentimentului
de siguranță al celor în căutarea unui loc de munca , având acces la opinii direct din interior și
încurajând astfel companiile să -și corecteze defectele.
1.5. Concluzie
Piața foarte mare de posesori ai unui dispozitiv Android a încurajat dezvoltatorii să -si
exprime imaginația prin intermediul aplicațiilor mobile, astfel că stilul de viață al fiecăruia a fost,
într-o oarecare măsură, îmbunătățit datorită lor. Multiple domenii au fost tratate ca atare și nu a
fost uitată importa nța relației dintre o companie și angajații săi. Așadar au fost create unelte pentru
a ajuta părțile terțe în efectuarea alegerii potrivite.
Locul de muncă reprezintă o etapă importantă din viața unei persoane, iar alegerea celui
potrivit nu este niciodată ușoară. Având la dispoziție un număr considerabil de tehnologii moderne,
gata de a fi explorate, m -am oprit la cele pe care le -am considerat a fi potrivite pentru a cr ea un
produs practic si ușor de utilizat.
Având ca sursă de inspirație exemplele folosite la secțiunea 2.1., am hotărât să -mi îndrept
atenția asupra unei abordări diferite . Folosind resurse puține și o viteză foarte mare de actualizare
a datelor, în timp real, am realizat o implementare mai ușor de înțeles și folosit de către orice tip
de utilizator. Numele aplicației, Rate A Job9, simbolizează unul dintre obiectivele aplicației, acela
de a-i ajuta pe ceilalți împărtășindu -ți părerea personală, prin îndemn ul pe care îl transmite.
9 Traducere din e ngleză : Oferă o notă unui loc de muncă
18
Capitolul 2 – Tehnologii folosite
2.1. Android
Android este un sistem de operare, dezvoltat pentru dispozitive precum „telefoanele
inteligente”10 , tablete, televizoare și multe altele , bazat pe nucleul Linux . Interfața vizual ă
interacționează cu utilizatorul prin manipulare directă, folosind acțiuni bazate pe atingere.
Aplicația urmează a fi folosită pe un dispozitiv mobil iar de aceea am ales să folosesc ca
tehnologie principală pe cea oferită de către Google, Android, deoarece poate face posibil acest
lucru într -un mod eficient și bine organizat.
2.1.1. Istoric
Sistemul de operare Android a fost creat de către Android Inc. și cumpărat în anul 2005 de
către compania multinațională de origine americană , Google Inc .. Acest sistem de operare și -a
făcut apariția pe piață pentru prima dată la data de 5 noiembrie 2007 , fiind înființat odată cu
lansarea sa și consorțiul comercial Open Handset Alliance, alcătuit din 48 de companii de
hardware, software și de telecomunicații, consacrat dezvoltării de standarde deschise pentru
dispozitive mobile.
În septembrie 2008 se pune în v ânzare primul dispozitiv mobil care utilizează Android , iar
în luna următoare, a aceluiași an, devine disponibil ca Open Source11, sub licența Apache. Mai
exact, o mare parte a codului poate f i folosită și modificată pentru a servi modului de funcționare
ales de dezvoltator. [9]
10 Smartphone , limba engleza;
11 Termenul „ cu sursă deschisă ” descrie practica de a produce sau dezvolta anumite produse finite, permițând
accesul utilizatorilor să acționeze liber asupra procesului de producție sau dez voltare
19
2.1.2. Interfața utilizatorului12
Utilizatorul sistemului de operare Android, precum și al aplicațiilor instalate, relaționează
cu acestea prin intermediul dispozitivului , cu ajutorul interfeței , care este bazată pe tehnica
manipulării directe. Această tehnică se folosește de comenzi tactile ce corespund cu acțiuni reale,
cum ar fi glisarea sau apăsarea, pentru a manevra obiectele desenate, de către sistem, pe ecranul
dispozitivului. Android ofer ă posibilitatea utilizării unei tastaturi virtuale care ajut ă la introducerea
de date de tip text.
Sistemul de operare pune la dispoziție o serie variată de componente care permit
dezvoltatorului personalizarea aplicației și crearea interfeței grafice. Interfața utilizatorului pentru
o aplicație Android este co nstruită folosind o ierarhie de layout -uri (obiecte de tip ViewGoup ) si
widget -uri (obiecte de tip View , de exemplu, butoane sau c âmpuri text ). Layout -urile sunt
containere invizibile care contro lează așezarea copiilor, obiecte de tip View , pe ecran. [10]
Fig.11 Aranjare a elementelor grafice, în ordine ierarhică
Schema de mai sus reprezintă un exemplu de aranjare al elementelor grafice, în ordine
ierarhică. Pentru realizarea acestor grupuri de View -uri, Android pune la dispoziție un vocabular
XML pentru clasele View si ViewGroup . Așadar, majoritatea fișierelor ce compun interfața
grafică sunt de tip XML .
12 Prescurtat UI, USER INTERFACE , in limba engleză
20
2.1.3. Java
Java este un limbaj de programare orientat pe obiecte foarte utilizat, ușor de înțeles și
învățat. Apărut la mult timp după C și C++ a fost creat ca limbaj independent de platformă care
folos ește mașini virtuale.
Chiar dacă au fost implementate o sumedenie de funcționalități puternice ale vechilor
limbaje , librăriile destinate dezvoltatorilor au modernizat procesul, micșorând timpii de dezvoltare.
Este considerat unul dintre cele mai citeț scrise limbaje de programare, astfel încât acțiunile
executate pot fi înțelese chiar și de o persoană fără cunoștințe în domeniu. [11]
Acesta este un avantaj pentru platforma Android deoarece atrage mulți dezvoltatori să-și
pună la încercare creativitatea.
Fiind independent de platformă, Java permite dezvoltarea Android în condiții optime
indiferent de dispozitivul pe care acesta rulează. Astfel platforma Android a putut fi împărtășită
lumii cu sursă deschisă.
2.1.4. Dezvoltarea unui proiect Java pentru Android
După ce un program este scris în Java pentru Android, urmează să fie transforma t într -un
alt format pentru a f i înțeles de către sistem. A cest proces de transformare se numește compilare ,
iar noul format, cod Executabil Dalvik (DEX)13. Partea sistemului Android care execută codul
compilat, DEX, se nu mește Mașină Virtuală Dalvik (DVM)14. DVM este o componentă
software, scrisă în alt limbaj, care rulează pe o versiune adaptată a sistemului de operare Linux.
Scopul DVM este acela de a ascunde complexitatea și diversitatea componentelor de
hardware și software cu ajutorul cărora rulează Android, dar în același timp, de a scoate în evidență
toate caracteristicile utile. Pentru ca acest lucru sa fie posibil, DVM are nevoie de acces la
componentele hardware, ceea ce se întâmplă, dar permisiunea trebuie s ă fie, î n același timp , ușor
de folosit de către programator.
Producătorii de dispozitive Android și de componente pentru acestea, trebuie să se asigure
ca produsele hardware oferite vor putea rula fără probleme pe sistemul de operare Linux. Modul
13 Dalvik EXecutable , prescurtat DEX, în limba engleză;
14 Dalvik Virtual Machine , prescurtat DVM, în limba engleză;
21
în care DVM oferă acces dezvoltatorilor este ușor de utilizat datorită API15-ului pus la dispoziție
de către Android. API reprezintă un set de definiții de sub -programe, protocoale și unelte pentru
programarea de aplicații și software.
Codul Java compilat , împreun ă cu alte resurse, vor fi împachetate într -un fișier denumit
APK16 și trimis către DVM pentru a -l executa, astfel funcționalitățile aplicației devenind accesibile
de către utilizatorul dispozitivului ce folosește Android ca sistem de operare. [12]
Fig.12 Procesul de transformare al
codului sursă într -o aplicație Android17
2.1.5. Resurse Android
Un proiect Android reprezintă mai mult decât o mulțime de cod Java. Așa cum am
specificat mai sus, interfața utilizatorului necesită, la rândul său, o multitudine de alte fișiere.
Aces te fișiere sunt cunoscute drept resurse Android și sunt sto cate separat de cele c are conțin
codul Java.
Aceste resurse pot fi imagini, sunete, layout -uri pentru UI sau chiar fișiere XML care conțin
informații despre anumite dimensiuni prestabilite, ale elementelor grafice, teme sau chiar coduri
pentru culori.
15 Application Programming Interface
16 Android Application Package
17 Imagine inspirată din cartea Android Programming for Beginners, de John Horton, capitolul 1
22
Ele vor include, de al tfel, și datele de tip text folosite în aplicație. Este recomandată
păstrarea lor în fișiere diferite de cele Java , deoarece le fac ușor de modificat. Avantajul este cel
mai ușor observabil în momentul în care dezvoltatorul dorește să cre eze o aplicație care să poată
fi folosită în mai multe limbi.
2.1.6. Baza de date – SQLite
În unele cazuri, aplicațiile Android oferă utilizatorului multiple funcționalități ce presupun
jonglarea cu cantități mari de date, iar din aceasta cauză dezvoltatorul este nevo it sa recurgă la o
măsură prin care s ă poată stoca, administra și filtra aceste informații. Android folosește sistemul
de administrare al baze i de date SQLite și pune la dispoziție chiar și un API, pentru a ușura munca
programatorului.
SQLite este o baz ă de date open source care suportă funcționalități standard ale unei baze
de date relaționale, ca de exemplu, sintaxă, tranzacții și declarații SQL18. Spre deosebire de
majoritatea sistemelor de administrare ale unei baze de date, SQLite nu este o baz ă de da te de tip
client -server19 ci este încorporată în sistemele care o folosesc. Din această cauză oferă un spațiu
mai mic de stocare, dar suficient pentru o aplicație Android.
SQLite este prezentă pe orice dispozitiv care rulează pe sistemul de operare Android și nu
necesită intervenția dezvoltatorului de aplicații mobile pentru a o administra. Pentru a o putea
utiliza, tot ce are acesta de făcut este definirea unor declarări SQL pent ru crearea și actualizarea
bazei de date, deoarece sistemul de operare se ocup ă automat de restul operațiunilor ce asigură
funcționarea ei în parametrii normali. [13]
18 Structured Query Language
19 Modelul client -server este o structură sau arhitectură aplicație distribuită care partajează procesarea între
furnizorii de servicii numiți servere și elementele care solicită servicii, numite clienți
23
2.1.7. Mediu l de dezvoltare
Android Studio este un mediu de dezvoltare integrat20 care asigur ă toată complexitatea
compilării codului și îl corelează la JDK și API -ul Android -ului. Un mediu de dezvoltare reprezintă
posibilitatea dezvoltatorului de a avea la îndemână, pregătit într -un singur loc, tot ce are nevoie
pentru implementarea ideilor sale.
Pentru dezvoltarea unui proiect Android este nevoie de o mulțime de instrumente de
programa re și Android API. Pachetul format, în urma arhivării acestora într -un singur loc, este
cunoscut sub numele de kit de dez voltare software21.
Pentru a putea începe lucrul cu acest IDE, dezvoltatorul trebuie să se asigure că există
instalat și configurat JDK, pe același calculator pe care urmează să creeze proiectul Android. Odată
instalat , Android Studio vine împreună cu Android SDK , pregătit pentru utilizare .
2.1.7.1 Crearea unui pachet de aplicație Android (APK) prin intermediul Gradle
Siste mul de construcție al executabilului folosit de Android compilează codul sursă și
resursele aplicației pe care le împachetează într -un APK ce va fi utilizat pentru testare, instalare ,
semnare si distribuire. Android Studio folosește Gradle, o unealtă avansată de construire a
executabilelor, pentru a automatiza și gestiona întregul proces, permițând dezvolta torului să
definească configurații personalizate flexibile.
Fiecare configura ție a executabilului poate defini propriul set de cod și resurse, în timp ce
refolose ște părțile com une tuturor versiunilor aplica ției. Extensia Android pentru Grandle
funcționează cu uneltele folosite de executabil pentru a asigu ra procese si set ări configurabile care
sunt specific e pentru construirea și testarea aplica țiilor Android.
Grandle și extensia Android se execută independent de Android Studio , astfel dezvoltatorul
poate realiza aplica țiile Android în afara Android Studio , liniilor de comand ă de pe calculator sau
sistemelor de operare unde Android Studio nu este instalat.
20 Integrated Development Environment , prescurtat IDE, in limba engleză
21 Software Development Kit , prescurtat SDK, in limba engleză
24
Flexibilitate sistemului de execuție în Android , permite realiz area configura țiilor
personalizate f ără să necesite modifica rea fișierelor de baz ă ale aplica ției. Procesul de creare a unui
pachet de aplicație Android are loc în 4 pași (Fig.13) :
1) Compilatorul convertește codul sursă în fișiere DEX iar pe restul în resurse compilate;
2) APK Packager combină fișierele DEX si compilează resursele într -un singur APK;
3) APK Packager semnează executabilul folosind una dintre cele dou ă chei, de testare
respectiv de lansare, cea din urmă fiind generată prin intermediul unei unelte , ale Android
Studio , de cătr e dezvoltator . Pentru ca APK -ul să fie funcțional, el trebuie obligatoriu
semnat;
4) Înainte de generarea produsului final, este folosit un arhivator, zipalign , pentru optimizarea
spațiului ocupat de APK pe dispozitiv. [14]
Fig.13 Procesul de creare al fișierului executabil APK
cu ajutorul Gradle
2.1.8. Librării Android
Librăriile Android, sau API -urile specificat anterior , reprezintă un set de definiții de sub –
programe, protocoale si unelte, cu diverse funcționalități, create pentru a ușura munca
programatorului. Co nform Fig.12, putem observa că exist ă două tipuri : implementate în sistemul
de operare, construite peste nucleul Linux și cele din codul sursă al proiectului .
25
Librăriile care fac parte din sistem, oferă func ționalitățile principale , necesare oricărei
aplicații. Dintre acestea fac parte, spre exemplu, cele ce gestionează lucrul cu bazele de date,
SQLite prezentate anterior, cele ce furnizează utilizarea de socket -uri securizate bazate pe
protocolul SSL, dar și librăria standard C.
Cea de -a doua categorie, cuprinde un set de librării opționale, folosite doar în cazul
implementării unor funcționalități care pot aduce îmbunătățiri aplicației, atât pe partea de interfața
grafică, cât și la nivel de run-time22. Android SDK vine la pachet cu un set de librării, denumit
Support Library , create și îmbun ătățite pentru utilizarea lor în funcție de versiunea platformei
Android.
Cel mai mare beneficiu pe care aceste librării îl pot aduce îl constituie faptul că reduce, cu
mult, timpul de dezvoltare. În continuare voi prezenta setul de librării utilizate în construirea
acestei lucră ri, de unde voi exclude pe cele support și pe cele utilizate pentru implementarea
Firebase, despre care vom discuta in subc apitolul următor .
2.1.8.1 Iconify și Font Awesome
În primul rând, Font Awesome este un font de text scalabil, bazat pe imagini , care poate fi
personalizat foarte rapid . Utilizarea acestui font pentru câmpurile de tip text cu valoarea unui cod,
o va transforma în imaginea din pachetul Font Awesome corespunzătoare (Fig.13.1) . [15]
Nevoia utilizării librăriei Iconify am resimțit -o în momentul în care am avut nevoie de
transformarea imaginii sub forma de text într -un obiect de tip Drawable23 (Fig.13.2) . Iconify
oferă o colecție foarte vast ă de imagini vectoriale și metode intuitive pentru adăugarea și
personalizarea lor într -o aplicație Android. [16]
Typeface tf = Typeface .createFromAsset (getContext().getAssets() ,
"fontawesome -webfont.ttf" );
setTypeface(tf) ;
Fig.1 4.1 Utilizarea fontului Font Awesome pe un TextView
22 Procesul de execuție al aplicației
23 Drawable = “ceva care poate fi desenat”, poate lua mai multe forme, în funcție de elemental grafic căruia îi este
destinat
26
public static IconDrawable getFADrawable (Context context , FontAwesomeIcons icon , int
colorId) {
FontAwesomeIcons faIcon = icon ;
IconDrawable drawable = new IconDrawable(context , faIcon)
.colorRes(colorId)
.actionBarSize() ;
return drawable ;
}
Fig.1 4.2 Metodă statică folosită pentru transformarea unei imagini tip text Font Awesome
într-o imagine tip Drawable , în funcție de cod si culoare
2.1.8.2 Volley
Volley este o librărie HTTP care asigură o ușoară implementare a rețelelor pe ntru platforma
Android, dar cel mai important creștere a vitezei de efectuare a acțiunilor din cadrul acestora. O
parte din avantajele pe care le oferă :
• Programarea automată a solicitărilor de rețea;
• Conexiuni de rețea multiple, executate simultan;
• Ajutor în prioritizarea solicitărilor către server;
• Ajutor în anularea apelurilor către server;
• Instrumente de depanare;
• Ordonare bine stabilită, care asigura o metoda ușoară de populare corectă a interfeței cu
datele extrase asincron din rețea. [17]
Motivul pentru care am folosit această librărie a fost acela de a încărca imaginile, cu valoare
de tip referință web, în elementele de interfață corespunzătoare. (Fig.14)
cimv.setImageUrl(uri.toString() , RateAJob. getInstance ().getImageLoader()) ;
Fig.1 5 Modul în care am asociat URL -ul unei imagini cu elementul de interfață
27
2.1.8.3 Android -Image -Cropper
Android -Image -Cropper este o librărie creată pentru a oferi dezvoltatorilor o mână de
ajutor când vine vorba de decuparea unei fotografii. Poate fi implementată atât ca element de
interfață în aplicație, cât și separat. Librăria poate decupa simplu sau în funcție de anumite forme
personal izate și oferă posibilitatea de rotire sau apropiere a imaginii, totul într -o manieră optimă.
[18]
Utilizând aplicația pe car e această lucrare urmărește a o implementa, se poate observa
utilitatea acestei librării în momentul ale gerii unei fotografii de profil. Procesul presupune pornirea
unei activități implementate in corpul librăriei, care returnează fotografia aleasa, în func ție de
proprietățile dorite. (Fig.15)
private v oid onGoToImagePicker () {
CropImage. activity ()
.setCropShape(CropImageView.CropShape. RECTANGLE )
.setFixAspectRatio( true)
.setMinCropResultSize( 100, 100)
.start(getContext() , this);
}
Fig.1 6 Pornirea unei activități de alegere și decupare a imaginii,
parte din corpul librăriei Android -Image -Cropper
2.2. Firebase
Firebase este o platformă de dezvoltare pentru aplicațiile destinate dispozitivelor mobile și
web. Compania care a creat platforma a fost înființată de către Andrew Lee și James Tamplin în
anul 2011 ș i cumpărată de Google în 2014.
Produsul inițial al Firebase ofe rea o bază de date actualizată în timp real care permitea
dezvoltatorilor să stocheze și să sincronizeze datele între clienți multipli. Odată cu trecerea
timpului a evoluat, oferind servicii multiple, cele mai importante fiind baza de date în timp real,
serviciul de autentificare a aplicațiilor ce folosesc Firebase și spațiul oferit pentru găzduirea
domeniilor web. [19]
28
În acest proiect am folosit baza de date în timp real . În primul rând datorită timpilor foarte
scurți prin care proprietățile elementelor se actualizează, chiar și atunci când mai mulți utilizatori
acționează asupra lor. În al doilea rând, folosesc serviciul de înregistrare al utilizatorilor .
Important de punctat este fap tul că Firebase oferă ș i un spațiu de stocare pentru fișierele
adiționale, de exemplu imagini sau fișiere media, pe care îl folosesc în acest proiect.
2.2.1. Baza de date NoSQL
Baza de date oferită de Firebase este de tip NoSQL și salvată pe cloud . NoSQL acoperă o
gamă largă și variată de tehnologii, dedicate bazelor de date, create pentru a veni în ajutorul
construirii aplicațiilor moderne.
Dezvoltatorii lucrează la aplicații ce necesită actualizarea rapidă și continuă a unor volume
masive de date, structurate, semi -structurate, nestructurate sau polimorfe. Aplicațiile sunt
construite în echipe mici care lucrează in sprint -uri Agile, adăugând și modificând bucăți de cod,
în intervale de timp relativ scurte, iar organizațiile apelează la structuri arhitecturale care folosesc
software open source , servere de mărfuri și cloud computing .
Proiectele care serveau unor audiențe finite, au evoluat, devenind servicii accesibile pe o
mulțime de dispozitive, de către milioane de utilizatori, astfel fiind necesară funcționarea lor în
permanență. Bazele de date de tip NoSQL au apărut datorită nevoi i de satisfacere a nevoilor
prezentate anterior, deoarece bazele de date relaționale nu puteau face față cerințelor aplicațiilor
moderne.
Majoritatea bazelor de date folosesc apeluri HTTP pentru schimbul de informații cu
clientul și oferă acces asupra dat elor doar atunci când este solicitat. Firebase, spre deosebire de
acestea, nu comunică prin intermediul obișnuitelor apeluri HTTP, ci comunică cu clientul prin
intermediul unui WebSocket . Acesta este un protocol24 de comunicare ce reprezintă o variantă
mult mai rapidă decât HTTP, precizat anterior .
Așadar, dezvoltatorul nu este nevoit să creeze apeluri individuale către WebSocket ,
pentru fiecare cerință în parte, deoarece o singură conexiune la socket este de ajuns. Această
24 Set de reguli
29
conexiune asigură sincronizarea a utomată a tuturor datelor , la viteza maximă admisă de client,
astfel că procesul se realizează aproape instantaneu . [20]
2.2.2. Autentificarea utilizatorilor (Firebase Auth)
Aplicațiile, în cele mai multe cazuri, au nevoie de a oferi utilizatorului o experiență
personalizată, indiferent de dispozitivul pe care este folosi tă, de către aceeași persoană.
Pentru a face acest lucru posibil, este necesară cunoașterea identității utilizatorului. Odată
obținută, persoana în cauză își poate menține sincronizate datele, în timp real, pe fiecare dintre
dispozitivele sale.
Serviciul de autentificare oferit de către Firebase este de tip email și parolă. Suporta, de
altfel, și înregistrare cu Google, Facebook, Twitter si GitHub cu ajutorul protocolului OAuth2.
Fig.1 7 Reprezentare grafică a compatibilității Firebase
cu diverse rețele de socializare25
În urma înregistrării, un nou câm p de tipul utilizatorului va fi înregistrat în baza de date.
La fiecare autentificare , serviciul generează un token specific sesiunii în curs, cu ajutorul căruia
dezvoltatorul poate utiliza informațiile necesare comunicării cu utilizatorul. [21]
25 Sursă imagine: https://firebase.google.com/docs/auth/
30
2.3. Node.js
Internetul sau Web -ul reprezintă un sistem global complex de rețele și servere
interconectate, care folosesc un set de reguli standard, TCP/IP. Într -un sistem complex,
interacțiunea și colaborarea dintre componentele sale prezintă principalele structuri atunci când
accentul se pune pe eficiență.
Browser -ele comunică cu serverele printr-un alt protocol standard numit HTTP. Datorită
dorinței rapide de comunicare în timp real și a evoluției rapide a web -ului, serverele ce utilizează
HTTP au avut nevoie de o î mbunătățire. O soluți e eficient ă o reprezintă Node.js. [22]
Node.js a fost scris de către Ryan Dahl in anul 2009 și lansat ca produs compatibil cu
sistemele de operare Linux și Mac OSX, iar în 2011, cu ajutorul Joyent Inc., și pentru Microsoft
Windows. [23]
A fost construit pe V8 – procesor (interprotor) JavaScript26, oferit de Google, deoarece
este open source și sub licența BSD27 dar și extrem de rapid. De altfel, JavaScript , fiind un limbaj
de programare foarte răspândit, a ajutat proiectul Node.js să fie ușor accesibil întregii comunități
web. [24]
Creatorul Node.js, Ryan Dahl, nu a fost, inițial, foarte impresionat de folosirea JavaScript
ca limbaj de programare pentru proiectul său, el fiind programator C, dar, în urma analizării mai
multor factori, a decis că era exact ceea ce avea nevoie. Principala utilizare a Node.js constă în
construirea programatic ă a rețelelor, de exemplu serverele Web. [25]
Există o mare diferență între Node.js și PHP. Majoritatea metodelor în PHP blochează
parcurgerea către următoarele acțiuni cât timp rulează cea curentă, astfel comenzile se execută
succesiv. Metodele în Node.js, pe de alt ă parte, a u fost proiectat e să fie non-blocking28, comenzile
executându -se în paralel și folosind callback29-uri, care anunță sfârșitul executării acțiunii , cu
succes sau eșec. [23]
26 Program care execută cod JavaScript
27 Berkeley Software Distribution
28 Lb. engleză, “care nu blochează”
29 Orice cod executabil care este pasat drept parametru către altă structură de cod, de la care se așteaptă executarea
parametrului la o anumită perioad ă de timp
31
2.3.1. Lucrul cu thread -uri
Node.js funcționează pe un singur thread30 folosind, așa cum am precizat anterior, apeluri
I/O (de intrare/ieșire) non-blocking (fără blocare), asincrone . Mai exact, fiecare operație adresat ă
aplicației, cum ar f i accesul la rețea sau la un alt proces, poat e avea atașată o funcție de tratare a
unui eveniment specific. [26]
Astfel permite funcționarea zecilor de mii de conexiuni concurente. Metoda de împărțire a
unui singur thread între toate cererile urmărește construirea aplicațiilor foarte complexe, unde
fiecare metodă care efectuează apeluri I/O să folosească un callback . Pentru acomodarea cu
evenimentul repetitiv pe un singur thread , Node.js utilizează librăria libuv , care este responsabilă
de o parte din operațiile I/O asincrone. [27]
Execuția sarcinilor în paralel este manipulat ă de către un thread pool . Acesta este un model
de proiectare software care administrează o multitudine de thread -uri ce așteaptă sarcini pentru a
fi executate. O metodă comună de programare a sarcinilor este o coadă sincronizată, cunoscută și
sub numele de coadă de sarcini . Aceste sarcini vor f i mutate într -o lista de sarcini efectuate după
execuție. [28]
Revenind la Node.js, când un thread își termina de executat sarcina, acesta informează
thread -ul principal, prin intermediul callback -ului, pe care îl execută în consecință.
Fig.18 Exemplu de thread pool
cu sarcinile în așteptare(albastru) și cele complete(galben) 31
30 Conceptul de thread, sau fir de execuție, este folosit pentru a eficientiza execuția programelor, executând porțiuni
distincte de cod în paralel în interiorul aceluiași proces
31 Sursă imagine: https://en.wikipedia.org/wiki/Thread_pool#cite_note -3
32
2.3.2. Heroku
Heroku este o platformă , sub forma unui serviciu32, de găzduire , folosită ca model de
implementare pentru aplicațiile web. A fost una dintre primele platforme de găzduire create, fiind
adoptată de către dezvoltatori începând cu anul 2007 . A fost fondat de către James Lindenbaum,
Adam Wiggins și Orion Henry. În primă fază, serviciul era dedicat doar pentru Ruby dar a fost
adap tat pe parcurs, pentru a suporta mai multe limbaje, printre care și Node.js.
Heroku este ca un loc de cazare pentru aplicații pe internet. Funcționează asemănător cu
serviciile de găzduire al site -urilor web , care le păstrează în stare de funcționare, pe severele
proprii, și care conferă accesibilitate utilizatorilor pentru interacțiunea cu acestea.
Codul sursă și descrierea proiectului sunt construite pe un framework , oferit de către
Heroku, care le convert ește într -o aplicație. Mecanismul de dependență, adică fișierele specifice
fiecărei tehnologie în parte, va varia în funcție de limbajul folosit. [29]
Procesul de execuție este unul simplu, executându -se cu ajutorul unui fișier l ocalizat în
codul sursă, pe nume Procfile . Pentru ca sistemul să știe ce trebuie executat, dezvoltatorul nu
trebuie decât să introducă, în acest fișier, referințe către părțile respective ale proiectului.
Aplicațiile ce rulează de pe un server Heroku folosesc Heroku DNS Server pentru
direcționarea către domeniul său. Fiecare recipient al aplicației, altfel numit, dyno , este răspândit
pe o “grilă de dyno -uri” care constă în mai multe servere.
Pentru executarea aplicației, Heroku va porni un dyno , încăr cat cu o copie funcțională a
aplicației, și va executa comenzile declarate în fișierul Procfile. În momentul în care se actualizează
aplicația cu o nouă v ersiune, toate dyno -urile vor f i oprite și vor porni automat unele noi, încărcate
cu noua versiune a a plicației pentru a le înlocui pe cele vechi. [30]
32 Platform as a service (PaaS)
33
Fig.1 9 Funcționalitatea platformei Heroku
sub forma unei diagrame 33
2.4. Concluzie
Uneltele prezentate anterior vor fi necesare pentru dezvoltarea produsului final, subiectul
acestei lucrări . Utilizarea lor va rezulta un proces de lucru în tandem, fiecare componentă având
rolul s ău pentru o bună funcționare a aplicației.
Când vine vorba de alegerea instrumentelor necesare pentru crearea unui nou proiect , este
recomand ată o atenție sporită , pentru eficientizarea timpilor de răspun s rezultat din comunicarea
acestora. În urma unui studiu de piață al noilor tehnologii, uzuale printre dezvoltatori, am ajuns la
concluzia că cele trei enumerate mai sus pot fi alegerea potrivi tă nevoilor mele.
Astfel am decis ca sistemul de operare care va interacționa direct cu utilizatorul va fi
Android datorită răspândirii sale, a optimizării sistemului dar și accesibilității prețului. Faptul că
este compatibil cu aproape orice componentă hardware sporește ra ta de utilizare a aplicației printre
posesorii dis pozitivelor.
Firebase a fost o alegere surprinzător de plăcută datorită documentației bine structurate ce
m-a ajutat să -i descopăr tainele utilizării sale. Cu o viteză mare de răspuns și a modului de lucru
specific unei baze de date tip NoSQL, am reușit să integrez o aplicație cu câmpuri de date ce se
actualizează în timp real .
33 Sursă imagine : https://en.wikipedia.org/wiki/File:ArchitectureHeroku.png
34
Utilizarea Node.JS a apărut din necesitatea unei metode de calcul suplimentar ă pentru
procesarea informațiilor utile pentru persona lizarea recomandărilor specifice fiecărui utilizator.
Acest server va comunica cu baza de date construită cu Firebase și va pregăti recomandările pentru
a fi livrate către aplicație.
35
36
Capitolul 3 – Prezentarea tehnică a aplicației
Această lucrare are ca obiectiv crearea unei aplicații mobile, denumit ă Rate A Job,
destinată telefoanelor inteligente care folosesc sistemul de operare Android. Implementarea se va
realiza cu ajutorul tehnologiilor p rezentate în capitolul precedent . Produsul final a fost urcat pe
platforma magazinului de aplicații Google Play și poate fi achiziționat gratuit de către utilizatorii
cu dispozitive compatibile.
În continuare voi prezenta modul de lucru, la comun, al instrumentelor folosite și
funcționalitățile create cu ajutorul acestora. Printre funcționalități se numără crearea unui cont de
utilizator, afișarea companiilor și a locurilor de muncă în liste de el emente, conform anumitor
parametrii, actualizarea datelor în timp real și multe altele.
Un loc în subcapitolele următoare, important de precizat, îl ocupă algoritmul sistemului de
recomandări. Acesta a fost creat cu scopul de a întinde o mână de ajutor ut ilizatorilor nehotărâți ,
cu privire l a locul de muncă unde, probabil, s -ar integra, sau a celor interesați de mai multe
oportunități echivalente unei alegeri deja luate . Modul său de lucru combină dou ă metode de
gestionare a informației pentru generarea re zultatelor, oferind astfel un răspuns mai exact.
Interfața utilizatorului cu o tem ă simplistă oferă o experiență plăcută fiind ușor de folosit.
Elementele de design sunt intuitive pentru acțiunile pe care acestea le efectuează . Ca punte
principală între utilizator și restul funcționalităților, interfața are responsabilitatea de a oferi
compatibilitate între acțiunea efectuată și rezultatul obținut. Rate A Job respectă aceste condiții,
fapt demon strat în subcapitolele dezbătute în continuare.
37
3.1. Descriere
Rate A Job este o aplicație care se poate încadra în mai multe categorii , social -informativă
și de comunicare. Acest lucru se datorează faptului că oferă utilizatorilor informații despre
elementele de interes, în cazul de față companiile și locurile de muncă din cadrul acestora, dar
asigură și interacțiunea atât între utilizatori construiți pe același model, cât și diferi. Mai exact
utilizatorii aplicației pot fi de două feluri: utilizator tip persoană34 și utilizator tip companie35.
Primul contact cu utilizatorul va avea în prim plan autentificarea acestuia cu un cont
personal (Fig.20.1). În cazul în care acesta nu există, utilizatorul poate alege opțiunea de
înregistrare. Primul pas presupune alegerea tipului de utilizator cu care i ntenționează să continue
(Fig.20.2). După finalizarea cu succes a procesului de înregistrare, acesta va continua utilizarea
aplicației conform alegerii făcute.
Fig.20.1 Fig.20.2
3.1.1. Utilizatorul tip companie
În urma deciziei de a continua ca reprezentant al unei companii, va crea un profil pentru
aceasta, înregistrarea constând într -un proces simplu prin introducerea numelui, adresei de mail cu
care va avea loc autentificarea și pa rola, de minimum 6 caractere , însoțită de o confirmare,
(Fig.2 1.1). Introducerea cu succes a tuturor datelor necesare va face posibilă înregistrarea.
34 În continuarea descrierii, voi face referire la utilizatorul tip persoană utilizând prescurta rea UTP.
35 În continuarea descrierii, voi face referire la utilizatorul tip companie utilizând prescurtarea UTC.
38
Fig.2 1.1 Fig.21.2 Fig.21.3
În urma înregistrării cu succes, cât și a autentificării, UTC va fi redirecționat pe pagina
profilului său (Fig. 21.2). În urma înregistrării, acest profil este inactiv și nu va apărea în sugestiile
sau listele de căutare ale UTP .
Reprezentantul companiei va fi obligat să completeze toate detaliil e obligatorii necesare
activării . Pentru informare asupra acestui lucru, se poate observa în imaginea de mai sus ( Fig.21.3)
un mesaj de alertă, scris cu roșu, cu scopul de a evidenția pașii necesari activării.
Pentru a putea edita și actualiza cu ușurință informațiile profilului am creat un element
vizual customizat , sub numele de UserInfoLayout . Acesta moștenește LinearLayout și
vine cu un pachet de elemente grafice pentru a putea fi dinamic modificate , în func ție de utilitatea
fiecărui a (pentru mai multe detalii consultați Anexa 1). Adăugarea sa în pagină se realizează printr –
o instanță (Fig.21.4.1) în fișierul XML al părintelui în care va urma să apară.
Actualizarea detaliilor necesită editarea a două tipuri de elemente vizuale , de tip
EditText . Câmpurile destinate editării de text au implementate un ascultător de tip
TextWatcher cu comportament personalizat, care detectează schimbările efectuate și afișează
opțiunile de actualizare sau anulare (Fig. 21.4.2).
Însă există un tip de câmp diferit, cel repartizat introducerii adresei. Acesta va începe
procesul de actualizare printr -un apel la Google Places, o librărie oferită de Google, folosită în
acest proiect ca unealtă de ajutor pentru căutarea și com pletarea corectă a adresei unui utilizator.
Acest apel deschide o activitate cu background transparent peste cea care este deja în uz (Fig.21.5).
39
<bdg.gabriel.rateajob.fragment.user.profile_data.widgets.UserInfoLayout
android:id="@+id/lly_name"
android:layout_width= "match_parent"
android:layout_height= "wrap_content"
android:inputType= "textPersonName"
app:infoHint= "@string/hint_company_name"
app:isRequired= "true"
app:viewTitle= "@string/company_name" >
</bdg.gabriel.rateajob.fragment.user.profile_data.widgets.UserInfoLayout>
Fig.21.4.1 Exemplu de adăuga re a UserInfoLayout pentru numele companiei
@Override
public void onTextChanged (CharSequence s , int start, int before, int count) {
if (s.toString().trim().equals( userInfoText .trim()) == false) {
setUpdateAvailable( true);
} else {
setUpdateAvailable( false);
}
}
Fig.21.4.2 Evenimentul de schimbare a conținutului un ui EditText
Mai departe se poate observa o bară de căutare a cărei rezultate vor fi foarte precise, acestea
provenind din baza de date a Google . Odată aleasă opțiunea dorită, câmpul de editare text asociat
adresei va prelua valoarea aferentă.
În urma completării detaliilor de tip text, pentru efectuar ea activării cu succes, UTC -ului
îi rămâne de încărcat imaginea de profil. Acesta va fi redirecționat, în urma efectuării
evenimentului de “click”, către pagina de selectare și editare a fotografiei preferate (Fig. 21.6).
Imaginea rezultată va fi redimensio nată la dimensiunea de 200x200px , într -un thread separat,
finalizat cu încărcarea în spațiul de stocare online al lucrării, oferit de Firebase.
Fig.21.5 Fig.21.6
40
Cea de -a doua componentă a profilului UTC este pagina cu locuri de muncă (Fig.22.1) .
Aceasta este compusă din 3 părți:
1. Nota finală obținută în urma voturilor acordate de către toți UTP;
2. Lista locurilor de muncă din cadrul companiei;
3. Adăugarea unui nou loc de muncă.
Notele și numărul comentariilor asociate locurilor de munc ă din listă, cât și nota finală,
sunt calcu late și actualizate în timp real, cu ajutorul Firebase. Pentru a adăuga un nou loc de muncă,
un dialog personalizat este activat (Fig.22.2) . De aici pot fi selectate categoria și numele noului
element, dintre opțiu nile disponibile în baza de date, ce urmează a fi adăugat în listă.
Această fereastră, susnumită dialog, este un element grafic ce apare în prim plan dar cu o
existență dependentă de cea a activității din care face parte, astfel că următoarele acțiuni ale
utilizatorului vor fi realizate în interiorul acestuia . Dialogul nostru dispune de un buton de ieșire
fără a salva modificările aduse și de unul care, intuitiv prin mesajul pe care îl transmite – ”Done”
sau ”Gata” în limba română, trimite noile modificări către baza de date.
În interiorul acestuia se regăsesc dou ă liste de elemente, înșirate orizontal. Prima este
compusă din opțiunile valabile pentru alegerea unei categorii de locuri de muncă, acestea fiind
încărcate ulterior în lista orizontală imediat următoare. O dată ales, locul de muncă în cauză va fi
adăugat în lista cu opțiunile companiei.
Fig.22.1 Fig.22.2 Fig.22.3
41
Pentru a interacționa cu utilizatorii, reprezentantul companiei poate selecta unul din
elementele disponibile în listă pentru a accesa pagina locului de muncă respectiv. De a semenea,
UTC -ul poate șterge din locurile de muncă din listă, mai exact referința către acesta din baza de
date. Locul de muncă își va păstra proprietățile și datele de legătură cu compania, pent ru o
eventuală realocare a sa în lista, dar nu va mai fi vizibilă utilizatorilor. Funcționează astfel pentru
a nu se pierde voturile și comentariile introduse până la acel mom ent.
Interschimbarea stării de valabilitate a unui post este o altă acțiune pos ibilă direct pe
elementele listei. Astfel reprezentantul companiei poate alege să permită sau nu unui UTP să aplice
pentru locul de muncă respectiv. Un callback va intercepta decizia luată și va înregistra schimbarea
în baza de date (Fig.22.4).
private void onApplicationStatusChanged (boolean isApplicationStatusOn){
Job mJob = mJobsList .get(position );
new SendStatusOpenForApplicationRequest(getJobApplicationStatusLis tener())
.execute(mJob , isApplicationStatusOn) ;
mJob.setApplicationStatusOpen(isApplicationStatusOn) ;
}
Fig.22.4
Utilizatorii care aplică pentru un post liber oferă reprezentantului companiei acces la
informațiile profilului său, implicit metode de a fi contactat. Toate aplicațiile vor fi înregistrate în
baza de date și primite de către UTC sub formă unei liste încărcate în fragmentul al 3 -lea,
componentă a profilului său (Fig. 22.3).
Lista este alcătuită din antete reprezentând locurile de muncă pentru care au fost
înregistrate aplicațiile, urmate de elemente asociate utilizatorilor care au solicitat ocuparea postului
vacant. Accesarea unuia dintr e aplicanți direcționează UTC -ul către o pagină mai detaliată a
competențelor și datelor de contact ale UTP (Fig.22 .4).
Pagina în cauză este împărțită în antetul cu date personale și o listă cu ap titudini ale
aplicantului. Pentru a iniția un contact cu acesta, UTC are la dispoziție un meniu care, odată activat,
scoate la iveală o serie de butoane de forma Floating ActionButton (Fig.22. 6). Fiec ărui
buton îi este asociată o informație de contact și o metodă de a o folosi, de exemplu, butonul căruia
îi este atribuit un număr de telefon va direcționa utilizatorul către inițierea unui apel telefonic .
În cazul unui aplicant considerat nepotrivit locului de muncă respectiv, reprezentantul
companiei poate al ege ștergerea aplicației pentru a nu -i mai fi afișată în listă. Cu toate acestea, în
42
Fig.22.5 Fig.22. 6
cazul în care o persoană decide să mai aplice o dată, o poate face fără, aplicația fiind reînregistrată
în opțiunile UTC.
3.1.2. Utilizatorul tip persoană
Spre deosebire de UTC, acesta beneficiază de mai multe funcționalități deoarece este
„actorul principal al acestei piese” iar ideea lucrării se conturează în jurul beneficiilor aduse acestui
tip de utilizator .
Înregistrarea UTP necesită același număr de parametrii ca și tipul de utilizator prezentat
anterior. Procesul este unul simplu si rapid, fiind nevoie de numai 4 rânduri completate (Fig.23.1)
– numele de utilizator, adresa de e -mail și o parolă introdusă de două ori pentru a evita o eventuală
introducere incorectă.
Succesul înregistrării noului utilizator în baza de date îl va redirecționa către pagina
principală. Aici găsim o listă compusă din două tipuri de elemente: recomandări , mai exact locuri
de muncă și companii diverse, încărcate din baza de date (Fig.23.2 & Fig.23.3) .
43
Fig.23.1 Fig.23.2 Fig.23.3 Fig.23.4
3.1.2.1. Căutarea unei compani i
Pentru a accesa o anumită companie din lista principală este nevoie uneori de multă căutare
manuală. Aplicația oferă utilizatorilor oportunitatea de a folosi o unealtă de căutare care va întoarce
rezultatele direct din baza de date, fără a fi deja încărcate în listă.
Bara de căutare este activată în momentul selectării iconiței ce reprezintă o lupă, din bara
de sus, denumită și ActionBar (Fig.24.1) , moment în care poate începe tastarea.
Fig.24.1 Fig.24.2 Fig.24.3
44
Căutarea va începe la 500 de milisecunde după terminarea tastării cuvântului în bara de
căutare (Fig.24.4). Această întârziere este folosită ca o măsură de siguranță pentru a determina
momentul în care utilizatorul a terminat de introdus textul dorit. Altf el căutarea s -ar face după
fiecare caracter introdus sau șters și s -ar efectua cereri inutile către baza de date.
Căutarea va returna câteva opțiuni într -un pop-up aflat imediat sub bara de căutare
(Fig.24.2). Pentru afișarea tuturor rezultatelor este nec esară selectarea butonului căruia îi este
asociată acțiunea de finalizare a introducerii textului și începerea căutării, din colțul dreapta -jos a
tastaturii.
Lista completă a rezultatelor va înlocui lista tuturor companiilor aplicând acest filtru de
căuta re (Fig.24.3) . În momentul închiderii sesiunii de căutare aceasta va reveni la normal urmând
comportamentul stabilit în momentul inițializării sale.
private SearchView.OnQueryTextListener getQueryTextListener (){
return new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit (String query) {
return false;
}
@Override
public boolean onQueryTextChange (String newText) {
if(newText.trim().equals( "")){
return false;
}
mSearchCompaniesHandler .removeCal lbacks(mSearchCompaniesRunnable );
mSearchCompaniesRunnable = getSearchTextChangedAction(newText , new On-
GetSearchResultsListener() {
@Override
public void onHandleResult (ArrayList<Company> mResult) {
onPopulateSearchSuggestionsAdapter(mResult) ;
}
});
mSearchCompaniesHandler .postDelayed( mSearchCompaniesRunnable , SEARCH_D E-
LAY);
return false;
}
};
}
Fig.24.4
45
3.1.2.2. Lista locurilor de muncă
În momentul în care utilizatorul a selectat compania dorită din lista principală va fi
redirecționat către pagina descriptivă a acesteia (Fig.25.1) . Pagina este alcătuită din 3 componente:
antetul , lista locurilor de muncă din cadrul acesteia și opțiunea d e adăugare a unei noi meserii.
Cel dintâi, antetul, este cartea de vizită a companiei accesate de către utilizator. Conține
informațiile necesare de contact pentru stabilirea unei convorbiri directe între cele două tipuri de
utilizatori. Spre exemplu , numărul de telefon sau adresa de mail pot fi folosite prin intermediul
altor aplicații deja instalate din sistem pentru acțiunile dorite, de apel, respectiv trimiterea unui
mail. Acțiunea cea mai importantă posibila din antet, la nivelul aplicației, const ă în adăugarea
votului pentru companie la modul general.
Inițial , o parte din informa țiile antetului sunt ascunse pentru a lăsa mai mult loc celorlalte
elemente din pagină. Acestea pot fi dezvăluite cu ajutorul unui buton de forma unei săgeți ,
orientate în jos și care își schimbă orientarea în funcție de vizibilitatea informații lor (Fig.25.2) .
Lista locurilor de muncă este compusă din elemente de tip CardView . Fiecărui element
din listă îi este asociat un callback pentru actualizarea numărului de comentarii și unul pentru
actualizarea numărului de voturi, în timp real. O singură secțiune nu beneficiază de aceste
callback -uri în același mod, anume elementul ”General” prezent în capătul listei cu rolul de a
discuta g eneralități privind compania. Acesta va fi prezent pentru orice companie chiar și fără un
moderator.
Voturile acestei secțiuni vor fi considerate cele globale, adică media tuturor voturilor din
aduse locurilor de muncă și numărul de persoane care au votat. Acțiunea de click efectuată pe unul
din elementele listei va direcționa utilizatorul către pagina de comentarii a locului de muncă
respectiv.
O modificare pe care UTP o poate aduce informațiilor companiei este adăugarea unui job
în lista deja existentă. Această acțiune este posibilă datorită faptului că nu toate companiile ce
alcătuiesc baza de date vor avea un reprezentant . Astfel utilizatorii aplicației vor dori să -și
împărtășească experiența cu postul ocupat și au nevoie ca acesta să facă parte din listă.
Adăugarea se va realiza cu ajutorul butonului plus din partea dreaptă -jos. În urma acțiunii
de cli ck acesta va declanșa un dialog cu două secțiuni principale: adăugarea locului de muncă și
interacțiunea utilizatorului cu acesta (Fig.25.3) . Prima parte este asemănătoare cu cea prezentă în
46
profilul companiei, formată din două liste orizontale pentru cate goriile disponibile și locurile de
muncă asociate acestora.
Cea de -a doua secțiune are ca scop determinarea legăturii dintre UTP și locul de muncă pe
care acesta dorește să -l adauge. Pentru finalizarea procesului de adăugare sunt obligatorii trei
informaț ii: statutul față de locul de muncă (fost angajat, actual angajat sau interesat pentru
angajare), programul de lucru aferent statutului ( part-time sau full-time) și nivelul cunoștințelor
(junior, mid sau senior).
Adăugarea cu succes a noului element se va finaliza cu direcționarea utilizatorului către
pagina locului de muncă respectiv unde poate începe să -și expună punctul de vedere.
Fig.25.1 Fig.25.2 Fig.25.3
3.1.2.3. Pagina de comentarii
Locul în care aceast ă aplicație își poate atinge scopul principal se află aici. Pagina de
comentarii sau pagina unui loc de muncă întrunește ambele tipuri de utilizatori pentru discuții și
împărtășire de opinii.
Ca primă condiție de utilizare a acestei zone de către un UTP e ste să furnizeze detalii despre
modul în care a interacționat sau intenționează sa o facă cu acest loc de muncă. Astfel că pentru
primul pas aplicația va servi un dialog destinat noilor utilizatori pe pagina locului de muncă
respectiv din cadrul companiei selectate anterior (Fig.26.1). Informațiile necesare sunt
asemănătoare cu cele furnizate în secțiunea a doua în contextul adă ugării , de către un UTP, a unui
nou loc de muncă pentru o companie , acțiune prezentată anterior .
47
Asemănător paginii anterioare găsim 3 componente folosite în alcătuirea acesteia: antetul,
lista de comentarii care compun conversația și spațiul destinat cre ări unui comentariu.
Pornind de la antet avem votul ca acțiune principală . Pentru a da o notă, utilizatorul trebuie
să apese pe elementul RatingBar din antet iar o fereastră se va deschide pentru acordarea notei
dorite (Fig.26. 2), un număr de la 1 la 5. Succesul înregistrării votului în baza de date va actualiza
în timp real și votul general vizibil altor utilizatori. În antet se regăsesc și informații despre acest
loc de muncă – abilitățile necesare și atribuțiile ce le revin angajaților (Fig.26. 3).
Fig.26 .1 Fig.26.2 Fig.26.3
Pentru adăugarea unui nou comentariu vom folosi elementul vizual de editare text, de tip
EditText , din josul paginii. Proveniența mesajului poate fi înregistrată în trei moduri: din
partea reprezentantului companiei, din partea utilizatorului de tip persoană și anonim trimis tot de
către UTP.
Opțiunea trimiterii mesajului cu car acter anonim are rolul de a permite utilizatorilor care
au o părere negativă să se exprime liber, fără a risca o concediere sau eventuale amenințări. Astfel
că, la prima încercare de a adăuga un comentariu, de la crearea acestei activități, un mesaj automa t
va fi afișat (Fig.26. 4). Rolul acestuia este de a înștiința utilizatorul că pentru dezvăluirea identității
este nevoie de o acțiune din partea acestuia, fiind setat inițial pe mod anonim.
Lista de comentarii , de tip RecyclerView , afișează elementele orie ntate spre dreapta
în cazul înregistrării acestuia de către utilizatorul actual al aplicației și pe partea stângă pe restul.
48
Cele 3 tipuri de mesaje specificate anterior se vor diferenția prin diferența de culori și numărul
detaliilor (Fig.26. 5).
Astfel că mesajele provenite de la un reprezentant al companiei vor fi scrise pe fundal alb
și fundal închis la culoare pentru recipientul părinte, însoțit întotdeauna de numele ”Company
Representant” . Comentariile provenite de la UTP vor fi scrise pe fund al închis la culoare și fundal
deschis pentru părinte.
Mesajele anonime vor oferi doar comentariul propriu -zis și data adăugării. Numele
utilizatorului fiind înlocuit de ”Anonymous User” iar poza de profil cu o imagine semnificativă
Fig.26.4 Fig.26.5 Fig.26.6
modului anonim. Comentariul înregistrat cu identitatea dezvăluită va afișa și detaliile importante
ca numele, poza de profil și interacțiunea cu acest loc de muncă ale utilizatorului.
Elementele listei sunt încărcate cu limită pentru a nu supraîncărca memoria dispozitivului,
îngreunându -i procesele. Astfel comentariile primite din baza de date vor ajunge în ordinea
crescătoare adăugării lor, într -un număr limitat, setat în aplicație.
În urma efectuării acțiunii de derulare a listei, callback -ul OnScrollListener ,
urmărește schimbările de vizibilitate a elementelor și se activează de fiecare dată când apar unele
noi (Fig.26.7) .
În cazul în care lista se apropie de ultimul element încărcat, se face un apel la baza de date
pentru a veri fica dacă mai există elemente de afișat în continuare, de asemenea cu aceeași limită.
Astfel încărcare listei va fi mult mai rapidă încărcând doar necesarul de informații.
49
private RecyclerView.OnScrollListener mScrollListener = new
RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged (RecyclerView recyclerView , int newState) {
super.onScrollStateChanged(recyclerView , newState) ;
}
@Override
public void onScrolled (RecyclerView recyclerView , int dx, int dy) {
super.onScrolled(recyclerView , dx, dy);
int visibleItemCount = mCommentsLayoutManager .getChildCount() ;
int totalItemCount = mCommentsLayoutM anager.getItemCount() ;
int firstVisibleItemPosition =
mCommentsLayoutManager .findFirstVisibleItemPosition() ;
boolean enoughUsersForPagination = isEnoughCommentsForSearch() ;
if (isUsersLoading == false && enoughUsersForPagination = = true) {
if ((visibleItemCount + firstVisibleItemPosition) >= totalItemCount) {
//Do pagination
onLoadMoreComments() ;
}
}
}
};
Fig.26.7
3.1.2.4. Aplicația de angajare
O funcționalitate cu impact puternic , regăsită în bara de titlu a paginii anterioare (Fig.26.6),
o constituie butonul de aplicare pentru locul de muncă respectiv. Această opțiune este valabilă
doar în cazul permisiunii acordate din partea companiei ofertante, așa cum s -a precizat în
subcapitolul anterior. Astfel că, pentru a fi posibilă aplicarea, este necesară existența unui
moderator pentru contul UTC -ului respectiv.
Acționarea acestui buto n va trimite utilizatorul către o pagină încărcată cu informații
extrase din profilul său (Fig.27.1). Această pagina servește ca model pentru modul în care îi va fi
înfățișată reprezentantului companiei.
În antetul paginii sunt încărcate datele de contac t iar imediat sub acesta se găsește o listă
compusă din aptitudinile utilizatorului. Pentru evitarea posibilității efectuării unei aplicații fără
date de contact, trimiterea acesteia către companie va fi restricționată în lipsa numelui, a numărului
de tele fon și a unei adrese de mail.
Așadar, după cum observăm în (Fig.27.2) absența informațiilor specificate anterior va
conduce la afișarea unor mesaje de eroare iar utilizatorul va fi nevoit să -și actualizeze datele
50
personale. Încercarea aplicării fără aces te detalii va activa o fereastră cu explicațiile necesare și
opțiunea accesării paginii de profil pentru actualizare (Fig.27.3) .
Înregistrarea cu succes a cererii va trimite utilizatorul pe pagina anterioară, însoțit de
înștiințarea prin intermediul unei alerte temporare.
Fig.27.1 Fig.27.2 Fig.27.3
3.1.2.5. Pagina de profil
Pagina de profil a UTP poate fi accesat ă prin intermediul meniului de acțiuni ascuns in
partea stâng ă (Fig.23.4) . Dezvăluirea acestuia va oferi posibilitatea utilizării unor acțiuni diverse.
Profilul utilizatorului este compus din 3 subcategorii :
1. Profilul propriu -zis: pagina în care se regăsesc și pot fi editate informațiile despre utilizator,
inclusiv imaginea de profil (Fig.2 8.1). Câmpurile marcate cu steluță sunt obligatorii procesului
de aplicare în vederea obținerii unui interviu, pentru un post vacant.
2. Pagina de activitate: aici se găsesc listate toate locurile de muncă și companiile cu care
utilizatorul a int eracționat, printr -un vot sau comentariu (Fig.2 8.2);
3. Aptitudinile: o listă raportată la locurile de muncă existente în baza de date. Ca parametru
suplimentar al fiecărui element din listă regăsim nivelul de cunoștințe al utilizatorului în
domeniul respectiv (Fig.2 8.3). Pentru adăugarea unei noi aptitudini se folosește butonul de
adăugare din partea dreapta -sus a paginii și selectarea opțiunilor corespunzătoare noului
element (Fig.2 8.4).
51
Toate detaliile care alcătuiesc profilul utiliz atorului sunt esențiale pentru găsirea
recomandărilor potrivite, fiind pe cât posibil diferite pentru fiecare. Informațiile personale r ămân
private pentru restul utilizatorilor, ele fiind accesibile doar companiilor în momentul aplicării
pentru un loc de m uncă.
Fig.2 8.1 Fig.2 8.2 Fig.2 8.3 Fig.2 8.4
3.2. Sistemul de recomandări
Scopul principal al aplicației este de a ajuta utilizatorii în căutarea unui loc de muncă.
Alegerea poate fi dificilă dacă presupune o căutare manuală prin lista companiilor returnate din
baza de date, apoi prin locurile de muncă ale fiecăreia în parte . Această acțiune se poate încheia
adesea fără rezultate mulțumitoare și poate crea impresia unei aplicații inutile, determinând
utilizatorii să renunțe la utilizarea ei.
Pentru a rezolva această problemă am decis să implementez un sistem de recomandări bazat
pe interese comune și activitatea utilizatorilor în contextul Rate A Job. Astfel orice acțiune devine
o componentă a profilului analizat ulterior pentru a găsi potriviri și a genera recomandări dinamice
și personalizate.
Metoda implementată în acest sco p constă în utilizarea tehnicii MinHash și a Similarității
Jaccard . Aceasta soluție urmărește transformarea informațiilor deținute despre utilizatori în seturi
de caracteristici pentru a găsi corelările necesare.
52
Sistemul de recomandări este predominant construit ca sistem bazat pe filtrare colaborativă
deoarece se bazează , în principal , pe informațiile procurate direct sau indirect de către utilizator.
Datorită faptului că se păstrează un profil de recomandare, fo losit ulterior pentru sporirea timpului
de execuție a generării rezultatelor, putem încadra soluția folosită pentru această lucrare ca fiind
bazată și pe filtrarea conținutului. Astfel putem considera metoda utilizată ca parte din categoria
sistemelor de r ecomandare hibride.
3.2.1. MinHash
În urma unor cercetări amănunțite [31] am descoperit că utilizarea seturilor cu semnătura
MinHash poate genera recomandări cu o acuratețe sporită în timp O(n). În general funcționalitatea
MinHash este folosită pentru eficientizarea stocării unei cantități mari de date . Eu m-am inspirat
din principiile acestei tehnici pentru a transforma activitatea ut ilizatorilor în mulțimi de date
reprezentative.
În demonstrația ce urmează voi nota locul de muncă cu JOB. Acesta este piesa de rezistență
a aplicației având câte o referință legată de fiecare acțiune a utilizatorului. Detaliile despre
utilizator în rapor t cu un loc de muncă, care vor contribui la determinarea recomandărilor, sunt în
număr de 5 . Elementele care vor compune mulțimea unui JOB pot avea și valoare nulă, în cazul în
care acestea nu există. Aceste elemente vor fi extrase din mulțimea valorilor posibile informației
respective , din mulțimile prezentate în continuare .
Ca prim parametru putem extrage o particularitate a abilităților utilizatorului, și anume
nivelul de cunoștințe, din mulțimea notat ă cu KLV36:
KLV = {n, J, M, S} ,
unde n reprezintă valoarea inexistentă iar celelalte reprezintă cele 3 nivele de stăpânire a
aptitudinilor – J = junior (începător), M = mid (mediu), S = senior (profesionist).
Un al doilea element pentru mulțimea unui JOB îl găsim în urma verificării int eracțiunii
utilizatorului cu locul de muncă respectiv, informație oferită în interiorul aplicației, în momentul
adăugării unui loc de muncă pentru o companie sau la prima accesare a unui loc de muncă din
cadrul unei companii.
36 KLV = knowledge level (nivel de cunoștințe)
53
Această interacțiune procură mulțimea care determină timpul de lucru, notat WT37:
WT = {n, PT, FT} ,
având ca elemente pe n – valoarea nulă, PT – valoarea care indică un program de lucru scurt (part –
time) iar FT – valoarea unui program întreg de lucru, ca număr de ore (full -time). Pe l ângă WT’
mai g ăsim ca proprietate un al doilea KLV’. Ca valoare finală pentru mulțimea JOB -ului,
reprezentând nivelul de cunoștințe , KLV’ va fi ales cel cu indicele nivelului de experiență mai
avansat.
Comentariile și voturile vor lua și ele parte la deter minarea recomandărilor. Voturile
reprezentate de valoare notei acordate de către utilizator iar comentariile prin validarea existenței.
Astfel avem mulțimea notată cu S compusă din valorile posibile pe care nota le poate lua:
S = {s | 0 ≤ s ≤ 5, s ∈ ℕ};
Mulțimea exis tenței comentariilor, notată COM este compus ă din doi membri :
COM = {0, 1},
astfel c ă 0 reprezintă lipsa introducerii vreunui comentariu de către utilizatorul în cauză iar 1 faptul
că a participat activ în conversațiile din cadrul locului de muncă.
Cea mai importantă component ă din mulțimea unui JOB care determină o valoare mai
precisă rezultatului recomandării, o extragem din mulțimea atribuită unei companii, mulțime
notată cu C și compusă din două elemente:
C = {n, C id},
cu n valoarea nulă și Cid codul unic de identificare al companiei , un șir de caractere . Acest id
împreună cu cel al JOB -ului vor avea rol de referință către compania, respectiv locul de muncă,
care va contura un element de tip recomandare.
În acest punct dispunem de toate mulțimile necesare construirii JOB -ului. Vom nota cu J
mulțimea de cinci elemente care definesc interacțiunea dintre un loc de mu ncă și un utilizator de
tip persoană.
J = {klv, wt, s, com, c },
unde klv ∈ KLV , wt ∈ WT, s ∈ S, com ∈ COM și c ∈ C.
Pentru a adăuga o doză de unicitate membrilor mulțimii nou create vom adăuga fiecărui
element al lui J codul unic de identificare al JOB -ului. În urma preluării fiecărui id al unui JOB și
37 WT = work time (timpul de lucru)
54
determinarea mulțimilor care -l compun, acesta urmează a fi adăugat în mulțimea de locuri de
muncă a utilizatorului . Notăm această mulțime cu U și este alcătuită din reuniunea produselor
carteziene dintre mulțimea JOB -urilor și id-ul, corespunzăto r.
U = ⋃ 𝑱𝒊 ×{𝒋𝒊𝒅𝒊}
𝟏≤𝒊≤𝒏
Așadar un utilizator U va fi compus din n rezultate ale interacțiunii sale cu un loc de muncă,
diferențiate prin codul unic al JOB -ului.
3.2.3 . Similaritatea J accard
Între similaritatea J accard și MinHash există o legătură impresionantă astfel încât
probabilitatea ca o funcție de minhash pentru o permutare aleatoare de linii să producă aceeași
valoare pentru două seturi este egală cu similaritatea Jaccard a mulțimii respective [31].
Așadar continuăm prin parcurgerea a n utilizatori în căutarea unei potriviri de minimum
60%, cu o valoare de minimum 0 .6 a indexului Jaccard. Am decis că o potrivire de peste 60%
reprezintă o valoare destul de mare încât s ă fie luată în calcul. Pentru a verifica aceast ă valoare
determinăm raportul dintre intersecția si reuniunea mulțimii utilizatorului care așteaptă
recomandări și a utilizatorului cu care se încearcă o potrivire :
𝐽(𝑈,𝑈𝑥)=|𝑈∩𝑈𝑥|
|𝑈∪𝑈𝑥|
unde U reprezintă mulțimea utilizatorul ui pentru care se caută pereche iar Ux potențialul utilizator
pereche.
Rezultatul raportului reprezintă indexul Jaccard cuprins întotdeauna între 0 și 1.
Procentajul de potrivire crește dinspre 0 spre 1, astfel că indexul 0 ne spune că nu există elemente
comune între mulțimile verificate, cu potrivire 0%, iar 1 că mulțimile sunt identice.
Pentru fiecare utilizator din baza de date se verifica potrivirea cu utilizatorul care are nevoie
de recomandări până în momentul găsirii a maximum 10 elemente. Indexul c u valoarea de
minimum 0,6 este considerat o potrivire și se continuă cu procesul de generare a recomandărilor.
55
Acestea vor fi, în esență, id-urile companiilor găsite în mulțimea elementelor care apar doar
Ux. În situația în care acest id este inexistent re zultă faptul că nici unul dintre utilizatori nu a
interacționat cu una dintre companiile prezente în aplicație. Pentru a genera mulțimea
recomandărilor din elementele unice ale U x , căutam toate elementele de forma produsului
cartezian dintre C și id-ul JOB-ului care aparțin diferențe i dintre U x și U și notăm cu R mulțimea
rezultată:
R = {r | r ∈ (C × J), r ∈ (Ux \ U)}
În cazul unui număr mai mic de 10 elemente rezultate algoritmul va căuta în continuare
încă un utilizator. Membrii mulțimii sunt de forma unei perechi ordonate compuse din două șiruri
de caractere, id-ul locului de muncă și cel al companiei.
Această listă de recomandări se actualizează la fiecare schimbare a unuia dintre elementele
de profil ale utilizatorului care influențează recomandările sau o dată pe zi, la inițializarea listei de
companii.
3.3. Structura bazei de date
Structura NoSQL utilizată de Firebase este construită în format JSON iar orice schimbare
asupra datelor înștiințează dispozitivele și platformele active ce creează o sincronizare în timp real.
Arborele JSON rezultat în urma colectării informațiilor trebuie planificat astfel încât să fie evitate
„cuiburile” de informații .
În momentul accesării unui nod al arborelui, sunt primite ca rez ultat toate nivelurile sale ,
fapt care ar putea îngreuna timpul de răspuns în cazul numărului mare de noduri care alcătuiesc
„cuibul ”. De altfel reprezintă și o breșă de securitate deoarece oferă acces la o cantitate mare de
date.
Observăm în Fig.29.1 co rpul unui comentariu acordat de către un utilizator – identificat
prin „userId”, unui loc de muncă – identificat prin „jobId”, parte componentă a unei companii –
identificată prin „companyId” .
56
Am preferat să folosesc referințe către nodurile de legătură ale arborelui pentru a obține
detaliile necesare . În cazul în care aș fi încărcat toți parametrii nodurilor respective s -ar fi creat
„cuiburi” de noduri în interiorul fiecărui comentariu și ar fi îngreunat fluiditatea aplicației în
momentul apelului pentru obținerea listei de mesaje.
Așadar flexibilitatea acestui model de bază de date conferă posibilitatea de a naviga foarte
ușor prin nodurile principale, în număr de 10 (Fig.29.2). Fiecare componentă a aplicației are
propriul nod în arbore, ca parte a nodului părinte. Astfel cunoscând codul unic al unei componente
si numele nodului p ărinte putem obține toate informațiile ce o compun .
Extragem, la nivel teoretic, ca noduri principal e nodurile corespunzătoare utilizatorilor și
domeniilor companiilor, „users” respectiv „domains„ (Fig.29.3) . Această opinie poate fi ușor
observată și aprobată deoarece aceste noduri ating cele două artere principale ale proiectului –
utilizatorii aplicație i și obiectul care determină scopul lor de a utiliza aplicația.
Nodul „domains” apare ca nod principal deoarece reprezintă legătura directa cu lista
companiilor si a locurilor de muncă. Lucrarea acoperă numai domeniul informatic, folosind cheia
„software” . Pentru mai multe detalii asupra motivului consultați subcapitolul 3.4.2.
57
Fig.29.2 Fig.29.3
Pentru a accesa elementele bazei de date, din interiorul aplicației, este necesară crearea
unei instanțe a DatabaseReference (Fig.29.5), o referință către baza de date. Putem adăuga
acestei referințe un set de interogări pentru a returna elementele într -o anumită ordine sau număr
și un callback pentru a asculta și prelucra răspunsul primit (Fig.29.6) . Sistemul interogărilor est e
mult mai limitat față de cel al bazelor de date SQL, dar reușește să satisfacă nevoile apelurilor
efectuate pentru obținerea informațiilor necesare aplicației.
Beneficiile aduse de acest tip de callback, ValueEventListener , constau în faptul că
ascultă modificările aduse informațiilor de care este răspunzător pe toată durata sa de viață. Astfel
continuă să primească rezultate prin intermediul metodei onDataChange , parte a interfeței
ValueEventListener prezentă în Fig.29.6 . Pentru a închide un astfel de ascultător trebuie
disociat referinței căreia i -a fost alocat.
58
public void onGetCommentsList (Job mJob) {
DatabaseReference mDatabaseReference = DatabasePaths. getJobCommentsDBRefe-
rence(mJob);
mDatabaseReference.orderByValue()
.limitToLast( LIMIT_VALUE )
.addListenerForSingleValueEvent(getCommentsListener( false));
}
Fig.29.4 Model de apel pentru obținerea unei liste de comentarii
public static DatabaseReference getJobCommentsDBReference (Job job) {
DatabaseReferenc e mCommentsReference = RateAJob. getInstance ().mFbDatabaseReference
.child(Constants. DB_JOBS)
.child(job.getId())
.child(Constants. DB_COMPANIES )
.child(job.getCompany_id())
.child(Constants. DB_COMM ENTS);
return mCommentsReference ;
}
Fig.29.5 Model de construire a unei referințe către baza de date
private ValueEventListener getCommentsListener (final boolean isRemoveLast) {
return new ValueEventListener() {
@Override
public void onDataChange (DataSnapshot dataSnapshot) {
onHandleCommentsResult(dataSnapshot , isRemoveLast );
}
@Override
public void onCancelled (DatabaseError databaseError) {
}
};
}
Fig.29.6 Model de ascult ător pentru apelul către baza de date
La fel de importantă ca citirea datelor este și actualizarea lor care, în acest context, are rol
și de adăugare. Instanța unui obiect Comment este convertită într -un HashMap , format acceptat
de către Firebase pentru a completa câmpurile lipsă ale întregului obiect sau pentru a le adăugă în
cazul în care acestea nu există. De altfel p ot fi actualizați sau adăugați și parametri i separat.
Acțiunea de adăugare se realizează de asemenea cu o referință a bazei de date și poate
efectua mai multe adăugări și actualizări în același timp (Fig.29.7) . Răspunsul va fii interpretat de
către un a scultător pentru a determina dacă înregistrarea a fost efectuată cu succes.
59
public void execute() {
Map<String , Object> mapComment = mComment .toMap() ;
String key = mCommentsReference .push().getKey() ;
Map<String , Object> commentInDb = new HashMap<>() ;
commentInDb.put(DatabasePaths. getCommentPath () + "/" + key, mapComment) ;
commentInDb.put(DatabasePaths. getJobCommentsPath (mJob) + "/" + key, mComment .ti-
mestamp);
commentInDb.put(DatabasePaths. getUserJobPath (mJob.getCompany_id() , mJob.getId()) ,
mComment .timestamp );
myApp.mFbDatabaseReference .updateChild ren(commentInDb , this);
}
Fig.29.7 Model de înregistrare a unui nou comentariu în baza de date
3.4. Planuri de viitor pentru îmbunătățirea aplicației
Având o structură complexă, aplicația poate beneficia de îmbunătățiri și ca orice gigant de
pe piață, nu poate atinge niciodată forma finală. Așadar fiecare sesiune de lucru generează o nouă
versiune a aplicației însoțită de îmbunătățiri și fixuri.
Versiunea codului prezentată în această lucrare este prima și poartă numele de „1.0”. Ca
plan de viitor pentru următoarea versiune am luat în considerare implementarea unor noi
funcționalități care vor îmbunătăți experiența utilizatorului.
Printre acestea se numără implementarea a mai multor domenii de lucru. Motivul utilizării
unui singur dom eniu se datorează cunoștințelor personale limitate pentru alte domenii, iar
implementarea acestora va necesita asistența unei persoane specializate într -o altă arie de lucru
O altă funcționalitate importantă de implementat pe viitor o reprezintă implemen tarea unui
sistem de monitorizare a utilizatorilor rău intenționați. Pentru realizarea acestui serviciu este
necesar un moderator care să analizeze comportamentul utilizatorilor raportați.
Pentru recunoașterea utilizatorilor am în plan integrarea rețelelo r sociale ca metode de
înregistrare și autentificare. De altfel voi adăuga și o secțiune de utilizator neînregistrat, cu acces
limitat la funcționalitățile aplicației. Pentru construirea acestui proiect am considerat suficientă
metoda de înregistrare și co nectare prin email și parolă.
60
Concluzie
Un proiect de succes are nevoie de o idee bună, de motivație și pasiune din partea
dezvoltatorului. Consider că întregul proces de învățare și toate etapele care au condus la varianta
finală a acestui proiect se datorează dorinței mele de cunoaștere și explorare a acestui domeniu de
dezvoltare.
Îmi doresc ca produsul dezvoltat ca rezultat al acestei lucrări să -și atingă scopul de a ajuta
și îndruma utilizatorii în căutarea unui loc de muncă pe baza cunoștințe lor personale și a
așteptărilor sale față de angajator.
Algoritmul sistemului de recomandări va aduce un bonus de confort în momentele în care
utilizatorii se vor simți nesiguri în privința alegerii corecte și își va juca rolul de a genera rezultate
potriv ite prin compararea profilurilor asemănătoare în rândul utilizatorilor.
Rate A Job dispune de funcționalități utile utilizatorilor săi și creează un mediu stabil din
punct de vedere al comunicării, oferind libertate în exprimarea punctului de vedere. Cu o interfață
simplistă și o paletă de culori confortabilă, utilizatorii vor avea parte de o experiență plăcută pe
parcursul interacțiunii cu aplicația mobilă.
61
62
Bibliografie
[1] J. MCGreal, Smartphone addiction in 5 charts,
https://www.raconteur.net/technology/smartphone -addiction -in-5-charts, 04.04.2017.
[2] ***, Indeed Job Search,
https://play.google.com/store/apps/details?id=com.indeed.android.jobsearch&hl=en, 2017.
[3] ***, Good&Co: Career match test,
https://play.google.com/store/apps/details?id=co.good.android&hl=en, 2017.
[4] ***, Glassdoor: Job Search, Salaries, Reviews,
https://play.google.com/store/apps/details?id=com.glassdoor.app&hl=en, 2017.
[5] ***, LinkedIn Job Search,
https://play.google.com/store/apps/details?id=com.linkedin.android.jobs.jobseeker, 2017.
[6] ***, JOB TODAY – jobs in 24hrs, https://play.google.com/store/apps/details?id=com.jobtoday.app,
2017.
[7] J. Magruder, Click to apply: The impact of online job portals on job search outcomes,
https://www.theigc.org/blog/click -to-apply -the-impact -of-online -job-portals -on-job-search –
outcomes, 07.12.2017.
[8] Jobvite, Jobvite Job Seeker Nation Study, Job Seeke r Survey, 2014.
[9] Android Central, Android pre -history, https://www.androidcentral.com/android -pre-history.
[10] Android Developers, ViewGroup,
https://developer.android.com/reference/android/view/ViewGroup.html.
[11] B. Eckel, Thinking in Java (4th ed.), Prentice Hall, ianuarie 2006.
[12] J. Horton, Android Programming for Beginners, Packt Publishing, decembrie 2015.
[13] J. Kreibich, Using SQLite (1st ed.), O'Reilly Media, 17 august 2010.
[14] G. Inc., Configure Your B uild, https://developer.android.com/studio/build/index.html#build -config.
[15] Font Awesome, http://fontawesome.io/.
[16] JoanZapata, Iconify v2, https://github.com/JoanZapata/android -iconify/blob/master/README.md,
21 martie 2016.
[17] Google Inc., Transmitting Network Data Using Volley,
https://developer.android.com/training/volley/index.html.
[18] ArthurHub, Android Image Cropper, https://github.com/ArthurHub/Android -Image –
Cropper/blob/master/README.md.
[19] B. Stonehem, Google A ndroid Firebase: Learning the Basics, Lulu.com, 2016.
[20] C. Esplin, What is Firebase?, https://howtofirebase.com/what -is-firebase -fcb8614ba442, 24
octombrie 2016.
[21] Google Inc., Firebase Authentication, https://firebase.google.com/docs/auth/.
[22] E. Tudorancea, Node.js Introducere – Thread -uri vs Evenimente,
https://www.iamntz.com/2436/frontend -developer/node -js-introducere -partea -intai/, 02
octombrie 2011.
[23] B. Syed, Beginning Node.js, Apress, 2014.
[24] G. Ornbo, Sams Teach Yourself Node.js in 24 Hours, Sams Publishing, 5 septembrie 2012.
63
[25] E. Tudorancea, Node.js Introducere – Thread -uri vs Evenimente,
https://www.iamntz.com/2436/frontend -developer/node -js-introducere -partea -intai/#comment –
2184, 2 o ctombrie 2011.
[26] c. blog, Node.js w/1M concurrent connections!, http://blog.caustik.com/2012/08/19/node -js-
w1m -concurrent -connections/, 19 august 2012.
[27] L. Orsini, What You Need To Know About Node.js, http://readwrite.com/2013/11/07/what -you-
need-to-know -about -nodejs/: ReadWrite, 07 noiembrie 2013.
[28] Scott Oaks, Henry Wong, Java Threads, Understanding and Mastering Concurrent Programming,
3rd ed., O'Reilly Media, Iunie 2009.
[29] Neil Middleton, Richard Schneeman, Heroku: Up and Runnin g: Effortless Application Deployment
and Scaling, O'Reilly Media, Noiembrie 2013.
[30] T. Robinson, Scalability: How does Heroku work?, https://www.quora.com/Scalability/Scalability –
How -does -Heroku -work -2, 31 mai 2011.
[31] Anand Rajaraman, Jure Leskovec and Jeffrey D. Ullm, Mining of Massive Datasets, 2014.
64
Anexe
Anexa 1
Fișierul „widget_lly_user_info .xml”:
<?xml version= "1.0" encoding= "utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width= "match_parent"
android:layout_height= "match_parent"
android:orientation= "vertical" >
<LinearLayout
android:layout_width= "match_parent"
android:layout_height= "wrap_content"
android:gravity= "center_vertical"
android:orientation= "horizontal"
android:paddingBottom= "@dimen/default_padding_half"
android:paddingLeft= "@dimen/default_padding"
android:paddingRight= "@dimen/default_p adding"
android:paddingTop= "@dimen/default_padding_half" >
<TextView
android:id="@+id/tv_user_info_title"
android:layout_width= "match_parent"
android:layout_height= "wrap_content"
android:layout_weight= "1"
android:text="@string/default_no_title"
android:textColor= "@color/theme_gunmetal"
android:textSize= "@dimen/text_xsmall" />
<TextView
android:id="@+id/tv_update_success"
android:layout_width= "wrap_content"
android:layout_height= "wrap_content"
android:text="@string/update_success"
android:textColor= "@color/theme_forest_green"
android:textSize= "@dimen/text_xxsmall"
android:visibility= "invisible" />
<ProgressBar
android:id="@+id/pb_update"
android:layout_width= "@dimen/text_xsmall"
android:layout_height= "@dimen/text_xsmall"
android:indeterminate= "true"
android:visibility= "gone" />
</LinearLayout>
<android.support.v7.widget.CardView
android:id="@+id/cv_info"
android:layout_width= "match_parent"
android:layout_height= "wrap_content"
android:layout_marginBottom= "@dimen/default_padding_half"
android:layout_marginLeft= "@dimen/default_padding"
android:layout_marginRight= "@dimen/default_padding" >
65
<LinearLayout
android:layout_width= "match_parent"
android:layout_height= "wrap_content"
android:gravity= "center_vertical"
android:orientation= "horizontal"
android:paddingLeft= "@dimen/default_padding"
android:paddingRight= "@dimen/default_padding" >
<EditText
android:id="@+id/edt_add_info"
android:layout_width= "match_parent"
android:layout_height= "wrap_content"
android:layout_weight= "1"
android:background= "@android:color/transparent"
android:hint="@string/default_no_hint"
android:imeOptions= "actionDone"
android:maxLines= "1"
android:paddingBottom= "@dimen/default_padding"
android:paddingTop= "@dimen/default_padding"
android:textColor= "@color/theme_gunmetal"
android:textSize= "@dimen/text_xsmall" />
<bdg.gabriel.rateajob.widgets.FontAwesomeTextView
android:id="@+id/tv_edit"
android:layout_width= "wrap_content"
android:layout_height= "wrap_content"
android:textColor= "@color/selector_gray_green"
android:padding= "@dimen/default_padding_half"
android:text="@string/fa_pencil"
android:textSize= "@dimen/text_xmedium" />
<bdg.gabriel.rateajob.widgets.FontAwesomeTextView
android:id="@+id/tv_cancel"
android:layout_width= "wrap_content"
android:layout_height= "wrap_content"
android:layout_marginRight= "@dimen/default_padding_half"
android:padding= "@dimen/default_padding_half"
android:text="@string/fa_times"
android:textSize= "@dimen/text_small" />
<bdg.gabriel.rateajob.widgets.FontAwesomeTextView
android:id="@+id/tv_update"
android:layout_width= "wrap_content"
android:layout_height= "wrap_content"
android:padding= "@dimen/default_padding_half"
android:text="@string/fa_check_circle"
android:textColor= "@color/theme_forest_green"
android:textSize= "@dimen/text_xmedium" />
</LinearLayout>
</android.support.v7.widget.CardView>
</LinearLay out>
Copyright Notice
© Licențiada.org respectă drepturile de proprietate intelectuală și așteaptă ca toți utilizatorii să facă același lucru. Dacă consideri că un conținut de pe site încalcă drepturile tale de autor, te rugăm să trimiți o notificare DMCA.
Acest articol: Bdg Gabriel Alexandru (2) [615822] (ID: 615822)
Dacă considerați că acest conținut vă încalcă drepturile de autor, vă rugăm să depuneți o cerere pe pagina noastră Copyright Takedown.
