VYSOKÉ UČENÍ TECHNICKÉ V BRNĚ

Fakulta elektrotechniky a komunikačních technologií

BAKALÁŘSKÁ PRÁCE

Brno, 2018 Martin Střálka VYSOKÉ UČENÍ TECHNICKÉ V BRNĚ BRNO UNIVERSITY OF TECHNOLOGY

FAKULTA ELEKTROTECHNIKY A KOMUNIKAČNÍCH TECHNOLOGIÍ FACULTY OF ELECTRICAL ENGINEERING AND COMMUNICATION

ÚSTAV TELEKOMUNIKACÍ DEPARTMENT OF TELECOMMUNICATIONS

VYTVOŘENÍ SERVEROVÉ APLIKACE V PROGRAMOVACÍM JAZYCE SWIFT DEVELOPMENT OF SERVER APPLICATION IN SWIFT PROGRAMMING LANGUAGE

BAKALÁŘSKÁ PRÁCE BACHELOR'S THESIS

AUTOR PRÁCE Martin Střálka AUTHOR

VEDOUCÍ PRÁCE doc. Ing. Jiří Hošek, Ph.D. SUPERVISOR

BRNO 2018 Bakalářská práce

bakalářský studijní obor Teleinformatika Ústav telekomunikací Student: Martin Střálka ID: 174403 Ročník: 3 Akademický rok: 2017/18

NÁZEV TÉMATU: Vytvoření serverové aplikace v programovacím jazyce Swift

POKYNY PRO VYPRACOVÁNÍ: V bakalářské práci se student bude zabývat nejprve analýzou možnosti použití jazyka Swift pro vývoj serverových aplikací. Následně v jazyce SWIFT navrhne a vytvoří aplikaci pro REST komunikaci. Jako podklad bude sloužit popis již existující aplikace pro měření kvality mobilního internetového připojení. Vytvořená aplikace bude schopna komunikovat s databází a dle uživatelských požadavků vyčítat potřebné informace a ukládat je do XML / CSV souborů s požadovanou strukturou.

DOPORUČENÁ LITERATURA: [1]The Swift Programming Language [online]. Swift 4.0. Cupertino: Apple, 2014 [cit. 2017-09-15]. Dostupné z: https://itunes.apple.com/cz/book/the-swift-programming-language-swift-4/id881256329?mt=11

[2]FLEMING, Candace C. a Barbara. VON HALLE. Handbook of relational database design. Reading, Mass.: Addison-Wesley, c1989. ISBN 978-0201114348

Termín zadání: 5.2.2018 Termín odevzdání: 29.5.2018

Vedoucí práce: doc. Ing. Jiří Hošek, Ph.D. Konzultant:

prof. Ing. Jiří Mišurec, CSc.

předseda oborové rady

UPOZORNĚNÍ: Autor bakalářské práce nesmí při vytváření bakalářské práce porušit autorská práva třetích osob, zejména nesmí zasahovat nedovoleným způsobem do cizích autorských práv osobnostních a musí si být plně vědom následků porušení ustanovení § 11 a následujících autorského zákona č. 121/2000 Sb., včetně možných trestněprávních důsledků vyplývajících z ustanovení části druhé, hlavy VI. díl 4 Trestního zákoníku č.40/2009 Sb.

Fakulta elektrotechniky a komunikačních technologií, Vysoké učení technické v Brně / Technická 3058/10 / 616 00 / Brno ABSTRAKT Tato práce se věnuje možnostem použití vývojářského jazyka Swift v serverových aplika- cích. Popisuje výhody a nevýhody jazyka Swift oproti ostatním jazykům, zejména Obj-C který je předchůdcem Swiftu a Java, který je přímým konkurentem jazyka Swift. Dále popisuje rozdíly mezi jednotlivými frameworky používané pro webové aplikace. Výběr jazyka Swift je implementován v podobě jednoduché aplikace pro REST komunikaci s databází na základě již existující aplikace. Řešení bude schopno v databázi vyhledávat a následně zobrazovat výsledky vyhledávání. KLÍČOVÁ SLOVA Swift, , Linux server, Vapor, NoSQL databáze, Bakalářská práce, VUT Brno

ABSTRACT This work deals with possibilities of using the developer language Swift in server appli- cations. Describes the advantages and disadvantages of Swift versus other languages, especially Obj-C, which is the predecessor of Swift and Java, a direct competitor of Swift. It also describes the differences between frameworks used for web applications. Swift language selection is implemented as a simple application for REST database communication based on an existing application. The solution will be able to search and display search results in the database.) KEYWORDS Swift, Linux, Linux server, Vapor, NoSQL database, Bachelors Thesis, BUT, Brno Uni- versity of Technology

STŘÁLKA, Martin. Vytvoření serverové aplikace v programovacím jazyce Swift. Brno, Rok, 41 s. Bakalářská práce. Vysoké učení technické v Brně, Fakulta elektrotechniky a komunikačních technologií, Ústav telekomunikací. Vedoucí práce: Ing. Rastislav Červe- ňák, CSc.

Vysázeno pomocí balíčku thesis verze 2.63; http://latex.feec.vutbr.cz PROHLÁŠENÍ

Prohlašuji, že svou bakalářskou práci na téma „Vytvoření serverové aplikace v programo- vacím jazyce Swift“ jsem vypracoval(a) samostatně pod vedením vedoucího bakalářské práce a s použitím odborné literatury a dalších informačních zdrojů, které jsou všechny citovány v práci a uvedeny v seznamu literatury na konci práce. Jako autor(ka) uvedené bakalářské práce dále prohlašuji, že v souvislosti s vytvoře- ním této bakalářské práce jsem neporušil(a) autorská práva třetích osob, zejména jsem nezasáhl(a) nedovoleným způsobem do cizích autorských práv osobnostních a/nebo ma- jetkových a jsem si plně vědom(a) následků porušení ustanovení S 11 a následujících au- torského zákona č. 121/2000 Sb., o právu autorském, o právech souvisejících s právem autorským a o změně některých zákonů (autorský zákon), ve znění pozdějších předpisů, včetně možných trestněprávních důsledků vyplývajících z ustanovení části druhé, hlavy VI. díl 4 Trestního zákoníku č. 40/2009 Sb.

Brno ...... podpis autora(-ky) PODĚKOVÁNÍ

Rád bych poděkoval vedoucímu bakalářské práce panu doc. Ing. Jiřímu Hoškovi, Ph.D. za odborné vedení, konzultace, trpělivost a podnětné návrhy k práci.

Brno ...... podpis autora(-ky) OBSAH

Úvod 10

1 Mobilní sítě 11 1.1 Historie a vývoj mobilních sítí ...... 11 1.1.1 Generace mobilních sítí ...... 11 1.2 Základní struktura mobilních sítí ...... 12 1.3 Parametry mobilní sítí ...... 13 1.3.1 Šířka pásma ...... 13 1.3.2 Přenosová rychlost ...... 13 1.3.3 Propustnost ...... 14 1.3.4 Zpoždění ...... 14

2 Jazyk Swift 15 2.1 Základní konstrukce jazyku Swift ...... 15 2.1.1 Syntax ...... 15 2.1.2 Knihovna Foundation ...... 17 2.2 Porovnání jazyka Swift s ostatními programovacími jazyky ...... 18

3 Serverové aplikace v jazyce Swift 20 3.1 Základní komunikační model ...... 20 3.1.1 Přístup k datům na serveru ...... 20 3.2 Komunikace v prostředí jazyka ...... 22 3.2.1 Porovnání frameworků ...... 22 3.2.2 Zhodnocení frameworků ...... 23 3.3 Databáze ...... 23 3.3.1 Relační databáze - SQL ...... 23 3.3.2 Nerelační databáze - NoSQL ...... 24 3.3.3 Dělení NoSQL databází ...... 24 3.3.4 Použití vhodné databáze při programování Swift aplikace . . . 25

4 Vytvoření serverové aplikace v jazyce Swift 26 4.1 Definice problému a přesná specifika zadání ...... 26 4.2 Analýza aplikace ...... 26 4.3 Server DigitalOcean ...... 26 4.4 Framework Vapor ...... 27 4.4.1 Instalace frameworku Vapor ...... 27 4.5 Databáze MongoDB ...... 27 4.5.1 Instalace MongoDB ...... 27 4.5.2 Správa dat databáze MongoDB ...... 28 4.5.3 Import dat do databáze ...... 28 4.6 Model řešení ...... 29 4.7 Řešení databáze ...... 30 4.7.1 Struktura databáze ...... 30 4.8 Webové rozhraní ...... 31 4.8.1 Návrh webového rozhraní ...... 32 4.8.2 Framework NutView ...... 33

5 Závěr 34

Literatura 35

Seznam symbolů, veličin a zkratek 37

Seznam příloh 38

A Některé funkce programu 39 A.1 Funkce pro vyhledání a výpočet hodnot ...... 39 A.2 Funkce pro převod dat přijatých z POST požadavku ...... 40

B Databáze 41 B.1 Struktura vstupní databáze ...... 41 SEZNAM OBRÁZKŮ

1.1 Buněčná síť ...... 12 1.2 Sektorizace buněčné sítě s 21 stanicemi ...... 13 1.3 Sektorizace buněčné sítě se 7 stanicemi ...... 13 3.1 Komunikace mezi klientem, serverovou aplikací a její databází . . . . 20 4.1 Ukázka prostředí NoSQL Manager for MongoDB ...... 28 4.2 Ukázka prostředí NoSQL Manager for MongoDB ...... 31 4.3 Struktura databáze výsledků ...... 32 4.4 Návrh webového rozhraní ...... 32 4.5 Webové rozhraní ...... 33 B.1 Struktura databáze výsledků ...... 41 SEZNAM TABULEK

2.1 Porovnání jazyka Swift s Obj-C a Java ...... 19 3.1 Porovnání frameworků Perfect, Vapor, a Zewo ...... 22 ÚVOD

V dnešní době, početnost chytrých zařízení rapidně vzrůstá. V roce 2019 více než 75 procent provozu na mobilních sítí budou konzumovat chytré telefony. S tím se i zvyšují nároky na bezdrátové sítě, které jsou v současné době nejpoužívanější ko- munikační technologií. V důsledku použití vyššího frekvenčního pásma u rychlejších sítí je potřeba nainstalovat stále větší množství antén k dosažení stejné penetrace. Monitorování mobilních sítí se díky tomu stává velice významné k detekování sle- pých míst jak v krytých tak i otevřených místech a je nezbytné k vylepšení QoE (Quality of Experience) odběratele internetu. Dříve se monitorování mobilních sítí provádělo pouze experty se speciálním za- řízením. Dnes k vylepšení QoE může přispět téměř kdokoliv, kdo vlastní chytrý te- lefon. S použitím aplikace, která sbírá data na pozadí, senzory dokáží určit přesnou polohu, rychlost přenosu, odezvu a další parametry. To umožňuje měřit parametry sítě v globálním měřítku, finanční náročnost je přitom minimální a data jsou prů- běžně aktualizovány. S rostoucím počtem přispěvatelů ovšem roste i množství dat, které je potřeba shromažďovat a průběžně zpracovávat. Tato práce se věnuje zpracovávání naměřených dat parametrů mobilních sítí. Data budou zpracovávány na serverové aplikaci napsané v programovacím jazyce Swift, který je v tomto odvětví oproti ostatním jazykům nový, hlavně co se týče možností nasazení na server. Programovací jazyk slibuje lepší práci s pamětí, což se právě hodí na výpočty s velkým množstvím dat. Teoretická část je věnovaná stručnému seznámení s mapováním sítí, lze se dočíst i o vývoji rádiových techno- logií. Následně se věnuje popisu programovacího jazyka Swift, součástí je i úvod o REST API komunikaci. Praktická část se věnuje analýze dostupnosti frameworků pro server-side Swift a databází a následně jejich použití. Cílem práce je vytvo- řit jednoduchou serverovou aplikaci, která bude komunikovat s databází obsahující data monitoringu sítí a následně data zpracovávat a výsledky ukládat v tabulkové formě. Aplikace bude muset umět i komunikovat s uživatelem pomocí REST API požadavků, aby bylo možné ji jednoduše ovládat.

10 1 MOBILNÍ SÍTĚ

Tato práce se zabývá zpracováním dat naměřených parametrů mobilních sítí, které lze použít ke Mobilní síť nebo také buněčná síť (z překladu cellular network) je ko- munikační síť, kde poslední spojení, tedy s uživatelem, je bezdrátové. Síť je rozdělená do buněk krajiny, kde každá buňka obsahuje alespoň jeden vysílač. Tyto vysílače slouží k přenášení hovorů nebo dat v mobilní síti. Každá buňka typicky používá roz- dílné frekvenční pásmo od sousedních buněk, aby se předešlo rušení a dosáhlo tak maximální QoS (sada technologií v síti zaručující schopnost spolehlivě provozovat aplikace s vysokou prioritou a provozem při omezené kapacitě sítě). Díky použití buněk je mobilní síť schopná pracovat s velkým množstvím zařízením. Mobilní sítě se postupně vyvíjí a klasicky každé desetiletí je představena nová generace s vylepšenými nebo novými technologiemi. Krátký popis jednotlivých ge- nerací lze najít v podkapitole níže, popis technologií je již nad rámec této práce, více informací o jednotlivých technologiích lze najít na webu http://www.3gpp.org/ [1]

1.1 Historie a vývoj mobilních sítí

V 80. letech minulého století bylo využíváno mnoho navzájem nekompatibilních analogových mobilních sítí, každý zákazník byl tedy nucen používat jen síť svého operátora. V důsledku toho byla založena skupina GSM - (standard pro mobilní sys- tém druhý generace), aby se sjednotily standarty mobilních sítí. S rostoucími nároky se do sítě GSM postupně implementovaly další technologie. Později na tento základ navázala skupina The 3rd Generation Partnership Project (3GPP), která vytváří a spravuje specifikace Universal Mobile Telecommunications System (UMTS) aGSM.

1.1.1 Generace mobilních sítí

• První generace (1G) – byla představena 80. letech 20. století, tato generace byla schopná pouze hlasového hovoru. • Druhá generace (2G) – přidávala možnost posílat zprávy SMS a MMS, byla spuštěna díky GSM. Oproti první generaci, kde rádiové sítě byly analogové, 2G je digitální. Později byly představeny další verze 2G, které začaly využí- vat technologie GPRS (GPRS!) (2.5G) a EDGE (rychlejší verze standardu GSM) (2.75G) s podporou přenášení dat, rychlost přenosu v jednotkách desí- tek kbit/s. Sítě 2G jsou stále využívané vě většině zemích světa, avšak většina operátoru potvrzuje ukončení podpory do konce tohoto desetiletí. • Třetí generace (3G) – představena v roce 1998 a už umožňovala rych- lejší přenos dat a tak přístup k internetu. Standardy, jako UMTS, CDMA200,

11 EDGE, WCDMA patří pod 3G. Dříve se rychlost pohybovala v řádech desítek až stovek kbit/s, později technologie byly schopné rychlostí v řádech Mbit/s. • Čtvrtá generace (4G) – představena v roce 2008 a s ní přišla i technologie LTE, která je v dnešní době nejrozšířenější technologie pro přenos dat. • Pátá generace (5G) – představena v roce 2018, má být poprvé veřejně testována na Olympijských hrách v Tokiu 2020. Oproti 4G, kde se v dnešní době dosahuje rychlostí ve stovkách Mbit/s, bude LTE v 5. generaci schopné rychlostí až v desítkách Gbit/s.

1.2 Základní struktura mobilních sítí

Pro mobilní sítě je k dispozici jen omezené kmitočtové spektrum, proto se používá buňkový systém rozložení základnových stanic, kde 7 společných buněk tvoří tzv. svazek. Aby se předešlo vzájemnému rušení, používají se v buňkách svazku různé kanály. Spojení těchto svazků potom tvoří síť která umožňuje efektivní hospodaření s přiděleným rádiovým spektrem.[2]

Obr. 1.1: Buněčná síť

Pomocí tzv. sektorizace lze vytvořit síť s lepšími provozními vlastnostmi, kdy se jeden svazek rozdělí na 21 menších buněk, potřebný počet kanálů zůstane stejný, ja lze vidět na Obr. 1.2.

Počet stanic se dá následně snížit použitím směrových antén, viz. Obr. 1.3.

12 Obr. 1.2: Sektorizace buněčné sítě s 21 stanicemi

Obr. 1.3: Sektorizace buněčné sítě se 7 stanicemi

1.3 Parametry mobilní sítí

Aby bylo možné měření provádět, je potřeba nejprve znát základní parametry mo- bilních sítí, co znamenají a jakým způsobem je lze měřit. Pro přenos informací je důležitý určitý čas, za který je schopen přenosový kanál přenést objem dat. Tento parametr je většinou považován za propustnost nebo přenosovou rychlost. Níže jsou popsány parametry, které určují kvalitu sítě.

1.3.1 Šířka pásma

Z programátorského hlediska se jako šířka pásma rozumí maximální přenosová rych- lost v jednotkách b/s, kterou je kanál schopný přenést data. Platí, že šířka přeno- sového kanálu je přímo úměrná s přenosovou rychlostí.

1.3.2 Přenosová rychlost

Přenosová rychlost vp je brána jako veličina nominálního charakteru vyjadřující trvání přenosu jednoho bitu, tzn. že při rychlosti 1 Mb/s trvá přenos jednoho bitu

13 jednu miliontinu sekundy. Oproti propustnosti, která vyjadřuje počet přenesených bitů pouze s informací, se do přenosové rychlosti zahrnují navíc také určité režijní bity, které jsou pro správné fungování přenosu nutné. Tento parametr se měří v bitech za sekundu tzv. b/s.

1.3.3 Propustnost

Propustnost určuje, jak velké množství dat lze přenést za jednotku času. Jak bylo zmíněno výše, propustnost oproti přenosové rychlosti nezahrnuje režijní bity a pouze užitečné bity, které nesou informace. Proto je tento parametr v praxi daleko víc využíván, jelikož není lehké určit přesný počet režijních bitů v přenosové rychlosti. Propustnost, stejně jako přenosová rychlost, se měří v jednotkách b/s.

1.3.4 Zpoždění

Parametr zpoždění určuje dobu, za kterou dorazí paket ze zdrojového uzlu na cílový, do parametru se přičítají i zařízení, které mezi zdrojovým a cílovým uzlem. Vzdále- nost mezi zdrojovým a cílovým uzlem je další parametr, který ovlivňuje zpoždění, díky vztahu s rychlostí světla v přenosovém médiu. Parametr se měří v jednotkách milisekund ms a má několik rozdělení, jako první je jednosměrné a obousměrné.

• Jednosměrné – čas, který uplyne při odeslání jednotky ze zdroje k cíli. • Obousměrné – čas, který uplyne při odeslání jednotky ze zdroje k cíli a zpět. Cíl musí jednotku ale nejdříve zpracovat, takže bývá pravidlem, že tento čas je o něco vyšší než dvojnásobek jednosměrného zpoždění. V praxi má toto zpoždění větší výhodu, jelikož tento parametr lze měřit z jednoho místa.

Parametr zpoždění se dále rozděluje na deterministické a stochastické.

• Deterministické – lze spočítat a její velikost je konstantní. Je to minimální čas, který je potřeba pro přenos zprávy. • Stochastické – oproti deterministické je velikost zpoždění náhodné a je ovliv- něné stavem sítě. Hodnota je přímo úměrná s velikostí zatížení sítě, při nulovém zatížení je zpoždění minimálně ovlivněné.

14 2 JAZYK SWIFT

Jazyk Swift je nový, multiparadigmatický, kompilovaný programovací jazyk vyvi- nutý společností Apple Inc. pro platformy macOS a Linux. Je zamýšlen jako al- ternativa Obj-C (programovací jazyk, objektově orientované C), umí spolupracovat s frameworky Cocoa, je kompilován pomocí LLVM a ve stejném programu může být spolu s kódem v jazycích C, Obj-C a C++. Jeho syntaxe je jazyku Obj-C podobná, avšak čerpá to nejlepší i z jiných jazyků, jako je JavaScript nebo Groovy. Mezi hlavní výhody Swiftu patří absence správy paměti, rychlost, redukce délky kódu a vynikající čitelnost. V další části kapitoly budou popsány některé relevantní elementy jazyku Swift.

2.1 Základní konstrukce jazyku Swift

2.1.1 Syntax

Konstanty a proměnné

Konstanty a proměnné musí být deklarovány ještě před tím, než budou použity. Proměnné se deklarují pomocí příkazu var, konstanty pomocí příkazu let. Konstanty a proměnné mohou obsahovat hodnoty následujících datových typů: • Int – celé číslo • Float – 32-bitové reálné číslo • Double – 64-bitové reálné číslo • Bool – boolean, logická 1 nebo 0 • String – řetězec znaků • Character – jeden znak • Optional – reprezentuje proměnnou, která může držet nějakou nebo žádnou hodnotu • Tuples – používáno k seskupení několika hodnot v sloučenou hodnotu

Datový typ není třeba definovat, kompilátor je ho schopný určit pomocí způsobu definice proměnné. Například se přiřadí proměnné hodnota 20 s desetinou tečkou, automaticky se definuje datový typ na reálné číslo, tedy double. Příklad deklarace proměnné: let konstanta = 5 var promenna = 10 var promenna2 = 20.0

15 Zápis lze zjednodušit při deklarování více proměnných tak, že se napíšou na jeden řádek, jak je vidět níže: let konstanta = 5 var promenna = 10, promenna2 = 20.0

Deklarace řetězců je velmi podobná, jak je tomu u číselných proměnných: var retezec = "Tohle je retezec"

Pokud se při deklaraci proměnné nedefinuje hodnota, lze vyjádřit datový typ pro- měnné pomocí anotace: var tohleBudeRetezec: String

Konvertování hodnot na jiné datové typy Swift umožňuje vytvořením instance vý- sledného typu, jak lze vidět na příkladu: var celeCislo = 56 var retezec = String(celeCislo)

Při psaní řetězců lze použít i jednodušší způsob pomocí závorek a zpětného lomítka: var retezec = "Mám \(celeCislo) jablek"

Funkce print

Funkce print je používána k vypsání řetězce na konzoli. Vypsat lze i konstanty a proměnné. Syntaxi lze vidět na následujícím příkladu:

print("Ahoj.")

Proměnné a konstanty lze vypisovat vypsáním jména do funkce nebo pomocí zpět- ného lomítka a závorek, jak je vidět na příkladu:

let jmeno = "Martin" print(jmeno) print("Jsem \(jmeno)")

Podmínky a cykly

Pomocí klíčového slova if definujeme podmínku, podmínku není třeba psát do zá- vorek. if cislo < 5 println("\(cislo) je mensi nez 5") else println("\(cislo) je vetsi nebo rovna se 5")

16 Funkce

Funkce se deklaruje klíčovým slovem func, za klíčovým slovem následuje název funkce, seznam argumentů s jejich datovými typy v závorkách a šipka ->, která rozděluje datové typy od typu návratu funkce, následuje blok označený složenými závorkami, který obsahuje tělo funkce. Funkci poté voláme jejím jménem. Příklad deklarace funkce: func pozdrav(jmeno: String) -> String { return "Ahoj \(jmeno)" } pozdrav("Martin")

Objekty a třídy

Třída se definuje klíčovým slovem class a její instanci se vytvoří zavoláním třídy: class Auto{ var pocetKol = 4 func funkceAuto() -> String { return "Auto ma \(pocetKol) kola." } var instanceTridy = Auto()

Zpracování výjimek

Zpracování ve Swiftu je velmi podobné jako například v jazyku Java. Pomocí klí- čového slova throws lze označit funkci, která může vyvolat výjimku. Poté pomocí do, try a catch se vykoná daná metoda a případné vyjímky odchytí. Použití lze vidět na příkladu: func send(job: Int, toPrinter printerName: String) throws -> String { if printerName == "Never Has Toner" { throw PrinterError.noToner } Return "Job sent" }

2.1.2 Knihovna Foundation

Knihovna Foundation poskytuje základní vrstvu funkčnosti aplikací a frameworků, včetně ukládání dat, zpracování textu, výpočtu data a času, třídění, filtrování a vytváření sítí.

17 Základy knihovny Foundation

• Čísla, data a základní hodnoty – práce s primitivními hodnotami a dalšími základními typy používané v Cocoa • Řetězce a text – vytváření a zpracovávaní řetězců znaků Unicode, vyhledá- vání vzorů, analýza textu z přirozeného jazyka • Sbírky – ukládání a interakce skupiny objektů nebo hodnot použitím polí, slovníků sad a specializovaných sbírek • Datum a čas – porovnávání data a času, provádění vypočtu časových pásem a kalendářů • Jednotky a měření – formátování a konverze mezi příslušnými jednotkami • Formátování dat – hodnot, dat do reprezentace řetězců na základě jazyka • Filtry a třídění – použití predikátů, výrazů a deskriptorů ke zkoumání prvků ve sbírkách a dalších službách

2.2 Porovnání jazyka Swift s ostatními programo- vacími jazyky

Při určování optimálního programovacího jazyka pro programování aplikací ve spe- cifické oblasti hrají v roli následující faktory: • Popularita jazyka v dané oblasti – popularita má při výběru programo- vacího jazyka zásadní roli, ve větší komunitě má vývojář mnohem větší šanci najít pomoc ve formě spolupráce, má větší šanci najít referenční materiály • Rychlost – rychlost kompilace je důležitá z časového i finančního hlediska • Výraznost – jazyk, který má jasnou syntaxi, umožňuje vývojáři rychleji psát • Dostupnost knihoven a frameworků – knihovny a frameworky dávají vývojáři možnost neřešit při programování problémy, které již byly vyřešeny a soustředit se na samotné řešení aplikace, opět šetří čas při vývoji • Spokojenost vývojáře – úzce souvisí a je přímo úměrná s efektivitou a vý- razností jazyka, vyšší spokojenost hraje roli v oblasti produktivity vývojáře newline

Pro porovnání jazyka Swift s ostatními jsem zvolil Objective-C, což je jazyk, z kterého Swift vychází. Objective-C je objektově orientovaný programovací jazyk implementovaný jako rozšíření jazyka C. Používá se v operačních systémem Mac OS X, iOS a GNU. Díky tomu, že je nadmnožinou jazyka C, lze aplikace napsané v C kompilovat i v Objective-C. Podobně je tomu u jazyka Swift, ve kterém lze kompilovat C, Objective-C a Objective-C++.

18 Swift Obj-C Java Popularita × ×× ××× Rychlost ××× ×× ×× Výraznost ××× × ×× Dostupnost knihoven ×× ××× ××× Spokojenost vývojáře ××× × ×

Tab. 2.1: Porovnání jazyka Swift s Obj-C a Java

Jako další jsem zvolil jazyk Java, který je stejně jako Swift open-source a je jeho přímým konkurentem. V současné době patří mezi nejpopulárnější programovací jazyky. Jeho hlavní síla spočívá v tom, že je nezávislý na architektuře počítače. Oproti Swiftu, který je využívaný převážně na vývoj iOS mobilních aplikací, jazyk Java dominuje při vývoji aplikací pro operační systém Android. V následující části analyzuji jednotlivé faktory na jazyku Swift. Popularita jazyka Swift v dané oblasti je zatím v dnešní době nízká, což lze předpokládat díky poměrně krátkému působení jazyka v programátorské oblasti. Celkově je jazyk podle serveru StackOverflow řazen mezi méně populární, popula- rita se ale postupně s časem zvyšuje. Rychlost podle testu serveru https://benchmarksgame.alioth.debian.org se jazyk umístil v předních příčkách testů rychlosti. Výraznost programovacího jazyka je vysoká. Vývojáři jazyka se na tento faktor více zaměřili. Jazyk je ušetřený od prvků, jejichž zápis je ve většině případů zby- tečný, jako jsou například středníky na konci řádků nebo určování datových typů při deklaraci. Syntaxe je jasná a program se díky ní snadno čte. Dostupnost knihoven a frameworků je poměrně vysoká, bereme-li v úvahu dobu působení jazyka. V oblasti programování webových aplikací je dostupnost v porovnání s ostatními jazyky nižší, lze ale předpokládat nárůst díky zvyšující se popularitě. Spokojenost vývojáře při programování v jazyku Swift je celkově vysoká. Výraz- nost a rychlost jsou právě hlavní faktory, na které mysleli při vývoji tohoto jazyka. Podle serveru StackOverflow se Swift v posledních letech objevuje v předních příč- kách průzkumu o nejvíce oblíbených programovacích jazycích[4]. Pro řešení této práce byl zvolen jazyk Swift z důvodu kompatibility s již existující aplikací.

19 3 SERVEROVÉ APLIKACE V JAZYCE SWIFT

V této kapitole budou rozebrány možnosti jazyka Swift na serveru a zejména infor- mace potřebné k tvorbě webové aplikace.

3.1 Základní komunikační model

Při zadání WWW adresy na server odesíláme požadavek na server v síti. Server tento požadavek zpracuje a pošle na stranu klienta odpověď (např. webová stránka nebo chyba), tato komunikace se nazývá klient-server. Na přenos v tomto modelu je nejvíce využíván protokol HTTP. Na obrázku níže lze vidět zjednodušený model této komunikace, využíván je zde požadavek GET protokolu HTTP, který je popsán v sekci Přístup k datům na serveru.

Obr. 3.1: Komunikace mezi klientem, serverovou aplikací a její databází

3.1.1 Přístup k datům na serveru

Pokud je potřeba přistupovat k datům aplikace z více prostředí, nebo data poskyto- vat dalším uživatelům, bude potřebné také definovat nějaké veřejné rozhraní API . Tuto práci dělá REST.

REST

REST je architektura rozhraní, navržená pro distribuované prostředí. Téměř vždy se odkazuje na HTTP protokol. Byl vytvořen, aby zacházel s objekty na serverové části jako zdroji, které mohou být vytvořeny, aktualizovány, nebo smazány. Hlavní výhodou RESTu je, že funguje pouze pomocí HTTP a většinou nějakého standardu

20 jako je JSON(JavaScript Object Notation - způsob zápisu dat), takže může být použit téměř v každém programovacím jazyku [7].

API

API je rozhraní pro programování aplikací. V podstatě je to dohoda mezi jednou částí softwaru a druhou částí softwaru. Většinou obsahuje strukturovaný požadavek (Request) a strukturovanou odpověď (Response).

Žádosti HTTP

V následující části budou popsány specifické metody požadavaků, které jsou posílány na server prostřednictvím protokolu HTTP. Protokol HTTP obsahuje následující typy žádostí: GET, POST, PUT, DELETE, HEAD, OPTIONS a PATCH Žádost GET je nejvíce používaná metoda. Načítá jakoukoliv informaci, která je identifikovaná požadavkem URI, tedy veškerá formulářová data se předají jako součást URL za otazníkem Pokud požadavek URI odkazuje na data produkující proces, server vyrobí se údaje, které se vrátí jako odpověď. Žádost POST funguje velmi podobně, jako GET, avšak s jedním velkým rozdí- lem, že při použití POST se data nepředávají jako součást URL, ale v těle dotazu. To se může hodit například při předávání citlivých údajů. Žádost PUT aktualizuje specifický zdroj. Většinou se posílá požadavek ve formě URI s ID specifického zdroje, aby server věděl, který zdroj chceme upravit. Žádost DELETE v překladu znamená smazat, a to je taky přesně její funkce. Pomocí DELETE požadavku smažeme specifický zdroj. HTTP nabízí více metod (HEAD, OPTIONS, PATCH ), ty už ale nejsou zdaleka tolik využívané, jako metody uvedené výše [10]. Pro více informací: https: //www.w3.org/Protocols/rfc2616/rfc2616-sec9.html

21 Perfect Vapor Kitura Zewo Rychlost ××× × ×× × Obsáhlost dokumentace ×× ××× ×× × Obsáhlost ××× ××× ×× ××

Tab. 3.1: Porovnání frameworků Perfect, Vapor, Kitura a Zewo

3.2 Komunikace v prostředí jazyka

Jazyk Swift umožňuje základní komunikaci se serverem pomocí REST požadavků. Pro tuto komunikaci se používají frameworky, které redukují počet potřebných řádků kódu k sepsání těchto požadavků. V následující části budou popsány rozdíly mezi jednotlivými frameworky používaných v jazyce Swift pro programování serverových aplikací a následně jejich zhodnocení.

3.2.1 Porovnání frameworků

Při určování optimálního frameworku pro webovou aplikaci v prostředí jazyka Swift hrají roli následující faktory: • Rychlost – rychlost frameworku je důležitá, některé frameworky můžou mít několikanásobně delší dobu kompilace, což může vývojáře dost zpomalit, pokud jde o vývoj komplexnějšího projektu. Rychlost v této práci je porovnávána podle článku ze serveru Medium [11], kde byly testovány všechny porovnávané frameworky. • Dokumentace – Dostupnost materiálů je zásadní hlavně pro vývojáře, kteří nemají s frameworky příliš velké zkušenosti. • Obsáhlost – Obsáhlost frameworku lze chápat jako počet možností, využi- telných v reálných situacích, které framework nabízí. Vysoká obsáhlost fra- meworku umožňuje vytvořit téměř jakoukoliv webovou aplikaci. Podle serveru GitHub jsou nejoblíbenějšími frameworky Perfect, Vapor, Kitura a Zewo.

Perfect

Perfect je nejpopulárnější framework, co se týče programování webových aplikací ve Swiftu. Podle testu je nejrychlejší a je také nejobsáhlejší. Dokumentace je dostupná na stránkách http://perfect.org/docs/.

22 Vapor

Server GitHub listuje Vapor jako druhý nejpoužívanější framework pro Swift. Hlav- ním důvodem je její dokumentace, která je velmi dobře napsaná, na oficiálních strán- kách lze najít i Vapor University, což jsou návody, které mají vývojáři pomoct se začátky. Obsáhlost Vaporu je velmi podobná jako při frameworku Perfect. Doku- mentace je dostupná na stránkách https://docs.vapor.codes/2.0/.

Kitura

Třetí nejoblíbenější framework je Kitura, který je vyvíjen společností IBM. Syntaxí je hodně podobný Vaporu. Řadí se mezi pomalejší frameworky a jeho obsáhlost je oproti Perfectu a Kituře menší. Dokumentace ovšem neobsahuje dostatečný počet informací a lze ji najít pouze na serveru GitHub https://github.com/IBM-Swift/ Kitura/tree/master/docs.

Zewo

Čtvrtý, nejvíce používaný framework je Zewo, jehož hlavní výhodou je jeho mo- dularita. Rychlost tohoto frameworku je oproti ostatním nízká a zaostává s ob- sáhlostí a kvalitou dokumentace. Více informací lze najít na stránkách https: //docs.zewo.io/.

3.2.2 Zhodnocení frameworků

Framework Perfect je nejvíce využívaný a je vhodný pro již zkušené vývojáře, díky jeho rychlosti se hodí na komplexnější projekty. Vapor oproti Perfectu není tolik rychlý, nabízí však velmi dobrou dokumentaci, díky tomu se hodí pro začínající vývojáře. Nelze však říci, který framework je nejlepší, i když všechny nabízí podobné funkce, některé můžou ze specifických oblastí nabízet užitečnější funkce, než ostatní.

3.3 Databáze

V dnešní době existuje mnoho druhů databází, lze je však rozdělit na relační a nerelační. V následující části budou popsány rozdíly mezi SQL a NoSQL.

3.3.1 Relační databáze - SQL

Relační databáze je databáze, která je založena na relačním modelu. Schéma této relace říká jaký je název relace, kolik má sloupců a jaké jsou jejich názvy a domény. Pokud jsou v různých tabulkách sloupce stejného typu, pak tyto sloupce mohou

23 vytvářet vazby mezi jednotlivými tabulkami. Kolekce více tabulek, jejich funkčních vztahů, indexů a dalších součástí tvoří relační databázi.[?] Jazyk SQL se hodí pro projekt v případě,když logické související požadavky na diskrétní údaje lze určit dopředu a chceme použít osvědčené technologie založené na standartu a podporované vývojáři. Hlavní nevýhodou SQL je její špatná flexibilita, pokud se navrhne systém v SQL, nelze po vytvoření měnit vztahy, typy prvků nebo velikost tabulek.

3.3.2 Nerelační databáze - NoSQL

NoSQL lze přeložit jako Not only SQL, znamená to, že není jenom relační. Roz- dílů mezi relačními NoSQL a relační databází je mnoho. Oproti SQL, která pracuje s tabulkami, NoSQL ukládá data do struktury podobné JSONu. Další významná vlastnost je volná struktura, která byla u relačních databází téměř neřešitelná, je- likož data zde byly ukládány do tabulek. Další vlastností je možnost zanořování dokumentů v NoSQL. Hlavní důvod takové rozdílnosti je ten, že relační databáze se používaly dříve a tvůrci NoSQL se snažili vytvořit systém rozdílný od relačních databází, zaměřili se právě na ty funkce, které v relačních databázích chyběly, nebo nevyhovovaly. NoSQL má jednoduchý design a možnost horizontální škálovatelnosti. Je také mnohem náchylnější na chyby ze strany vývojáře[?] Příklad uložených dat nerelační databáze v JSONu: { ’_id’ : 1, ’celeJmeno’ : { ’jmeno’ : ’Jan’, ’prijmeni’ : ’Nemec’ }, ’datumNarozeni’ : ’22-10-1998’} } NoSQL se používá na projekty u kterých je předpokládaný růst a vývoj. Používá se u velkých stránek, převážně u sociálních sítích, jako je například Facebook, nebo Twitter.

3.3.3 Dělení NoSQL databází

V této části se rozeberou skupiny, do kterých lze NoSQL databáze zařadit na základě vnitřního fungování.

Key-value

Databáze typu klíč-hodnota. Nejjednodušší datový model, data se ukládají v podobě kolekce dvojic klíčů a hodnot. V této datbázi je možné vyhledávat pouze podle klíčů,

24 nikoliv uložené hodnoty. Nevýhodou je příliš omezená funkcionalita. Příklad: DynamoDB, , Voldemort

Document oriented

Dokumentovaně orientované databáze. Data jsou organizovaná v podobě klíč:hodnota, kde hodnota může být další dokument, díky tomu mohou být do sebe dokumenty stále zanořovány a vznikne tak hiearchická struktura. V této databázi již lze vy- hledávat podle samostatných hodnot a je možný tzv. multi-index (vyhledávání více položek současně). Pro ukládání dat se využívají formáty jako JSON, BSON, XML apod. Příklad: MongoDB, CouchDB, SimpleDB.

Column oriented

Sloupcově orientované databáze. Optimalizované na vysokou výkonnost a paralerní zpracování při dotazování. Princip ukládání je podobný relační databázi, ale namísto řádku se zde používají sloupce. Hlavní předností této databáze je velmi rychlé vyhledávání podle daného klíče. Příklad: BigTable od společnosti Google, Cassandra, HBase

Graph databases

Grafové databáze. Vhodné pro ukládání komplexních dat, jsou inspirovány teorií grafů. Data jsou ukládána jako uzly a hrany grafu, ty mohou obsahovat i další atri- buty. Uplatnění lze najít hlavně na sociálních sítích, kde uzly reprezentují jednotlivé uživatele a vztahy mezi nimi značí vzájemné přátelství. Příklad: Neo4J, HyperGraphDB

3.3.4 Použití vhodné databáze při programování Swift apli- kace

Druh databáze je nutné určit hned při vývoji aplikace. Při vývoji aplikace s očekávaným vysokým růstem je vhodnější použít nerelační databázi, díky její možnosti horizontální a vertikální škálovatelnosti. Nerelační data- báze je taktéž vhodná pro začínající vývojáře, jelikož nabízí mnohem více možností zkoušení. Při vývoji komplexnější databáze s propojením tabulek je poté vhodné použít relační databázi.

25 4 VYTVOŘENÍ SERVEROVÉ APLIKACE V JA- ZYCE SWIFT

Vytvoření serverové aplikace je dalším bodem práce. Aplikace bude komunikovat s databází a zpracovávat její data. Tato kapitola popisuje realizaci řešení v jazyce Swift, v další části se následně rozebere tvorba grafického rozhraní.

4.1 Definice problému a přesná specifika zadání

Bylo zadáno vytvořit serverovou aplikaci v jazyce Swift, aplikace má běžet na Li- nuxovém OS. K dispozici jsou vygenerovaná data, které je potřeba přesunout na novou databázi a následně s nimi pracovat. Zpracované výpočty se budou průběžně ukládat ve struktuře do nové databáze, tyto data jsou k dispozici pro další vyhledá- vání, aby se nemusely po každém vyhledávání přepočítávat. Data se budou uživateli zobrazovat prostřednictvím grafů.

4.2 Analýza aplikace

Pro správnou funkčnost aplikace byl sestaven seznam funkcí a pravidel: • Aplikace bude schopna přijímat POST a GET požadavky z webového HTML formuláře pro zobrazení dat. • Požadavky se zpracují do dotazu pro databázi výsledků a zkontroluje, zdali data pro tyto požadavky již nebyly zpracovány a vypočteny, pokud ne, vytvoří se dotaz pro vstupní databázi. • Aplikace vypočte výsledky následujících hodnot: průměr, medián, maximální a minimální hodnota. Výpočet se provede jen v případě, že tyto hodnoty ještě nebyly vypočteny. • Pokud hodnoty již nebyly vypočteny, databáze uloží data do databáze vý- sledků. • Aplikace bude psána genericky a rozdělena do funkcí. Cílem je, aby byla co nejjednodušeji rozšířitelná o další funkce.

4.3 Server DigitalOcean

Aplikace bude běžet na serveru od služby DigitalOcean. Na tomto serveru bude běžet operační systém 16.04, který je kompatibilní se Swift 4. Soubory na serveru je možné zobrazit pomocí SFTP protokolu přes program WinSCP nebo pomocí protokolu SSH přes konzolovou aplikaci Putty.

26 Server byl k řešení této práce zvolen, jelikož byl v době tvorby této bakalářské práce dostupný za lepší cenu a programovat aplikaci bylo možné od jakéhokoliv místa s přístupem k internetu.

4.4 Framework Vapor

Při výběru frameworku se ohlíželo hlavně na jeho oblíbenost a obsáhlost dokumen- tace, proto byl vybrán framework Vapor.

4.4.1 Instalace frameworku Vapor

4.5 Databáze MongoDB

Při výběru vhodné databáze k této práci se ohlíželo na faktory jednoduchost a flexibilita. Proto byl zvolen nerelační databázový model, který je schopný pracovat i s větším množstvím dat. Pro práci s databází NoSQL byl použit MongoDB [19]. Aby s touto databází mohl komunikovat v jazyku Swift, použil se framework ze serveru GitHub Mongo- Kitten [20]. Framework Squirrel Connector [21] zajišťuje transformaci objektů na jejich databázovou reprezentaci v MongoDB, jakož i jejich práci a kontrolu da- tových typů [21].

4.5.1 Instalace MongoDB

MongoDB má plnou podoporu OS Ubuntu 16.04. Pro správnou instalaci je nejdříve nutné stáhnout veřejný klíč: sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 2930ADAE8CAF5059EE73BB4B58712A2291FA4AD5

Následně vytvořit tzv. list file, u Ubuntu 16.04 se tak provádí následujícím způ- sobem. echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu xenial/mongodb-org/3.6 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.6.list

Načtení do databáze balíčků se provádí příkazem: sudo apt-get update

Samotná instalace se poté provádí příkazem: sudo apt-get install -y mongodb-org

27 4.5.2 Správa dat databáze MongoDB

Správa dat je možná pomocí nástroje NoSQL Manager for MongoDB, k databázi se lze připojit pomocí protokolu SSH a je možná plná kontrola nad daty. Umožňuje zobrazit data jak strukturovaně, tak po jednotlivých řádcích, jak bývá zvykem u relačních databází. K řešení této práce je nástroj vhodný hlavně k importu dat do vstupní databáze a přehledné kontrole dat.

Obr. 4.1: Ukázka prostředí NoSQL Manager for MongoDB

4.5.3 Import dat do databáze

Do databáze lze data importovat pomocí nástroje NoSQL Manager for MongoDB. Data je potřeba mít ve formátu JSON, je tedy nutné je externě do tohoto formátu převést. Nástroj obsahuje jednoduchý formulář, do kterého se zadá soubor a ten následně postupně nahraje. Ke každému dokumentu nástroj sám generuje ObjectID, což je 24

28 znakový unikátní kód pro identifikaci. Import tedy bývá často zdlouhavý a v případě importování souboru se stovky tisíc záznamy může být zdlouhavý.

4.6 Model řešení

Na obrázku 2.2 lze vidět model řešení a komunikace mezi serverem a klientem. Aplikace bude schopna přijímat GET a POST požadavky a ty následně zpraco- vávat. U správně zadaného GET požadavku server vrátí webovou stránku, která bude obsahovat formulář zadání kritérií pro zobrazení. Formulář následně posílá POST požadavek. Tento požadavek server již zpracovává jako vyhledávací požada- vek. Vytvoří se dotazy pro databáze výsledků a vstupní databáze. Pokud v databázi výsledků nebude žádný dokument splňovat kritéria vyhledávání, server odešle do- taz na vyhledání do vstupní databáze. Z vyhledaných dat se vypočítají následující hodnoty: • Průměr – průměrnou hodnotu pole lze ve Swiftu vypočíst pomocí následující funkce:

func getAverage (pole: [Double]) -> Double { if (pole.count != 0) { let avg = pole.reduce(0, +) / Double(pole.count) return avg } else { return 0 } }

Funkce reduce(0, +) slouží k sečtení všech prvků pole. • Medián – Medián je prostřední hodnota pole, nejedná se o průměr mezi ma- ximální a minimální hodnotou, ale o hodnotu s indexem poloviny celkového počtu položek v poli. Pokud je počet položek sudý a prostřední index je mezi 2 hodnotami, jedná se pak o jejich průměr. Pole je nutné před výpočtem seřadit.

func getMed (pole: [Double]) -> Double { let num = Double(pole.count)

29 if num % 2 == 0 { var avg = (pole[Int((num-1)/2)]+pole[Int((num+1)/2)])/2 return avg } else { return pole[Int(num/2)-1] } }

• Maximální – jedná se o poslední položku pole, pokud je seřazené vzestupně. • Minimální – jedná se o první položku pole, pokud je seřazené vzestupně.

4.7 Řešení databáze

Po instalaci databáze je nejprve nutné vytvořit novou databázi s určitými přihlašova- cími údaji. Každá databáze může obsahovat několik kolekcí s různými strukturami.

4.7.1 Struktura databáze

Součástí této práce jsou dvě databáze, jak již bylo popsáno výše. Aby bylo možné v databázi výsledků jednoduše vyhledávat, je nutné vytvořit strukturu, která obsahuje základní parametry na nejvyšší úrovni.

Vstupní databáze

Tato databáze byla již zadaná a její struktura pevně daná. NoSQL Databáze je dokumentačně orientovaná, takže kdyby bylo třeba, je možné ji jednoduše rozšířit. Některé hodnoty jsou volitelné, znamená to, že nemusí obsahovat nic, ve Swiftu se tyto hodnoty poté chovají jako nil, pokud nejsou inicializovány. Strukturu vstupní databáze lze vidět v příloze B.1.

Databáze výsledků

Jak bylo již výše popsáno, databáze výsledků je nutné navrhnout tak, aby v ní bylo možné vyhledávat podobně, jako ve vstupní databázi. Na obrázku ASDF lze vi- dět návrh struktury. Parametr parametr označuje, o jaký parametr se jedná, zatím může obsahovat pouze hodnoty downloadSpeed, nebo delay, neboli rychlost stahování a odezvu. Parametr technologie je taktéž omezený pouze na současně dostupné tech- nologie, tedy LTE, HSPDA, WCDMA, EDGE a GPRS. Parametry year a month

30 Webový prohlížeč

Formulář

Zobrazení grafů

Klient

Server DigitalOcean GET/POST

HTML doc

Serverová aplikace

NutView Squirrel Framework Connector Zpracování Framework požadavků

Tvorba NoSQL dotazů

Výpočet hodnot

MongoDB

Zpracování výpočtů do struktury

Obr. 4.2: Ukázka prostředí NoSQL Manager for MongoDB určují, pro jaký měsíc a rok byly data počítány. Následuje dokument statisticOut- put, který obsahuje hodnoty výpočtů a počet hodnot, z kterých tyto výpočty byly prováděny.

4.8 Webové rozhraní

Další částí je zobrazení hodnot uživateli, jelikož Swift nepodporuje zobrazení uživa- teli přímo na webové stránce, je nutné navrhnout jednoduchou HTML stránku pro zobrazení dat. Data se budou zobrazovat v grafech, hlavním problém je ale import dat do grafů. K tomu byl využit framework NutView, který stránky rozděluje na

31 Obr. 4.3: Struktura databáze výsledků menší části a používat základní příkazy Swiftu v HTML souboru. Podrobnější info o frameworku NutView je v části ASDF

4.8.1 Návrh webového rozhraní

Návrh webového rozhraní je minimalistický, hlavním účelem je zobrazení dat v grafu. Webové rozhraní obsahuje dvě na první pohled totožné stránky.

Hlavička

Navigace

Formulář

Layout

View

Grafy

Obr. 4.4: Návrh webového rozhraní

32 4.8.2 Framework NutView

Framework NutView je součástí frameworku Squirell Connecto. Je to koncept, který rozděluje stránky na menší znovu použitelné části. Jak bylo již psáno výše, hlavní výhodou frameworku je možnost používání Swift příkazů přímo v HTML kódu. Princip je takový, že server přijme POST požadavek a výstupem je poté příslušný View s vypočtenými hodnotami. [21] • View – hlavní obsah stránky • Layout – rozložení stránky, které je použitelné na více stránkách • Subview – části, které jsou opakovaně používány ve View a Layout

Obr. 4.5: Webové rozhraní

33 5 ZÁVĚR

Úkolem bakalářské práce bylo seznámit se s programovacím jazykem Swift a analy- zovat jeho použití v serverové aplikaci. První část práce je zaměřená na jazyk Swift jako takový. Programovací jazyk má hodně možností, ale je stále ve vývoji, díky tomu nemá stále vysokou popularitu a dostatečnou podporu. Jako další nevýhodu lze vidět i absenci vývojářského prostředí pro OS Windows, díky čemuž je zúžen okruh vývojářů. Co se týče serverové stránky, dostupnost knihoven se stále zvyšuje a lze očekávat i další dostupné frameworky pro práci se Swiftem na serveru. Framework Vapor nabízí dobrou dokumentaci a je vhodný nepříliš zkušené vývojáře, Perfect je zase velice populární díky své rychlosti a obsáhlosti. Druhá část práce byla zaměřena na vytvoření webové aplikace schopná REST komunikace s databází. Aplikace umí vyhledávat data v databázi, provádět výpočty s daty a výsledky výpočtů ukládat do nové databáze. To umožňuje rychlejší porovnání kvality technologií. Vstupní databáze obsahovala poměrně větší množství dat a díky horším specifikacím serveru výpočty nebyly příliš rychlé. Pokud tento systém bude běžet v praxi, bylo by vhodné zaměřit se na velikost operační paměti serveru. Poslední částí bylo zobrazení dat do grafů na webové stránce. Aplikace je toho schopná díky frameworku NutView, který umožňuje používat Swift příkazy přímo v HTML kódu.

34 LITERATURA

[1] The Mobile Broadband Standard [online]. Francie: 3GPP Mobile Competence Centre, 2018 [cit. 2018-05-29]. Dostupné z: http://www.3gpp.org/

[2] Princip buňkového systému. Technologie pro mobilní komunikaci [online]. 2002 [cit. 2018-05-29]. Dostupné z: http://tomas.richtr.cz/mobil/bunk-princip.htm

[3] Chris Lattner’s Homepage. Chris Lattner [online]. Chris Lattner [cit. 2018-01- 07]. Dostupné z: http://www.nondot.org/sabre/

[4] Developer Survey Results 2016. Stack Overflow [online]. Stack Exchange Inc;, 2018 [cit. 2018-01-07]. Dostupné z: https://insights.stackoverflow.com/survey/2016

[5] The Swift Programming Language [online]. [cit. 2018-01-07]. Dostupné z: https://swift.org/documentation/TheSwiftProgrammingLanguage(Swift4.0.3).epub

[6] Swift 4.0 released. Swift Blog [online]. USA: Ted Kremenek, 2017 [cit. 2018-01- 07]. Dostupné z: https://swift.org/blog/swift-4-0-released/

[7] SQL vs NoSQL: The Differences. In: SitePoint [online]. SitePoint Pty., 2018, 18.9. 2015 [cit. 2018-01-07]. Dostupné z: https://www.sitepoint.com/sql-vs- nosql-differences/

[8] NoSQL A Relational Database Management System [on- line]. [cit. 2018-05-29]. Dostupné z: http://www.strozzi.it/cgi- bin/CSA/tw7/I/en_US/nosql/Home%20Page

[9] Big-data NoSQL databases: A comparison and analysis of -Big-Table-, - DynamoDB-, and -Cassandra- [online]. IEEE, 2017 [cit. 2018-05-29]. Dostupné z: https://ieeexplore.ieee.org/document/8078782/

[10] Hypertext Transfer Protocol – HTTP/1.1. The World Wide Web Consor- tium [online]. The Internet Society, 1999 [cit. 2018-01-07]. Dostupné z: https://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html

[11] COLLINS, Ryan. Updated Benchmarks for the Top Server-Side Swift Frameworks vs. Node.js [online]. 2017 [cit. 2018-01-16]. Dostupné z: https://medium.com/@rymcol/updated-benchmarks-for-the-top-server-side- swift-frameworks-vs-node-js-9da4a0491eca

[12] Perfect: Server-Side Swift [online]. 2017 [cit. 2018-01-15]. Dostupné z: http://perfect.org/

35 [13] Vapor Documentation. Vapor [online]. Qutheory, 2017 [cit. 2018-01-07]. Do- stupné z: https://docs.vapor.codes/2.0/

[14] IBM-Swift/Kitura. GitHub [online]. 2017, 3. 1. 2017 [cit. 2018-01-13]. Dostupné z: https://github.com/IBM-Swift/Kitura/tree/master/docs

[15] Zewo [online]. 2017 [cit. 2018-01-13]. Dostupné z: http://zewo.io/

[16] Current Features Benefits of the Top Server-Side Swift Frameworks. Medium [online]. Medium, 29. 3. 2017 [cit. 2018-01-07]. Dostupné z: https://medium.com/@rymcol/current-features-benefits-of-the-top-server- side-swift-frameworks-b15b4f2d7bc3

[17] Swift on the Server: Where Are We Today? Stormpath [online]. STORMPATH, 2017, 22. 6. 2016 [cit. 2018-01-07]. Dostupné z: https://stormpath.com/blog/swift-on-the-server-today#why-swift-on-the- server

[18] MongoDB vs MySQL Comparison: Which Database is Better? In: Hackernoon [online]. 13. 3. 2017 [cit. 2018-01-07]. Dostupné z: https://hackernoon.com/mongodb-vs-mysql-comparison-which-database- is-better-e714b699c38b

[19] What is MongoDB? MongoDB [online]. MongoDB, 2018 [cit. 2018-01-07]. Do- stupné z: https://www.mongodb.com/what-is-mongodb

[20] MongoKitten. In: GitHub [online]. GitHub, 2018 [cit. 2018-01-07]. Dostupné z: https://github.com/OpenKitten/

[21] [online]. 2018 [cit. 2018-05-29]. Dostupné z: https://squirrel.codes/

36 SEZNAM SYMBOLŮ, VELIČIN A ZKRATEK

Quality of Experience metoda hodnotící celkový výkon systému na základě subjektivních a objektivních hodnoceních spokojenosti zákazníků Quality of Service sada technologií v síti zaručující schopnost spolehlivě provozovat aplikace s vysokou prioritou a provozem při omezené kapacitě sítě GSM standard pro mobilní systém druhý generace Global System for Mobile communication společný projekt zaměřený na vývoj globálně přijatelných specifikací pro mobilní systémy třetí generace (3G) Enhanced Data GSM Environment rychlejší verze standardu GSM Wideband Code Division Multiple Access technologie používána v UMTS Long Term Evolution označení bezdrátových širokopásmových nebo mobilních sítí Transmission Control Protocol/Internet Protocol sada komunikačních protokolů používaných k propojení síťových zařízení na internetu LLVM Low Level Virtual Machine WWDC Worldwide Developers Conference - každoroční týdenní konference firmy Apple pro vývojáře Obj-C programovací jazyk, objektově orientované C WWW World Wide Web - celosvětová síť API Aplication Program Interface REST Representational State Transfer JSON JavaScript Object Notation - způsob zápisu dat URI Uniform Resource Identifier - slouží k přesné specifikaci zdroje informací operační systém firmy Apple SQL Structured Query Language - strukturovaný dotazovací jazyk používaný pro práci s relačními databázemi NoSQL Non Structured Query Language - používá jiné prostředky než relační databáze

37 SEZNAM PŘÍLOH

A Některé funkce programu 39 A.1 Funkce pro vyhledání a výpočet hodnot ...... 39 A.2 Funkce pro převod dat přijatých z POST požadavku ...... 40

B Databáze 41 B.1 Struktura vstupní databáze ...... 41

38 A NĚKTERÉ FUNKCE PROGRAMU

A.1 Funkce pro vyhledání a výpočet hodnot func calcTechnology(country: String? = nil, tech: String, parameter: String, year: Int? = nil, month: Int? = nil) throws -> Any { let limit = 2000 var data: Any = [] let DB=DBControl() var qr = DB.buildQuery(isoCC: country, technology: tech, year: year, month: month) var qrRes = DB.buildQueryResults(isoCC: country, year: year, month: month, technology: tech, param: parameter)

//hledani v databazi vysledku var ComparedSaved = try? DB.findSaved(qr:qrRes) if (ComparedSaved??.statisticOutput == nil) { let r = try DB.find(qr: qr, lim: limit, asType: NetworkInfo.self) if (r.count > 10) { var statOutput = StatisticOutput() var remSorted: [Double] = [] if (parameter == "downloadSpeed") { remSorted = DB.removeFirLas(percent: 5, arr: DB.downloadSpeedtoArray(netInf: r))

} else { remSorted = DB.removeFirLas(percent: 5, arr: DB.delayToArray(netInf: r)) } statOutput.avgValue = DB.getAvg(arr: remSorted) statOutput.medValue = DB.getMed(arr: remSorted) statOutput.minValue = remSorted.last! statOutput.maxValue = remSorted.first! print("ahoj10") statOutput.countValue = remSorted.count print("ahoj11") var Compared = ComparedRadioTechnologies(parameter: Parameter(rawValue: parameter), technology: Technology(rawValue: tech), countryISO: country, statisticOutput: statOutput) Compared.year = year Compared.month = month try Compared.save()

39 print("Saved to results") data = statOutput } else { return data } } else { data = ComparedSaved??.statisticOutput } return data }

A.2 Funkce pro převod dat přijatých z POST po- žadavku func getParam(for key: String) -> String? { return request.formURLEncoded?[key]?.string } func getParamAsDouble(for key: String) -> Double? { return request.formURLEncoded?[key]?.double } func getParamAsInt(for key: String) -> Int? { return request.formURLEncoded?[key]?.int } func getParamAsArray(for key: String) -> [String]? { // store array let arr = request.formURLEncoded?[key]?.array // iterate over elements and return string representation if exists return arr?.flatMap { $0.string } }

40 B DATABÁZE

B.1 Struktura vstupní databáze

wislabres.utko.feec.vutbr.cz / localhost / Mobile_QoE / MeasuredData | phpMyAdmin 4.5.4.1deb2ubuntu2 08/12/2017, 1937

# Name Type Collation Attributes Null Default Extra 1 id int(6) UNSIGNED No None AUTO_INCREMENT 2 downloadSpeed double No None 3 latency double No None 4 qoe double No None 5 radioTechnology varchar(30) latin1_swedish_ci Yes NULL 6 reachableVia varchar(30) latin1_swedish_ci Yes NULL 7 operator varchar(30) latin1_swedish_ci Yes NULL 8 isoCountryCode varchar(30) latin1_swedish_ci Yes NULL 9 latitude float No None 10 longlat float No None 11 altitude double No None 12 accurancy double No None 13 horizontalAccuracy double No None 14 wifiEnabled int(11) No None 15 appVersion varchar(5) latin1_swedish_ci Yes NULL 16 deviceIdCode varchar(50) latin1_swedish_ci Yes NULL 17 systemName varchar(30) latin1_swedish_ci Yes NULL 18 systemVersion varchar(30) latin1_swedish_ci Yes NULL 19 phoneModel varchar(30) latin1_swedish_ci Yes NULL 20 phoneModelDetail varchar(30) latin1_swedish_ci Yes NULL 21 saved_date timestamp on update CURRENT_TIMESTAMP No CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP 22 RAWData varchar(300) latin1_swedish_ci Yes NULL 23 Filtered int(1) No None 24 UserRating int(11) No None 25 UserSatisfaction int(11) No None 26 signalStrength int(11) No None 27 mobileCountryCode varchar(10) latin1_swedish_ci No None 28 mobileNetworkCode varchar(10) latin1_swedish_ci No None 29 verticalAccurancies varchar(500) latin1_swedish_ci No None 30 horizontalAccurancies varchar(500) latin1_swedish_ci No None 31 accurancyTimeStamps varchar(500) latin1_swedish_ci No None 32 floor int(11) No None 33 speed int(11) No None 34 activityType int(11) No None 35 activityMotion int(11) No None 36 activityConfidence int(11) No None 37 activityStartInterval float No None 38 displayBrightness float No None 39 timeStamp float No None 40 date varchar(30) latin1_swedish_ci No None 41 userIndoorMark int(2) No None

Information

Space usage Row statistics Data 79.6 MiB Format dynamic Index 0 B Collation latin1_swedish_ci Total 79.6 MiB Next autoindex 177,014 Creation May 29, 2017 at 04:12 PM Last update Dec 08, 2017 at 07:27 PM

http://wislabres.utko.feec.vutbr.cz/phpmyadmin/tbl_structure.ph…e_QoE&table=MeasuredData&token=1c4cca26c72391c3bd07821352e3aa44 Page 1 of 1

Obr. B.1: Struktura databáze výsledků

41