Integrarea tehnologiilor cloud în vederea creării unui media player bazat pe streaming online pe platforma iOSwatchOS [302503]

Universitatea Tehnică a Moldovei

Integrarea tehnologiilor cloud în vederea creării unui media player bazat pe streaming online pe platforma iOS/watchOS

Cloud technologies integration for a media player based on online streaming developed for iOS/watchOS

Student: [anonimizat]: Lect. univ. Cojocaru Svetlana

Chișinău 2017

Ministerul Educației al Republicii Moldova

Universitatea Tehnică a Moldovei

Facultatea Calculatoare Informatică și Microelectronică

Departamentul Ingineria Software și Automatică

Admis la susținere

Șef de departament: dr. conf. univ. Ciorbă D.

„__”_____________ 2017

Integrarea tehnologiilor cloud în vederea creării unui media player bazat pe streaming online pe platforma iOS/watchOS

Proiect de licență

Student:________________________(A. Pavlov )

Conducător:_____________________(Sv. Cojocaru )

Consultanți:_____________________(Sv. Cojocaru )

_____________________(A. Dodu )

Chișinău 2017

Universitatea Tehnică a [anonimizat]. conf. univ. Dumitru Ciorbă

șef de departament

„__”_____________ 2016

CAIET DE SARCINI

pentru proiectul de licență al student: [anonimizat]

1. Tema proiectului de licență Integrarea tehnologiilor cloud în vederea creării unui media player bazat pe streaming online pe platforma iOS/watchOS________________________________

confirmată prin hotărârea Consiliului facultății de la „ 24” octombrie 2016

2. Termenul limită de prezentare a proiectului 31.05.2016

3. Date inițiale pentru elaborarea proiectului Sarcina pentru elaborarea proiectului de diplomă.

4. Conținutul memoriului explicativ

Introducere

Analiza domeniului de studiu

Modelarea și proiectarea sistemului informatic

Realizarea sistemului

Documentarea sistemului

Argumentarea economică

Concluzii

5. Conținutul părții grafice a proiectului

Interfața aplicațiilor similare cu care a [anonimizat], [anonimizat].

6. Lista consultanților:

7. Data înmânării caietului de sarcini 01.09.2016

Conducător

semnătura

Sarcina a fost luată pentru a fi executată

de către student: [anonimizat] 01.09.2016

semnătura, data

PLAN CALENDARISTIC

Student: [anonimizat], Informatică și Microelectronică

Departamentul Ingineria Software și Automatică

Specialitatea Tehnologii Informaționale

AVIZ

la proiectul de licență

Tema Integrarea tehnologiilor cloud în vederea creării unui media player bazat pe streaming online pe platforma iOS/watchOS

Student: [anonimizat](a) Pavlov Alexandr gr. TI-133

1. Actualitatea temei: [anonimizat]. Acești doi piloni stau la baza unei game largi de servicii care ar putea fi definitorii atunci când este vorba de preferințele utilizatorului. [anonimizat]. [anonimizat]vicii face ca oricine din orice colț al lumii să fie mai aproape de muzica de calitate.

2. Caracteristica tezei de licență: Aplicația a fost creată pentru a contribui la ameliorarea accesibilității conținutului muzical și a combate efectul pirateriei în industria muzicală.

3. Analiza aplicației: Destinația aplicației este de a favoriza accesul la muzica din toată lumea oricând și oriunde utilizând cele mai noi tehnologii.

4. Estimarea rezultatelor obținute: Conținutul aplicației Cloudify este accesibil, intuitiv și familiar pentru majoritatea beneficiarilor care vor dispune de aceste servicii.

5. Corectitudinea materialului expus: Materialul expus este prezentat prin referințe ale unor surse de încredere care sunt prezentate de persoane ce dețin cunoștințe în domeniu.

6. Calitatea materialului grafic: În cadrul lucrării sunt prezentate: diagrame, tabele, imagini, interfața aplicației.

7. Valoarea practică a tezei: Aplicația este destinată beneficiarilor care dispun de dispozitiv pe platforma iOS (iPhone, iPad, sau Ipod Touch), internet mobil și resurse necesare pentru memoria internă.

8. Observații și recomandări: Cerințele față de teza de licență au fost îndeplinite în totalmente. Observații nu sunt.

9. Caracteristica studentului și titlul conferit: Studentul Pavlov Alexandr a dat dovadă de profesionalism în elaborarea lucrării, a respectat cerințele impuse și a manifestat exigență în elaborarea și calitatea tezei de licență. Din cele relatate, urmează că lucrarea de licență poate fi admisă spre susținere.

Din cele relatate, urmează că lucrarea de licență poate fi admisă spre susținere, cu nota _______________

Conducătorul tezei de licență lector superior Cojocaru Svetlana

Rezumat

Tema acestei lucrări este Integrarea tehnologiilor cloud în vederea creării unui media player bazat pe streaming online pe platforma iOS/watchOS. Lucrarea are 100 de pagini. Această lucrare prevede analiza, proiectarea și implementarea aplicației Cloudify care include în sine utilizarea unor servicii cloud și de streaming muzical.

Cuvinte cheie: servicii; cloud; streaming muzical; muzică.

Lucrarea conține 5 capitole de bază:

Analiza domeniului de studiu:

importanța temei și domeniului ales;

comparație cu sisteme similare deja existente;

definirea cerințelor și scopurile sistemului;

Modelarea și proiectarea sistemului informatic;

descrierea etapei de proiectare, metodei de proiectare alese, mediu de dezvoltare, limbajul UML;

descrierea comportamentală a sistemului;

descrierea structurală a sistemului;

Realizarea sistemului;

descrierea platformei, limbaj de programare, mediu de dezvoltare, tehnologii și algoritmi aplicați;

proiectarea bazei de date;

realizarea funcționalităților;

testarea sistemului;

Documentarea produsului realizat;

instalarea aplicației;

configurarea aplicației;

ghid de utilizare;

Argumentarea economică

evaluarea economică a produsului realizat;

studiul pieței și identificarea potențialilor beneficiari;

planul calendaristic;

analiza SWOT;

calculul indicatorilor economici.

Abstract

The topic of this thesis is Cloud technologies integration for a media player based on online streaming developed for iOS/watchOS. There are 101 pages. This one provides an analysis, the design and the implementation of application Cloudify that comprises itself the development of cloud services and music streaming.

Keywords: services; cloud; music streaming; music.

The thesis contains 5 basic chapters:

Domain analysis

the relevance of the topic and chosen domain;

comparison with similar systems;

defining the requirements and purposes of the system.

System design

the description of the design phase, chosen design method, Integrated development environment, UML language;

behavioral description of the system;

structural description of the system;

System implementation

platform description, programming language, Integrated development environment, technologies and algorithms;

database design;

implementation Features;

system testing;

System documentation

application installation;

application configuration;

application guide.

Economic analysis

economic evaluation;

market research and identification of potential beneficiaries;

calendar plan;

SWOT analysis;

economic indicators evaluation.

Introducere

La moment, aplicațiile ce furnizează muzică sunt unele din cele mai populare aplicații de pe piața aplicațiilor mobile. Gradul de utilizare ale acestor aplicații este la limita necesităților utilizatorilor. E greu de surprins și de sporit interesul noilor utilizatori. Dar dacă aplicația își atrage contingentul necesar de utilizatori, atunci succesul aplicației este inevitabil. O popularitate sporită o au aplicațiile care se bazează pe streaming online și servicii cloud. Dar nu întotdeauna acestea dispun de servicii de calitate, având un scop mai mult comercial, de a obține un profit maxim din publicitatea altor aplicații în cadrul platformei.

Serviciile de streaming și cloud se bucură de o popularitate majoră, devenind sursa primară de consum de muzică. Aceste aspecte facilitează accesul instantaneu la muzica artiștilor. O problemă evidentă care persistă în decursul unei perioade îndelungate este pirateria. Majoritatea utilizatorilor deseori vor să obțină anumite servicii și produse nelicențiate. Acest fapt are un impact negativ, deoarece orice gen de servicii trebuie achiziționate legal sau gratis respectând proprietatea intelectuală.

O soluție pentru această problemă este streaming-ul online. Odată ce un artist permite accesul la muzica lui prin streaming online el se asigură că drepturile de proprietate intelectuală vor fi respectate și că va controla accesul licențiat la muzica acestuia. Un avantaj cert al streaming-ului online este că deseori utilizatorii optează mai mult pentru surse distribuire a muzicii într-un mediu legal și pe o piață deschisă evitând în cele mai dese cazuri muzica piratată.

Serviciile de streaming online și cloud asigură o distribuție rapidă a produselor muzicale. Din moment ce iTunes a fost lansat în 2002, industria muzicală s-a schimbat drastic. Clasamentul produselor muzicale reglementează fluxul de distribuție și asigură o popularitate exponențială în cadrul acestora în toată lumea. Însă distribuția muzicală în cele mai dese cazuri este foarte costisitoare, iar aplicațiile mobile permit o distribuție rapidă, la prețuri convenabile, uneori și gratuit.

Banii pentru muzică nu sunt condiționați de servicii streaming ci de utilizatori. Fără costuri prealabile, serviciile streaming nu vor putea aduce venit titularilor de drepturi. Serviciile de streaming funcționează în numele artiștilor pentru a converti utilizatorii înapoi în plătitori de muzică. Singurul lucru care s-a schimbat este modul în care aceștia plătesc. Utilizatorii devin capabili de a închiria sau cumpăra muzică, iar artiștii sunt astfel compensați pentru munca lor [1].

Streaming-ul de muzică este liber de piraterie, ceia ce nu poți spune despre muzica în diverse formate cum ar fi AVI, MPG sau WMA în cazul în care le poți descărca, modifica și redistribui. Astfel, conținutul nu poate fi duplicat și prin urmare, oferă o securitate ridicată ale drepturilor deținătorilor de proprietate intelectuală.

De obicei, utilizatorii sunt dispuși să dețină biblioteci de muzică enorme. Din punct de vedere a memoriei fizice consumate, aceștia ar putea întâlni dificultăți în manevrarea unui astfel volum de informații. Prin intermediul serviciilor de streaming poți asculta muzica preferată oriunde ne fiind limitat de resursele dispozitivului utilizat. Capacitatea de a avea un astfel de acces la mediu digital permite artiștilor să câștige perspectiva asupra modului în care oamenii interacționează cu muzica lor ca niciodată înainte. Serviciile streaming contribuie la faptul că artiștii pot să își analizeze impactul muzicii lor și a lua decizii mai bine informate în jurul valorii de producție și de promovare.

Scopul lucrării este crearea unui sistem informatic pe platforma iOS și watchOS care va permite utilizatorilor să folosească o bază de date de cântece din întreaga lume gratuit. La fel, prin intermediul sistemelor cloud poți accesa cântecele stocate local și descărca pe dispozitivul ce rulează sistemul de operare iOS și watchOS, precum și integra în aplicație funcționalități de căutare operativă în timp real.

Printre obiectivele generale ale lucrării se poate menționa crearea și implementarea noilor tehnologii de streaming online pentru industria muzicală. La fel, se urmărește ca scop demonstrarea importanței integrării serviciilor cloud în aplicații de muzică. În cadrul aplicației se vor aplica cele mai eficiente șabloane de proiectare pentru crearea unui sistem scalabil. Un al obiectiv prevăzut reprezintă utilizarea celor mai noi standarde de modelare, proiectare, planificare și de implementare sistemului. Într-un final aplicația tinde să fie user friendly și să corespundă cerințelor pieței actuale.

În cadrul aplicație se urmărește scopul de a pune la dispoziția utilizatorului muzică licențiată prin utilizarea unui API gratuit și veridic pus la dispoziție de către servicii online. La fel, se prevede posibilitatea de a descărca gratuit cântece prin intermediul aplicației. Și nu în cele din urmă oferirea posibilității de creare a listelor de redare și grupurilor de piese în managerul de fișiere.

La implementarea sistemului se vor utiliza diverse metodologii care cuprind în sine instrumente de modelare, limbaje de programare, medii de dezvoltare și de testare. Pentru proiectarea aplicației se va folosi instrumentul de modelare Enterprise Architect. Unele dintre avantajele utilizării acestuia este facilitarea construcției și modelării sistemelor informatice. El permite să modelezi sistemul în cadrul tuturor etapelor de proiectare și oferă o viziune mai clară asupra particularităților dezvoltării sistemului informatic. În cadrul etapei de proiectare se va utiliza limbajul standard de modelare UML pentru descrierea modelelor și specificațiilor software.

Pentru a crea o aplicație pe platforma iOS este necesar de utilizat mediul de dezvoltare Xcode. Acesta având o gamă largă de instrumente de dezvoltare software care oferă posibilitatea dezvoltării concomitente a aplicației pe diferite dispozitive ce rulează pe platforma respectivă. Pentru aplicațiile mobile se utilizează limbaje orientate pe obiecte. Aplicația va fi programată în limbajul Objective C, unul dintre cele 2 limbaje prin intermediul căruia se realizează aplicațiile pe platforma iOS.

1 Analiza domeniului de studiu

Muzica în diferite formate, stiluri și genuri atrage tot mai mulți utilizatori. Muzica dintotdeauna a avut o mulțime de avantaje, datorită cărora nimeni nu poate fi lipsit de ea. Ea poate îmbunătăți starea de spirit, poate mări productivitatea, poate îmbunătăți sănătatea ș.a.m.d. Una dintre cele mai populară metodă de a asculta muzica online este de a asculta utilizând serviciile streaming.

Unul dintre cele mai importante avantaje ale serviciilor streaming este accesibilitatea muzicii [2]. Datorită acestora ai posibilitatea de a asculta muzica din toată lumea, având doar acces la Internet, iar serviciile cloud permit transferul rapid, și accesul la muzica preferată din orice colț al lumii.

Astfel de servicii permit personalizarea și structurarea muzicii preferate. Un alt avantaj este că acestea servicii sunt relativ mai puțin costisitoare comparativ cu costurile de achiziționare a muzicii licențiate. Unii artiști se întâlnesc cu probleme în ce privește plățile uriașe pentru fluxuri interactive și non-interactive. Cu toate acestea deoarece aceste tipuri de servicii devin din ce în ce mai proeminente, odată cu distribuția asociată pe astfel de fluxuri, se prevede o ameliorare a veniturilor artiștilor.

Un număr tot mai mare de artiști devin capabili să încheie acorduri cu serviciile de streaming interactive, care cel puțin să le ofere tarife mai favorabile decât de a obține prin intermediul plăților pentru distribuire. În sfârșit, reprezintă un mare beneficiu de promovare a unei cantități mai mare de muzică distribuită prin intermediul serviciilor cloud. Capacitatea de a atinge un anumit nivel de atracție pentru clienți pe partea din spate a acestor servicii streaming este atrăgătoare din perspectiva extragerii de valoare suplimentară (promovarea artiștilor) [3].

Este cert faptul că evoluțiile serviciilor streaming și cloud schimbă complet industria muzicală. Muzica de streaming a crescut de 93 la sută în 2015, cu 317 de miliarde de fluxuri totale. Aceste date statistice atestă un impact considerabil a soluțiilor IT în industria muzicală. Acest fenomen nu va fi eliminat în timpului apropiat, chiar dacă nu toți sunt adepții unei astfel de abordări muzicale.

Muzica de streaming a devenit mai puțin costisitoare, mai portabilă și mai personalizată. Devalorizarea artei muzicii și incapacitatea artiștilor de a controla distribuția muzicii integral ar constitui un dezavantaj resimțit și ne impunător. Aceasta este condiționată de faptul că companiile care furnizează astfel de servicii ar trebuie să plătească pentru drepturile de autor pentru artiști.

Odată cu creșterea volumului de muzică ascultat, tot mai mulți utilizatori aleg serviciile de streaming online. Astfel, ei având acces la conținutul corespunzător din orice colț al lumii. Abonarea la servicii de streaming nu înseamnă că nu devii proprietar pe muzica pe care o plătești pentru a o asculta. Serviciile de streaming reprezintă un ghid în lumea muzicii și oferă o viziune despre muzica care se află în clasamentele de muzică din întreaga lume. Dar nu este exclus faptul că serviciile de streaming ar putea sta în spatele unor magazine de muzică prezente pe piață.

Muzica dintotdeauna a fost, este și va fi solicitată. Doar modul în care toți vor avea acces la ea va suferi schimbări majore, ca muzica să fie mai accesibilă mai calitativă și mai aproape de fiecare. Ea are un efect mai mult spiritual decât funcțional, însă nu trebuie neglijată, deoarece reprezintă o parte din viața de zi cu zi, o formă de manifestare, un stil de viață.

1.1 Compararea cu aplicații deja existente

Spre analiză au fost selectate următoarele aplicații cunoscute în cadrul preferințelor utilizatorului din App Store:

Cloud Music;

My Cloud Music;

Music Cloud App;

Free Music Player.

Cloudify este o aplicație interactivă realizată pe platforma iOS, care facilitează accesul la muzica preferată atât din cadrul conturilor cloud disponibile, cât și din toată lumea. Aplicația oferă servicii de calitate, este gratuită și are publicitate la un nivel admisibil comparativ cu alte aplicații de top. Datorită acestei aplicații fiecare are acces la toate genurile de muzică din întreaga lume, fiind organizate conform țărilor corespunzătoare. Muzica oricărei țări este organizată atât după genul de muzică, cât și după clasamentele țărilor respective. La fel, utilizatorii au acces și la muzica din iTunes, astfel, aplicația va atrage utilizatorii permanenți ai acestuia. Accesul la muzică se va realiza prin intermediul unui streaming online.

Serviciile cloud disponibile DropBox, Google Drive, Box, iCloud, One Drive, ownCloud permit utilizatorului sincronizarea rapidă și descărcarea muzicii în cadrul aplicației. La fel pentru o organizare mai eficientă a muzicii este prevăzut opțiunea de a crea și personaliza un file manager propriu. Acest aspect reprezintă un avantaj important pentru utilizatori, deoarece direct din aplicație ei au acces la muzica atât locală cât și descărcată din cadrul sistemelor cloud.

O altă particularitate apreciabilă este că utilizatorii au autoritate de a modifica metadatele cântecelor descărcate în vederea măririi veridicității datelor despre cântec. Utilizatorul dispune și de posibilitatea de a organiza muzica după actualitatea acesteia și de asemenea poate vizualiza muzica recent sau cel mai des ascultată.

Aplicația dată este menită să strângă la un loc diverse aspecte ale experienței de utilizator care uneori lipsesc în alte aplicații. În cadrul aplicației date utilizatorul nu este limitat în capacitatea de stocare și în perioada de exploatare. La moment serviciile din cadrul aplicației nu sunt contra plată și nu se prevede pentru viitor.

Aplicația va dispune de o gamă foarte largă de cântece și muzică atât artiștilor populari cât și a celor independenți. Utilizând servicii de streaming de muzică utilizatorul nu va fi preocupat niciodată de memoria telefonului sau dispozitivului. În dependență de preferințele individuale fiecare va avea acces la muzica favorită, la fel și la noi sugestii de muzică recente la momentul actual. Deși serviciile streaming și cloud au multe avantaje convingătoare, care ar motiva utilizarea acestor gen de aplicații, funcționalitățile bazate pe aceste servicii nu sunt disponibile dacă dispozitivul nu este conectat la Internet.

O particularitate importantă a aplicației propuse spre realizare este sincronizarea în timp real cu Apple Watch. Astfel, atunci când aplicația rulează pe dispozitivul corespunzător (iPhone, iPad, sau Ipod Touch) are loc transferul automat a listei de redare pe Apple Watch. Utilizatorul poate redacta ordinea cântecelor, schimba cântecul care rulează la moment și prin urmare toate aceste modificări se vor sincroniza cu dispozitivul coincident. Beneficiul acestei caracteristici este faptul că informația va coincide și în felul acesta fluxul de muzică propus pentru redare va fi mai ușor de manipulat.

Aplicația Cloud Music este o aplicație extrem de populară pe App Store, având circa 4.000.000 de descărcări (figura 1.1). Datorită integrarea serviciilor cloud DropBox, Box, Google Drive, OneDrive și ownCloud utilizatorii por descoperi muzică nouă și să se bucure de cea mai curentă muzică. Datorită sistemelor cloud utilizatorul are posibilitatea de a sincroniza toată muzica preferată într-o singură colecție.

Figura 1.1- Aplicația Cloud Music

Utilizatorul poate naviga, căuta și asculta muzica gratuit și nelimitat la iPhone, iPod și iPad. La fel, descoperi și căuta direct diferite categorii de muzică de exemplu Clasic, Rock, Jazz, ș.a.m.d. Formatele suportate ale fișierelor audio sunt MP3, M4A, M4B, FLAC.

Alte particularități disponibile:

organizarea listei de redare după titlu și dată;

sincronizarea și organizarea muzicii după artist, album, cântece;

descărcarea și redarea cântecelor fără internet;

disponibilitatea listelor de redare offline, pentru a menține localizat fișierele descărcate;

depistarea rapidă a cântecului, albumului sau artistului căutat;

redarea în fundal;

redarea cu repetare a cântecului sau a unei liste de redare aleatorie;

completarea colecției de muzică prin intermediul SoundCloud.

Aplicația dată este disponibilă pe așa dispozitive ca: iPhone, iPad, iPod Touch. Este creat de BEARD BITS S.L. Mărimea fișierului este de 27.7 MB. Necesită versiunea iOS 7.0 sau mai recentă. Aplicația este disponibilă în 13 limbi: engleză, spaniolă, germană, franceză, olandeză, italiană, japoneză, coreeană, poloneză, rusă, chineză simplificată, turcă. La momentul actual aplicația a fost actualizată pe data de 18 februarie 2016, iar ultima versiune este 1.6.

My Cloud Music este o aplicație solicitată de câte aproximativ peste 1.000.000 de utilizatori din lume (figura 1.2). Utilizatorii acestei aplicației pot descărca cu ușurință și asculta muzica preferată offline, având la dispoziție p bibliotecă de muzică nelimitată pe toate dispozitivele oriunde și oricând. Integrarea cu sistemele cloud permit descărcarea și importarea muzicii de pe cloud de pe iPod Touch, Mac, e-mail, etc.

Figura 1.2- Aplicația My Cloud Music

Caracteristicile aplicației:

descărcarea muzicii pentru accesul offline;

depozitarea muzicii pe cloud: DropBox, Google Drive, iCloud Disc;

streaming online;

importarea fișierelor audio de la Mac, iod, e-mail, prin transfer Wi-Fi;

partajarea de fișiere iTunes pe PC;

formate susținute: mp3, M4A, M4B și FLAC, etc.;

moduri de redare aleatorie;

redarea muzicii în fundal.

Aplicația dată este disponibilă pe așa dispozitive ca: iPhone, iPad, iPod Touch. Este creat de Denis Musicant. Mărimea fișierului este de 24.9 MB. Necesită versiunea iOS 7.1 sau mai recentă. Aplicația este disponibilă în 26 limbi: engleză, spaniolă, germană, italiană, japoneză, coreeană, poloneză, rusă, chineză simplificată, turcă, belarusă, daneză ș.a.m.d. La momentul actual aplicația a fost actualizată pe data de 24 august 2016, iar ultima versiune este 1.3.

Music Cloud App este o aplicație de pe App Store care susține ascultarea muzicii online (figura 1.3). Poți descărca muzica preferată oricând și salva pentru a asculta muzică în regim de redare offline. La fel, aplicația este integrată cu sisteme cloud DropBox, Google Drive.

Figura 1.3- Aplicația My Cloud App

Unele din caracteristicile esențiale ale aplicației sunt:

disponibilitatea modului de redare offline;

configurarea rapidă;

sincronizarea automată a muzicii;

sincronizarea cu iTunes;

gestionarea ușoară a fișierelor audio.

Aplicația dată este disponibilă pe așa dispozitive ca: iPhone, iPad, iPod Touch. Este creat de Galina Smirnova. Mărimea fișierului este de 105 MB. Necesită versiunea iOS 7.0 sau mai recentă. Aplicația este disponibilă în limba engleză. La momentul actual aplicația a fost actualizată pe data de 13 mai 2016, iar ultima versiune este 1.4.15.

Free Music Player este o aplicație populară cu o audiență de circa 50 de milioane de utilizatori. Este o aplicație gratuită care oferă servicii de streaming muzical prin intermediul SoundCloud API (figura 1.4).

Printre caracteristicile cheie se pot menționa următoarele:

căutarea cântecelor gratuite;

explorarea muzicii gratuit, online corespunzător genurilor de muzică prestabilite;

gestionarea muzicii preferate;

gestionarea listelor de redare locale;

shuffle și modul de redare;

redarea muzicii pe fundal;

prezența unui widget pentru aplicație;

distribuirea cântecelor în cadrul rețelelor de socializare.

Figura 1.4- Aplicația Free Music Player

Aplicația dată este disponibilă pe așa dispozitive ca: iPhone, iPad. Este creat de Free Music – Enjoy. Mărimea fișierului este de 21.55 MB. Necesită versiunea iOS 7.1 sau mai recentă. Aplicația este disponibilă în 13 limbi: germană, engleză, spaniolă, franceză, italiană, japoneză, coreeană, finlandeză, portugheză, rusă, thailandeză, turcească, chineză. La momentul actual aplicația a fost actualizată pe data de 16 februarie 2017, iar ultima versiune este 1.66.

Compararea sistemelor descrise

Un aspect important al aplicației este prezența clasamentelor de muzică, care reprezintă un indiciu despre popularitatea anumitor produse muzicale pe piață. Acestea definesc fluxul de distribuție a cântecelor și condiționează cele mai mari venituri pentru artiști.

Funcționalitățile prezentă în cadrul componentei de stabilire a clasamentelor sunt prezente în tabelul 1.1. În următoarele tabele semnificația semnului ”+” atestă prezența acestei funcționalități în sistem, iar ”-” lipsa acestuia.

Tabelul 1.1- Clasamente muzicale

În scopul marii veridicității informației despre cântecele descărcate există posibilitatea de modificare a metadatelor cântecelor. Metadatele care pot fi schimbate sunt definite în tabelul 1.2

Tabelul 1.2- Metadatele cântecelor

Continuare Tabelul 1.2

Repartizarea fișierelor audio în diverse liste de redare facilitează organizarea acestora în dependență de preferințele utilizatorului. Prezența funcționalităților caracteristice listelor de redare sunt definite în tabelul 1.3.

Tabelul 1.3- Liste de redare

Aproape orice aplicație destinată distribuției muzicii au integrate diverse sisteme cloud pentru importarea sau exportarea fișierelor corespunzătoare. Integrarea acestora prevede următoarele aspecte definite în tabelul 1.4.

Tabelul 1.4- Integrarea aplicației cu diverse sisteme cloud

Pentru comoditatea utilizatorilor în fiecare aplicație este prevăzută posibilitatea de a efectua anumite setări în cadrul aplicației. Setările disponibile în cadrul aplicațiilor descrise sunt reprezentate în tabelul 1.5.

Tabelul 1.5- Setările aplicațiilor

Ultima componentă de bază este Player-ul în care se permite realizarea scopului aplicațiilor de acest gen, însăși ascultarea muzicii. Funcționalitățile de bază caracteristice acestei componente sunt evidențiate în tabelul 1.6.

Tabelul 1.6- Funcționalitățile player-ului

1.2 Cerințe față de sistem

Pentru a defini structura și modul de funcționare a sistemului se stabilesc anumite cerințe funcționale. Ele precizează serviciile pe care trebuie să le asigure sistemul.

În cazul dat sistemul corespunzător trebuie să respecte următoarele cerințe funcționale:

oferirea serviciilor de streaming de calitate;

asigurarea compatibilității utilizării serviciilor cloud;

accesul la muzică de calitate;

organizarea muzicii;

importarea muzicii;

ascultarea muzicii din cadrul clasamentelor din diverse țări ale lumii.

La etapa de analiză a sistemului preconizat spre dezvoltare, se stabilesc cerințe referitoare la funcțiile sistemului. Aceste cerințe prevăd gama de funcționalități și servicii care poate oferi sistemul.

Conținutul aplicației se bazează pe anumite clasamente de muzică din toată lumea. Pentru aceasta sunt prevăzute următoarele funcționalități:

accesarea muzicii din toate țările lumii (Albania, Belgia, Germania, SUA, Lituania, Malta, Polonia, România, Turcia, Marea Britanie, Ucraina etc.);

accesarea muzicii de top din țara selectată;

gruparea muzicii după anumite criterii (țara; gen de muzică; muzica din memoria locală; muzica din iTunes; muzica importată din sistemele cloud disponibile);

căutarea cântecelor;

în dependență de gen de muzică;

în dependență de țară;

în cadrul muzicii importate din sisteme cloud.

În sine, fiecare cântec dispune de anumite informații adiționale, acestea reprezintă o serie de niște metadate diferite pentru fiecare cântec în parte. Printre acestea se enumeră:

numele cântărețului/trupei;

denumirea cântecului;

imaginea cover;

ratingul cântecului (numai pentru cântecele din lista de redare online);

durata cântecului;

numărul de ascultări a cântecului de către alți utilizatori (numai pentru cântecele din lista de redare online).

Pentru gestionarea fișierelor muzicale sunt prevăzute diverse liste de radare care oferă unele funcționalități foarte necesare, cum ar fi:

crearea unei liste de redare;

editarea unei liste de redare;

ștergerea unei liste de redare;

adăugarea pieselor în lista de redare;

ștergerea pieselor din lista de redare;

mutarea pieselor din lista de redare;

actualizarea pieselor din lista de redare (numai pentru cântecele din lista de redare online);

accesarea din listele de redare proprii;

vizualizarea 25 celor mai redate cântece;

vizualizarea cântecelor recent adăugate;

vizualizarea cântecelor recent ascultate;

vizualizarea albumelor;

vizualizarea artiștilor;

vizualizarea genurilor de muzică;

ștergerea selectivă/ în întregime a cântecelor din lista de redare.

Printre serviciile cloud oferite de aplicație se pot evidenția următoarele:

logarea și delogarea în sisteme cloud;

importarea muzicii din sisteme cloud (Dropbox; Google Drive; One Drive; Box; ownCloud; iPod Library (muzica salvată local));

importarea selectivă a cântecelor;

vizualizarea progresului de descărcare a cântecelor.

Nici o aplicație nu este prevăzută fără anumite setări care ar facilita personalizarea anumite particularități esențiale în aplicație, acestea reprezintă:

opțiunea de afișare a imaginii cover;

dezactivarea reclamei o dată cu procurarea aplicației;

restabilirea cumpărăturii;

curățire cache.

Pentru gestionarea conținutului muzical, este prevăzut un player care asigură următoarele funcționalități:

afișare Audio Visualizer;

interschimbarea cântecelor din lista de redare;

redarea cântecului/cântecelor din lista de redare;

repetarea integrală a cântecelor din lista de redare, repetarea unui cântec;

redarea ordonată/aleatorie a cântecelor;

selectarea unui interval în de timp după care player-ul se va opri;

redactarea metadatelor cântecelor salvate local;

setarea frecvenței sunetului în equalizer (setarea sunetului manual; selectarea frecvențelor propuse);

schimbarea progresului de redare a cântecului;

trecerea la cântecul următor/precedent;

pornirea și oprirea cântecului în player;

vizualizarea timpului curent de redare și timpului total;

afișarea versurilor cântecului curent;

redarea cântecului în background (cu următoarele date disponibile: imaginea cover, denumirea cântecului, numele interpretului/trupei).

La rândul ei, funcționalitatea de redactare a cântecelor salvate local, cuprinde următoarele particularități:

informația despre cântec – album, artist, titlu, gen de muzică, numărul de ascultări și an;

informația despre fișier – numele fișierului, locația;

modificarea imaginii cover – ștergerea imaginii cover, selectarea imaginii cover, salvarea imaginii cover local;

sumar – vizualizare: bitrate, tipul fișierului, numărul de ascultări, mărimea, durata cântecului;

versuri – căutarea versurilor, ștergerea versurilor.

Un aspect important în cadrul aplicației este organizarea fișierelor muzicale, aceasta este asigurată de un file manager incorporat care posedă următoarele funcționalități:

crearea mapei, ștergerea mapei și editarea mapei;

adăugarea, mutarea, ștergerea și căutarea cântecelor în cadrul mapei;

ordonarea crescătoare și descrescătoarea a cântecelor după următoarele criterii:

artistul cântecului;

titlul cântecului;

data înscrierii cântecului;

durata cântecului.

Compatibilitatea cu Apple Watch oferă următoarele oportunități:

sincronizarea real time cu iPhone, iPad, iPod Touch;

redarea cântecului/cântecelor din lista de redare;

repetarea integrală a cântecelor din lista de redare, repetarea unui cântec;

redarea ordonată/aleatorie a cântecelor;

pornirea și oprirea cântecului;

trecerea la cântecul următor / precedent;

afișarea denumirii cântecului cât și numele interpretului;

actualizare imagine cover;

vizualizarea timpului curent de redare și timpului total.

Pentru a facilita de aceste oportunități aplicația dispune de anumite cerințe tehnice, cum ar fi:

compatibilitatea cu următoarele dispozitive: iPhone, iPad, iPod touch, Apple watch;

versiunea iOS 7.1 sau mai recentă;

memoria disponibilă de minim 70 MB.

Cerințele nefuncționale prevăd anumite caracteristici ale sistemului care determină accesibilitatea serviciilor în cadrul acestuia. Printre cerințele nefuncționale de care dispune aplicația se pot enumera:

disponibilitatea sistemului;

viteza maximă de răspuns;

timpul de recuperare în caz de indisponibilitate temporară a sistemului;

posibilitatea de extindere a funcționalităților;

configurabilitatea;

compatibilitatea cu alte sisteme;

localizare;

respectarea standardelor de proiectare și de implementare a sistemului;

consistența interfeței utilizator;

constrângeri de design;

cerințe de interfațare cu alte sisteme.

La etapa de elaborare a documentației se va respecta normele de formatare și standardizare. Aplicația va fi proiectată conform limbajului UML. Iar diagramele corespunzătoare vor fi realizate în conformitate cu principiile de proiectare adoptate.

2 Modelarea și proiectarea sistemului informatic

Procesul de proiectare reprezintă cea de-a treia etapă importantă în analiza de sistem, ea urmând etapelor de investigare și de modelare a sistemului. Obiectivul principal al acestei etape îl constituie obținerea unui proiect al sistemului cu ajutorul unor tehnici de proiectare specifice care sunt utilizate în funcție de natura și complexitatea sistemului analizat, de nivelul de cunoaștere și de experiența analistului în domeniul considerat, cât și de resursele materiale, financiare și de timp disponibile. Proiectul sistemului este rezultatul unei analize și a interpretării modelelor sistemului actual în vederea implementării noului sistem mai performant.

Procesul de proiectare conține două etape, și anume: proiectarea logică, prin care se detaliază ce trebuie să se construiască și precizează specificațiile logice ale sistemului, respectiv, proiectarea fizică, prin care se arată cum trebuie să fie construite aceste specificații și cum să funcționeze sistemul în mediul real, în funcție de resursele disponibile. Principiile și scopurile proiectării care orientează ambele etape sunt foarte generale și nu depind de sistemul la care se aplică sau de tehnicile de proiectare utilizate [4].

Sistemul informatic Cloudify va fi proiectat în cadrul Enterprise Architect. Acesta este un mediu de modelare bogat și divers. La un nivel înalt utilizează o gamă largă de instrumente ce ajută la: înțelegerea, vizualizarea, explorarea și lucrul cu sistemele complexe.

Acest mediu de proiectare are la bază următoarele caracteristici:

business analiză, modelarea proceselor business, gestionarea cerințelor;

modelarea specifică a limbajului UML;

colaborare și partajarea informației și modelelor;

testarea și calificarea sistemelor informaționale;

managementul și dezvoltarea task-urilor, lucrului și graficului.

La etapa de proiectare a sistemului în cadrul mediului de proiectare Enterprise Architect se va utiliza UML. Limbajul de modelare UML este un instrument standard pentru crearea carcaselor de documentare («desenelor») ale produsului soft. UML este un limbaj de vizualizare, specificare, construcție și documentare artefactelor sistemelor de program. UML este elaborat în așa fel că să poată satisface cerințele către modelarea oricărui sistem începând cu sisteme informaționale de dimensiunea unei întreprinderi până la aplicații web distribuite și sisteme integrate în timp real.

2.1 Descrierea comportamentală a sistemului

Descrierea comportamentală a sistemului cuprinde mai multe particularități care prevăd comportamentul sistemului, cum ar fi:

imaginea generală asupra sistemului;

modelarea vizuală a fluxurilor;

stările de tranzacție ale sistemului;

descrierea scenariilor de utilizare ale sistemului;

fluxurile de mesaje și legăturile dintre componentele sistemului.

Pentru început se stabilește imaginea generală asupra sistemului. Aceasta la rândul ei determină modelarea vizuală a sistemului. Modelarea vizuală în UML poate fi reprezentată ca un oarecare proces de lansare pe niveluri de la cel mai general și abstract model conceptual al sistemului inițial către model logic și mai apoi fizic, ce corespunde unui sistem de program. Pentru atingerea acestui scop de la început se creează un model în formă de diagrama cazurilor de utilizare (use case diagram) care descrie destinația funcțională a sistemului sau cu alte cuvinte descrie ceea ce sistemul va executa în procesul său de funcționare. Diagrama cazurilor de utilizare reprezintă un model inițial conceptual al unui sistem în procesul de proiectare și exploatare [5].

Proiectarea a unei diagrame a cazurilor de utilizare urmărește scopurile următoare:

determinarea limitelor comune și a contextului domeniului de modelare la etapele inițiale de proiectare a unui sistem;

formularea cerințelor comune către comportare funcțională a sistemului proiectat;

elaborarea modelului inițial conceptual al unui sistem pentru detalierea de mai târziu în forma modelelor logice și fizice;

pregătirea documentației inițiale pentru interacțiunea elaboratorilor unui sistem cu clienții și utilizatorii.

La fel, descrierea comportamentală a sistemului prevede și modelarea vizuală a fluxurilor. Pentru o astfel de modelare în limbajul UML se utilizează așa numitele diagrame de activități. Notația grafică acceptată pentru aceste diagrame are mult comun cu notația diagramei de stări ce se evidențiază prin notarea stărilor și tranzițiilor. Deosebirea constă în semantica stărilor care sunt utilizate pentru prezentarea acțiunilor dar nu activităților, și în aceea că tranzițiile evenimentelor nu sunt etichetate. Fiecare stare în diagrama de activități corespunde executării unei operațiuni elementare, dar trecere în altă stare se execută numai la terminarea operației în starea precedentă.

Pentru a descrie stările de tranziție a sistemului se utilizează diagrama canonică de stări care pune accentul la aspectul specificat de funcționare a sistemului. Spre deosebire de alte diagrame, diagrama de stări descrie procesul de modificare a stărilor numai pentru o clasă, pentru un exemplar a unei clase, adică de a modela toate modificările posibile în starea unui propriu obiect. În urma căruia modificarea stării obiectului poate fi provocată de influența externă a altor obiecte sau din exterior. Anume pentru descrierea reacției obiectelor la așa fel de influențe externe sunt utilizate diagramele de stări.

Diagrama de secvențe este utilizată pentru a descrie scenariile de utilizare ale aplicației. Această diagramă evidențiază modul în care obiectele în cadrul aplicației interacționează în aspect temporal. Schimbul de informație între aceste entități arată cum ele colaborează și modul de acceptare a mesajelor corespunzătoare.

Diagrama de colaborare oferă posibilitatea evidențierii fluxurilor de mesaje și legăturile dintre componentele sistemului. La fel, această diagramă evidențiază modul în care colaborează obiectele în aspect spațial. În cadrul acesteia timpul nu este un factor important. Legăturile dintre obiecte pot fi specificate în timp real în conformitate cu consecutivitatea de acțiuni și fluxuri paralele dintre acestea. Diagrama de colaborare reflectă un fel de reprezentare statică a unui sistem ca totalitate de obiecte dependente.

2.1.1 Imaginea generală asupra sistemului

Imaginea generală asupra sistemului este definită prin intermediul diagramelor cazurilor de utilizare care stabilesc funcționalitățile de bază ale sistemului.

Accesarea principalelor funcționalități sunt caracteristice anumitor componente de bază în cadrul aplicației. Un utilizator are opțiune de importare a muzicii, de redare cântecelor, descărcarea cântecelor din sisteme cloud și organizarea acestor în cadrul unor liste de redare. La fel, pot fi personalizate anumite setări legate de cache al aplicației și diverse setări de import al muzicii (figura 2.1).

Figura 2.1- Principalele categorii de funcționalități ale sistemului

Pentru accesarea muzicii preferate utilizatorul poate să selecteze țara corespunzătoare preferințelor acestuia, la fel să acceseze diferite categorii de muzică, iar muzica selectată utilizatorul o poate adăuga în cadrul listelor de redare. Utilizatorul dispune de accesul a muzicii din toate țările ale lumii, acesta poate găsi asculta și adăuga orice cântec în cadrul listelor de redare din aplicație având astfel acces în orice moment de timp (figura 2.2).

Figura 2.2- Accesarea muzicii preferate

O caracteristică importantă în cadrul aplicației este posibilitatea de a importa muzică din cadrul mai multor sisteme cloud prevăzute. Utilizatorul poate importa muzică din așa sisteme ca: Dropbox, Google Drive, ownCloud, OneDrive, Box. Această este posibil doar atunci când este realizată conexiunea la rețea. Totodată este necesar de a avea un cont în cadrul acestora. Serviciile cloud disponibile DropBox, Google Drive, Box, iCloud, One Drive, ownCloud permit utilizatorului sincronizarea rapidă și descărcarea muzicii în cadrul aplicației (figura 2.3).

Figura 2.3- Accesarea serviciilor cloud

În cadrul aplicației se prevăd anumite setări pentru a cumpăra opțiunea de a elimina publicitatea. La fel utilizatorul are posibilitatea de a ascunde imaginea cover pentru cântece în general. Pentru optimizarea funcționării aplicației la fel în setări se poate de curățit memoria cache pentru o gestionare a memoriei mai rezonabilă. În cazul când utilizatorul a decis să dezinstaleze aplicația, la următoare instalare el o sa aibă posibilitatea de recupera setările precedente (figura 2.4).

Figura 2.4- Accesarea setărilor

Utilizatorul odată cu găsirea sau importarea cântecelor preferate poate să le organizeze în cadrul listelor de redare, să creeze sau să șteargă listele de redare, să adauge în cadrul acestor cântece, să actualizeze listele create. De asemenea este prevăzută posibilitatea de vizualizare a listelor de redare predefinite cum ar fi: Top 25 cântece din lume, cântece recent adăugate, cântece recent ascultate și gruparea după albume, artiști și genuri de muzică (figura 2.5).

Figura 2.5- Gestionarea listelor de redare

2.1.2 Modelarea vizuală a fluxurilor

Pentru modelarea vizuală a fluxurilor se utilizează diagramele de activități care permit definirea algoritmilor de realizare a serviciilor din cadrul aplicațiilor.

În cadrul figurii 2.6 se descrie descărcarea cântecelor de pe sisteme cloud. Pentru această utilizatorul trebuie să selecteze sistemul corespunzător din lista propusă, apoi să se autentifice în caz dacă el nu este autentificat. Navigând prin fișiere, el poate să selecteze unul sau mai multe cântece pentru descărcarea acestuia.

Figura 2.6 – Descărcarea cântecelor de pe sisteme cloud

În figura 2.7 este reprezentat procesul de editare a metadatelor cântecelor disponibil odată cu accesarea acestora.

Figura 2.7- Editarea metadatelor cântecelor

Inițial utilizatorul trebuie să selecteze un cântec. La editarea acestuia se pot modifica mai multe opțiuni disponibile. Utilizatorul poate modifica imaginea cover în diferite moduri. Această imagine poate fi ștearsă, salvată sau aleasă din cadrul galeriei. Fiecare cântec are versurile corespunzătoare. În cadrul Cloudify se pot vizualiza, șterge sau căuta versurile cântecului.

La fel, se prevede editarea informației de bază despre cântec ce țin de:

denumirea cântecului;

numele albumului;

genul de muzică;

ordinea cântecului în album;

anul de lansare.

2.1.3 Stările de tranziție ale sistemului

Pentru a descrie stările de tranziție a sistemului se utilizează diagrama canonică de stări care descrie procesul de modificare a stărilor obiectelor.

Diagrama din figura 2.8 include mai multe substări ale cântecelor care se prevăd a fi utilizate pentru streaming. Inițial se obține primul cântec, acesta este verificat dacă corespunde cererii utilizatorului. În cazul când cererile corespunzătoare au fost verificate acestea se transmit aplicației și ordonează în conformitate cu criteriile stabilite de utilizator. În final acestea sunt propuse în cadrul aplicației ca lista de cântece de referință.

Figura 2.8- Procesul de examinare a cererii utilizatorului

Figura 2.9 oferă o prezentare generală a managerului de descărcare a pieselor. Stările acestuia reflectă schimbările semnalate de aplicație prin intermediul evenimentului onDownloadStateChange. Cereri de descărcare noi primite, pot fi plasate în coadă de așteptare din cauză că managerul tratează cererile una câte una, însă le grupează după prioritate.

Figura 2.9- Stările descărcării cântecelor

În cadrul figurii 2.10 sunt reprezentate stările listelor de redare. Odată ce se intenționează și se completează datele necesare pentru crearea listei de redarea, aceasta ajunge în starea Created, care prin urmare va fi salvată, efectuându-se tranziția la starea Saved. Odată ce lista a fost salvată și conține cântece, aceasta poate fi sortată dupa mai multe criterii. Lista poate suferi anumite modificări care în prealabil pot fi anulate.

Figura 2.10- Stările listei de redare

2.1.4 Descrierea scenariilor de utilizare ale sistemului

Descrierea scenariilor de utilizare ale sistemului evidențiază modul în care obiectele în cadrul aplicației interacționează în aspect temporal.

În diagrama din figura 2.11 este reprezentat procesul de autentificare a utilizatorului în cadrul sistemului cloud Google Drive. Pentru interacțiune cu aplicația, Google oferă interfața OASIS SAML 2.0. Serviciul dat permite accesul la Google Drive. Google identifică numele de utilizator, parolele și alte informații utilizate pentru identificare, autentificarea și autorizarea utilizatorilor în cadrul aplicației. Fiecare URL are propriul serviciu SSO care transmite cheia publică lui Google pentru verificarea răspunsurilor SAML.

Figura 2.11- Autentificarea în Google Drive

Pentru a ușura procesul de căutare a cântecelor online, este utilizat un manager de sugestii (figura 2.12). Odată ce utilizatorul introduce primele litere a cântecului interesat, are loc transmiterea cererilor către serviciul de căutare Google, pentru a oferi sugestii cât mai relevante. Atunci când a fost găsit cântecul corespunzător, utilizatorul îl poate selecta din cadrul listei propuse de manager. La accesarea filei cu liste de redare, are loc afișarea acestora. Pentru a obține datele pentru ele, are loc transferul cererii către baza de date cu parametri necesari.

Figura 2.12- Manager de sugestii

În cadrul figurii 2.13 este reprezentat procesul de creare a unei liste de redare în cadrul sistemului. Inițial, odată ce utilizatorul alege opțiunea de a creare, datele despre lista de redare sunt stocate în cadrul entității corespunzătoare din baza de date. Prin urmare, în cadrul acestei liste se pot adăuga diverse cântece dependente de entitatea în cauză. Odată cu ștergerea acesteia se vor șterge și cântecele care fac parte din această listă. Utilizatorul la fel are posibilitatea de a transfera cântecele unei liste de redare în cadrul alteia. Astfel, poți gestiona muzica preferată în conformitate cu preferințele proprii.

Figura 2.13- Crearea unei liste de redare

În cadrul sistemului este prevăzută posibilitatea de a căuta cântece în conformitate cu preferințele utilizatorului (figura 2.14). Căutarea are loc după numele artistului, denumirea cântecului corespunzător. Datele introduse vor fi prelucrate în prealabil de 3 entități KeywordSet, SearchFacade și ContextWord. Acestea procesează baza de date cu cântece pentru a găsi rezultatele corespund parametrilor de căutare.

Figura 2.14- Căutarea cântecelor după cuvinte cheie

În cadrul figurii 2.15 este descris procesul de obținere a clasamentului Top 25, care cuprinde 25 de cântece care au fost cel mai des ascultate pe parcursul utilizării sistemului. Acest clasament oferă o viziune asupra preferințelor utilizatorului și depinde de conținutul ascultat pe parcursul unei perioade de timp. Acest clasament este în permanentă actualizare. Prin urmare utilizatorul va avea acces la date actuale de fiecare dată când va accesa acest clasament.

Figura 2.15- Accesarea listei de redare Top 25

2.1.5 Fluxurile de mesaje și legăturile dintre componentele sistemului

Diagrama de colaborare oferă posibilitatea evidențierii fluxurilor de mesaje și legăturile dintre componentele sistemului. La fel, această diagramă evidențiază modul în care colaborează obiectele în aspect spațial.

În cadrul sistemului este prevăzut posibilitatea de utilizare a serviciilor cloud, printre care este și OneDrive, care necesită o logare preventivă. Pentru a facilita de această funcționalitate este necesar să se îndeplinească anumiți pași pentru logare reușită (tabelul 2.1).

Tabelul 2.1- Logarea în cadrul serviciului OneDrive

În figura 2.16 este reprezentat procesul de logare corespunzător. Logarea în cadrul serviciului OneDrive necesită existența unui cont în cadrul acestuia. Numai prin intermediul contului personal utilizatorul va putea accesa și descărca cântecele necesare.

Figura 2.16- Logarea în sistemul cloud OneDrive

În cadrul dezvoltării unui produs este important ca pe parcursul utilizării acestuia erorile la nivel de sistem să fie depistate și corectare rapid. Această particularitate este importantă în etapa de mentenanță, deoarece anumite inconsistențe ar putea determina pe utilizator să se dezică de acest sistem și să opteze pentru un produs propus de concurenți. Astfel, aceasta ar putea influența la nivelul de popularitate a sistemului pe piață și nu în ultimul rând la veniturile dezvoltatorilor.

Pentru dezvoltatori sunt propuse diverse soluții pentru monitorizarea nivelului de utilizare a aplicației în timp real. Prin urmare, pot rapid să acționeze în cazul în care sistemul nu a putut răspunde la anumite cereri ale utilizatorului. În aceste scopuri, dezvoltatori care creează și mențin aplicații pe platforma iOS pot utiliza așa tehnologii ca Crashlitics și Fabric. În cadrul tabelului 2.2 este prezentat un scenariu de depistare a erorilor din sistem în timp real.

Tabelul 2.2- Evidența erorilor de sistem

În cadrul figurii 2.17 este reprezentat în aspect spațial modul în care colaborează entitățile corespunzătoare în vederea depistării erorilor din sistem conform scenariului descris în tabelul 2.2.

Figura 2.17- Depistarea și colectarea erorilor la nivel de sistem

2.2 Descrierea structurală a sistemului

Descrierea structurală a sistemului cuprinde mai multe particularități care prevăd aspectul structural al aplicației și modul cum entitățile corespunzătoare, cum ar fi:

descrierea structurii statice a sistemului;

relațiile de dependență dintre componentele sistemului;

modelarea echipamentelor mediului de implementare.

Inițial sistemul trebuie descris din punct de vedere a structurii statice. Corespunzător acesteia se elaborează diagrama de clase. Aceasta se utilizează pentru reprezentarea structurii statice a unui model de sistem în terminologia claselor programării OO. Diagrama de clase poate reflecta diferite legături între entitățile domeniului de obiecte (obiecte și subsisteme) și descrie structura lor internă și tipurile de relații. În această diagramă nu este menționată informația despre aspectele temporare ale funcționării sistemului. Din acest punct de vedere diagrama de clase este dezvoltarea ulterioară a modelului conceptual al sistemului proiectat.

Proiectarea unui sistem în cadrul diagramei de componente reflectă relațiile de dependență dintre componentele aplicației. Cu alte cuvinte diferite elemente ale reprezentării logice (clase, asocieri, stări, mesaje) nu există în mod material sau fizic. Ele numai reflectă înțelegerea despre sistemul fizic sau despre aspectele comportamentului acestui sistem. Destinația principală a reprezentării logice constă în analiza relațiilor structurale și funcționale între elementele unui model de sistem. Pentru crearea unui sistem fizic real este necesar a transforma toate elementele reprezentării logice în entități materiale. Pentru descrierea acestor entități este destinat aspectul reprezentării modelare – fizice.

Reprezentarea fizică a sistemului de programare nu poate fi plină, dacă lipsește informația despre programele și metode de realizare a calcului. Astfel în conformitate cu cerințele față de sistem are loc modelarea echipamentelor mediului de implementare. În primul rând, sistemele de programare compuse pot fi realizate în formă de rețea în diferite programe de calcul și tehnologiile de accesare la baze de date. Prezența rețelei locale corporative necesită rezolvarea totalității de probleme adăugătoare despre amplasarea rațională a componentelor după nodurile rețelei, ce definesc producerea generală a sistemului de programare. Integrarea sistemului de programare cu Internet definește necesitatea deciziei întrebărilor adăugătoare în timpul proiectării sistemului în așa fel ca asigurarea securității, și accesul stabil la informație pentru clienții corporativi.

2.2.1 Descrierea structurii statice a sistemului

Descrierea structurii statice a sistemului prevede elaborarea diagramelor de clase pentru a defini relațiile între componentele sistemului.

În cadrul următoarei diagrame din figura 2.18 se afișează varietatea de formate audio suportate. Pentru aceasta a fost implementată interfața MediaPlayer și clasa AudioPlayer. AudioPlayer poate reda cântece MP3 în mod implicit. De asemenea a fost creată interfața AdvancedMediaPlayer și clase ce o realizează, ele pot reda formatul AAC, FLAC și ALAC.

AudioPlayer utilizează clasa MediaAdapter oferind ei formatul audio al cântecului sunetului fără ca clasa să cunoască de ce format este el. Astfel, dacă în viitor se va adăuga alte formate de cântece, player-ul poate fi extins cu extensii noi.

Figura 2.18- Formatele audio instanțiate

În figura 2.19 este reprezentat structura managerului de fișiere implementat conform șablonului de proiectare Composite. Acesta permite gruparea obiectelor în structuri arborescente pentru a reprezintă ierarhii de tip parte-întreg. La fel permite clienților să trateze în același mod obiecte compuse și individuale. Astfel clienții pot trata în același mod toate obiectele unei structuri. Clasa FolderComponent declară interfața pentru obiecte din compoziție, implementează comportament implicit comun pentru toate clase ce implementează această interfață, declară interfața de acces și management la componente descendente.

Clasa Song reprezintă obiecte individuale care nu au descindeți și definește comportamentul obiectelor prin baza de compoziție. Clasa AudioFormat definește comportament pentru componente ce au descendenți conține componente descendent, implementează operațiile legate de descendenți din interfața component. Clasa FileManagerViewController manipulează cu obiecte din composite prin interfața component.

Figura 2.19- Structura managerului de fișiere

În cadrul imaginii 2.20 este reprezentată gestionarea cererilor create de client. Pentru aceasta a fost aplicat șablonul Builder. Acesta Separă construcția unui obiect complex de reprezentarea acestuia, astfel încât același proces de construcție să poată crea reprezentări diferite. RequestBuilder specifica o interfața abstracta pentru crearea parților obiectului produs.

PostRequestType și GetRequestType construiesc și asamblează cererii prin implementarea interfeței RequestBuilder. RequestManager construiește obiecte utilizând interfața RequestBuilder. Request reprezintă obiectul complex care este construit.

Figura 2.20- Cererile clientului

În cadrul diagramei (figura 2.21) sunt reprezentate criteriile după care se identifică un cântec. Fiecare cântec are un artist concret, albumul în care acesta a fost inclus. Fiecare utilizator poate să creeze sau să șteargă o categorie din cadrul bibliotecii de muzică în care se includ toate cântecele caracteristice acesteia. La fel utilizatorul poate să șteargă orice cântec.

Figura 2.21- Structura bibliotecii muzicale

Artiștii pot să aparțină niciun grup sau mai multor grupe. Grupurile pot să conțină mai mulți artiști individuali. Utilizatorii pot să vadă lista tuturor cântecelor a unui artist anumit. La fel utilizatorii pot vizualiza lista tuturor cântecelor corespunzător unui anumit grup.

De asemenea este prevăzută posibilitatea de vizualizarea a listelor de redare predefinite cum ar fi: Top 25 cântece din lume, cântece recent adăugate, cântece recent ascultate și gruparea după albume, artiști și genuri de muzică.

2.2.2 Relațiile de dependență dintre componentele sistemului

Pentru a defini relațiile de dependență dintre componentele sistemului au fost realizate diagramele de componente corespunzătoare.

În cadrul aplicației există următoarele componente reprezentate în figura 2.22. Reachability se utilizează pentru verificarea conexiunii la internet. Pentru descărcarea datelor create în cadrul aplicației se utilizează metode din clasa Reachability ce returnează starea curentă a conexiunii. Pentru aceasta se verifică statutul rețelei la un anumit host name. Aceasta demonstrează cum să afli când IP poate fi dirijat și când traficul va fi dirijat prin interfața Wireless Wide Area Network. Reachability nu poate spune dacă aplicația poate să se conecteze la un host particular, doar că o interfață este disponibilă și poate accepta o conexiune și dacă această interfață este WWAN. Core Data Stack este o colecție de obiecte framework care sunt accesate ca o componentă la inițializarea Core Data și care mediază între obiectele din cerere și stochează date externe. Core Data Stack se ocupă de toate interacțiunile cu datele externe stocate. Astfel, cererea se poate focusa pe business logică.

Figura 2.22- Componentele aplicației

Această stivă este formată din 3 obiecte principale contextul obiectului gestionat NSManagedObjectContext, coordonatorul persistent de stocare NSPersistentStoreCoordinator și modelul obiectului gestionat NSManagedObjectModel. Se recomandă ca să se inițializeze datele din Core Data Stack înainte ca să fie accesate datele aplicației. Inițializarea stivei pregătește Core Data pentru cererile de date și crearea datelor. Componenta <Crashlitics/Crashlitics.h> se include în componenta <Fabric/Fabric.h> ce arată statistica și erorile de sistem.

Unul dintre principalele componente al aplicației este fișierul Cloudify.pch. El este necesar pentru a include principalele dependențe, care sunt vizibile din orice clasă chiar dacă nu este importată librăria în cadrul clasei curente. AdsManager este utilizat pentru gestionarea publicității din aplicație iar ModifyUtilities conține metode ce sunt utilizate în mai multe clase componente.

FMDatabase reprezintă o bază univocă SQLite utilizată pentru executarea interogările corespunzătoare SQL. FMDatabaseAdition reprezintă rezultatul executărilor a interogărilor în cadrul FMDatabase. FMDatabaseQueue se utilizează atunci când se execută interogări și se actualizează în mai multe fire de execuție, această descrie cum se implementeze “Thread safety”.

Baza de date SQLite permite gestionare eficientă a datelor în cadrul aplicației create. API ascunde toate detaliile SQL și alte operații în spatele scenei, până când FMDB oferă o cale mai bună de manipulare a datelor la nivel jos de API (figura 2.23).

Figura 2.23- Sistemul logic al bazei de date

2.2.3 Modelarea echipamentelor mediului de implementare

Diagrama de plasare specifică vizualizarea elementelor și componentelor a programului, ce există numai la etapa executării lui (figura 2.24) cât și la etapa de modelare a echipamentelor mediului de implementare. În urma căruia sunt prezentate numai componente, exemplare a programului, care sunt fișiere de executare sau librăriile dinamice.

Un nod reprezintă un anumit element fizic a sistemului, care are o anumită resursă de calculare. Conectările sunt un fel de asociere și sunt prezentate în formă de linii fără săgeți. Prezența liniei indică necesitatea organizării canalului fizic pentru schimbarea informației între nodurile respective.

Figura 2.24- Diagrama structurală a aplicației

3 Realizarea sistemului

Aplicația este realizată pe platforma iOS din mai multe considerente. iOS este un sistem de operare care rulează pe iPhone, iPod touch, iPad, Apple Watch. Este o platformă foarte populară luând în vedere că peste un miliard de dispozitive iOS au fost vândute numai în anul 2015, acest număr pare incredibil. În prezent, peste 1,4 milioane de aplicații sunt distribuite prin App Store. Această platformă este una dintre cele mai populare pentru dezvoltatori. Unele dintre avantaje ale aceste platforme este faptul că este scalabil, robust, puternic și se poate manipula cu ușurință nivel ridicat de eficiență [6].

iOS este un sistem de operare de tip Unix, care încă în prima sa versiune a conținut multe elemente din Mac OS X, tot un sistem de operare de tip Unix de la Apple. Atunci când cumpărați un dispozitiv iOS, poți să știi cu precizie că ai cumpărat un produs calitativ.

Apple acordă mare atenția design-ului interfeței pentru a face navigarea prin iOS ușoară și intuitivă. Chiar și un începător va înțelege cum funcționează UI, va putea să navigheze prin el fără ajutorul cuiva. Platforma iOS este ușor de utilizat, intuitiv și fermecător. Un avantaj al utilizării platformei iOS este App Store. Acesta oferă un număr foarte mare de aplicații de calitate, care în mare parte sunt gratuite și foarte utile. Acesta este cel mai mare mediu de dezvoltatori din lume.

Apple a început să pună accent pe autonomia bateriei, făcând din asta un criteriu de bază de alegere a produsului. În primul rând aceasta se referă la iPad, cu o mare capacitate de stocare a energiei, și cu posibilitatea de gestionare a acesteia. În această categorie intră și celelalte dispozitive pe iOS, care sunt capabile să funcționeze toată ziua (uneori chiar și mai mult).

iTunes e cel mai mare magazin online de unde pot fi achiziționate muzică, filme, podcasturi, cărți audio, seriale, emisiuni TV. Este disponibil pentru iPhone, iPod 5thG, Windows și Mac. Nici o altă platformă mobilă nu are la dispoziție un număr atât de mare de content media pentru utilizatorii săi.

iPhone-ul și iPad-ul au un design superior celui din concurență. Apple folosește materiale de calitate, cum ar fi aluminiul și sticla pe care alții nu le folosesc și dau o identitate produselor sale. Când privești un iPhone, ești atras de design-ul său. Fără plastic, sau alte chestii care îl fac să arate urât. Când de uiți la el, îți dai seamă ca e un produs premium, simplu, elegant și atrăgător [7].

Printre dezavantajele principale ale acestei platforme sunt costurile suportate la achiziția unui produs iOS. Consumatorii anual scot o sumă consistentă de bani din buzunar pentru beneficia de serviciile platformei iOS.

Aplicația Cloudify va fi implementată în limbajul de programare orientat pe obiecte Objective C. Limbajul Objective C este tot o extensie a limbajului C pentru lucrul orientat pe obiecte, considerată uneori superioară C++. Sistemul de operare NextStep a fost scris în întregime în Objective C.

Spre deosebire de C++, pentru compilarea codului scris în Objective C nu este necesar un compilator special. Objective C constă într-un preprocesor care translează codul Objective C în cod C, urmând ca acesta sa fie transformat în cod obiect de către un compilator standard C. Toate clasele sunt derivate în mod automat din clasa predefinită Object. Această clasă poate fi referită prin intermediul identificatorului super. Față de C++ sunt câteva deosebiri: nu se poate realiza moștenire multiplă, nu există nici un mecanism de control al accesului, etc.

Metodele de acces la datele încapsulate în interiorul clasei pot fi apelate trimițând mesaje către obiecte. Gestionarea mesajelor este transparentă pentru programator, implementarea fiind realizată cu ajutorul unor funcții de bibliotecă.

La implementarea sistemului au fost utilizate CocoaPods. Aceasta reprezintă o tehnologie utilizată pentru a rezolva dependențe de librării în proiect. Ea include peste 28 mii de librării utilizate în 1.7 milioane de aplicații din App Store. CocoaPods ajută la scalarea elegantă a proiectelor. Pentru integrarea tehnologiei date, este necesar de a adăuga dependențe în fișierul Podfile. CocoaPods rezolvă dependențe recursiv dintre librării, descarcă codul sursă pentru toate dependențele, creează și menține spațiul de lucru Xcode pentru a construi proiectul.

La fel, a fost utilizat Fabric, o platformă mobilă ce oferă un ansamblu de module ce pot fi mixate pentru a construi aplicații de succes. Ea este strâns integrată în mediul dezvoltării asigurând integrarea a modulelor noi foarte ușor.

Pentru monitorizarea crash-urilor pe platforma iOS a fost utilizată cea mai populară tehnologie. Crashlytics. Ea permite de a obține informația în timp real despre crash-urile din aplicație, oferind posibilitatea de a reacționa asupra problemelor cât mai rapid. De asemenea sunt oferite date statistice despre numărul de descărcări a aplicației, numărul de utilizatori activi, preferințele utilizatorilor ce folosesc aplicația etc.

Iar pentru containerul lateral proiectat a fost utilizat MMDrawerController cu scopul de a suporta un număr mare de aplicații care urmează să implementeze paradigma “Side drawer”. Această tehnologie este concepută pentru a sprijini în mod exclusiv navigarea Side drawer, este focusată spre oferirea animațiilor personalizate pentru prezentarea și ascunderea Side drawer-ului. Nevoia unui serviciu de stocare online a datelor este generată în special de posibilitatea de a putea accesa rapid un anumit fișier indiferent de calculatorul, laptopul, smartphone-ul sau tableta de pe care te conectezi, prin intermediul unui browser sau a unei aplicații mobile.

Aplicația este bazată pe diverse servicii cloud cum ar fi utilizarea serviciilor Dropbox, Google Drive, OneDrive, Box.

Dropbox este unul dintre cele mai cunoscute servicii pentru păstrarea datelor pe internet, în primul rând datorită ușurinței de utilizare, a interfeței prietenoase, a aplicațiilor disponibile pentru platforme mobile și a posibilității de a distribui cu ușurință datele cu alți utilizatori sau în cazul dat cu aplicația Cloudify.

Suita office online Google Docs a fost transformată treptat într-un adevărat serviciu de stocare a datelor care a primit numele Google Drive. Chiar dacă beneficiază de asemenea de aplicații desktop și pentru smartphone și tabletă, acesta nu este la fel de ușor de utilizat precum Dropbox. Google Drive are și un atu suplimentar: oferă gratuit spațiu de stocare de 15 GB, iar pachetele lunare suplimentare sunt accesibile: 100 GB pentru 2 dolari și 1 TB pentru 10 dolari.

Cunoscut anterior sub numele SkyDrive, OneDrive este serviciul de stocare a datelor de la Microsoft, care beneficiază de asemenea de aplicații în browser pentru desktop și aplicații dedicate pentru smartphone-uri și tablete, inclusiv pentru platforma Windows Phone. La fel ca Dropbox, aplicația are o funcție pentru încărcarea automată în cont al fotografiilor realizate cu telefonul, iar prin activarea acestei funcții primești un bonus de 3 GB.

Box este un alt serviciu popular dedicat păstrării datelor personale în cloud, iar acestea pot fi accesate de pe o multitudine de platforme, inclusiv browser și aplicații mobile. De altfel, pentru utilizatorii individuali serviciul este destul de limitat. Chiar dacă oferă 10 GB în regim gratuit, nu poți încărca fișiere mai mari de 250 MB, lucru nu tocmai avantajos pentru cei care preferă să salveze inclusiv filme.

3.1 Proiectarea bazei de date

Bazele de date sunt o componentă importantă în cadrul fiecărei aplicații deoarece în cursul unei zile majoritatea persoanelor desfășoară activități care implică interacțiunea cu diverse tipuri de date: depunerea sau extragerea unei sume de bani din bancă, rezervarea biletelor de tren sau de avion, căutarea unei cărți într-o bibliotecă computerizată, gestiunea angajaților dintr-o firmă, cumpărarea unor produse etc.

Bazele de date pot avea mărimi și complexități extrem de variate, de la câteva zeci de înregistrări până la milioane de înregistrări .

Primul pas în realizarea unei aplicații care implică utilizarea unei baze de date este analiza datelor și realizarea unei scheme conceptuale (model conceptual) al acestor date. În această etapă sunt analizate natura și modul de utilizare a datelor. Sunt identificate datele care vor trebui memorate și procesate, se împart aceste date în grupuri logice și se identifică relațiile care există între aceste grupuri. Analiza datelor este un proces uneori dificil, care necesită mult timp, însă este o etapă absolut obligatorie.

O bună organizare a datelor permite accesul rapid la informație. Astfel va fi asigurată una dintre cerințe nefuncționale care prevede viteza de răspuns la cererile utilizatorilor. Baza de date a aplicației este organizată în 4 entități care oferă informații despre cântece, artiști și date adiționale (figura 3.1).

Figura 3.1- Modelul logic al bazei de date aplicației

În cadrul bazei de date au fost create următoarele entități: OnlinePlaylist, Playlists, Orders, Allfiles. O entitate se referă la un aspect al realității obiective și poate reprezenta un obiect fizic, o activitate, un concept, etc. orice entitate este descrisă prin atributele sale. Un atribut este o proprietate care descrie un anumit aspect al unei entități. De exemplu, entitatea Allfiles descrie orice fișier audio, care are o anumită descriere a sa și care are legătură cu ordinea sa într-o listă de redare. Acest tip de entitate poate fi descris prin mai multe atribute, dintre care o parte sunt atribute de identificare a piesei (album, artist, title, genre), iar altele sunt atribute de specificare a detaliilor unei piese (bitrate, path, playcount, etc.).

Există 2 categorii de entități, entități normale (regular entities) și entități slabe (weak entities). Entitățile normale au o existență proprie în cadrul modelului, în timp ce entitățile slabe nu pot exista fără o entitate normală cu care sunt asociate. De exemplu, o entitate “Playlists” este o entitate puternică, deoarece în ea există în mod normal listele de redare de bază cum ar fi liste de redare proprii, listă cu 25 cele mai ascultate cântece, cântece recent ascultate etc., în timp ce o entitate “Orders” este o entitate slabă: piesele dacă nu sunt disponibile, ele nu vor face parte din careva liste de redare. O relație este o corespondență între entități din două sau mai multe mulțimi de entități. Gradul unei asocieri este dat de numărul de mulțimi de entități asociate. Asocierile pot fi binare sau multiple. Fiind date două mulțimi de entități, se pot defini următoarele asocieri binare prezente:

“unul-la-unu” – este asociere prin care unui element din mulțime îi corespunde un singur element din a doua mulțime (o listă de redare poate avea doar o singură ordine de redare);

“unul-la-multe” – este asociere prin care unui element din prima mulțime îi corespunde unul sau mai multe elemente din mulțimea doua, iar elementului din mulțimea doua îi corespunde un singur element din prima mulțime (un cântec poate avea ordine diferită în mai multe liste de redare).

3.2 Realizarea funcționalităților sistemului

La etapa de implementare se prevede realizarea funcționalităților în cadrul componentelor de bază care definesc structura aplicației și gama de servicii suportată.

Componenta SoundManager

SoundManager este o clasă destinată redării pieselor în aplicația Cloudify. Sistemul de operare minimal suportat este iOS versiunea 8.0. Pachetul SoundManager definește 2 clase, SoundManger clasa în sine și clasa Sound, ele sunt utilizate ca un wrapper pentru fiecare fișier care fi redat. Printre atributele clasei Sound se pot enumera: name, URL, duration, currentTime, playing, looping, SoundCompletionHandler, baseVolume, volume, pan.

Atributul name reprezintă denumirea fișierului audio, acest nume va fi transferat metoda constructor soundNamed: sau ultimei mapei componente a fișierului audio (figura 3.2).

@property (nonatomic, readonly, copy) NSString *name;

Figura 3.2- Numele cântecului

Fiecare fișier audio are un URL absolut @property (nonatomic, readonly, strong) NSURL *URL;. Fiecare piesă are durata sa, pentru aceasta este utilizată următorul atribut @property (nonatomic, readonly) NSTimeInterval duration; (figura 3.3).

Figura 3.3- Durata cântecului

Următorul atribut permite de a schimba Offsetul piesei curente, este măsurat în secunde (figura 3.4). Această valoare poate fi rescrisă, cu scopul de a schimba progresul curent al piesei @property (nonatomic, assign) NSTimeInterval currentTime;.

Figura 3.4- Timpul curent

Atributul playing returnează TRUE dacă piesă este redată sau FALSE dacă piesă oprită @property (nonatomic, readonly, getter = isPlaying) BOOL playing; (figura 3.5).

Figura 3.5- Oprirea cântecului

Atributul looping returnează valoarea TRUE a fost setat ca să se repete, și valoarea FALSE în caz contrar @property (nonatomic, assign, getter = isLooping) BOOL looping; (figura 3.6).

Figura 3.6- Repetarea cântecului

Atributul SoundCompletionHandler este utilizat în blocul callback care se va apela atunci când fișierul audio își va termina redarea. Doar un bloc SoundCompletionHandler poate fi setat doar pentru o instanță sound, doar dacă este nevoie de mai multe obiecte pentru urmărirea statului lui sound, poți adăuga observere pentru notificarea SoundDidFinishPlayingNotification.

Atributul baseVolume reprezintă volumul maxim al sunetului. Unele sunt mai gălăgioase decât altele și această poate fi enervant, încercând să modifici volumul sunetului pentru diferite fișiere audio. Acest atribut permite să egalezi volumul pentru diferite sunete atunci poți ajusta volumul lor consistent din acest punct de vedere.

@property (nonatomic, assign) float baseVolume;

Atributul volume reprezintă volumul sunetului. Această valoare este multiplicată cu atributul baseVolume pentru a obține volumul actual. Starea inițială este 1.0 (maximum).

@property (nonatomic, assign) float volume;

Componenta Sound

Prin urmare se va descrie metodele clasei Sound. Următoare metodă reprezintă un constructor al metodei soundNamed: ce returnează piesa corespunzătoare numelui fișierului din aplicație. Dacă extensia fișierului este omisă, atunci acestuia i se atribuie extensia .caf.

+ (instancetype)soundNamed:(NSString *)name {

NSString *path = name;

if (![path isAbsolutePath])

{

if ([[name pathExtension] isEqualToString:@""])

{

name = [name stringByAppendingPathExtension:@"caf"];

}

path = [[NSBundle mainBundle] pathForResource:name ofType:@""];

}

return [self soundWithContentsOfFile:path];

}

Metoda fadeTo: micșorează volumul cântecului de la volumul curent la volumul specificat peste o perioadă anumită de timp. Această metodă nu va reda cântecul, deci ea trebuie sa fie apelată.

– (void)fadeTo:(float)volume duration:(NSTimeInterval)duration

{

_startVolume = [_sound volume];

_targetVolume = volume * _baseVolume;

_fadeTime = duration;

_fadeStart = [[NSDate date] timeIntervalSinceReferenceDate];

if (_timer == nil)

{

self.timer = [NSTimer scheduledTimerWithTimeInterval:1.0/60.0

target:self

selector:@selector(tick)

userInfo:nil

repeats:YES];

}

}

Metoda sharedManager returnează o singură instanță pentru clasa SoundManager:

+ (instancetype)sharedManager

{

static SoundManager *sharedManager = nil;

if (sharedManager == nil)

{

sharedManager = [[self alloc] init];

}

return sharedManager;

}

Metoda prepareToPlay, încarcă preventiv un cântec aleatoriu din banda la aplicație, care inițializează un audioPlayback. Aceasta trebuie apelată înainte de încercare de a reda fișierul audio ideal în timp ce se începe secvența de redare, pentru eliminarea perioadei de așteptare atunci când prima dată este redat fișierul audio. Aceasta ar trebui să lucreze doar atunci când cel puțin un fișier audio este inclus în ierarhia de fișiere în aplicație. Dacă toate fișierele audio sunt în mape se consideră adăugarea unui fișier audio scurt și liniștit pentru inițializarea propuse sau pentru utilizarea metodei prepareToPlayWithSound: în loc de aceasta.

– (void)prepareToPlay {

static BOOL prepared = NO;

if (prepared) return;

prepared = YES;

#if SM_USE_AV_AUDIO_PLAYER

#if TARGET_OS_IPHONE

[AVAudioSession sharedInstance];

#endif

[_sound prepareToPlay];

#else

[_sound setVolume:0.0f];

[self play];

[self performSelector:@selector(stop) withObject:nil afterDelay:0.0];

#endif

}

Dacă fișierul audio nu este localizat în ierarhia de fișiere în cadrul aplicației atunci metoda prepareToPlay nu va funcționa. În acest poți să utilizezi metoda prepareToPlatWithSound: și să specifici fișierul particular utilizat pentru inițializare. Parametrul poate fi filename, path, sau o instanță a clasei Sound.

– (void)prepareToPlayWithSound:(id)soundOrName {

Sound *sound = [soundOrName isKindOfClass:[Sound class]]? soundOrName: [Sound soundNamed:soundOrName];

[sound prepareToPlay];

}

Metoda playMusic: este responsabilă pentru redarea fișierelor audio. Dacă argumentul metodei fadeIn este TRUE muzica treptat va apărea cu un volum mai mic specificat de atributul musicVolume peste o perioadă de timp specificat de musicFadeDuration. Clasa SoundManager permite doar ca un fișier audio să fie redat la un anumit moment de timp. Deci dacă există un fișier audio care se redă, acesta va dispărea treptat. Daca argumentul looping are valoarea TRUE, muzica va continua să fie redată până când nu va fi apelată metoda stopMusic.

– (void)playMusic:(id)soundOrName looping:(BOOL)looping fadeIn:(BOOL)fadeIn {

Sound *music = [soundOrName isKindOfClass:[Sound class]]? soundOrName: [Sound soundNamed:soundOrName];

if (![music.URL isEqual:_currentMusic.URL])

{

self.currentMusic = music;

[[NSNotificationCenter defaultCenter] addObserver:self

selector:@selector(musicFinished:)

name:SoundDidFinishPlayingNotification

object:music];

_currentMusic.looping = looping;

_currentMusic.volume = fadeIn? 0.0f: _musicVolume;

[_currentMusic play];

if (fadeIn) {

[_currentMusic fadeTo:_musicVolume duration:_musicFadeDuration];

}

}

}

Servicii cloud oferite de Box

Pentru a implementa serviciile oferite de sistemul cloud Box este necesar ca să fie actualizat mediul de dezvoltare Xcode și de a importa SDK (instrumentul de dezvoltare software) utilizând CocoaPods pentru a gestiona cu dependențele între proiect si SDK.

Inițial trebuie de adăugat fișierul Podfile corespunzător pod 'box-ios-sdk'. Se instalează acest pod, iar apoi se importă clasa #import <BoxContentSDK/BOXContentSDK.h>. Se setează ID-ul clientului Box și clientul secret care sunt obținute la crearea aplicației.

– (BOOL)application:(UIApplication *)application

didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

{

[BOXContentClient setClientID:@"your-client-id" clientSecret:@"your-client-secret"];

}

Autentificarea utilizatorului are loc astfel (figura 3.7):

[[BOXContentClient defaultClient] authenticateWithCompletionBlock:^(BOXUser *user, NSError *error) {

if (error == nil) {

NSLog(@"Logged in user: %@", user.login);

}

} cancelBlock:nil];

Figura 3.7- Autentificarea în sistemul Box

Instrumentul de dezvoltare software SDK poate de toate interacțiunile cu interfața de utilizator la autentificarea utilizatorului. Pentru aceasta în controler trebuie definită următoarea secvență de cod care colectează credințialele utilizatorului.

BOXContentClient *contentClient = [BOXContentClient defaultClient];

BOXAuthorizationViewController *boxAuthViewController =

[[BOXAuthorizationViewController alloc]

initWithSDKClient:contentClient

completionBlock:^(BOXAuthorizationViewController *authorizationViewController,

BOXUser *user, NSError *error) {

} cancelBlock:^(BOXAuthorizationViewController *authorizationViewController){

}];

[self presentViewController:boxAuthViewController animated:YES completion:nil];

Pentru delogarea utilizatorului se utilizează următoarea secvență de cod (figura 3.8).

BOXContentClient *contentClient = [BOXContentClient defaultClient];

[contentClient logOut];

Figura 3.8- Delogarea din sistemul Box

Sistemul cloud Box permite să utilizezi modul multi-utilizator. Inițial trebuie de verificat pentru un utilizator deja existent dacă instrumentul pentru dezvoltare software SDK este autentificat.

NSArray *boxUsers = [BOXContentClient users];

Pentru a obține un BOXContentClient pentru un utilizator existent pentru autentificare în calitate de nou account se utilizează următoarele metode.

for (BOXUser *boxUser in boxUsers) {

BOXContentClient *contentClient = [BOXContentClient clientForUser:boxUser];

}

BOXContentClient *contentClient = [BOXContentClient clientForNewSession];

[contentClient authenticateWithCompletionBlock:^(BOXUser *user, NSError *error) {

}];

Pentru delogarea tuturor utilizatorilor se utilizează metoda lofOutAll.

[BOXContentClient logOutAll];

Pentru a obține token-ul de acces BOXAPIAccessTokenDelegate ar trebuie să se implementeze delegate-ul corespunzător care include metodele init, fetchAccessTokenWithCompletion și buttonPressed.

@implementation MyClass <BOXAPIAccessTokenDelegate>

– (instancetype)init

{

if (self = [super init]) {

BOXContentClient *client = [BOXContentClient defaultClient];

[client setAccessTokenDelegate:self];

}

return self;

}

– (void)fetchAccessTokenWithCompletion:(void (^)(NSString *, NSDate, NSError *))completion

{ completion(accessToken, accessTokenExpiration, error);}

– (void)buttonPressed:(UIButton *)button

{

BOXContentClient *client = [BOXContentClient defaultClient];

[client autheticateWithCompletionBlock: ^(BOXUser *user, NSError *error){

}];

}

@end

Pentru a obține utilizatorul curent se apelează următoarea metodă.

BOXContentClient *contentClient = [BOXContentClient defaultClient];

BOXUserRequest *currentUserRequest = [contentClient currentUserRequest];

[currentUserRequest performRequestWithCompletion:^(BOXUser *user, NSError *error) {

}];

Pentru a descărca un fișier local din sistemul Box într-o anumită mapă se utilizează următoarea secvență de cod, specificând clientul, locația fișierului și în conformitate cu calea stabilită ID fișierului care trebuie descărcat (figura 3.9).

Figura 3.9- Descărcarea fișierelor din Box

BOXContentClient *contentClient = [BOXContentClient defaultClient];

NSString *localFilePath = [NSTemporaryDirectory() stringByAppendingPathComponent:@"test.jpg"];

BOXFileDownloadRequest *boxRequest = [contentClient fileDownloadRequestWithID:@"file-id" toLocalFilePath:localFilePath];

[boxRequest performRequestWithProgress:^(long long totalBytesTransferred, long long totalBytesExpectedToTransfer) {

} completion:^(NSError *error) {

}];

Pentru a descărca un NSOutputStream arbitrar este nevoie de datele despre client, locația fișierului propus spre descărcare, calea spre acesta.

BOXContentClient *contentClient = [BOXContentClient defaultClient];

NSString *localFilePath = [NSTemporaryDirectory() stringByAppendingPathComponent:@"test.jpg"];

NSURL *localFileURL = [NSURL fileURLWithPath:localFilePath];

NSOutputStream *outputStream = [[NSOutputStream alloc] initWithURL:localFileURL append:NO];

BOXFileDownloadRequest *boxRequest =

[contentClient fileDownloadRequestWithID:@"file-id" toOutputStream:outputStream];

[boxRequest performRequestWithProgress:

^(long long totalBytesTransferred, long long totalBytesExpectedToTransfer) {

} completion:^(NSError *error) {

}];

Servicii cloud oferite de Google Drive

Pentru a utiliza serviciile Google Drive este necesar de a crea fișierul Podfile corespunzător 'GoogleAPIClientForREST/Drive'. Pentru a crea controlerul de autentificare pentru autorizarea accesului la Google Drive trebuie implementată următoarea metodă (figura 3.10).

Figura 3.10- Autentificarea utilizatorului

– (GTMOAuth2ViewControllerTouch *)createAuthController {

GTMOAuth2ViewControllerTouch *authController;

NSArray *scopes = [NSArray arrayWithObjects:kGTLRAuthScopeDriveReadonly, nil];

authController = [[GTMOAuth2ViewControllerTouch alloc]

initWithScope:[scopes componentsJoinedByString:@" "]

clientID:kClientID

clientSecret:nil

keychainItemName:kKeychainItemName

delegate:self

finishedSelector:@selector(viewController:finishedWithAuth:error:)];

return authController;

}

Odată cu autorizarea cu noi credențiale și pentru actualizarea acestora se implementează următoarea secvență de cod.

– (void)viewController:(GTMOAuth2ViewControllerTouch *)viewController

finishedWithAuth:(GTMOAuth2Authentication *)authResult

error:(NSError *)error {

if (error != nil) {

[self showAlert:@"Authentication Error" message:error.localizedDescription];

self.service.authorizer = nil;

}

else {

self.service.authorizer = authResult;

[self dismissViewControllerAnimated:YES completion:nil];

}

}
Pentru a obține primele 10 fișiere din sistem în corespondență cu datele utilizatorului înregistrat se utilizează următoarea metodă (figura 3.11).

– (void)listFiles {

GTLRDriveQuery_FilesList *query = [GTLRDriveQuery_FilesList query];

query.fields = @"nextPageToken, files(id, name)"

query.pageSize = 10;

[self.service executeQuery:query

delegate:self

didFinishSelector:@selector(displayResultWithTicket:finishedWithObject:error:)];

}

Figura 3.11- Lista cu cântece din Google Drive

Pentru a procesa răspunsul și a actualiza controlerul se utilizează metoda displayResultWithTicket.

– (void)displayResultWithTicket:(GTLRServiceTicket *)ticket

finishedWithObject:(GTLRDrive_FileList *)result

error:(NSError *)error {

if (error == nil) {

NSMutableString *output = [[NSMutableString alloc] init];

if (response.files.count > 0) {

[output appendString:@"Files:\n"];

int count = 1;

for (GTLRDrive_File *file in result.files) {

[filesString appendFormat:@"%@ (%@)\n", file.name, file.identifier];

count++;

}

} else {

[output appendString:@"No files found."];

}

self.output.text = output;

} else {

NSMutableString *message = [[NSMutableString alloc] init];

[message appendFormat:@"Error getting presentation data: %@\n", error.localizedDescription];

[self showAlert:@"Error" message:message];

}

}

Servicii cloud oferite de OneDrive

Pentru a utiliza serviciile cloud oferite de OneDrive de asemenea este necesar instalarea fișierul podfile 'OneDriveSDK' și importarea clasei corespunzătoare #import <OneDriveSDK/OneDriveSDK.h> pentru a avea la dispoziție toate fișierele necesare referite instrumentului de dezvoltare software SDK.

Inițial pentru a utiliza OneDrive din Microsoft Graph trebuie de înregistrat aplicația și de a obține un ID pentru aplicația dată prin intermediul căruia poți avea acces la API. De obicei se recomandă utilizarea Microsoft Application Registration Portal. În orice caz pentru anumite aplicații este necesar de dispunde de o gamă mai largă de funcționalități care sunt valabile cu Azure Active Directory, un portal de gestiune.

La prima etapă se acceasează Microsoft Application Registration Portal, se loghează cu credențialele corespunzătoare, se adaugă aplicația în My application și se creează însăși aplicația. După aceasta ID aplicației va putea fi disponibil în pagina cu proprietăți.

Se poate de setat ID aplicației direct într-un obiect de tip ODClient. Pentru aplicațiile care utilizează OneDrive se apelează metoda clasei [ODClient setActiveDirectoryAppId:<applicationId> redirectURL:<redirectURL>] cu specificarea ID-ului aplicației <applicationId> și <redirectURL>.

Odată cu setarea ID-ului aplicației trebuie să se obțină obiectul ODClient pentru a satisface cererile serviciilor. SDK va stoca informația despre account, dar atunci când utilizatorul se va loga pentru prima dată, acesta va trebui sa invoce aceste informații (figura 3.12).

Un ODClient autentificat poate fi obținut apelând metoda clientWithCompletion .

[ODClient clientWithCompletion:^(ODClient *client, NSError *error){

if (!error){

self.odClient = client;

}

}];

Figura 3.12- Logarea în OneDrive

Odată ce ai un ODClient care este autentificat, poți să începi să faci apeluri către servicii. Aceasta arată ca un serviciu REST API propriu.

[[[odClient drive] request] getWithCompletion:^(ODDrive *drive, NSError *error){

}];

Pentru a obține mapa principală care conține fișierele de pe OneDrive se apelează următoarea metodă:

[[[[odClient drive] items:@"root"] request] getWithCompletion:^(ODItem *item, NSError *error){

}];

În cadrul acestui serviciu poți obține un item în mai multe moduri: după ID, cale și mapă.

[[[[odClient drive] items:<item_id>] request] getWithCompletion:^(ODItem *item, NSError *error){

}];

[[[[odClient root] itemByPath:@"Documents/Foo.txt"] request] getWithCompletion:^(ODItem *item, NSError *error){

}];

[[[[odClient drive] items:<item_id>] itemByPath:@"relative/path/to/file.txt"] request] getWithCompletion:^(ODItem *item, NSError *error){

}];

Pentru a descărca content din OneDrive se apelează următoarea metodă, odată ce a fost creat un obiect de tip ODItemContentRequest (figura 3.13):

ODItemContentRequest *request = [[[odClient drive] items:<item_id>] contentRequest];

[request downloadWithCompletion:^(NSURL *filePath, NSURLResponse *urlResponse, NSError *error){}];

Figura 3.13- Descărcarea fișierelor din OneDrive

Servicii streaming

Pentru a transla muzică prin intermediul streaming-ului inițial este necesar de a crea o sursă de date de la URL-ul obținut. URL-urile cu File vor returna un STKLocalFileDataSource. Cele cu scheme HTTP vor returna un wrapper STKAutoRecoveringHTTPDataSource care va conține un STKHTTPDataSource. Iar pentru scheme necunoscute se va returna nil.

+(STKDataSource*) dataSourceFromURL:(NSURL*)url

{

STKDataSource* retval = nil;

if ([url.scheme isEqualToString:@"file"])

{

retval = [[STKLocalFileDataSource alloc] initWithFilePath:url.path];

}

else if ([url.scheme caseInsensitiveCompare:@"http"] == NSOrderedSame || [url.scheme caseInsensitiveCompare:@"https"] == NSOrderedSame)

{

retval = [[STKAutoRecoveringHTTPDataSource alloc] initWithHTTPDataSource:[[STKHTTPDataSource alloc] initWithURL:url]];

}

return retval;

}

Pentru a reda un fișier în conformitate cu URL-ul obținut se utilizează metoda -(void) play:(NSString*)urlString withQueueItemID:(NSObject*)queueItemId;, odată cu eliminarea tuturor fișierelor din coada de așteptare.

-(void) play:(NSString*)urlString withQueueItemID:(NSObject*)queueItemId

{

NSURL* url = [NSURL URLWithString:urlString];

[self setDataSource:

[STKAudioPlayer dataSourceFromURL:url] withQueueItemId:queueItemId];

}

Metoda -(void) clearQueue; șterge toate elementele din lista de așteptare și din memoria tampon fără ca să întrerupă redarea fișierului audio curent.

-(void) clearQueue

{

pthread_mutex_lock(&playerMutex);

{if ([self.delegate respondsToSelector:@selector(audioPlayer:didCancelQueuedItems:)])

{

NSMutableArray* array =

[[NSMutableArray alloc] initWithCapacity:bufferingQueue.count + upcomingQueue.count];

[upcomingQueue removeAllObjects];

[bufferingQueue removeAllObjects];

if (array.count > 0)

{ [self playbackThreadQueueMainThreadSyncBlock:^

{ if (

[self.delegate respondsToSelector:@selector(audioPlayer:didCancelQueuedItems:)])

{ [self.delegate audioPlayer:self didCancelQueuedItems:array]; }

}];}}

else

{[bufferingQueue removeAllObjects];

upcomingQueue removeAllObjects]; }}

pthread_mutex_unlock(&playerMutex); }

Pentru a obține obține fișierul curent care este redat la moment se utilizează metoda -(NSObject*) currentlyPlayingQueueItemId;.

-(NSObject*) currentlyPlayingQueueItemId

{

OSSpinLockLock(&currentEntryReferencesLock);

STKQueueEntry* entry = currentlyPlayingEntry;

if (entry == nil)

{

OSSpinLockUnlock(&currentEntryReferencesLock);

return nil;

}

NSObject* retval = entry.queueItemId;

OSSpinLockUnlock(&currentEntryReferencesLock);

return retval;

}

3.3 Testarea sistemului

Mentenanța aplicațiilor care oferă servicii streaming nu exclude apariția diferitor erori de sistem. Zonele critice a unei astfel de aplicații sunt conectarea la serviciile cloud sau însăși obținerea conținutului corespunzător accesând serviciile streaming. De regulă, aceasta necesită conexiunea la internet. Accesibilitatea acestor servicii este restricționată de lipsa acestuia.

Pentru testarea aplicației Cloudify a fost ales principiul de testare bazat pe riscuri. El constă în clasificarea priorităților testelor a funcționalităților sistemului și se bazează pe riscurile eșecurilor, importanța funcționalităților testate și impactul eșecului acestora.

Pentru testare au fost stabilite 3 funcționalități cu prioritate sporită care necesită să fie testate: streaming online, logarea și descărcarea cântecelor de pe sistemele cloud cât și construirea clasamentelor a cântecelor în dependență de țară.

În cadrul aplicației utilizatorul poate accesa diverse clasamente în dependență de țară. Acest serviciu ar trebui testat din mai multe considerente. Fișierul care asigură funcționarea serviciului de formare a clasamentelor este de tip .plist. Acesta este descărcat de pe serverul Apple odată ce utilizatorul selectează o țară de referință pentru a asculta conținutul de muzică solicitat.

Există câțiva factori care ar putea limita accesul la acest fișier, cum ar fi:

probleme de conectare la rețea;

suprasolicitarea cu cereri a serverelor corespunzători;

nu a fost găsită resursele necesare;

serverul nu este disponibil;

cererea a fost procesată cu succes dar nu au fost găsite resurse necesare;

locația resursei a fost modificată;

accesul neautorizat la resursa corespunzătoare;

cererea nu a fost prelucrată în termenul stabilit de timp;

insuficientă memorie RAM.

Toți acești factori pot provoca erori ce pot afecta imaginea aplicației. Pentru a evita aceste neplăceri, au fost tratate cele mai frecvente probleme apărute în cazurile prezentate. În mare parte au fost prevăzute la nivel de sistem. Iar utilizatorul este atenționat de eventuale probleme prin intermediul unor mesaje de avertizare care cuprinde descrierea succintă a problemei apărute.

Testarea disponibilității și accesibilității serviciilor cloud de asemenea prezintă un interes sporit. La realizarea serviciilor cloud un aspect important este atât viteza de conexiune la rețea cât și prezența acesteia în general. Pentru ca utilizatorul să acceseze astfel de servicii dispozitivul acestuia trebuie să fie conectat la rețea. Problemele cu care ar putea apărea sunt legate de procesul de stabilire a conexiunii cu serverele corespunzătoare.

La autentificarea utilizatorului în cadrul sistemului cloud ar putea apărea diverse probleme cum ar fi inexistența datelor despre contul introdus. Aceasta s-ar putea întâmpla când un utilizator nu este înregistrat în cadrul sistemului cloud sau a introdus date eronate despre cont. Prin urmare, acest factor ar putea restricționa accesul la fișierele stocate pe cloud. Introducerea unei parole incorecte la fel ar putea avea același efect. În cazul când utilizatorul a uitat parola, serviciile cloud permit resetarea acesteia în conformitate cu politica adoptată. O altă problemă cu care ar putea să se întâlnească utilizatorul este atunci când contul acestuia este blocat.

4 Documentarea sistemului

Aplicația Cloudify poate fi descărcată din două surse iTunes Store și aplicația AppStore odată ce dispozitivul este conectat la rețea. Având la dispoziție un dispozitiv pe platforma iOS aplicația poate fi descărcată prin intermediului aplicației iTunes Store. În cadrul acesteia se introduce în caseta de căutare denumirea aplicației (figura 4.1).

Figura 4.1- Găsirea aplicației Cloudify

Odată ce a fost găsită aplicația utilizatorul poate studia informația despre aceasta (figura 4.2), diverse detalii tehnice, păreri, cum a fost evaluată de către alți utilizatori, pe ce dispozitive ea este disponibilă etc.

Figura 4.2- Prezentarea aplicației Cloudify

De regulă pentru a descărca o aplicație prin intermediul iTunes Store este necesar de confirmat repetat parola contului din cadrul sistemului. Acesta este un nivel de securitate standard și este aplicat de fiecare dată pentru a confirma identitatea utilizatorului (figura 4.3).

Figura 4.3- Confirmarea autorizării utilizatorului

La următoarea etapă are loc instalarea aplicației, care în medie poate dura maxim câteva minute în dependență de viteza de transfer a datelor în rețea. Utilizatorul poate urmări progresul instalării acesteia (figura 4.4).

Figura 4.4- Instalarea aplicației Cloudify

Odată ce a fost instalată aplicația utilizatorul poate deschide oricând aplicația accesând-o din cadrul listei de aplicații a dispozitivului propriu (figura 4.5). Aplicația Cloodify se rulează similar cu alte aplicații mobile, la accesarea directă a acesteia.

Figura 4.5- Rularea aplicației

Pentru a utiliza funcționalitățile aplicației Cloudify, aceasta trebuie descărcată de pe App Store. Aplicația este compatibilă cu așa dispozitive ca iPhone, iPad, iPod touch și Apple watch. Iar versiunea minimă admisibilă pentru funcționarea acesteia este versiunea iOS 7.1 sau mai recentă. În final, dispozitivul trebuie să aibă cel puțin 70 MB de memorie internă liberă.

Aplicația este preconizată pentru utilizatorii din toată lumea. Fiecare utilizator poate să aleagă conținutul interesat în dependență de țara, muzica căreia este mai mult pe plac (figura 4.6). Odată cu deschiderea aplicației poate alege țara corespunzătoare. Astfel, muzica propusă va fi propusă în dependență de aceasta.

Figura 4.6- Accesarea muzicii în dependență de țară

Utilizatorul la fel, are posibilitatea de a accesa diverse clasamente de muzică. Unul dintre care este iTunes Top 100 (figura 4.7). Acest clasament propune spre audiere un clasament de muzică, care este cea mai populară în iTunes (figura 4.8).

Figura 4.7- Accesarea clasamentului iTunes Top 100

Figura 4.8- Clasamentul iTunes Top 100

Fiecare utilizator are diverse preferințe în muzică. În cadrul aplicației el își poate căuta cântecele preferate. Pentru această funcționalitate este prevăzută o casetă de căutare. Căutările pot fie efectuate după denumirea cântecului și numele interpretului sau a trupei corespunzătoare (figura 4.9). Astfel, în dependență de datele introduse se vor prezenta rezultatele obținute.

Figura 4.9- Căutarea pieselor muzicale

Odată ce un cântec din lista propusă a fost selectat, se va începe redarea acestuia. Utilizatorul are posibilitatea de a vizualiza Audio Visualizer pentru cântecul curent (figura 4.10). La fel, este posibilă interschimbarea cântecelor din lista de redare (figura 4.11), repetarea integrală a cântecelor din lista de redare sau repetarea unui cântec. De asemenea, cântecele pot fi redate ordonat sau aleatoriu. Printre funcționalitățile standarde se pot menționa schimbarea progresului de redare a cântecului, trecerea la cântecul următor/precedent, pornirea și oprirea cântecului în player și vizualizarea timpului curent de redare și timpului total. Pentru lista curentă de redare se poate selecta unui interval în de timp după care player-ul se va opri (figura 4.12).

Figura 4.10- Redarea cântecului ales

Figura 4.11- Interschimbarea cântecelor în lista de redare

Figura 4.12- Oprirea player-ului după un interval de timp stabilit

Unul dintre elementele de bază utilizate în cadrul unor astfel de aplicații este Equalizer (figura 4.13). Folosit cu o exactitate riguroasă, el poate elimina sunete care sunt în plus în înregistrarea corespunzătoare. La fel, are un efect benefic asupra calității secvenței audio.

Oricărui sunet înregistrat îi este aplicat un Equalizer. Iar, o înregistrare audio de bună calitate ar putea suna perfect odată cu trecerea acesteia de câteva ori prin Equalizer. Anume el face ca sunetul să fie mai clar și să aibă un impact mai mare.

Figura 4.13- Setarea egalizatorului de frecvențe

Utilizatorul are la fel posibilitatea de a asculta muzica stocată pe dispozitivul personal, accesând opțiunea corespunzătoare reprezentată în figura 4.14. Odată cu aceasta, utilizatorul are acces la muzica personală și nu are nevoie să utilizeze un alt player ca să asculte muzica preferată (figura 4.15).

Figura 4.14- Accesarea muzicii personale

Figura 4.15- Gestionarea muzicii personale

Uneori informația despre cântece nu este întotdeauna veridică. Astfel, utilizatorul poate modifica datele despre cântecul corespunzător. Acesta poate modifica denumirea cântecului, numele artistului, genul de muzică, titlul cât și imaginea cover adăugând din galeria personală (figurile 4.16, B.1). Toate datele modificate vor fi salvate și actualizate în cadrul aplicației.

Figura 4.16- Editarea datelor despre cântec

Deseori versurile diferitor cântece prezintă un interes sporit mai ales atunci când utilizatorul găsește un cântec necunoscut. De obicei, găsirea versurilor unor cântece necesită puțină răbdare la explorarea diferitor pagini web care nu întotdeauna furnizează date veridice și corespunzătoare cerințelor utilizatorului. De aceea, în cadrul aplicației Cloudify utilizatorul poate căuta cu ușurință, direct versurile cântecului corespunzător odată cu accesarea metadatelor acestuia (figura 4.17).

Figura 4.17- Adăugarea versurilor unui cântec

Odată ce sunt prezente versurile unui cântec utilizatorul poate să le acceseze în timp ce ascultă cântecul respectiv. La fel, utilizatorul poate asculta muzică cu telefonul blocat (figura 4.18).

Figura 4.18- Cântec rulat în background

Având acces la cântece din diverse clasamente și surse de conținut muzical, utilizatorii pot adăuga cântecele care prezintă interes în propria listă de redare. Muzica ascultată poate fi gestionată în mai multe liste de redare în corespondență cu preferințele personale. Acestea la rândul lor pot fi oricând șterse sau mutată în altă listă de redare (figura 4.19).

Figura 4.19- Adăugarea cântecelor în lista de redare

În cadrul aplicației sunt disponibile diverse clasamente care reflectă conținutul muzical ascultat de utilizator (figurile 4.20 și B.2).

Figura 4.20- Liste de redare și clasamente

Utilizatorul poate accesa:

liste de redare personale;

25 cele mai ascultate cântece în cadrul aplicației;

cântece recent ascultate;

cântece în dependență de artist, gen sau album.

De asemenea utilizatorul poare sorta listele de redare în conformitate cu diferite criterii, cum ar fi artist, titlu, dată sau durată (figura 4.21).

Figura 4.21- Ordonarea cântecelor în cadrul listelor de redare

Utilizatorul la fel, poate accesa muzică din diverse surse, precum muzica personală, biblioteca iPod și lista de redare online (figura 4.22). Astfel, utilizatorul nu este restricționat privind localizarea unui anumit conținut muzical și poate gestiona muzica în dependență de sursa acestuia.

\

Figura 4.22- Gestionarea muzicii personale

Odată cu achiziționarea aplicației utilizatorul beneficiază de posibilitatea evitării spoturilor de publicitate frecvente și enervante care îl limitează în libertatea de a naviga în cadrul aplicației. La fel, în cadrul setărilor aplicației se pot dezactiva sau activa imaginile cover, șterge datele din cache și de asemenea să se restabilească versiunea achiziționată recent (figura 4.23).

Figura 4.23- Beneficiile achiziționării aplicației

Aplicația Cloudify este de asemenea disponibilă pe platforma WatchOS, având un set de funcționalități mai restrâns. Atunci când utilizatorul ascultă muzica din cadrul aplicației pe dispozitivul mobil, el poate controla modul în care sunt rulate cântecele și ordinea acestora (figura 4.24).

Figura 4.24- Aplicația pe platforma WatchOS

În cadrul aplicației utilizatorul poate descărca cântece utilizând diverse servicii cloud pentru a avea întreaga colecție de muzică la un loc (4.25). Printre acestea se poate enumera Box, Dropbox, Google Drive, One Drive. Pentru accesarea acestora este necesară logarea în prealabil.

Figura 4.25- Servicii cloud

5 Argumentarea economică

După domeniul activităților și obiectivelor proiectului aplicația Cloudify este una comercială deoarece prevede obținerea unui eventual profit. Utilizarea serviciilor cloud și streaming muzical sunt unele dintre cele mai solicitate servicii de pe piața aplicațiilor mobile. Acestea se bucură de o audiență enormă și de interesul sporit al utilizatorilor din întreaga lume. Actualitatea acestora este certă deoarece majoritatea din beneficiarii aplicațiilor mobile au la dispoziție aplicații care oferă aceste servicii.

În prezent, popularitatea acestui gen de aplicații ca Cloudify este foarte mare, dar nu întotdeauna dezvoltatorii oferă servicii de calitate, punând pe primul plan profitul pe care vor obține pe urma publicității din cadrul acestora. Pentru unii beneficiari astfel de aplicații au o importanță primordială în cadrul preferințelor acestora, ascultând în fiecare zi o cantitate enormă de conținut muzical. Acest fapt atestă că cererea pe piață a aplicațiilor care distribuie conținut muzical este mare, deoarece utilizatorii sunt mereu în căutarea celui mai reușit produs care ar satisface preferințele proprii.

Cloudify integrează în sine servicii cloud în vederea accesului la muzică din cadrul aplicației, stocarea muzicii local și servicii de streaming muzical. Astfel, beneficiarii aplicației date pot descărca din sistemele cloud prestabilite muzica personală, pot organiza biblioteca muzicală în dependență de criterii personale și în timp real să asculte muzică datorită prezenței serviciului de streaming muzical. În ansamblu acestea este tot ce au nevoie utilizatorii care ascultă zilnic muzică.

Un alt aspect care trebuie menționat este că utilizarea acestor servicii promovează evitarea pirateriei și valorificarea muncii artiștilor care eu depus un efort și resurse considerabile pentru a promova cântecele lor. Prin servicii de streaming artiștii pot controla nivelul de distribuire a muzicii care o produc.

Produsul final va fi accesibil, intuitiv și familiar pentru beneficiarii acestuia care au la dispoziție un dispozitiv pe platforma iOS și watchOS. Sistemul tinde a fi user friendly și să corespundă cerințelor pieței actuale. Cloudify este creat cu scopul de a distribui muzică de calitate și gratuit la nivel de întreaga lume. Iar printre obiectivele principale ale realizării acestei lucrări este de a implementa noi tehnologii de streaming muzical și cloud. La fel, utilizarea celor mai noi standarde de modelare, proiectare, planificare și de implementare a sistemului.

Studiul pieței

La momentul actual există sute de aplicații care oferă posibilitatea de a gestiona cu biblioteca muzicală personală. Unele dintre ele permit accesarea muzicii personale din cadrul diferitor sisteme cloud propuse. Iar o mică parte din ele oferă posibilitatea de a asculta muzică prin intermediul streaming-ului online.

Pe cât de populare sunt astfel de aplicații, paradoxal acestea uneori pun în dificultate utilizatorul în vederea utilizării acestora. Deseori publicitatea abundă aplicația din plin limitând accesul la serviciile propuse. Iar aceasta se întâmpla într-atât de des ca utilizatorul este nevoit să caute alte și alte aplicații care este mai loială din acest punct de vedere. După gama de funcționalități, în mare parte, astfel de aplicații oferă servicii similare.

Printre unele dintre funcționalități care nu sunt prezente în alte aplicații similare se poate menționa:

accesarea muzicii din toate țările lumii, inclusiv și a clasamentelor din cadrul acestora;

gruparea muzicii după țară;

gruparea muzicii după gen de muzică;

gestionarea muzicii locale;

căutarea cântecelor în dependență de gen de muzică;

editarea metadatelor cântecelor;

vizualizarea 25 celor mai redate cântece;

vizualizarea cântecelor recent adăugate;

vizualizarea cântecelor recent ascultate;

vizualizarea albumelor;

importarea muzicii din iPod Library;

dezactivarea reclamei o dată cu procurarea aplicației;

restabilirea achiziției după ce aplicația a fost ștearsă;

curățire cache;

selectarea unui interval în de timp după care player-ul se va opri;

setarea frecvenței sunetului în egalizatorul de frecvențe manual;

afișarea versurilor cântecului curent.

De obicei, diverse aplicații prevăd achiziția unui abonament lunar pentru a utiliza serviciile corespunzătoare. Cloudify este o aplicație gratuită, iar unica achiziție care ar putea fi efectuată este un neînsemnată care prevede eliminarea definitivă a publicității din cadrul aplicației. Pentru început Cloudify se prevede a fi utilizat de 10 mii de utilizatori.

Planul calendaristic

Cum au mai fost menționate în conformitate cu obiectivele stabilite, sistemul trebuie să prevadă următoarele particularități:

oferirea serviciilor de streaming de calitate;

asigurarea accesului la muzică de calitate;

organizarea, gestionarea și importul muzicii;

prezentarea muzicii din cadrul clasamentelor din diverse țări ale lumii;

stocarea muzicii din diverse sisteme cloud.

Timpul destinat realizării sistemului

Pentru analiza, modelarea și implementarea sistemului se prevede o perioadă de 145 de zile inclusiv 5 zile de rezervă începând cu data de 24.10.16 până la data de 12.05.17. În cadrul acestei perioade de timp s-a estimat timpului necesar pentru realizarea activităților din cadrul tuturor etapelor de implementare a sistemului în tabelul 5.1.

Tabelul 5.1 – Estimarea timpului necesar

Continuare Tabelul 5.1

Volumul de lucru

Conform cerințelor tehnice determinate s-au stabilit activitățile necesare pentru implementarea Cloudify de la etapa de pregătire până la cea de finisare care intră în componența etapei de realizare a funcționalităților sistemului (tabelul 5.2).

Tabelul 5.2- Principalele activități pentru realizarea sistemului

Continuare Tabelul 5.2

Analiza SWOT

Pentru evaluarea factorilor de influență interni și externi ale aplicației Cloudify a fost realizată analiza SWOT (tabelul 5.3). Aceasta include punctele forte și slabe, oportunitățile și riscurile stabilite pentru a putea prevedea diverse dificultăți care ar putea apărea la diverse etape de dezvoltare ale aplicației.

Depistarea punctelor critice care ar putea influența negativ asupra dezvoltării aplicației ar putea facilita eliminarea lor preventivă. Efectuarea analizei SWOT ajută la determinarea fezabilității produsului care se prevede a fi realizat și oferă o viziune largă asupra perspectivelor acesteia.

Tabelul 5.3- Analiza SWOT

La etapa de realizare a aplicației Cloudify s-au aplicat cele mai noi tehnologii open-source necesare pentru asigurarea calității și actualității produsului. Pentru serviciile și funcționalitățile prestate se propune un preț redus pentru a bloca publicitatea în cadrul aplicației. Deținând cunoștințe în domeniu și având la dispoziție multe surse de documentație necesare a fost posibilă integrarea unei game largi de servicii și menținerea calității acestora. Cursul dezvoltării tehnologiilor, permit dezvoltarea unor noi servicii care ar satisface necesitățile beneficiarilor acestora. Dinamica favorabilă de extindere ale acestor servicii prezintă un potențial de dezvoltare continuă benefic pentru produsul dat.

Pentru eliminearea punctelor slabe și a riscurilor s-ar putea întreprinde următoarele activități:

instruirea personalului și calificarea acestuia;

atragerea investițiilor externe;

planificarea activităților de dezvoltare a sistemului;

extinderea funcționalităților sistemului;

utilizarea celor mai noi tehnologii.

Calculul indicatorilor economici

Efectuarea calculelor indicatorilor economici este o metodă utilă de a stabili fezabilitatea și fiabilitatea proiectului care implică resurse financiare, umane și de timp. La această etapă se poate aprecia rentabilitatea proiectului și valoarea investițiilor necesare.

Inițial se determină investițiile în active materiale și nemateriale pe termen lung. Activele materiale pe termen lung reprezintă active care sunt necesare pentru a iniția o afacere, în cazul dat, pentru a lansa aplicația Cloudify. Aceste active asigură realizarea activităților corespunzătoare la nivel de implementare și de menținere a sistemului (tabelul 5.4). Durata utilizării acestora poate depăși un an. Activele materiale au o perioadă de exploatare limitată și sunt predispuse uzurii cel puțin în cazul celor stabilite pentru realizarea sistemului Cloudify. La evaluarea activelor materiale necesare s-a stabilit valoare de intrare totală de circa 36.5 de mii de lei.

Tabelul 5.4- Active materiale pe termen lung

Activele nemateriale pe termen lung nu au o formă materială și nu reprezintă careva obiecte în comparație cu activele materiale (tabelul 5.5). La fel, au o perioadă de utilizare mai mult de un an. În cazul dat acestea prevăd utilizarea licențiată a unor programe software absolut necesare pentru implementarea sistemului.

Tabelul 5.5- Active nemateriale pe termen lung

La următoarea etapă se stabilesc consumurile directe de materiale. Acestea presupun resursele materiale necesare pentru realizarea sistemului cât și pentru prestarea serviciilor corespunzătoare (tabelul 5.6). Consumurile materiale sunt legate nemijlocit de etapa de implementare a sistemului și se raportează valoarea produsului final.

Tabelul 5.6- Consumuri directe de materiale

În cadrul consumurilor directe privind retribuirea muncii se includ salariile celor implicați la realizarea și menținerea sistemului conform planului calendaristic stabilit și se ia în considerație la evaluarea costului produsului final (tabelul 5.7). Salarizarea este una în regie în dependență de timpul efectiv lucrat.

Pentru implementarea aplicației este nevoie de personal calificat. Printre cerințele privind programatorul care va implementa sistemul se pot enumera:

studii în domeniu;

experiență și cunoștințe în programarea iOS;

experiență de lucru în proiectarea bazelor de date utilizând Core Data;

cunoașterea platformei iOS și a principiilor aplicate în Autolayout;

experiență de lucru cu mediul de dezvoltare Xcode.

Printre responsabilitățile de bază ale inginerului programator, se pot enumera:

evaluarea și analiza impactului produsului și potențialul de dezvoltare;

stabilirea specificației tehnice și a cerințelor față de sistem;

modelarea și proiectarea atât a sistemului cât și a bazei de date;

implementarea funcționalităților prestabilite;

testarea produsului;

formarea unui raport de activitate.

Tabelul 5.7- Consumuri directe privind retribuirea muncii

În anul 2017 sunt prevîzute următoarele taxe și scutiri la veniturile persoanelor fizice:

pentru venituri anuale până la 31140 lei, se aplică cota de impozitare de 7%;

pentru venituri anuale mai mari de 31140 lei, se aplică cota de impozitare de 18%;

fondul de pesionaree reprezintă 6% din venit;

fondul de asigurare medicală reprezintă 4.5% din venit;

fiecare contribuabil are dreptul la o scutire personală în sumă de 10620 lei pe an;

contribuabilul are dreptul la o scutire în sumă de 2340 lei anual pentru fiecare persoană întreținută;

suma scutirii majore este de 15840 lei anual.

Pentru perioada de timp stabilită fondul de salarizare este de 72500 de lei.

Fondul social este stabilit conform formulei 1.

FAS = FRM × Cfs(%) (1)

Unde:

FAS reprezintă fondul de asigurări sociale;

FRM reprezintă fondul de retribuire a muncii,

Cfs reprezintă cota contribuțiilor de asigurări sociale de stat obligatorii 23% .

FAS = 72500 × 23% = 16675 (lei)

Fondul de asigurare medicală este stabilit conform formulei 2.

FAM = FRM × Cam(%) (2)

Unde:

FAM reprezintă fondul de asigurări medicale;

FRM reprezintă fondul de retribuire a muncii,

Cam(%) reprezintă cota primei de asigurare obligatorie de asistență medicală 4.5%

FAM = 72500 × 4.5% = 3262.5 (lei)

Fondul de pensionare este stabilit conform formulei 3.

FP = FRM × Cp(%) (3)

Unde:

FP reprezintă fondul de pensionare;

FRM reprezintă fondul de retribuire a muncii,

Cp(%) reprezintă cota contribuțiilor de pensionare.

FP = 72500 × 6% = 4350 (lei)

Venitul impozabil se calculează conform formulei 4.

VI = VB – FP – FAM – SP – SiP – SM (4)

Unde:

VI reprezintă venitul impozabil;

VB reprezintă venitul brut;

FP reprezintă fondul de pensionare (asigurări sociale);

FAM reprezintă fondul de asigurare medicală;

SP reprezintă scutirea personală;

SiP reprezintă scutirea pentru persoană întreținută;

SM reprezintă scutirea personală majoră.

VI = 72500 – 4350 – 3262.5 – 5973.5 = 58914 (lei)

Suma impozitului pe venit se calculează după formula 5.

IV = VI – I (5)

Unde I reprezintă cota de impozitare a persoanei fizice.

IV = 31140 × 7% + (72500 – 31140) × 18% = 9624.6 (lei)

Suma venitului net se calculează după formula 6, aplicând cotele de impozitare în vigoare.

VN = VB – IV – FP – FAM (6)

Unde:

VN reprezintă venitul net

VB reprezintă venitul brut;

VI reprezintă venitul impozabil;

FP reprezintă fondul de pensionare (asigurări sociale);

FAM reprezintă fondul de asigurare medicală.

VN = 72500 – 9624.6 – 4350 – 3262.5 = 55262.9 (lei)

La implementarea aplicației se stabilesc anumite consumuri indirecte aferente care nu depinde esențial de volumul de producție (tabelul 5.8).

Tabelul 5.8- Consumuri indirecte

Uzura mijloacelor fixe și amortizarea activelor nemateriale pe termen lung

În cadrul evaluării cheltuielilor pentru realizarea proiectului în decursul unei perioade stabilite de timp de funcționare utilă se include și repartizarea valorii uzurabile a mijloacelor fixe. Pentru evaluarea uzurii fixe și amortizarea activelor materiale și nemateriale pe termen lung a fost aleasă metoda casării liniare.

Valoarea activelor materiale și nemateriale utilizate pentru implementarea acestui proiect depășește 1000 de lei. Uzura se va calcula pentru fiecare activ în parte cu durata de funcționare de 5 ani (formula 7).

Uac= MFi : DFU × T1 (7)

Unde:

Uac reprezintă fondul de amortizare;

MFi reprezintă valoarea de intrare;

T1 reprezintă durata proiectului;

DFU reprezintă durata de funcționare utilă.

Astfel, uzura activelor materiale și nemateriale sunt următoarele:

21.5-inch iMac: Uac1 = 20000 : 60 × 6.75 = 2250 (lei);

1TB hard drive: Uac2 = 4000 : 60 × 6.75 = 450 (lei);

Korsair 8GB RAM: Uac3 = 3000 : 60 × 6.75 = 675 (lei);

Brother MFC-J985DW: Uac4 = 3500 : 60 × 6.75 = 393.75 (lei);

Magic Mouse: Uac5 = 1500 : 60 × 6.75 = 168.75 (lei);

Keyboard: Uac6 = 1500 : 60 × 6.75 = 168.75 (lei);

Microsoft Office: Uac7 = 2914 : 60 × 6.75 = 291.4 (lei);

Licență de dezvoltator iOS: Uac8 = 1942 : 60 × 6.75 = 194.2 (lei);

Enterprise Architect: Uac9 = 2700 : 60 × 6.75 = 270 (lei).

Unde Uacn reprezintă uzura acumulată pentru activul corespunzător pentru perioada de funcționare de 5 ani.

Uzura totală este în valoare 4861.85 lei calculată conform formulei 8.

UacT = Uac1 + Uac2 + …+ Uacn (8)

UacT = 2250 + 450 + 675 + 393.75 + 168.75 + 168.75 + 291.4 + 194.2 + 270 = 4861.85 (lei)

În conformitate cu calculele efectuate s-au obținut următoarele costuri de producție, reprezentate în tabelul 5.9.

Tabelul 5.9- Cheltuieli necesare pentru realizarea aplicației

Calculul indicatorilor economico-financiari

Inițial se stabilește prețul de cost al unei copii de produs care poate fi determinat conform metodei up-down. Prețul mediu de realizare a produseleor similare pe piață se determină conform formulei 9.

Prz = Plv + TVA (9)

Unde:

Prz reprezintă prețul de realizare;

Plv reprezintă prețul de livrare;

TVA reprezintă taxa pe valoarea adăugată.

Astfel, conform taxei pe valoare adăugată de 20%, a fost obținut un preț de realizare de 22.8 lei.

Prz = 19 + 20% = 22.8 (lei)

Venitul brut din vânzări este stabilit conform formulei 10.

VVb = q × Prz (10)

Unde:

VVb reprezintă venitul brut din vânzări;

q reprezintă numărul de copii planificate spre comercializare.

VVb = 10000 × 22.8 = 228000 (lei)

Profitul brut la realizarea proiectului se stabilește conform fomulelor 11 și 12.

Pb =VVn – CT (11)

VVn = VVb – 20 % (12)

Unde:

Pb reprezintă profitul brut din vânzări;

VVn reprezintă suma netă a venitului din vînzări fără TVA;

CT reprezintă costul total de realizare a proiectului.

Astfel, profitul brut a fost evaluat la suma de 82781.85 lei.

Pb = (228000 – 20%) – 99618.15 = 82781.85 (lei)

Profitul net se calculează prin deducerea taxelor și impozitelor în vigoare din suma impozabilă (formula 13).

Pn = Pb – Iv (13)

Unde:

Pn reprezintă profitul net din vânzări;

Iv reprezintă impozitul pe venit conform legislației.

Astfel, a fost obținut Pn în valoare de 70364.57 lei.

Pn = 82781.85 – 15% = 70364.57 (lei)

Pentru calculul rentabilității se utilizează formula 14.

R = Pb : VVn × 100 % (14)

Astfel, rentabilitatea produsului este de 45%.

R = Pb : VVn × 100 = 82781.85 : 182400 × 100 = 45 (%)

Strategii de implementare a produsului

Pentru implementarea produsului se pot aplica diverse strategii. Modul de abordare ale acestor strategii pot influența substanțial costurile și eficiența produsului. Pentru implemetarea aplicației Cloudify au fost evaluate strategia ascendentă și descendentă de realizare a unui sistem informatic.

Strategia descendentă top-down

Această strategie se utilizează pentru sisteme informatice complexe și prevede descompunerea ierarhică prin modularizare ca o metodă de a controla complexitatea produsului. Astfel, are loc descompunerea sistemului pe mai multe niveluri ierarhice, succesiv, până la module elementare, care sunt simple și relativ independente.

Modularizarea are loc de sus în jos. Aceasta este realizată pentru a creaa posiblitatea de realizare în paralel a componentelor sistemului și eliminarea redundanțelor din cadrul acestuia. Inițial este realizată descompunerea primară a sistemului în funcții principale și se stabilesc relațiile dintre acestea. Aceste funcții vor sta la baza primei modularizări. Apoi, are loc analiza modulelor obținute și dacă au fost identificate alte funcții noi, are loc descompunerea la următorul nivel. Procesul de descompunere are loc până când toate modulele nu se mai divizează în alte module corespunzătoare.

Această strategie este utilă în vederea realizării unei descrieri riguroase și sistematice a sistemului, ușurinței de definire a interfeților și identificare a oricărui modul pentru proiectarea, dezvoltarea, testarea și întreținerea lui [8].

Strategia top-down presupune parcurgerea următoarelor etape principale:

analiza obiectivelor generale și specifice sistemului obiect, restricțiilor și a relațiilor cu mediu;

identificarea activităților principale desfășurate în cadrul sistemului obiect și a legăturilor dintre acestea;

identificarea pe fiecare nivel de conducere a principalelor decizii și acțiuni, a timpilor necesari pentru fiecare decizie și acțiune la nivelul fiecărei activități sau grupuri de activități (funcțiuni);

definirea modelului de ansamblu al sistemului informatic;

descompunerea pe subsisteme sau module funcționale și definirea deciziilor și a cerințelor de informații și definirea interfețelor dintre aceste componente;

stabilirea priorităților în ceea ce privește baza de date a subsistemelor.

Unul dintre dezavantajele care sunt prezente este faptul că definirea modelului de ansamblu a sistemului pe baza unei analize complexe cu personal numeros determină prelungirea termenului de dare în exploatare a sistemului, iar erorile în definirea structurii și a relațiilor dintre module pot afecta activitatea ulterioară.

În ceea ce privește testarea, această stratege implică utilizarea modulelor fictive pentru a simula efectul rutinelor aflate pe un nivel imediat inferior nivelului testat. Testarea prin această strategie permite o minimizare a efortului de testare a sistemului, precum și posibilitatea localizării erorilor.

Printre avantajele acestei strategii se pot menționa:

existența posibilității de definire a obiectivelor generale ale sistemului informatic și a celor specifice subsistemelor de o manieră care să conducă la o planificare a resurselor și la un control riguros al proiectului

produsul informatic prezintă un înalt grad de integrare, ceea ce asigură o creștere a utilității sistemului cât și performanțe superioare în exploatare;

se evită într-o mare măsură reproiectările succesive datorită definirii din primele etape a obiectivelor, funcțiunilor și a interfețelor.

Printre alte dezavantaje se pot evidenția:

definirea modelului de ansamblu presupune o cunoaștere exactă a sistemului obiect, atât din punct de vedere static, cât și dinamic, precum și subsistemele constituente și a relațiilor între ele, descompunerea în subsisteme este etapa cea mai dificilă;

strategia presupune o creștere a timpului de realizare, după care utilizatorul va putea beneficia de produsul informatic.

Strategia ascendentă bottom-up

Această strategie constă în agregarea modulelor de jos în sus punând în evidență legăturile dintre ele până se ajunge la un singur modul. Conceptele care stau la baza acestei strategii sunt ca și la metoda descendentă modularizarea și abordarea sistemică. Realizarea unui nivel de agregare implică și o integrare a componentelor sau modulelor de nivel inferior, agregarea fiind considerată terminată când se obține o unică componentă la acel nivel. Obținerea întregului produs informatic se obține printr-o procedură iterativa. Metoda se aplică la proiectarea și elaborarea programelor, precum și la integrarea și testarea produsului informatic.

Astfel, sistemul se dezvolta treptat, în concordanță cu cerințele reale ale utilizatorilor. Dezvoltatorul poate beneficia mai repede de rezultatele prelucrării automate a datelor, se familiarizează cu sistemul în mod gradat, se reduc riscurile realizării unor sisteme de mare anvergură, neoperaționale. Dezavantajele acestei metode rezultă din gradul de integrare redus a modulelor datorită lipsei unei concepții inițiale de ansamblu, ceea ce face necesară reproiectarea unor componente [9].

Avantajele acestei strategii sunt următoarele:

dezvoltarea treptată a sistemului în corelație cu cerințele utilizatorului ce pot fi determinate mai ușor și mai precis;

extinderile se pot face după o analiză mai atentă, cu luarea în considerare a tuturor implicațiilor;

acomodarea corespunzătoare și a echipei de analiști cu problematica unității utilizatoare;

se reduce riscul unui sistem de amploare care la punerea în funcțiune se dovedește neoperativ.

Printre principalele dezavantaje a le strategiei date se pot enumera:

gradul de integrare și performanțele mai reduse ca urmare a lipsei inițiale a concepției de ansamblu asupra obiectivelor și funcțiunilor sistemului în forma finală;

fiecare pas nou, fiecare funcție nouă, conduce la reproiectarea aplicației deja elaborate la pasul anterior, ceea ce duce la eforturi și costuri suplimentare;

durata mare a ciclului de realizare, care permite doar o evaluare globală a duratelor de realizare a intregului sistem și la necorelări sau nesincronizări în echipa de proiectare dacă componenta sa se modifică pe parcurs.

Metodele top-down și bottom-up se pot utiliza în practică în mod combinat prin modularizarea de ansamblu a sistemului informatic. Modulele sistemului vor fi determinate top-down iar realizarea și asamblarea acestora se va face prin intermediul strategiei bottom-up. Astfel, reieșind din particalitățile fiecărei strategii pentru aplicația Cloudify, acestea au fost integrate împreună.

Concluzii

De-a lungul timpului muzica a ocupat un loc important în societate, dar se mai știe că muzica prezintă un rol important în viața fiecărui om, deoarece muzica poate influența personalitatea gesturile și modul de gândire. Muzica induce omului o variate simțiri, diferite trăiri. De aceia popularitatea aplicațiilor în care poți asculta muzică crește necontenit. Acest gen de aplicații sunt în clasamentul celor mai utilizate aplicații, având posibilitatea de a asculta muzică oricând și oriunde.

Cloudify tinde să ofere servicii de streaming care ar facilita dezvoltarea continuu a muzicii de calitate și liberă de piraterie. Este greu de reinventat ceia ce există pe piață. La momentul actual, sunt sute de aplicații care oferă de servicii de acest gen. Însă în spatele acestora stă un scop comercial. Deseori utilizatorii se întâlnesc cu aplicații care utilizează publicitatea în mod agresiv, doar în scopuri comerciale. Aceasta ar putea fi la drept vorbind iritant și utilizatorii se dezamăgesc și caută alternative pentru produsul curent. Odată cu dezvoltarea sistemelor care au ca scop distribuția muzicii sau streaming de muzică online ar trebui să atragă utilizatorii prin intermediul unor noi oportunități propuse și să dezvolte o comunitate unde pe primul plan este esența muzicii.

Conform costurilor de producție stabilite, rentabilitatea produsului a fost evaluată la o valoare de 45% pentru un volum de vânzări de circa 10 mii de copii. Astfel, toate cheltuielile investite vor fi acoperite de eventualele venituri. Pentru sporirea volumului de vânzări și maximizarea profitului se vor întreprinde măsuri de eficientizare a procesului de dezvoltare în continuare a produsului. Odată cu promovarea și adaptarea acestuia la dinamica pieții se vor extinde și optimiza serviciile propuse beneficiarilor, în vederea dezvoltării produsului pe viitor.

Pentru produsul în cauză se prevede aplicarea strategiei ofensive de dezvoltare a produsului. Astfel, se preconizează o creștere substanțială a volumului de vânzări și dezvoltarea continuă a produsului. Serviciile propuse și însăși produsul va fi dezvoltat în continuare în vederea adăugării unor noi funcționalități, aplicării celor mai noi tehnologii cu scopul ameliorări calității acestuia. Luând în considerație piața potențială, odată cu aplicarea unor noi tactici de promovare, Cloudify ar putea avea un potențial foarte mare. Până când politica de prețuri va rămâne neschimbată, dar se va pune accent pe noi canale de promovare și atragerea a noi beneficiari și investiții din întreaga lume. Pe viitor în cadrul aplicației Cloudify ar putea apărea noi servicii care ar putea satisface preferințele beneficiarilor.

Scopurile și obiectivele prestabilite au fost realizate în totalmente, odată cu implementarea în cadrul sistemului a funcționalităților propuse. Dificultățile întâlnite pe parcursul dezvoltării sistemului legate de accesibilitatea și disponibilitatea serviciilor au fost depășite în întregime.

Bibliografie

1 Guest Post, 5 Reasons Music Streaming Services Can Benefit Artists. [Resursa electronică]. – Regim de acces:

http://www.hypebot.com/hypebot/2015/03/5-reasons-music-streaming-services-can-benefit-artists.html

2 Sharena Adams, The Benefits of Listening to Online Music. [Resursa electronică]. – Regim de acces:

https://www.theodysseyonline.com/the-benefits-of-listening-to-music

3 George Howard, Understanding The Cloud: How You Can Benefit From Streaming Music. [Resursa electronică]. – Regim de acces:

http://www.tunecore.com/blog/2011/03/understanding-the-cloud-how-you-can-benefit-from-streaming-music.html

4 Sursă anonimă, Procesul de proiectare în analiza sistemelor. [Resursa electronică]. – Regim de acces:

http://www.asecib.ase.ro/Paun/cap5-ads-intern.PDF

5 Sursă anonimă, Tipuri de diagrame. [Resursa electronică]. – Regim de acces:

http://personal.ucoz.net/index/diagrame_uml/0-26

6 Echoadmin, iOS Platform Overview. [Resursa electronică]. – Regim de acces:

http://www.blog.echoinnovateit.com/ios-platform-overview/

7 Andreea Mihaela, Proiect de lectie 1 : iOS – avantaje si dezavantaje. [Resursa electronică]. – Regim de acces:

Proiect de lectie 1 : iOS – avantaje si dezavantaje

8 Sursă anonimă, Metodologii de realizare a sistemului . [Resursa electronică]. – Regim de acces:

http://www.rasfoiesc.com/educatie/informatica/METODOLOGII-DE-REALIZARE-A-SIS58.php

9 Nicoleta Arghira și Sergiu Stelian Iliescu, Principii generale de realizare a produselor informatice. [Resursa electronică]. – Regim de acces:

http://shiva.pub.ro/new/wp-content/uploads/2014/10/Note_curs_3_SIE.pdf

Anexa A

Codul sursă

Clasa destinată streaming-ului online

#import "SCManager.h"

#import "AFNetworking.h"

#import "Singleton.h"

int const itemsPerPage = 50;

BOOL const fetchOnlyDownloadableTracks = NO;

@interface SCManager()

@property (nonatomic, copy) NSString *scKey;

@end

@implementation SCManager

#pragma mark – Initializations

+ (id) sharedInstance

{

static dispatch_once_t pred = 0;

__strong static id _sharedObject = nil;

dispatch_once(&pred, ^{

_sharedObject = [[self alloc] init];

});

return _sharedObject;

}

– (id) init

{

self = [super init];

if (self)

{

self.scKey = @"SECRETKEYsdjknsakldj21324234";

}

return self;

}

#pragma mark – Countries Methods

– (void) getCountriesDataUsingBlock:(CacheResultBlock) resultBlock

{

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

dispatch_async(queue, ^{

NSString *genresFilePath = [[NSBundle mainBundle] pathForResource:@"Country" ofType:@"plist"];

NSArray *result = [NSMutableArray arrayWithContentsOfFile:genresFilePath];

dispatch_async(dispatch_get_main_queue(), ^{

resultBlock(result);

});

});

}

– (void) getGenresDataUsingBlock:(CacheResultBlock) resultBlock

{

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

dispatch_async(queue, ^{

NSString *genresFilePath = [[NSBundle mainBundle] pathForResource:@"Genre" ofType:@"plist"];

NSArray *result = [NSMutableArray arrayWithContentsOfFile:genresFilePath];

dispatch_async(dispatch_get_main_queue(), ^{

resultBlock(result);

});

});

}

#pragma mark – iTunes Methods

– (void) getMusicByCountryAndGenre:(SCDictionaryResultBlock) resultBlock countryCode:(NSString *) countryCode genre:(NSString *) genre tracksPerPage:(NSString *) limit

{

NSString *urlString = [NSString stringWithFormat:@"https://itunes.apple.com/%@/rss/topsongs/limit=%@/genre=%@/json", countryCode, limit, genre];

NSLog(@"URL STRING: %@", urlString);

NSString *validString = [self escapeString:urlString];

AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];

[manager GET:validString parameters:nil progress:nil success:^(NSURLSessionTask *task, id responseObject) {

NSDictionary *dict = (NSDictionary *)responseObject;

dispatch_async(dispatch_get_main_queue(), ^{

resultBlock(dict, nil);

});

} failure:^(NSURLSessionTask *operation, NSError *error) {

NSLog(@"Operation Error = %@",error.localizedDescription);

dispatch_async(dispatch_get_main_queue(), ^{

resultBlock(nil, error);

});

}];

}

– (void) getiTunesTop100:(SCDictionaryResultBlock)resultBlock countryCode:(NSString *)countryCode

{

NSString *urlString = [NSString stringWithFormat:@"https://itunes.apple.com/%@/rss/topsongs/limit=100/json", countryCode];

NSString *validString = [self escapeString:urlString];

AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];

[manager GET:validString parameters:nil progress:nil success:^(NSURLSessionTask *task, id responseObject) {

NSDictionary *dict = (NSDictionary *)responseObject;

dispatch_async(dispatch_get_main_queue(), ^{

resultBlock(dict, nil);

});

} failure:^(NSURLSessionTask *operation, NSError *error) {

NSLog(@"Operation Error = %@",error.localizedDescription);

dispatch_async(dispatch_get_main_queue(), ^{

resultBlock(nil, error);

});

}];

}

#pragma mark – SC Methods

– (void) updateSCKeyWithCompletion:(SCRequestCompletionBlock) completionBlock

{

self.scKey = SC_CLIENT_ID;

NSString *urlString = SC_KEY_FETCHING_URL;

NSURL *url = [NSURL URLWithString:urlString];

NSURLRequest *urlRequest = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringLocalAndRemoteCacheData timeoutInterval:5];

NSOperationQueue *queue = [[NSOperationQueue alloc] init];

queue.maxConcurrentOperationCount = 1;

[NSURLConnection sendAsynchronousRequest:urlRequest queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {

if (!connectionError)

{

NSError *jsonError;

NSJSONSerialization *jsonResponse = [NSJSONSerialization JSONObjectWithData:data options:0 error:&jsonError];

if (!jsonError && [jsonResponse isKindOfClass:[NSDictionary class]])

{

NSDictionary *dict = (NSDictionary *)jsonResponse;

NSNumber *successOperation = dict[@"success"];

if (successOperation && [successOperation boolValue])

{

NSString *fetchedSCKey = dict[@"data"];

if (fetchedSCKey && !fetchedSCKey.isEmpty)

{

self.scKey = fetchedSCKey;

}

}

}

}

completionBlock(connectionError);

}];

}

– (NSString *) getSCKey

{

if (!_scKey || _scKey.isEmpty)

{

return SC_CLIENT_ID;

}

return _scKey;

}

– (void) getSCResultsUsingBlock:(SCResultBlock) resultBlock forSearchText:(NSString *) searchText genre:(NSString *) genre andPage:(NSNumber *) page

{

if (!searchText || searchText.isEmpty)

{

resultBlock(nil, nil);

return;

}

NSString *platfString = @"sound";

platfString = [platfString stringByAppendingString:@"cloud"];

genre = [self manualEscapeForString:genre];

searchText = [self manualEscapeForString:searchText];

int offset = (page.intValue – 1) * 50;

NSString *downloadableFilter = @"";

NSString *urlString = [NSString stringWithFormat:@"https://api.%@.com/tracks.json?client_id=HIDDjdbskldjsnadksjdn%@&q=%@&genres=%@&limit=%d&offset=%d", platfString, downloadableFilter, searchText, genre, itemsPerPage, offset];

NSString *validString = [self escapeString:urlString];

AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];

[manager GET:validString parameters:nil progress:nil success:^(NSURLSessionTask *task, id responseObject) {

NSArray *fetchedArray = (NSArray *)responseObject;

dispatch_async(dispatch_get_main_queue(), ^{

resultBlock(fetchedArray, nil);

});

} failure:^(NSURLSessionTask *operation, NSError *error) {

NSLog(@"Operation Error = %@",error.localizedDescription);

dispatch_async(dispatch_get_main_queue(), ^{

resultBlock(nil, error);

});

}];

}

– (void) getSCTopTracksUsingBlock:(SCResultBlock) resultBlock forPage:(NSNumber *) page

{

NSString *platfString = @"sound";

platfString = [platfString stringByAppendingString:@"cloud"];

int offset = (page.intValue – 1) * 50;

NSString *downloadableFilter = @"";

if (fetchOnlyDownloadableTracks)

{

downloadableFilter = @"&filter=downloadable";

}

NSString *urlString = [NSString stringWithFormat:@"https://api.%@.com/tracks.json?client_id=HIDDjdbskldjsnadksjdn%@&q=%@&genres=%@&limit=%d&offset=%d",platfString,downloadableFilter,itemsPerPage,offset];

NSString *validString = [self escapeString:urlString];

AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];

[manager GET:validString parameters:nil progress:nil success:^(NSURLSessionTask *task, id responseObject) {

NSArray *fetchedArray = (NSArray *)responseObject;

NSSortDescriptor *sortByFavorites = [NSSortDescriptor sortDescriptorWithKey:@"favoritings_count" ascending:NO];

NSSortDescriptor *sortByPlayback = [NSSortDescriptor sortDescriptorWithKey:@"playback_count" ascending:NO];

NSArray *sortDescriptors = @[sortByFavorites, sortByPlayback];

fetchedArray = [fetchedArray sortedArrayUsingDescriptors:sortDescriptors];

dispatch_async(dispatch_get_main_queue(), ^{

resultBlock(fetchedArray, nil);

});

} failure:^(NSURLSessionTask *operation, NSError *error) {

NSLog(@"Operation Error = %@",error.localizedDescription);

dispatch_async(dispatch_get_main_queue(), ^{

resultBlock(nil, error);

});

}];

}

– (void) getSCTrendingMusicUsingBlock:(SCResultBlock) resultBlock forPage:(NSNumber *) page

{

NSString *platfString = @"sound";

platfString = [platfString stringByAppendingString:@"cloud"];

int offset = (page.intValue – 1) * 50;

NSString *urlString = [NSString stringWithFormat:@"https://api.%@.com/tracks.json?client_id=HIDDjdbskldjsnadksjdn%@&q=%@&genres=%@&limit=%d&offset=%d",platfString,_scKey,itemsPerPage,offset];

NSString *validString = [self escapeString:urlString];

AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];

[manager GET:validString parameters:nil progress:nil success:^(NSURLSessionTask *task, id responseObject) {

NSDictionary *fetchedDict = (NSDictionary *)responseObject;

NSArray *fetchedArray = [fetchedDict objectForKey:@"tracks"];

if (fetchOnlyDownloadableTracks)

{

fetchedArray = [fetchedArray filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"(downloadable == %d)", 1]];

}

if (fetchedArray.count == 0)

{

[self getSCTopTracksUsingBlock:^(NSArray *array, NSError *error) {

resultBlock(array, error);

} forPage:page];

}

else

{

dispatch_async(dispatch_get_main_queue(), ^{

resultBlock(fetchedArray, nil);

});

}

} failure:^(NSURLSessionTask *operation, NSError *error) {

NSLog(@"Operation Error = %@",error.localizedDescription);

[self getSCTopTracksUsingBlock:^(NSArray *array, NSError *error) {

resultBlock(array, error);

} forPage:page];

}];

}

– (void) getCountryMusic:(SCResultBlock) resultBlock

{

NSString *downloadableFilter = @"";

if (fetchOnlyDownloadableTracks)

{

downloadableFilter = @"&filter=downloadable";

}

NSString *urlString = [NSString stringWithFormat:@"http://ws.audioscrobbler.com/2.0/?method=geo.gettoptracks&country=spain&api_key=3feaec68724f33982dc08b522a489c2a&format=json"];

NSString *validString = [self escapeString:urlString];

AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];

[manager GET:validString parameters:nil progress:nil success:^(NSURLSessionTask *task, id responseObject) {

NSArray *fetchedArray = (NSArray *) responseObject;

dispatch_async(dispatch_get_main_queue(), ^{

resultBlock(fetchedArray, nil);

});

} failure:^(NSURLSessionTask *operation, NSError *error) {

NSLog(@"Operation Error = %@",error.localizedDescription);

dispatch_async(dispatch_get_main_queue(), ^{

resultBlock(nil, error);

});

}];

}

– (NSString *) manualEscapeForString:(NSString *) string

{

NSMutableString *escaped = [NSMutableString stringWithString:string];

[escaped replaceOccurrencesOfString:@"&" withString:@"%26" options:NSCaseInsensitiveSearch range:NSMakeRange(0, [escaped length])];

[escaped replaceOccurrencesOfString:@"$" withString:@"%24" options:NSCaseInsensitiveSearch range:NSMakeRange(0, [escaped length])];

[escaped replaceOccurrencesOfString:@"+" withString:@"%2B" options:NSCaseInsensitiveSearch range:NSMakeRange(0, [escaped length])];

[escaped replaceOccurrencesOfString:@"?" withString:@"%3F" options:NSCaseInsensitiveSearch range:NSMakeRange(0, [escaped length])];

[escaped replaceOccurrencesOfString:@"@" withString:@"%40" options:NSCaseInsensitiveSearch range:NSMakeRange(0, [escaped length])];

[escaped replaceOccurrencesOfString:@"=" withString:@"%3D" options:NSCaseInsensitiveSearch range:NSMakeRange(0, [escaped length])]; return escaped;

}

– (NSString *) escapeString:(NSString *) string

{

return [string stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

}

@end

Anexa B

Interfața aplicației

Figura B.1- Editarea datelor despre cântec

Figura B.2- Liste de redare și clasamente

Similar Posts