Microsoft Word - sekulic-diplomski.doc

Слични документи
PuTTY CERT.hr-PUBDOC

Microsoft Word - privitak prijedloga odluke

Recuva CERT.hr-PUBDOC

Web programiranje i primjene - Osnovni pojmovi WEB tehnologije korišteni u kolegiju

Document ID / Revision : 0419/1.1 ID Issuer Sustav (sustav izdavatelja identifikacijskih oznaka) Upute za registraciju gospodarskih subjekata

eredar Sustav upravljanja prijavama odjelu komunalnog gospodarstva 1 UPUTE ZA KORIŠTENJE SUSTAVA 1. O eredar sustavu eredar je sustav upravljanja prij

KORISNIČKE UPUTE APLIKACIJA ZA POTPIS DATOTEKA

Slide 1

Slide 1

kriteriji ocjenjivanja - informatika 8

Opći uvjeti korištenja servisa e-Račun za državu povezivanjem_obveznici javne nabave_052019_konačna verzija

Sveučilište u Zagrebu Fakultet prometnih znanosti Zavod za inteligentne transportne sustave Katedra za primijenjeno računarstvo Vježba: #7 Kolegij: Ba

Microsoft PowerPoint - podatkovni promet za objavu.pptx

Microsoft Word - 13-Mreze.doc

PPT

Microsoft PowerPoint - 06 Uvod u racunarske mreze.ppt

Microsoft Word - IP_Tables_programski_alat.doc

Smjernice za korištenje sustava online prijava Ukoliko imate pristupno korisničko ime i lozinku ili ste navedeno dobili nakon zahtjeva za otvaranje no

NIAS Projekt e-građani KORISNIČKA UPUTA za aplikaciju NIAS Verzija 1.1 Zagreb, srpanj 2014.

8 2 upiti_izvjesca.indd

PDO

Drugi kolokvij iz predmeta Operacijski sustavi 2. srpnja Napomene: PISATI ČITKO! Zadatke 7-10 rješavati na ovom papiru ili uz njih napisati "na

Algoritmi SŠ P1

Inženjering informacionih sistema

E-RAČUN ZA POSLOVNE SUBJEKTE ZAPRIMANJE I SLANJE E-RAČUNA JE LAKO, PROVJERITE U FINI KAKO...

Sveučilište u Zagrebu

Test ispravio: (1) (2) Ukupan broj bodova: 21. veljače od 13:00 do 14:00 Županijsko natjecanje / Osnove informatike Osnovne škole Ime i prezime

EUROPSKA KOMISIJA Bruxelles, C(2018) 3697 final ANNEXES 1 to 2 PRILOZI PROVEDBENOJ UREDBI KOMISIJE (EU) /... o izmjeni Uredbe (EU) br. 1301

23. siječnja od 13:00 do 14:00 Školsko natjecanje / Osnove informatike Srednje škole RJEŠENJA ZADATAKA S OBJAŠNJENJIMA Sponzori Medijski pokrovi

PowerPoint Template

Pravilnik o načinu i uvjetima sprječavanja i suzbijanja zlouporaba i prijevara u pružanju usluga elektroničke pošte

MultiBoot Korisnički priručnik

Korisničke upute za podnošenje zahtjeva za rješavanje spora (žalbe)

Повезивање са интернетом

Često postavljana pitanja u programu OBRT 1. Kako napraviti uplatu u knjizi tražbina i obveza? 2. Kako odabrati mapu/disk za pohranu podataka? 3. Kako

Računarske mreže Čas 2 Ivana Tanasijević Matematički fakultet, Beograd 1

Sveučilište J.J. Strossmayera Fizika 2 FERIT Predložak za laboratorijske vježbe Lom i refleksija svjetlosti Cilj vježbe Primjena zakona geometrijske o

UVJETI KORIŠTENJA INTERNETSKE STRANICE Korisnik posjetom web stranicama potvrđuje da je pročitao i da u cijelosti prihvaća o

SVEUČILIŠTE U ZAGREBU FAKULTET ORGANIZACIJE I INFORMATIKE V A R A Ž D I N Leo Siniša Radošić Modreni upravitelj zaporkama ZAVRŠNI RAD Varaždin,

OpenVPN GUI CERT.hr-PUBDOC

Slide 1

Rad u mrežnom okruženju Osnove informatike s primjenom računala

Programiranje 2 popravni kolokvij, 15. lipnja Ime i prezime: JMBAG: Upute: Na kolokviju je dozvoljeno koristiti samo pribor za pisanje i brisanj

Vjezbe

CARNET Webmail Upute za korištenje

Microsoft Word - InveoP_01.docx

Kvantna enkripcija

PowerPoint Presentation

Slide 1

UNIVERZITET U NOVOM SADU TEHNIČKI FAKULTET MIHAJLO PUPIN ZRENJANIN TEHNOLOGIJE DISTRIBUIRANIH INFORMACIONIH SISTEMA - Skripta za teorijski deo (RADNA

Lorem ipsum dolor sit amet lorem ipsum dolor

OBAVIJEST PZZ KORISNICIMA Poštovani korisnici programskog rješenja Last2000. Za Vas smo pripremili sljedeće novosti u programu: NOVOSTI

SVEUČILIŠTE U ZAGREBU FAKULTET ORANIZACIJE I INFORMATIKE VARAŽDIN Antonio Glešić Aplikacija za razmjenu tekstualnih poruka unutar tematskih skupina ZA

PHP proširenja za rad sa bazama podataka Postoje pojedinačna proširenja za različite tipove baza podataka sa svojim bibliotekama funkcija npr. postoji

Instalacija i konfiguracija DriveAngela na operativni sistem Apple ios

PROGRAMIRANJE Program je niz naredbi razumljivih računalu koje rješavaju neki problem. Algoritam je postupak raščlanjivanja problema na jednostavnije

ALIP1_udzb_2019.indb

Instalacija i konfiguracija DriveAngela na operativni sistem Android

Podružnica za građenje

(Microsoft Word - Dr\236avna matura - studeni osnovna razina - rje\232enja)

Signal NCERT-PUBDOC

JMBAG Ime i Prezime Mreže računala Završni ispit 16. veljače Na kolokviju je dozvoljeno koristiti samo pribor za pisanje i službeni šalabahter.

OpenDNS Family Shield CERT.hr-PUBDOC

Nastavna cjelina: 1. Jezik računala Kataloška tema: 1.1. Bit 1.2. Brojevi zapisani četvorkom bitova Nastavna jedinica: 1.1. Bit   1.2. Brojevi zapisan

Korisničko uputstvo mobilne aplikacije Digitalni Kiosk 1

Microsoft Word - IZ-AT-UT-OPR-Pojmovnik-v5.0

Microsoft PowerPoint - LB7-2_WCCF_2010.ppt

Gdin Nikola Kovač

Računarski praktikum I - Vježbe 01 - Uvod

Sveučilište J.J. Strossmayera Fizika 2 FERIT Predložak za laboratorijske vježbe Određivanje relativne permitivnosti sredstva Cilj vježbe Određivanje r

Microsoft PowerPoint - LB7-2_WCCF_2012.ppt

KATALOG ZNANJA IZ INFORMATIKE

POSLOVNI INFORMACIONI SISTEMI I RA^UNARSKE

Microsoft Word - 24ms241

Microsoft Word - V03-Prelijevanje.doc

Korisnicke upute za uslugu "Moj e-racun"

Microsoft Word - 6. RAZRED INFORMATIKA.doc

Trimble Access Software Upute za korištenje V2.0 Geomatika-Smolčak d.o.o.

RAD SA PROGRAMOM

VALIDNOST CERTIFIKATA ZA PRISTUP INTERNET APLIKACIJAMA POREZNE UPRAVE FEDERACIJE BOSNE I HERCEGOVINE (npis I ejs)

Dijagrami sekvenci

Slide 1

Programiranje 1 drugi kolokvij, 2. veljače Ime i prezime: JMBAG: Upute: Na kolokviju je dozvoljeno koristiti samo pribor za pisanje i brisanje,

GLAZBENA UČILICA Marko Beus Filozofski fakultet u Zagrebu 098/ Sažetak Glazbena učilica je projekt osmišljen kao nadopuna

Microsoft Word - predavanje8

Sveucilište u Zagrebu

Upute za instaliranje WordPressa 1.KORAK Da biste instalirali Wordpress, najprije morate preuzeti najnoviju verziju programa s web stranice WordPressa

HxD CERT.hr-PUBDOC

PROPISNIK O KALENDARU NATJECANJA

1. DODATNE USLUGE Pored prethodno navedenih osnovnih usluga, privatni korisnik može odabrati i sledeće dodatne usluge koje su podijeljene po kategorij

Daljinski upravljiva utičnica

Microsoft Word - 24ms221

CARNET Helpdesk - Podrška obrazovnom sustavu e-dnevnik upute za nadzor razrednih knjiga tel: fax: mail:

WAMSTER Prezentacija

Artakom d.o.o. Zaštita osobnih podataka općenito Artakom d.o.o. obvezuje se na zaštitu Vaših osobnih podataka temeljem Uredbe (EU) 2016/679 Europskog

Microsoft Word - PLC na Ethernet mrezi.doc

Slide 1

KAKO POHRANITI SVOJ RAD U REPOZITORIJ

Microsoft Word - Svrha projekta.doc

UPUTSTVO ZA PODEŠAVANJE MOBILNIH UREĐAJA ZA MMS

Транскрипт:

SVEUČILIŠTE U ZAGREBU FAKULTET ELEKTROTEHNIKE I RAČUNARSTVA DIPLOMSKI RAD br. 780 GEOPROSTORNI SUSTAV OBJAVI- PRETPLATI ZA UREĐAJE S OPERACIJSKIM SUSTAVOM ANDROID Antun Sekulić Zagreb, srpanj 2014.

sveuetltsre u ZAGREBU FAKU LTET ELEKTROTEHNIKE I NNCUruARSTVA ODBOR ZA DIPLOMSKI RAD PROFILA Zagreb, 10. ozujka 2014. DIPLOMSKI ZADATAK br. 780 Pristupnik: Studij: Profil: Antun Sekuli6 I nformacijska i komunikacijska tehnologija Telekomunikacije i informatika Zadatak: Geoprostorn i s ustav objavi -pretplati za uredaie s operacijs ki m sustavom Android Opis zadatka: U modelu objavi-pretplati postoje dvije vrste korisnika, a to su pretplatnici objavljivadi. Pretplatnici aktiviraju pretplate kojima se pretplacuju na podatke koje objavljuju objavljivadi. Sustav objavi-pretplati je posrednik u komunikaciji izmedu objavljivada i pretplatnika. On usporeduje nove objave s aktivnim pretplatama i isporuduje ih zainteresiranim pretplatnicima. Usporedba izmedu objava i pretplata se u postoje6im sustavima objavi-pretplati temelji na njihovom sadrzaju i najdes6e je definirana Booleovom funkcijom. VaS zadatak je osmisliti, programskizvesti i testirati geoprostorni sustav objavi-pretplati u kojem su objave i pretplate definirane kao geoprostomi objekti (npr. todke, linije, poligoni) s dodatno pridruzenim sadrzajem. Pri tome definirajte i programski izvedite realne funkcije usporedbe razliditih vrsta geoprostomih objekata. Osim toga, proudite i odaberite pogodne nadine za unos i vizualizaciju geoprostornih pretplata i objava na uredajima s operacijskim sustavom Android. lsporuku objava pretplatnicima ostvarite kori5tenjem programskog okvira Google Cloud Messaging for Android (GCM) koji omogucava prosljedivanje poruka na uredaje s operacijskim sustavom Android bez- prethodnog eksplicitnog zahtjeva korisnika. Ostvareni geoprostorni sustav objavi-pretplati ispitajte na odabranom studijskom sludaju. Svu potrebnu literaturu i uvjete zarad osigurat 6e Vam Zavod za telekomunikacije. Zadatak uruden pristupniku : 14. olujka 2014. Rok za predaju rada: 30. lipnja 2014. Mentor: o Y q?t''< rt' Predsjednik odbora za diplomski rad profila:

Sadržaj Uvod... 1 1. Arhitektura sustava... 2 1.1. Model objavi-pretplati... 2 1.2. Objave... 2 1.2.1. Pretplate... 3 1.2.2. Poslužitelj... 3 1.2.3. Geoprostorni sustav obajvi-pretplati... 3 1.3. Operacijski sustav Android... 4 1.3.1. Komponente aplikacija... 5 1.3.2. Usluga GCM... 11 1.3.3. Slanje poruka... 13 1.4. PostgreSQL baza podataka... 15 1.4.1. Dodatak PostGIS... 15 1.4.2. Određivanje udaljenosti između geoprostornih objekata... 20 2. Geoprostorni poslužitelj objavi-pretplati... 25 2.1.1. Implementacija poslužitelja... 26 2.2. Zadaće aplikacijskog poslužitelja... 26 2.2.1. Obrađivanje korisničkih zahtjeva... 27 2.2.2. Pohranjivanje podataka u bazu... 30 2.2.3. Slanje poruka GCM poslužitelju... 32 2.3. Poslužitelj baze podataka... 33 3. Klijentska aplikacija... 35 3.1. Stvaranje i otkazivanje pretplata... 36 3.2. Stvaranje objava... 38 3.3. Prikazivanje primljenih objava... 39

3.4. Implementacija klijntske aplikacije... 40 4. Analiza rada sustava... 43 4.1. Analiza pohranjivanja pretplata... 43 4.2. Analiza objavljivanja objava... 44 Zaključak... 49 Literatura... 50 Sažetak... 51 Summary... 52 Privitak... 53 Podešavanje GCM i Google Map usluge... 53 Testiranje poslužitelja... 56

Uvod U današnje vrijeme se suočavamo s velikom količinom informacija koje dolaze iz raznih izvora poput televizije, radija, interneta i sve više s naših pametnih telefona. Vrlo se lako može dogoditi da smo propustili informaciju koja nam je u tom trenutku važna. Primjer takve situacije bi bila prometna nesreća na putu kojim obično vozimo s posla do kuće. Pretpostavimo li da je vijest o nesreći prenesena preko radio postaje koju nismo slušali, posljedica neprimanja informacije bi mogla biti višesatno čekanje u prometnoj gužvi. U radu je prezentiran i ostvaren model sustava objavi-pretplati koji koristi geoprostorne objekte za definiranje objava i pretplata kojim bi se mogao riješiti opisan problem. U prvom poglavlju dan je opis sustava objavi- pretplati, kao i komponenti koje se koriste za ostvarivanje geoprostornog sustava objavi-pretplati. U drugom poglavlju se ulazi u detaljniju analizu i implementaciju samoga poslužitelja, dok je u trećem poglavlju opisana klijentska aplikacija i način na koji se koristi. U zadnjem poglavlju napravljena je analiza rada poslužitelja, pošto on predstavlja usko grlo u radu sustava. 1

1. Arhitektura sustava Za ostvarivanje sustava objavi-pretplati koji svoje objave i pretplate definira pomoću lokacije potrebno je razumjeti kako radi klasični objavi sustav pretplati i od kojih se komponenti sastoji. Pri razvoju geoprostornog sustava objavi-pretplati javlja se nekoliko problema. Glavni problemi su implementacija pokretnog klijenta koji može primati i slati objave, i definiranje geoprostornih objektata koje razmjenjuju klijenti i poslužitelj. Također, potrebno je riješiti problem pohrane i obrade geoprostornih objekta na poslužitelju. 1.1. Model objavi-pretplati Kod informacijskih sustava u kojima je potrebno razmjenjivati veliki broj poruka između velikog broja subjekata, često se koristi programski obrazac objavi-pretplati. Ovakav model oblikovanja sustava prvi se put spominje u [1] pri opisu podsustava za distribuciju vijesti. Model objavi-pretplati definira postojanje dvije vrste krajnjih čvorova koji međusobno razmjenjuju poruke preko poslužitelja. Prva vrsta su objavljivači (publishers) koji stvaraju objave, a druga vrsta subjekata su pretplatnici (subscribers) koji primaju objave od interesa. Važno je naglasiti da objavljivači i pretplatnici nikada ne komuniciraju izravno jedni s drugima i jedni ne znaju za postojanje drugih, već umjesto toga komuniciraju isključivo preko poslužitelja 1.2. Objave Kako bi ostvarili ovakav sustav razmjene objava, nužno je da se svaka objava koju objavljivač stvori sastoji od dvije vrste podataka. Prva vrsta podataka je sam sadržaj objave koji se želi prenijeti pretplatnicima i on može biti bilo kojeg formata. Tako postoje objave u kojima se prenose slike, tekstualni podatci, multimedijalni zapisi i drugo. Osim toga, svaka objava sadrži i drugu vrstu podataka koju nazivamo metapodatcima. Metapodatci su u suštini ključne riječi koje opisuju samu objavu i na temelju njih će poslužitelj odrediti koje pretplatnike zanima koja objava. Za razne objavi-pretplati sustave postoje razne vrste 2

metapodataka. Tako na primjer, ako je generirana objava neka vrsta vijesti koju prenosi određena novinska agencija, metapodatci bi mogli opisivati tip generirane vijesti (npr. sport, vremenska prognoza, crna kronika i slično). 1.2.1. Pretplate Pretplatnici kao krajnji primatelji objava unaprijed definiraju koje vrste objava žele primati definiranjem pretplata. Određivanje pretplata se svodi na određivanje metapodatka koji zanimaju pretplatnika i njihovo dojavljivanje poslužitelju. Svaki pretplatnik dojavljuje poslužitelju i svoju adresu na koju želi primati objave. Svaki poslužitelj omogućuje pretplatnicima definiranje pretplata iz poznatog skupa metapodataka s kojim poslužitelj zna raditi. Tako na primjer pretplate mogu bit samo vijesti vezane za sport, određeni sportski klub ili samo za određenu nogometnu utakmicu, ako se radi o sustavu objavipretplati koji je specijaliziran za sportske vijesti. 1.2.2. Poslužitelj Poslužitelj kao centralno mjesto u objavi-pretplati sustavu, mora održavati bazu podatka u kojoj su pohranjene informacije o pretplatnicima. Ako sustav nudi određene vremenske operacije nad objavama, potrebno je pohranjivati i sve pristigle objave od objavljivača. Primjer vremenske operacije bi bilo definiranje vremena kada pretplatnici žele primati objave. U takvom sustavu bi poslužitelj pohranjivao objave za pojedinog korisnika i isporučivao ih u navedenom trenutku. Suprotni, jednostavniji primjer rada je prosljeđivanje objava pretplatnicima onda kada ih objavljivači generiraju. Nakon primanja objave od objavljivača, poslužitelj provodi određeno filtriranje i grupiranje objava i korisnika, te prosljeđuje objave na temelju tih operacija. Komunikacija poslužitelja s pretplatnicima je dvosmjerna, što znači da pretplatnici poslužitelju dojavljuju svoje pretplate, a poslužitelj pretplatnicima isporučuje objave. Komunikacija između poslužitelja i objavljivača je jednosmjerna, što znači da objavljivači samo prosljeđuju svoje objave poslužitelju. 1.2.3. Geoprostorni sustav obajvi-pretplati U geoprostornom sustavu objavi-pretplati objave i pretplate, osim standardnih meta podataka, sadrže i informacije o lokaciji. U takvom sustavu se pretplatnici pretplaćuju na 3

određeno područje za koje žele primati obavijesti, a objavljivači u svaku objavu uključuju podatke o njenoj lokaciji. U takvom sustavu poslužitelj mora znati raditi s geoprostornim objektima kao što su točke, linije i poligoni. To znači da poslužitelj mora posjedovati mehanizme pohrane takve vrste podatka i određivanje njihovih međusobnih odnosa. Ovdje se prvenstveno misli na definiranje njihove međusobne udaljenosti. Mehanizam određivanja udaljenosti između objekata se koristi u određivanju korisnika kojima će se proslijediti određena objava. Aplikacija koju koriste pretplatnici treba pružati korisničko sučelje pomoću kojega se mogu definirati prostorne pretplate. Isto tako i objavljivači pri stvaranju obavijesti trebaju korisničko sučelje preko kojega će generirati objave i odrediti prostorne informacije za te objave. 1.3. Operacijski sustav Android Operacijski sustav Android je jedan od najpopularnijih operacijskih sustava za pametne telefone i tablete, a u zadnje vrijeme se koristi i u velikom broju drugih uređaja. Primjer su pametni televizori i pametni ručni satovi. Operacijski sustav je razvijen na jezgri opercijskog sustava Linux, i javno je dostupan (open source), što ga je učinilo vrlo popularnim u razvijateljskoj zajednici (developers community), kako i kod velikog broja kompanija koje žele jeftini operacijski sustav za svoju potrošačku elektroniku. Vodeće svjetske kompanije kao što su Samsung, HTC, LG i Motorola razvijaju pametne telefone i tablete bazirane na ovom operacijskom sustavu. Aplikacije za Android operacijski sustav su pretežno pisane u programskom jeziku Java i prevedene pomoću Android SDK alata u izvršni kod koji se pokreće na Dalvik virtualnom stroju. No aplikacije je moguće razvijati i u nekoliko drugih programskih jezika i tehnologija, kao što su HTML5 i Scala. Svaka aplikacija za Android se izvodi unutar svojeg sigurnog prostora na operacijskom sustavu (sandbox). Pošto je Android višekorisnički operacijski sustav, svaka aplikacija se tretira kao zasebni korisnik kojem je dodijeljen jedinstveni korisnički ID, koji koristi samo operacijski sustava i nepoznat je aplikaciji. Sustav potom dodjeljuje dozvole za rad svim datotekama u aplikaciji za dodijeljeni ID aplikacije, tako da im samo aplikacija u čijem su 4

vlasništvu može pristupiti. Dodatno, svaki proces u operacijskom sustavu se izvršava na vlastitom virtualnom stroju, kako bi ga se izoliralo od ostalih aplikacija. 1.3.1. Komponente aplikacija Svaku aplikaciju za Android operacijski sustav pisanu u programskom jeziku Java, možemo logički podijeliti u nekoliko osnovnih građevinskih blokova, tj. u logičke cjeline koje obavljaju određenu vrstu posla. Svaka komponenta predstavlja točku kroz koju sustav može pristupiti aplikaciji. Ne predstavljaju sve komponente konkretni ulaz u aplikaciju preko kojih joj korisnik može pristupiti, ali svaka komponenta postoji kao zasebni entitet i obavlja specifičnu ulogu. Postoji pet vrsta osnovnih komponenti od kojih svaka definira svoj životni ciklus, tj. kako nastaje i kada će biti uništena i dodatno manifest datoteka. Manifest datoteku sadrži svaka aplikacija. U njoj se nalazi opis aplikacije sa svim njezinim komponentama, kao i informacije koje koristi operacijski sustav za pokretanje i izvođenje aplikacije. Aktivnost (activity) je osnovna komponenta svake aplikacije. Ona omogućava prikazivanje korisničkog sučelja i interakciju između korisnika i aplikacije. Postoji nekoliko vrsta aktivnosti koje mogu zauzimati razne veličine zaslona, ali pretežno se koriste tako da zauzimaju cijeli zaslon. Većina aplikacija se najčešće sastoji od više aktivnosti od kojih svaka obavlja svoj posao. Pri promjeni aktivnosti operacijski sustav vodi računa o održavanju FIFO stoga (First In First Out) na koji se pohranjuje prethodna aktivnost. Kada korisnik pritisne tipku za povratak (back), sa stoga se uzima prethodna stavljena aktivnost i ona postaje glavna aktivnost. Životni ciklus svake aktivnosti počinje pozivom metode oncreate(), a završava pozivom metode ondestroy(). U životnom ciklusu svake aktivnosti postoji još nekoliko metoda, koje također poziva operacijski sustav. Tako još postoji metoda onstart(), koja se poziva neposredno prije nego aktivnost postane vidljiva korisniku, onresume(), koja se poziva kada je aktivnost postala vidljiva, onpause(), koja se poziva kada će se aktivnost zaustaviti i metoda onstop() koje se poziva kada se aktivnost zaustavi. Za aktivnost kažemo da je aktivna ako se nalazi, gledano po pozivima metoda, između poziva onresume() i onpause(). U aktivnoj fazi korisnik može vršiti interakciju s aktivnosti. Kada korisnik prestane 5

koristiti trenutnu aktivnost, tj. kada se pozove metoda onpause(), aktivnost će prijeći u pauzirano stanje. Pauzirano stanje označava da sustav u radnoj memoriji drži sve podatke o aktivnosti i da je ona još uvijek vezana za upravitelja prozorima (window manager). Sustav ju može brzo vratiti u aktivno stanje pozivom metode onresume() ako to korisnik zatraži. Ako je pozvana metoda onstop(), to označava da je aktivnost otišla u pozadinu (background). U ovom stanju sustav još uvijek u radnoj memoriji drži većinu informacija o aktivnost, ali ona nije vezana za upravitelja prozorima i sustav ju može obrisati iz memorije ako neka druga aktivnost s višim prioritetom zahtijeva dodatnu radnu memoriju. Ako se to dogodi, pri ponovnom stvaranju obrisane aktivnosti ponovno se poziva metoda oncreate(). Također je moguće vraćanje korisnika na aktivnost koja je u pozadini prije nego ju sustav obriše iz radne memorije. Tada se prvo poziva metoda onrestart(), pa zatim metoda onstart(). Slika 1.1 Životn ciklus aktivnosti, preuzeto s [2] 6

Aktivnost se stvara nasljeđivanjem klase Activity. Svaka aktivnost u aplikaciji mora imati svoju definiciju u manifest.xml datoteci, unutar oznaka aplikacije (application tag). <manifest... > <application... > <activity android:name=".exampleactivity" />... </application... >... </manifest > Kod 1.1 Definiranje aktivnosti u manifest datoteci Dodatno, početna aktivnost mora sadržavati parametre kojima se obavještava sustav da nju prvu pokrene pri paljenju aplikacije. <intent-filter> <action android:name="android.intent.action.main" /> <category android:name="android.intent.category.launcher" /> </intent-filter> Kod 1.2 Definiranje dodatnih parametara aktivnosti Pokretanje nove aktivnosti iz trenutne se ostvaruje pozivanjem metode startactivity(), kojoj predajemo objekt Intent koji opisuje aktivnost koju želimo pokrenuti. Intent intent = new Intent(this, SignInActivity.class); startactivity(intent); Usluga (service) predstavlja komponentu sustava koja izvršava operacije u pozadini na zasebnoj dretvi. Ova komponenta ne sadrži korisničko sučelje i uglavnom se koristi kada želimo obavljati neke radnje bez blokiranja korisničkog sučelja. Primjer takve operacije bi bilo puštanje glazbe, dohvaćanje podatka s mreže, snimanje ili čitanje podataka s diska. 7

Dodatna razlika između aktivnosti i usluge je u tome što se usluga jedne aplikacije može izvršavati u pozadini čak i ako je druga aplikacija trenutno preuzela fokus, to jest, trenutno je aktivna. Usluge omogućavaju spajanje s drugim komponentama (binding), koje ne moraju biti dio aplikacije kojoj pripada usluga. Time je moguće ostvariti međuprocesnu komunikaciju (interprocess communication, IPC). Usluga može imati dva oblika: Pokrenuta usluga (started service) je usluga koja je pokrenuta od strane druge komponente poput aktivnosti pozivanjem metode startservice(). Jednom pokrenuta, usluga se izvodi u pozadini neodređeno dugo, čak i ako je komponenta koja ju je pokrenula zaustavljena. Ovakva vrsta usluge se koristi kada želimo obaviti određeni posao na drugoj dretvi, neovisno o aplikaciji koju koristimo. Samoj usluzi se prepušta logika zaustavljanja kada završi s poslom. Primjer korištenja ovakve usluge bio bi dohvat podataka s mreže ili reprodukcija glazbe. Povezana usluga (bounded service) nastaje povezivanjem druge komponente s uslugom pozivom metode bindservice(). Usluga tada pruža sučelje preko kojega ta komponenta može komunicirati s njom. Povezana usluga je pokrenuta onoliko dugo dok ima komponenti koje su povezane s njom. Komponenta prekida vezu s uslugom pozivom metode onunbind(). Isto kao i aktivnosti, usluge je potrebno navesti u manifest datoteci unutar oznaka aplikacije kako bi operacijski sustav bio svjestan njihovog postojanja. <manifest... >... <application... > <service android:name=".exampleservice" />... </application> </manifest> Kod 1.3 Definiranje usluge u manifest datoteci 8

Pokretanje usluga iz drugih komponenti se izvodi pozivom metode startservice()kojoj predajemo Intent koji opisuje uslugu koju želimo pokrenuti. Intent intent = new Intent(this, HelloService.class); startservice(intent); Slika 1.2 Životni ciklus usluge, preuzeto s [2] Pružatelji sadržaja (content providers) su komponente koje predstavljaju objekte koji upravljaju skupom podataka koji se može dijeliti između aplikacija. Podaci kojima upravljaju se mogu pohranjivati na datotečni sustav operacijskog sustava, u bazu podataka SQLite, na mrežnog poslužitelja ili u bilo koji drugi oblik trajne pohrane podataka kojoj aplikacija može pristupiti. Tako na primjer sam operacijski sustav Android definira nekoliko javnih pružatelja sadržaja pomoću kojih možemo pristupiti kontaktima koji su spremljeni na uređaju, SMS porukama i slično. Iako im je primarna namjena dijeljenje podataka između aplikacija, ove komponente su također korisne pri radu s privatnim skupom podataka jer pružaju jednostavno sučelje za upravljanje s podacima. 9

Kao i prethodne dvije komponente, i pružatelji sadržaja moraju biti navedeni u manifest datoteci. <provider android:authorities="list" android:enabled=["true" "false"] android:exported=["true" "false"]... >... </provider> Kod 1.4 Definiranje pružatelja sadržaja u manifest datoteci Primatelji objavljenih namjera (broadcast receivers) su komponente koje od operacijskog sustava primaju objave globalnih namjera. Ovim načinom komunikacije operacijski sustav može jednostavno obavijestiti sve zainteresirane aplikacije o određenom događaju. Tako na primjer Android redovno šalje poruke o stanju baterije, gašenju ekrana i stanju mreže. Aplikacije također mogu odašiljati ovakvu vrstu obavijesti svim zainteresiranim aplikacijama. Iako ova komponenta ne definira vlastito korisničko sučelje, može stvoriti statusnu obavijest (notification) o tome da se dogodio neki događaj u operacijskom sustavu. Fragmenti (fragments) su komponente sustava koje se prvenstveno koriste za prikazivanje sadržaja unutar aktivnosti. Modeliranje sadržaja unutar fragmenta omogućava aktivnosti da promjenom aktivnog fragmenta promjeni sadržaj na ekranu. U suprotnom slučaju bi za promjenu sadržaja bilo potrebno promijeniti aktivnu aktivnost, što ponekad nije praktično rješenje. Fragmenti također omogućuju separaciju programske logike čime se postiže bolja preglednost i iskoristivost napisanog koda. 10

1.3.2. Usluga GCM Google Cloud Messaging for Android (GCM) je usluga koja omogućava razmjenu kratkih poruka, veličine do 4 kb, između poslužitelja i klijentske aplikacije koja se izvodi na uređaju s Android operacijskim sustavom. Razmjena poruka je dvosmjerna, što znači da poslužitelj može klijentu poslati poruku, i klijent mu može odgovoriti. Svaka aplikacija koja se izvodi na operacijskom sustavu Android može, ako ima dopuštenje korisnika, zatražiti od GCM poslužitelja svoj jedinstveni identifikator (push ID). Ovaj identifikator omogućuje da Android zna točno kojoj aplikaciji treba proslijediti poruku od GCM poslužitelja. Kada aplikacija dobije jedinstveni identifikator mora ga dojaviti aplikacijskom poslužitelju. U modelu komunikacije objavi-pretplati dobiveni identifikator predstavlja korisnikovu adresu na kojoj želi primati objave. U sustavu GCM razlikujemo dvije vrste poslužitelja kao što je prikazano na slici 1.3: Spojni poslužitelji su niz poslužitelja između klijenta i aplikacijskog poslužitelja. Oni su zaduženi za prihvat, pohranjivanje i prosljeđivanje poruke od aplikacijskog poslužitelja do klijenta. Ovim poslužiteljima upravlja tvrtka Google. Aplikacijski poslužitelj kojima upravlja razvijatelj aplikacije. Njegova osnovna uloga je pohrana korisničkih pretplata i identifikatora (push ID) koje dobiva od klijenata, kao i prosljeđivanje poruka GCM spojnom poslužitelju. Slika 1.3 Arhitektura sustava za slanje poruka, preuzeto s [2] 11

Aplikacijski poslužitelj je zadužen za pohranjivanje korisnikovog jedinstvenog identifikatora s drugim relevantnim podatcima o tom korisniku, kao što su na primjer njegove pretplate. Slanje poruke od aplikacijskog poslužitelja do korisnika se odvija posredstvom GCM poslužitelja. Tijelo i format poruke koja se šalje od aplikacijskog poslužitelja do GCM poslužitelja ovisi o protokolu koji se koristi za komunikaciju. Trenutno je moguće odabrati HTTP ili XMPP (Extensible Messaging and Presence Protocol) [13] protokol. Za slanje poruke pomoću HTTP protokola potrebno je poslati HTTP POST zahtjev na adresu GCM poslužitelja (točna adresa u privitku). Za slanje tekstualnih poruka HTTP zahtjev mora sadržavati sljedeća HTTP zaglavlja: Authorization: key = 'ključ aplikacije' Content-Type: aplication/json (ako šaljemo JSON objekt kao poruku) ili application/x-www-form-urlencoded;charset=utf-8 ako šaljemo običan tekst kao poruku. Kod 1.3 HTTP zaglavlja za slanje poruke GCM poslužitelju Pretplatnike kojima želimo poslati poruke navodimo u JSON polju imena registration_id. Podatke koje šaljemo navodimo u JSON objektu ime data. Content-Type:application/json Authorization:key=AIzaSyB-1uEai2WiUapxCs2Q0GZYzPu7Udno5aA { "registration_ids" : ["APA91bHun4MxP5egoKMwt2KZFBaFUH- 1RYqx..."], "data" : {... }, } Kod 1.4 Tijelo HTTP zahtjeva 12

1.3.3. Slanje poruka Općeniti redoslijed izvođenja operacija potrebnih za slanje poruka između klijentske aplikacije i aplikacijskog poslužitelja je prikazana na UML sekvencijskom dijagramu na slici 1.4: 1. Registracija za uslugu GCM. Klijentska aplikacija zatražuje od GCM poslužitelja svoj jedinstveni identifikator (push ID). Svaka aplikacija koja želi koristiti uslugu GCM mora u svojoj manifest datoteci dodati sljedeće zahtjeve za dopuštenje korisnika: <uses-permission android:name="android.permission.internet" /> <uses-permission android:name="com.google.android.c2dm.permission.receive" /> <uses-permission android:name="ime_paket_aplikacije.permission.c2d_message" /> Kod 1.5 Navođenje dopuštenja u manifest datoteci Prvi zahtjev se odnosi na dozvolu za pristup Internet mreži, dok se druga dva odnose na korištenje usluge GCM. 2. Obavještavanje aplikacijskog poslužitelja. Nakon što je aplikacija dobila push ID od GCM poslužitelja, mora ga dojaviti aplikacijskom poslužitelju s drugim važim parametrima potrebnim za rad usluge. Ova se komunikacija najčešće odvija preko HTTP protokola, gdje klijent pošalje HTTP POST zahtjev sa svim parametrima na adresu aplikacijskog poslužitelja, na što aplikacijski poslužitelj odgovara s porukom o uspješnosti ili o pogrešci registracije. 3. Slanje poruke GCM poslužitelju. Sljedeći korak je slanje poruke od aplikacijskog do GCM poslužitelja. Kao što je ranije opisano, moguće je koristiti HTTP ili XMPP protokol. Pri primitku poruke, GCM poslužitelj određuje hoće li pohraniti poruku, ako je klijent trenutno nedostupan, ili će ju 13

odmah proslijediti. Aplikacijski poslužitelj može odrediti koliko dugo GCM treba čuvati poruku, odnosno koliko dugo je poruka aktivna, dodavanjem dodatnog parametra time_to_live u zaglavlje poruke. Ako istekne vrijeme definirano u ovom zaglavlju GCM poslužitelj neće proslijediti poruku klijentu kada on postane dostupan. Također, moguće je definirati parametar delay_while_idle, koji ukazuje GCM poslužitelju da pošalje samo zadnju poruku kada klijent postane aktivan. Drugim riječima, ako je klijent dostupan primati će sve poruke, a ako je nedostupan u trenutku generiranja poruka, dobit će samo zadnju poruku kada postane dostupan. 4. Slanje poruke od GCM poslužitelja do klijenta Kada je klijent dostupan GCM poslužitelj prosljeđuje poruku klijentu. Pri primitku poruke, Android operacijski sustav prosljeđuje poruku pomoću posebne namjere objavljivanja (broadcast intent) do aplikacije koja ima potrebne ovlasti (permissions). Ovim se ujedno osigurava da će jedino klijentska aplikacija pročitati sadržaj poruke, obraditi ga i izvesti odgovarajuće akcije kao što su prikazivanje obavijesti, puštanje zvuka kojim se indicira nova poruka i slično. 5. Slanje odgovora aplikacijskom poslužitelju. Nakon što je GCM poslužitelj proslijedio poruku svim klijentima odgovara aplikacijskom poslužitelju statusnom porukom u kojoj se nalaze informacije o uspješno i neuspješno poslanim porukama. 14

Slika 1.4 UML sekvencijski dijagram komunikacije za slanje poruka 1.4. PostgreSQL baza podataka PostgreSQL je objektno-relacijska baza podataka (Object-Relational Database Management System, ORDBMS) otvorenog koda (open source) napisana u programskom jeziku C. U razvoju je od 1995. godine, i moguće ju je pokrenuti na većini operacijskih sustava. PostgreSQL je odabran radi svojih mogućnosti jednostavnog pohranjivanja i rada s geoprostornim objektima. Pošto je baza besplatna i jednostavno se podešava vrlo je popularna pri radu s geoinformacijskim sustavima. 1.4.1. Dodatak PostGIS Baza podataka PostgreSQL je proširiva s nizom dodataka koji omogućuju mnoge dodatne funkcije. Jedan od tih dodataka je i PostGIS koji omogućuje pohranjivanje i rad s geometrijskim i geoprostornim objektima. Također omogućuje i izvršavanje cijelog niza dodatnih lokacijski vezanih upita nad skupom podataka u bazi. Primjer jednog takvog upita nad bazom podataka u kojoj imamo tablice grad i superheroj, u kojima su 15

spremljene lokacije gradova s njihovim imenima, i lokacije superheroja s njihovim imenima bi bio: SELECT superheroj.ime FROM grad, superheroj WHERE ST_Contains(grad.lokacija, superheroj.lokacija) AND grad.ime = Gotham ; Kod 1.6 Primjer upita u bazi podataka PostgreSQL U ovom upitu želimo dobiti sva imena superheroja koji se trenutno nalaze na lokaciji koja se zove Gotham. Rezultat ovog upita je naravno Batman. U ovom primjeru je važno uočiti korištenje funkcije ST_Contains() koja vraća vrijednost tipa boolean. Funkcija prima dva parametra geometrijskoj kolekcij geoma i geomb, a vraća boolean vrijednost true ako i samo ako u geometrijskoj kolekciji geomb postoji barem jedna točka koja se nalazi u geometrijskoj kolekciji geoma. U suprotnom vraća boolean vrijednost false. Rad s ovim objektima se temelji na normama koje je definirala Međunarodna organizacija za standardizaciju (International Organization for Standardization ISO) i OGC (Open Geospatial Consortium). OCG je međunarodni dobrovoljni konzorcij osnovan 1994. Postoji preko 400 komercijalnih, vladinih, neprofitnih i istraživačkih organizacija diljem svijeta koje su pristupile ovom konzorciju s ciljem organizacije i standardizacije geoprostornih sadržaja i usluga. Dodatak PostGIS omogućuje rad s metodama koje definira OpenGIS [14]. Metode možemo podijeliti u pet osnovnih kategorija: 1. Upravljačke metode Omogućavaju upravljanje s bazom podataka koja koristi geoprostorne objekte, točnije za manipulaciju tablica u bazi. Tako postoje metode za dodavanje i brisanje stupca, za pohranu geoprostornih objekata i općenito za podešavanje tablica. 2. Relacijske metode Pomoću relacijskih metoda ispitujemo relacije između dva geoprostorna objekta. Popis najčešće korištenih relacijskih funkcije s kratkim opisom je dan u tablici 1.1 16

3. Metode za obradu objekta Ove metode definiraju operacije pomoću kojih možemo obrađivati geoprostorne objekte. Primjer nekih od operacija za obradu je dan u tablici 1.2 s kratkim opisom svake metode. 4. Pomoćne metode Pomoćne metode definiraju pomoćne operacije nad objektima. Tako postoje metode za pretvaranje geoprostornog objekta u tekstualni zapis (ST_AsText()), razne metode za dohvaćanje određenih točaka u raznim objektima kao što su linije i poligoni i slične metode. 5. Metode za konstrukciju objekata Metode za konstrukciju objekata omogućuju stvaranje objekata. Tako postoje metode za stvaranje objekta iz raznih formata tekstualnog zapisa (ST_GeomFromText(), ST_PointFromText(), ST_LinestringFromText(),... ) Tablica 1.1 Primjer relacijskih metoda u dodatku PostGIS Ime metode ST_Distance() ST_DWithin() ST_Within() ST_Equals() Kratki opis Vraća udaljenost između dva geoprostorna objekta u odabranoj mjernoj jedinici Vraća boolean vrijednost true ako se objekti nalaze unutar definirane udaljenosti jedan od drugoga. Vraća boolean vrijednost true ako se objekt A u potpunosti nalazi unutar objekta B Vraća boolean vrijednost true ako su objekti prostorno jednaki. Preporučuje se koristiti za usporedbu umjesto = ST_Intersects() Vraća boolean vrijednost true ako se objekti prostorno presijecaju ST_Touches() Vraća boolean vrijednost true ako se objekti prostorno dodiruju 17

Tablica 1.2 Primjer upravljačkih metoda u dodatku PostGIS Ime metode Kratki opis ST_Centroid() Vraća točku koja predstavlja centar objekta ST_Area() ST_Length() ST_Buffer() Vraća površinu objekta ako je on poligon ili multi-poligon objekt Vraća dužinu krivulje u odabranoj mjernoj jedinici Vraća objekt koji sadrži sve točke koje se nalaze na određenoj udaljenosti od predanog objekta. Dobiveni objekt predstavlja okolno područje. Pri radu s dodatkom PostGIS razlikujemo dvije vrste prostornih objekata. To su geometrijski i geoprostorni objekti. Geometrijski objekti definiraju objekte u Kartezijevom koordinatnom sustavu. Pogodni su za korištenje ako baza podataka obuhvaća manje geografsko područje nad kojim Kartezijev koordinatni sustav pruža dovoljno dobru aproksimaciju. Postoji više metoda za rad s geometrijskim objektima nego s geoprostornim objektma. Izvođenja metoda koje kao parametar primaju geoprostorne ili geometrijske objekte traje kraće pri radu s geometrijskim objketima, tj. metode su tada procesorski manje zahtjevne. Geoprostorni objekti definiraju objekte u sferoidnom koordinatnom sustava, što omogućava određivanje lokacije korisnika na temelju geografske širine i geografske dužine što je pogodno ako se u bazu podataka spremaju podatci očitani s raznih GPS [15] prijamnika. Generalno pružaju manje metoda nego geometrijski objekti i metode su procesorski zahtjevnije. Njihovo korištenje se preporučuje ako modeliramo bazu podataka za veliko geografsko područje i ako pohranjujemo podatke u obliku geografske širine i dužine. 18

Slika 1.5. Kartezijev i sferoidni koordinatni sustav, preuzeto s [3] Dodatak PostGIS omogućuje rad s nekoliko objekta od kojih su najvažniji točka (point), linija (linestring) i poligon (polygon). Svaki od ovih objekta može biti geometrijski ili geoprostorni. Objekt točka predstavlja jednu točku u prostoru. U Kartezijevom sustavu se određuje s dva parametra x i y koordinatom, dok se u sferoidnom koordinatnom sustavu određuje s geografskom širinom i dužinom. Slika 1.6. Primjer točke u dodatku PostGIS Objekt linija predstavlja niz točaka u prostoru koje povezane čine krivulju. Definira se nizom uređenih parova x i y koordinata za Kartezijev koordinantni sustav i nizom uređenih parova geografske širine i dužine za sferoidni koordinatni sustav. 19

Slika 1.7 Primjer linije u dodatku PostGIS Objekt poligon predstavlja zatvoreno područje u prostoru. Definicija mu je ista kao kod objekta linija osim činjenice da početna i zadnja točka moraju imati identične koordinate kako bi se naglasilo da se radi o zatvorenoj krivulji. Slika 1.8 Primjer poligona u dodatku PostGIS 1.4.2. Određivanje udaljenosti između geoprostornih objekata Korištenjem dodatka PostGIS za bazu podataka PostgreSQL moguće je jednostavno dohvaćanje svih unosa u tablici koji se nalaze proizvoljno daleko od nekog objekta u prostoru. Pretpostavimo da imamo tablicu korisnici u kojoj su pohranjene njihove lokacije (koje mogu biti točka, linija ili poligon) u prostoru i njihovi identifikator. U klasičnim bazama 20

podataka nemoguće je izgraditi upit kojim bi se dohvatili svi korisnici koji su udaljeni manje od 20 metara od nekog poligona u prostoru. U PostGIS-u bi taj upit izgledao: SELECT DISTINCT user_id FROM korisnici WHERE ST_DWITHIN(ST_GeographyFromText(POLYGON), korisnici.lokacija,20); Kod 1.7 Primjer upita koji uzima u obzir udaljenosti objekata U navedenom upitu koristimo funkciju ST_DWITHIN() kojoj predajemo dva geoprostorana objekta i broj koji pretstavlja okolno područje. U ovom slučaj okolno područje je 20 metara. Funkciji je moguće predati i još jedan parametar, zastavicu tipa boolean kojom se označava da li se izračun treba provoditi u sferoidnom (zastavica postavljena na true) ili u Kartezijevom (zastavica postavljena na false) koordinatnom sustavu. Pošto smo funkciji predali dva geoprostorna objekta, ova zastavica je automatski postavljena na true, ali ako želimo ubrzati rad ove funkcije možemo ju postaviti na false, čime gubimo na preciznosti izračuna udaljenosti. Funkcija ST_GeographyFromText() pretvara tekstovni zapis poligona u odgovarajući geoprostorni objekt. Ideja po kojoj se određuje udaljenost između dva poligona je sljedeća [4]. Pretpostavimo da imamo dva poligona kao na slici 1.9 između kojih želimo odrediti udaljenost. Slika 1.9 Dva poligona između kojih se računa udaljenost, [4] 21

Prvi korak je pronalaženje linije koja povezuje poligone. Pošto svaki poligon možemo opisati kvadratom, najjednostavnije je povezati središta tih kvadrata kao što se vidi na slici 1.10. Slika 1.10 Linija koja spaja središta opisnih kvadrata poligona, [4] Sljedeći korak je određivanje najbližih vrhova poligona. Ovaj problem se rješava povlačenjem okomice iz svakog vrha na spojnu liniju poligona. Slika 1.11 Određivanje dva najbliža vrha Za svaki okomiti pravac pamtimo gdje presijeca x os koordinatnog sustava. Određivanje najbližih pravaca se sada svodi na uspoređivanje presjecišta x osi. Tako dolazimo do pravca koji prolazi kroz točku P5 u prvom poligonu, i do pravca koji prolazi kroz točku 22

P12 u drugom poligonu. Sada računamo udaljenost između točaka P5 I P12. Pošto ne tražimo minimalnu udaljenost između dva vrha poligona, nego između dva poligona općenito, moramo testirati i stranice poligona. Da bi to napravili izmjerit ćemo udaljenosti između bridova i vrhova poligona. Tako mjerimo udaljenost između bridova vrha P5 (P4- P5 i P5-P6) i bridova vrha P12 (P11-P12 i P12-P13). Također mjerimo i udaljenosti između svih šest vrhova međusobno (P4, P5, P6, P11, P12, P13), i kombinacije s pripadajućim bridovima. Naravno ne mjerimo udaljenosti između vrhova istog poligona, nego samo kombinacije vrhova susjednih poligona koje promatramo. Kao rezultat odabiremo najmanju izmjerenu udaljenosti, koja je u ovom slučaju udaljenosti između vrha P6 i vrha P13. Slika 1.12 Minimalna udaljenostu u prvom koraku izračuna Sada znamo da je udaljenost koju tražimo između udaljenosti P6, P13 i udaljenosti između dva paralelna pravca. Sljedeći korak je ponavljanje cijelog postupka za sljedeći vrh koji je najbliži paralelnim pravcima, uz ograničenje da je bliže od najdalje izračunate udaljenosti iz prethodnog koraka. Tako dolazimo do vrha P8 u prvom poligonu. Pošto smo uspoređivali udaljenosti između susjednih vrhova i bridova, došli smo do minimalne udaljenosti između dva poligona, vrha P8 i stranice P12,P13 kako što je prikazano na slici 1.13. 23

Slika 1.13 Krajnja minimalna udaljenost poligona Računanje udaljenosti između drugih objekata se svodi na jednostavniji slučaj od opisanog, ovisno o kojim se objektima radi. Važno je napomenuti da s ovakvim pristupom možemo odrediti udaljenosti samo objekta koji se ne presijecaju. 24

2. Geoprostorni poslužitelj objavi-pretplati Geoprostorni poslužitelj objavi-pretplati se sastoji od dvije glavne komponente: Aplikacijski poslužitelj Poslužitelj baze podataka Aplikacijski poslužitelj prihvaća i obrađuje korisničke zahtjeve, dok poslužitelj baze podataka je zadužen za pohranu i obradu podataka. Drugim dijelovima objavi-pretplati sustava ova dva poslužitelja izgledaju poput jednoga, tj. druge komponente ne znaju za postojanje poslužitelja baze podataka. Slika 2.1 prikazuje UML slijedni dijagram koji opisuje slijed poruka koje razmjenjuju klijent, aplikacijski poslužitelj, baza podatak i GCM poslužitelj. Slika 2.1 UML sekvencijski dijagram komunikacije poslužitelja 25

2.1.1. Implementacija poslužitelja Razvijeni aplikacijski poslužitelj je napisan u programskom jeziku Java unutar NetBeans 8.0 razvojnog okruženja kao web aplikacija koja se izvodi na GlassFish poslužitelju verzije 4. Za pohranu podataka korišten je PostgreSQL 9.3.4 poslužitelj baze podataka s PostGIS 2.1.1 dodatkom. Aplikacijski poslužitelj razvijen je kao RESTful web usluga (Representational State Transfer, REST). REST usluga je model koji definira način na koji će se stvarati, čitati, osvježavati i brisati podatci na poslužitelju koristeći HTTP pozive. Poslužitelj komunicira s klijentima razmjenjujući JSON (JavaScript Object Notation) poruke. Iz tog razloga u projekt su dodane dvije biblioteke (libraries) json-simple-1.1.1.jar i org.json-20120521.jar preuzete sa [5], [6] koje omogućuju ovu funkcionalnost. JSON je otvoreni standard za formatiranje tekstualnih poruka po principu ključ-vrijednost. [7]. Za samu komunikaciju s GCM poslužiteljom zadužena je biblioteka gcm-server.jar, preuzeta sa [8]. 2.2. Zadaće aplikacijskog poslužitelja Razvijeni aplikacijski poslužitelja ima tri osnovne zadaće: Obrađivanje korisničkih zahtjeva Pohranjivanje podataka u bazu Slanje poruka GCM poslužitelju Slika 2.2 prikazuje UML dijagram razreda poslužitelja. Obrada korisničkih zahtjeva izvršava se u klasama PublishResource i SubscriptionResource. Pohranjivanje podataka u bazu izvršava se u razredu Database, dok je klasa GCMService zadužena za slanje poruka GCM poslužitelju. 26

Slika 2.3 UML dijagram klasa aplikacijskog poslužitelja 2.2.1. Obrađivanje korisničkih zahtjeva Za obrađivanje korisničkih zahtjeva definirana su dva REST web servisa koji su zaduženi za obradu pretplata i objava. 2.2.1.1 Obrada pretplata Kada se korisnik želi pretplatiti na novo područje poslati će poslužitelju zahtjev HTTP POST sa potrebnim parametrima, a ako želi otkazati pretplatu poslat će zahtjev HTTP DELETE. Samim time poslužitelj na adresi za obradu pretplata razlikuje ove dvije metode i ovisno o njima primjenjuje odgovarajuću logiku za dodavanje i brisanje pretplata iz baze podataka. Obrada pretplata se izvršava u klasi SubscriptionsResource koji predstavlja REST servis za obradu zahtjeva pristiglih na adresu /GeoAppServer/resources/subscriptions. Metoda postjson() prima zahtjeve HTTP POST. Tijelo zahtjeva treba sadržavati niz znakova koji predstavlja JSON objekt u kojem se nalaze parametri geom, koji predstavlja geografsku lokaciju za koju se korisnik želi pretplatiti i parametar push_id koji predstavlja push ID korisnika koji se pretplaćuje. Nakon što je pozvana metoda postjson(), u njoj se provodi parsiranje primljenog JSON objekta koji se nalazi u varijabli tipa string i dobiveni podatci se predaju bazi podataka na daljnju obradu. Primjer jednog takvog objekta bio bi: 27

{ "geom":"point ( 15.979952551424503 45.81918347570577 )", "push_id":"apa91bemyqv9w14nfuwefk8o4xeylztlrdeijwsecmdhlu1ethkn... } Kod 2.1 Primjer JSON objekta koji se razmjenjuje između klijena i poslužitelja Ako je poslužitelj uspješno zaprimio i pohranio pretplatu šalje odgovor u obliku objekta string u kojem je zapisan JSON objekta u kojemu se nalazi ključ status i vrijednost OK. {"status":"ok"} Ako se dogodila pogreška, poslužitelj odgovara s istom porukom ali s vrijednošću ERROR. Ako je klasa primila zahtjev HTTP DELETE on se prosljeđuje deletejson() metodi. Ova metoda očekuje dva parametra push_id i geom koji su predani u obliku standardnog HTTP upita (query), što znači da su navedeni u samoj adresi zahtjeva nakon znaka '?' odvojeni znakom '&' jedan od drugoga. Predani parametri su URL kodirani kako bi se mogli prenositi preko mreže. Primjer jednog takvog zahtjeva bi bio: http://192.168.1.114:8080/geoappserver/resources/subscription s?push_id=apa91bemyqv9w14nfuwefk8o4xeylztlrdeijwsecm...&geom= POINT+%28+15.979376211762427+45.80139098635894+%29 Kod 2.2 Primjer HTTP DELETE zahtjeva Metoda predaje primljene parametre bazi podataka koja provodi brisanje pretplate. Poslužitelj u odgovoru šalje vrijednost JSON objekta s parametrom status i vrijednostima OK ako je otkazivanje pretplate izvedeno uspješno ili vrijednosti ERROR ako je došlo do pogreške. 28

2.2.1.2 Obrada objava Kada objavljivač stvori novu objavu dojavljuje ju poslužitelju na adresu na kojoj poslužitelj očekuje nove objave. Pri primanju objave aplikacijski poslužitelj šalje bazi podataka upit za svim klijentima za koje se pristigla objava odnosi. Nakon dobivanja odgovor od baze podataka, popis klijenata i pristigla obavijest se prosljeđuju klasi koja će te podatke proslijediti GCM poslužitelju. Klasa PublishResource predstavlja REST servis koji je zadužen za obradu zahtjeva pristiglih na adresu /GeoAppServer/resources/publish. Na tu adresu objavljivači zahtjevom HTTP POST dojavljuju poslužitelju svoje objave. Klasa ima samo jednu metodu postjson()koja prima jedan parametar tipa string koji predstavlja JSON objekt u kojemu se nalaze tri para ključ-vrijednost. Vrijednost koja se nalazi pod ključem geom označava lokaciju za koju se odnosi objava a sam tekst objave se nalazi pod ključem message. Vrijednost pod ključem distance predstavlja dodatno područje oko objave (buffer). Dodatno područje tako definira prsten određene debljine oko područja objave. Pri dohvaćanju korisnika kojima treba isporučiti pristiglu objavu, dohvatit će se i korisnici čije se pretplate ne nalaze ununtar područja objave ali se nalaze u okolnom području. Primjer jedne takve objave bio bi: { "message":"poplava u Zagrebu", "geom":"polygon (( 15.990392044186592 45.78965405033109, 15.994726829230787 45.78870042820566, 15.994828417897224 45.790517883698634, 15.991292595863344 45.791412328714486, 15.990392044186592 45.78965405033109 ))" "distance":20, } Kod 2.3 Primjer JSON objekta objave Nakon što poslužitelj primi i parsira tijelo objave, dohvaća iz baze podataka sve korisnike koji su pretplaćeni na područje u objavi i prosljeđuje listu korisnika i samu objavu klasi GCMService koja je zadužena za komunikaciju s GCM poslužiteljem. GCMService.sendPost(message, location, users); 29

2.2.2. Pohranjivanje podataka u bazu Pošto aplikacijski poslužitelj iz više klasa mora komunicirati s bazom podataka, sva logika oko komunikacije izdvojena je u posebnu klasu Database. Ona pruža svim ostalim komponentama aplikacijskog poslužitelja metode za pohranu, brisanje i dohvaćanje podataka iz baze. Time je postignuto skrivanje baze podataka od drugih dijelova aplikacijskog poslužitelja. Klasa Database je izvedena po programskom obrascu singleton, što znači da se tijekom rada poslužitelja instancira samo jedan objekt ove klase. Sam razred ima tri javno dostupne metode pomoću kojih drugi objekti mogu komunicirati s bazom podataka. Kada neki objekt želi komunicirati s bazom podataka dohvaća instancu razreda pozivajući javnu statičku metodu getinstance() koja provjerava da li već postoji objekt ove klase. Ako ne postoji stvara ga i vraća referencu na stvoreni objekt, a ako već postoji samo se vraća referenca na njega. Klasa Database pri instanciranju stvara objekt razreda Connection koji se zna povezati na bazu podataka koristeći biblioteku postgresql-9.3-1101.jdbc41.jar preuzetu s [9]. try { connection = DriverManager.getConnection( "jdbc:postgresql://127.0.0.1:5432/geodb", "antun", ""); } catch (SQLException e) { System.out.println("Connection Failed! Check output console"); } Kod 2.4 Spajanje na poslužitelja baze podataka Za pohranjivanje novih pretplata u bazu koristi se metoda insertsubscriptions() koja prima dva parametra tipa string, korisnikov ID i reprezentaciju geoprostornog objekta. Ubacivanje se izvodi stvaranjem novog objekta PreparedStatement i pozivanjem metode execute() nad tim objektom. 30

PreparedStatement preparedstatement = connection.preparestatement("insert INTO subscription (user_id, geom) VALUES (?, ST_GeographyFromText(?)) "); preparedstatement.setstring(1, userid); preparedstatement.setstring(2, geoobject); preparedstatement.execute(); Kod 2.5 Primjer stvaranja INSERT upita na bazu podataka Pri stvaranju upita na bazu koristi se PostGIS metoda ST_GeographyFromText() koja pretvara reprezentaciju geoprostornog objekta iz stringa u sam geoprostorni objekt s kojim baza zna raditi. Metoda deletesubscriptions() se koristi za brisanje pretplata iz baze podataka. Isto ako i metoda insertsubscriptions() prima dva parametra, id korisnika i lokacijski objekt koji se želi obrisati. Rezultat izvođenja metode ovisi o uspješnosti operacije brisanja i isti je kao kod metode insertsubscriptions(). PreparedStatement preparedstatement = connection.preparestatement("delete FROM subscription WHERE user_id =? AND geom = ST_GeographyFromText(?);"); preparedstatement.setstring(1, userid); preparedstatement.setstring(2, geoobject); preparedstatement.execute(); Kod 2.6 Primjer stvaranja DELETE upita na bazu podataka Kada je potrebno dohvatiti određene korisnike iz baze, koristi se metoda selectusers() koja prima dva parametra, geoprostorni objekt i okolno područje. Metoda se koristi kada je potrebno dohvatiti sve korisnike za koje se odnosi pretplata na nekom geoprostornom području. Upravo to područje je predano metodi, zajedno s okolnim područjem oko svake pretplate. Ako nije predano okolno područje, ono se postavlja na 20 metara. Kada se ne bi koristilo okolno područje, geoprostorni objekti poput linija i točaka ne bi se mogli grupirati kao obuhvaćeno područje osima ako se objava ne bi nalazila na identičnim koordinatama kao i oni ili ako se područje obavijesti ne prostire preko njih. Za 31

grupiranje korisnika se koristi PostGIS metoda ST_DWITHIN(). Kao rezultat izvođenja selectusers() metoda vraća listu ID-eva korisnika koje treba obavijestiti. PreparedStatement preparedstatement = connection.preparestatement("select DISTINCT user_id FROM subscription WHERE " + "ST_DWITHIN (ST_GeographyFromText(?),subscription.geom,?);"); preparedstatement.setstring(1, geoobject);preparedstatement.setstring(2, distance); ResultSet resultset = preparedstatement.executequery(); Kod 2.7 Primjer stvaranja SELECT upita na bazu 2.2.3. Slanje poruka GCM poslužitelju Nakon što poslužitelj dobije obavijest od objavljivača i dohvati popis svih korisnika koje treba obavijestiti, prosljeđuje tu informaciju klasi GCMService koja zna komunicirati s GCM poslužiteljem. Ova klasa ima jednu javnu statičnu metodu sendpost() koja prima tekst obavijesti, string reprezentaciju geoprostornog objekta i listu id-eva korisnika kojima treba isporučiti obavijest. Poruka koja se isporučuje GCM poslužitelju nastaje stvaranjem objekta klase Message. U tom objektu se definiraju svi potrebni parametri potrebni za isporučivanje poruke korisnicima. Poruka se zatim prosljeđuje objektu klase Sender. Pri stvaranju objekta sender potrebno je predati API ključ generiran za korištenje usluge GCM. Postupak generiranja ključa je opisan u privitku. Za slanje poruke koristi se metoda send() razreda Sender kojoj predajemo objekt tipa Message, popis korisnika kojima šaljemo poruku i cijeli broj koji predstavlja broj pokušaja slanja. Metoda send() vraća objekt MulticastResult koji predstavlja odgovor poslužitelja GCM. 32

Sender sender = new Sender(SENDER_ID); Message message = new Message.Builder().collapseKey(collapseKey).timeToLive(30).delayWhileIdle(true).addData("message", textmessage).adddata("location", loacation).build(); MulticastResult result = sender.send(message, users, 1); Kod 2.8 Slanje poruke GCM poslužitelju 2.3. Poslužitelj baze podataka Kao poslužitelj baze podataka koristi se poslužitelj PostgreSQL. Na poslužitelju je stvorena baza podataka imena geodb u kojoj se nalazi jedan tablica imena subscription. Tablica se sastoji od tri stupca. U prvi stupac se pohranjuje korisnikov ID kao character tip veličine do 255 znakova. U drugom stupcu se pohranjuju geoprostorni objekti kao tipovi geography, dok se u trećem stupcu pohranjuje primarni ključ tablice tipa bigint. Slika 2.4 Tablica subscription u bazi podataka 33

Sam poslužitelj pokrenut je na vratima (port) 5432 i iz aplikacijskog poslužitelja mu se pristupa korištenjem postgresql-9.3-1101.jdbc41.jar biblioteke preuzete s [8] koja zna komunicirati s ovim poslužiteljem. 34

3. Klijentska aplikacija U razvijenom geoprostornom sustavu objavi-pretplati pretplatnik može stvarati svoje objave i prosljeđivati ih aplikacijskom poslužitelju koji će ih proslijediti drugim zainteresiranim korisnicima. U tu svrhu razvijena klijentska aplikacija uz stvaranje i otkazivanje pretplata za određeno područje i primanje obavijesti za ta područja, može i stvarati obavijesti za bilo koje područje. Klijentska aplikacija korisnicima omogućava tri glavne aktivnosti: 1. Stvaranje i otkazivanje pretplata 2. Stvaranje objava 3. Prikazivanje primljenih objava Nakon pokretanja aplikacije korisniku se prikazuje karta s usluge Google Maps na kojoj je prikazana njegova trenutna lokacija i njegove aktivne pretplate. Na slici 3.1 a) je vidljiva situacija kada korisnik nema definiranih pretplata, dok su na slici 3.1 b) vidljive tri pretplate. Slika 3.1 Početni zaslon aplikacije bez pretplata a) i s pretplatama b) 35

Ako pritisnemo na gumb u gornjem lijevom kutu, otvorit će se navigacijska ladica u kojoj se nalazi izbornik s tri osnovne kontrole: 1. Prikazivanje karte za stvaranje objava i pretplata 2. Izbornik za otkazivanje pretplata 3. Izbornik za pregledavanje pristiglih objava Slika 3.2 Navigacijska ladica 3.1. Stvaranje i otkazivanje pretplata Za stvaranje nove pretplate potrebno je u navigacijskoj ladici odabrati Map i na prikazanom zaslonu pri gornjem desnom rubu ekrana odabrati gumb ADD nakon čega se ponudi izbornik za dodavanje nove pretplate prikazan na slici 3.3 a). Prvi korak pri stvaranju pretplate je odabir prostornog objekta na koji se želimo pretplatiti. Može se pretplatiti na točku, liniju ili poligon. Kako bi se lakše snalazili u svojim pretplatama moguće je definiranje imena pretplate u polju za unos teksta (Subscription name). Pritiskom gumba Cancel otkazuje se dodavanje nove pretplate a pritiskom na gumb Add vraća se na prethodno vidljivu kartu. Pritiskom na kartu dodaju se točke koje će definirati pretplatu (slika 3.3 b). 36

Slika 3.3 a) Izbornik za stvaranje nove pretplate, b) Definiranje točaka pretplate Korisnik u svakom trenutku može odustati pritiskom gumba CANCEL koji se nalazi u gornjem desnom rubu ekrana. Pritiskom na kvačicu u gornjem lijevom rubu ekrana smatra se da je korisnik završio definiranje pretplate i ona se dojavljuje aplikacijskom poslužitelju. Za otkazivanje pretplata potrebno je odabrati Unsubscribe u navigacijskoj ladici nakon čega se prikazuje izbornik s popisom svih definiranih pretplata (slika 3.4 a). Za svaku pretplatu se prikazuje ime koje joj je korisnik dodjelio, tip pretplate i od koliko se točaka u prostoru ona sastoji. Pritiskom na pretplatu korisniku se nudi opcija otkazivanja, tj. brisanja te pretplate (slika 3.4 b). 37

Slika 3.4 a) Popis korisnikovih pretplata, b) Potvrda za brisanje određene pretplate 3.2. Stvaranje objava Za stvaranje nove objava potrebno je u navigacijskoj ladici odabrati Map i u gornjem desnom rubu ekrana pritisnuti gumb PUBLISH. Korisniku se prikazuje izbornik za stvaranje nove objave koji je sličan stvaranju nove pretplate. Potrebno je odabrati tip geoprostornog objekta za koji se stvara objava, unijeti tekst objave i definirati okolno područje oko obavijesti (slika 3.5 a). Pritiskom na gumb ADD vraća se na prethodnu kartu na kojoj je potrebno odrediti područje objave (slika 3.5 b). Kada je korisnik odredio lokaciju objave, pritiskom na kvačicu u gornjem desnom rubu ekrana šaljemo ju poslužitelju. 38

Slika 3.5 a) Izbornik za stvaranje nove objave, b) Definiranje lokacije objave 3.3. Prikazivanje primljenih objava Odabirom stavke Notification u navigacijskoj ladici, korisniku se prikazuje popis objava koje je primio (slika 3.6 a). Svaka objava sadrži vrijeme kada ju je korisnik primio, i samu poruku. Pritiskom na određenu objavu prikazuje se lokacija objave (slika 3.6 b). 39

Slika 3.6 a) Popis pristiglih objava, b) Pregledavanje lokacije definirane u objavi 3.4. Implementacija klijntske aplikacije Klijentska aplikacija je razvijena kako novi projekt unutra razvojnog okruženja Android Studio. Ovo razvojno okruženje koristi dodatak Gradle [10] za izgradnju jednom napisane aplikacije, i ako želimo u aplikaciju uključiti dodatne biblioteke potrebno ih je navesti unutar datoteke build.gradle. Klijentska aplikacija koristi usluge GCM i Google Map, koje se nalaze unutar dodatka Google Play Service, koji se nalazi unutar Android SDK pa je potrebno navesti taj dodatak unutar build.gradle datoteke. dependencies { compile filetree(dir: 'libs', include: ['*.jar']) compile 'com.google.android.gms:play-services:4.3.23' compile 'com.android.support:appcompat-v7:19.+' compile 'com.android.support:support-v4:19.+' } Kod 3.1 Navođenje biblioteka u build.gradle 40

Implementacija ranije opisanih funkcionalnosti aplikacije je podijeljena u pet logičkih cjelina. Aktivnosti Aplikacija sadrži tri aktivnosti. Početna aktivnost je StartActivity u kojoj se od GCM poslužitelja zahtjeva push ID i vrši se dojavljivanje ID-a aplikacijskom poslužitelju. Glavna aktivnost u aplikaciji je DrawerActivity. Ova aktivnost u sebi sadrži logiku za prikazivanje navigacijske ladice, kao i logiku za izmjenu fragmenata. MapPopUp aktivnost se koristi pri prikazivanju Google Map karte kada korisnik pregledava pristigle objave. Specifičnost ove aktivnosti je da je definirana kao dialog aktivnost, što označava da se neće prikazati preko cijelog zaslona uređaja, nego će se pojaviti kao objekt iznad postojeće aktivnosti. Fragmenti Logika ranije opisanih kontrola aplikacije je izdvojena u zasebne fragmente. Tako se logika prikazivanja izbornika u navigacijskoj ladici nalazi u fragmentu NavigationDrawerFragment. Logika za prikazivanje karte na kojoj se vide korisnikove pretplate i njegova lokacija se nalazi u fragmentu GeoMapFragment koji nasljeđuje MapFragment definiran u dodatku Google Play Service. GeoMapFragment se prikazuje kada je u navigacijskoj ladici odabran Map izbornik. Za prikazivanje dodatnog izbornika na pritisak tipki PUBLISH i ADD koristi se fragment GeoDialogFragmetn. NotificationFragment se koristi za prikazivanje pristiglih obavijesti, a fragment UnsubscribeFragment za prikazivanje trenutnih pretplata i otkazivanje istih. NotificationFragment i UnsubscribeFragment fragmenta nasljeđuju ListFragment fragment koji omogućava prikazivanje liste objekata. Za prikazivanje listi koriste se klase koje nasljeđuju ArrayAdapter klasu. Ova klasa zna prikazivati listu objekata na zaslonu u formatu koji se definira u zasebnoj xml datoteci. Za prikazivanje liste obavijesti koristi se klasa NotificationAdapter koja prikazuje listu GeoObject objekata. Opis izgleda jednog reda u listi dan je u datoteci notification_row.xml. Za prikazivanje liste pretplata koristi se klasa SubscribtionAdapter koja također prikazuje listu objekata tipa GeoObject, a definicija jednog reda dana je u datoteci subscribtion_row.xml. Baza podataka 41

Podaci u aplikaciji se pohranjuju u bazu podataka SQLite čiji se opis nalazi u datoteci SqliteHelper. Baza podataka se sastoji od dvije tablice u koje se pohranjuju korisnikove pretplate i primljene obavijesti. Upiti na bazu podataka su definirani u klasi GeoDataSource koja nudi metode za rad s bazom podataka drugim komponentama u sustavu. Model Kako bi se pojednostavio rad s geoprostornim objektima u aplikaciji definirana je enumeracija GeomType koja definira postojanje tri vrste objekta (točka, linija i poligon). Svaki od ovih objekata sadrži informacije kao što su ime, id, datum kada je stvoren i obavezna lista točaka od koji se sastoji objekt. Svi ti parametri se nalaze u klasi GeoObject čiji objekti predstavljaju geoprostorne objekte, tako da kada se u aplikaciji radi s pretplatama, radi se zapravo s objektima tipa GeoObject. Za opis obavjesti koristi se klasa LocationMessage koja sadrži tekst pristigle objave i objekt GeoObject razreda koji predstavlja područje definirano u objavi. Općenito Klasa GcmBroadcastReceiver predstavlja primatelja objavljenih namjera koji prima objave pristigle od poslužitelja GCM i prosljeđuje ih usluzi GcmIntentService koja ih obrađuje. Ova usluga parsira pristiglu objavu i stvara statusnu obavijest. Za komunikaciju s aplikacijskim poslužiteljom zadužena je klasa NetworkCommunicator koja definira statične metode za slanje objava i pretplata. Ova klasa koristi volley.jar biblioteku preuzetu s [11] za ostvarivanje komunikacije. U klasi Constants su zapisane općenite konstante i informacije potrebne za rad aplikacije. 42

4. Analiza rada sustava Usko grlo sustava je aplikacijski poslužitelj i poslužitelj baze podataka pa je stoga neophodno znati njegove mogućnosti i ograničenja prije nego se krene optimizirati ovako razvijeni sustav. Pri analizi rada ova dva poslužitelja promatrano je kako poslužitelji pohranjuju korisničke pretplate i koliko brzo mogu obrađivati korisničke objave. 4.1. Analiza pohranjivanja pretplata Za mjerenje brzine pohranjivanja pretplata razvijena je aplikacija koja generira korisničke pretplate i dojavljuje ih poslužitelju. Implementacija aplikacije opisana je u privitku. Aplikacija za testiranje stvara deset dretvi koje simuliraju po jednog korisnika. Svaka dretva šalje na poslužitelja 1000 slučajno generiranih točaka na području radijusa 68 km. Ukupno srednje vrijeme obrade 10 000 korisničkih zahtjeva tako iznosi 28.3018 sekundi. Na slici 4.1 je prikazan graf s vremenima izvršavanja svake dretve za tri odvojena pokretanja aplikacije, tj. za tri odvojena mjerenja. Slika 4.1 Graf s vremenima izvršavanja svake dretve za testiranje 43