konferenca sodobne informacijske tehnologije in storitve 23 9 19 18 15 11 10 8 Urednika: 7 Marjan Heričko, Katja Kous 5 Zbornik 2 1 prispevkov OTS 2019 Sodobne informacijske tehnologije in storitve Zbornik štiriindvajsete konference, Maribor, 18. in 19. junij 2019 Urednika Marjan Heričko Katja Kous Junij 2019 Naslov OTS 2019 Sodobne informacijske tehnologije in storitve Podnaslov Zbornik štiriindvajsete konference, Maribor, 18. in 19. junij 2019 Title OTS 2019 Advanced Information Technology and Services Subtitle Conference proceedings of the Twenty-fourth Conference, Maribor, June 18th & 19th, 2019 Urednika red. prof. dr. Marjan Heričko Editors (Univerza v Mariboru, Fakulteta za elektrotehniko, računalništvo in informatiko) asist. dr. Katja Kous (Univerza v Mariboru, Fakulteta za elektrotehniko, računalništvo in informatiko) Tehnična urednika asist. Saša Kuhar Technical editors (Univerza v Mariboru, Fakulteta za elektrotehniko, računalništvo in informatiko) Jan Perša, mag. inž. prom. (Univerzitetna založba Univerze v Mariboru) Oblikovanje ovitka asist. Saša Kuhar Cover designer (Univerza v Mariboru, Fakulteta za elektrotehniko, računalništvo in informatiko) Grafika na ovitku Cover graphics Urednika Grafične priloge Graphics material Avtorji prispevkov Konferenca OTS 2019 Sodobne informacijske tehnologije in storitve Conference Kraj in datum Location and date Maribor, 18. in 19. junij 2019 Programski odbor prof. dr. Marjan Heričko (predsednik konference, vodja), prof. dr. Tatjana Welzer Družovec, Program committee dr. Tomaž Domajnko, dr. Boštjan Grašič, dr. Boštjan Kežmah, dr. Dean Korošec, dr. Luka Pavlič, dr. Boštjan Šumak, dr. Muhamed Turkanović, mag. Bojan Štok, mag. Ivan Lah in Milan Gabor. Organizacijski odbor dr. Katja Kous (vodja), Saša Kuhar, Boris Lahovnik, dr. Tina Beranič, dr. Maja Pušnik, Miha Organizing committee Strehar, Lucija Brezočnik, Mitja Gradišnik, Jernej Huber, dr. Gregor Jošt, dr. Sašo Karakatič, Blaž Podgorelec, Alen Rajšp, Patrik Rek in Viktor Taneski. Založnik / Published by Izdajatelj / Co‐published by Univerzitetna založba Univerze v Mariboru Univerza v Mariboru, Fakulteta za elektrotehniko, računalništvo in informatiko Slomškov trg 15, 2000 Maribor, Slovenija Koroška cesta 46, 2000 Maribor, Slovenija http://press.um.si, zalozba@um.si https://feri.um.si, feri@um.si Izdaja Edition Prva izdaja Vrsta publikacije Publication type E-knjiga Dostopno na Izid Availabe at http://press.um.si/index.php/ump/catalog/book/420 Published Maribor, junij 2019 CIP - Kataložni zapis o publikaciji Univerzitetna knjižnica Maribor © University of Maribor, University Press 004.946.5:004.7(082)(0.034.2) All rights reserved. No part of this book may be reprinted or reproduced or utilized in any KONFERENCA Sodobne informacijske tehnologije in storitve (24 ; 2019 ; Maribor) form or by any electronic, mechanical, or other Sodobne informacijske tehnologije in storitve [Elektronski vir] : OTS 2019 : means, now known or hereafter invented, zbornik štiriindvajsete konference, Maribor, 18. in 19. junij 2019 / urednika Marjan Heričko, Katja Kous. - 1. izd. - Maribor : Univerzitetna založba Univerze, 2019 including photocopying and recording, or in any information storage or retrieval system, Način dostopa (URL): http://press.um.si/index.php/ump/catalog/book/420 without permission in writing from the ISBN 978-961-286-282-4 (pdf) publisher. doi: 10.18690/978-961-286-282-4 1. Gl. stv. nasl. 2. Heričko, Marjan COBISS.SI-ID 96825857 ISBN 978-961-286-282-4 (PDF) 978-961-286-283-1 (Broš.) DOI https://doi.org/10.18690/978-961-286-282-4 Cena Price Brezplačni izvod Odgovorna oseba založnika For publisher red. prof. dr. Zdravko Kačič, rektor Univerze v Mariboru http://www.ots.si Prispevki predstavljajo stališča avtorjev, ki niso nujno usklajena s stališči organizatorja, programskega odbora in urednikov zbornika, zato ne sprejemajo nobene formalne odgovornosti zaradi morebitnih avtorjevih napak, netočnosti in neustrezne rabe virov. Spoštovane in spoštovani, informatika in informacijske tehnologije nedvomno omogočajo prebojne inovacije na vseh področjih poslovanja organizacij in našega vsakdanjega življenja. Vseprisotne rešitve in storitve prispevajo k digitalizaciji, poslovni odličnosti in višji kakovosti sodelovanja ter bivanja, a le v primeru, ko je umetna inteligenca nadgrajena in obogatena z razumom človeka. Zato je nujno, da se zavedamo pasti in izzivov razvoja tovrstnih rešitev ter jih hkrati znamo ustrezno ovrednotiti glede na namen uporabe in domeno apliciranja. Konkretne izkušnje dokazujejo, da se ob primernem načrtovanju in razvoju tehnologija veriženja blokov lahko učinkovito in smiselno uporabi tudi v zahtevnih poslovnih procesih. Zasnova in razvoj novih produktov že desetletja temelji na agilnih vrednotah, porazdeljenih interdisciplinarnih skupinah ter avtomatiziranih orodjih in virtualnih okoljih. Vse bolj porazdeljene in decentralizirane pa so tudi infrastrukture in aplikacije, ki so sposobne razpoznati enotno identiteto uporabnikov. Za vzpostavitev zaupanja morajo tehnološkim rešitvam slediti tudi ustrezni organizacijski pristopi in novi regulativni okviri ter hkratna nenehna skrb za ozaveščanje uporabnikov. V zborniku prispevkov so tudi letos predstavljene inovativne informacijske rešitve in storitve ter skozi konkretne projekte pridobljene izkušnje s/z:  vpeljavo tehnologij strojnega učenja in obogatene inteligence,  uporabo tehnologij in platform veriženja blokov,  razvojem šibko sklopljenih mikrostoritev,  popolno virtualizacijo in izkoriščanjem porazdeljenih infrastruktur,  zagotavljanjem kibernetske varnosti, zaupnosti in zasebnosti,  skaliranjem agilnih metod v porazdeljenih projektnih skupinah,  vpeljavo agilnih pristopov v sklopu avtomatiziranih in neprekinjenih procesov razvoja, testiranja, integracije in dostave,  posodobitvijo in nadgradnjo obstoječih informacijskih sistemov,  razvojem uporabniško prijaznih spletnih in mobilnih rešitev in  uvajanjem sodobnih programskih jezikov in razvojnih okolij. Prispevki v zborniku 24. konference OTS 2019 Sodobne informacijske tehnologije in storitve nedvomno omogočajo odličen vpogled v najaktualnejše tehnološke in organizacijske trende prav na vseh ključnih področjih računalništva in informatike. In kar je najpomembneje - predstavljene praktične izkušnje omogočajo kritično ovrednotenje uporabnosti posameznih pristopov, tehnologij in orodij. dr. Katja Kous prof. dr. Marjan Heričko vodja organizacijskega odbora OTS 2019 predsednik 24. konference OTS 2019 KAZALO Dobre prakse AI na področju zdravstva oziroma zakaj googlanje zdravstvenih težav ni najboljša ideja Vid Visočnik, Luka Gratej ____________________________________________________________________________ 1 Pasti pri implementaciji rešitev umetne inteligence Vili Podgorelec, Sašo Karakatič ______________________________________________________________________ 6 Korak k samodejni integraciji in testiranje napovednih modelov strojnega učenja Grega Vrbančič, Vili Podgorelec ___________________________________________________________________ 17 D3ledger: The Decentralized Digital Depository platform for asset management based on Hyperledger Iroha Nikolay Yushkevich, Andrei Lebedev, Rok Šketa, Makoto Takemiya ___________________________ 29 Uporaba platforme IOTA za zbiranje IOT podatkov Vid Keršič, Muhamed Turkanović _________________________________________________________________ 37 Razvoj decentraliziranih aplikacij: razvoj igre na srečo z generatorjem psevdo‐ naključnih števil Jure Trilar, Andrej Kos, Emilija Stojmenova Duh _________________________________________________ 49 Orkestracija gruč aplikacij z uporabo Docker Swarm na robnem oblaku Urban Zaletel, Marko Derganc, Rok Petrič ________________________________________________________ 60 Vzpostavitev konzorcijskega omrežja Ethereum Blaž Podgorelec, Patrik Rek, Miha Strehar, Muhamed Turkanović _____________________________ 69 Možnosti in izzivi uporabe protokola IPFS Aida Kamišalić, Muhamed Turkanović ____________________________________________________________ 80 Platforma GemaLogic Flexibility za združevanje DEA nameščenih v RTP Tomaž Buh, Ervin Planinc, Primož Bogataj, Simon Mihevc, Sergej Anželj, Miroslav Beranič, Goran Čapelnik _____________________________________________________________________________________ 89 »Politika« kibernetske varnosti Boštjan Kežmah ___________________________________________________________________________________ 104 ZKP (Zero‐Knowledge Proof) pod drobnogledom Blaž Podgorelec, Muhamed Turkanović _________________________________________________________ 109 Varna uporaba informacijsko‐komunikacijske tehnologije na poti in v tujem okolju Franci Mulec, Franc Močilar, Samo Maček _______________________________________________________ 119 Izkušnje z vpeljavo agilnega ogrodja Nexus pri razvoju programske opreme z več dislociranimi timi Robert T. Leskovar, Janez Lukan _________________________________________________________________ 124 Praktične izkušnje pri avtomatizaciji razvoja mobilnih aplikacij Damijan Račel, Žan Skamljič ______________________________________________________________________ 133 Implementacija programskih rešitev s pomočjo inteligentnih asistentov Mitja Gradišnik, Tina Beranič, Sašo Karakatič ___________________________________________________ 138 On‐Demand Data Migration and Go‐Live Strategies for Transitioning to a New System Tomaž Korelič, Mitja Bombač ____________________________________________________________________ 149 Posodobitev rešitve za mobilni marketing z modularno platformo Liferay in tehnologijo OSGi Dimitar Ivanovski, Miroslav Beranič _____________________________________________________________ 156 Razvoj univerzalnega podatkovnega nivoja – gonilo digitalizacije generičnih farmacevtskih podjetij Aleš Temeljotov, Saša Sokolič, Dejan Dovžan, Marjan Kaligaro ________________________________ 165 Orodja za podporo celovitemu razvoju decentraliziranih aplikacij Patrik Rek, Muhamed Turkanović ________________________________________________________________ 173 Razvoj aplikacije za oživljanje kulturne dediščine: zasnova interaktivnega prototipa Klemen Babuder, Vid Stropnik, Emilija Stojmenova Duh ______________________________________ 181 Ko sočasnost in funkcija presežeta objektnost Bojan Štok, Teodor Veingerl ______________________________________________________________________ 193 Praktični primeri elegantnih rešitev za orkestracijo asinhronih operacij v programskem jeziku Go Marko Gašparič ____________________________________________________________________________________ 201 Prihodnost Jave v luči zadnjih velikih sprememb Andrej Krajnc, Ciril Petr, Mitja Skuhala, Grega Ramšak ________________________________________ 209 Razvoj spletnih aplikacij v ogrodju Yesod Dušan Fister, Iztok Fister Jr. ______________________________________________________________________ 219 Kako razvijati v VUE/NUXT, če si navajen/a objektnih jezikov kot so C++, C# ali Java? Matjaž Prtenjak ____________________________________________________________________________________ 229 Vizualizacija podatkov v knjižnici React, praktične izkušnje Alen Rajšp, Gregor Jošt, Viktor Taneski, Saša Kuhar, Luka Pavlič ______________________________ 239 An Inside Look into Flutter Development Blagoj Soklevski, Andrej Kline ____________________________________________________________________ 249 MyPark – Mobilna aplikacija za preverjanje parkirnih mest Mark Berdnik, Gregor Gril, Matic Strajnšak _____________________________________________________ 255 OTS 2019 SODOBNE INFORMACIJSKE TEHNOLOGIJE IN STORITVE M. Heričko in K. Kous (ur.) DOBRE PRAKSE AI NA PODROČJU ZDRAVSTVA OZIROMA ZAKAJ GOOGLANJE ZDRAVSTVENIH TEŽAV NI NAJBOLJŠA IDEJA VID VISOČNIK, LUKA GRATEJ1 Povzetek: Problematiko dostopa do kakovostnih zdravstvenih informacij in storitev lahko zahvaljujoč tehnološkemu napredku v zadnjem desetletju rešujemo tudi s pomočjo pametnih asistentov (ang. chatbots), ki jih poganja obogatena inteligenca (ang. augmented intelligence). Primer digitalnega osebnega zdravstvenega asistenta, razvitega v podjetju Your.MD, prikazuje koncept prenosa razmišljanja in znanja zdravnikov v računalniku razumljivo obliko s poudarkom na treh ključnih nalogah: razumevanju uporabnikov s pomočjo strojnega procesiranja naravnega jezika (ang. natural language processing), algoritmih za nudenje zdravstvenih informacij in podajanju nadaljnjih korakov oz. rešitev v okviru mreže zunanjih ponudnikov zdravstvenih storitev pod imenom OneStop Health™. Ključne besede: Your.MD, pametni asistent, obogatena inteligenca, procesiranje naravnega jezika, digitalizacija zdravstvenih storitev NASLOVA AVTORJEV: Vid Visočnik, Računalniške storitve, Vid Visočnik s.p., Maribor, Slovenija. e-pošta: vid.visocnik@gmail.com. Luka Gratej, Luka Gratej Consulting, s.p., Radlje ob Dravi, Slovenija. e-pošta: luka.gratej@gmail.com. https://doi.org/10.18690/978-961-286-282-4.1 ISBN 978-961-286-282-4 Dostopno na: http://press.um.si 2 OTS 2019 SODOBNE INFORMACIJSKE TEHNOLOGIJE IN STORITVE V. Visočnik in L. Gratej: Dobre prakse AI na področju zdravstva oziroma zakaj googlanje zdravstvenih težav ni najboljša ideja UVOD Kako edinstvena je celota naravnih procesov, ki sestavlja in poganja naše telo, se ponavadi zavemo šele takrat, ko zbolimo. Zagotavljanje zdravja in dobrega počutja je neposredno povezano s kakovostjo našega življenja, zato v primeru bolezni in zdravstvenih težav stremimo k čimprejšnji ozdravitvi s pomočjo zaupanja vrednih rešitev: informacij, podatkov in kredibilnih nasvetov o nadaljnjih korakih na poti do ozdravitve. Težava nastane, ko edini vir zaupanja vrednih informacij predstavlja zdravstveno osebje, ki ga v današnjem času kronično primanjkuje ne samo pri nas, temveč tudi na svetovni ravni. Tukaj nastaja priložnost, da nastajajočo vrzel zapolni visoko napredna tehnologija na podlagi obogatene inteligence (ang. Augmented Intelligence), ki lahko razbremeni del zdravstvenih posvetovanj, čemur v podjetju Your.MD pravijo predzdravstvena nega oziroma "pre-primary care". Predzdravstvena nega zajema posvetovanja za simptome, ki jih lahko zdravimo sami doma, s tem pa znatno razbremenimo že tako preobremenjeno zdravstveno osebje. Digitaliziranje zdravstvenih posvetovanj s področja predzdravstvene nege zahteva kombinacijo večih pristopov in novih paradigem, kjer si v izdatni meri pomagamo z zmogljivo strojno opremo in naprednimi algoritmi, ki so plod tesnega sodelovanja podatkovnih znanstvenikov in ekipe zdravnikov. Okviri delovanja sistema so jasno določeni: nadgradnje in izboljšave potekajo v nadzorovanih in kontroliranih pogojih pod strokovnim nadzorom, zato uporabljamo termin obogatena oz. augmentirana inteligenca. Za nadaljnje razumevanje problema poglejmo tipične vzorce in odzive ob pojavu bolezenskih stanj. RAZUMEVANJE ČLOVEKOVEGA ODZIVA Raziskave poročajo, da ljudje ob poslabšanju zdravstvenega stanja zapademo v različne vzorce samorazlage in ignorance [1]. Premnogokrat lahko preberemo, da se bolezenskemu stanju lahko izognemo že s pravočasnim obiskom zdravnika. Ob podrobni analizi vzorcev obnašanja, lahko korake odločanja razvrstimo v sledeče zaporedje: 1. Pojav bolezenskega stanja, ki ga ignoriramo v upanju, da se bo stanje izboljšalo samo od sebe 2. Spoznanje, da se stanje ne izboljšuje oz. celo slabša, zato se obrnemo po nasvet k partnerju ali družinskim članom 3. Iskanje informacij po svetovnem spletu 4. Obisk družinskega zdravnika ali specialista. Preden preidemo iz prve do zadnje točke, lahko po nepotrebnem preteče precej dragocenega časa. Po odločitvi, da bomo o našem bolezenskem stanju ukrepali in pričnemo z raziskovanjem informacij na svetovnem spletu, se naenkrat znajdemo v poplavi vseh možnih informacij, podatkov, stanj, slik in nasvetov ter občasno grozljivih izkušenj uporabnikov, opisanih v spletnih skupnostih. Pri tem naletimo na nove težave: kako najti informacije, ki so značilne in relevantne za naš primer, ter ali so podane informacije zaupanja vredne. Ne glede na informacije, ki nam jih ponuja svetovni splet, lahko obiščemo družinskega zdravnika oz. specialista, če nam to dopuščajo okoliščine. Namreč, Svetovna zdravstvena organizacija (WHO) in Združeni narodi (UN) v poročilu [2] navajata, da si trenutno polovica svetovnega prebivalstva ne more privoščiti osnovnih zdravstvenih storitev, do leta 2030 pa naj bi po podatkih World Bank Group v svetu imeli primanjkljaj 20 milijonov usposobljenih zdravstvenih delavcev. [3] Primanjkljaj usposobljenih zdravstvenih delavcev lahko občutimo že v zahodnih oz. razvitih državah, v posameznih državah v razvoju pa je problem pomanjkanja usposobljenih zdravstvenih delavcev in z zdravstvom povezanih storitev že presegel kritično raven. Dostop do zdravstvenih posvetovanj je del temeljne človekove pravice do zdravja, zato so v podjetju Your.MD leta 2012 pričeli z razvojem osebnega zdravstvenega pogovornega asistenta (ang. Personal Health Assistant) s podporo obogatene inteligence in ga leta 2014 predstavili javnosti. Do danes je bilo zabeleženih več kot dva milijona prenosov aplikacij z mobilnih platform in pametnih naprav. OTS 2019 SODOBNE INFORMACIJSKE TEHNOLOGIJE IN STORITVE 3 V. Visočnik in L. Gratej: Dobre prakse AI na področju zdravstva oziroma zakaj googlanje zdravstvenih težav ni najboljša ideja DELOVANJE HIBRIDNEGA MODELA OSEBNEGA ZDRAVSTVENEGA ASISTENTA Delovanje hibridnega modela osebnega zdravstvenega asistenta podjetja Your.MD lahko v grobem razdelimo na tri ključne komponente: 1. Razumevanje uporabnika 2. Zmanjševanje nabora možnih izidov 3. Podajanje nadaljnjih korakov 3.1 Razumevanje uporabnika Medtem ko je razumevanje uporabnika in njegovega besedilnega vnosa razmeroma enostavna naloga za človeške možgane, še vedno predstavlja velik izziv za računalnike in programsko opremo. Ključna je izbira ustreznega pristopa, torej kako način razmišljanja in znanje zdravnikov prenesti v računalniku razumljivo obliko ter ga obenem nadgraditi s pomočjo algoritmov in upoštevanjem vhodnih parametrov za iskanje optimalne rešitve. Proces strojne obdelave naravnega jezika (NLP - Natural Language Processing) opravlja več medsebojno povezanih komponent, ki iz uporabnikovega besednega vnosa najprej izluščijo namen oz. ga umestijo v eno izmed sledečih kategorij:  Zahteva po posvetovanju (consultation)  Zahteva po dodatnih informacijah (article search)  Zahteva po besednem vprašalniku, samoocenjevalnem testu ali preverjanju znanja v obliki kviza (self assessment, test, quiz)  Zahteva po specifičnih rešitvah v okviru mreže zunanjih ponudnikov storitev (OneStop Health) Tako se npr. uporabnikova poizvedba "glavobol" oz. "I have a headache" obravnava kot zahteva po posvetovanju in sproži nize podvprašanj glede dodatnih simptomov, tako kot bi potekalo posvetovanje pri osebnem zdravniku. Po drugi strani se besedni vnosi tipa "informacije o glavobolu" oz. "info about headache" in "tell me about headache" obravnavajo kot uporabnikova zahteva po dodatnih informacijah, kjer bo sistem vrnil enega ali več ustreznih zdravstvenih člankov. Procesi odločanja potekajo tako po predefiniranih pravilih (ang. rule-based system) kot s pomočjo strojnega učenja (ang. machine learning) in modelov za klasifikacijo besedila. Hibridni model chatbota pri umeščanju v kategorije in nadaljnjih korakih pri postopku posvetovanja poleg zgoraj navedenega upošteva še dejavnike kot so:  Neuporaba knjižnega jezika oz. uporaba pogovornega jezika, kratic in okrajšav  Slovnične in pravopisne napake  Uporaba tujega jezika oz. prevajanje uporabniških vnosov v angleščino (trenutno na voljo v verziji za razvijalce) V postopku razumevanja oz. prenosa informacij uporabljajo UMLS - Unified Medical Language System, kjer iz uporabnikovega prosto vnešenega besedila izluščimo CUI - Concept Unique Identifier. Tako npr. vnos " Pollakisuria" neposredno sovpada s CUI C0042023, enako velja za sopomenko "frequent urination" . Ker je od končnih uporabnikov nerealno pričakovati, da bodo uporabljali medicinske izraze, se strojno procesiranje jezika v resnici začne pri vnosih kot so "urinating frequently" , "need to urinate frequently" , "need to frequently urinate" ipd. Zaplete se v primerih, ko uporabnik izraza "urination" in "frequent" nadomesti s sopomenkami ali slengom oz. v primeru tipkarskih napak:  urinating often / urinating all the time / need to pee frequently  need to urinate a lot / have to pee frequently / going to the toilet too often  I need to drain the lizard 10 times a day / I take a whiz all the time V primerih uporabe sopomenk za pogostost mora sistem upoštevati še dodatne dejavnike in izračunati, kdaj gre za simptom prepogostega uriniranja in kdaj ne. Uporabnikov vnos z vključenimi pravopisnimi napakami "I nid to take a leek every hour" bo v tem primeru pravilno sovpadal s CUI C0042023, medtem ko zmanjšana 4 OTS 2019 SODOBNE INFORMACIJSKE TEHNOLOGIJE IN STORITVE V. Visočnik in L. Gratej: Dobre prakse AI na področju zdravstva oziroma zakaj googlanje zdravstvenih težav ni najboljša ideja pogostost npr. "I need to take a leak every 2 hours" ali več ne sproži simptoma za pogosto uriniranje. Kot da primer ne bi bil dovolj zapleten, veljajo drugačna pravila, kadar je pogosto uriniranje omenjeno v kombinaciji s spanjem oz. v času noči, saj gre takrat za drug dejavnik pogostosti in drug simptom (pogosto uriniranje v nočnem času oz. angl. Nocturia, CUI C0028734). 3.2 Zmanjševanje nabora možnih izidov Kadar je uporabnikov namen opredeljen kot posvetovanje oz. zahteva po informacijah, je potrebno množico možnih rezultatov zmanjšati oz. reducirati na nekaj izbranih rezultatov. V primeru posvetovanja med drugim uporabljamo Bayesovo statistiko (ang. Bayesian logic oz. Bayesian probability), kjer na podlagi medicinske oz. zdravstvene literature in podatkov določimo verjetnost posameznemu simptomu kot indikator za določeno zdravstveno stanje. V postopku odločanja sistem zastavlja podvprašanja na način, da vsako naslednje vprašanje s podanimi dodatnimi simptomi v vsakem koraku kar najbolj zmanjšajo nabor možnih rezultatov. V postopku zmanjševanja oz. redukcije algoritem upošteva sledeče dejavnike:  Razumevanje frekvence določenega pojava glede na izbrane vhodne podatke  Upoštevanje uporabnikovega okolja: razumevanje pogostosti pojavov glede na sezonskost oz. letni čas, uporabnikovo regijo in pogostost iskanj v določenem obdobju oz. lokaciji  Upoštevanje uporabnikovih dejavnikov (ang. influencing factors), npr. kajenje, prekomerna telesna teža, stres, ipd.  Nadaljna in izločevalna vprašanja (ang. follow up questions)  Odzivanje na nujne primere oz. potencialno ogrožajoče simptome (ang. red flag symptoms)  Odzivanje v primerih, ko podani simptomi ne nakazujejo na zdravstveno stanje, ki bi potrebovalo nadaljnjo obravnavo Pri tem je potrebno poudariti, da zgoraj opisani postopek redukcije deluje na principu upoštevanja značilnosti povprečnega pripadnika določene starostne skupine in spola. 3.3 Podajanje nadaljnjih korakov Na podlagi zbranih podatkov z upoštevanjem lastnosti, ki veljajo za povprečnega pripadnika starostne skupine oz. spola, aplikacija pripravi poročilo (ang. consultation report), kjer predlaga naslednje korake, npr. specifične informacije o nadaljnjih korakih za določena zdravstvena stanja ali predlog za obisk zdravnika. Možnih rezultatov je lahko več in so razvrščeni glede na stopnjo verjetnosti. Medtem ko aplikacija na podlagi vhodnih podatkov lahko prepozna možnost zdravstvenih stanj, ki ne potrebujejo strokovne obravnave, naletimo na omejitve tako pri kroničnih in redkih bolezenskih stanjih, kot pri zdravstvenih stanjih, ki potrebujejo nujno medicinsko pomoč. V tovrstnih primerih uporabnika napotimo k obisku zdravnika. Povedano drugače, tudi če obstaja velika verjetnost, da gre na podlagi vnesenih podatkov pri uporabniku za srčni zastoj ali pojav raka, bo aplikacija v tem primeru namesto specifičnega rezultata svetovala čim hitrejši obisk zdravnika. Zaupanje in transparentnost sta kot eni izmed temeljnih vrednot podjetja vodilo tudi pri podajanju zdravstvenih informacij končnim uporabnikom, kjer imamo za vsebine vključno z zdravstvenimi članki licenco s strani britanske državne zdravstvene službe oz. National Health Service (NHS). Pri tem so zdravstvene informacije v člankih podane s strani zdravnikov oz. medicinskega osebja za zagotovitev kakovosti in uporabnikom čim bolj razumljivo in prijazno obliko. Podajanje nadaljnjih korakov zaključuje mreža zunanjih ponudnikov zdravstvenih storitev pod imenom OneStop Health™, kjer so uporabnikom na voljo izbrani lokalni in globalni ponudniki zdravstvenih storitev in izdelkov: od posvetovanja z zdravnikom v živo oz. preko video klica, do možnosti naročanja krvnih testov na dom. OTS 2019 SODOBNE INFORMACIJSKE TEHNOLOGIJE IN STORITVE 5 V. Visočnik in L. Gratej: Dobre prakse AI na področju zdravstva oziroma zakaj googlanje zdravstvenih težav ni najboljša ideja ZAKLJUČEK Zaradi splošne namembnosti spletnih iskalnikov se iskanje informacij prične s ugotavljanjem relevantnega področja glede na uporabnikov iskalni niz, pri čemer iskalnik ne upošteva uporabnikovih bistvenih značilnosti. Tako lahko uporaba iskalnega niza s pogovorno frazo »I need to take a leak every hour« privede do iskalnih rezultatov s področja vodovodnih popravil, medtem ko uporaba domensko specifičnih storitev, kot je osebni zdravstveni asistent Your.MD, uporabnika že avtomatsko umesti v področje zdravstva – analogni ekvivalent tega predstavlja obisk zdravnika ali zdravstvene ustanove, kjer je ista uporabnikova fraza obravnavana v pravilnem kontekstu in rezultira v nadaljnji obravnavi s podvprašanji. Področje zdravja in ugotavljanja možnih zdravstvenih stanj je preveč zapleteno, da bi znali učinkovito prepoznati problem na podlagi zgolj enega iskalnega niza oz. vprašanja, zlasti ob predpostavki, da gre pri posameznikovem telesu za skupek edinstvenih značilnosti oz. zdravstvenih težav. Z razvojem visokotehnološkega osebnega zdravstvenega asistenta se podjetje Your.MD sooča z vrsto izzivov, kako uporabnikom po vsem svetu omogočiti dostop do kakovostnih in zanesljivih zdravstvenih informacij s poudarkom na osebnem pristopu in preventivi v okviru predzdravstvene nege. VIRI IN LITERATURA [1] N. I. o. H. T. J. L. B. P. A. National Cancer Institute, „J Gen Intern Med,“ Why do people avoid medical care? A qualitative study using national data., p. 290–297, 30 Marec 2015. [2] Y. G. A. M. T. B. R. S. Jenny X. Liu, „Human Resources for Health,“ Global Health Workforce Labor Market Projections for 2030., 3 Februar 2017. [3] K. K. www.reuters.com, “Half of world's people can't get basic health services: WHO,” London, 2017, obiskano 16. 5. 2019 OTS 2019 SODOBNE INFORMACIJSKE TEHNOLOGIJE IN STORITVE M. Heričko in K. Kous (ur.) PASTI PRI IMPLEMENTACIJI REŠITEV UMETNE INTELIGENCE VILI PODGORELEC, SAŠO KARAKATIČ1 Povzetek: Razvoj informacijskih tehnologij, rešitev in storitev je pripeljal do obdobja, v katerem ljudje ustvarjamo, delimo in si izmenjujemo čedalje večje količine podatkov. Tovrsten razvoj prinaša uporabnikom vedno nove funkcionalnosti, za informatike – snovalce in razvijalce novih sistemov in rešitev – pa vse kompleksnejše zahteve in izzive. Sočasno z razvojem tehnologij se pogosto spreminjajo tudi koncepti uporabe le-teh, pri čemer vse bolj raste zavedanje o pomenu ustrezne analize obilice ustvarjenih podatkov in želja po uporabi znanja, skritega v njih. Vse bolj se zavedajoč potenciala umetne inteligence in strojnega učenja, kot dostopnega orodja za spopadanje z naštetimi izzivi, je v zadnjih letih strojno učenje postalo eden od temeljnih elementov informacijske tehnologije. Uporabniki so ozavestili inteligentno obnašanje naprav ter storitev in to od ponudnikov v vedno večji meri tudi zahtevajo. Podjetja so tako primorana nadgrajevati ter razvijati produkte in rešitve v smeri integracije z metodami in tehnologijami strojnega učenja oziroma s pomočjo umetne inteligence. Kljub enormnemu napredku na področju strojnega učenja pa je slednje še vedno zahtevna naloga, ki zahteva obilico domenskega znanja in izkušenj. Izhajajoč iz dveh desetletij praktičnih izkušenj, bomo v prispevku predstavili pogoste pasti, v katere se vse prehitro ujamejo premalo izkušeni razvijalci, ki pod vplivom pogosto prevelikih pričakovanj in nerealnih zahtev vodstva vidijo metode umetne inteligence kot novo »silver bullet« tehnologijo. Ključne besede: umetna inteligenca, strojno učenje, podatkovna znanost, razvoj, pogoste pasti NASLOVA AVTORJEV: dr. Vili Podgorelec, redni profesor, Univerza v Mariboru, Fakulteta za elektrotehniko, računalništvo in informatiko, Maribor, Slovenija, e-pošta: vili.podgorelec@um.si. dr. Sašo Karakatič, docent, Univerza v Mariboru, Fakulteta za elektrotehniko, računalništvo in informatiko, Maribor, Slovenija, e-pošta: saso.karakatic@um.si. https://doi.org/10.18690/978-961-286-282-4.2 ISBN 978-961-286-282-4 Dostopno na: http://press.um.si OTS 2019 SODOBNE INFORMACIJSKE TEHNOLOGIJE IN STORITVE 7 V. Podgorelec, S. Karakatič: Pasti pri implementaciji rešitev umetne inteligence UVOD Razvoj informacijskih tehnologij je pripeljal do obdobja, v katerem ustvarjamo, delimo in izmenjujemo čedalje večje količine podatkov, tako v službenem kot zasebnem življenju. Napredek podatkovne analitike, inteligentne analize podatkov in vpeljave strojnega učenja v ta področja je ustvaril prepričljive ekonomske rezultate na različnih poslovnih področjih, kot so finance, trženje in logistika [1]. Medtem ko so vodilna podjetja že prejela znatne donose od naložb v IT na teh področjih, pa se mnogi šele spoznavajo s prednostmi naprednih rešitev umetne inteligence in podatkovne znanosti v svojih podjetjih in domenah. Zavedajoč se pomena avtomatiziranih, naprednih rešitev, zasnovanih na odkrivanju vzorcev oz. znanja, skritega v obilici ustvarjenih podatkov, so se odločevalci znašli pred zahtevnim izzivom – kako zasnovati, razviti in vpeljati rešitve umetne inteligence in strojnega učenja za uspešno analizo množice prepletenih podatkov in iz nje izluščiti relevantne informacije za gradnjo napovednih modelov. Ker količina razpoložljivih podatkov presega zmožnosti računalniških sistemov za njihovo učinkovito analizo z uporabo običajnih pristopov in metod, je postalo področje napredne podatkovne analitike ključno za spopadanje s tem izzivom. V zadnjih letih smo tako priča razcvetu tehnologij, pristopov, metod in orodij na področju strojnega učenja oziroma umetne inteligence, ki igrajo ključno vlogo v širokem spektru aplikacij, kot so podatkovno rudarjenje, obdelava naravnega jezika, prepoznava slik in podobno. Tovrsten razvoj prinaša uporabnikom vedno nove funkcionalnosti, za informatike – snovalce in razvijalce novih sistemov in rešitev – pa vse kompleksnejše zahteve in izzive. Sočasno z razvojem tehnologij se pogosto spreminjajo tudi koncepti uporabe le-teh, pri čemer vse bolj raste zavedanje o pomenu ustrezne analize obilice ustvarjenih podatkov in želja po uporabi znanja, skritega v njih. Vse bolj se zavedajoč potenciala umetne inteligence in strojnega učenja, kot dostopnega orodja za spopadanje z naštetimi izzivi, je v zadnjih letih strojno učenje postalo eden od temeljnih elementov informacijske tehnologije in ključna sestavina za tehnološki napredek [2]. Uporabniki so ozavestili inteligentno obnašanje naprav ter storitev in to od ponudnikov v vedno večji meri tudi zahtevajo. Podjetja so tako primorana nadgrajevati ter razvijati produkte in rešitve v smeri integracije z metodami in tehnologijami strojnega učenja oziroma s pomočjo umetne inteligence. V želji nadoknaditi zaostanek za konkurenti, ki so se vpeljave inteligentnih rešitev že lotili, ali morebiti že žanjejo prve ugodne rezultate tovrstnega truda, v vodstvu podjetij pritiskajo na svoje skupine razvijalcev z vse večjimi zahtevami po hitri, ekonomični in kakovosti vpeljavi rešitev umetne inteligence. A kljub enormnemu napredku na področju strojnega učenja je slednje še vedno zelo zahtevna naloga, ki zahteva obilico specializiranih strokovnih znanj in izkušenj. Kot nas je zgodovina naučila že na mnogih drugih področjih, se le z ustreznim upoštevanjem dobrih inženirskih praks, podprtih s strokovnim znanjem in pridobljenimi izkušnjami, lahko izognemo pastem, v katere se vse prehitro ujamejo premalo izkušeni razvijalci, ki pod vplivom pogosto prevelikih pričakovanj in nerealnih zahtev vodstva vidijo metode umetne inteligence kot novo » silver bullet« tehnologijo [3]. Izhajajoč iz dveh desetletij praktičnih izkušenj, bomo v članku tako predstavili nekatere najpogostejše pasti, v katere se zlahka ujamejo razvijalci pri implementaciji rešitev umetne inteligence. V grobem lahko pasti in izzive razdelimo v tri temeljne skupine: Med strateške pasti štejemo vse morebitne neustrezne odločitve o razvoju in vpeljavi rešitev umetne inteligence v proces digitalne preobrazbe podjetja na najvišjem nivoju in so običajno posledica pomanjkljive poslovne vizije, napačnih poslovnih odločitev in/ali neustreznih pričakovanj. Za strateške napake praviloma niso odgovorni sami razvijalci, mora pa vodja razvoja nanje opozarjati vodstvo podjetja. Kot taktične pasti razumemo predvsem morebitne neustrezne izbire in odločitve pri načrtovanju izvedbe zastavljenega strateškega cilja razvoja in vpeljave rešitev umetne inteligence. Za prepoznavanje in izogibanje taktičnim pastem skrbi predvsem vodja razvoja, nanje pa morajo opozarjati tudi sami razvijalci. Izvedbene pasti so vse tiste, v katere se zlahka ujamemo pri sami implementaciji inteligentnih rešitev. Čeprav imajo težave, ki so posledica ujetja v izvedbene pasti, praviloma najbolj omejene posledice in si jih da odpraviti z manj vloženega truda kot taktične ali celo strateške napake, pa lahko vendarle tudi 8 OTS 2019 SODOBNE INFORMACIJSKE TEHNOLOGIJE IN STORITVE V. Podgorelec, S. Karakatič: Pasti pri implementaciji rešitev umetne inteligence te v skrajni obliki pripeljejo do nedelujoče rešitve. Izvedbenim pastem se morajo predvsem biti sposobni izogniti sami razvijalci. UMETNA INTELIGENCA IN STROJNO UČENJE Preden se poglobimo v tematiko, je pomembno, da dobro razumemo, kaj sploh je umetna inteligenca. V vsakdanji praksi so namreč v uporabi mnogi različni izrazi, ki se pogosto uporabljajo kot sinonimi. Umetno inteligenco lahko definiramo kot: »Umetna inteligenca je področje računalništva in informatike, namenjeno reševanju problemov, ki sicer zahtevajo človeško inteligenco – na primer prepoznavanje vzorcev, učenje in posploševanje.« Izraz je v zadnjih letih prekomerno uporabljen za označevanje umetne splošne inteligence ( artificial general intelligence, AGI), ki se nanaša na samo-zavedajoče se računalniške sisteme, ki so sposobni pravih kognitivnih funkcij. Kljub temu bo večina sistemov umetne inteligence v bližnji prihodnosti dejansko tisto, kar znanstveniki imenujejo kot "ozko umetno inteligenco" – kar pomeni, da bodo oblikovani tako, da bodo zelo dobro opravljali posamezno, precej ozko omejeno nalogo spoznavanja, namesto da bi resnično "razmišljali" sami. Za tovrstne namene pa se najpogosteje uporabljajo pristopi in tehnike strojnega učenja, ki ga lahko definiramo kot: »Strojno učenje je podmnožica umetne inteligence, ki uporablja statistične in hevristične tehnike, da računalnikom omogoči, da se učijo iz podatkov, ne da bi bili za to izrecno programirani.« Izraza umetna inteligenca in strojno učenje sta se v zadnjih letih izmenjaje uporabljala za opis praktičnih rešitev, zasnovanih na uporabi umetne inteligence, v mnogih podjetjih, predvsem zaradi velikega uspeha metod strojnega učenja. V strogem pomenu pa se moramo zavedati, da strojno učenje pomeni sposobnost samodejnega učenja iz podatkov, medtem ko umetna inteligenca vključuje učenje skupaj še z nekaterimi drugimi funkcijami. 2.1 Proces strojnega učenja Strojno učenje je namenjeno odkrivanju uporabnega znanja v surovih podatkih. Celoten proces strojnega učenja je netrivialen proces identifikacije veljavnih, novih, potencialno uporabnih in popolnoma razumljivih vzorcev v podatkih (slika 1). V tem kontekstu je vzorec ekvivalenten modelu, ki podaja relacije (strukturo) v podatkih. Vzorci so veljavni, če z določeno stopnjo gotovosti držijo za dane podatke. Razumljivost sme biti zagotovljena tudi z naknadnim procesiranjem, sami koraki procesa pa se običajno ponavljajo v več iteracijah, skozi katere na osnovi rezultatov predhodnih iteracij postopoma izboljšujemo oz. optimiziramo proces. Slika 1: Proces strojnega učenja oz. odkrivanja znanja v podatkih. Koraki procesa strojnega učenja so naslednji:  Proces strojnega učenja zmeraj začnemo s fazo analize oz. spoznavanjem problemske/aplikacijske domene, ki obvezno vključuje določanje ciljev, ki bi jih radi z izvedbo procesa dosegli.  Sledi oblikovanje ciljnega nabora podatkov. Obseg in kakovost podatkov sta ključna za vsak proces strojnega učenja, zato je le-temu potrebno nameniti dovolj pozornosti. Kakovostni podatki sami po sebi seveda še ne zagotavljajo uspešne inteligentne rešitve, dejstvo pa je, da smo brez kakovostnih podatkov gotovo obsojeni na neuspeh. Rezultat tega koraka je tako izbira podmnožice zapisov in spremenljivk, iz katerih bo izpeljano znanje. OTS 2019 SODOBNE INFORMACIJSKE TEHNOLOGIJE IN STORITVE 9 V. Podgorelec, S. Karakatič: Pasti pri implementaciji rešitev umetne inteligence  Naslednji korak je čiščenje in pred-procesiranje podatkov, k čemer med drugim sodi odstranjevanje šuma, obravnava manjkajočih polj, nepoznanih vrednosti in sekvenčnih informacij. Med pred- procesiranje štejemo še redukcijo in projekcijo podatkov, ki zajema iskanje alternativnih predstavitev podatkov ter izvajanje transformacij za zmanjševanje dimenzionalnosti in števila efektivnih spremenljivk.  Sledi določitev funkcije strojnega učenja oz. inteligentne analize podatkov, pri čemer določimo namen izpeljanega modela (na primer: klasifikacija, regresija, povezovalna analiza, ...).  Glede na izkazane potrebe, izbrane podatke in namen rešitve nato izberemo sam algoritem strojnega učenja glede na postavljene cilje in odločevalčeve potrebe. Za uspešen rezultat moramo nastaviti še zagonske parametre izbranega algoritma, saj lahko uglaševanje parametrov algoritma bistveno vpliva na rezultat. Sledi še dejanska izvedba izbranega algoritma z namenom odkritja relevantnih vzorcev v podatkih.  Za poln izkoristek zgrajenih modelov znanja po izvedbi algoritma strojnega učenja sledi faza interpretacije, v kateri najprej odstranimo redundantne in nepomembne vzorce ter pretvorimo uporabne izpeljane vzorce v razumljivo predstavitev, obogateno z ustrezno vizualizacijo.  Zadnja faza je ovrednotenje zgrajenih napovednih modelov. Pravilno ovrednotenje poiskanega znanja je ključno za uspešno uporabo rešitev umetne inteligence, saj nam rezultati vrednotenja povedo, kakšno stopnjo uspešnosti lahko pričakujemo od zgrajene rešitve pri dejanski uporabi v produkcijskem okolju. Medtem, ko lahko v mnogih aktivnostih procesa strojnega učenja sodelujejo strokovnjaki, ki nimajo poglobljenih strokovnih znanj prav s področja umetne inteligence (poslovni analitiki, strokovnjaki za upravljanje podatkov, …), pa so predvsem za jedro procesa – optimizacijo cevovoda strojnega učenja (slika 2) – ključna specifična znanja, pomanjkanje katerih večinoma botruje neuspešnim rešitvam. Slika 2: Standardni cevovod strojnega učenja. Od izbrane platforme, orodja oz. knjižnice je odvisno, katere korake je mogoče nadzorovati in do kakšne mere prilagajati svojim potrebam [4]. 2.2 Zakaj je strojno učenje tako pomembno? Obstaja več razlogov, zakaj je strojno učenje in na njem temelječe rešitve dandanes tako pomembno. Med ključne sodijo:  razvoj informacijskih tehnologij za zajem, obdelavo, shranjevanje in upravljanje podatkov,  razvoj zmogljivosti računalniških sistemov,  izpopolnjeni algoritmi, in predvsem  (poslovne) prednosti uporabe strojnega učenja. 10 OTS 2019 SODOBNE INFORMACIJSKE TEHNOLOGIJE IN STORITVE V. Podgorelec, S. Karakatič: Pasti pri implementaciji rešitev umetne inteligence Razvoj podatkovnih tehnologij je omogočil, da lahko danes v podjetjih brez večjih težav ohranijo prav vse generirane in zajete podatke. Izkaže se namreč, da lahko podatki, ki trenutno nimajo neposredne uporabne vrednosti, pripomorejo k sprejemanju ključnih odločitev v prihodnosti. S sistemi kot je npr. Hadoop je postalo shranjevanje in obdelava ogromnih količin podatkov zelo preprosto. Na osnovi teh ogromnih količin podatkov lahko algoritmi strojnega učenja nato zelo točno napovedujejo prihodnje rezultate. Podobno kot podatkovne tehnologije, eksponentno narašča tudi računska zmogljivost sodobnih računalniških sistemov. S prehodom na uporabo storitev v oblaku pa lahko tudi manjša podjetja uporabljajo zmogljivo infrastrukturo [5]. Sočasno z razvojem tehnologije pa se razvijajo in napredujejo tudi algoritmi, metode in orodja za inteligentno obdelavo ogromnih količin podatkov. Glavna naloga teh algoritmov je iskanje različnih vrst vzorcev v podatkih, njihovo analiziranje in dajanje pomembnih napotkov deležnikom za sprejemanje ustreznih odločitev v krajšem času. Pomagajo tudi pri zmanjševanju stroškov, ki nastanejo pri sprejemanju teh odločitev. Z zlivanjem fragmentiranih podatkov v enoten vir lahko bistveno povečamo uspešnost prihodnjih rezultatov. PASTI, KI PREŽIJO NA RAZVIJALCE Glavni razlog za vpeljavo rešitev umetne inteligence v podjetjih je potreba po napredovanju celotne digitalne transformacije. Z vpeljavo inteligentne programske opreme in storitev lahko namreč:  podjetja izboljšajo zmožnosti izdelkov in kakovost storitev,  bolje komunicirajo s strankami,  racionalizirajo poslovanje, ter  ustvarjajo napovedne in natančne poslovne strategije. Glede na potencialne prednosti, ki jih omogočajo rešitve umetne inteligence za podjetja, je jasno, da si le-ta želijo razviti in vpeljati tovrstne rešitve. Vsak poslovni proces lahko z združevanjem podatkov pridobi, saj imajo različni oddelki večinoma opravka le s svojimi podatki. Ko se ti podatki združijo na ustrezen način in v ustreznem času, se lahko sprejmejo primerne odločitve, ki pomagajo podjetju rasti in napredovati. S strojnim učenjem lahko iz ogromnih količin podatkov izluščimo informacije z zanemarljivim posredovanjem ljudi. V idealnem primeru naj bi izvajanje tega koncepta prispevalo k eksponentni rasti, v resnici pa se lahko ujamemo v posamezne pasti, ki lahko rast izničijo. Strojno učenje daje organizacijam možnost, da sprejmejo natančnejše odločitve, ki jih usmerjajo podatki, in rešujejo probleme, ki jih tradicionalni pristopi ne zmorejo. Vendar strojno učenje ni magija. Predstavlja veliko podobnih izzivov kot druge tehnologije. 3.1. Strateške pasti strojnega učenja Med strateške pasti štejemo vse morebitne neustrezne odločitve o razvoju in vpeljavi rešitev umetne inteligence v proces digitalne preobrazbe podjetja na najvišjem nivoju in so običajno posledica pomanjkljive poslovne vizije, napačnih poslovnih odločitev in/ali neustreznih pričakovanj. Za strateške napake praviloma niso odgovorni sami razvijalci, mora pa vodja razvoja nanje opozarjati vodstvo podjetja. (Ne)podpora vodstva Razvoj in vpeljava rešitev umetne inteligence v poslovni proces kateregakoli podjetja za sabo neločljivo potegne tudi spremembo načina vedenja in delovanja. Ena glavnih vlog vodstva, poleg tega, da že s sprejemom strategije pokaže svojo zavezanost tovrstni vpeljavi, je podpora in spodbujanje razvoja. Ob tem se morajo posamezni vodje, oboroženi s spoznanji in vpogledi iz zgrajenih modelov znanja, naučiti sprejemati več odločitev sami, pri čemer najvišje vodstvo določa le glavne usmeritve in se po potrebi vmeša le, ko se pojavijo izjeme. Za demokratizacijo uporabe analitike, ki bo zagotovila napredovanje s potrebnimi veščinami in spodbujanjem k souporabi podatkov, je seveda potreben določen čas. 3.1.1 Pomanjkanje (dobrih) kadrov Pomanjkanje strokovnjakov strojnega učenja je še vedno očiten izziv in potreba po zaposlenih, ki lahko vodijo in ključno prispevajo k razvoju in vpeljavi inteligentnih rešitev, je vse večja. Zaposlovanje in obdržanje teh iskanih strokovnjakov je postalo pomemben poudarek za številne uspešne organizacije. Podatkovni znanstveniki in inženirji strojnega učenja potrebujejo edinstveno mešanico talenta in znanj s področij OTS 2019 SODOBNE INFORMACIJSKE TEHNOLOGIJE IN STORITVE 11 V. Podgorelec, S. Karakatič: Pasti pri implementaciji rešitev umetne inteligence računalništva in informatike, matematike in statistike ter ustreznega domenskega znanja. Prepričanje, da je razvoj rešitev umetne inteligence pač še eno izmed številnih področij in pričakovanje, da ga bodo obstoječi programski inženirji uspešno rešili tudi brez specialnih znanj, je ena najhujših napak, ki jih lahko vodstvo stori. Če se hočemo temu problemu izogniti, je nujno v razvojno ekipo uvrstiti ustrezno usposobljene strokovnjake, ki morajo biti poleg obvladovanja tehnične plati sposobni razumeti še poslovne razloge za razvoj. 3.1.2 Pomanjkanje (dobrih) podatkov Čeprav se na strojno učenje praviloma gleda kot na postopek izboljševanja algoritmov, pa je grda resnica, da se večina časa porabi za pripravo podatkov in zagotavljanje njihove kakovosti. Kakovost podatkov je namreč bistvena za pridobivanje točnih rezultatov iz zgrajenih napovednih modelov. Z vidika kakovosti podatkov so predvsem problematični naslednji vidiki:  Šum v podatkih – podatki vsebujejo veliko nasprotujočih si ali zavajajočih informacij.  Umazani podatki – vsebujejo manjkajoče vrednosti, kategorične atribute z mnogimi ravnmi ter neskladne in napačne vrednosti.  Redki podatki – vsebujejo zelo malo dejanskih vrednosti in so sestavljeni večinoma iz ničel ali manjkajočih vrednosti.  Neustrezni podatki – nepopolni ali pristranski podatki. Na žalost se lahko veliko napak prikrade v samih postopkih zbiranja in shranjevanja podatkov, vendar je potrebno za uspešno aplikacijo strojnega učenja te težave odpraviti ali jih vsaj čim bolj omejiti. Podjetja, ki imajo zgledno urejen sistem upravljanja s svojimi podatki, bodo tako imela ob vpeljavi rešitev strojnega učenja in podatkovne analitike bistveno manj težav. 3.1.3 Nezadostna računalniška infrastruktura Za mnogo organizacij lahko upravljanje različnih vidikov infrastrukture, ki obdaja dejavnosti strojnega učenja, postane samo po sebi izziv. Že samo preverjeni in zanesljivi sistemi za upravljanje relacijskih podatkovnih baz lahko popolnoma odpovejo pod obremenitvijo in raznolikostjo podatkov, ki jih organizacije želijo zbrati in analizirati. Potem pa so tu pogosto še zahteve po izjemni računski moči, ki jih zahtevajo sodobni algoritmi strojnega učenja, ko se spopadajo z ogromnimi količinami podatkov. Ker si mnoga, sploh manjša podjetja, ne morejo privoščiti niti nakupa, še manj pa vzdrževanja tovrstne infrastrukture, so v skladu s premikom paradigme v načinu gradnje tehnoloških rešitev v oblaku in z rastjo oblačnih storitev začeli mnogi veliki ponudniki ponujati možnost uporabe strojnega učenja kot storitve (MLaaS, machine learning as-a-service). Tovrstne platforme v računalniškem oblaku zagotavljajo osnovni zahtevi za izvajanje sistema umetne inteligence:  učinkovite, stroškovno sprejemljive vire (v glavnem hramba podatkov), in  računsko moč (zmožnost obdelave velikih količin podatkov). 3.1.4 Prezgodnji razvoj oz. razvoj brez plana Vsako podjetje leta razvija svoje poslovne procese. Odločitev, kdaj naj se nove, praviloma naprednejše in celovitejše tehnologije vključijo v celovito strategijo podjetja, je težka naloga. Prehod na tehnike strojnega učenja morda niti ne bo potreben, dokler se IT in poslovne potrebe ustrezno ne razvijejo. Vsekakor je potrebno v organizaciji pred kakršnimkoli začetkom razvoja rešitev umetne inteligence jasno določiti strategijo in cilje, ki naj bi jih tovrstne rešitve prinesle. Nato je potrebno preveriti, ali je podjetje sploh sposobno razviti in vpeljati takšne rešitve ter ali so izpolnjeni vsi pogoji za tovrsten razvoj (kadri, infrastruktura, podatki, …) 3.2 Taktične pasti strojnega učenja Kot taktične pasti razumemo predvsem morebitne neustrezne izbire in odločitve pri načrtovanju izvedbe zastavljenega strateškega cilja razvoja in vpeljave rešitev umetne inteligence. Za prepoznavanje in izogibanje taktičnim pastem skrbi predvsem vodja razvoja, nanje pa morajo opozarjati tudi sami razvijalci. 12 OTS 2019 SODOBNE INFORMACIJSKE TEHNOLOGIJE IN STORITVE V. Podgorelec, S. Karakatič: Pasti pri implementaciji rešitev umetne inteligence 3.2.1 Izbira načina razvoja in orodij za razvoj Včasih so algoritme in metode strojnega učenja večinoma uporabljali znanstveniki, tehnološki strokovnjaki ali domenski strokovnjaki. Danes je na voljo vse več storitev strojnega učenja MLaaS, ki so vse bolj dostopne širšemu spektru razvijalcev in raziskovalcev. Podobno, kakor tradicionalne spletne storitve pomagajo razvijalcem ustvariti aplikacije, tako tudi MLaaS omogočajo enostavno uporabo strojnega učenja povprečnemu razvijalcu. Prikrijejo kompleksnost pri ustvarjanju in uporabi modelov strojnega učenja, tako da se lahko razvijalci osredotočijo na pripravo podatkov, uporabniško izkušnjo, oblikovanje, eksperimentiranje in uporabo znanja ter odkrivanje vzorcev v podatkih. Za zmanjšanje kompleksnosti platforme MLaaS zmanjšujejo stopnjo nadzora, ki jo ima razvijalec nad posameznimi koraki v procesu strojnega učenja, posamezne platforme pa se med seboj precej razlikujejo. Izbira, ali bomo za razvoj uporabili posamezno specializirano platformo (in katero) ali bomo raje razvijali rešitve zgolj z uporabo osnovnih knjižnic in ogrodij, ni enostavna, lahko pa odločujoče vpliva na uspešnost razvite rešitve [4]. Pri tem je pomembno, da ne precenimo sposobnosti svojih razvijalcev. 3.2.2 Delovanje algoritmov po principu črne škatle Nekateri algoritmi strojnega učenja zgradijo napovedne modele, ki so človeku povsem nerazumljivi, kar pomeni, da iz modelov ni razviden postopek odločanja. Ti algoritmi ali sistemi ne omogočajo vpogleda v notranje delovanje ali logiko za njimi. Tovrstne rešitve lahko hitro ustvarijo tehnične in kulturne težave. Če tak pristop ne doseže željenih rezultatov, ko se podatki precej spreminjajo, je lahko sam sistem zaradi nerazumevanja hitro ogrožen. Zelo težko je razložiti, zakaj model ni uspešen, kar lahko bistveno upočasni rast organizacije. V nekaterih panogah, kot so npr. medicina, bančništvo ali zavarovalništvo, modeli znanja enostavno morajo biti razložljivi. V nekaterih reguliranih panogah razlaga, dokumentiranje in utemeljevanje kompleksnih modelov strojnega učenja tako predstavljajo še dodatno breme. 3.2.3 Ustvarjanje tehničnega dolga Tehnični dolg se v okviru razvoja programske opreme nanaša na situacije, v katerih se razvijalci odločajo za kodo, ki sicer deluje in se jo enostavno implementira v kratkem času, ni pa dolgoročno ustrezna z vidika vzdrževanja. Pri uporabi strojnega učenja je možnosti za ustvarjanje tehničnega dolga zelo veliko – prepletajoči se cevovodi, neupoštevana odvisnost med podatki, skrite povratne zanke, … Problemu tehničnega dolga se lahko izognemo z upoštevanjem inženirskega pristopa pri razvoju. Pomembno se je zavedati, da so podatkovni znanstveniki nagnjeni predvsem k izboljševanju rezultatov in manj h kakovosti same programske kode. 3.3 Izvedbene (operativne) pasti strojnega učenja Izvedbene pasti so vse tiste, v katere se zlahka ujamemo pri sami implementaciji inteligentnih rešitev. Čeprav imajo težave, ki so posledica ujetja v izvedbene pasti, praviloma najbolj omejene posledice in si jih da odpraviti z manj vloženega truda kot taktične ali celo strateške napake, pa lahko vendarle tudi te v skrajni obliki pripeljejo do nedelujoče rešitve. Izvedbenim pastem se morajo predvsem biti sposobni izogniti sami razvijalci. 3.3.1 Preskakovanje priprave podatkov Pred uporabo pristopov grajenja modelov znanja je podatke potrebno ustrezno pripraviti – predprocesirati. Tukaj ne mislimo le na primerno poimenovanje spremenljivk, vstavljanje manjkajočih podatkov in poenotenje zapisov – to je del čiščenja podatkov in ne predpriprave. Pri predpripravi podatkov pa imamo podatke že očiščene in združene v pravi obliki, vseeno pa jih je potrebno še do določene mere spremeniti. Poglejmo si primer kategorične (nominalne) vrednosti, ki jo lahko zakodiramo v podatke na več možnih načinov. Če imamo kategorično spremenljivko, ki lahko zavzema vrednosti štirih kategorij, je prva misel za kodiranje kategorij kar preprosto z zaporednim mestom kategorije (0-prva kategorija, 1-druga kategorija…), kar pa je napačen pristop. Če kategorije kodiramo kot zaporedje, bo algoritem predpostavljal, da obstaja vzorec v vrstnem redu določanja kodiranja. Če je temu res tako, nimamo opravka s kategorično spremenljivko, temveč z vrstnim redom. Če pa vrstni red ni pomemben, pa moramo tudi algoritmu to povedati, da ne bo sklepal na pomembnost vrstnega reda kodiranja. To najlažje naredimo tako, da iz ene kategorične spremenljivke naredimo N novih OTS 2019 SODOBNE INFORMACIJSKE TEHNOLOGIJE IN STORITVE 13 V. Podgorelec, S. Karakatič: Pasti pri implementaciji rešitev umetne inteligence slamnatih spremenljivk, kjer je N enak številu kategorij. Vsaka izmed teh slamnatih spremenljivk bo zavzela vrednost bodisi 0 (če primer ni tiste kategorije) ali vrednost 1 (če primer je tiste kategorije). S tem pristopom bo algoritem vsako slamnato spremenljivko obravnaval kot svojo neodvisno spremenljivko in ne bo zmotnega sklepanja o vrstnem redu kategorij. Pogosto se spregleda tudi transformacija številskih spremenljivk – te je namreč potrebno spraviti na enako enoto. Zakaj? Predstavljajmo si primer, ko imamo v podatkih zapis o ceni pijače, ki ima razpon med 5 in 10€ in količini pijače, ki ima razpon med 330 in 1500ml. Nekateri algoritmi gradnje modelov znanja lahko sklepajo, da večje razlike v eni vrednosti, pomenijo tudi večje razlike v splošnem. Primer:  Pijača 1: 330ml, 6€  Pijača 2: 350ml, 10€ Razlika v količini pijače je 20ml, razlika v količini cene pa 4€. Ker algoritmi ne poznajo enot, je razlika 20 za algoritem bolj pomembna kot razlika 4, pa tudi če je nam ljudem jasno, da temu ni tako. Zaradi tega je potrebno vse vrednosti spraviti na enako enoto: z-vrednost. S standardizacijo vsake izmed spremenljivk dosežemo, da bo povprečje spremenljivke vseh primerov 0, standardni odklon pa 1. Po normalizaciji je razlika 20ml le še 0,03 , razlika 4€ pa je kar 0,6. 3.3.2 Napačna izbira značilk Z vidika kakovosti morajo biti podatki po eni strani čim bolj točni, zanesljivi in brez šuma, po drugi pa vsebinsko takšni, da je iz njih sploh mogoče napovedati željen rezultat. Za vsebinsko ustreznost podatkov je ključnega pomena pravilna izbira značilk (atributov), ki jih bomo uporabili v fazi učenja napovednih modelov. Izbira ustreznih značilk ni preprosta naloga, ki je v veliki meri odvisna od poznavanja same domene in konkretnega problema, ki ga skušamo rešiti. V splošnem velja, da je izbira ustreznih atributov ena najpomembnejših nalog pri strojnem učenju, celo pomembnejša od izbire primernega algoritma [6]. 3.3.3 Premalo (ustreznih) podatkov Preprosto dejstvo je, da je uspešnost strojnega učenja odvisna od podatkov, na katerih se sistem uči. Pri tem sta pomembna tako kakovost samih podatkov kot njihova količina. Z vidika količine podatkov seveda velja, da lahko boljše rezultate dosežemo s čim večjo količino podatkov. Je pa pri tem zanimivo, da nad manjšo količino podatkov bolje delujejo nekateri klasični učni algoritmi, medtem ko najnaprednejše tehnike globokega učenja dosegajo boljše rezultate šele nad zelo veliko količino podatkov (slika 3). Slika 3: Odvisnost napovedne uspešnosti od količine podatkov [7]. 3.3.4 Človeška pristranskost Izbiro algoritmov in ovrednotenje rezultatov opravijo ljudje, ki so lahko (nevede) pristranski. Znano je, da ljudje najraje izbirajo rešitve, ki jih dobro poznajo. Tako bo posameznik, ki je imel v preteklosti dobre izkušnje z nekim algoritmom, le-tega z večjo verjetnostjo izbral tudi za naslednjo nalogo, pa čeprav le-ta zanjo ne bo 14 OTS 2019 SODOBNE INFORMACIJSKE TEHNOLOGIJE IN STORITVE V. Podgorelec, S. Karakatič: Pasti pri implementaciji rešitev umetne inteligence optimalen. Podobno so ljudje, ki morajo ocenjevati kakovost rešitev, h katerim so sami prispevali (z zasnovo procesa strojnega učenja), nagnjeni k pretirano optimističnim ocenam. Prav tako lahko v želji po čim boljšem rezultatu (spet nevede) v postopek gradnje napovednih modelov vnesejo prepovedane informacije (uhajanje podatkov), kar prispeva k bistveno slabšim rezultatom v produkcijskem okolju od predvidenih z opravljenimi testi. V izogib tovrstnim pastem je potrebno dosledno sistematično preverjanje pravilnosti opravljenih korakov. 3.3.5 Izbira primernega algoritma V splošnem ne obstaja noben algoritem strojnega učenja, ki bi bil v splošnem najboljši. Zato je izbira ustreznega algoritma glede na izkazane potrebe, zbrane podatke in namen rešitve izredno pomembna. Vsak algoritem ima svoje prednosti in slabosti, zato izbira napačnega kvečjemu poslabša poslovni rezultat. Teoretično bi seveda lahko za vsako nalogo preskusili kopico različnih algoritmov in izbrali najboljšega, vendar v praksi tak pristop ne deluje, saj izredno poveča kompleksnost samega procesa. Kot bomo videli kasneje, je za dobro evalvacijo modelov namreč še zmeraj potrebno človeško posredovanje. Zato je pri izbiri algoritma potrebno dobro poznati in ustrezno pretehtati lastnosti posameznih algoritmov. 3.3.6 Uporaba najnaprednejših pristopov za vsako ceno V času konstantnih napredkov na področju strojnega učenja se iz dneva v dan pojavljajo nove in boljše rešitve ter pristopi za uporabo strojnega učenja na raznovrstnih problemih. Najnovejši pristopi zelo pogosto prekašajo starejše na specifični domeni, kar nam daje občutek, da so le najnovejši pristopi primerni za uporabo. Temu največkrat ni tako. Vsak pristop, algoritem ali metoda ima svoje specifike, svoje pozitivne lastnosti, svoje negativne lastnosti in domene, kjer deluje odlično ter domene kjer deluje slabo. Dobro poznavanje teh lastnosti je ključ do tega, da se pri implementaciji ne uporabijo napačni modeli. Hkrati je potrebno tudi dobro poznati problem, ki ga skušamo rešiti. Nesmiselno je uporabiti zahtevne nevronske mreže, če nimamo za to dovolj podatkov ali pa je vzorec, ki ga iščemo, nižje kompleksnosti. Najnovejši (in mnogokrat oglaševani kot najboljši) pristopi so največkrat specializirani za en specifičen, mnogokrat zelo zahteven, problem. Slepa uporaba takega modela na enostavnejših oz. drugačnih podatkih bo prinesla slabše rezultate, kot pa če pri tem uporabimo enostavnejše pristope. Kompleksnejši pristopi so namreč bolj nagnjeni k prenatreniranosti, saj sklepajo, da vsaka variabilnost v podatkih že kaže na določen vzorec. Ta problem se še potencira, če nimamo dovolj podatkov za uporabo kompleksnih modelov – vsaka vrednost bo interpretirana kot signal in šum bo spregledan. Ključ, da se izognemo tem problemom je, da se najprej poglobljeno spoznamo s podatki. Šele na to pa preizkusimo več pristopov (algoritmov) za reševanje našega problema – po korakih napredujemo od bolj preprostih, do bolj zahtevnih. 3.3.7 Uglaševanje zagonskih parametrov algoritmov Pri strojnem učenju predstavlja optimizacija oz. uglaševanje zagonskih parametrov problem izbire niza optimalnih parametrov za izbran učni algoritem. Kakovost zgrajenega modela znanja je zelo odvisna od nastavitve parametrov, katerih vrednosti se uporabljajo za nadzor samega učnega procesa. Izbran algoritem strojnega učenja lahko zahteva različne izbire, omejitve, uteži ali stopnje učenja za posploševanje različnih vzorcev podatkov. Da lahko algoritem optimalno reši zastavljen problem strojnega učenja, je potrebno parametre ustrezno prilagoditi. Ker optimalnih vrednosti v splošnem ni možno analitično izračunati, se v ta namen pogosto uporabljajo različni pristopi optimizacije, pri čemer pa je potrebno zelo paziti, da ne pride do prenatreniranosti modela ali do uhajanja podatkov [8]. 3.3.8 Prenatreniranost modelov V želji po čim boljših rezultatih se manj izkušeni razvijalci hitro ujamejo v past pretiranega treniranja (angl. overfitting) napovednih modelov. Po principu Ockhamove britve so bolj splošni modeli znanja bolj primerni od zelo specializiranih, saj praviloma z njimi dosegamo boljše rezultate na novih, nepoznanih primerih, ki jih bomo dejansko morali reševati v realnem, produkcijskem okolju. Ker imamo v laboratorijskem okolju na voljo le znane podatke, s pretiranim prilagajanjem dobimo modele, ki so izredno dobri zgolj na teh podatkih in praviloma bistveno slabši kasneje na realnih (slika 4). OTS 2019 SODOBNE INFORMACIJSKE TEHNOLOGIJE IN STORITVE 15 V. Podgorelec, S. Karakatič: Pasti pri implementaciji rešitev umetne inteligence Slika 4: Problem prenatreniranosti napovednih modelov. 3.3.9 Uhajanje podatkov Zelo nevarna past je uhajanje podatkov (angl. data leakage), kjer razvijalci testirajo zgrajene modele znanja na učnih podatkih. Vrednotenje modelov mora potekati izključno na podatkih, ki niso bili uporabljeni v procesu gradnje ali optimizacije modelov. Če modele vrednotimo na prej videnih podatkih, obstaja nevarnost, da v procesu učenja modela ne izluščimo vzorcev iz podatkov, temveč silimo model, da si podatke zapomni »na pamet«. Posledica je drugačna kot pri prenatreniranosti – točnost pri testiranju je namreč zelo visoka, ampak ta točnost pade, ko model znanja uporabimo v produkciji – torej, ko naleti na še nepoznane primere. Najpogostejši primer, ko pride do uhajanja podatkov, je pri sami optimizaciji algoritmov kreacije modelov znanja. Ko spreminjamo nastavitve algoritmov, je potrebno te tudi ovrednotiti. V tem koraku za vrednotenje še ne smemo uporabiti testnih podatkov, ampak za to uporabimo del učnih podatkov, ki pa ne sodelujejo pri procesu učenja (kreacije modela). Tem podatkom pravimo validacijski podatki. Posledično torej ne delimo naše množice podatkov na dva, ampak kar na tri dele:  učne podatke (ki služijo le gradnji modelov),  validacijske podatke (ki služijo vrednotenju nastavitev modelov) in  testne podatke (ki služijo za vrednotenje modelov, ko smo zaključili s procesom gradnje in optimizacije). 3.3.10 Merjenje kakovosti modelov Če se ukvarjamo s klasifikacijo podatkov v vnaprej definirane razrede, najlažje merimo kvaliteto modela znanja klasifikacije z metriko, ki jo imenujemo točnost. Ta metrika nam pove delež pravilno klasificiranih podatkov. Zdaj pa si poglejmo primer, ko klasificiramo podatke v dva zelo neuravnotežena razreda: učnih podatkov, ki so razreda A je 9990, učnih podatkov, ki so razreda B pa je 10. Pri gradnji modelov znanja prav vsak algoritem sprejme določeno mero napake, saj želi razbrati le vzorce in s tem generalizirati znanje, brez da bi le pomnil podatke na pamet. To pomeni, da bodo nekateri učni podatki spregledani pri gradnji modela znanja – v našem primeru bo to najverjetneje tistih 10, ki so razreda B. Najverjetneje bi preprost algoritem v našem primeru našel le eno pravilo: vsi podatki so razreda A. Če ovrednotimo tak model zgolj z vidika točnostjo, se model izkaže kot zelo kvaliteten, saj je njegova točnost kar 99,9%. Seveda pa je tak model popolnoma brez znanja in posledično neuporaben, saj ne zna pravilno klasificirati prav nobenega izmed primerkov razreda B! Taki primeri neuravnoteženih podatkov niso redkost, zato že obstajajo pristopi za spopadanje z njimi. Najenostavnejši pristop je uporaba alternativnih metrik za merjenje kakovosti takih modelov znanja. Ena takih je preciznost ali natančnost, ki nam pove delež pravilno identificiranih primerkov posameznega razreda napram vsem identificiranim primerkom tega razreda. Podoben je tudi priklic ali senzitivnost, ki nam pove delež identificiranih primerkov posameznega razreda napram vsem primerkom tega razreda. Ti metriki lahko tudi združimo, s čimer dobimo bolj uravnoteženo oceno: lahko uporabimo aritmetično sredino in tako dobimo F-mero, ali pa uporabimo geometrično sredino in tako imamo G-mero. Vse štiri naštete metrike kvalitete se izračunajo le za posamezne razrede, te pa lahko agregiramo v eno vrednost, da dobimo kvaliteto modela znanja 16 OTS 2019 SODOBNE INFORMACIJSKE TEHNOLOGIJE IN STORITVE V. Podgorelec, S. Karakatič: Pasti pri implementaciji rešitev umetne inteligence v splošnem, ne le za en razred. Agregiramo lahko s preprostim povprečenjem, lahko povprečimo uravnoteženo glede na razmerja razredov ali pa povprečimo vrednosti pred samim izračunom – uporaba je odvisna od naših potreb in ciljev. ZAKLJUČEK Uporaba strojnega učenja se z uvedbo grafičnih uporabniških vmesnikov v orodjih in številnih spletnih učilnic zdi precej enostavna. Seveda pa zgolj dejstvo, da so algoritmi in metode strojnega učenja na voljo praktično vsakomur, še ne pomeni, da bo pri njihovi uporabi vsak poskus pravilen in uspešen. Če znamo zapisati delujočo kodo za uporabo modula strojnega učenja, še ne pomeni, da ga znamo uporabljati pravilno. V celotnem procesu strojnega učenja se skriva ogromno pasti, v katere se ob neustreznem delovanju hitro ujamemo. Knjige, vodiči in drugi viri nam mnogokrat zamolčijo pogoste pasti pri uporabi pristopov strojnega učenja – sposobnost njihovemu izogibanju se pridobijo predvsem z izkušnjami. Namen prispevka je, da bralce seznani s številnimi pastmi, ki smo jih z izkušnjami tekom našega raziskovanja, uporabe, implementacije in kreacije pristopov strojnega učenja pridobili. Tako so v prispevku predstavljene številne zmote in nepravilni pristopi, na katere moramo biti pozorni pri uporabi algoritmov strojnega učenja, sestavi ekipe umetne inteligence, obdelavi podatkov in interpretaciji modelov. Čeprav so v prispevku opisane le najpogostejše in najnevarnejše pasti slepe uporabe strojnega učenja, je poznavanje že teh velik korak k bolj uspešni uporabi strojnega učenja in interpretaciji rezultatov. LITERATURA [1] BRYNJOLFSSON Erik, McAFEE Andrew "The business of artificial intelligence", Harvard Business Review, 2017. [2] SMOLA Alex, Introduction to Machine Learning, Cambridge University Press, 2010. [3] MUNCASTER Phil, »IT Leaders Believe AI is a ‘Silver Bullet’ for Threats«, Info Security Magazine, avgust 2018. [4] KARAKATIČ Sašo, VRBANČIČ Grega, FLISAR Jernej, PODGORELEC Vili "Umetna inteligenca za telebane – platforme strojnega učenja", Sodobne tehnologije in storitve OTS 2018: Zbornik triindvajsete konference, Maribor, Fakulteta za elektrotehniko, računalništvo in informatiko, Inštitut za informatiko, 175-188. [5] VRBANČIČ Grega, PODGORELEC Vili " Analiza inteligentnih oblačnih storitev na primeru prepoznave obrazov", Sodobne tehnologije in storitve OTS 2018: Zbornik triindvajsete konference, Maribor, Fakulteta za elektrotehniko, računalništvo in informatiko, Inštitut za informatiko, 189-201. [6] DIETTERICH Thomas G., et al. »Ensemble learning«, The handbook of brain theory and neural networks, 2002, 110-125. [7] TANG An, et al. »Canadian Association of Radiologists White Paper on Artificial Intelligence in Radiology«, Canadian Association of Radiologists Journal, letnik 69, april 2018, str. 120-135. [8] BERGSTRA James; BENGIO Yoshua »Random search for hyper-parameter optimization«, Journal of Machine Learning Research, februar 2012, str. 281-305. OTS 2019 SODOBNE INFORMACIJSKE TEHNOLOGIJE IN STORITVE M. Heričko in K. Kous (ur.) KORAK K SAMODEJNI INTEGRACIJI IN TESTIRANJU NAPOVEDNIH MODELOV STROJNEGA UČENJA GREGA VRBANČIČ, VILI PODGORELEC1 Povzetek: Z razcvetom strojnega učenja in prodorom v vse veje gospodarstva, se nenehno povečuje tudi potreba po ustaljenih razvojnih procesih pri razvoju napovednih modelov strojnega učenja, ki bi olajšala njihovo vpeljavo in integracijo v obstoječe informacijske sisteme. Podobno kot je to že ustaljena praksa pri programskem inženirstvu, je potreba in želja gospodarstva, da se tudi pri razvoju napovednih modelov strojnega učenja razvijejo smernice in prakse, ki bi omogočale enostavno vpeljavo, hiter in prilagodljiv razvoj ter nadzor nad kvaliteto dostavljenih napovednih modelov. V prispevku bomo predstavili smernice, izzive in potencialne rešitve pri vpeljavi napovednih modelov v proces samodejne neprekinjene integracije ter prikazali praktičen primer vpeljave napovednega modela. Ključne besede: samodejna neprekinjena integracija, napovedni modeli, strojno učenje, testiranje, razvoj programske opreme NASLOVA AVTORJEV: Grega Vrbančič, mladi raziskovalec, Univerza v Mariboru, Fakulteta za elektrotehniko, računalništvo in informatiko, Maribor, Slovenija, e-pošta: grega.vrbancic@um.si. dr. Vili Podgorelec, redni profesor, Univerza v Mariboru, Fakulteta za elektrotehniko, računalništvo in informatiko, Maribor, Slovenija, e-pošta: vili.podgorelec@um.si. https://doi.org/10.18690/978-961-286-282-4.3 ISBN 978-961-286-282-4 Dostopno na: http://press.um.si 18 OTS 2019 SODOBNE INFORMACIJSKE TEHNOLOGIJE IN STORITVE G. Vrbančič in V. Podgorelec: Korak k samodejni integraciji in testiranje napovednih modelov strojnega učenja UVOD S prodorom umetne inteligence in tehnik strojnega učenja v praktično vse veje gospodarstva, še posebej pa na področje informacijskih tehnologij, se vedno pogosteje zastavlja tudi vprašanje o integraciji in zagotavljanju kakovosti takšnih rešitev. V nasprotju z na primer programskim inženirstvom, kjer so procesi integracije in testiranja programske kode ter programske metrike že dodobra opredeljene in uveljavljene, pa pri razvoju napovednih modelov trenutno še ni dobro definiranih okvirjev oz. strategij, kako jih pravilno in učinkovito integrirati, testirati in zagotavljati kakovost. Sprejeti in uveljavljeni procesi testiranja in zagotavljanja kakovosti napovednih modelov so nujni za njihovo množično integracijo v obstoječe ali celo kritične dele informacijskih sistemov. Da bi lahko dobro definirali procese testiranja in zagotavljanja kakovosti napovednih modelov, pa moramo najprej definirati, kaj na področju strojnega učenja sploh pomeni testiranje. Primarno se izraz testiranje, v povezavi z umetno inteligenco, navezuje na testiranje uspešnosti napovednih modelov. Na uspešnost napovednih modelov vpliva velik nabor odvisnih in neodvisnih spremenljivk, zato je na mestu vprašanje, kako sploh testirati napovedne modele? Kako zagotoviti, da bodo delovali v skladu z našimi zahtevami in pričakovanji? V prispevku bomo predstavili problematiko oziroma izzive samodejne neprekinjene integracije in testiranja ter zagotavljanja kakovosti napovednih modelov ter poizkušali odgovoriti na zastavljena vprašanja. Predstavili bomo že uveljavljen koncept samodejne neprekinjene integracije ter ga razširili z vpeljavo korakov in komponent, specifičnih za razvoj napovednih modelov strojnega učenja. Prav tako bomo opisali obstoječe smernice in pristope zagotavljanja kakovosti napovednih modelov ter naslovili problematiko integracije napovednih modelov v obstoječe informacijske sisteme in na praktičnem primeru prikazali končen doprinos uvedbe testiranja na delovanje napovednega modela. SAMODEJNA NEPREKINJENA INTEGRACIJA Integracija programske opreme je pristop povezovanja podsistemov in komponent programske opreme z namenom izgradnje enotnega sistema. Integracija je del vsakega razvojnega življenjskega cikla programske opreme, saj ekipa inženirjev programsko opremo razvija skozi različne faze. [1] Leta je integracija programske opreme predstavljala rizičen in nepredvidljivosti poln korak v življenjskem ciklu razvoja programske opreme. Že več kot dve desetletji pa problematika tega koraka počasi pojenja, zahvaljujoč pojavitvi samodejne neprekinjene integracija (angl. Continuous Integration, CI). Začetki CI izhajajo iz Kent Blockovih dvanajstih praks razvoja programske opreme, poznanega kot eXtreme Programming (XP) [2]. Avtor je CI okarakteriziral kot proces, v katerem je nova programska koda integrirana v trenuten sistem v največ nekaj urah, pri čemer je sistem vedno zgrajen v celoti od začetka, spremembe programske kode pa se ohranijo v primeru, da so bili uspešno prestani vsi testi. [3]. Tipičen scenarij procesa neprekinjene integracije programske kode (Slika 1) se začne z razvijalcem, ki prispeva (angl. commit) programsko kodo v skupen repozitorij. Pri delu na tipičnem projektu lahko deležniki, pogosto v različnih vlogah, prispevajo spremembe, ki sprožijo cikel CI. Na primer, razvijalci sprožijo cikel s spremembami programske kode, administratorji podatkovnih baz s spremembami definicij entitet, ekipe, ki skrbijo za izgradnjo in namestitev programske opreme, s spremembami konfiguracijskih datotek, itd. Slika 1: Konceptualni prikaz procesa neprekinjene integracije programske kode. OTS 2019 SODOBNE INFORMACIJSKE TEHNOLOGIJE IN STORITVE 19 G. Vrbančič in V. Podgorelec: Korak k samodejni integraciji in testiranje napovednih modelov strojnega učenja Koraki v omenjenem tipičnem scenariju procesa integracije programske kode si v splošnem sledijo [4]: 1. Najprej deležnik prispeva spremembo v skupen repozitorij. Medtem CI strežnik neprekinjeno na določen interval opreza za morebitnimi spremembami na repozitoriju ali posluša na izpostavljenem spletnem vmesniku (angl. webhook) za morebiten klic, ki sporoča o dogodku – spremembi na skupnem repozitoriju. 2. Kmalu po oddanem prispevku v repozitorij, CI strežnik zazna spremembo in pridobi najnovejšo različico programske kode ter prične z izvajanjem CI cikla. 3. Po koncu cikla CI strežnik generira poročilo, ki ga posreduje vsem deležnikom oz. poročilo ponudi na voljo v enostavno dostopni spletni obliki. 4. Opcijsko zapakira uspešno integrirano, prevedeno programsko kodo v izvršljiv paket in ga namesti na testno izvajalno okolje. 2.1 Komponente neprekinjene integracije Kljub temu, da je samodejna neprekinjena integracija postala standard v programskem inženirstvu, v stroki še vedno ni konsenza, kako bi takšen sistem moral biti implementiran. Na voljo so različna orodja (Jenkins, Travis, GitLab CI...), ki omogočajo razvoj programske opreme z uporabo pristopa samodejne neprekinjene integracije, sicer pa pristop sam ne zahteva uporabe nobenega specifičnega orodja. Glede na omenjeno, obstaja množica napotkov in dobrih praks [4], [5], povezanih s CI in vpeljavo le-te, ki jih lahko obravnavamo kot nekakšne smernice. Martin Fowler v njegovem množično citiranem prispevku [5] predstavi deset ključnih praks, potrebnih za vzpostavitev učinkovitega CI sistema:  vzdrževanje enotnega vira – repozitorija programske kode,  avtomatizacija izgradnje paketa,  izgradnja naj bo samo testirajoča (angl. self-testing),  vsi razvijalci dnevno prispevajo kodo v repozitorij,  vsak prispevek mora biti zgrajen na strežniku, ki poganja integracijskih sistem,  nedelujoče izgradnje morajo biti takoj popravljene,  izgradnja naj bo hitra,  testiranje se naj izvaja na klonu produkcijskega okolja,  dostopnost do zadnjega zgrajenega izvajalnega paketa naj bo enostavna in omogočena vsem deležnikom,  vsak ima možnost spremljati, kaj se dogaja,  avtomatizacija namestitve. Podobno kot Fowler, tudi Duvall [4] predstavi sedem temeljev neprekinjene integracije programske opreme, ki v splošnem povzamejo Fowlerjeve ključne prakse, dodatno pa eksplicitno izpostavi, da naj ima popravilo neuspešnih integracij najvišjo prioriteto. Kot enega izmed ključnih temeljev izpostavi tudi pregled generiranih poročil, ki vsebujejo analizo kvalitete programske kode. 2.2 Integracijski cikel Kot predstavljeno je proces samodejne neprekinjene integracije programske opreme sestavljen iz več gradnikov. Ključna komponenta integracijskega procesa, sestavljena iz več gradnikov, je integracijski cikel. Vsak integracijski cikel (Slika 2), se izvaja na CI strežniku, ki v splošnem izvede naslednje korake [6]: 1. Zazna spremembe na skupnem repozitoriju (npr.: Git, Subversion) programske kode. 2. Pridobi programsko kodo iz repozitorija ter jo prenese na CI strežnik. 3. Prevede programsko kodo, v kolikor je to potrebno. 4. Izvede preverjanje kakovosti – izvede sorodne naloge kot so testiranje enot (angl. unit testing) in verifikacija avtomatizirane arhitekture, analiza kvalitete programske kode, itd. Te naloge so v procesu samodejne neprekinjene integracije opcijske, vendar priporočljive, saj je čimprejšnje vpeljevanje nadzora kvalitete v proces integracije ena izmed ključnih lastnosti pristopa samodejne neprekinjene integracije. 5. Prevedeno programsko kodo vrne nazaj v repozitorij. 6. Poroča o stanju izgradnje vsem deležnikom. 7. Opcijsko zapakira uspešno integrirano prevedeno programsko kodo in jo namesti v testno okolje. 20 OTS 2019 SODOBNE INFORMACIJSKE TEHNOLOGIJE IN STORITVE G. Vrbančič in V. Podgorelec: Korak k samodejni integraciji in testiranje napovednih modelov strojnega učenja Slika 2: Podrobna predstavitev cikla neprekinjene integracije. 2.3 Testiranje Faza testiranja, poznana tudi kot neprekinjeno testiranje (angl. Continuous testing), v ciklu CI uporablja avtomatizirane pristope ter tako imenovan pomik v levo (angl. shift-left) pristop z namenom pohitritve testiranja, ki posledično v proces CI in faze razvoja programske opreme vključuje tudi problematiko zagotavljanja kakovosti. Uporaba takšnega pristopa lahko vključuje nabor samodejnih testnih delovnih tokov, kateri lahko zajemajo tudi analitiko in metrike programskega inženirstva (LOC1, CBO2, CC3...), z namenom zagotavljanja čiste, pregledne, na dejstvih temelječe slike kvalitete dostavljene programske opreme. [6] Z uporabo pristopa neprekinjenega testiranja deležniki dobijo povratne informacije o kakovosti programske opreme, ki jo gradijo. Prav tako jim omogoča, da testirajo prej ter z večjo pokritostjo z odstranitvijo ozkega grla kot je dostop do deljenega testnega okolja in čakanjem na razvoj oz. stabilizacijo uporabniškega vmesnika. Torej, če želimo razviti programsko opremo, ki je zanesljiva, moramo zagotoviti zanesljivost na nivoju objektov, katero pa lahko dosežemo le s skozi uspešno testiranje enot. Seveda pa nam zgolj napisani testi enot nujno ne zagotavljajo zanesljivosti. Testi morajo efektivno preverjati uporabo objektov in morajo biti pogosto zagnani. Ker objekti komunicirajo med seboj, morajo biti testi pognani, kadarkoli v programski opremi pride do kakršnekoli spremembe. Za celovito in učinkovito testiranje programske opreme je nujno potrebno avtomatizirati skupek raznovrstnih testov [4]:  Testi enot: preverjajo obnašanje manjših elementov programske opreme, ki so navadno predstavljeni kot samostojen razred. Nekateri testi enot zahtevajo minimalne zunanje odvisnosti, ki so implementirane samo kot drugi samostojni razredi. Takšni razredi so sami po sebi enostavni in nimajo globokega grafa objektov. Občasno testi enot uporabljajo t.i. prototipe (angl. mock), ki so prav tako enostavni razredi, katerih vloga je nadomestitev bolj kompleksnih enot za namene testiranja.  Testi komponent: testi komponent ali testi podsistemov preverjajo specifične dele oz. komponente programske opreme in navadno zahtevajo kakšne zunanje odvisnosti kot so podatkovne baze, datotečni sistemi itd. Takšni testi preverjajo, ali komponente delujejo na način, da ustvarjajo pričakovano agregirano obnašanje. Ker tovrstni testi zajemajo večjo količino programske kode v vsakem testnem primeru, se temu primerno tudi dalj časa izvajajo kot na primer testi enot. Pogosto posamezni testi komponent testirajo obnašanje določenih komponent preko izpostavljenega aplikacijskega programskega vmesnika. Takšni testi so poznani tudi kot integracijski testi. 1 Število vrstic kode (angl. Lines Of Code – LOC) 2 Število razredov, ki so vezani na specifičen razred (angl. Coupling Between Objects – CBO) 3 Ciklična kompleksnost (angl.Cyclomatic Complexity – CC) OTS 2019 SODOBNE INFORMACIJSKE TEHNOLOGIJE IN STORITVE 21 G. Vrbančič in V. Podgorelec: Korak k samodejni integraciji in testiranje napovednih modelov strojnega učenja  Sistemski testi: preverjajo delovanje celotne programske opreme in tako zahtevajo popolno nameščen sistem, kot na primer vsebnik servletov in povezano podatkovno bazo. Takšni testi preverjajo, ali zunanji vmesniki kot so spletne strani, spletne storitve ali grafični uporabniški vmesnik delujejo v povezavi s preostalim razvitim sistemom po pričakovanjih.  Funkcionalni testi: kot nakazuje ime, testi funkcionalnosti preverjajo delovanje posameznih funkcionalnosti programske opreme s stališča uporabnika, kar pomeni da testi sami posnemajo interakcijo uporabnikov s programsko opremo. Glavne koristi, ki jih deležniki z vpeljavo neprekinjenega testiranja pridobijo, so tako [6]:  Pomik aktivnosti testiranja “v levo” v življenjskem ciklu razvoja programske opreme in integracijo le-teh v razvojne aktivnosti.  Združevanje testnih, razvojnih in administrativnih ekip v vsakem koraku življenjskega cikla razvoja programske opreme.  Avtomatizacija testiranja v največji meri z namenom neprekinjenega testiranja ključnih lastnosti oz. zmogljivosti dostavljene programske opreme.  Omogoča, da poslovnim partnerjem dostavljamo zgodnjo in neprekinjeno povratno informacijo o lastnostih in zmogljivostih razvijajoče se programske opreme.  Odstranjuje ozka grla dostopnosti do testnega okolja.  Aktivno in neprekinjeno nadzoruje kvaliteto skozi celoten razvojni cikel programske opreme. 2.4 Izzivi vpeljave neprekinjene integracije Skozi leta razvoja in vpeljav CI procesa v proces razvoja programske opreme je faza testiranja postala ena izmed najpomembnejših delov uspešnega izvajanja CI. Po drugi strani pa glede na poročanje številnih študij, faza testiranja predstavlja izvor največjih ovir in izzivov, povezanih z vpeljavo CI v proces razvoja programske opreme. Med pogostejšimi izzivi, povezanimi s testiranjem programske kode, se tako pojavlja problem avtomatizacije različnih tipov testov kot so testiranje enot, integracijsko testiranje, testiranje uporabniških vmesnikov [7], [8]. Vzrok za težave pri avtomatizaciji testov lahko bodisi izvira iz pomanjkljive infrastrukture, odvisnosti od specifične strojne opreme, bodisi iz slabega izvajanja testno vodenega razvoja (angl. test driven development, TDD) [9]. Drug pogost izziv, povezan s testiranjem programske opreme, pa je nizka kvaliteta napisanih testov, kar vključuje nezanesljive teste, nizko pokritost s testi, dolgo izvajajoče se teste, ipd. [7], [10] Poleg izzivov, povezanih s testiranjem programske opreme, so avtorji članka [9] kot pomemben izziv vpeljave CI identificirali tudi odpravljanje konfliktov v programski kodi. Med pogostejšimi razlogi za težave pri odpravljanju konfliktov sta izpostavljena odvisnost od modulov tretjih oseb ter močno sklopljena zasnova oz. arhitektura programske opreme. [7], [10] 2.5 Koristi neprekinjene integracije Raziskave, opravljene na področju programskega inženirstva, kot pomembnejše koristi neprekinjene integracije izpostavljajo [5], [9]:  Pridobivanje hitrejšega povratnega odziva o uspešnosti izgradnje programske opreme kot tudi odziva uporabnikov.  Hitrejša identifikacija, lažje obvladovanje ter hitrejša odprava hroščev v programski opremi.  Pogoste in zanesljive izdaje programske opreme, ki vodijo k zvišanju stopnje zadovoljstva končnih uporabnikov programske opreme.  Skozi vpeljavo CI v proces razvoja programske opreme podjetja pogosto vpeljejo tudi proces neprekinjene dostave, kar ima za posledico izboljšanje povezovanja in komunikacije med razvijalci ter skrbniki infrastrukture ter posledično povečano stopnjo avtomatizacije procesov. 22 OTS 2019 SODOBNE INFORMACIJSKE TEHNOLOGIJE IN STORITVE G. Vrbančič in V. Podgorelec: Korak k samodejni integraciji in testiranje napovednih modelov strojnega učenja VKLJUČITEV NAPOVEDNIH MODELOV V PROCES SAMODEJNE NEPREKINJENE INTEGRACIJE IN TESTIRANJA Razvoj napovednih modelov strojnega učenja v sami osnovi ni precej drugačen od razvoja tradicionalne programske opreme. Tako kot pri razvoju običajne programske opreme je tudi pri razvoju napovednih modelov to proces s celotnim življenjskim ciklom, ki vključuje načrtovanje, implementacijo, optimizacijo, testiranje in dostavo oziroma namestitev. S tem ko napovedni modeli postajajo iz leta v leto čedalje bolj vključeni v raznovrstne informacijske sisteme, se tudi njihova vloga čedalje bolj povečuje. Z vedno bolj pomembno vlogo napovednih modelov pa se zvišuje tudi potreba, da je življenjski cikel razvoja ter integracije napovednega modela upravljan na sistematičen in bolj rigiden način kot je to do sedaj že uveljavljena praksa pri razvoju konvencionalne programske opreme. [11] O tem priča tudi porast znanstvenih in strokovnih člankov [2], [11], [12], ki naslavljajo temo razvojnega življenjskega cikla napovednih modelov strojnega učenja in integracijo ter namestitev takšnih modelov v že obstoječe programske rešitve. Kot rečeno, se sam pristop razvoja napovednega modela v samem bistvu kaj dosti ne razlikuje od razvoja tradicionalne programske opreme, ampak ga v splošnem samo razširja. Tipičen proces razvoja napovednega modela bi lahko opredelili s sledečimi koraki: 1. Identifikacija problema 2. Načrtovanje rešitve 3. Pridobivanje in pred-obdelava podatkov 4. Izgradnja napovednega modela 4.1. Izbira algoritma 4.2. Učenje modela 5. Evalvacija modela 6. Namestitev 3.1 Samodejna neprekinjena integracija napovednih modelov Izmed prej naštetih korakov procesa razvoja napovednih modelov sta za vpeljavo napovednih modelov strojnega v proces CI ključna izgradnja napovednega modela in evalvacija modela. Izgradnja uspešnega napovednega modela v splošnem zahteva veliko učno množico (podatki), bolj ali manj kompleksen algoritem, s katerim bomo zgradili napovedni model ter strategijo učenja in ovrednotenja napovednega modela. Ob tem je pomembno dodati, da je izgradnja napovednega modela tipično dolgo trajajoč postopek, katerega rezultat ni determinističen. Ne-determinističnost napovednih modelov pa prinaša tudi številne izzive v področje nadzorovanja in zagotavljanja kakovosti delovanja napovednega modela, zato je ključnega pomena, da v obstoječ CI proces pri vpeljavi napovednih modelov strojnega učenja poleg mehanizmov priprave modela vključimo tudi potrebne mehanizme za evalvacijo le-teh. Konceptualna zasnova (Slika 3) prikazuje razširjen proces CI z vključitvijo napovednega modela strojnega učenja. Kot je razvidno iz slike je poleg razširitev obstoječih komponent procesa dodana tudi nova komponenta – priprava modela. Priprava modela vsebuje korake priprave podatkov, izgradnjo samega modela ter učenje modela. V komponenti nadzorovanje je dodan korak nadzorovanja sprememb nad učnimi podatki, ti so navadno hranjeni bodisi v obstoječem sistemu za verzioniranje programske kode, bodisi v za to namenjenem sistemu za hrambo podatkov kot na primer v podatkovnih bazah, datotečnih sistemih ipd. Razširjena je tudi komponenta izgradnja, ki poleg prenosa ter opcijsko prevajanja programske kode vsebuje tudi korak, v katerem se opravi prenos učnih podatkov iz specifičnega vira v sam proces CI. Prav tako ključna je razširitev komponente testiranje, ki v razširjenem procesu CI vsebuje tudi korak evalvacije modela. OTS 2019 SODOBNE INFORMACIJSKE TEHNOLOGIJE IN STORITVE 23 G. Vrbančič in V. Podgorelec: Korak k samodejni integraciji in testiranje napovednih modelov strojnega učenja Slika 3: Konceptualna zasnova razširjenega procesa neprekinjene integracije z vključitvijo napovednih modelov strojnega učenja. 3.2 Izzivi Z vključitvijo dodatne komponente ter razširitvijo omenjenih komponent procesa samodejne integracije in testiranja napovednih modelov, se moramo soočiti tudi z izzivi, ki jih le-te prinesejo. Kot ključne izzive so avtorji v prispevkih [11]–[13] izpostavili predvsem problematiko kompleksnosti testiranja in zagotavljanja kakovosti napovednih modelov ter izzive, povezane z učenjem napovednih modelov. Med izzive, povezane z učenjem napovednih modelov, prav gotovo spadajo izzivi, ki se navezujejo na učne in testne podatke. Kvaliteta in kvantiteta podatkov, tako učnih kot tudi testnih, je kritična za razvoj uspešnega napovednega modela. V primeru razvoja napovednih modelov, temelječih na algoritmih globokega učenja, kot so na primer konvolucijske nevronske mreže ali nevronske mreže s povratno zanko, pa je predvsem količina podatkov še toliko bolj pomembna, saj takšni algoritmi za uspešno učenje potrebujejo večjo količino prečiščenih podatkov kot konvencionalni algoritmi. Na tej točki velja izpostaviti pomembnost čiščenja podatkov, ki je pri razvoju in integraciji napovednih modelov pogosto spregledana. V splošnem obstajata dve skupini tehnik oziroma pristopov, s katerimi naslavljamo negativni efekt neprečiščenih podatkov oziroma podatkov s šumom: odpornost na šum v podatkih ter odstranitev šuma. Pristopi, odporni na šum, vključujejo izgradnjo robustnih algoritmov, ki so tolerantni do podatkov, ki vključujejo šum in tako ne potrebujejo pred- procesiranja in prečiščevanja podatkov. Tehnike za odstranjevanje šuma pa delujejo po principu odstranjevanja učnih primerkov, v kolikor le-ti vsebujejo šum. [2] Prav tako pogosti izzivi, povezani z učenjem napovednih modelov, so hranjenje podatkov oziroma izzivi z uporabo sistema za verzioniranje. Velikost napovednih modelov lahko presega nekaj gigabajtov, povrhu vsega pa so ti navadno hranjeni v binarni obliki, kar zna predstavljati problem ob uporabi sistema za verzioniranje kot je Git, saj ta ni bil zasnovan za takšne namene. Sicer lahko tovrsten problem rešimo z uporabo razširitve Git LFS (Git Large File Storage), vendar pa ni nujno da je uporaba le-te podprta s strani izbranega sistema za neprekinjeno integracijo. Z vpeljavo napovednih modelov v proces CI pa je potrebno poleg napovednih modelov slediti in hraniti tudi spremembe v učnih in testnih podatkih. Sicer je mogoče to opravljati v sklopu repozitorija programske kode, lahko pa tak pristop hitro privede do težje sledljivosti in zmede pri nadzorovanju in upravljanju sprememb. Obetajoč kandidat, ki naslavlja omenjeno problematiko, je orodje Data Version Control (DVC), splavljeno leta 2018, ki je razširitev Git orodja s poudarkom na upravljanju z velikimi količinami podatkov in možnostjo reprodukcije napovednih modelov. [2] Ena izmed pomembnejših lastnosti procesa CI je hitra in pogosta integracija, ki vzpodbuja, da razvijalci večkrat dnevno prispevajo programsko kodo v repozitorij. Kot poročajo avtorji, se že pri razvoju konvencionalne programske opreme pogosto pojavljajo izzivi, povezani z dolgo trajajočimi integracijskimi cikli. Ti pa se z 24 OTS 2019 SODOBNE INFORMACIJSKE TEHNOLOGIJE IN STORITVE G. Vrbančič in V. Podgorelec: Korak k samodejni integraciji in testiranje napovednih modelov strojnega učenja vpeljavo napovednih modelov v proces CI še dodatno drastično povečajo, saj je učenje napovednih modelov računsko zahteven in dalj časa trajajoč proces. Tipično se pri razvoju konvencionalne programske opreme težava dolgo trajajočega CI cikla rešuje z razbijanjem izgradnje programske opreme na več manjših komponent. Enakega pristopa pa žal ne moremo uporabiti pri razvoju napovednih modelov, saj je proces izgradnje in učenja močno sklopljen. Omenjene težave lahko naslovimo z delegiranjem učenja napovednih modelov na specifično strojno opremo, optimizirano za učenje napovednih modelov, ali pa z uporabo ogrodij in sistemov za porazdeljeno učenje. [2] Kot poznamo že s področja programskega inženirstva je testiranje pomembna strategija za povečanje zanesljivosti, zmanjševanje tehničnega dolga in dolgoročno zniževanje stroškov vzdrževanja. Ključna razlika testiranja napovednih modelov strojnega učenja v primerjavi s testiranjem konvencionalne programske opreme je v kompleksnosti. Kompleksnost testiranja napovednih modelov izvira iz njihove narave, saj je obnašanje le- teh močno odvisno od podatkov in dejstva, da jih ni mogoče strogo specificirati. Na omenjen izziv lahko gledamo z vidika prispodobe učenja napovednega modela s prevajanjem programske kode, kjer je v primeru razvoja napovednega modela programska koda prispodoba tako za dejansko programsko kodo kot tudi učne podatke. Tako je potrebno, z vidika te prispodobe, testirati tako programsko kodo kot tudi podatke, naučen napovedni model pa moramo obravnavati na podoben način kot obravnavamo izvršljive pakete programske opreme. [13] Na tej točki si je torej smiselno zastaviti vprašanje: Kaj in koliko sploh testirati? 3.3 Testiranje in evalvacija napovednih modelov Testiranje programske opreme je v programskem inženirstvu v splošnem dobro raziskano, podobno je tudi s področjem strojnega učenja. Težava pa se pojavlja na preseku omenjenih področij, torej testiranju napovednih modelov strojnega učenja. Še najboljši približek smernicam oziroma dobrim praksam, kot jih poznamo na področju programskega inženirstva, je predstavljen v prispevku [13], pripravljenem s strani Googlovih zaposlenih. V nadaljevanju bomo predstavili nekaj pomembnejših smernic za celovito testiranje napovednih modelov ter zmanjševanje potencialnega tehničnega dolga. Ključna razlika med konvencionalno programsko opremo ter napovednimi modeli strojnega učenja je, da obnašanje napovednih modelov ni določeno neposredno s programsko kodo, ampak na njegovo obnašanje vplivajo podatki. Zato je posledično smiselno v procesu neprekinjene integracije z vpeljanimi napovednimi modeli testirati tudi učne podatke. Pri testiranju podatkov je smiselno preverjati ali so le-ti v pravilni oz. v pričakovani obliki ter ali so vrednosti posameznih značilk znotraj predvidenega definiranega območja. Dodatno je smiselno s testi enot preverjati tudi programsko kodo za izluščevanje in/ali izgradnjo značilk, čeprav se navadno zdi, da je precej enostavna in ni potrebe po testiranju. Napake v vrednosti značilk, ko so že v procesu izluščevanja in nadalje v procesu učenja napovednega modela, je namreč skorajda nemogoče zaznati. [13] Za razliko od področja strojnega inženirstva, kjer se je že razvil širok nabor smernic in dobrih praks, so smernice in dobre prakse razvoja zanesljivih napovednih modelov strojnega učenja še v razvoju. Algoritmi strojnega učenja navadno dopuščajo oz. celo zahtevajo nastavitve velikega števila t.i. hiper-parametrov, s katerimi definiramo delovanje algoritmov, učnih strategij, ipd. Izbira primernih hiper-parametrov ima velik vpliv na sposobnost učenja modela kot tudi na končno uspešnost napovednih modelov. Hiper-parametre je potrebno skozi razvoj prav tako prilagajati glede na spremembe v zasnovi učnega algoritma kot tudi glede na spremembe v podatkih. V ta namen je priporočljiva uporaba bolj ali manj enostavnih strategij iskanja hiper- parametrov, ki lahko v splošnem poleg zvišanja kvalitete napovedi razkrije tudi težave, povezane z zanesljivostjo napovednih modelov. Za namene zagotavljanja kakovosti napovednih modelov je ključno vpeljati teste, kjer preverjamo ali je uspešnost napovednega modela na vnaprej določeni učni podmnožici v skladu z našimi pričakovanji. Na primer, »uspešnost oz. točnost napovednega modela za podmnožico 𝑥 mora biti nad 95 %« je lahko eden izmed takšnih testov. Priporočljiva je tudi vpeljava več testov takšnega tipa, za različne podmnožice, saj je na tak način lažje zaznati večje padce v uspešnosti napovednega modela iz iteracije v iteracijo. Na tej točki je smiselno izpostaviti tudi, da je validacijo kakovosti napovednega modela nujno potrebno opraviti pred namestitvijo modela v izvajalno okolje. [13] Pri procesu zagotavljanja kakovosti s preverjanjem uspešnosti modela pa ima velik pomen tudi izbira metrike, s katero merimo uspešnost napovednega modela. Med pogosteje uporabljanimi metrikami je zagotovo metrika točnost (angl. accuracy), ki predstavlja delež pravilno napovedanih primerkov. Zaradi enostavnosti same metrike pa lahko le-ta prikrije OTS 2019 SODOBNE INFORMACIJSKE TEHNOLOGIJE IN STORITVE 25 G. Vrbančič in V. Podgorelec: Korak k samodejni integraciji in testiranje napovednih modelov strojnega učenja pomembne informacije o uspešnosti napovednega modela. Zato je priporočljiva uporaba kombinacij metrik oz. uporaba metrik, ki bolj celovito kot metrika točnost predstavljajo uspešnost napovednega modela (npr.: F1 metrika, AUC metrika). [2] Prav tako kot pri tipični programski opremi je tudi pri napovednih modelih nujno zagotoviti možnost enostavne povrnitve modela na prejšnjo verzijo v primeru, da je zaznana nepravilnost v delovanju oz. v primeru nepričakovanega padca uspešnosti napovednega modela strojnega učenja. [13] PRAKTIČNI PRIMER Za praktični prikaz primera vpeljave razvoja napovednih modelov z uporabo razširjenega procesa CI smo si zastavili razvoj spletne aplikacije – sistem za tehnično podporo s samodejno kategorizacijo in prioretizacijo uporabniških zahtevkov. Razvit sistem naslavlja scenarij (Slika 4), kjer uporabniki preko pročelne spletne aplikacije vnesejo zahtevek tehnični podpori, ta pa je preko sporočilne vrste dostavljen zalednemu delu spletne aplikacije. Zaledni del spletne aplikacije preko REST komunicira z napovednim modelov strojnega učenja, izpostavljenim v obliki spletne storitve, ki prejet zahtevek kategorizira in mu določi prioriteto. Obdelan uporabniški zahtevek je nato posredovan na pročelni del spletne aplikacije, namenjen tehnični podpori. Tehnološki sklad, izbran za implementacijo praktičnega primera, sestoji iz sporočilne vrste RabbitMQ, zaledni del spletne storitve je implementiran z uporabo Java ogrodja Spring Boot, pročelna aplikacija temelji na knjižnici React, napovedna modela (en zadolžen za kategorizacijo, drugi pa za prioretizacijo) sta razvita s pomočjo Pythonove knjižnice sklearn ter servirana v obliki REST s pomočjo ogrodja Flask. Vsak izmed omenjenih delov spletne aplikacije je za namen namestitve na gruči Docker Swarm zapakiran v Docker sliko, za orkestracijo zabojnikov skrbi Portainer, za verzioniranje kode ter kot sistem za neprekinjeno integracijo in dostavo pa služi GitLab. Slika 4: Scenarij praktičnega primera – sistem za tehnično podporo s samodejno kategorizacijo in prioretizacijo uporabniških zahtevkov. Pri tem praktičnem primeru se bomo osredotočili na razvoj in integracijo storitve, upoštevajoč smernice, ki smo jih nakazali oziroma predstavili v prejšnjem poglavju. Cilj je vpeljati razvoj napovednega modela strojnega učenja v predstavljen razširjen proces CI. Slika 5 prikazuje prilagojen koncept vpeljave razvoja napovednega modela strojnega učenja v proces samodejne neprekinjene integracije. V našem primeru je programska koda kot tudi učni podatki shranjena v sistemu za verzioniranje programske kode Git. Ob vsaki spremembi se torej sproži proces neprekinjene integracije, ki ga v našem primeru izvaja t.i. GitLab Runner. GitLab Runner je uraden GitLabov agent, namenjen za izvajanje tovrstnih nalog pri uporabi sistema GitLab, ki ima vgrajeno samodejno poročanje, kar nam omogoča sprotno spremljanje poteka procesa samodejne neprekinjene integracije. V zadnji fazi omenjen agent zgradi Docker sliko, ki napovedna modela zapakira v obliko, neodvisno od platforme in pripravljeno za takojšnje izvajanje. Sliko nato shrani v privaten register slik, integracijski sistem pa na orkestracijskem sistemu sproži zahtevek za namestitev. Kot omenjeno smo za 26 OTS 2019 SODOBNE INFORMACIJSKE TEHNOLOGIJE IN STORITVE G. Vrbančič in V. Podgorelec: Korak k samodejni integraciji in testiranje napovednih modelov strojnega učenja orkestracijski sistem izbrali Portainer, ta je zadolžen za izvajanje, orkestracijo ter posodabljanje storitev, definiranih znotraj našega aplikacijskega sklada (HelpDeskAI). V primeru, da kakšen izmed korakov integracije ni uspešen, se celoten proces zaustavi, s čimer ne pridemo do situacije, ko bi namestili nedelujočo storitev oz. storitev, ki ni v skladu z našimi zahtevami in pričakovanji. Slika 5: Proces samodejne neprekinjene integracije za razvoj napovednega modela strojnega učenja. Sam proces integracije napovednega modela smo opravili v treh korakih (Slika 6): testiranje, učenje in gradnja. Ker so uporabljeni učni podatki bili že predhodno prečiščeni in preoblikovani v obliko, primerno za učenje napovednih modelov, smo korak pred-procesiranja izpustili, sicer bi v tipičnem primeru tak korak bil nujno potreben. V našem primeru se je tako integracija pričela s korakom testiranja, kjer smo poleg poznanih konceptov iz programskega inženirstva testirali tudi podatke. Preverjali smo predvsem nabor vrednosti posameznih značilk znotraj učne množice, mogoče pa bi bilo opraviti preverjanje distribucije testnih primerkov, preverjanje informacijskih vrednosti posameznih značilk, ipd. Slika 6: Koraki integracije napovednega modela. V drugem koraku smo izvedli učenje in evalvacijo obeh naučenih modelov. Kot rečeno smo učili dva specializirana modela. Naloga prvega je glede na podano vsebino zahtevka določiti kategorijo, v katero zahtevek spada, naloga drugega pa je določiti prioriteto posameznega zahtevka. Oba modela smo učili na enak način, z uporabo klasifikatorja naivni Bayes ter razdelitvijo učnih in testnih podatkov v razmerju 80 % proti 20 %. Uporabili pa smo tudi pristop grid search za iskanje optimalne nastavitve hiper-parametrov klasifikatorja. Po učenju posameznega modela smo izračunali ter izpisali tudi matriko zmede z osnovnimi vrednostmi klasifikacijskih metrik (Slika 7) kot so točnost, natančnost (angl. Precision), priklic (angl. Recall) ter F1 metriko. Uspešnost posameznega napovednega modela smo evalvirali na podlagi povprečne obtežene vrednosti F1 metrike ter določili mejo 80 %, nad katero je napoveden model dovolj uspešen za uporabo oz. namestitev. V primeru, da model ne doseže vnaprej določene meje, se faza zaključi kot neuspešna ter se tako prekine celoten proces samodejne neprekinjene integracije. Na tej točki bi veljalo izpostaviti, da bi za namene evalvacije napovednih modelov, podobno kot je za ocenjevanje kvalitete programske kode, prav prišla razna ogrodja, knjižnice in sistemi, ki bi omogočali lažjo integracijo in pregled nad rezultati evalvacije. V našem primeru je bilo namreč potrebno evalvacijo in mehanizme preverjanja in prestajanja uspešnosti implementirati ročno. OTS 2019 SODOBNE INFORMACIJSKE TEHNOLOGIJE IN STORITVE 27 G. Vrbančič in V. Podgorelec: Korak k samodejni integraciji in testiranje napovednih modelov strojnega učenja Slika 7: Matrika zmede in vrednosti izbranih metrik napovednega modela za klasifikacijo zahtevkov v kategorije. Po uspešno prestani fazi učenja in evalvacije napovednih modelov se v fazi grajenja naučena modela s pomočjo ogrodja Flask izpostavita v obliki REST, celotna storitev pa se nato zapakira v Docker sliko, ki jo naložimo na privaten register Docker slik. Integracija je z uspešno izvedenim zadnjim korakom tako zaključena, integracijski sistem pa za potrebe namestitve izvrši zahtevek na orkestracijski sistem Portainer. Ta poskrbi za prenos najnovejše Docker slike iz registra slik ter zagon zabojnika na podlagi prenesene slike. V kolikor je zagon zabojnika uspešen, je predhodna različica storitve zabojnika zamenjana za novejšo. Iz slike 8 so razvidni zaslonski posnetki pročelnega dela razvitega sistema za tehnično podporo. Zgornji dve sliki prikazujeta prazna pogleda za uporabnika (levo) in za člana tehnične podpore (desno). Spodaj levo je prikazan vnos zahtevka s strani uporabnika, na desni strani pa je prikazan ta isti zahtevek po opravljeni kategorizaciji in prioretizaciji s strani naših razvitih napovednih modelov. Slika 8: Zaslonske slike spletne aplikacije za tehnično podporo. 28 OTS 2019 SODOBNE INFORMACIJSKE TEHNOLOGIJE IN STORITVE G. Vrbančič in V. Podgorelec: Korak k samodejni integraciji in testiranje napovednih modelov strojnega učenja Obstoječ sistem bi bilo smiselno razširiti s hrambo sprememb kategorij oz. stopnje pomembnosti s strani članov tehnične podpore. Hrambo teh sprememb bi lahko izrabili za pridobivanje novih oz. izboljšanih učnih podatkov, s čimer bi dodatno pripomogli k večji uspešnosti napovednega modela. V takšnem primeru bi dodatno veljalo uvesti tudi periodičen zagon cikla neprekinjene integracije napovednega modela, saj bi bilo ob pogostih spremembah učnih podatkov s strani članov tehnične podpore smiselno tudi pogosteje učiti in evalvirati napovedna modela. ZAKLJUČEK V prispevku smo na začetku predstavili osnoven koncept samodejne neprekinjene integracije pri razvoju konvencionalne programske opreme ter izpostavili ključne prednosti uporabe takšnega pristopa. V nadaljevanju smo obstoječ, uveljavljen koncept, razširili ter prilagodili za potrebe razvoja in integracije napovednih modelov strojnega učenja. Naslovili smo nekaj ključnih izzivov, ki jih prinaša vpeljava razvoja napovednih modelov, ter izpostavili morebitne smernice oziroma dobre prakse. Predlagane smernice in dobre prakse smo predstavili tudi v obliki praktičnega primera, kjer smo z vpeljavo napovednih modelov strojnega učenja razvili sistem za tehnično podporo, ki samodejno, z uporabo napovednih modelov, kategorizira in prioretizira posamezne uporabniške zahtevke. Izpostaviti velja, da je poleg manka uveljavljenih dobrih praks in smernic, kot je to pri programskem inženirstvu, mogoče zaznati tudi manko namenskih orodij ali knjižnic, še posebej za potrebe evalvacije napovednih modelov ter generiranja in pregleda poročil. Menimo, da bo v naslednjih letih področje integracije in evalvacije napovednih modelov ter zagotavljanje kakovosti le-teh doživelo silovit razcvet, saj potreba po rešitvah, ki naslavljajo omenjeno problematiko v gospodarstvu iz leta v leto narašča. LITERATURA [1] S. Hamdan in S. Alramouni, „A Quality Framework for Software Continuous Integration“, Procedia Manuf. , let. 3, str. 2019–2025, 2015. [2] A. Herczeg, „Continuous Integration in Machine Learning Towards fully automated continuous learning“, 2018. [3] K. Beck, „Embrance Change with Extreme Programming“, IEEE Comput. Mag. , št. c, str. 70–77, 1999. [4] P. M. Duvall, S. Matyas, in A. Glover, Continuous integration: improving software quality and reducing risk. Pearson Education, 2007. [5] M. Fowler in M. Foemmel, „Continuous integration“, Thought-Works) http//www. thoughtworks. com/Continuous Integr. pdf, let. 122, str. 14, 2006. [6] M. Erder in P. Pureur, „Continuous Architecture and Continuous Delivery“, v Continuous Architecture, Elsevier, 2016, str. 103–129. [7] M. Leppänen idr. , „The highways and country roads to continuous deployment“, IEEE Softw. , let. 32, št. 2, str. 64–72, mar. 2015. [8] A. Debbiche, M. Dienér, in R. Berntsson Svensson, „Challenges When Adopting Continuous Integration: A Case Study“, Springer, Cham, 2014, str. 17–32. [9] M. Shahin, M. Ali Babar, in L. Zhu, „Continuous Integration, Delivery and Deployment: A Systematic Review on Approaches, Tools, Challenges and Practices“, IEEE Access, let. 5, št. Ci, str. 3909–3943, 2017. [10] G. G. Claps, R. Berntsson Svensson, in A. Aurum, „On the journey to continuous deployment: Technical and social challenges along the way“, v Information and Software Technology, 2015, let. 57, št. 1, str. 21–31. [11] C. Renggli idr. , „Continuous Integration of Machine Learning Models with ease.ml/ci: Towards a Rigorous Yet Practical Treatment“, 2019. [12] B. Derakhshan, „Continuous Deployment of Machine Learning Pipelines“, str. 397–408, 2019. [13] E. Breck, S. Cai, E. Nielsen, M. Salib, in D. Sculley, „The ML test score: A rubric for ML production readiness and technical debt reduction“, v Proceedings - 2017 IEEE International Conference on Big Data, Big Data 2017, 2018, let. 2018-Janua, str. 1123–1132. OTS 2019 ADVANCED INFORMATION TECHNOLOGY AND SERVICES M. Heričko in K. Kous (eds.) D3LEDGER: THE DECENTRALIZED DIGITAL DEPOSITORY PLATFORM FOR ASSET MANAGEMENT BASED ON HYPERLEDGER IROHA NIKOLAI IUSHKEVICH,1ANDREI LEBEDEV, ROK ŠKETA, MAKOTO TAKEMIYA Abstract: Blockchains organize data in a linked list of tamper-resistant blocks. Transactions are appended to the blockchain via the decision of a decentralized network. Tokenized securities provide investors with new transparency and opportunities for liquidity by decreasing times for carrying out traditional capital market operations. This allows creating a global post-trade infrastructure for digital assets: tokenized securities and security tokens. This article describes how the D3ledger project allows the tokenization of traditional securities, as well as the safekeeping of security and currency tokens from the Ethereum and Bitcoin blockchain networks, using Hyperledger Iroha as an underlying blockchain network. Key words: D3ledger, Hyperledger Iroha, Bitcoin, Ethereum, digital assets, tokenization, depository CORRESPONDENCE ADDRESS: Nikolai Iushkevich, Soramitsu Labs, Russia, e-mail: nikolai@soramitsu.co.jp. Andrei Lebedev, Soramitsu Labs, Russia, e-mail: andrei@soramitsu.co.jp. Rok Šketa, KDD, Central Securities Clearing Corporation, Slovenia, e-mail: rsketa@kdd.si. Makoto Takemiya, Soramitsu Holdings, Switzerland, e-mail: takemiya@soramitsu.co.jp. https://doi.org/10.18690/978-961-286-282-4.4 ISBN 978-961-286-282-4 Available at: http://press.um.si 30 OTS 2019 SODOBNE INFORMACIJSKE TEHNOLOGIJE IN STORITVE N. Yushkevich, A. Lebedev, R. Šketa, M. Takemiya: D3ledger: The Decentralized Digital Depository Platform for Asset Management Based on Hyperledger Iroha INTRODUCTION 1.1 Problem In recent years, distributed systems have received significant attention from institutions, as new blockchain- based systems have emerged that promise to provide a transition from centralized business models to decentralized. Bitcoin was the first successful implementation of a blockchain-based decentralized system to create a so-called cryptocurrency. The idea, proposed by Satoshi Nakamoto in the Bitcoin paper [1], was to create a digital asset based on cryptographic proofs to enforce digital scarcity, rather than trust. Bitcoin thus intermediates third parties, because the system as a whole is the third party, enforcing consensus constraints as a form of third-party account. Nick Szabo expressed similar ideas as requirements for so-called smart contracts, where asymmetric cryptography and tamper-evident transaction logs can be used to create automatically executing contracts, thus removing counterparty risk and reducing the need for reliance upon mediators or other third parties [2]. Smart contracts were implemented in a restricted form in Bitcoin as a non-Turing complete scripting language for output address scripts, that checks inputs for a given logical statement expressed in the script when an address is used in the input of a transaction. Later on, Ethereum was released as a platform for decentralized applications. The Ethereum platform allows the deployment of Turing-complete bytecode to a distributed network of nodes. Once deployed, the bytecode cannot be modified, however every network participant can execute and validate state changes in a key-value store. The deployed bytecode is called a smart-contract. A deployed smart contract can be triggered by sending a transaction to invoke a method and attaching a transaction fee as an incentive for a miner to include the transaction in a block. As of May 6th 2019, there are 185,189 ERC-20 token contracts [3] and 1,460 ERC-721 token contracts [4] deployed in Ethereum – these tokens are used for buying services, gambling, speculation, and other purposes. Bitcoins, tokens used as incentives for block creators (miners) in the Bitcoin network, increased their value from 0.003 USD in Mar 2010 to 3,930 USD in February 2019 per 1 BTC [5]. The reason why Bitcoin, tokenized securities and security tokens gained their value over the last years is linked to the following properties of such assets [6]:  asymmetric cryptography provides a solution for double-spending problem of payments with tokenized assets  increased global acceptance rate of such assets  scarcity of some of the assets, or limited monetary supply for assets like Bitcoin  decentralization, and resulting improbability of a third, central party intervention to value manipulation in case of demand fluctuations Although these factors refer mainly to phenomenon of currency tokens, they also give a clue to the rising popularity of the idea of asset-backed tokens. Tokenization of assets enables creation of value added services for investors, issuers and professional markets players, that goes far beyond what traditional book-entry-and- messaging paradigm can offer in terms of efficiency and digitization level. The direct access of all market participants into global decentralized platforms that use tokens as a tool to transfer ownership rights, and smart contracts as a tool allows a significant increase of speed, and decrease of risks and costs of settlement and asset servicing on global markets. While this form of assets has its advantages – it is hard to apply existing business processes in capital markets to security tokens in public networks. Public blockchain networks provide participants anonymity (network peers and transaction creators), and inability to control assets in the lack of private key presence. There is a lack of governance for assets exchange processes. Infrastructural centralization of exchanges for cryptoassets and the inability to revert fraudulent or error actions (similar to recent transfer from Canadian investment fund to a Bitcoin exchange cold wallet that passed away [7]) makes the risks, related to investments in security tokens, Bitcoin, Ethereum, ERC20-based tokens or other currency tokens, prevail financial appeal for institutional investors. OTS 2019 SODOBNE INFORMACIJSKE TEHNOLOGIJE IN STORITVE 31 N. Yushkevich, A. Lebedev, R. Šketa, M. Takemiya: D3ledger: The Decentralized Digital Depository Platform for Asset Management Based on Hyperledger Iroha 1.2 Solution This problem has been already perceived by investment funds, central securities depositories in certain jurisdictions. Technical solutions, based on distributed-ledger technology (DLT or private blockchains) for the problems mentioned above already exist in a form of proof of concept projects: e.g. project Ubin in Singapore [8], or project Jasper in Canada [9]. International Securities Services Association, comprised of participants from central securities depositories (CSDs) and central counterparty clearing houses (CCPs), has already proposed recommendations for crypto-assets infrastructure [10]. D3ledger solution has been designed with these recommendations in mind, and provides a solution which is horizontally scalable. D3ledger (Decentralized Digital Depository) is a decentralized financial infrastructure that enables market participants to safely work with crypto and traditional financial assets. D3ledger uses distributed ledger technology to provide safekeeping, settlement, and asset servicing functions accessible without any intermediaries. Such architecture guarantees the high level of robustness and reliability. Unlike exiting DLT initiatives, D3ledger is going to operate across several jurisdictions, providing horizontally scalable solution to institutional investors and minimizing risks of political and infrastructural intervention in its architecture [11]. This article focuses on technical aspects of D3ledger project: how securities are tokenized on Hyperledger Iroha platform, that acts as a intermediary blockchain; and how D3ledger operates with security tokes from Bitcoin and Ethereum networks via a two-way peg. HYPERLEDGER IROHA: DLT-PLATFORM FOR ASSET AND IDENTITY MANAGEMENT Hyperledger Iroha [12] is unique implementation of a blockchain platform governed by Hyperledger and hosted by The Linux Foundation. Hyperledger Iroha is written in C++, incorporating chain-based Byzantine Fault Tolerant consensus algorithm, called Yet Another Consensus [13]. Peers in Iroha network are universal — which means that every peer acts as a validator and has the same vote weight as any other peer during network consensus. 2.1 Iroha API: Commands and Queries The manipulation of accounts and digital assets is supported with a set of commands and queries. For example, CreateAsset command allows creation of a new asset, AddAssetQuantity command increases monetary supply of a given asset; GetAccountAssets query will return the state of assets linked to the account [14]. Commands are atomic state-changing actions, that can be put in a single transaction, whereas Queries allow Iroha clients to get a snapshot of peer state, called World State View – or in a simple words to get: balance of account, history of transactions, and account information. 2.2 Relational state In order to perform actions, expected from Iroha API, peers construct relational state over the data, stored in blockchain. The state is stored in PostgreSQL and used during the state construction and subsequent validation of API calls [14]. In a couple of sections below, we give an in-depth example of how business objects are represented. 2.2.1 Account Iroha entity which is able to perform a specified set of actions. Each account belongs to one of the existing domains. An account has some number of roles (can be none) associated. The roles are just a collection of permissions. 32 OTS 2019 SODOBNE INFORMACIJSKE TEHNOLOGIJE IN STORITVE N. Yushkevich, A. Lebedev, R. Šketa, M. Takemiya: D3ledger: The Decentralized Digital Depository Platform for Asset Management Based on Hyperledger Iroha account Attribute Datatype account_id VARCHAR(288) domain_id VARCHAR(255) quorum INT data JSONB JSONB 2.2.2 Asset Any commodity or value represented as an asset. Each asset relates to one of the existing domains in Iroha. asset account_has_asset Attribute Datatype Attribute Datatype asset_id VARCHAR(288) account_id VARCHAR(288) domain_id VARCHAR(255) asset_id VARCHAR(288) precision INT amount DECIMAL data JSON 2.3 Role-Based Access Control Decentralized permission model, based on role-based access control, allows Iroha accounts to perform state- changing actions and retrieve information only if it is permitted to an assigned role. This allows separation of accounts related to tokenization, audit, and asset transfers. Initial roles and permissions [14] are set in the genesis (initial) block of the blockchain. Roles and their assignment to users might be dynamic if corresponding changes exist in the genesis block. 2.4 Universal Peer Role Unlike some of the DLT frameworks, in order to establish and maintain the network of Iroha nodes, system administrators they only need to deploy Iroha peer. Every peer has the same rank and responsibilities for validation, which makes the system decentralized [15]. 2.5 Multi-signature transactions Transactions in Iroha require attached signatures since Iroha peers use asymmetric crptography for validation of incoming messages. Some of the transactions may have more than a single signature attached – they are called multisignature transactions. Multisigniture is a powerful feature that allows decentralization of transaction generation. Required number of signatures is associated with 'quorum', a number associated to an Account that defines minimum number of signatures that are required for transaction to be successfully validated. By increasing the quorum, Iroha clients can improve security of their accounts. Peers only process transactions, containing M out of N signatures, where M is the quorum number and N is the total amount of public keys, associated with the account. By default, M, N = 1. However, Iroha clients do not have to always form and send transactions, containing exactly M signatures as peers share transactions [14] using a Gossip protocol [16]. Therefore Iroha clients may send partially-signed transactions to any Iroha peer in the network, expecting that in the end their transactions will gather enough signatures – and will be passed to the next consensus round for validation. 2.6 Transaction Batches Transactions batch is a feature that allows sending several transactions at once to Iroha peer, preserving their order. A batch can contain transactions created by different accounts. In this case they have to be signed by every account in order to pass validation step. Partially-signed transactions, that don't contain enough signatures for validation can be retrieved from MST endpoint, similarly to a multi-signature transaction. OTS 2019 SODOBNE INFORMACIJSKE TEHNOLOGIJE IN STORITVE 33 N. Yushkevich, A. Lebedev, R. Šketa, M. Takemiya: D3ledger: The Decentralized Digital Depository Platform for Asset Management Based on Hyperledger Iroha Each transaction within a batch includes batch meta information. Batch meta contains batch type identifier (atomic or ordered) and a list of reduced hashes of all transactions within a batch. The order of hashes prescribes transactions sequence. MANAGEMENT OF SECURITIES: IROHA FEATURES APPLIED TO D3LEDGER NODES D3ledger nodes provide different services, namely transaction validation using custom business logic and notary that tracks events on external public networks: Bitcoin and Ethereum. They are responsible for registering facts of security creation, distribution, and fulfillment of corporate actions. This section describes actions, possible in D3ledger network, and how they are made on Iroha peer level. 3.1 Tokenization Tokenization process is a process of asset issuance, where asset represent specific security, and possession of any asset by network participant represents ownership rights for a given security. With respect to traditional securities D3ledger is particularly good for debt and equity securities. For derivative securities such as futures, options and similar instruments D3ledger network has to have connection to data source about conditions that trigger derivative contract condition. Neither D3ledger node nor Iroha node are limited in term of architecture – in fact Iroha was used in a project for weather derivatives [17], where Iroha was used for interest rate payouts based on fluctuations of weather conditions. Tokenization process essentially consists of a single transaction with CreateAsset command. This command has to specify:  asset name – the identifier of a security  domain – domain, or managing organization, associated with the asset and responsible for corporate actions over the security  precision – degree of allowed asset fractionalization Asset creator has to possess corresponding permissions in their role set. After this transaction is finalized (written in blockchain) the asset is created and now can be distributed in the network. If a governing organization would like to change supply of a given asset or security they may initiate transaction with any of the following commands:  AddAssetQuantity – issuance of additional tokens to the governing Iroha account (money creator)  SubtractAssetQuantity – burning tokens (taking assets from circulation) from the governing Iroha account (money creator) It is worth mentioning that Iroha permission model allows limiting asset supply upper and lower boundaries if a particular Iroha network does not have assets creation and quantity modification rights in genesis block. As a result there isn't any role assigned to modify asset supply. It might be useful to tokenize a fraction of possessed assets that cannot modify their supply amount in order to realize economic models similar to Bitcoin network. 3.2 Delivery-Versus-Payment Settlements Delivery versus payment (DVP) is a securities industry settlement method that guarantees transfer of securities only after payment has been made. DVP stipulates that the buyer's payment for securities must be made prior to or at the same time as the delivery of the security [18]. In case of Iroha this settlement might be done with a transaction batch, where sender (party A) puts:  Delivery – transaction with a transfer from party A to party B  Payment – transaction with a transfer from party B to party A  signature(s) of party A – the batch can be partially-signed or fully-signed 34 OTS 2019 SODOBNE INFORMACIJSKE TEHNOLOGIJE IN STORITVE N. Yushkevich, A. Lebedev, R. Šketa, M. Takemiya: D3ledger: The Decentralized Digital Depository Platform for Asset Management Based on Hyperledger Iroha This transaction batch is sent to any Iroha peer, which processes the batch similarly to any other partially- signed transaction: party B can retrieve information about batches that require signing from any peer and similarly can send their signatures to any Iroha peer in any arbitrary order. When both parties signed-off the batch it is processed during the next consensus round. If none of the validation rules are violated (i.e. all parties have delivery and payment as payment for securities is not made prior to the delivery), the atomic swap, or DVP settlement operation is done and blockchain is appended with a block containing this batch of transactions. 3.3 Asset transfer In order to use D3ledger as a payment network to perform actions related to capital markets payments Iroha features an atomic action of asset transfer. Such transaction may have single or more TransferAsset commands, containing:  Source account ID – ID of the account to withdraw the asset from  Destination account ID – ID of the account to send the asset to  Asset ID of party A – ID of the asset to transfer  Description of party A – message to attach to the transfer  Amount of party A – amount of the asset to transfer Straightforwardness of this API allows its extension and implementation of arbitrary validation rules over its description message or account information of sender or receiver. D3LEDGER INTERCHAIN METHOD: TWO-WAY PEG WITH A FEDERATION OF NOTARIES In order to provide a seamless interface between D3ledger and existing public networks with security tokens, D3ledger node features notary services, that monitor actions happening in a public network and perform a group decision on asset tokenization and transfers. One of the main requirements for the system design was atomicity of transfers between public blockchains such as Ethereum or Bitcoin and D3ledger. We define atomic payment as confirmed if and only if both sides have completed their payments, and the corresponding transactions are validated and stored in the ledgers. The technical problem to be addressed were probabilistic consensus algorithms, because several forks, or different versions of the chain could exist at one point of time. The proposed solution for the atomicity requirement is to minimize the probability that the payment transaction will only appear in a fork, and to use an intermediate ledger with a deterministic consensus algorithm. Two-way peg [19] is an exchange protocol between a main chain and a secondary chain and vice versa, which does not require to use a third party. In other words, the exchanges between public networks should not include third parties. A two-way peg is a voting system, where votes are defined by the consensus algorithm of a particular system, such as digital signatures or hashing power. Multi-signature federation of notaries [20] is a group of identities in blockchains which control a single multi- signature account in each of the chains. In the next subsections we describe the general pipelines for D3ledger use cases. 4.1 Cross-chain Deposit The following steps describe the case when an asset owner wants to deposit tokens already owned in Bitcoin or Ethereum to the D3ledger system in order to use them to trade for other tokens.  Create a new user account in D3ledger system by generating their keys (Registration service)  There will be an empty account — so we need to deposit assets  D3 client deposits tokens to a specified address in Ethereum or Bitcoin  Wait until this transaction is finalized  Each D3 notary certifies the fact of transfer by a multi-signature transaction  When everyone certified — the tokens are created in Iroha and user can check the balance in web app OTS 2019 SODOBNE INFORMACIJSKE TEHNOLOGIJE IN STORITVE 35 N. Yushkevich, A. Lebedev, R. Šketa, M. Takemiya: D3ledger: The Decentralized Digital Depository Platform for Asset Management Based on Hyperledger Iroha 4.2 Cross-chain Withdrawal The withdrawal process, when an asset owner wants to withdraw tokens to their native trade systems to use them for payments or safekeeping outside D3ledger system, is described in the next steps.  Create a withdrawal request in D3 to get money back to Ethereum or Bitcoin from Iroha  This request is noticed by Withdrawal service  This service goes over each notary and asks them to present a proof (signed approval of withdrawal)  When all proofs are collected — Withdrawal service asks native chain contract to check proofs and send money back  Contract sends tokens to a specified address in request 4.3 Settlement The steps below describe the algorithm when an asset owner wants to exchange tokens in D3ledger with other participants of the system to their tokens atomically so that the asset owner can perform settlements for diversification of owned securities for hedging purposes.  Create a settlement request by specifying a counterparty and amount  This request is stored in pending transaction storage. This pending transaction is propagated in notary network  Another D3 client checks their list of pending exchanges and accepts or declines it  A transaction signed by both parties is sent for processing by notaries  A corresponding batch transaction is stored in the ledger and both parties see it in their accounts CONCLUSION D3ledger network is simple, yet effective financial infrastructure solution for institutional investors. This service increases liquidity of assets by featuring horizontal scalability across jurisdictions that have agents connected to D3ledger network through D3ledger nodes. The underlying technology for asset tokenization supports debt, equity, and derivative securities by using Hyperledger Iroha API. Delivery-versus-payments are easy to perform and can be extended to any realization of escrow payments via Iroha's transaction batch. Two- way peg, that is used for tokenization of security tokens, currently supports Bitcoin and Ethereum networks, and can potentially support other chains, featuring multi-signature accounts. The code for D3ledger is open- source and is available at https://github.com/d3ledger/. REFERENCES [1] Satoshi Nakamoto. Bitcoin: A peer-to-peer electronic cash system, 2009. [2] Nick Szabo. Formalizing and securing relationships on public networks. First Monday – Peer-reviewed Journal on the Internet, 2(9), September 1997. [3] etherscan.io. Etherscan token tracker. URL: https://etherscan.io/tokens, 2019. [4] etherscan.io. Etherscan erc-721 token tracker page. URL: https://etherscan.io/tokens-nft, 2019. [5] coinmarketcap.com. Capitalization of bitcoin. URL: https://coinmarketcap.com/currencies/bitcoin/, Apr 2019. [6] Marshall W. van Alstyne. Why bitcoin has value. Commun. ACM, 57(5):30–32, 2014. [7] Daniel Shane. A crypto exchange may have lost 145 million usd after its ceo suddenly died. CNN. URL: https://edition.cnn.com/2019/02/05/tech/quadriga-gerald-cotten-cryptocurrency/index.html, 2019. [8] Singapore Exchange, Monetary Authority of Singapore, and Deloitte. Delivery versus payment on distributed ledger technologies project ubin. 2018. [9] Bank of Canada, TMX Group, Payments Canada, Accenture, and R3. Jasper phase iii: Securities settlement using distributed ledger technology. 2018. 36 OTS 2019 SODOBNE INFORMACIJSKE TEHNOLOGIJE IN STORITVE N. Yushkevich, A. Lebedev, R. Šketa, M. Takemiya: D3ledger: The Decentralized Digital Depository Platform for Asset Management Based on Hyperledger Iroha [10] International Securities Services Association ISSA. Infrastructure for crypto-assets: A review by infrastructure providers. 2018. [11] Artem Duvanov. D3ledger blog: On vertical and horizontal blockchains. D3ledger.com, URL: https://d3ledger.com/verticalvshorizontal; 2019: [12] Linux Foundation. Hyperledger iroha. URL: https://www.hyperledger.org/projects/iroha, 2019. [13] Fedor Muratov, Andrei Lebedev, Nikolai Iushkevich, Bulat Nasrulin, and Makoto Takemiya. Yac: Bft consensus algorithm for blockchain. 2018. [14] Hyperledger Iroha Documentation. Api documentation. URL: https://iroha.readthedocs.io/, 2019. [15] Mari Eagar. What is the difference between decentralized and distributed systems? Medium. URL: https://medium.com/distributed-economy/what-is-the-difference-between-decentralized-and- distributedsystems-f4190a5c6462, Nov 2017. [16] Demers Alan and Greene Dan. Epidemic Algorithms for Replicated Database Maintenance. Association For Computing Machinery, proceedings of the sixth annual acm symposium on principles of distributed computing edition, 1987. [17] Mondovisione.com. Soramitsu announces iroha: A proposal to the linux foundation’s hyperledger. http://www.mondovisione.com/media-and-resources/news/soramitsu-announces-iroha-a-proposal-to- thelinux-foundations-hyperledger-pr/, 2016. [18] Investopedia. Delivery versus payment (dvp): What guarantees do you have? URL: https://www.investopedia.com/terms/d/dvp.asp, 2019. [19] Adam Back, Matt Corallo, Luke Dashjr, Mark Friedenbach, Gregory Maxwell, Andrew Miller, Andrew Poelstra, Jorge Timón, and Pieter Wuille. Enabling blockchain innovations with pegged sidechains. URL: https://blockstream.com/sidechains.pdf, page 72, 2014. [20] Johnny Dilley, Andrew Poelstra, Jonathan Wilkins, Marta Piekarska, Ben Gorlick, and Mark Friedenbach. Strong federations: An interoperable blockchain solution to centralized third party risks. CoRR, abs/1612.05491, 2016. OTS 2019 SODOBNE INFORMACIJSKE TEHNOLOGIJE IN STORITVE M. Heričko in K. Kous (ur.) UPORABA PLATFORME IOTA ZA ZBIRANJE IOT PODATKOV VID KERŠIČ, MUHAMED TURKANOVIĆ1 Povzetek: Tehnologija veriženja blokov (ang. blockchain) kot del tehnologije porazdeljene knjige (ang. distributed ledger technology - DLT) ima prednosti kakor tudi slabosti. Poglavitna slabost je razširljivost, saj je tehnologija neprimerna za sočasno procesiranje velike količine podatkov. Omenjeno pomanjkljivost naslavljajo nove generacije platform DLT. Primer takšne je platforma IOTA, ki je osredotočena na domeno Interneta stvari in z inovativnim pristopom naslovi problem razširljivosti. V prispevku bomo predstavili podrobnosti platforme IOTA in njene poglavitne prednosti. Izpostavili bomo spremenjeno podatkovno strukturo, ki ne temelji na med seboj povezanih skupnih transakcij - blokih, temveč na usmerjenem acikličnem grafu transakcij, imenovan Tangle. Prav tako bomo predstavili strukturo porazdeljenega omrežja in algoritem porazdeljenega soglasja na katerem temelji. Osredotočili se bomo na predstavitev uporabe platforme na primeru zbiranja in sledenja senzorskih podatkov s pomočjo protokola Masked Authenticated Messaging (MAM). Opisali bomo različne načine uporabe slednjega protokola in njihove praktične primere. Zaključili bomo z analizo prednosti in slabosti, ki jih platforma ponuja, in pregledom trenutnega stanja razvoja IOTA omrežja. Ključne besede: IOTA, DLT, IOT, senzorski podatki, MAM. NASLOVA AVTORJEV: Vid Keršič, študent, Univerza v Mariboru, Fakulteta za elektrotehniko, računalništvo in informatiko, Blockchain Lab:UM, Maribor, Slovenija, e-pošta: vid.kersic@student.um.si. dr. Muhamed Turkanović, docent, Univerza v Mariboru, Fakulteta za elektrotehniko, računalništvo in informatiko, Blockchain Lab:UM, Maribor, Slovenija, e-pošta: muhamed.turkanovic@um.si. https://doi.org/10.18690/978-961-286-282-4.5 ISBN 978-961-286-282-4 Dostopno na: http://press.um.si 38 OTS 2019 SODOBNE INFORMACIJSKE TEHNOLOGIJE IN STORITVE V. Keršič, M. Turkanović: Uporaba platforme IOTA za zbiranje IOT podatkov UVOD Tehnologija veriženja blokov (ang. blockchain) kot del tehnologije porazdeljene knjige (ang. distributed ledger technology - DLT) je od svojega nastanka leta 2008 pokazala številne prednosti kakor tudi slabosti [1]. Zaradi slednjih so se razvile nove generacije platform DLT, ki jih poskušajo na inovativen način odpraviti in pri tem ne vplivati negativno na prednosti tehnologije. Ena izmed poglavitnih slabosti je razširljivost, saj je tehnologija neprimerna za sočasno procesiranje velike količine podatkov [2]. Omenjena slabost preprečuje uporabo tehnologije v primerih, kjer uporabniki omrežja pošiljajo veliko število transakcij v zelo kratkem časovnem intervalu. Omenjen primer se pojavi v domeni Interneta stvari (Internet of things - IOT), za katero je značilna velika količina podatkov, generirana iz najrazličnejših virov (naprav in senzorjev) v kratkih časovnih intervalih. Primer platforme, temelječe na DLT, ki rešuje omenjen problem, je IOTA, ki z inovativnim pristopom naslovi problem razširljivosti. V prispevku bomo predstavili platformo IOTA. Osredotočili se bomo na posebnosti le te, izpostavili poglavitne prednosti v primerjavi z drugimi DLT platformami in predstavili uporabo platforme za primer zbiranja in sledenja senzorskih podatkov s pomočjo protokola Masked Authenticated Messaging (MAM) [3]. Opisali bomo različne načine uporabe slednjega protokola in njihove praktične primere. Zaključili bomo z analizo prednosti in slabosti, ki jih platforma ponuja, in pregledom trenutnega stanja razvoja IOTA omrežja. PLATFORMA IOTA IOTA je platforma, ki je bila namensko razvita za domeno IOT in za podporo pri komunikaciji med elektronskimi napravami (ang. machine to machine – M2M). Njeni avtorji David Sønstebø, Sergey Ivancheglo, Dominik Schiener in Serguei Popov izpostavljajo, da se bo število IOT naprav do leta 2020 povečalo na 20.4 milijarde, pri čemer bo nujno potreben protokol, ki bo omogočal njihovo medsebojno komunikacijo in hkrati samostojno izmenjavo denarnih oz. materialnih vrednosti [4]. Platforma hkrati podpira tudi običajno plačevanje s kriptovaluto, podobno kot ostale platforme, temelječe na tehnologiji veriženja blokov. 2.1 Arhitektura Arhitektura omrežja IOTA je v veliko pogledih podobna ostalim omrežjem verig blokov. Omrežje je decentralizirano in sestavljeno iz medsebojno povezanih vozlišč, imenovanih IOTA Reference Implementation - IRI [5]. Ta vozlišča so poljubno povezana med seboj, pri čemer si skupaj delijo javno porazdeljeno glavno knjigo transakcij (ang. ledger). Prav tako preverjajo veljavnost transakcij, izvajajo algoritem izbire transakcij za potrjevanje (razloženo kasneje) in oddajajo nove ter prejete transakcije sosednjim vozliščem. Trenutno so v zagonu tri globalna omrežja: glavno (ang. mainnet), razvijalsko (ang. devnet) in testno (ang. spamnet) omrežje [6]. Bistvena razlika, ki loči platformo IOTA od drugih, je struktura porazdeljene glavne knjige transakcij. Medtem ko je ta pri tehnologiji veriženja blokov strukturirana iz zaporedja med seboj povezanih blokov transakcij, je pri platformi IOTA strukturirana v obliki usmerjenega acikličnega grafa (ang. directed acyclic graph - DAG) transakcij imenovanem Tangle [7]. Slika 1 predstavlja slikovito primerjavo med omenjenima podatkovnima strukturama. Transakcije so v DAG predstavljene kot vozlišča povezanega grafa. Med njimi so usmerjene povezave, ki potekajo od transakcije, ki je na novo dodana v graf (glavno knjigo), do dveh že shranjenih transakcij, s čemer ju nova transakcija potrjuje [7]. Iz tega sledi usmerjenost grafa. Pomemben pojem pri Tangle-u je tudi neposredno in posredno sklicevanje transakcij, saj igra pomembno vlogo pri mehanizmu porazdeljenega soglasja omrežja [7]. Transakcija se neposredno sklicuje na drugo transakcijo, če obstaja neposredna usmerjena povezava do nje. Po drugi strani se transakcija posredno sklicuje na drugo transakcijo, če obstaja usmerjena pot do nje preko drugih transakcij. Zaradi nespremenljivosti že obdelanih transakcij se pri sklicevanju ne more zgoditi cikel, iz česar sledi acikličnost grafa. Zaradi specifične podatkovne strukture (DAG), omrežje IOTA ne vsebuje t. i. klasičnih rudarjev, ki bi potrjevali skupke oz. t. i. bloke transakcij, kot jih klasična omrežja tehnologij veriženja blokov. Porazdeljeno soglasje omrežja IOTA temelji na tem, da vsaka nova transakcija potrdi dve prejšnji transakciji, kar pomeni, da se neposredno na le-te tudi sklicuje [7]. V izogib potencialnim zlorabam omrežja, vključuje platforma IOTA prav tako algoritem dokaza o delu (ang. Proof-of-Work - PoW), ki je sicer manj potraten kot v ostalih klasičnih OTS 2019 SODOBNE INFORMACIJSKE TEHNOLOGIJE IN STORITVE 39 V. Keršič, M. Turkanović: Uporaba platforme IOTA za zbiranje IOT podatkov protokolih in omrežjih verig blokov, vendar se uporablja zgolj zaradi preprečitev nezaželenih transakcij (ang. spam), saj je za vsako transakcijo potrebno izvesti določen proces dokaza o delu [8]. Omenjeni algoritem PoW se izvaja lokalno pri uporabniku, ki želi izvesti transakcijo, pri čemer se lahko opcijsko izvajanje prenese na vozlišče omrežja [9]. Slika 1: Struktura porazdeljene glavne knjige pri tehnologiji veriženja blokov in platformi IOTA [10]. Pred opisom algoritma izbire transakcij za potrjevanje, je potrebno še definirati dva pojma: (1) teža (TeTr) in (2) kumulativna teža transakcije (KTeTr) [7]. TeTr je številčna vrednost, ki je proporcionalna količini dela, ki jo je uporabnik opravil z algoritmom PoW, z namenom izdajanja nove transakcije. KTeTr določene transakcije je vsota TeTr in vseh TeTr transakcij, ki se neposredno ali posredno sklicujejo nanjo. Uporabljen algoritem izbire transakcij se imenuje Markov chain Monte Carlo (MCMC), ki temelji na verjetnostni porazdelitvi [11]. Najpomembnejši parameter algoritma je KTeTr. Algoritem se prične pri zadnji prelomnici (posebna vrsta transakcije, razložena v poglavju 2.3) in se nadaljuje v smeri novejših transakcij [12]. Pri vsaki transakciji se mora algoritem odločiti, katera bo naslednja transakcija v sprehodu oz. v katero smer bo nadaljeval. To se odloči glede na verjetnostno porazdelitev, ki je odvisna od KTeTr transakcij [7]. Ta postopek oz. sprehod po grafu se ponavlja do robnih novih transakcij (ang. tips). Algoritem teži k temu, da so na koncu izbrane novejše transakcije, saj se tako omrežje lažje in učinkoviteje širi. Uporaba omenjenega algoritma ni eksplicitno zahtevana, saj lahko upravljalec vozlišča izbere poljuben algoritem, vendar je zaradi omenjenih razlogov njegova uporaba priporočena [13]. Posebnost platforme je tudi uporaba ternarnega številskega sistema [14]. Za razliko od binarnega sistema, kjer je osnovna enota bit, ki zaseda dve različni vrednosti (0 ali 1), je pri tem osnovna enota t. i. trit, ki zaseda tri različne vrednosti in sicer -1, 0 in 1 (uravnotežen ternarni sistem). Trije triti so enaki enemu t. i. trajtu, ki lahko ima 27 različnih vrednosti. Teh 27 vrednosti je predstavljenih z veliki črkami angleške abecede (A - Z) in števko 9. Vsi podatki v transakciji so predstavljeni v tem številskem sistemu1. Vsak uporabnik, ki želi uporabljati omrežje, torej pošiljati transakcije, potrebuje zasebni ključ oz. v primeru platforme IOTA je to t. i. seme (ang. seed) [15]. To je sestavljeno iz 81 trajtov, kar pomeni, da obstaja 381 različnih semen. Vsakemu uporabniku pripada unikatno seme in če tega uporabnik izgubi, izgubi tudi vse kriptožetone vezane na to seme. Iz semena so generirani tudi vsi zasebni ključi, ki se uporabljajo za potrebe digitalnega podpisovanja transakcij in javni naslovi, kateri so uporabljani za prejemanje transakcij. Javni naslovi so tudi velikosti 81 trajtov. Pri semenu in javnih naslovih je velikokrat na koncu dodanih 9 trajtov, ki se uporabljajo izključno za preverjanje pravilnosti (ang. checksum). Transakcije so povezane v snope (ang. bundle), ki vsebujejo eno ali več transakcij in vsakemu pripada unikatna zgostitev (ang. hash) [16]. Združevanje transakcij v snope ima pomembno vlogo v protokolu MAM in pri prenosu kriptožetonov. Pri slednjem ločimo tri vrste transakcij: vhodne, izhodne in meta transakcije. V vhodnih transakcijah so navedene vrednosti in naslovi pošiljatelja, v izhodnih transakcijah vrednosti in naslovi prejemnika ter v meta transakcijah digitalni podpis pošiljatelja. Vsaka transakcija ima enako strukturo. Vsebuje 1 Primer naslova IOTA: ZIM9QPENUCRAGYOXOAJHDSRABOUMIBFJNZBPLU9UXCIMLMYUCHQXZQIQURNRZCIJZPXFBTWKHLLRTBM9CK SHUMWZXW 40 OTS 2019 SODOBNE INFORMACIJSKE TEHNOLOGIJE IN STORITVE V. Keršič, M. Turkanović: Uporaba platforme IOTA za zbiranje IOT podatkov zgostitev, ki se izračuna iz podatkov naslova, TeTr, oznako (ang. tag), časovno značko (ang. timestamp), indeks transakcije v snopu, zadnji indeks (število transakcij v snopu), zgostitev snopa, enkratnik (ang. nonce), ki predstavlja rezultat algoritma PoW in sporočilo. Vsa polja imajo omejeno velikost. Za nas je pomembno polje sporočilo, ki ima velikost omejeno na 2187 trajtov. Za vsako polje velja, da je zapolnjeno s trajtom 9, v primeru, ko je vrednost manjša od velikosti polja. Posebnost meta transakcij je, da niso namenjane prenosu kriptožetonov, kar pomeni, da obstajata dva tipa transakcij: (1) transakcije prenosa vrednosti in (2) brez- vrednostne transakcije [16]. Pri slednjih je vrednost v polju vrednost enaka 0 in se uporabljajo zgolj za prenos sporočila, ki se nahaja v polju sporočilu. Takšne transakcije se lahko uporabljajo za pošiljanje poljubnih podatkov (npr. pošiljanje senzorskih podatkov v protokolu MAM). V primeru vhodnih transakcij se v polje sporočilo zapiše digitalni podpis pošiljatelja. Ker ima polje omejeno velikost in jo digitalni podpis preseže, se le-ta nadaljuje v naslednjih meta transakcijah istega snopa. 2.2 Masked Authenicated Messaging (MAM) Brez-vrednostne transakcije najdejo svojo uporabnost pri pošiljanju surovih podatkov brez finančne vrednosti. Kot v ostalih omrežjih verig blokov, se transakcija pošlje na naslov, ki je v njej naveden. Vendar v domeni IOT, kjer naprave oz. senzorji pošiljajo podatke na določen časovni interval (npr. vsako sekundo) in so si ti podatki med seboj povezani, omenjene transakcije niso zelo učinkovite, saj ne moremo iz njih dobiti sosledja oz. zaporedja transakcij. Velikokrat je tudi zaželeno, da so ti tokovi podatkov zašifrirani in namenjeni le določenim osebam. V ta namen se v sklopu platforme IOTA uporablja protokol MAM. Protokol MAM je komunikacijski protokol namenjen verižnemu pošiljanju podatkov, pri čemer so sporočila digitalno podpisana s strani pošiljatelja in po potrebi tudi šifrirana [3]. Protokol deluje decentralizirano brez posrednika in hkrati zagotavlja integriteto ter zasebnost sporočil. V ozadju uporablja običajne brez-vrednostne transakcije, v katerih je v polju sporočilo, shranjena posebna podatkovna struktura, ki vsebuje podatke s pomočjo katerih poteka sledenje verigi sporočil MAM. Tako kot običajne transakcije so tudi ta sporočila poslana na določene naslove IOTA. Ker so vse transakcije na Tangle-u dostopne in na voljo za pogled že preden so potrjene, lahko sporočila MAM in njihove vsebovane podatke pridobimo takoj. Velikost sporočila, ki ga je moč poslati je neomejena, vendar je za večje velikosti potrebnih več transakcij, zaradi česar posledično poteka branje toka sporočil zelo počasneje. Protokol MAM ponuja tri načine uporabe: javni, zasebni in omejeni [3]. Načini se med seboj razlikujejo le v načinu šifriranja naslovov in podatkov. Pred opisom vsakega načina je potrebno definirati podatkovno strukturo sporočil MAM. Protokol MAM uporablja za podpisovanje sporočil Merklova drevesa (ang. Merkle tree based signature scheme) [17]. Koren drevesa je uporabljen kot identifikator kanala in vsako sporočilo vsebuje tudi koren naslednjega drevesa. To pomeni, da se toku podatkov sledi preko korenov Merklovih dreves. Ker se v sporočilu nahaja le naslednji koren, lahko toku podatkov sledimo le naprej, medtem ko nazaj ni mogoče. Koren drevesa je pridobljen z digitalnim podpisom lastnika sporočila in uporabo zgoščevalnih funkcij. Pri branju toka se prvo preveri lastnikov podpis. Če je le-ta veljaven, se sporočilo dešifrira, sicer se zavrže. Koren drevesa je med drugim uporabljen tudi za šifriranje podatkov. Objekt sporočila MAM lahko primerjamo s sintakso JSON (JavaScript Object Notation) [18]. Vsak objekt vsebuje štiri ključe: stanje, koristni tovor (ang. payload), koren in naslov [19]. Pod ključem stanje so shranjeni stranski ključ, naslednji koren, število sporočil oz. listov drevesa, način uporabe in ostali podatki. Vsebino ( koristni tovor) pridobimo tako, da se dejanski podatki sporočila in nekateri podatki o Merklovem drevesu zašifrirajo s korenom drevesa. Pod ključem koren se nahaja koren Merklovega drevesa in pod ključem naslov, naslov IOTA. Kot pri običajnih transakcijah so tudi tukaj vsi podatki kodirani v ternarnem sistemu. Poenostavljena struktura transakcij MAM je sledeča: na naslov, definiran v objektu MAM, se pošlje snop transakcij. Prvi dve transakciji v snopu predstavljala lastnikov digitalni podpis. Za tem sledi še vsaj ena transakcija (v primeru večje količine podatkov jih je lahko več). V teh transakcijah je v polju sporočilo zapisan koristni tovor objekta MAM. Slika 2 prikazuje snop MAM transakcij. Pri javnem načinu uporabe imajo vsi udeleženci omrežja dostop do sporočil. Za branje toka sporočil je potreben le naslov IOTA, ki je v tem primeru enak korenu drevesa. Če poznamo koren drevesa, lahko dešifriramo sporočilo MAM in preberemo podatke. Ta način uporabe je primeren, ko so podatki javno dostopni, torej na voljo vsem uporabnikom omrežja. OTS 2019 SODOBNE INFORMACIJSKE TEHNOLOGIJE IN STORITVE 41 V. Keršič, M. Turkanović: Uporaba platforme IOTA za zbiranje IOT podatkov Zasebni način uporabe se uporablja, kadar želi imeti samo lastnik sporočil dostop do teh. Pri tem načinu je naslov IOTA enak zgostitvi korena drevesa. To pomeni, da za dešifriranje ni dovolj zgolj poznavanje naslova, ampak je potrebno tudi poznati koren. Tega pozna le avtor sporočila oz. lastnik toka podatkov. Slika 2: Snop MAM transakcij [20]. Pri omejenem načinu uporabe imajo dostop do sporočil vsi udeleženci omrežja, s katerimi lastnik sporočil deli stranski ključ. Naslov se pridobi enako kot pri zasebnem načinu, le da je sporočilo zašifrirano še s stranskim ključem. Ta način je uporaben, ko želimo omejiti dostop do toka podatkov. Tistim, katerim želimo dovoliti dostop, se posredujeta stranski ključ in koren drevesa. Posledično je z zamenjavo stranskega ključa možno tudi spremeniti dostop do podatkov. 2.3 Prednosti platforme IOTA Platforma ima zaradi svoje inovativne strukture štiri poglavitne prednosti in sicer: (1) razširljivost, (2) decentralizacija, (3) transakcije brez pristojbine in (4) zaščita pred kvantnim računalništvom [21]. Omenjene prednosti imajo še posebej veliko vlogo v domeni IOT. Zmožnost razširljivosti omrežja se ocenjuje s povečanjem števila transakcij. Medtem, ko večina omrežij verig blokov s povečanjem števila transakcij, postane počasnejših, je pri platformi IOTA ravno nasprotno in sicer zaradi uporabljenega algoritma porazdeljenega soglasja. Porazdeljeno soglasje omrežja, kot je že omenjeno v prejšnjem poglavju, temelji na tem, da vsaka novo izvedena transakcija odobri dve prejšnji transakciji. Iz tega sledi, da večje število novih transakcij lahko potrdi večje število obstoječih transakcij. Teoretično gledano je tako omrežje IOTA neskončno razširljivo, kar posledično predstavlja primerno rešitev za okolje IOT [22]. Platforma IOTA je za razliko od omrežij tehnologije veriženja blokov veliko bolj decentralizirana, saj vsak udeleženec omrežja sodeluje pri odobravanju transakcij in ne zgolj rudarji oz. potrjevalci blokov2. Platforma je relativno mlada in ker število »poštenih« transakcij ni dovolj veliko, da bi bilo omrežje zavarovano pred štiriintrideset procentnim napadom, je v omrežje vključeno posebno koordinatorsko vozlišče [8] [23]. To vozlišče je pod nadzorom fundacije IOTA in na določen časovni interval (ena minuta) izda povsem običajne transakcije imenovane prelomnice (ang. milestones), ki prav tako odobrijo dve obstoječi transakciji. Pravilo omrežja je, da je transakcija dokončno potrjena, če se prelomnica neposredno ali posredno sklicuje nanjo, kar posledično pomeni, da platforma IOTA vsaj za zdaj še ni popolnoma decentralizirana. Potrebno je še dodati, da je implementacija tega vozlišča odprtokodna in morajo tudi te transakcije biti veljavne, da bodo kasneje potrjene s strani transakcij preostalih vozlišč [24]. Tretja prednost sledi iz uporabljenega algoritma porazdeljenega soglasja. Ker vsak uporabnik odobri obstoječe transakcije in s tem pripomore k aktivnosti omrežja, ni potrebe po pristojbini transakcij. Z vsako transakcijo lahko pošljemo poljubno količino kriptovalute ali surove podatke brez pristojbine. Ta prednost omogoča obilico novih priložnosti in primerov uporabe. Najbolj očiten primer uporabe je pošiljanje senzorskih podatkov, ki je predstavljen v naslednjem poglavju. Čeprav je kvantno računalništvo še vedno v zgodnji fazi razvoja, je potrebno imeti v mislih, da so naprave IOT izdelane tako, da delujejo mnogo let brez dodatnih posegov in popravkov v strojni in/ali programski opremi, 2 Vseh 2,779,530,283,000,000 kriptožetonov IOTA je bilo ustvarjenih na začetku. 42 OTS 2019 SODOBNE INFORMACIJSKE TEHNOLOGIJE IN STORITVE V. Keršič, M. Turkanović: Uporaba platforme IOTA za zbiranje IOT podatkov kar pomeni, da je potrebno zavarovati protokol tudi za prihodnost. Zato se v platformi za potrebe identifikacije pri digitalnem podpisu uporablja Winternitz One-Time Signature Scheme, ki bo po mnenju strokovnjakov tudi varen način šifriranja v dobi kvantnih računalnikov [25]. REŠITEV ZA ZBIRANJE IOT PODATKOV Število naprav IOT se vsako leto povečuje in zanimanje za to domeno zelo narašča. Posledično tako narašča tudi število konceptualnih idej uporabe, kot tudi implementiranih projektov na to aktualno temo. Zaradi tega smo se odločili uporabiti platformo IOTA z namenom zbiranja realno-časovnih podatkov naprav IOT. Zanimalo nas je, kako zrela je omenjena tehnologija za omenjen praktičen primer uporabe. Cilj rešitve je bil pošiljati številne senzorske odčitke v Tangle in hkrati podatke iz Tangle-a prebirati ter jih vizualizirati. Ker nas je zanimala tudi učinkovitost pošiljanja in pridobivanja podatkov, smo spreminjali določene parametre in sicer vrsto senzorjev, dostopnost omrežja (omrežje za razvijalce in zasebno) in način vizualizacije. 3.1 Arhitektura Arhitektura rešitve je modularna, pri čemer posamezen modul temelji na primerni tehnologiji in je hkrati popolnoma samostojen. Visokonivojska arhitektura, prikazana na Slika 3, je sestavljena iz različnih senzorjev, strežnika, omrežja IOTA oz. Tangle-a in vizualizacijske platforme. Naloga senzorjev je odčitavanje številnih fizikalnih lastnosti in posredovanje vrednosti le teh na strežnik. Slednji s pomočjo protokola MAM objavlja podatke v omrežje IOTA oz. Tangle. Vpisani podatki se nato iz omrežja IOTA preberejo in vizualizirajo na različnih vizualizacijskih napravah. V nadaljevanju sledi podrobnejši opis posameznih modulov. Slika 3: Arhitektura rešitve za zbiranje podatkov IOT, temelječa na platformi IOTA. 3.2 Senzorji Za odčitavanje in zbiranje senzorskih podatkov smo uporabili dva različna pristopa: (1) uporaba mikrokrmilnika in (2) uporaba Raspberry Pi [26]. Uporabili smo mikrokrmilnik ESP32, ki ga poganja operacijski sistem FreeRTOS in ponuja podporo za brezžično komunikacijo [27]. Mikrokrmilnik ESP32 izvaja pet osnovnih nalog, ki se izvajajo paralelno: - prebiranje podatkov iz senzorjev s pomočjo vodila I²C in pošiljanje pridobljenih podatkov v vrsto sporočil (ang. message queue), ki je uporabljena za komunikacijo med nitmi, OTS 2019 SODOBNE INFORMACIJSKE TEHNOLOGIJE IN STORITVE 43 V. Keršič, M. Turkanović: Uporaba platforme IOTA za zbiranje IOT podatkov - poslušanje sporočilne vrste in pošiljanje prebranih podatkov v medpomnilnik namenjen prikazu podatkov, - poslušanje sporočilne vrste in pošiljanje podatke na vnaprej definirane teme protokola Message Queuing Telemetry Transport (MQTT) [28] z uporabo brezžične povezave WLAN, - vzdrževanje MQTT povezave in - prebiranje podatkov iz medpomnilnika in prikaz podatkov na ekranu. V sklopu pilotne rešitve smo uporabili štiri senzorje, ki so odčitavali šest različnih fizikalnih lastnosti. V Tabela 1 so navedeni uporabljeni senzorji in pri vsakem namen uporabe. Tabela 1: Uporabljeni senzorji in namen uporabe vsakega senzorja. Senzor Namen uporabe CCS811 Ogljikov dioksid (CO2, VOC (ang. volatile organic compound)) BMP280 Pritisk Si7021 Vlaga, temperatura MAX44009 Svetloba Slabost uporabe mikrokrmilnika ESP32 je majhna procesorska moč. Sam mikrokrmilnik ni sposoben ustvarjati transakcij, izvajati algoritma dokaza o delu in nato še pošiljati transakcije v omrežje. V ta namen je uporabljen strežnik, ki služi kot posrednik med mikrokrmilnikom in omrežjem IOTA oz. Tangle-om. Alternativa mikrokrmilniku je uporaba Raspberry Pi-ja. Uporabili smo model 3 B+. Prednost uporabe slednjega je neposredna priključitev senzorjev, pridobivanje odčitkov in sposobnost pošiljanja transakcij v omrežje IOTA. Na Raspberry Pi smo namestili operacijski sistem Raspbian in izvajalno okolje Node.js. Za slednjega smo se odločili, ker je trenutno edina zrela implementacija protokola MAM le v programskem jeziku Javascript [18]. Knjižnica se imenuje mam.client.js. Na Raspberry Pi smo naložili Node.js skripto, ki je vsakih 15 sekund pošiljala podatke v Tangle. Podatki so bili predstavljeni v JSON formatu, kar je razvidno na Slika 4. Transakcije so bile uspešno poslane v omrežje v roku petih sekund (odvisno od zasedenosti uporabljenega vozlišča). Ker je za branje podatkov potrebno poznavanje korena toka podatkov, smo le-tega shranili v podatkovno bazo Firebase [29]. Slika 4: Struktura podatkov v transakcijah protokola MAM [30]. 44 OTS 2019 SODOBNE INFORMACIJSKE TEHNOLOGIJE IN STORITVE V. Keršič, M. Turkanović: Uporaba platforme IOTA za zbiranje IOT podatkov 3.3 Strežnik Mikrokrmilnik pošilja vrednosti senzorskih odčitkov s pomočjo protokola MQTT na strežnik. Naloga strežnika je branje podatkov iz senzorjev preko omenjenega protokola in pošiljanje le-teh na Tangle. Prednost takšnega postopka je zmogljivost, saj so strežniki veliko bolj zmogljivi kot Raspberry Pi, kar pomeni, da pošiljanje transakcij poteka hitreje in sicer do tri sekunde hitreje. Za samo izvedbo rešitve je potrebno izbrati programski jezik, ki nudi podporo protokoloma MQTT in MAM. Kot je že omenjeno, je to trenutno le Javascript, zaradi česar smo se tudi tukaj odločili za Node.js. Drugi uveljavljeni programski jeziki in njihove knjižnice za IOTA trenutno še ne podpirajo protokol MAM (tj. C, C++, Java, Python in Go). 3.4 Omrežje IOTA Kot je bilo omenjeno v poglavju 2.1, so na voljo tri globalna javna omrežja. Za našo rešitev smo uporabljali omrežje za razvijalce. Za uporabo javnega omrežja je potrebno pridobiti IP naslov in vrata enega izmed vozlišč omrežja. Ker morajo vozlišča opravljati veliko opravil, se pri uporabi omrežja za razvijalce lahko zgodi, da so vozlišča preprosto prezasedena (lahko tudi neodzivna) in pošiljanje transakcij zato poteka dlje časa oz. sploh ni uspešno. Zaradi tega smo se odločili vzpostaviti lastno zasebno omrežje. Omrežje smo vzpostavili po navodilih, ki so objavljena na uradni shrambi platforme IOTA (ang. repository) na spletni strani Github [31]. Za vzpostavitev je potreben strežnik Linux, za katerega je priporočenih vsaj osem GB delovnega pomnilnika in štiri-jedrni procesor. Na strežniku smo vzpostavili eno vozlišče omrežja in hkrati tudi lastnega koordinatorja omrežja, ki je za delovanje nujno potreben. Pri zasebnem omrežju po pričakovanjih ni bilo težav zaradi prezasedenosti vozlišča, zaradi česar bi moral biti povprečen čas pošiljanja transakcij manjši. Težava nastopi zaradi premajhnega števila transakcij, saj je na javnem omrežju veliko večje število prihajajočih novih transakcij kot na zasebnem. Zaradi tega je bilo potrebno zraven pošiljanja senzorskih podatkov, še dodatno poslati nekaj navadnih transakcij za pohitritev omrežja. 3.5 Vizualizacijske platforme En izmed glavnih ciljev senzorskih podatkov naprav IOT je njihova obdelava in vizualizacija. Tega smo se lotili na dva načina: prikaz samih podatkov senzorjev in prikaz transakcij v acikličnem grafu transakcij. Medtem, ko je razlog za prvega očiten, je za drugega prikaz razvoja Tangle-a in povezanost naših transakcij oz. snopa transakcij med seboj. Za prikaz transakcij v Tangle-u smo uporabili spletno aplikacijo tangle.glumb.de [32]. Aplikacija prikazuje graf transakcij, kjer so transakcije predstavljene kot vozlišča. Povezave predstavljajo sklicevanje transakcij. Ob kliku na vozlišče se prikaže zgostitev in oznaka transakcije ter zgostitev snopa. Glavna funkcionalnost aplikacije, ki smo jo uporabljali, je iskanje transakcij po njihovi oznaki. Vsem transakcijam MAM smo določili oznako BLOCKCHAINLABUM999999999999 in nato na omenjeni aplikaciji izvedli iskanje po oznaki. Vse najdene transakcije se obarvajo rdeče. Slika 5 prikazuje transakcije MAM – snop treh ali več transakcij s podatki senzorjev, ki imajo omenjeno oznako BLOCKCHAINLABUM999999999999. OTS 2019 SODOBNE INFORMACIJSKE TEHNOLOGIJE IN STORITVE 45 V. Keršič, M. Turkanović: Uporaba platforme IOTA za zbiranje IOT podatkov Slika 5: Prikaz transakcij MAM v Tangle-u, kjer so rdeče obarvane transakcije z oznako BLOCKCHAINLABUM. Prikaz samih podatkov je v fazi testiranja potekal s pomočjo ukazne vrstice. Po uspešni implementaciji pošiljanja podatkov, smo začeli z implementacijo mobilne aplikacije. Ker je potrebna knjižnica za prebiranje podatkov iz Tangle-a na voljo le za programski jezik Javascript (mam.client.js), smo bili omejeni z izbiro ogrodja za izdelavo mobilnih aplikacij. Odločili smo se za uporabo React Native. Cilj mobilne aplikacije je realno-časovni prikaz senzorskih podatkov. Aplikacija je povezana s podatkovno bazo Firebase, iz katere pridobiva informacije o senzorjih oz. Raspberry Pi-ju, ki pošiljajo podatke, in korene tokov podatkov. Za vsak tok podatkov se nato od tega korena naprej preberejo vse transakcije MAM, ki se dešifrirajo in prikažejo na zaslonu. Ker branje podatkov traja nekaj časa, smo vsaki dve uri v podatkovno bazo dodali nov koren. Slika 6: Mobilna aplikacija (React Native), ki prikazuje sprotno odčitavanje senzorjev. 46 OTS 2019 SODOBNE INFORMACIJSKE TEHNOLOGIJE IN STORITVE V. Keršič, M. Turkanović: Uporaba platforme IOTA za zbiranje IOT podatkov DISKUSIJA Zaradi svoje edinstvene zgradbe in načina delovanja je s platformo IOTA moč pošiljati transakcije, ki vsebujejo poljubne podatke (transakcije brez vrednosti). Platforma omogoča hkrati uporabo namenskih protokolov, kot je MAM, ki omogoča intervalno pošiljanje poljubno povezanih podatkov v omrežje IOTA in s tem v Tangle. Trenutna pomanjkljivost protokola MAM je ta, da ga je možno zgolj uporabljati s programskim jezikom Javascript. Platforma je še v zgodnji fazi razvoja in v prihodnosti bo zelo verjetno prišlo tudi do večjih sprememb, kakor tudi do uvedbe knjižnic za druge programske jezike. Slabost samega protokola MAM je zaporedno branje toka podatkov. Čeprav to poteka relativno hitro, ni možno prebrati podatkov oz. transakcij določenega časovnega intervala. Pilotno rešitev smo prvo povezali z javnim omrežjem IOTA, saj je povezovanje nanj zelo preprosto. Zaključili smo, da javno omrežje ni dovolj odzivno v času povečanega števila transakcij, predvsem zaradi še trenutno premajhnega števila vključenih vozlišč. Menimo, da je vzrok temu, da upravljalci vozlišč nimajo finančnih spodbud kot v primeru omrežij verig blokov, kjer ti večinoma sodelujejo pri rudarjenju in imajo s tem možnost prislužiti si nagrado v obliki novo izdanih kriptožetonov. Zaradi omenjenega problema smo se odločili vzpostaviti zasebno omrežje IOTA. Shramba za zasebna omrežja IOTA je dokaj nova in v času vzpostavljanja še ni bila dobro dokumentirana. Po vzpostavitvi je uporaba zasebnega omrežja ekvivalentna javnemu. Med razvojem pilotne rešitve je bilo ugotovljeno, da knjižnica mam.client.js ne nudi možnosti sledenja transakcijam po oznakah. Zaradi želje po sledenju transakcijam izbranih senzorjev, smo bili primorani posodobiti omenjeno knjižnico na način, da smo jo nadgradili z možnostjo določanja poljubnih oznak za transakcije MAM (npr. BLOCKCHAINLABUM999999999999). Po testiranju smo dodatno funkcionalnost oddali na uradno shrambo platforme IOTA, kjer je bila v nekaj dneh dodana v uradno knjižnico. Prav tako smo med razvojem prišli do zaključka, da je trenutno še zmeraj težava s samim razvojem končnih aplikacij (npr. mobilnih), ki bi bile povezane s platformo IOTA – predvsem zaradi trenutne omejitve na programski jezik Javascript. Za namen preverjanja kompatibilnosti in testiranja smo preizkusili Ionic 4, Ionic 1 in React Native. Ionic 4 s Typescript-om ni kompatibilen z omenjeno knjižnico. Vključitev knjižnice v Ionic 1 je možna, vendar je to seveda zastarelo ogrodje. Izbira React Native se je izkazala, kot najboljša izbira, vendar je za uspešno uporabo potrebno izvesti zagon aplikacije v načinu za razvijalce. Iz predstavljenega je razvidno, da je platforma IOTA še v zgodnji fazi razvoja. Knjižice in ostale komponente potrebujejo še veliko dodatkov in optimizacije za enostavnejšo in učinkovitejšo uporabo. Problem trenutnih knjižnic, vozlišč omrežja (IRI), uporabe ternarnega sistema za kodiranje podatkov in nekaterih ostalih procesov je njihova fizična zahtevnost in energijska potratnost. Naprave, kot so senzorji IOT, trenutno še nimajo dovolj zmogljive strojne naprave za hitro ustvarjanje in pošiljanje transakcij. Današnja strojna oprema temelji na binarnem sistemu, zaradi česar je potrebno podatke kodirane v ternarnem sistemu tekom procesa pretvarjati v binarni, kar vzame dodaten čas. Na tem področju se sicer razvijajo različni prototipi strojne opreme, ki delujejo v ternarnem sistemu, in bodo v primeru platforme IOTA učinkovitejši [33]. Vozlišča omrežja pri večji zasedenosti delujejo počasneje in sicer zaradi procesov, ki so zahtevni in tudi potekajo sočasno. Zaradi tega se je začelo razvijati in tudi nastalo testno omrežje, ki deluje na vozliščih imenovanih IOTA Controlled agenT (ICT) [34]. Prednost teh vozliščih je modularna zgradba, kjer samo vozlišče podpira le najosnovnejše pošiljanje in prejemanje transakcij ter ostala nujno potrebna opravila za delovanje. Vse ostale dodatne funkcionalnost so dodane z moduli imenovanimi IOTA eXtension Interface (IXI) [34]. Ta vozlišča je mogoče namestiti tudi na Raspberry Pi (vozlišča IRI je sicer tudi možno, ampak zaradi zahtev po boljši strojni opremi ni smiselno), kjer delujejo brezhibno. Vendar slednje testno omrežje je še v zgodnejši fazi razvoja. Naslednji korak v razvoju omrežja je odstranitev koordinatorja omrežja, kar poteka v sklopu projekta Coordicide [35]. Z odstranitvijo slednjega bo prišlo do večjih sprememb v omrežju, saj ne bo več t. i. transakcij prelomnic in posledično se bo na drug način določilo, kdaj je transakcija dokončno potrjena. Kot pri ostalih tekočih projektih, tudi pri tem ni točno dorečeno, kaj vse se bo spremenilo in kako, vendar prihaja več idej s strani fundacije IOTA. OTS 2019 SODOBNE INFORMACIJSKE TEHNOLOGIJE IN STORITVE 47 V. Keršič, M. Turkanović: Uporaba platforme IOTA za zbiranje IOT podatkov ZAKLJUČEK V prispevku smo predstavili platformo IOTA, ki predstavlja eno od novih platform porazdeljene glavne knjige. Predstavili smo njene poglavitne prednosti in potencialne slabosti. Osredotočili smo se na arhitekturo platforme, kakor tudi na podatkovno strukturo Tangle in razlike s klasičnimi omrežji verig blokov. Z namenom preverjanja uporabnosti platforme, smo zasnovali in načrtovali pilotno rešitev za domeno IOT, ki temelji na platformi IOTA. Cilj pilotne rešitve je bilo zajemanje senzorskih odčitkov in shranjevanje vrednosti le teh v omrežje IOTA in kasneje dostop in prebiranje senzorskih podatkov z mobilno aplikacijo, ki bi hkrati senzorske podatke primerno vizualizirala. Z namenom testiranja smo ob implementaciji hkrati izbirali različne pristope, kot je uporaba zasebnega ali javnega omrežja IOTA, uporaba različnih ogrodij za razvoj mobilnih aplikacij, uporaba različnih načinov za odčitavanje senzorskih vrednosti, itd. Zaradi želje po sledenju senzorskih odčitkov v Tangle-u, smo uporabili namenski IOTA protokol MAM, ki pa do takrat privzeto ni omogočal povezovanja in iskanja povezanih podatkov po oznakah. V ta namen smo knjižico za protokol MAM nadgradili in omogočili določanje poljubnih oznak, s pomočjo katerih smo dosegli željeni cilj. Predlagana nadgradnja knjižnice je postala tudi uradni del le te. Končna pilotna rešitev tako zajema celovito rešitev za domeno IOT, ki je dokazala uporabnost platforme IOTA za izbrano domeno in s tem prednost pred klasičnimi platformami verig blokov. Kljub temu pa je potrebno izpostaviti, da je platforma še v razvoju in da je še veliko prostora za izboljšanje in razvoj. V nadaljevanju načrtujemo izvajanje testov zmogljivosti pilotne rešitve, kakor tudi analizo varnosti komponent platforme IOTA. LITERATURA [1] S. Nakamoto, „Bitcoin: A Peer-to-Peer Electronic Cash System“. [Na spletu]. Dostopno: https://bitcoin.org/bitcoin.pdf. [Dostopano: 27-maj-2019]. [2] S. Kim, Y. Kwon, in S. Cho, „A Survey of Scalability Solutions on Blockchain“, v 2018 International Conference on Information and Communication Technology Convergence (ICTC), 2018, str. 1204–1207. [3] „Introducing Masked Authenticated Messaging – IOTA“. [Na spletu]. Dostopno: https://blog.iota.org/introducing-masked-authenticated-messaging-e55c1822d50e. [Dostopano: 09-maj- 2019]. [4] I. Foundation, „The Next Generation of Distributed Ledger Technology | IOTA“, 2018. [Na spletu]. Dostopno: https://www.iota.org/. [Dostopano: 25-apr-2019]. [5] „iotaledger/iri: IOTA Reference Implementation“. [Na spletu]. Dostopno: https://github.com/iotaledger/iri. [Dostopano: 09-maj-2019]. [6] „IOTA networks | References | Getting Started | IOTA Documentation“. [Na spletu]. Dostopno: https://docs.iota.org/docs/getting-started/0.1/references/iota-networks?q=network&highlights=network. [Dostopano: 23-maj-2019]. [7] S. Popov, „The Tangle“, 2018. [Na spletu]. Dostopno: https://assets.ctfassets.net/r1dr6vzfxhev/2t4uxvsIqk0EUau6g2sw0g/45eae33637ca92f85dd9f4a3a218e1ec/i ota1_4_3.pdf. [Dostopano: 27-maj-2019]. [8] Q. Bramas, „The Stability and the Security of the Tangle“, 04-apr-2018. [Na spletu]. Dostopno: https://hal.archives-ouvertes.fr/hal-01716111v2. [Dostopano: 27-maj-2019]. [9] „Proof of work | Concepts | The Tangle | IOTA Documentation“. [Na spletu]. Dostopno: https://docs.iota.org/docs/the-tangle/0.1/concepts/proof-of-work. [Dostopano: 24-maj-2019]. [10] „Blockchain: IOTA Vs Bitcoin technology differences“. [Na spletu]. Dostopno: https://www.appsbee.com/blog/blockchain-iota-vs-bitcoin-technology-differences/. [Dostopano: 23-maj- 2019]. [11] D. van Ravenzwaaij, P. Cassey, in S. D. Brown, „A simple introduction to Markov Chain Monte–Carlo sampling“, Psychon. Bull. Rev. , let. 25, št. 1, str. 143–154, feb. 2018. [12] „Tip selection | Concepts | The Tangle | IOTA Documentation“. [Na spletu]. Dostopno: https://docs.iota.org/docs/the-tangle/0.1/concepts/tip-selection. [Dostopano: 23-maj-2019]. [13] „Incentives in the Tangle | Concepts | The Tangle | IOTA Documentation“. [Na spletu]. Dostopno: https://docs.iota.org/docs/the-tangle/0.1/concepts/incentives-in-the-tangle. [Dostopano: 24-maj-2019]. 48 OTS 2019 SODOBNE INFORMACIJSKE TEHNOLOGIJE IN STORITVE V. Keršič, M. Turkanović: Uporaba platforme IOTA za zbiranje IOT podatkov [14] „Trinary | Concepts | IOTA Basics | IOTA Documentation“. [Na spletu]. Dostopno: https://docs.iota.org/docs/iota-basics/0.1/concepts/trinary?q=trinary&highlights=trinari. [Dostopano: 23- maj-2019]. [15] „What is a seed? | Introduction | Getting Started | IOTA Documentation“. [Na spletu]. Dostopno: https://docs.iota.org/docs/getting-started/0.1/introduction/what-is-a-seed. [Dostopano: 23-maj-2019]. [16] „Bundles and transactions | Concepts | IOTA Basics | IOTA Documentation“. [Na spletu]. Dostopno: https://docs.iota.org/docs/iota-basics/0.1/concepts/bundles-and-transactions. [Dostopano: 23-maj-2019]. [17] R. C. Merkle, „A Certified Digital Signature“, v Advances in Cryptology — CRYPTO’ 89 Proceedings, New York, NY: Springer New York, 1989, str. 218–238. [18] „iotaledger/mam.client.js: Masked Authentication Messaging wrapper for Javascript (Browser and Node)“. [Na spletu]. Dostopno: https://github.com/iotaledger/mam.client.js/. [Dostopano: 09-maj-2019]. [19] „IOTA tutorial 19: Masked Authenticated Messaging - YouTube“. [Na spletu]. Dostopno: https://www.youtube.com/watch?v=Nnwn_o_ZBFU. [Dostopano: 25-maj-2019]. [20] „IOTA: MAM Eloquently Explained – Coinmonks – Medium“. [Na spletu]. Dostopno: https://medium.com/coinmonks/iota-mam-eloquently-explained-d7505863b413. [Dostopano: 25-maj- 2019]. [21] N. Yuva in I. Kirbas, „Directed Acyclic Graph Based on Crypto Currency Application Example : IOTA“, Conf. Int. Conf. Data Sci. Appl. ICONDATA 2018, Yalova, št. December, str. 92–99, 2018. [22] B. Kuśmierzkuśmierz, P. Staupe, in A. Gal, „Extracting Tangle Properties in Continuous Time via Large- Scale Simulations“, 2018. [Na spletu]. Dostopno: https://assets.ctfassets.net/r1dr6vzfxhev/4T4IAlxk9ym0eWco0UoQIQ/90094e746745b89253eb3636b4ad1 597/Extracting_Tangle_Properties_in_Continuous_Time_via_Large_Scale_Simulations_V2.pdf. [Dostopano: 27-maj-2019]. [23] „The Coordinator | Concepts | The Tangle | IOTA Documentation“. [Na spletu]. Dostopno: https://docs.iota.org/docs/the-tangle/0.1/concepts/the- coordinator?q=coordinator&highlights=coordinator%27. [Dostopano: 25-maj-2019]. [24] „iotaledger/compass“. [Na spletu]. Dostopno: https://github.com/iotaledger/compass. [Dostopano: 25-apr- 2019]. [25] J. Buchmann, E. Dahmen, S. Ereth, A. Hülsing, in M. Rückert, „On the security of the Winternitz one-time signature scheme“, v Lecture Notes in Computer Science (including subseries Lecture Notes in Artificial Intelligence and Lecture Notes in Bioinformatics), let. 6737 LNCS, Springer, Berlin, Heidelberg, 2011, str. 363–378. [26] „Raspberry Pi — Teach, Learn, and Make with Raspberry Pi“. [Na spletu]. Dostopno: https://www.raspberrypi.org/. [Dostopano: 09-maj-2019]. [27] „ESP32 Overview | Espressif Systems“. [Na spletu]. Dostopno: https://www.espressif.com/en/products/hardware/esp32/overview. [Dostopano: 14-maj-2019]. [28] U. Hunkeler, H. L. Truong, in A. Stanford-Clark, „MQTT-S — A publish/subscribe protocol for Wireless Sensor Networks“, v 2008 3rd International Conference on Communication Systems Software and Middleware and Workshops (COMSWARE ’08), 2008, str. 791–798. [29] „Firebase“. [Na spletu]. Dostopno: https://firebase.google.com/. [Dostopano: 25-maj-2019]. [30] „Devnet Public MAM decoder - TheTangle.org“. [Na spletu]. Dostopno: https://devnet.thetangle.org/mam/WAC9LYKMHEWYMSPXUZEGSQLPXXEICNGSWW9JRDHHYDFI MHNBEQP9MOIRDLPTBMA9BNMJBHJ9NNDDXVTMV. [Dostopano: 16-maj-2019]. [31] „compass/docs/private_tangle at master ꞏ iotaledger/compass“. [Na spletu]. Dostopno: https://github.com/iotaledger/compass/tree/master/docs/private_tangle. [Dostopano: 09-maj-2019]. [32] „the IOTA tangle“. [Na spletu]. Dostopno: http://tangle.glumb.de/. [Dostopano: 09-maj-2019]. [33] S. B. H. Hassine, M. Jemai, in B. Ouni, „Design and FPGA implementation of ternary hardware IP core for square root function“, v 2017 International Conference on Engineering & MIS (ICEMIS), 2017, str. 1–6. [34] „CHAT.ixi — Using Ict for Permissionless Chat on the IOTA Tangle“. [Na spletu]. Dostopno: https://blog.iota.org/chat-ixi-using-ict-for-permissionless-chat-on-the-iota-tangle-59ce6c5b95fb. [Dostopano: 24-maj-2019]. [35] „Coordinator. Part 1: The Path to Coordicide – IOTA“. [Na spletu]. Dostopno: https://blog.iota.org/coordinator-part-1-the-path-to-coordicide-ee4148a8db08. [Dostopano: 14-maj-2019]. OTS 2019 SODOBNE INFORMACIJSKE TEHNOLOGIJE IN STORITVE M. Heričko in K. Kous (ur.) RAZVOJ DECENTRALIZIRANIH APLIKACIJ: RAZVOJ IGRE NA SREČO Z GENERATORJEM PSEVDO‐ NAKLJUČNIH ŠTEVIL JURE TRILAR, ANDREJ KOS, EMILIJA STOJMENOVA DUH11 Povzetek: Blokovne verige (ang. Blockchain) zagotavljajo nepotvorljivo revizijsko sled različnih sredstev v obliki kriptožetonov, pametnih pogodb in podatkov v njih, ob tem pa ponujajo učinkovite preživitvene in varnostne mehanizme tudi v primerih velikih varnostnih ali infrastrukturnih motenj omrežja. To odstrani potrebo po zaupanju centralni avtoriteti in uporabnik se lahko zanese na avtonomno delovanje sistema, ki temelji na naboru matematičnih pravil. Primer bolj aktualnih uporab blokovnih verig je distribuirano izvajanje računalniških algoritmov, ki so zapisani v obliki pametnih pogodb. Na tem področju po odprtosti in razširjenosti prednjači platforma Ethereum, s pomočjo katere izdelujemo t.i. decentralizirane aplikacije (dApp). Kljub temu, da Ethereum okolje za izvajanje ponuja Touringovo celovitost, pa obstajajo določene zadrege, ki izhajajo iz konceptualne zasnove t.i. največjega in najpočasnejšega računalnika na svetu, kjer se programska koda izvaja simultano na več deset tisoč vozliščih, ki praviloma vrnejo isti izid v razdobju nekaj minut. Ob tem se pojavlja vprašanje, kako zagotoviti naključnost (ang. randomness) v takšni distribuirani platformi, kjer morajo vsi akterji praviloma izračunati isti rezultat. Naključnost generiranja števil je bistvena predvsem za igre na srečo; platforma Ethereum pa po zasnovi tega ne more zagotoviti. V članku najprej raziščemo splošne omejitve platforme pri shranjevanju podatkov v pametnih pogodbah na decentraliziranih sistemih ter obravnavamo tipična varnostna tveganja in luknje v pametnih pogodbah. Nadalje opišemo razvoj in scenarije delovanje igre na srečo, ki temelji na izbranih pravilih in zagotavlja poštenost prek zaledja razvitega na platformi Ethereum. Začelje decentralizirane aplikacije je iz aktualnih spletnih tehnologij Node, Vue in Web3.js. Pri načrtovanju igre je upoštevan pristop, ki vključuje tudi uporabnikove potrebe, predvsem z vidika težavnosti razumevanja in uporabe blokovnih verig, ter temeljnih motivacijskih mehanizmov, kar bi omogočilo večjo privlačnost za pogostejšo uporabo. Članek se zaključi z analizo pridobljenih izkušenj glede razvoja konkretne decentralizirane aplikacije in uporabe te tehnologije ter razmislekom o primernosti in zrelosti te tehnologije ter o ovirah, ki jih bo treba v prihodnje preseči. Ključne besede: blokovne verige, decentralizirane aplikacije, Ethereum, generiranje naključnih števil, spletne igre na srečo NASLOVI AVTORJEV: Jure Trilar, raziskovalec, Univerza v Ljubljani, Fakulteta za elektrotehniko, Ljubljana, Slovenija, e-pošta: jure.trilar@fe.uni-lj.si. dr. Andrej Kos, redni profesor, Univerza v Ljubljani, Fakulteta za elektrotehniko, Ljubljana, Slovenija, e-pošta: andrej.kos@fe.uni-lj.si. dr. Emilija Stojmenova Duh, docentka, Univerza v Ljubljani, Fakulteta za elektrotehniko, Ljubljana, Slovenija, e-pošta: emilija.stojmenova@fe.uni- lj.si. https://doi.org/10.18690/978-961-286-282-4.6 ISBN 978-961-286-282-4 Dostopno na: http://press.um.si 50 OTS 2019 SODOBNE INFORMACIJSKE TEHNOLOGIJE IN STORITVE J. Trilar, A. Kos, E. Stojmenova Duh: Razvoj decentraliziranih aplikacij: razvoj igre na srečo z generatorjem psevdo-naključnih števil UVOD Ob kratkovidnem navdušenju nad tehnologijo blokovnih verig (angl. blockchain) je precej posameznikov in organizacij, ki poskušajo najti načine, kako bi blokovne verige uporabili v obstoječih procesih ali razvili nove. Izkušnje kažejo, da večina teh poskusov služi zgolj kot opozorilo, da je potrebno za vsak primer uporabe na specifičnih domenskih področjih posebej dobro razmisliti, ali s to novo tehnologijo dejansko prispevamo k dodatni uporabni vrednosti. Blokovne verige se večkrat omenja kot inovacija, ki rešuje problem decentraliziranega zaupanja, zato ocenjujemo, da bi bila navezava z spletnimi igrami na srečo, kljub določenim omejitvam, dobra izbira za izvedbo učinkovitega prikaza izbranega uporabniškega scenarija. Pogosto smo bili v vlogi, ko bi s pomočjo blokovnih verig, želeli reševati velike družbene probleme ali izboljševali kompleksne procese v panogah, kot so bančništvo, energetika, avtomobilska industrija, turizem,... Tokrat pa smo se omejili na, pravzaprav preprosto, vendar pa ne nepomembno in povsem praktično demonstracijo reševanja enega osnovnih konceptualnih zadreg v procesiranju na blokovnih verigah, oz. natančneje, težave pri generiranje naključnih števil na platformi Ethereum. BLOKOVNE VERIGE Tehnologije blokovnih verig imajo širok spekter uporabnosti, ki, poleg zanimivih tehničnih rešitev, vključujejo tudi pričakovanja, da bodo postale ena bolj disruptivnih tehnologij v poslovnih procesih. V preteklem času so rešitve, povezane s temi tehnologijami, že doživele širšo prepoznavnost, kar je bilo povezano z medijskimi objavami povezanimi z špekulacijami glede cen teh novih, prepoznavnih, vendar pogosto nerazumljenih tehnologij. Bitcoin, ki ga je izumil anonimni avtor pod psevdonimom Satoshi Nakamoto leta 2008, je bil prvi javni prikaz tehnologije in konceptov blokovnih verig. Nakamoto je poleg znanega članka, Bitcoin: A Peer-to-Peer Electronic Cash System, izdal tudi prvo verzijo delujoče kode, ki je povzročila veliko zanimanje v kriptografski in razvijalski skupnosti. Rešitev služi, kot prva javna infrastruktura za kriptovaluto Bitcoin, ki je reševala problem dvojnega trošenja (angl. double-spending), brez centralne avtoritete, ki bi bila zadolžena za nadzor. Zagotavlja nepotvorljivo, javno dostopno bilanco (angl. ledger), kamor je možno zapisati, ne samo finančne, temveč tudi razne druge transakcije za širšo uporabo [1]. Če ilustriramo, prešli smo iz tradicionalne uporabe računalnika, kjer je bilo moč neko podatkovno entiteto kopirati večkrat, in jo obenem obdržati pri sebi, do uporabe, kjer edinstveno entiteto lahko prenesemo drugam ter je, zaradi tega, nimamo več na voljo pri sebi, kar bolj pristno posnema »naravni« svet izven digitalnim aparatov. Zasnova Bitcoina je navdihnila razvoj cele vrste novih platform na različnih področjih uporabe. Večina platform blokovnih verig, podobno kot prvi vzor za blokovne verige - Bitcoin, obljublja odprto, javno dostopno, distribuirano bilanco, ki omogoča transakcijo med različnimi akterji na zanesljiv in preverljiv način. Dostop, spremljanje stanja in izvedbo transakcij omogočata privatni ključ in njegov asimetrično kriptiran derivat v obliki javnega ključa. Splošne definicije, kaj so blokovne verige in čemu so namenjene, vključujejo navedbe, da so blokovne verige naraščajoč nabor podatkov, ki so združeni v bloke in med sabo povezani z kriptografskimi funkcijami [2]. Vsak blok vsebuje kriptografski povzetek vsebine prejšnjega bloka, časovni žig in podatke o transakcijah, ki so večkrat predstavljeni s povzetki Merklovih korenov (angl. Merkle tree root hash). Za učinkovito distribuiranje podatkov skrbi P2P omrežje, ki kolektivno skrbi za skladnost oz. konsenz glede vsebine transakcij v komunikaciji med vozlišči pri potrjevanju blokov [3]. Kljub temu, da večkrat zasledimo to besedo, konsenz, pa praviloma ne gre za pravi konsenz, ki vključuje razumevanje in strinjanje z določenimi vnosi, temveč gre v originalni izvedbi ( proof of work pri Bitcoin-u) za loterijo, ki skrbi za to, da blok potrdi naključno izbran rudar (angl. miner) oz. rudarska zadruga (angl. pool), ki si obeta nagrado za pravilno ugotovljen povzetek aktualnega bloka z določenim številom ničel spredaj, ki predstavljajo težavnosti, ki je neposredno povezana z računsko močjo - na ta način omrežje poskrbi za svojo samoohranitev. Obstajajo seveda tudi drugi pristopi ( proof of stake, proof of authority, dBTF,…), ki poizkušajo vzpostaviti mehanizme, ki bi ponujali dovolj zanesljivosti in motivacije za sodelovanje pri uporabi ter vzdrževanju takih omrežja, vendar za splošno razumevanje, kaj so to blokovne verige, ne bomo osvetlili vseh platformskih projektov, saj vsaka ponuja svoj pristop oz. konkurenčno prednost, ki jih loči od ostalih. OTS 2019 SODOBNE INFORMACIJSKE TEHNOLOGIJE IN STORITVE 51 J. Trilar, A. Kos, E. Stojmenova Duh: Razvoj decentraliziranih aplikacij: razvoj igre na srečo z generatorjem psevdo-naključnih števil Negotovost, ki obdaja uporabo teh tehnologij, je rezultat tisočerih poizkusov in projektov, ki so ostali na robu pred-produkcijskega razvoja. Zrelost in uporabnost tehnologije blokovnih verig, poleg tehničnih dejavnikov, določajo predvsem dejavniki, ki so povezani z poslovnimi procesi in uporabniško izkušnjo [4]. Splošne omejitve, na katere ljudje naletijo pri uporabi blokovnih verig zajemajo [5]:  Blokovne verige ne pokrivajo vseh potreb in želja. Za enkrat še velja pravilo, da so blokovne verige ujete med tri konkurenčne-si cilje: hitrost, nizki stroški obratovanja in dovolj velika decentralizacija. Ponazorimo: hitre in dovolj decentralizirane verige rezultirajo v višjih stroških shranjevanja in prenosov, ki se jim je težko izogniti tudi z bolj sofisticiranimi prijemi. Tako sledi tudi, da hitre in poceni verige potrjujejo transakcije na manjšem številu znanih vozlišč, vendar pa postavlja pod vprašaj zaupanje v tako omrežje, saj lahko ponudnik/razvijalec na omrežje lažje vpliva.  Blokovne verige ne predvidevajo pomoči strankam. Ob tem, ko se je povprečni uporabnik navadil na možnost pridobitve pozabljenega gesla spletnih storitev s strani ponudnika, je težko narediti korak nazaj. Zaradi svoje ireverzibilne narave, kar je obenem tudi ključna prednost, pri izgubi zasebnih ključev nihče ne more pomagati. Izguba sredstev zaradi minornih napak in nepozornosti je za uporabnike zastrašujoča.  Blokovne verige dodajajo »trenje« v že optimizirane procese. Uporaba decentraliziranih aplikacij v tem trenutku je vse prej kot intuitivna in lahka. Nepoučeni uporabniki, ki so danes sicer že vešči izvajanja plačil na spletu, se soočajo z bojaznijo kaj se zgodi z njihovimi sredstvi in, ali bodo za svoje plačilo z kriptovaluto res prejeli naročeno blago. To v kombinaciji z počasnostjo in provizijami sigurno ne vzbuja zaupanja v splošni javnosti. Uporabniki so v današnjem času navajeni hitrih mobilnih aplikacij in takojšnje zadovoljitve potreb in za to že obstajajo rešitve, ki so bile optimizirane v desetletjih razvoja, kot v primeru plačila z kreditno kartico, povezano z mobilno aplikacijo, kjer se transakcija izvede v manj kot dveh sekundah [6].  Pomanjkanje nadzora in regulacije povzroča negotovost v poslovnih procesih. Z razmahom spornih poslovnih praks, propadlih projektov in povečano magnitudo nereguliranega zbiranja denarja prek t.i. ICO postopkov, se je povečala potreba po pravni zaščiti udeležencev. Zakonodajne in vladne inštitucije zaenkat sicer sledijo novim inovativnim tehnologijam in procesom, vendar težko ocenijo stanje in ukrepajo zoper posamezne akterje in aplikacije v primeru neupoštevanja varnostnih zahtev in poslovnih modelov, ki niso v skladu z zakonodajo [7].  Kompleksnost tehnologije ustvarja splošen vtis, da te tehnologije niso dovolj uporabne. Pojmi enkripcije, decentralizacije in porazdeljenega konsenza, kot temeljev blokovnih verig, so pogosto preveč odtujeni od povprečnega občana, da bi v njih videl uporabno vrednost. Brez širšega privzemanja tehnologije v družbi in podpore inštitucij je težko pričakovati povečano potrebo po uporabi blokovnih verig. Potreben je razmislek o temeljnih problemih, ki jih želimo rešiti s to tehnologijo, s posebnim ozirom na omejitve, ki ne izvirajo iz tehničnih pristopov k načrtovanju te tehnologije, temveč iz uporabniških ter konceptualnih zadreg in so verjetno bolj pomembne, kar se tiče uspeha in uporabnosti v splošni javnosti. Tehnologije blokovnih verig niso univerzalen odgovor na probleme v družbi in ekonomiji, dobro pa rešujejo specifične scenarije, ki jih prej ni bilo mogoče nazvati z etabliranimi pristopi. Sklenemo, glavna konceptualna značilnost vseh platform blokovnih verig je nespremenljivost podatkov, zapisanih v seriji blokov, v matematičnih funkcijah (npr. DAG – usmerjeni neciklični grafi) ali podobno. Ta nespremenljivost podatkov v povezavi z inovativnimi motivacijskimi mehanizmi za podpiranje infrastrukture predstavlja osnovo za privlačne rešitve, ki vnašajo v svet računalništva nove razburljive koncepte, povezane predvsem z transakcijskimi procesi. Ostale skupne značilnosti so:  Decentraliziranost baze podatkov. Ob nedosegljivosti enega ali nekaj od podpornikov infrastrukture, sistem še vedno deluje brez težav.  Varnost podatkov. Podatki so sočasno zapisani v več vozliščih, redundantnost podatkov je maksimalna.  Odstranitev potrebe po zaupanju centralni avtoriteti. Več partnerjev, ki imajo v svojih vozliščih v vsakem trenutku pri sebi zadnjo aktualno verzijo podatkov, ne potrebuje osrednjega potrjevalca transakcij, temveč se zanašajo na avtonomno delovanje sistem, ki temelji na matematičnih primitivih. 52 OTS 2019 SODOBNE INFORMACIJSKE TEHNOLOGIJE IN STORITVE J. Trilar, A. Kos, E. Stojmenova Duh: Razvoj decentraliziranih aplikacij: razvoj igre na srečo z generatorjem psevdo-naključnih števil  Preverljivost in nezmožnost ponarejanja podatkov. Vnosi so za nazaj nespremenljivi in ustvarjajo nepotvorljivo, praviloma javno dostopno, revizijsko sled.  Mehanizmi za konsenz. Če pride do sočasno nasprotujočih si vnosov, mehanizmi za konsenz (praviloma naključno izbrano vozlišče) poskrbijo za razrešitev konfliktov, kar vpliva na celovito integriteto podatkov. DECENTRALIZIRANE APLIKACIJE Najbolj pomemben koncept, po mnenju avtorjev, ki se je uveljavil na nekaterih aktualnejših platformah blokovnih verig je decentralizirano računalništvo, ki prej omenjene prednosti nadgradi še z možnostjo izvajanja serije ukazov oz. algoritmov na zanesljivi distribuirani infrastrukturi. Za napredek transakcijskih platform, ki so na začetku temeljile na kodi in mehanizmih, ki jih je uveljavil Bitcoin, je počasen razvoj postal problem. Razvijalci so se znašli pred razpotjem, ali razširiti obstoječ nabor funkcij, kar bi bilo kompleksno in časovno zelo potratno, ali razviti popolnoma novo platformo. Ta izziv je prepoznal mladi Kanadčan ruskega rodu, Vitalik Buterin, in z novimi pristopi izumil platformo za decentralizirano izvajanje ukazov – Ethereum. Za Ethereum rečemo, da je največji, vendar najbolj počasen virtualni računalnik na svetu z hitrostjo obratovanja vezano na generacijo novega bloka. Pred izumom Ethereuma so bile aplikacije, ki so komunicirale z Bitcoin omrežjem, omejene na ozek nabor operacij, saj so bili Bitcoin in posnemovalci razviti izrecno za peer-to-peer digitalne valute. Osrednja inovacija, Ethereum virtualni stroj (EVM) je programska oprema, ki deluje na temelju odprtega Ethereum omrežja in omogoča programsko celovitost po Turingu. EVM je temelj razvoja decentraliziranih aplikacij. Namesto, da bi morali za vsak primer uporabe narediti svojo blokovno verigo, lahko na podlagi Ethereum omrežja in kratkih programčkov, t.i. pametnih pogodb (angl. smart contracts), ustvarimo namensko rešitev za decentralizirane aplikacije, ki lahko vsebuje tudi lastne žetone za transakcije brez posrednikov. Ti žetoni imajo lahko različne vloge, od splošnih tipa ERC 20 do nosilcev edinstvenih sredstev ERC 721 ter drugih naprednih, npr. ERC 223, 777 in 820. Popularni izraz za kratka programska navodila, ki se izvajajo na izbrani platformi blokovnih verig, so pametne pogodbe – ki v resnici niso niti pametne, saj gre za »ne-posebno-pameten« niz programskih navodil, niti niso pogodbe per se, saj avtomatizem in nepremenljivost, kot temeljni lastnosti pametnih pogodb, lahko posegata v zakonsko načelo prostega urejanja obligacijskih razmerij. Kljub številnim prednostim, decentralizirane aplikacije seveda niso vedno brezhibne in brez napak, kakor se je že večkrat izkazalo. Pametne pogodbe so varne le toliko, kot so ljudje, ki so jih napisali, za to usposobljeni. Napake in hrošči v knjižnicah se lahko izkoristijo za različne napade, kar vodi do nezaželenih posledic ter izgube vseh sredstev. Ob tem, zaradi konceptualne zasnove, ni učinkovitih načinov, kako preprečiti tekoči napad ali povrniti prejšnje stanje – razen v izredno redkih primerih, ko gre za spremembe infrastrukturne jedrne kode in njene zamenjave na vozliščih, kjer se procesirajo pametne pogodbe, za kar pa je potrebno pridobiti večino razvijalske skupnosti – t.i. hard- fork. Pametne pogodbe v praksi predstavljajo jedro zaledja (angl. backend) v smislu shranjevanja in procesiranja podatkov za t.i. decentralizirane aplikacije (angl. dApp). Za razvoj začelja, prednje maske (angl. frontend) se uporabljajo uveljavljene spletne tehnologije, ki se praviloma procesirajo tam, kjer je prezentacija vmesnika, pri uporabniku (angl. client-side). Kriteriji za izbiro primerne infrastrukture, kjer bi razvili prototipa so enaki, kot v podobnih situacijah pri razvoju decentraliziranih aplikacijah s katerimi so se že srečali v preteklosti, in vključujejo [8]:  zadosten dostop do razvojnih virov, velikost in odzivnost aktivne razvijalske skupnosti, dostopnost dokumentacije in dobri primeri obstoječih izdelkov, na osnovi česar lahko minimiziramo možnost, da se razvoj ustavi, ker temeljne infrastrukturne rešitve niso dobro dokumentirane ali morebitne težave še niso bile obravnavane, ter se izognemo kritičnim tehničnim oviram, ki nastanejo v primeru napak na jedrni platformi, in težavam z vzpostavitvijo lastne informacijske hrbtenice, ki bi podpirala to platformo;  možnost prototipiranja in testiranja širokega nabora uporabniških scenarijev, česar ne omogočajo vse platforme, saj so nekatere med njimi specializirane zgolj za specifične tehnične in poslovne pogoje; OTS 2019 SODOBNE INFORMACIJSKE TEHNOLOGIJE IN STORITVE 53 J. Trilar, A. Kos, E. Stojmenova Duh: Razvoj decentraliziranih aplikacij: razvoj igre na srečo z generatorjem psevdo-naključnih števil  možnost prenosa realiziranih konceptov in uporabne vrednosti na druge platforme, ko bodo le-te bolj zrele za produkcijsko uporabo;  uporaba javnega okolja, pri čemer se za shranjevanje podatkov in procesne potrebe integracije lahko zanašajo na javno infrastrukturo, ki je ni potrebno vzdrževati. Tudi tokrat je rezultat izbire še vedno enak – izbrali smo najbolj razširjeno , ki ima dovolj veliko razvijalsko skupnost in dovolj kvalitetne razvijalske dokumentacije: Ethereum. Protokol za varen prenos podatkov v tehnologiji blokovnih verig na omrežju Ethereum vključuje [8]:  Sorazmerno hitro pridobitev podatkov iz platforme Ethereum, ki praviloma ne presega 300 milisekund;  manjšo hitrost zapisovanja in potrjevanja zapisov, ki praviloma zahteva od 3 do 5 minut;  konstantnejše generiranje blokov v primerjavi z omrežjem Bitcoin;  uporabo različnih razvojnih okolij in knjižnic, kot so Truffle, Remix Web IDE itd.;  procesiranje programske logike v izvajalnem okolju Ethereum Virtual Machine [9], ki omogoča visoko decentralizacijo na 27.500 vozliščih po vsem svetu;  razvoj pametnih pogodb v namenskem jeziku Solidity [9] ali Vyper, ki temelji na jeziku Python;  integracijo s pametnimi pogodbami iz spletnih aplikacij na osnovi aplikacijskega programskega vmesnika Ethereum JavaScript API (Web3.js) [10], kar predstavlja široko dostopno razvojno okolje;  lastno sredstvo za potrjevanje transakcij v obliki kriptovalue Ether v obliki Gas [11], kar predstavlja mikro enote primarne valute in se nanaša na obremenitev »največjega in najpočasnejšega« računalnika za svetu, pri čemer so v praksi stroški transakcij manjši kot provizije za transakcije Bitcoina;  transformacijo iz energetsko potratnega protokola nagrajevanja PoW (Proof-of-Work) v protokol PoS (Proof-of-Stake) [12, 13];  razvoj v različnih razvojno-testnih omrežjih (Ropsten, Rinkeby, Kovan ali RPC po meri), v katerih se za testiranje ne porablja prava vrednost Ethra, kot je to na glavni hrbtenici (main-net). NAKLJUČNOST NA DECENTRALIZIRANI PLATFORMI ETHEREUM EVM deluje na način, da se ista koda izvede sočasno na več vozliščih, vedno zgolj po klicu funkcij v pametni pogodbi. Za zagotavljanje integritete mora biti rezultat izhoda funkcije isti. Obstajajo pa primeri, ko za rezultat potrebujemo naključno število in v takih situacijah naletimo na težavo, kako podati naključno število, ki je rezultat sinhronega procesiranja [14]. Pravilno generiranje naključnih števil je zelo pomembno predvsem pri igrah na srečo in v kolikor to ni naključno in se da nanjo vplivati oz. vnaprej oceniti rezultat, je pristransko in problematično ter izzove vsaj nezaupanje udeležencev v igri. Potrebno se je zavedati, da je prava naključnosti (v računalništvu) zelo obširna in težavna tema. Obstaja več vrst naključnosti, ki jih lahko nazovemo z pravilnim inženiringom računalniških čipov, glede na potrebe in stopnjo šuma in zadovoljive rezultate. Da bi generirali pravo naključno številko, bi morali izmeriti neko fizično stanje naključja izven računalniškega sistema. Ker pa v praksi ne potrebujemo meriti entropije, npr. v obliki naključnega razpada atoma, ki ga po kvantni teoriji ne moremo napovedati, se zadovoljimo z računalniško generiranimi aproksimacijami [15]. To vsekakor zagotavlja zadostno stopnjo naključnosti za večino primerov uporab na svetu. Namesto merjenja entropije se uporablja t.i. zrno (seed) ali več njih, nato pomočjo raznih preslikav, asimetričnih transformacij predstavimo na videz naključen rezultat – uporabimo t.i. psevdo- naključnost. Za potrebe prototipa se bomo zadovoljili z determinističnim generiranjem števil, na katero ne bo mogoče neposredno vplivati z zunanjimi dejanji. Pred tem smo preverili, kakšne so možne kritične napake pri generiranju naključnih števil na platformi Ethereum, ki bi napadalcem omogočila vplivanje na rezultat. Reutov [14] in sodelavci so analizirali 3.649 pametnih pogodb iz različnih virov, od teh je bilo 43 pogodb ranljivih z vidika ustvarjanja psevdo-naključnih števil, saj so za zrno izbrali vire, ki jih je mogoče določiti že prej: na podlagi raznih podatkov o trenutnem bloku in stanju omrežja, na podlagi povzetkov prejšnjih blokov, na podlagi kombinacije podatkov zapisanih v blokih in na videz zasebnih podatkov ter drugih psevdo-naključnih generatorjev, kjer pa je mogoče z izračunom vnaprej določiti izid. Podrobnosti nazornih primerih so na voljo 54 OTS 2019 SODOBNE INFORMACIJSKE TEHNOLOGIJE IN STORITVE J. Trilar, A. Kos, E. Stojmenova Duh: Razvoj decentraliziranih aplikacij: razvoj igre na srečo z generatorjem psevdo-naključnih števil v strokovnem članku Reutova Predicting Random Numbers in Ethereum Smart Contracts [14], v tem prispevku jih ne potrebujemo detajlno izpostavljati. Izpostavili pa bi predlagane rešitve, ki jih lahko uporabimo za lasten prototip:  Uporaba zunanjega oraklja (angl. oracle). Zaupanja vreden zunanji vir, ki se ne nahaja na platformi Ethereum, preko API zahtevka ali posrednika v obliki javne, za to namenjene pogodbe, prosimo za generiranje naključnega števila. Zadržki so očitni, gre za centralizirano zunanjo storitev, kjer je potrebno zaupati ponudniku. Različni ponudniki (Oraclize, BTCRelay, Randao) vključujejo različne vire entropije, vsi pa ponujajo neko stopnjo kompleksnosti, ki jo je težko simulirati [15]. Nekatere storitve so plačljive.  Uporaba niza namenskih pametnih pogodb (algoritem Signidice). Algoritem, ki temelji na zasebnih kriptografskih podpisih v proces generiranja psevdo-naključnega števila, vključuje dve strani, uporabnika in ponudnika. Obe strani v tem primeru, po tem ko so naložena sredstva za stavo, uporabita svoj privatni ključ, zato gre moč z veliko gotovostjo trditi, da nimata motivacije za goljufanje, saj bi to vodilo v izgubo sredstev na računu. Ta pristop je bilo sicer, pred nadgradnjo Ethereum omrežja (Metropolis hardfork), z strani ponudnika možno zlorabiti.  Pristop objavi-razkrij (angl. commit-reveal approach). Gre za dvostopenjski način, kjer v prvi fazi vsi udeleženi prispevajo svoje kriptografske skrivnosti v pametno pogodbo, kar omeji vpliv enega udeleženca na rezultat. V drugi fazi pa pametna pogodba na podlagi združenih kriptografskih skrivnosti (poljuben tekstovni niz, uporabniško ime, javni ključ ali podobno) ter dodatka povzetka (angl. blockhash) pravkar generiranega bloka, izgradi psevdo-naključno število, ki ga nato uporabimo neposredno v decentralizirani aplikaciji. Ta pristop ponuja tri vire entropije: uporabnikov vnos, ponudnikov vnos, infrastrukturni žig. Motivacije za goljufijo neposredno (uporabnik in ponudnik) ali posredno (rudar) udeleženih v procesu se med seboj izključujejo, tudi kadar gre v resnici za isto osebo v deljenih vlogah (npr. uporabnik in rudar). Za naš prototip smo izbrali tretji pristop, dvostopenjski način, ki omogoča, da generiranje psevdo-naključnih števil vodimo iz ene pametne pogodbe, brez dodatnih tveganj in kompleksnosti. V nadaljevanju (Programska koda 1), pri razvoju zalednega dela prototipa decentralizirane aplikacije, bomo prikazali pametno pogodbo v relevantnem delu, ki se nanaša na psevdo-naključno generiranje števila za potrebe igre na srečo. UPORABNIŠKA IZKUŠNJA SPLETNE IGRE NA SREČO Za prikaz uporabe psevdo-naključnega generiranja števila smo si izbrali primer uporabe, kjer je to še kako ključno – spletno igro na srečo. Naše temeljno videnje je, da je pri načrtovanju vsakršnih digitalnih rešitev, tudi prototipov, potrebno upoštevati vsaj osnovne poglede uporabniške izkušnje. Ob uporabi na uporabnika usmerjenega pristopa (angl. user-centred design) načrtujemo rešitve, kjer izboljšujemo tehnične vidike, ki se skladajo z potrebami in željami dejanskih uporabnikov. Analiza področja motivacije za igranje spletnih iger [16-19], nas navaja na robustni konceptualni okvir, ki kaže na podobno strukturo iz generičnih faktorjev, ki se nanašajo na sledeče dimenzije:  Dosežki pri igranju. Ta dimenzija vključuje generične faktorje, kot so: napredek pri igranju, nezatikajoča-se tekmovalna mehanika igranja.  Družabnost se nanaša na možnost neposrednega tekmovanja in medsebojne komunikacije med igralci.  Pristna izkušnja omogoča igralcu na videz nasprotujoča se faktorja: na eni strani nove izkušnje, na drugi strani pa okolje z znanimi zgodbovnimi elementi.  Zaupanje, ki se reflektira v lojalnosti uporabe. Zaupanje vključuje različne faktorje, od predvidljivosti uporabniškega vmesnika in zanesljivosti delovanja igre, do ugleda ustvarjalca oz. ponudnika igre ter jasnega sporočila. Za povečano motivacijo za sodelovanje v spletnih igrah na srečo pomembnih več teh kritičnih dimenzij. Ocenjujemo, da je najbolj pomemben kriterij v teh primerih je četrta komponenta - upravičevanje zaupanja. Sistematično testiranje modelov motivacije in zaupanja za sodelovanje v spletnih igrah na srečo je prikazalo več dimenzij, na katere so pozorni uporabniki pri komponenti zaupanja v spletnem igralništvu [16]: OTS 2019 SODOBNE INFORMACIJSKE TEHNOLOGIJE IN STORITVE 55 J. Trilar, A. Kos, E. Stojmenova Duh: Razvoj decentraliziranih aplikacij: razvoj igre na srečo z generatorjem psevdo-naključnih števil  Informativna vsebina, razumljivost. Uporabniki, ki igrajo igre na srečo, morajo poznati način delovanja igre, da lahko bolj ali manj uspešno ocenijo tveganje, ki nastaja ob stavi.  Odnosi z uporabniki. Ta vidik se nanaša na vidne kontakte in vtis, da je poslovanje pod okriljem znane osebe ali organizacije, ki nosi pravno odgovornost v primeru težav in napak.  Lastnosti uporabniškega vmesnika in privlačna mehanika igre. Predvidljivost, jasen namen kaj igra od uporabnika pričakuje.  Odnos uporabnikov do iger na srečo. Pomemben filter za sodelovanje v igrah na srečo je seveda temeljni odnos določenega dela populacije do tega področja. Faktorjev za uporabo takih rešitev ne moremo učinkovito meriti na populaciji, ki takih igre ne uporablja ali ima do le-teh odklonilen odnos. Na podlagi obravnavanih dimenzij (dosežki, družabnost, pristna izkušnja in zaupanje), ki so pomembne za motivacijo za igranje spletnih iger v splošnem, in tudi v specifičnem primeru spletnih iger na srečo, smo v nadaljevanju izbrali in opisali funkcionalnosti prototipa, ki podpirajo te vidike. ZASNOVA SPLETNE IGRE ICO SIMULATOR Z prototipom smo, v povezavi z razmislekom o uporabniški izkušnji, želeli prikazati prijeme pri generiranju naključnih števil z decentralizirano aplikacijo v obliki igre na srečo. Poskušali smo upoštevati ključne generične komponente spletnih iger na srečo, vendar smo se soočili še z enim posebnim izzivom – z načrtovanjem uporabniške izkušnje, kjer je ta, zaradi visokega praga znanja, ki je potrebno za sodelovanje, izjemno težavna. Pri načrtovanju zgodbovnega jedra in načina grafične predstavitve se tako soočimo z dilemo – ali poskušati izboljšati uporabniško izkušnjo za splošne množice (kar predstavlja že osnovni problem okolja blokovnih verig) ali izboljšati uporabniško izkušnjo za ožji segment uporabnikov, ki že poznajo specifike uporabe blokovnih verig [20-22]. Glede na prej navedene zadrege glede uporabe blokovnih verig v širši javnosti in pogovorom z strokovnjaki in obstoječimi uporabniki decentraliziranih aplikacij smo sklenili uporabniško izkušnjo prilagoditi za ožji segment uporabnikov, ki tovrstne rešitve že poznajo, prepoznavajo njihovo uporabnost in povezane vsebinske elemente. Razvpitost poslovnega modela zbiranja kapitala v kriptovalutah, t.i. ICO (angl. Initial Coin Offering) skupinskega financiranja je konceptualna podlaga za mehanizem igre, ki bi bila na ta način lahko na nek način znana in zanimiva za uporabnike, ki sicer že poznajo okolje in uporabo blokovnih verig. Spletno igro na srečo v obliki decentralizirane aplikacije smo poimenovali ICO Simulator. Gre za zabaven, rahlo parodičen destilat dogajanja na področju ICO zbiranja denarja preko kriptovalut in nadaljnjih aktivnosti, kjer je bil, kljub pričakovanjem navadnih vlagateljev, da bo to inovativna tehnologija, glavni katalizator sprememb v cenah promocijski ustroj, ki je z manipulacijo in različnimi psihološki pritiski krojil usodo vloženega denarja. Z ozirom na pomembne komponente spletnih iger s poudarkom na vzpodbujanja zaupanja smo elemente uporabniškega vmesnika razdelili na posamezne sklope: Elementi uporabniškega vmesnika (Slika 1):  Vzpodbujanje zaupanja v storitev: o stanje omrežja in generiranja blokov, o identifikacija uporabnikove denarnice in stanje sredstev v povezani denarnici, o zgodovina krogov in dobitkov.  Družabnost: o komunikacija med prisotnimi igralci,  Dosežki pri igranju z vizualno stimulacijo: o prikaz sredstev v stavi trenutnega kroga, o animiran graf, ki se giblje v skladu z trenutno stopnjo.  Pristna izkušnja preko poznanih vsebinskih konceptov: o besedila in aktivnosti so preneseni iz različnih scenarijev iz ICO področja, o uporabniško generirano ime in podatki trenutnega kroga. 56 OTS 2019 SODOBNE INFORMACIJSKE TEHNOLOGIJE IN STORITVE J. Trilar, A. Kos, E. Stojmenova Duh: Razvoj decentraliziranih aplikacij: razvoj igre na srečo z generatorjem psevdo-naključnih števil Slika 1: Spletni vmesnik spletne igre na srečo Potek igre smo načrtovali, kot iskanje vzporednic v dogajanju množice ICO postopkov, skozi oči nepoučenega zunanjega opazovalca, in na ta način začrtali potek od začetka prodaje navideznih deležev, do propada projekta. Praviloma gre ob tem za kovanje dobičkov zgodnjih investitorjev na plečih kasnejših, ki so pripravljeni za sredstva oz. deleže plačati več. Mehanizem igre: 1. Krog se začne z praznim stanjem sredstev 2. Igralec, ki prvi vplača sredstva ima pravico, da poimenuje svojo ICO krog. 3. Vsakič, oz. ob naslednjem generiranju bloka, ko katerikoli igralec vplača sredstva, se stopnja oz. krog poveča za 1. 4. Ob generiranju bloka z vplačilom se izžreba polno število od 0 do 9, to je 10 možnih rezultatov. Če je rezultat od 1 do 9, se igra nadaljuje in čaka nove »investitorje«. Če pa je rezultat 0, ICO naredi t.i. »exit scam« oz. vrednost pade na 0; s tem se igra zaključi. 5. Sredstva se po določenem ključu razdelijo med sodelujoče, največjo nagrade dobivajo tisti, ki so prvi »investirali« v ICO. Tisti, ki so prišli zadnji pa izgubijo vložek. 6. Igra se ustavi in ustvari se nov krog, ki čaka na prvo vplačilo. Možnost, da se igra zaključi v posamezni dani stopnji je tako 1/10, vendar na nek način igralcu vizualno sporočamo kontinuiteto in zveznost stopenj. Igralca, kot pri vseh igrah na srečo, želimo odtujiti od pravilne ocene verjetnosti [23], da bo prišel do zanj ugodnega rezultata. V resnici iščemo verjetnost, da se igra ne bo zaključila prekmalu, vsaj ne dokler ni dovolj novih »investitorjem«, ki investirajo za nami. Te verjetnosti so temelj za pravilno oceno ključa po katerem se delijo vplačana sredstva ob zaključku igre – to se zgodi, ko psevdo-naključni generator števil v pametni pogodbi iz nabora 0..9 vrne ničlo. Pri tem se zavedamo vsaj dveh skrajnih taktik, ki se jih poslužujejo igralci: (1) prvi oz. čimprej začeti igro in »investirati« dovolj, da znesek predstavlja dovolj velik delež pobranih sredstev, kar koristi ob končnem poračunu po določenem ključu; (2) investirati deleže v kasnejših korakih, da si zagotovimo končanje igre, vendar po tem, ko investirajo tudi drugi večji tepci (po principu »greater fool«). Rezultat bi bila dinamična igra, ki na videz osnovni princip nadgradi z sistematičnimi prijemi bolj izkušenih igralcev. Razumevanje take igre nam lahko, koristi pri povečavanju verjetnosti za dober delež vplačanih sredstev, vendar pa nam ga ne zagotavlja. V prilagoditve modela bi lahko vpeljali tudi dodatna pravila, na primer najmanjši znesek »investicije« ali pa provizijo ponudnika – vendar za potrebe tega prototipa in boljše razumljivosti modela to ni potrebno. Dinamika igre in uporabniški vmesnik bosta predmet nadaljnjega testiranja, z namenom pridobitve dodatnih dopolnitev v mehaniki igre ali interakciji z igralci. OTS 2019 SODOBNE INFORMACIJSKE TEHNOLOGIJE IN STORITVE 57 J. Trilar, A. Kos, E. Stojmenova Duh: Razvoj decentraliziranih aplikacij: razvoj igre na srečo z generatorjem psevdo-naključnih števil TEHNIČNA IZVEDBA PROTOTIPA Prototip spletne igre na srečo ICO Simulator je implementiran kot decentralizirana aplikacija in je sestavljen, kot tipične take aplikacije, iz ospredja, ki lahko deluje na poljubni lokaciji, ter ob povezavi z spletom, z vmesnikom Metamask v brskalniku, komunicira z zalednim delom, ki skrbi za procesiranje in shranjevanje podatkov na blokovni verigi Ethereum. 7.1 Začelje – uporabniški del decentralizirane aplikacije Uporabniški vmesnik (Slika 1) je narejen z osnovnimi spletnimi gradniki za strukturo (HTML5) in prikaz (CSS3). Izgled vmesnika je izboljšan z knjižnico Materialise CSS. Za dinamično vsebino skrbi VueJS z pomočjo knjižnice jQuery, ki podpira funkcionalnosti za animiranega grafe. Aplikacija je vpeta v ogrodje Express, ki se izvaja na mini strežniku Node.js za lokalno testiranje. Za namen javne objave smo vzpostavili odlagališče Github, ki je povezano s platformo HerokuApp, ki poskrbi za dostavo uporabniškega vmesnika preko javnega spletnega naslova v uporabnikov brskalnik. Vsi uporabniki imajo v igri enakovredno vlogo. Uporabniki praviloma uporabljajo spletni vtičnik v brskalniku Metamask za identifikacijo in prenos sredstev iz denarnice v pametno pogodbo aplikacije, za kar se da optimalno izkušnjo. 7.2 Zaledje – generiranje naključnega rezultata, procesiranje in shranjevanje podatkov Operacije zaledja so v celoti podprte z namensko pametno pogodbo napisano v programskem jeziku Solidity v vmesniku Remix IDE in zaenkrat domuje na testnem omrežju Ropsten. V primeru prijave na glavno omrežje Ethereum (mainnet) nas aplikacija opozori, saj tam konkretna pametna pogodba ni objavljena, ne deluje in zato ne dopušča izgube sredstev. Administrator lahko ureja in objavi pametno pogodbo z lastniškimi pravicami vezanimi na njegovo zasebno denarnico, kar je zapisano v pametni pogodbi. Pogodba je objavljena na unikatnem javnem naslovu. Po tem ko pridobimo njen unikaten naslov in vmesnik ABI (Application Binary Interface) jo lahko povežemo z uporabniškim delom aplikacije. Vnosov, ki so shranjeni v pametno pogodbo ne moremo več spreminjati, v primeru popravkov moramo postopek objave ponoviti in ponovno definirati ABI v kodi ospredja. Generiranje psevdo-naključnega števila od 0..9 poteka tako (Programska koda 1), da, ob novem vplačilu uporabnika, za zrna vzamemo javne naslove vseh udeleženih igralcev, po vrsti njihovih vplačil, ter jih začinimo s povzetkom zadnjega generiranega bloka. Vse to zgostimo s pomočjo transformacije niza znakov ( string) v števila ( uint), nato izračunamo vrednost od 0..9 ter vrnemo rezultat v uporabniški del, ki ustrezno prilagodi vmesnik, stopnja vizulne stimulacije se poveča, v primeru pa, da je rezultat enako 0, razdelimo vsa vplačila po izbranem ključu, ter podatke o dobitkih zapišemo v zgodovino dobitkov. Programska koda 1: Izsek pametne pogodbe, ki se nanaša na psevdo-naključno generiranje števil. V tem prispevku ni celotne pametne pogodba, ki je predmet iterativnih izboljšav vezanih na mehaniko igre. pragma solidity >=0.4.20; contract ICOsimulator { ..//.. struct CurrentRoundInvestor { /* new for every round */ bytes32[] stageEntered; /* enetered stage */ uint balanceOf; /* investment in entered stage */ } mapping (address => CurrentRoundInvestor ) public users; /* current users mapping*/ address[] private usersList; /* currentusers list for iterations */ ..//.. function GetRandomNumber() public view returns (uint256 result){ // from CurrentRoundInvestor addresses string to int for (uint i=0; i> ghc ‐o hello hello.hs [1 of 1] Compiling Main ( hello.hs, 'hello.hs' hello.o ) main = putStrLn ''Hello World'' Linking hello ... >> ./hello >> Hello World Programsko kodo v tem prispevku preizkušamo na operacijskem sistemu Linux Ubuntu, kamor namestimo prevajalnik GHC, npr. najlažje z »apt-get install ghc«. Programsko kodo prevedemo s sledečim ukazom v terminalnem oknu »ghc -o hello hello.hs«. S tem ustvarimo novo izvršljivo datoteko z imenom »hello«, katero nato poženemo z ukazom »./hello«. Ta nam v novi vrstici terminalnega okna izpiše »Hello World«. 2.2 Delo s funkcijami V naslednjem primeru definiramo našo prvo funkcijo, poimenovano »sestevanje«. Funkcijo uredimo v urejevalniku besedil ter datoteko shranimo kot »sestej.hs«. Tabela 3 prikazuje primer funkcije seštevanja, kjer število, ki ga želimo sešteti s samim seboj, vnesemo kot vhodni parameter. Uporabnikovo posredovanje je, tako kot pri prejšnjem primeru, označeno z modro barvo v desnem stolpcu tabele 3. 222 OTS 2019 SODOBNE INFORMACIJSKE TEHNOLOGIJE IN STORITVE D. Fister, I. Fister Jr.: Razvoj spletnih aplikacij v ogrodju Yesod Tabela 3. Funkcija seštevanja >> ghci GHCi, version 8.0.2: http://www.haskell.org/ghc/ :? for help Prelude> :l sestej 'sestej.hs' [1 of 1] Compiling Main ( sestej.hs, sestevanje x = x + x interpreted ) Ok, modules loaded: Main. *Main> sestevanje 2 4 *Main> V tabeli 3 upodabljamo interaktivno uporabo prevajalnika GHC, katerega zaženemo z ukazom »ghci« ali »ghc --interactive«. V interaktivnem prevajalniku skripto s sledečim ukazom najprej naložimo »:l sestej«. Ta nam jo sprva prevede, oz. definira, šele nato pa jo lahko uporabimo. H klicu funkcije dodamo še vhodni parameter, npr. 2, kot to prikazuje ukaz »sestevanje 2«. Vhodni parameter se v programskem jeziku Haskell zapiše pod spremenljivko »x«, katerega nato seštejemo s samim seboj, prevajalnik pa samodejno izpiše rezultat 4, tj. 2 2 4. Vidimo, da funkcijo in vhodne parametre v programskem jeziku ustvarimo zelo kompaktno, tj. v eni vrstici (angl. one-liner). Podobno lahko sklepamo za nekoliko kompleksnejšo funkcijo, ki zraven matematičnih operacij množenja in seštevanja prinaša še pogojni (angl. »if«) stavek (tabela 4) [3]. Tabela 4. Matematične operacije in pogojni stavek Prelude> :l kvadriraj 'kvadriraj.hs' *Main> kvadrirajMaloStevilo 3 kvadrirajMaloStevilo x = (if x > 100 then x else 14 x*x) + 5 *Main> kvadrirajMaloStevilo 101 106 Funkcija »kvadrirajMaloStevilo« kvadrira vhodni parameter, če je ta manjši ali enak 100. Ne glede na velikost vhodnega parametra (saj uporabljamo oklepaj), funkcija delnemu rezultatu prišteje število 5 in končni rezultat izpiše. Brez uporabljenega oklepaja bi funkcija število 5 prištela le, če bi bil vhodni parameter manjši ali enak 100. Kot zanimivost naj povemo, da je »else« stavek v programskem jeziku Haskell obvezen [3]. 2.3 Delo s seznami Nadalje prikazujemo tudi delo s seznami (angl. lists), ki so sodeč po [3] najbolj uporabljana podatkovna struktura v programskem jeziku Haskell. Seznami so v programskem jeziku Haskell homogeni, kar pomeni da morajo biti vsi vsebovani elementi seznama enakega tipa, npr. cela števila, karakterji, ipd. [3]. Seznam v programskem jeziku Haskell ustvarimo zelo preprosto, kot to prikazuje uvodna vrstica tabele 5. Tabela 5. Seznami v programskem jeziku Haskell Prelude> seznam=[1,2,4,5,6,8] Prelude> seznam [1,2,4,5,6,8] Prelude> seznam !! 3 5 Prelude> head(seznam) 1 Prelude> tail(seznam) [2,4,5,6,8] Prelude> maximum(seznam) 8 Prelude> [x * 2 | x <‐ [1..10]] [2,4,6,8,10,12,14,16,18,20] OTS 2019 SODOBNE INFORMACIJSKE TEHNOLOGIJE IN STORITVE 223 D. Fister, I. Fister Jr.: Razvoj spletnih aplikacij v ogrodju Yesod Seznam ustvarimo z ukazom »seznam=[1,2,4,5,6,8]«, pri čemer je »seznam« ime seznama, 1,2,4,5,6,8 pa so njegovi elementi. Slednje lahko v terminalnem oknu z ukazom »seznam« izpišemo. Izpišemo lahko tudi posamezni element seznama, npr. četrti element izpišemo z ukazom »seznam !! 3«, saj Haskell indeksiranje elementov začenja z ničlo. Nadalje lahko izpišemo prvi element seznama, tj. »head(seznam)«, preostali del seznama (razen prvega elementa), tj. »tail(seznam)« ter maksimalno vrednost seznama, tj. »maximum(seznam)«. Haskell omogoča tudi zahtevnejše operacije s seznami, tj. »pipe«. Zadnji primer prikazuje funkcijo, ki generira prvih deset števil ter jih pomnoži z 2, vse v eni vrstici. Ker Haskell samostojno zaznava tip spremenljivk, uporabniku teh ni treba eksplicitno navajati. Kljub temu pa uporabnik tip spremenljivk lahko določi, npr. kot to prikazuje tabela 6. V levem stolpcu je prikazan primer za ročno določitev celega števila (angl. integer, krajše int) vhodni in izhodni spremenljivki. Prav tako lahko po vzoru desnega stolpca tip določimo tudi več vhodnim spremenljivkam. Tabela 6. Ročno določanje tipa funkcije 'kvadriranje.hs' 'sestejStevila.hs' kvadriraj :: Integer ‐> Integer sestejStevila :: Int ‐> Int ‐> Int ‐> Int kvadriraj x = x * x sestejStevila x y z = x + y + z *Main> kvadriraj 3 *Main> sestejStevila 1 2 3 9 6 OGRODJE YESOD Yesod je prosto dostopno spletno ogrodje, namenjeno za razvoj varnih in visoko-zmogljivih spletnih aplikacij [6]. Spletno ogrodje Yesod izvira iz programskega jezika Haskell, kar pomeni da vključuje vse ugodne značilnosti, naštete v drugem poglavju [7]. Avtor ogrodja Yesod Michael Snoyman navaja glavne posebnosti programskega ogrodja Yesod [1]: - varnost tipov (angl. type safety): točno lahko določimo pričakovane vhodne in izhodne tipe, - zgoščenost (angl. concise code): Yesod omogoča uporabo pred-pripravljenih orodij (angl. scaffolding tools) in knjižnic (npr. iz repozitorija Hackage [11]) za zmanjšanje količine programske kode in pohitritev razvoja, - učinkovitost (angl. performance): Yesod zagotavlja prepričljivo učinkovitost, tako prevajalnika GHC, ki je podvržen neprenehnemu izboljševanju, kakor tudi same arhitekture. Slednja z uporabo voda (angl. conduit) in graditelja (angl. builder) dovoljuje, da se programska koda izvaja v pomnilniku in s tem izogiba dolgotrajnemu dostopu do trdega diska. K temu priča dejstvo, da je eden izmed Haskell- ovih spletnih strežnikov, t.i. Warp eden najhitrejših kar jih trenutno obstaja [2], - modularnost (angl. modularity): Yesod z domiselnimi idejami in razvojem Yesod-a spodbuja razvoj novih programskih, medsebojno združljivih in konsistentnih paketov, ki so velikokrat uporabni tudi izven okvirjev Haskell-a, - trdni temelji (angl. a solid foundation): Yesod je deležen vzporednega razvoja več različnih programskih paketov za enako stvar, kar mu omogoča izbiro najučinkovitejše rešitve za dan problem. Dodatno razvijalci Yesod-a in Haskell-a stremijo k nenehnemu izboljševanju in poenostavljanju programskih paketov, - arhitektura (angl. architecture): posebnost Yesoda je v tem, da za ustvarjanje HTML, CSS ali JavaScript programske kode uporablja posebne domensko specifične jezike, ki so kot celotna družina znani pod skupnim imenom Shakespearske šablone (angl. Shakespearean Templates). Vsaka šablona je poimenovana po Shakespearskih akterjih, npr. šablona za HTML se imenuje »Hamlet«, šabloni za CSS sta »Lucius« in »Cassius«, šablona za JavaScript pa je poimenovana »Julius«. Družina Shakespearskih šablon bo v nadaljevanju prispevka predstavljena podrobneje. 3.1 Shakespearske šablone Shakespearske šablone nudijo samodejno ustvarjanje HTML, CSS in JavaScript [1]. Hamlet je domensko specifični jezik, namenjen za ustvarjanje HTML. Nudi kompaktno in enostavno sintakso, brez uporabe zavitih oklepajev (angl. braceless), a s praznimi prostori (angl. white-spaces) za poravnavo (angl. indentation). Poleg ustvarjanja HTML kode omogoča tudi osnovne nadzorne bloke, kot npr. vejitve (tabela 8) in zanke. Hamlet je 224 OTS 2019 SODOBNE INFORMACIJSKE TEHNOLOGIJE IN STORITVE D. Fister, I. Fister Jr.: Razvoj spletnih aplikacij v ogrodju Yesod najkompleksnejši izmed štirih naštetih domensko specifičnih jezikov [1], njegova sintaksa pa je prikazana v tabeli 7. Tabela 7. Primerjava med HTML in Hamlet HTML Hamlet Tabela 8. Primer vejitve Hamlet $if delovniDan

Gremo v službo. $else

Ostanemo doma. Lucius in Cassius sta domensko specifična jezika namenjena ustvarjanju CSS-a. Funkcionalno se slednja ne razlikujeta, sta si pa sintaktično različna. Prvi izmed njiju uporablja zavite oklepaje, medtem ko drugi prazne prostore za poravnavo. Tabela 9 prikazuje njuno osnovno sintakso. Tabela 9. Primerjava med Lucius in Cassius [1] Lucius (z zavitimi oklepaji) Cassius (s praznimi prostori) Julius je zadnji izmed domensko specifičnih jezikov, namenjen ustvarjanju JavaScript programske kode. V splošnem je zelo podoben samemu JavaScript-u, zato [1] navaja, da je Julius najenostavnejši izmed domensko specifičnih jezikov. Tabela 10 prikazuje njegovo sintakso. Tabela 10. Prikaz domensko specifičnega jezika Julius [1] 3.2 Uvodni program »Hello World« v ogrodju Yesod Yesod je zelo obširno ogrodje, zato v prihajajočih podpoglavjih prikazujemo le njegove bistvene značilnosti. Sprva predstavljamo osnovni program »Hello World« (tabela 11), osnovan na čelnem ogrodju (angl. front-end framework) »Twitter Bootstrap« [19]. Za prevajanje programa uporabljamo prevajalnik GHC, lahko pa program zaženemo tudi z ukazom »runhaskell app.hs«, kjer »app.hs« predstavlja ime programa. S tem OTS 2019 SODOBNE INFORMACIJSKE TEHNOLOGIJE IN STORITVE 225 D. Fister, I. Fister Jr.: Razvoj spletnih aplikacij v ogrodju Yesod zaženemo spletni strežnik Warp [2], čigar delovanje programa preizkusimo z obiskom na spletni strani http://localhost:3000, kot to prikazuje slika 2. Tabela 11. Primer »Hello World« v spletnem ogrodju Yesod Haskell language pragmas Vključitev Yesod knjižnic Delo s statičnimi datotekami Usmerjanje (angl. routing) Rutina (angl. handler function) Glavni program (zagon spletnega strežnika Warp) Slika 2. Pogled v spletnem brskalniku 3.3 Gradniki Nadaljujemo s pregledom Yesod gradnikov. Med razvojem spletne strani in aplikacij navadno usklajujemo tri različne tehnologije, tj. HTML, CSS in Javascript. Naštete se na spletni strani nahajajo na različnih lokacijah, npr. CSS v glavi in HTML v jedru spletne strani, kar dodatno otežuje organizacijo. Yesod za ta problem uvaja gradnike (angl. widgets). Ti omogočajo vključevanje različnih knjižnic, morebiti shranjenih lokalno, ali pa tudi oddaljeno. Primeri nekaterih elementov gradnikov so predstavljeni v tabeli 12. Tabela 12. Primeri gradnikov setTitle Nastavi naslov spletne strani addStylesheet Poveži do lokalno shranjene slogovne predloge CSS addStylesheetRemote Poveži do oddaljeno shranjene slogovne predloge CSS addCassius Dodaj nekaj CSS značk addHamlet Dodaj Hamlet v značko body addScript Poveži do lokalno shranjene skripte addScriptRemote Poveži do oddaljeno shranjene skripte addHtmlHead Dodaj HTML v značko head 226 OTS 2019 SODOBNE INFORMACIJSKE TEHNOLOGIJE IN STORITVE D. Fister, I. Fister Jr.: Razvoj spletnih aplikacij v ogrodju Yesod Tabela 13 prikazuje osnovni primer programske kode gradnikov, za več gradnikov pa je bralec povabljen k ogledu uradne dokumentacije [18]. Slika 3 predstavlja prikaz gradnikov v spletnem brskalniku. Tabela 13. Prikaz programske kode za razvoj gradnika Nastavi naslov spletne strani Poveži do oddaljene skripte Vpelji pojavno okno Določi meta- podatke spletne strani Ustvari odstavek Ustvari dodaten odstavek Slika 3. Prikaz gradnika v spletnem brskalniku 3.4 Obrazci Poslednja zanimivost, ki jo predstavljamo v tem prispevku, so Yesod obrazci (angl. forms). Obrazci so interaktivni deli spletne strani, v katere uporabnik lahko vpisuje podatke. Tabela 14 prikazuje primer programske kode za razvoj Yesod obrazca, medtem ko slika 4 rezultat, ki se pri tem pojavi. Levi stolpec tabele 14 prikazuje določevanje lastnega podatkovnega tipa spremenljivk, s katerimi bo uporabnik spletne strani operiral. Desni stolpec tabele 14 prikazuje dodane gradnike, ki bodo določili izgled spletne strani. OTS 2019 SODOBNE INFORMACIJSKE TEHNOLOGIJE IN STORITVE 227 D. Fister, I. Fister Jr.: Razvoj spletnih aplikacij v ogrodju Yesod Tabela 14. Prikaz programske kode za razvoj obrazcev Slika 4. Prikaz enostavnega obrazca Yesod v spletnem brskalniku Z obrazci zaključujemo kratek pregled bistvenih značilnosti Yesod-a in v prihodnjem poglavju nadaljujemo na postavitev aplikacije. POSTAVITEV APLIKACIJE Postavitev končne aplikacije je navadno zadnji, a nadvse kompleksen korak razvoja spletnih aplikacij. Pri tem ni izjema niti spletno ogrodje Yesod, čeravno se celotna skupnost raziskovalcev zavzema za poenostavitev postopka postavitve [14]. V Yesod-u postavitev poteka večplastno. Sprva s prevajalnikom prevedemo vso programsko kodo in pridobimo izvedljivo datoteko. To nato prenesemo na spletni strežnik, kamor obvezno priložimo tudi statične datoteke. V drugem koraku namestimo enega izmed postavitvenih ogrodij (angl. deployment engine) ali spletni strežnik. V tabeli 15 navajamo nekaj najbolj pogostih postavitvenih ogrodij, njihove prednosti ter slabosti. Tabela 15. Yesod postavitvena ogrodja Ogrodje Glavne značilnosti Prednosti Pomankljivosti Zagotavlja podporo SSL, Sistem za postavitev samodejno zažene aplikacijo Ni primerno ogrodje za Keter spletnih aplikacij ob zagonu, spremlja procese manjše aplikacije Yesod kakor tudi ponovno zažene aplikacijo v primeru sesutja V primeru sesutja je Visoko-zmogljiv Ni potrebe po namestniškem potreben mehanizem za Warp spletni strežnik, v celoti strežniku (angl. proxy server) ponovni zagon napisan v Haskellu aplikacije Vzvratni namestniški Lažja migracija spletnih Zahteva obilo Nginx strežnik (angl. reverse aplikacij med več strežniki konfiguriranja proxy) Kombinacija več Zahtevano napredno postavitvenih ogrodij in znanje sistemske Kombinacija Možnosti prilagajanja tehnik, npr. Warp in administracije v Linuxu, Keter oteženo vzdrževanje 228 OTS 2019 SODOBNE INFORMACIJSKE TEHNOLOGIJE IN STORITVE D. Fister, I. Fister Jr.: Razvoj spletnih aplikacij v ogrodju Yesod ZAKLJUČEK V tem prispevku smo na kratko predstavili programski jezik Haskell in spletno ogrodje Yesod. Yesod je ogrodje, ki omogoča hiter razvoj spletnih aplikacijah, katere odlikujeta varnost in zmogljivost. Varnost je zagotovljena z notranjo zasnovo programskega jezika Haskell, saj tovrstne aplikacije po uspešnem prevajanju ne povzročajo napak med sprotnim izvajanjem programske kode, zmogljivost izvajanja programske kode pa dosega približno raven programskega jezika C. Ocenjujemo, da je Yesod zato zelo primeren za časovno kritične spletne aplikacije in spletne aplikacije s poudarjenimi varnostnimi zahtevami. Ugotavljamo, da je postavitev osnovne spletne aplikacije v spletnem ogrodju Yesod zelo kompleksna. Potrebne so veščine sistemske administracije v operacijskem sistemu Linux in poglobljeno znanje programskega jezika Haskell. Za vizualno privlačne spletne aplikacije je potrebno tudi dobro poznavanje Yesod gradnikov in obrazcev, nenazadnje pa tudi Shakespearskih šablon. Kljub temu pri zagonih osnovnih spletnih aplikacij opažamo nazorno pohitritev delovanja spletne strani. LITERATURA [1] SNOYMAN Michael. Developing web applications with Haskell and Yesod. O'Reilly Media, Inc., 2012. [2] SNOYMAN Michael. "Warp: A Haskell web server." IEEE Internet Computing 15.3 (2011): 81-85. [3] LIPOVAČA Miran. Learn you a haskell for great good!: a beginner's guide. No Starch Press, 2011. [4] HUDAK Paul, FASEL H. Joseph, PETERSON John. "A gentle introduction to Haskell." Sigplan Notices 27.5 (1992): T1-T53. [5] HUDAK Paul. "Building domain-specific embedded languages." ACM Computing Surveys 28.4es (1996): 196. [6] DVOŘÁK Pavel. Web applications in Haskell. Diss. Masarykova univerzita, Fakulta informatiky, 2012. [7] SNOYMAN Michael. Developing Web Apps with Haskell and Yesod: Safety-driven Web Development. "O'Reilly Media, Inc.", 2015. [8] EPSTEIN Jeff, BLACK P. Andrew, PEYTON-JONES Simon. "Towards Haskell in the Cloud." ACM SIGPLAN Notices. Vol. 46. No. 12. ACM, 2011. [9] IZBICKI Michael. "Hlearn: A Machine Learning Library for Haskell." Proceedings of The Fourteenth Symposium on Trends in Functional Programming, Brigham Young University, Utah. 2013. [10] ANNENKOV Danil, ELSMAN Martin. "Certified Compilation of Financial Contracts." Proceedings of the 20th International Symposium on Principles and Practice of Declarative Programming. ACM, 2018. [11] https://hackage.haskell.org/, Welcome to Hackage!, obiskano 13. 5. 2019. [12] https://wiki.haskell.org/Haskell_in_practice, Haskell in practice, obiskano 10. 5. 2019. [13] https://en.wikipedia.org/wiki/Haskell_(programming_language)), Haskell (programming language), obiskano 10. 5. 2019. [14] https://www.yesodweb.com/book, Yesod Web Framework, obiskano 9. 5. 2019. [15] https://www.tiobe.com/tiobe-index/, TIOBE Index for May 2019, obiskano 13. 5. 2019. [16] https://en.wikipedia.org/wiki/Yesod_(web_framework), Yesod (web framework), obiskano 10. 5. 2019. [17] https://www.forbes.com/sites/quora/2017/07/11/why-arent-more-programmers-using-haskell/, Why Arent't More Programmers Using Haskell?, obiskano 10. 5. 2019. [18] https://hackage.haskell.org/package/yesod-core-1.1.1/docs/Yesod-Widget.html, Yesod Widget, obiskano 14. 5. 2019. [19] https://github.com/firefly-cpp/Yesod-bootstrap-skeleton, GitHub Yesod-bootstrap-skeleton, obiskano 14. 5. 2019. OTS 2019 SODOBNE INFORMACIJSKE TEHNOLOGIJE IN STORITVE M. Heričko in K. Kous (ur.) KAKO RAZVIJATI V VUE/NUXT, ČE SI NAVAJEN/A OBJEKTNIH JEZIKOV, KOT SO C++, C# ALI JAVA? MATJAŽ PRTENJAK44 Povzetek: VUE je samo knjižnica, napisana v programskem jeziku JavaScript in kot takšna sploh ni neposredno primerljiva s programskima jezikoma C++/Java. Težava pri preklopu torej ni VUE, temveč JavaScript. Za C++/Java programerja/programerko pa je JavaScript nevaren jezik, saj je prvima tako podoben, da daje napačen signal. Za uspešen razvoj v spletnih tehnologijah je torej nujno dobro spoznati programski jezik JavaScript. Ob tem pa seveda še HTML in CSS, ki sta pač osnova spleta. Ključne besede: JavaScript, Vue, razvoj, splet, front-end NASLOV AVTORJA: mag. Matjaž Prtenjak, Matjaž Prtenjak s.p., Celje, Slovenija, info@mnet.si. https://doi.org/10.18690/978-961-286-282-4.26 ISBN 978-961-286-282-4 Dostopno na: http://press.um.si 230 OTS 2019 SODOBNE INFORMACIJSKE TEHNOLOGIJE IN STORITVE M. Prtenjak: Kako razvijati v VUE/NUXT, če si navajen/a objektnih jezikov kot so C++, C# ali Java? UVOD Mnogi razvijalci, ki smo začenjali profesionalno pot razvoja programske opreme konec devetdesetih let prejšnjega stoletja, smo tedaj padli v intenzivno objektno usmerjeno programiranje. Objekti so bili povsod, vsi so govorili samo o objektno usmerjenem razvoju in vsi smo hiteli iz jezika C na C++ ter kasneje na Javo [1]. Do devetdesetih let smo uporabljali računalnike brez posebnega poudarka na grafiki in grafičnih uporabniških vmesnikih. Unix je sicer imel X-Windows GUI, v ozadju pa se je prebijal Microsoft z Windows 3.1 in kasneje z Windows 95 [2]. Devetdeseta leta so bila torej leta, ko smo intenzivno prehajali iz ukazne vrstice ter ASCII (znakovnih) uporabniških zaslonov na grafične uporabniške zaslone – GUI. Jezika C++ in Java nimata vgrajenih grafičnih sposobnosti. To sta splošna programska jezika in v njih – z uporabo objektov – pač razvijamo programe, ki niti nimajo nujno uporabniškega vmesnika. Lahko gre za strežniško infrastrukturo, storitve in podobno. Šele nekatere dodatne (objektne) knjižnice nam prinesejo možnost izdelave grafičnih uporabniških vmesnikov. S pomočjo takšnih knjižnic, recimo MFC za C++ in Windows, lahko razvijamo grafične uporabniške vmesnike. Konec stoletja torej vsi razvijamo grafične uporabniške vmesnike, nakar se zgodi bum spleta in naenkrat gre vse v HTML. VUE Hitro previjemo 15-20 let naprej in leta 2014 se pojavi Vue [3]. Dolgi uvod je potreben, saj Vue sploh ne moremo primerjati s C++ ali Javo. Vue je tista dodatna knjižnica, ki nekomu omogoča izdelavo grafičnega uporabniškega vmesnika, le da tokrat ne na operacijskih sistemih kot so Linux, Windows, Android ali Mac, temveč na spletu oz. natančneje, v spletnem brkljalniku, ki je kot takšen neodvisen od operacijskega sistema, na katerem teče. 2.1 Vue je knjižnica, napisana v JavaScript programskem jeziku Vue torej nikakor ne moremo neposredno primerjati s C++ ali Java. Slednja sta splošno namenska programska jezika, Vue pa je JavaScript [4] programsko ogrodje ( JavaScript framework), ki je namenjen izključno izdelavi interaktivnih HTML (spletnih) vmesnikov. Vue je za nekoga, ki je začel s programiranjem v devetdesetih, navadna knjižnica, kot sta WinForms ali QT. Pravzaprav ni niti to, saj kombinaciji HTML in CSS ne dodaja nič novega, le omogoča njuno lažjo in hitrejšo uporabo. Preden se razvijalec sploh začne ukvarjati z Vue, mora (dobro) spoznati JavaScript. Ime JavaScript je zelo podobno imenu Java in tudi izgled tipične JavaScript kode je zelo zelo podoben izgledu Java ali C++ kode, vendar pa gre tukaj za popolnoma drug jezik! Ena izmed mojih največjih strokovnih napak je bila, da se dolga leta sploh nisem poglobil v JavaScript, temveč sam ga vedno obravnaval kot nek čuden programski jezik z okusom po Javi/C++. 2.1.1 Bistvene razlike med C++/Java in JavaScript  Java uporablja statične podatkovne tipe, JavaScript dinamične. To pomeni, da je lahko neka spremenljivka različnega podatkovnega skozi tok programa  Java uporablja razredno hierarhijo, JavaScript uporablja prototipno hierarhijo  Javanski program se naloži iz prevedene programske kode (ki jo razume računalnik), JavaScript se naloži iz kode, zapisane v »človeku razumljivi obliki« (v izvorni obliki). Javansko kodo je torej potrebno predhodno prevesti, JavaScript kode ne  V JavaScriptu so funkcije enakovredne objektom in zato je lahko JavaScript tudi funkcijski jezik, Java ne more biti  Java je obširnejši, kompleksnejši programski jezik z dobro premišljenimi osnovami, JavaScript je dokaj preprost, odprt, skriptni jezik, ki je nastal v 10 dneh in ima mnogo nekonsistenc  V JavaScriptu podpičja niso obvezna  Java definira spremenljivke na nivoju blokov, JavaScript na nivoju funkcij  Moč JavaScript se pogosto skriva v zaprtjih spremenljivk (closures), v Javi tega sploh nimamo OTS 2019 SODOBNE INFORMACIJSKE TEHNOLOGIJE IN STORITVE 231 M. Prtenjak: Kako razvijati v VUE/NUXT, če si navajen/a objektnih jezikov kot so C++, C# ali Java?  V JavaScript lahko prototip objekta spremenimo in s tem takoj spremenimo vse objekte, ki bazirajo na tem prototipu. V Javi česa podobnega nimamo Seveda je razlik še kar nekaj, kakor je tudi kar veliko podobnosti in ravno to je past, v katero se ujame mnogo izkušenih programerjev [5]. 2.2 Nekaj JavaScript primerov, ki so C++/Java programerja/programerko preprosto »čudni« 2.2.1 Domet spremenljivk (scope) Primer 1 Primer 2 Primer 3 1 var i = 10 var i = 10 var i = 10 2 3 console.log("[ 3] == ",i) console.log("[ 3] == ",i) console.log("[ 3] == ",i) 4 test() test() test() 5 console.log("[ 5] == ",i) console.log("[ 5] == ",i) console.log("[ 5] == ",i) 6 7 function test() { function test() { function test() { 8 console.log("[ 8] == ",i) console.log("[ 8] == ",i) console.log("[ 8] == ",i) 9 // var i = 20 var i = 20 i = 20 10 console.log("[10] == ",i) console.log("[10] == ",i) console.log("[10] == ",i) 11 } } } 12 13 console.log("[13] == ",i) console.log("[13] == ",i) console.log("[13] == ",i) 14 test() test() test() 15 console.log("[15] == ",i) console.log("[15] == ",i) console.log("[15] == ",i) Rezultat Rezultat Rezultat [ 3] == 10 [ 3] == 10 [ 3] == 10 [ 8] == 10 [ 8] == undefined [ 8] == 10 [10] == 10 [10] == 20 [10] == 20 [ 5] == 10 [ 5] == 10 [ 5] == 20 [13] == 10 [13] == 10 [13] == 20 [ 8] == 10 [ 8] == undefined [ 8] == 20 [10] == 10 [10] == 20 [10] == 20 [15] == 10 [15] == 10 [15] == 20 Tukaj so trije zelo podobni primeri, ki se razlikujejo samo v vrstici 9 (odebeljena), hkrati pa so rezultati dokaj različni in praktično vsi nepričakovani! Ker to ni predavanje o JavaScript, se v razloge za rezultate ne bom spuščal, naštel pa bom nekaj tipičnih vprašanj, ki se porajajo: 1. Kako lahko izvedemo funkcijo test v vrstici 4, če tam sploh še ni definirana ali vsaj deklarirana? 2. primer1: Zakaj je spremenljivka i vidna v funkciji test? 3. primer2: Zakaj vrednost spremenljivke v vrstici 8 sploh ni znana? Prej je bila vidna, zdaj pa sploh ne? 4. primer3: Zakaj je vrednost spremenljivke i v vrstici 13 enaka 20? 5. … in še kar nekaj je vprašanj … 2.2.2 Funkcije so enakovredni člani 1 function test() { 2 console.log('To je test') 3 } 4 test.i = 10 5 test.funkcija1 = function() { 6 console.log('To je funkcija 1') 7 } 8 test() // rezultat je »To je test« 9 test.funkcija1() // rezultat je »To je funkcija 1« 10 console.log(test) // rezultat je »{[Function:test] i: 10,funkcija1:[Function]}« 11 console.log(test.i) // rezultat je 10 232 OTS 2019 SODOBNE INFORMACIJSKE TEHNOLOGIJE IN STORITVE M. Prtenjak: Kako razvijati v VUE/NUXT, če si navajen/a objektnih jezikov kot so C++, C# ali Java? Spet nekaj vprašanj, ki se porajajo: 1. vrstica 5: Kako smo lahko dostopali do lastnosti i funkcije test, če test sploh ni objekt, temveč funkcija in če i sploh nikjer ni definiran? 2. vrstica 6: Kako smo lahko definirali novo funkcijo kot lastnost neke druge funkcije? 3. vrstica 12: Kaj je ta čuden zapis objekta/funkcije? 4. … in še kar nekaj je vprašanj … 2.2.3 Novi objekti nastajajo brez eksplicitnih »konstruktorjev« in imajo dinamične lastnosti 1 function Oseba(ime, priimek) { 2 this.ime = ime 3 this.priimek = priimek 4 5 this.izpisi = function() { 6 console.log(òseba = ${ime} ${priimek}`) 7 } 8 } 9 10 Oseba("James", "Bond") 11 var peter = new Oseba("Peter", "Veliki") 12 var aleksander = new Oseba("Aleksander", "Veliki") 13 14 peter.izpisi() // rezultat je »Peter Veliki« 15 aleksander.izpisi() // rezultat je »Aleksander Veliki« 16 17 peter.izpisi = function() { 18 console.log(òseba = ${ime} Malì) 19 } 20 21 peter.izpisi() // rezultat je »Peter Mali« 22 aleksander.izpisi() // rezultat je »Aleksander Veliki« No, tu pa je vprašanj že toliko, da jih niti ne bom pisal… 2.2.4 Težava kazalca 'this' Vsakemu razvijalcu/razvijalki v C++ in Javi je kazalec ' this' domač in vsakdo vedno ve, kaj točno predstavlja kazalec this. Nikoli ni v dilemi! V primeru JavaScript temu ni tako in to je ena izmed najtežjih lekcij, ki se je mora vsakdo naučiti, ko začne s programiranjem v JavaScript-u. 1 function Fun1() { 2 this.ime = 'fun1'; 3 this.func = function() { 4 console.log(this.ime) 5 } 6 } 7 8 function Fun2() { 9 this.ime = 'fun2'; 10 } 11 12 var f1 = new Fun1(); 13 var f2 = new Fun2(); 14 15 f1.func(); // rezultat je »fun1« 16 f1.func.call(f2); // rezultat je »fun2« OTS 2019 SODOBNE INFORMACIJSKE TEHNOLOGIJE IN STORITVE 233 M. Prtenjak: Kako razvijati v VUE/NUXT, če si navajen/a objektnih jezikov kot so C++, C# ali Java? 2.2.5 Pa še nekaj matematike Tukaj podajam samo programsko kodo in rezultate, ki so vsakemu C++/Java programerju/programerki preprosto nedojemljivi… 1 "10" – 4 // rezultat je 6 2 "10" + 4 // rezultat je "104" 3 "20" ‐ "5" // rezultat je 15 4 "20" + "5" // rezultat je "205" 5 "20" ‐ ‐ "5" // rezultat je 25 6 "ma" + "ma" // rezultat je "mama" 7 "ma" + + "ma" // rezultat je "maNaN" 8 "6" ‐ 3 + 3 // rezultat je 6 9 "6" + 3 – 3 // rezultat je 60 2.3 JavaScript je tukaj in bo ostal Kot že omenjeno, je Javascript programski jezik, ki je nastal v specifičnih okoliščinah, s strani enega samega razvijalca v 10 dneh. Glede na zapisano je jasno, da to ni programski jezik, ki bi bil domišljen, sofisticiran in logičen. JavaScript ima vse polno čudnih, smešnih in neverjetnih lastnosti, a ravno zaradi teh je tudi zelo močan in zaradi mnogih vedno bolj popularen programski jezik. JavaScript že dolgo ni več »divji« jezik, ki bi kar rasel in pridobival vedno bolj čudne lastnosti. Ravno obratno! JavaScript je jezik, ki se že desetletje načrtno razvija, dopolnjuje in nadgrajuje, vendar pa je v njem napisano tako veliko programske kode, da osnov ne sme in ne more nihče več spremeniti. Vse, kar je čudnega, bo torej za vedno ostalo čudno, nadgradnje pa so že bolj »logične« [6]. 2.4 JavaScript ~ Vue Odgovor na naslovno vprašanje: » Kako razvijati v Vue/NUXT, če si navajen/a objektnih jezikov, kot so C++, C# ali Java? « se torej sploh ne skriva v Vue, temveč v JavaScript. Iz tega sledi tudi ključna misel tega predavanja: Dandanes obstaja množica JavaScript knjižnic in objektno orientirano programiranje ali »neobjektno« orientirano programiranje ni v domeni teh dodatnih knjižnic, temveč v domeni JavaScript programskega jezika. 2.4.1 JavaScript in objektno orientirano programiranje Z rastjo popularnosti programskih jezikov, kot so JavaScript, Python, Ruby in podobnih, se je počasi začel zaton ideje objektnega programiranja. Zelo znana je izjava Joe Armstronga, očeta programskega jezika Erlang [7]: »I think the lack of reusability comes in object-oriented languages, not functional languages. Because the problem with object-oriented languages is they’ve got all this implicit environment that they carry around with them. You wanted a banana but what you got was a gorilla holding the banana and the entire jungle.« Njegova izjava vsekakor drži in ji ni moč oporekati. Iz objektne knjižnice namreč ne moremo vzeti nekega objekta, ne da bi zraven vzeli tudi njegovega očeta in dedka in pradedka…, torej celotne hierarhije objektov. Hkrati pa to ne pomeni, da je bilo oz. da je objektno orientirano programiranje napaka ali slepa ulica v razvoju. Tudi to tezo je namreč moč zaslediti med mladimi programerji in programerkami. Ne, objektno orientirano programiranje je pomembno vplivalo (in vpliva) na razvoj računalništva! 2.4.2 Kaj sploh je »objektno orientirano programiranje«? Vseskozi uporabljam izraz »objektno orientirano programiranje« (OOP), ne da bi ga sploh definiral ali razložil [1]. Tukaj torej zares na hitro podajam neke osnovne lastnosti:  OOP je koncept, zgrajen na ideji »objektov«, ki vsebujejo podatke (imenovane atributi/lastnosti) in kodo (imenovano metode) za manipulacijo teh podatkov  Razred – abstraktna definicija razreda  Objekt – konkretna instanca razreda. 234 OTS 2019 SODOBNE INFORMACIJSKE TEHNOLOGIJE IN STORITVE M. Prtenjak: Kako razvijati v VUE/NUXT, če si navajen/a objektnih jezikov kot so C++, C# ali Java? Prava moč objektnih jezikov pa pride do izraza, ko tovrstne razrede združimo v hierarhije, ko uporabljamo virtualne funkcije, enkapsulacijo in podobne zasnove. JavaScript tudi spada med »objektne« jezike in v JavaScript-u lahko brez težav programiramo s poznanimi konstrukti jezikov C++ in Java. Ravno tako, kot lahko C++ uporabljamo čisto proceduralno (brez objektov, razredov…), lahko tudi JavaScript uporabimo kot:  »navaden« proceduralni jezik (kot C, Pascal)  kot »objektno orientiran jezik« (kot C++, JavaScript)  kot »funkcijski« jezik (kot F#). Ravno ta izbira možnosti daje programskemu jeziku JavaScript takšno moč in popularnost. Razvijalec lahko namreč uporablja programerske vzorce, ki jih pozna. Lahko pa jih seveda tudi meša oz. uporablja enega in drugega hkrati. Po neki računalniški logiki množic bi lahko rekli, da je JavaScript »nad množica« Jave ali C++, saj omogoča vse, kar omogočata slednja + nekaj več, recimo funkcijsko programiranje. Je pa tudi res, da čeravno govorimo o objektnih jezikih in hierarhijah med objekti, je izgradnja takšne hierarhije v JavaScript-u drugačna kot v C++ ali Javi (prototipna hierarhija ~ razredna hierarhija). 2.5 Odgovor na vprašanje iz naslova Ko programirate v JavaScript programskem jeziku ali katerikoli knjižnici na njegovi osnovi, uporabite tiste značilnosti, ki so za dani program najprimernejše. Kot rečeno, lahko JavaScript uporabljate kot OOP jezik, kot funkcijski jezik, ali pa kot preprost proceduralni jezik. Vedno uporabite tisto, kar je za rešitev danega problema najprimernejše in da se boste lahko pravilno odločili, se morate naučiti JavaScript. VUE Vue je torej programska knjižnica, napisana v programskem jeziku JavaScript. Namenjena je prikazu podatkov v brkljalniku, kar pomeni, da za delovanje nujno potrebuje brkljalnik. Vue je strogo vezan na spletne tehnologije oz. na brkljalnik ter HTML opisni jezik. 3.1 Njegovi konkurenti Vue vedno in povsod primerjajo vsaj z njegovima glavnima konkurentoma Angular ter React. Na spletu je mnogo strani s primerjavami omenjene trojice in celoten članek bi lahko posvetili samo primerjavi omenjenih produktov [8]. Vsi trije namreč rešujejo isti problem, vsi temeljijo na JavaScript-u in so si v resnici zelo podobni. Najkrajša primerjava med omenjenimi bi bila sledeča (sredi leta 2019):  Vue je najmlajši in najmanjši (zasede najmanj prostora v pomnilniku)  Angular je najstarejši in izgublja popularnost, React ter Vue jo pridobivata  Vue je programska knjižnica, ki jo lahko na spletni strani samo odpremo (naložimo) in takoj uporabimo, Angular in React pa sta kompleksnejša  Z Vue pa lahko, v povezavi z Webpack, ravno tako kot z Angular in React, razvijamo kompleksne programske module oz. aplikacije. 3.2 Primer uporabe Vue na spletni strani Ena izmed prednosti Vue knjižnice je torej preprosta uporaba znotraj HTML dokumenta in tukaj predstavljam preprosto aplikacijo, ki prikazuje interaktivnost spletne strani. OTS 2019 SODOBNE INFORMACIJSKE TEHNOLOGIJE IN STORITVE 235 M. Prtenjak: Kako razvijati v VUE/NUXT, če si navajen/a objektnih jezikov kot so C++, C# ali Java? Črpalke in cene goriv

Črpalke in cene goriv (10km ob izbranem kraju)

{{ error }}
{{ c }}
{{ cell }}
Predstavljena programska koda je stisnjena, da zasede manj prostora, zato izgled ni »lep«, a že teh par vrstic programske kode omogoča izdelavo interaktivne spletne strani za izpis črpalk v nekem kraju in ustreznih cen goriva. Aplikacija je interaktivna in preko REST protokola uporablja podatke s spleta in to celo iz druge domene. 3.3 Vue, npm in Webpack Predstavljen primer je izjema v razvoju interaktivnih spletnih strani, saj se dandanes večino razvoja opravi s pomočjo upravljalcev paketov, kot je npm in modulov za povezovanje, kot je webpack. Pred razvojem neke rešitve torej s pomočjo upravljalca paketov naprej s spleta pridobimo vse potrebne knjižnice (recimo za dostop do podatkov preko REST protokola, za zaščito podatkov, za lepši prikaz podatkov, za grafe…), na kar produkt razvijemo in ga na koncu s pomočjo WebPack-a stisnemo v knjižnico, ki jo lahko prepišemo na spletni strežnik. Tovrsten razvoj ima obilico prednosti, med katerimi bi izpostavil samo dve:  Preko npm imamo dostop do sto tisoče različnih JavaScript programskih knjižnic  Webpack (lahko) ob združitvi rešitve poskrbi tudi za kompatibilnost med različnimi spletnimi brkljalniki in stiskanje programske kode in s tem hitrejše nalaganje. 3.4 Kakšna znanja potrebujem za razvoj spletnih aplikacij v VUE Na spletu je množica tečajev za programski jezik JavaScript in množica tečajev za knjižnico Vue, zato tukaj o tem ne bom več izgubljal preveč besed. Potrebujete torej sledeča znanja:  JavaScript - za programiranje  HTML in CSS za prikaz na spletu  Spletne storitve/REST za dostop do podatkov. OTS 2019 SODOBNE INFORMACIJSKE TEHNOLOGIJE IN STORITVE 237 M. Prtenjak: Kako razvijati v VUE/NUXT, če si navajen/a objektnih jezikov kot so C++, C# ali Java? 3.5 Kaj pa je Nuxt? V naslovu predavanja je omenjen tudi Nuxt? Kot že omenjeno, lahko Vue uporabljate kot knjižnico znotraj vaše spletne strani ( preprosta uporaba) ali pa s pomočjo npm/webpack razvijete aplikacijo. V slednjem primeru lahko uporabite ogrodje Nuxt, ki vam s pomočjo par vprašanj vzpostavi npm/webpack projekt, s pomočjo katerega lahko razvijete aplikacijo. Nuxt je torej skupek pomožnih funkcij/procedur, ki vam vzpostavijo osnovno strukturo Vue aplikacije. Nuxt je samo nadgradnja Vue, za lažjo uporabo. KAKO SE TOREJ SPOPRIJETI S SPLETNIM RAZVOJEM S POMOČJO VUE KNJIŽNICE? 4.1 Naučiti se morate spletnega opisnega jezika HTML v povezavi s CSS To je danes osnovno znanje in kot smo morali v devetdesetih letih znati uporabljati ukazno vrstico (in to znanje je zelo pomembno tudi danes!), tako je za spletni razvoj nujno potrebno znanje opisnega jezika HTML. HTML je bil nekoč namenjen tako opisu vsebine, kot tudi oblike, kasneje pa je obliko prevzel CSS. Prišli smo namreč do spoznanja, da je bolje ločiti vsebino od oblike in zato danes uporabljamo HTML oz. XHTML za vsebino spletne strani, obliko posameznega elementa pa določa CSS. 4.2 Potrebno se je naučiti JavaScript To je jasno že iz dosedanjih opisov in tukaj bi vse C++/Java programerje/programerke še posebej opozoril, naj ne omalovažujejo preprostosti JavaScript programskega jezika in naj bodo prepričani, da ga ne poznajo! Programskega jezika JavaScript se je potrebno naučiti. Znanje Jave/C++ ni nujno koristno. Pri začetnih korakih spoznavanja JS je dobrodošlo, kasneje pa je marsikdaj celo ovira, saj 10, 15, 20 let razmišljanja v Java/C++ pusti posledice in predsodke. 4.3 Potrebno je spoznati node / npm (yarn) / webpack Podobno, kot je nekoč VisiCalc pomenil revolucijo za prodor osebnih računalnikov, je nekaj let nazaj Googlova programska oprema ' node' naredila revolucijo za popularizacijo JavaScript programskega jezika. npm / yarn sta upravljalca JavaScript paketov (knjižnic) in za delovanje potrebujeta node. Kot razvijalec morate torej najprej instalirati node in potem lahko s pomočjo omenjenih upravljalcev pridete do »neskončnega« nabora odprtokodnih knjižnic. Kot poznamo v razvojnih orodjih za Java/C++ koncept projektov, tako imamo v svetu JavaScript razvoja projekte, za katere skrbi webpack. webpack je namreč eno izmed JavaScript/node orodij, ki ga uporabite, da množico vaših .js, .html, .css, .gif… in kar je še raznoraznih datotek, združi v paket (ali pakete), ki jih nato prepišete na spletni strežnik kot aplikacijo. 4.4 In šele sedaj pride na vrsto Vue Ko torej poznate prej omenjena orodja, lahko začete razvoj tudi z Vue. 4.5 Še posebno opozorilo Svet JavaScript je tako ploden, da orodja nastajajo na tedenski bazi. To je zagotovo prekletstvo, a v tem trenutku izhoda ni. Ko stopite v ta svet, se pripravite na vrtinec novosti, izmed katerih se mnoge uveljavijo, zasvetijo in potem hitro ugasnejo. Nikoli pa ne veste, kdaj je pravi čas, da »skočite na vlak« in kdaj je dobro počakati, ter videti, ali bo sprememba uspela, ali ne. To torej pomeni, da se lahko nabor orodij npm/webpack že jutri zamenja za kaj boljšega, novejšega. Zagotovo pa se lahko zanesete na dejstvo, da bodo ostali HTML, CSS, JavaScript in node. Vse ostalo je lahko že jutri zgodovina, vključno z Vue. 238 OTS 2019 SODOBNE INFORMACIJSKE TEHNOLOGIJE IN STORITVE M. Prtenjak: Kako razvijati v VUE/NUXT, če si navajen/a objektnih jezikov kot so C++, C# ali Java? LITERATURA [1] Object-oriented programming, https://en.wikipedia.org/wiki/Object-oriented_programming, obiskano 5.5.2019 [2] Microsoft Windows history, https://www.computerhope.com/history/windows.htm, obiskano 27.4.2019 [3] Vue.js - The Progressive JavaScript Framework, https://vuejs.org/, obiskano 5.5.2019 [4] A Brief History of JavaScript, https://auth0.com/blog/a-brief-history-of-javascript/, obiskano 5.5.2019 [5] Difference between Java and JavaScript, https://www.geeksforgeeks.org/difference-between-java-and- javascript/, obiskano 27.4.2019 [6] JavaScript Versions, https://www.w3schools.com/js/js_versions.asp, obiskano 27.4.2019 [7] You wanted a banana but you got a gorilla holding the banana , https://www.johndcook.com/blog/2011/07/19/you-wanted-banana/, obiskano 27.4.2019 [8] Angular vs React vs Vue: Which Framework to Choose in 2019 , https://www.codeinwp.com/blog/angular-vs-vue-vs-react/, obiskano 27.4.2019 OTS 2019 SODOBNE INFORMACIJSKE TEHNOLOGIJE IN STORITVE M. Heričko in K. Kous (ur.) VIZUALIZACIJA PODATKOV V KNJIŽNICI REACT, PRAKTIČNE IZKUŠNJE ALEN RAJŠP, GREGOR JOŠT, VIKTOR TANESKI, SAŠA KUHAR, LUKA PAVLIČ45 Povzetek: React je ena izmed treh najbolj priljubljenih knjižnic za razvoj enostranskih spletnih aplikacij. Omogoča tudi implementacijo ponovno uporabnih gradnikov uporabniškega vmesnika. Dodatne izzive in omejitve med razvojem predstavlja uporaba zunanjih knjižnic in ogrodij. To še posebej velja v primeru, ko knjižnico React uporabljamo v kombinaciji z enim izmed meta- programskih JavaScript jezikov (npr. TypeScript). Prispevek predstavlja možnosti uporabe ogrodja React, s tem povezane dobre prakse in možnosti učinkovite povezave s tretjimi knjižnicami. Podaja praktične izkušnje in izzive pri implementaciji tipične aplikacije za vizualizacijo podatkov. Omejili smo se na knjižnice za prikaz grafov. Demonstrirali smo postopek izbora knjižnice, njihove vključitve ter naše izkušnje in dobre prakse pri uporabi izbrane odprtokodne knjižnice JavaScript. Prispevek opisuje specifike, ki jih morajo izpolnjevati povezani in zaledni sistemi, s katerimi se aplikacije s knjižnico React povezujejo. Ključne besede: React, vizualizacija podatkov, grafi, integracija knjižnic, spletne aplikacije NASLOVI AVTORJEV: Alen Rajšp, asistent, Univerza v Mariboru, Fakulteta za elektrotehniko, računalništvo in informatiko, Maribor, Slovenija, e-pošta: alen.rajsp@um.si. dr. Gregor Jošt, asistent, Univerza v Mariboru, Fakulteta za elektrotehniko, računalništvo in informatiko, Maribor, Slovenija, e-pošta: gregor.jost@um.si. Viktor Taneski, asistent, Univerza v Mariboru, Fakulteta za elektrotehniko, računalništvo in informatiko, Maribor, Slovenija, e-pošta: viktor.taneski@um.si. Saša Kuhar, asistentka, Univerza v Mariboru, Fakulteta za elektrotehniko, računalništvo in informatiko, Maribor, Slovenija, e-pošta: sasa.kuhar@um.si. dr. Luka Pavlič, docent, Univerza v Mariboru, Fakulteta za elektrotehniko, računalništvo in informatiko, Maribor, Slovenija, e-pošta: luka.pavlic@um.si. https://doi.org/10.18690/978-961-286-282-4.27 ISBN 978-961-286-282-4 Dostopno na: http://press.um.si 240 OTS 2019 SODOBNE INFORMACIJSKE TEHNOLOGIJE IN STORITVE A. Rajšp, G. Jošt, V. Taneski, S. Kuhar, L. Pavlič: Vizualizacija podatkov v knjižnici React, praktične izkušnje UVOD Splet je postal de-facto vodilna platforma prijaznih uporabniških vmesnikov. Spletne aplikacije niso več okorne utripajoče spletne strani, ki ob vsakem kliku uporabniku preko protokola za prenos hiperbesedila pretočijo celotno spletno stran. Konceptov, ki so bili mišljeni za spletne strani, več ne zlorabljamo za uporabniško prijazne spletne aplikacije. Namesto tega so spletne aplikacije postale točno to – aplikacije. Le-te delujejo znotraj okolja spletnega brskalnika ter samostojno komunicirajo z zalednim sistemom. Tehnološke rešitve, kot so jezik JavaScript, vmesniki REST in format JSON so osnovni gradniki takšnih aplikacij. A za hiter in relativno vzdržen razvoj spletnih aplikacij je ta nabor premajhen. Brez uporabe specializiranih knjižnic (npr. React.js) ali ogrodij (npr. Angular) se danes skoraj več ne moremo lotiti razvoja t.i. enostranske spletne aplikacije. Knjižnice in ogrodja razvijalcem ponujajo in olajšajo razvoj celotnih delov enostranskih spletnih aplikacij. Hkrati pa prinašajo tudi dodatne izzive, kot je npr. sobivanje »klasičnih« HTML ali JavaScript vsebin in komponent v širši aplikaciji, narejeni na osnovi tretjih knjižnic in ogrodij. V članku predstavljamo naše izkušnje z gradnjo enostranske spletne aplikacije. Ena izmed glavnih funkcionalnosti aplikacije je ustrezna vizualizacija podatkov, ki jih aplikacija prejema iz zalednega sistema. Vizualizacijo podatkov smo dosegli s pomočjo tretje knjižnice, ki jo je bilo potrebno prilagoditi gostitelju – knjižnici React. V tem članku povzemamo s tem povezane izzive ter zaznane dobre prakse. V naslednjem poglavju predstavimo glavne značilnosti knjižnice React. V poglavju 3 predstavimo postopek izbora in izbrano knjižnico za vizualizacijo podatkov. Pred zaključkom članka povzamemo še glavne izzive in rešitve pri vključevanju knjižnice v končno rešitev. KNJIŽNICA REACT.JS React.js (v nadaljevanju React) je JavaScript knjižnica za razvoj uporabniških vmesnikov. Za razvoj in vzdrževanje skrbijo v podjetju Facebook. Podjetje je knjižnico prvič uporabilo leta 2011 za prikaz novic na njihovem družabnem omrežju [1]. Leta 2012 so jo vključili tudi v družabno omrežje Instagram [1], ki prav tako spada pod okrilje podjetja Facebook. Knjižnica je postala odprtokodna leta 2013, od takrat naprej pa za njen razvoj poleg razvijalcev omrežij Facebook in Instagram skrbi tudi skupnost uporabnikov. Knjižnica React je kmalu postala zelo priljubljena med razvijalci uporabniškega vmesnika spletnih aplikacij [2]. Anketa na spletni strani Stack Overflow [3] za leto 2019 kaže, da je knjižnica React na prvem mestu popularnosti znotraj družine izdelkov. Bolj popularna je tudi od npr. ogrodja Angular. React tehnološko umeščamo na predstavitveni nivo spletnih aplikacij. Temelji na komponentah. Vsaka komponenta predstavlja samostojen modul, ki upodobi vnaprej definirano strukturo. Module lahko ponovno uporabljamo, npr. gnezdimo. Ker je knjižnica React deklarativna, običajno opredelimo tudi stanje, v katerem se komponenta nahaja in glede na to knjižnica izriše ustrezno strukturo [4]. V tem kontekstu predstavlja stanje vrednosti skozi življenjski cikel posamezne komponente. Vrednosti stanj lahko prenesemo tudi na vse gnezdene komponente [5]. S trenutno različico knjižnice React (16.8.0) je možno uporabiti stanja znotraj komponent, ki so napisane v obliki razredov ali funkcij. Komponente, implementirane kot funkcije, stanj v prejšnji različici niso podpirale in razvijalci so bili primorani definirati razrede [6]. Za razliko od ostalih JavaScript knjižnic ali ogrodij, React ne deluje neposredno nad objektnim modelom dokumenta (angl. Document Object Model, v nadaljevanju DOM). DOM predstavlja vmesnik, ki skriptam dovoljuje dinamični dostop in posodobitev vsebine, strukture ter stila dokumenta. Ker je DOM manipulacija neučinkovita, deluje React nad ti. virtualnim DOM (v nadaljevanju VDOM) [7]. VDOM hrani virtualno predstavitev uporabniškega vmesnika v pomnilniku in ko se spremeni stanje komponente, se posodobi tudi VDOM, React pa primerja prejšnjo in trenutno različico VDOM-a. Glede na rezultat primerjave se VDOM nato sinhronizira s strukturo DOM, kar posodobi uporabniški vmesnik. Na takšen način se pri izrisu posodobijo samo deli uporabniškega vmesnika, pri katerih so bile zaznane spremembe. Le-to običajno pomeni minimalno poseganje v DOM, zaradi česar je manipulacija VDOM hitrejša in bolj učinkovita kot manipulacija DOM [5, 8]. Poglavitna značilnost knjižnice React je tudi neločevanje logike aplikacije od njene predstavitve v različne datoteke. V ta namen se uporablja razširitev JSX, ki predstavlja sintaktično razširitev programskega jezika JavaScript. Namenjen definiranju elementov. Izsek kode v nadaljevanju demonstrira JSX sintakso (Izvorna koda 1: Primer sintakse JSX). OTS 2019 SODOBNE INFORMACIJSKE TEHNOLOGIJE IN STORITVE 241 A. Rajšp, G. Jošt, V. Taneski, S. Kuhar, L. Pavlič: Vizualizacija podatkov v knjižnici React, praktične izkušnje const naslov =

Vizualizacija podatkov v knjižnici React

Izvorna koda 1: Primer sintakse JSX Kot je razvidno, JSX torej omogoča pisanje kode JavaScript, ki je vizualno zelo podobna označevalnemu jeziku HTML. Ker je to še vedno JavaScript, uporaba rezerviranih besed ni dovoljena (npr. for ali class; alternativi sta htlmFor in className). Vsa koda, napisana v JSX, se nato s pomočjo Babel.js (prevajalnik JavaScript) prevede v sintakso React.createElement, ki skrbi za ustvarjanje novih elementov. Razvoj elementov React je sicer možen tudi brez uporabe JSX, vendar je uporaba JSX priporočljiva. Omogoča namreč lažji pregled kode, obenem pa React tudi lažje prikaže morebitne napake ali opozorila glede sintakse [9]. Slika 1 prikazuje sintakso JSX (levi del slike) in prevedeno kodo (desni del). Slika 1: Babel.js pretvorba JSX kode v React.createElemet() klice Logiko in prikaz komponente definiramo v eni datoteki, kot je razvidno iz primera v nadaljevanju (Izvorna koda 2). const App = () => { const [show, setShow] = useState(false); useEffect(() => { setTimeout(() => { setShow(true); }, 3000); }, []); return ( <> {!show &&
Nalagam...
} {show &&

Vizualizacija podatkov v knjižnici React, praktične izkušnje
Alen Rajšp, Gregor Jošt, Viktor Taneski, Saša Kuhar, Luka Pavlič

React je ena izmed treh najbolj priljubljenih knjižnic za razvoj enostranskih spletnih aplikacij (angl. frontend). Omogoča tudi implementacijo ponovno uporabnih gradnikov uporabniškega vmesnika. Dodatne izzive in omejitve predstavlja uporaba zunanjih knjižnic in ogrodij. To še posebej velja v primeru, ko knjižnico React uporabljamo v kombinaciji z enim izmed meta‐programskih JavaScript jezikov (npr. TypeScript).

} ); } Izvorna koda 2: Logika in prikaz komponente v React-u 242 OTS 2019 SODOBNE INFORMACIJSKE TEHNOLOGIJE IN STORITVE A. Rajšp, G. Jošt, V. Taneski, S. Kuhar, L. Pavlič: Vizualizacija podatkov v knjižnici React, praktične izkušnje Primer uporablja aktualen pristop k opredelitvi stanja komponente (funkcija useState), ki v tem primeru najprej izpiše »Nalagam…« in čez 3 sekunde posodobi uporabniški vmesnik tako, da izpiše povzetek članka. Vsa sintaksa v return delu funkcije predstavlja JSX. React-a ne uvrščamo med ogrodja, ampak knjižnice. Zato moramo ob uporabi običajno vključiti še dodatne knjižnice, ki skrbijo npr. za usmerjanje med posameznimi stranmi, pridobivanje podatkov, vodenje stanja skozi celotno aplikacijo in nenazadnje tudi za vizualizacijo podatkov. Poseben izziv zato predstavlja tudi odločanje, katero izmed množice knjižnic komplementarno uporabiti pri razvoju s pomočjo knjižnice React. Proces izbire in praktične izkušnje pri tem so predstavljeni v nadaljevanju članka. PRIMERJAVA IN IZBOR KNJIŽNIC ZA VIZUALIZACIJO PODATKOV Praktična rešitev, iz katere izhaja ta članek, omogoča kompleksne vizualizacije povezanih podatkov. Posledično je prikaz podatkov centralna funkcionalnost. Izbira pravih orodij je zato zelo pomembna, saj je bilo med drugim potrebno zagotoviti čim boljšo uporabniško izkušnjo. Iz vidika razvijalca je zmožnost prikaza podatkov enako koristna, kot izdelava interaktivnih spletnih strani, saj ti pogosto sodita skupaj. Ker jezik JavaScript še naprej pridobiva na popularnosti na področju vizualizacije podatkov, je trg že dokaj bogat s knjižnicami za ustvarjanje spletnih grafov za prikaz podatkov. Za naše potrebe je bilo razumevanje delovanja in načina uporabe najbolj popularnih vizualizacijskih JavaScript knjižnic ključno. Izbrati je bilo potrebno tisto, ki bi najbolje ustrezala zahtevam končne rešitve. Pri tem smo upoštevali več dejavnikov. Med drugimi: (1) nabor grafov, ki jih potrebujemo za prikaz podatkov, (2) količino podatkov, ki jo je potrebno prikazati, (3) pravilen prikaz grafov na različnih napravah, (4) podpora brskalnikov, (5) potreba po dodatnem prilagajanju grafov itn. V nadaljevanju tega poglavja podrobneje opišemo zahteve glede prikazovanja podatkov, metodo izbora ustrezne knjižnice ter primerjavo konkretnih knjižnic. 3.1 Zahteve Zaradi specifičnosti naše rešitve in večje količine vizualiziranih podatkov je bila raba aplikacije predvidena predvsem na napravah z večjim zaslonom (npr. računalnikih ali tablicah in ne na mobilnih telefonih). Zahteve glede vizualizacije podatkov so bile podane vizualno s pomočjo narisanega prototipa uporabniškega vmesnika. Ob nekaterih dokaj klasičnih stolpčnih, vrstičnih, linijskih in naloženih diagramih, so bili predvideni še takšni z visoko stopnjo prilagajanja: prekrivajoči se stolpčni oz. vrstični diagram (Slika 2), stiliziran diagram merilnika hitrosti (Slika 3), naložen stolpčni (Slika 4) in površinski grafikon (Slika 5), stolpčni in površinski diagrami z vizualno in številčno označenimi dodatnimi območji (Slika 6) ter grafikoni z dodanimi ikonami in zapisi na območjih izrisa podatkov (Slika 7). Slika 2: Prekrivajoči vrstični diagram z dodano ikono Slika 3: Stiliziran diagram merilnika hitrosti OTS 2019 SODOBNE INFORMACIJSKE TEHNOLOGIJE IN STORITVE 243 A. Rajšp, G. Jošt, V. Taneski, S. Kuhar, L. Pavlič: Vizualizacija podatkov v knjižnici React, praktične izkušnje Slika 4: Naložen stolpčni diagram Slika 5: Naložen površinski diagram Slika 6: Stolpčni diagram z dodatno označenim območjem Slika 7: Diagram z dodanimi ikonami in zapisi na območju izrisa podatkov 3.2 Metoda izbora in primerjava izbranih knjižnic Ker smo želeli dopustiti možnost posodabljanja sistema in vnašanja morebitnih novih funkcionalnosti, je bil cilj temu primerno izbrati tudi knjižnico za vizualizacijo podatkov. Pomembno je bilo, da bo izbrana knjižnica omogočala zahtevane tipe grafov, bo odprtokodna, brezplačna za uporabo v komercialni aplikaciji, dobro dokumentirana, redno posodobljena, čim preprostejša za uporabo ter, da bo omogočala prilagoditve. Kot je prikazano na sliki (Slika 8), smo sledili šest-stopenjskemu načinu izbora knjižnice: 244 OTS 2019 SODOBNE INFORMACIJSKE TEHNOLOGIJE IN STORITVE A. Rajšp, G. Jošt, V. Taneski, S. Kuhar, L. Pavlič: Vizualizacija podatkov v knjižnici React, praktične izkušnje Slika 8: Postopek izbora primernega orodja Identifikacijo knjižnic smo opravili s pomočjo repozitorija programske kode Github [10]. Identificirali smo 16 različnih knjižnic za vizualizacijo grafov. Začetni izbor smo zožili tako, da smo najprej izločili knjižnice, pri katerih koda ni prosto dostopna. Nato smo odstranili vse, pri katerih je potrebno plačati rabo v komercialnih aplikacijah. Začetni izbor smo nato primerjali glede na podprte tipe grafov, kjer smo se pri identifikaciji zgledovali po [11]. Identificirali smo 13 osnovnih tipov grafov, ki so se pojavljali v knjižnicah (podčrtani so tisti, ki so bili nujni za izris v konkretnem primeru): merilnik, stolpčni (navaden, naložen), črtni (navaden, površinski), radar, kolobarni, tortni, raztreseni, lijak, ganttov, kvartilni, polarni in mehurčni. Glede na zahteve, smo identificirali tudi 5 specifičnih funkcionalnosti, ki smo jih potrebovali: prekrivajoče regije, ikone na grafih, kombinacije grafov in vertikalne / horizontalne črte z označbami. Tako smo izbrali 4 potencialno primerne knjižnice (C3.js, D3.js, Recharts in Incubator echarts), kot je prikazano spodaj (Tabela 16). Tabela 16: Identificirane knjižnice ih h ti vezd vost oči a st ajoč ov aj ub z 8) no dlji af jk onalnos go gr an Gith htev manjk v po Knjižnic Št. (11. 201 Licenca Za implementacije Prila Št. ti Št m funkci Chart.JS [12] 40361 MIT [13] nizka nizka 3 4 Chartist.JS [14] 11231 MIT nizka nizka 2 5 ✔ C3.js [15] 8089 MIT nizka srednja 2 1 ✔ D3.js [16] 80246 BSD-3 [17] visoka visoka 0 0 ✔ Recharts [18] 10318 MIT nizka srednja 2 2 Plotly.js [19] 9282 MIT nizka srednja 2 2 NVD3.js [20] 6730 Apache 2.0 [21] nizka srednja 3 5 Victory [22] 6548 MIT nizka nizka 3 4 Vx [23] 5311 MIT srednja visoka 3 5 React-Vis [24] 4696 MIT nizka nizka 3 4 Britecharts [25] 3184 Apache 2.0 nizka nizka 3 5 ✔ Incubator echarts [26] 31145 Apache 2.0 srednja srednja 2 2 AnyChart [27] 188 lastniška Amcharts [28] 373 lastniška Knjižnice plačljive za komercialno rabo. CanvasJS [29] 9 lastniška Google Charts [30] 763 lastniška OTS 2019 SODOBNE INFORMACIJSKE TEHNOLOGIJE IN STORITVE 245 A. Rajšp, G. Jošt, V. Taneski, S. Kuhar, L. Pavlič: Vizualizacija podatkov v knjižnici React, praktične izkušnje V fazo prototipiranja smo vključili vse razen D3.js, ki se je izkazala za preveč kompleksno za začetno uporabo. Namen te faze je bila implementacija kompleksnejših tipov grafov na statičnih spletnih straneh. Primer poizkusa izrisa prekrivajočega se stolpčnega grafa je viden na Slika 9. Tudi v preostalih primerih je bilo s knjižnico C3.js mogoče doseči največji približek zahtevanemu izgledu, glede na zahteve. Recharts Incubator echarts C3.js Slika 9: Primerjava izrisov prekrivajočega stolpčnega grafa v treh izbranih knjižnicah VIZUALIZACIJA PODATKOV S KNJIŽNICO C3.JS C3.js [15] je knjižnica za izris grafov, ki je izdana je pod licenco MIT [13]. To omogoča, da jo brez nadomestila uporabimo tudi v komercialnih projektih. Temelji na knjižnici D3.js [16]. Knjižnica je bila prvič izdana 2014 in je do sedaj doživela že 104 izdaje, kar nakazuje, da je aktualna in sprotno vzdrževana. Grafi so, kot pri knjižnici D3.js, izrisani v formatu SVG. Za uporabo moramo vključiti njeno stilno predlogo ( css), knjižnico D3.js ter JavaScript datoteko knjižnice. Knjižnica upodobljene podatke tematsko podrobneje loči. Npr. na podatke (data), osi (axis), legendo (legend), mrežo (grid), regije (region) idr., pri čemer vsaka kategorija predstavlja objekt, ki je vključen v krovni JSON objekt grafa. Obstoječe grafe je mogoče tudi posodabljati, brez ustvarjanja novega primerka grafa. Preprost primer je viden v nadaljevanju (Izvorna koda 3).
Izvorna koda 3: Preprost primer C3.js C3.js pri izrisu grafov neposredno dostopa do DOM. V povezavi s knjižnico React (ki dostopa do VDOM) to predstavlja določeno tveganje, saj obe knjižnici manipulirata z istim dokumentom. V nadaljevanju (poglavje Izzivi in rešitve) bomo naslovili tudi ta tveganja in podali nekaj usmeritev. 4.1 Prilagoditve grafov Osnovne grafe je bilo potrebno prirediti, da bodo le-ti vizualno in funkcionalno ustrezali zahtevam. Prilagoditve so se nanašale tako na stil kot tudi funkcionalnosti. Stilske prilagoditve grafov smo dosegli večinoma z modifikacijo stilnih predlog ( css). Izris npr. grafa merilnika (ki v C3.js ni predviden) je zahteval (Slika 10), da del tortnega grafa napolnimo s prosojno barvo (2), kar smo storili tako, da smo vanj vstavili navidezne podatke, ki imajo isto barvo kot ozadje, nato s pomočjo CSS transformacij graf rotirali (3), napise pa rotirali v obratni smeri, da tako ohranijo normalno orientacijo (4). 246 OTS 2019 SODOBNE INFORMACIJSKE TEHNOLOGIJE IN STORITVE A. Rajšp, G. Jošt, V. Taneski, S. Kuhar, L. Pavlič: Vizualizacija podatkov v knjižnici React, praktične izkušnje (1) začetni graf brez (2) vstavljanje navideznih (3) CSS rotacija celotnega (4) CSS rotacija napisov in prilagoditev podatkov grafa oznak v obratni smeri Slika 10: Transformacija tortnega grafa v merilnik Na mestih, kjer prilagoditve CSS niso zadoščale, smo prilagodili še metode knjižnice C3.js (npr. init – se proži ob inicializaciji , onrendered – se proži ob ponovnem risanju grafa, onmouseover – se proži ob vstopu kurzorja v območje grafa, onmouseout – se proži ob zapustitvi kurzorja iz območja grafa , onresize – se proži ob spreminjanju velikosti okna brskalnika). Pri slednjem načinu uporabe smo v metodah uporabljali funkcionalnosti krovne knjižnice D3.js. Transformacije CSS so bile zmogljivostno manj zahtevne saj so se izvedle ob izrisu grafov. Po drugi strani pa je bila raba metod veliko zahtevnejša. Naknadne transformacije na grafih so se lahko izvedle šele po prvotnem izrisu grafa, kar pomeni, da se je vsak graf za prikaz moral vsaj dvakrat deloma izrisati. V primeru merilnika smo potrebovali naknadne transformacije, saj zapis besedila na zgornjih grafih v primeru merilnika ni statičen in je odvisen od podatkov (njegov namen v prvotnem tortnem grafu je, da služi kot naslov, ki se ne spreminja). 4.2 Izzivi in rešitve Za vključitev knjižnice C3.js v našo rešitev, smo potrebovali komponento, ki predstavlja ovojnico, saj tako React kot C3.js dostopata do istega DOM. Zaradi uporabe meta-programskega jezika TypeScript smo pri uporabi obstoječih ovojnic [31, 32] naleteli na izzive, saj ovojnice niso nudile podpore TypeScript. Kljub temu, da smo omejitev zaobšli z izključitvijo TypeScript preverjanja pri vključitvi ovojnic, smo naleteli na težave, povezane z verzijam knjižnic C3.js in D3.js. Ovojnici sta bili namreč narejeni za zastareli različici omenjenih knjižnic, posodobitev zgolj teh odvisnosti na novejše različice pa je povzročila napake pri prikazovanju grafov. To nas je med drugim privedlo do odločitve, da smo razvili lastno ovojnico za izris grafov, kjer smo zagotovili podporo TypeScript in najnovejšim različicam knjižnic za izris grafov. C3.js je namenjen klasičnim spletnim stranem, ki uporabljajo DOM. V knjižnici je predvideno, da se veže na DOM element (npr. div), katerega id je znan. V Reactu takšen način naslavljanja elementov ni v celoti podprt; v ta namen je predvidena uporaba useRef, ki omogoča sklic na komponento (v našem primeru predstavlja div vsebnik za prikaz grafa). Pristop z rabo referenc pri razvoju lastne ovojnice je viden v nadaljevanju (Izvorna koda 4). // Kreiranje reference const refNaGraf: React.RefObject = useRef(null); ... graf.current = c3.generate({ bindto: refChart.current, //referenca nadomešča privzeti način pripenjanja preko id‐ja ... }); ... // Pripenjanje reference na komponento return
; Izvorna koda 4: Kreiranje reference in pripenjanje reference za direkten dostop do elementa DOM ob nastanku grafa Nepazljivost pri nalaganju in sproščanju podatkov v knjižnici C3.js lahko v primeru nepravilne rabe proži napako. Zato je bilo potrebno pozorno upravljati z življenjskim ciklom grafa, ki je vezan na življenjski cikel vsebnika (komponente – ovojnice). Potrebno je bilo zagotoviti, da se ob kreaciji/priklopu (angl. mount) komponente, ustvari celoten graf, ob posodabljanju (angl. updating) pa spremenijo le podatki. In sicer na takšen način, da se sprostijo stari podatki (angl. unload) in naložijo novi (angl. load). Ob odklapljanju (angl. unmount) OTS 2019 SODOBNE INFORMACIJSKE TEHNOLOGIJE IN STORITVE 247 A. Rajšp, G. Jošt, V. Taneski, S. Kuhar, L. Pavlič: Vizualizacija podatkov v knjižnici React, praktične izkušnje komponente je bilo potrebno zagotoviti, da se podatki iz grafa najprej sprostijo, šele nato se lahko komponenta odklopi. Nenazadnje pa smo se soočili tudi s težavo, vezano na obliko podatkov iz končnih točk REST. Struktura podatkov ni bila prilagojena uporabi v grafih, saj smo podatke prikazovali tudi v tabelarični obliki. V ta namen smo bili primorani strukturo podatkov prilagoditi glede na tip grafov, kar je predstavljalo svojevrsten izziv. ZAKLJUČEK React je trenutno najbolj priljubljena knjižnica za razvoj enostranskih spletnih aplikacij. Omogoča tudi implementacijo ponovno uporabnih gradnikov uporabniškega vmesnika. Dodatne izzive in omejitve med razvojem predstavlja uporaba zunanjih knjižnic in ogrodij. V članku smo predstavili možnosti uporabe ogrodja React, s tem povezane dobre prakse in možnosti učinkovite povezave s tretjimi knjižnicami. Podali smo praktične izkušnje in izzive pri implementaciji tipične aplikacije za vizualizacijo podatkov, kjer smo se omejili na knjižnice za prikaz grafov. Demonstrirali smo postopek izbora knjižnice, njihove vključitve ter naše izkušnje in dobre prakse pri uporabi izbrane odprtokodne JavaScript knjižnice. LITERATURA [1] Education Ecosystem, „React.js History - Education Ecosystem“, 2018. [Na spletu]. Dostopno: https://www.education-ecosystem.com/guides/programming/react-js/history. [Dostopano: 22-maj- 2019]. [2] O. Williams, „Making the business case for React in 2019 – LogRocket“, 2019. [Na spletu]. Dostopno: https://blog.logrocket.com/making-the-business-case-for-react-in-2019-74463bbb22de. [Dostopano: 22-maj-2019]. [3] Stackoverflow, „Stack Overflow Developer Survey 2019“, 2019. [Na spletu]. Dostopno: https://insights.stackoverflow.com/survey/2019. [Dostopano: 22-maj-2019]. [4] Facebook Inc., „React – A JavaScript library for building user interfaces“. [Na spletu]. Dostopno: https://reactjs.org/. [Dostopano: 22-maj-2019]. [5] M. Abe, „React is a JavaScript Library for Building User Interfaces; Not a Framework Like Angular“. [Na spletu]. Dostopno: https://www.codemag.com/Article/1809041/Demystifying-React. [Dostopano: 22-maj-2019]. [6] Facebook Inc., „Introducing Hooks – React“. [Na spletu]. Dostopno: https://reactjs.org/docs/hooks- intro.html. [Dostopano: 22-maj-2019]. [7] Facebook Inc., „Virtual DOM and Internals – React“. [Na spletu]. Dostopno: https://reactjs.org/docs/faq-internals.html. [Dostopano: 22-maj-2019]. [8] M. Hamedani, „React Virtual DOM Explained in Simple English - Programming with Mosh“, 2018. [Na spletu]. Dostopno: https://programmingwithmosh.com/react/react-virtual-dom-explained/. [Dostopano: 22-maj-2019]. [9] Facebook Inc., „Introducing JSX – React“. [Na spletu]. Dostopno: https://reactjs.org/docs/introducing-jsx.html. [Dostopano: 22-maj-2019]. [10] Microsoft, „GitHub“. [Na spletu]. Dostopno: https://github.com/. [Dostopano: 27-maj-2019]. [11] Wikipedia, „Comparison of JavaScript charting libraries“, 2019. [Na spletu]. Dostopno: https://en.wikipedia.org/wiki/Comparison_of_JavaScript_charting_libraries. [Dostopano: 27-maj- 2019]. [12] „Chart.js | Open source HTML5 Charts for your website“. [Na spletu]. Dostopno: https://www.chartjs.org/. [Dostopano: 27-maj-2019]. [13] Opensource.org, „The MIT License | Open Source Initiative“. [Na spletu]. Dostopno: https://opensource.org/licenses/MIT. [Dostopano: 22-maj-2019]. [14] „Chartist - Simple responsive charts“. [Na spletu]. Dostopno: https://gionkunz.github.io/chartist-js/. [Dostopano: 27-maj-2019]. 248 OTS 2019 SODOBNE INFORMACIJSKE TEHNOLOGIJE IN STORITVE A. Rajšp, G. Jošt, V. Taneski, S. Kuhar, L. Pavlič: Vizualizacija podatkov v knjižnici React, praktične izkušnje [15] „C3.js | D3-based reusable chart library“. [Na spletu]. Dostopno: https://c3js.org/. [Dostopano: 22- maj-2019]. [16] M. Bostock, „D3.js - Data-Driven Documents“. [Na spletu]. Dostopno: https://d3js.org/. [Dostopano: 22-maj-2019]. [17] „The 3-Clause BSD License | Open Source Initiative“. [Na spletu]. Dostopno: https://opensource.org/licenses/BSD-3-Clause. [Dostopano: 27-maj-2019]. [18] „Recharts“. [Na spletu]. Dostopno: http://recharts.org/en-US/. [Dostopano: 27-maj-2019]. [19] „plotly.js | JavaScript Graphing Library“. [Na spletu]. Dostopno: https://plot.ly/javascript/. [Dostopano: 27-maj-2019]. [20] „NVD3“. [Na spletu]. Dostopno: http://nvd3.org/. [Dostopano: 27-maj-2019]. [21] ASF, „Apache License, Version 2.0“. [Na spletu]. Dostopno: https://www.apache.org/licenses/LICENSE-2.0.html. [Dostopano: 27-maj-2019]. [22] „Victory | VictoryChart“. [Na spletu]. Dostopno: https://formidable.com/open-source/victory/. [Dostopano: 27-maj-2019]. [23] „vx | visualization components“. [Na spletu]. Dostopno: https://vx-demo.now.sh/. [Dostopano: 27- maj-2019]. [24] „react-vis“. [Na spletu]. Dostopno: https://uber.github.io/react-vis/. [Dostopano: 27-maj-2019]. [25] „Britecharts - D3.js based charting library of reusable components“. [Na spletu]. Dostopno: http://eventbrite.github.io/britecharts/. [Dostopano: 27-maj-2019]. [26] „ECharts“. [Na spletu]. Dostopno: http://echarts.apache.org/. [Dostopano: 27-maj-2019]. [27] „AnyChart is a lightweight and robust JavaScript charting library“. [Na spletu]. Dostopno: https://www.anychart.com/. [Dostopano: 27-maj-2019]. [28] „JavaScript Charts & Maps - amCharts“. [Na spletu]. Dostopno: https://www.amcharts.com/. [Dostopano: 27-maj-2019]. [29] „Beautiful HTML5 JavaScript Charts | CanvasJS“. [Na spletu]. Dostopno: https://canvasjs.com/. [Dostopano: 27-maj-2019]. [30] „Charts | Google Developers“. [Na spletu]. Dostopno: https://developers.google.com/chart/. [Dostopano: 27-maj-2019]. [31] C. X. Su, „GitHub - bcbcarl/react-c3js: React component for C3.js“. [Na spletu]. Dostopno: https://github.com/bcbcarl/react-c3js. [Dostopano: 22-maj-2019]. [32] C. Reichert, „GitHub - CodyReichert/react-c3: A React.js Component wrapper for creating graphs using c3.js“. [Na spletu]. Dostopno: https://github.com/CodyReichert/react-c3. [Dostopano: 22-maj- 2019]. OTS 2019 ADVANCED INFORMATION TECHNOLOGY AND SERVICES M. Heričko in K. Kous (eds.) AN INSIDE LOOK INTO FLUTTER DEVELOPMENT BLAGOJ SOKLEVSKI, ANDREJ KLINE46 Abstract: What is Flutter and how does it work? What is Dart? How to get started with Flutter? These are just some of the questions that will be answered in this paper which will help you understand this new framework and will provide a solid ground to continue learning Flutter. Here we share the inside knowledge of Flutter development which we acquired while developing our iAgent mobile application for car insurance, and last but not least we will share our piece of mind about this new modern framework that shook the mobile development world. Key words: Flutter, Dart, hybrid mobile development, Android, iOS CORRESPONDENCE ADDRESS: Blagoj Soklevski, msg life odateam d.o.o., Maribor, Slovenia e-mail: blagoj.soklevski@msg-life.com. Andrej Kline, msg life odateam d.o.o., Maribor, Slovenia e-mail: andrej.kline@msg-life.com. https://doi.org/10.18690/978-961-286-282-4.28 ISBN 978-961-286-282-4 Dostopno na: http://press.um.si 250 OTS 2019 SODOBNE INFORMACIJSKE TEHNOLOGIJE IN STORITVE B. Soklevski, A. Kline: An Inside Look into Flutter Development INTRODUCTION In designing and developing mobile applications we face a lot of challenges, such as wanting to make them with a high-quality look and feel, extending the reach (building and releasing them for the two major platforms iOS and Android), minimizing the time to market and making them affordable in the whole process. Now, we are faced with the dilemma of mobile app development, should we go hybrid and have only one project to maintain but sacrifice performance and usability. Or, should we take the more expensive route and create separate native apps with separate code bases but gain in performance and overall usability but pay the price in maintaining them. Through the years, many frameworks for hybrid mobile development have surfaced, some created by big names, some gained temporary popularity, while others lasted through the years, the list does not stop (Xamarin, PhoneGap, Ionic Framework, React Native, etc.). However, native development always seems to have the upper hand until a truly big player decided to enter the game. With the creation of Flutter (by Google), hybrid development finally stood a chance and seeing how major players like Alibaba and Google have adopted it (just as Google rewriting its Google Ads with Flutter), it seems that this framework has a bright future and is here to stay. After having an eye on Flutter for some time now, and with the rapid growth of our new ecosystem of insurance suites and accompanying mobile applications under the brand name of "iAgent", we took the opportunity and got our hands dirty by starting the development of one of the mobile application for "iAgent" in Flutter. The application we are developing gives the end user the opportunity to easily purchase a car insurance policy regardless whether the user is on a lunch break, sitting on the bus, or relaxing on the couch at home. In this article, we will cover everything we have learned regarding Flutter from the first line of code to the release procedure, including which IDE we tried, the pros and cons of developing in Flutter, the learning curve of Dart and the difficulty of changing the mindset from native to hybrid development of mobile applications. With the new release version of Flutter 1.5 and Dart 2.2 and the idea that you can cover two platforms (Android and iOS) with a single codebase, the temptation becomes even bigger to leave all of the time consuming native programming and just focus on this new open-source mobile application development framework created by Google which has the perks of fast development, expressive and flexible UI, and native performance. Now, lets not fly too close to the sun, we do not live in a perfect world, every now and then you have to look under the hood and write some native code if needed, depending on your use case so do not get rusty in Kotlin, Swift, or Java too fast. FLUTTER This paragraph will answer questions such as what is Flutter, how does it work, what is the anatomy of the Flutter project, what is Dart and last but not least how to get started. The answers to these questions will help you understand this new framework and will provide a solid background for you to continue learning Flutter. 2.1 What is Flutter and how does it work? Right off the bat, Flutter is an open-source framework for creating mobile applications, first appears by the name "Sky" in 2015 and ran on the Android operating system. Flutter allows you to build beautiful native apps on iOS and Android from a single codebase [1]. Google markets its creation by these three key points: expressive and flexible UI, fast development and native performance. Native performers may be the best feature because the first hybrid mobile applications that came out were nothing but web pages shown in a Webkit (browser rendering engine), this is a very expensive way of manipulating the DOM paid in performance by the app. Building the JavaScript bridge became a solution for some platforms but not the ideal one. That bridge became the bottleneck because JavaScript code had to be compiled while the application is running which is a big performance issue. Flutter, on the other hand, does not have such problems because it compiles directly to ARM code. A note to take in is that Dart has an AOT (Ahead of Time) and JIT (Just in Time) compilers so in Flutter when you release your app in production the AOT is used but when you are developing JIT is being used [2]. The "hot reload" is responsible for the rapid development, a feature that you cannot leave without after you try it. This feature speeds up the development because you can make changes on the UI and you can see them on the fly, this works by injecting the changed source code files into the running Dart Virtual OTS 2019 SODOBNE INFORMACIJSKE TEHNOLOGIJE IN STORITVE 251 B. Soklevski, A. Kline: An Inside Look into Flutter Development Machine (VM), Flutter rebuilds the widget tree, allowing you to quickly view the effects of your changes [3]. Flutter has layered architecture which gives the opportunity for full customization, it is also well stock on UI element but the biggest feature regarding the design is that Flutter provides Material and Cupertino design libraries. With these two libraries, you can make beautiful applications for both Android and iOS users, also, both styles are well documented and have really nice guidelines. When you look at application programmed in Flutter the first thing you will notice is the style in which it is programmed. In the beginning, it was difficult to change the mindset because UI is typically programmed in an imperative style, so programming in a declarative style came as a little shock. A high chance is that most of the developers who would start to learn Flutter are mobile developers and are used to the imperative style of programming in native Android and iOS. In the declarative style, view configurations (such as Flutter’s Widgets) are only some sort of lightweight blueprints and to change the UI, a Widget triggers a rebuild on itself and constructs a new Widget subtree [4]. In Flutter the UI is created programmatically it does not have a separate file like a “.xml” that Android has or “.xib” for iOS, this means that the state and the view are tightly intertwined which is another fact that helps explain why the declarative style was chosen. In Flutter everything is a Widget (views, buttons, layout, inputs, labels, etc.) and widgets are just Dart classes that know how to describe the view. Knowing this, we can see why Flutter prefers composition over inheritance because by creating new widgets you can reuse them throughout the application [2]. We can divide the Widgets in two main groups ones that extend the StatelessWidget class and the others that extend the StatefullWidget class. However, all widgets regardless of which class they extend must have a build method and should be immutable except for the state objects. Let's start with the StatelessWidget, as the name implies this type of widget can’t hold any state and is destroyed when removed from the widget tree. This kind of widget is used when the part of the user interface you are describing does not depend on anything other than the configuration information in the object [5]. On the other hand, you have the StatefullWidget which has a State object and has control over rebuilding the widgets using this methods: ● initState ● didChangeDepencies ● build ● widgetDidUpdate ● setState ● dispose Flutter has dynamic routing which makes the routing more flexible and fluid, the navigator is the one that allows you to create routes on the fly in your code. Flutter also supports static routing using named routes that need to be defined in your MatherialApp widget [2]. 2.2 What is dart Dart? Dart is an open source programing language which first appeared in 2011, developed by Google with the intended use for creating web apps, hoping to boost performance and productivity. Fast forward to 2019 with its stable release 2.2.0 (as of 26 February 2019) Dart became a language used for developing desktop, server, web, and mobile applications, the accent falling on the mobile development area with the emergence of Flutter. Dart is easy to learn. A wide range of developers can learn Dart quickly. It is an object-oriented language with classes, single inheritance, lexical scope, top-level functions, and a familiar syntax. Most developers are up and running with Dart in just a few hours [6]. It supports interfaces, mixins, abstract classes, reified generics, static typing, and a sound type system [7]. In Dart, the static typing is optional but it would be better practice to use types because it makes the code safer and IDEs tend to give better warnings and error messages. Besides, if you are coming from a programming language that is statically typed (Java for example) it will be instinctual to use types. An interesting fact is that Dart 2 made the “new” keyword optional, another cool feature is the optional parameters. You can make named optional parameters by wrapping them in curly brackets or positional by wrapping them in box brackets, but you cannot use them both at the same time. Everything you can place in a variable is an object, and every 252 OTS 2019 SODOBNE INFORMACIJSKE TEHNOLOGIJE IN STORITVE B. Soklevski, A. Kline: An Inside Look into Flutter Development object is an instance of a class. Even numbers, functions, and null are objects. All objects inherit from the Object class [8]. 2.3 What is the anatomy of a Flutter project? Every framework has a unique anatomy (structure) inside its project, looking inside of a Flutter project anatomy may be a bit confusing because it contains a whole Android and iOS project. If you look at a Flutter project you can see the basic structure in which you will find the subprojects for Android and iOS. In some cases, you probably will not even open these subprojects depending on your use cases for the application you are writing. But, if for example, you need to write a platform channel this is the place to do it. For the most part, plugins fix these issues when you need some native power (like accessing the camera) in your application, but Flutter is a young framework and at the moment of writing this article, not everything is covered by plugins, so you may need to get your hands dirty and write some native code. Platform channels and method fix this issue and send messages from Flutter to the native code. Be cautious when you create your Flutter project because the default language for Android is Java and for iOS is Objective C and for example, if you need to write a method channel and you only know Swift you will have a problem. Another example in which you will need to access the Android and iOS project is if you need to add changes to the configuration files ("AndroidManifest.xml" or "Info.plist") like a new permission. The “lib” folder is where you will be spending most of your time because here is where we write dart code for our Flutter app. The last important part of the project structure is the configuration file "pubspec.yaml". Here we specify the name of the app, the description, the version. Also, here we add dependencies and assets such as images or custom funds. Have in mind if you add new dependence you should run the "flutter packages get" command to retrieve them or "flutter packages upgrade" command to update them, but modern IDEs like VS Code or Android Studio do this for you after saving the file or they supply dedicated buttons for these actions. 2.4 How to get started? From installation to release (.apk/.ipa) This paragraph will cover in short summary the whole process from installing Flutter to the releasing procedure. Flutter is available for Linux, macOS, and Windows. The installation process is pretty straight forward and well-documented on the Flutter official website. After the installation, you can use the Flutter command-line tools. The first command you should run is flutter doctor, this command checks your environment and displays a report to the terminal window. The Dart SDK is bundled with Flutter; it is not necessary to install Dart separately [9]. Some defenses may be missing so just run flutter doctor and follow the instruction you get, this process may have to be repeated several times. Next comes the platform specific setup such as installing Xcode for iOS and the latest Android SDK, Platform-Tools, and build-Tools for Android. After completing the installation process you can create a project by running the command "flutter create my_app_name", this command creates a template project provided by Flutter and with this you are testing whether everything is working right. Now, either start an emulator or connect a device, navigate to the project and run the command "flutter run". If everything is ok you should see the app load. Here, you should take note that by running the “flutter create” command without providing additional flags the default template creates a project which for Android uses Java and for iOS uses Objective C. For example, if you want to use Kotlin or Swift you should run the command with the flags "i" for iOS and "a" for android as such "flutter create -i swift -a kotlin my_app_name". For IDE you can choose from Android Studio, IntelliJ IDEA (Community / Ultimate) or Visual Studio Code, whichever option you choose you cannot be wrong. They all have good plugins for Dart and Flutter, but from our experience we suggest if the goal is to learn Flutter, VS Code is the better choice because you do not get that much help from the IDE. However, in terms of better productivity, we suggest Android Studio because of the additional tooling supplied such as auto import, Flutter Inspector, Flutter Outline, Flutter Performance and let’s not forget that if you are working on macOS you can even open the iOS Simulator from the IDE. Now comes the growing task of creating your software which we will not cover so let‘s fast forward to the release procedure. For Android it is pretty straight forward, just run "flutter build apk" in the terminal and an “.apk” file will be created. For iOS let’s not forget that without a macOS machine, Xcode and a valid Apple developer account you cannot complete the process. Let's assume we have all of that covered, the next step would be to run the "flutter build clean" that "flutter build ios" and now you have to crack open OTS 2019 SODOBNE INFORMACIJSKE TEHNOLOGIJE IN STORITVE 253 B. Soklevski, A. Kline: An Inside Look into Flutter Development the Xcode. In Xcode select "Generic iOS Device" then click "Product>Archive" when that is finished a modal dialog will appear with your archives, select you latest archive and click the "Distribute App" button and from there onward you choose your way of distribution. In a short summary, you will need to get started with Flutter if you want to learn more, just open the official flutter web page and read up. IAGENT APP As always after toying around and creating side projects while testing the features of a new framework or programming language, it’s time to see what it can bring to the table so you have to get your hands dirty with the real deal and create a fully functional app. So we decided to create our iAgent app for car insurance with Flutter, so you can say the development of this app is responsible for the insight we got. This application is still a work in progress and it is going through a lot of changes, now we will describe the current state. Only Material design has been used for the current version and our goal is to have a unique design that does not strictly follow the Material design guidelines but still provides an excellent user experience both for Android and iOS. The app is primarily optimized for mobile phones but works fine on tablets as well, through the development process it is being tested in parallel on virtual iOS and Android devices. One segment of our app uses the camera, this segment has been tested on an iPad Air and on OnePlus 5T. The idea behind the application is to give the end user the opportunity to easily purchase a car insurance policy regardless whether the user is on a lunch break, sitting on the bus, or relaxing on the couch at home. For this purpose, we have created a custom wizard which with just five steps gets the user’s personal information, consent, the information about the vehicle, chooses an insurance package and in the final step gets the insurance policy. For this, we have used a lot of widgets that are provided out of the box by Flutter but also created some custom ones, for user interaction we are using gestures detector and inputs. In the future we hope to enrich the application with animation and expand the user's experience by adding a 360 view for the user. In short, we are happy with the progress we have made and the app will always have a special place in our hearts because it helped us to better understand the Flutter development process. CONCLUSION Google is going strong shipping several Flutter updates in the last year (the currently active version of Flutter is 1.5.4 released on May 7, 2019) with adding new functionalities, reducing the compile time, expanding to new fronts like web, embedded systems and desktop, also improving the plugins for VS Code and Android studio making Flutter more and more tempting for the developers. According to LinkedIn Data, Flutter is the fastest-growing skill among software engineers and after trying it for ourselves it is not that surprising [10]. To put it shortly, just try it for yourself chances are you will fall in love with this remarkable modern framework. A good analogy for our firm is a tree that has strong roots build upon Smalltalk, that are still growing, a robust trunk of Java that supports everything, branches that cannot stop spreading Spring, Microservices, Dockers, DevOps, Angular, Android, iOS and some of the branches even reach the Clouds (Amazon ECS) in the sky. Flutter now is nothing but a new twig that we hope will grow into a strong branch that could bear the fruit of our creative work in the mobile department. All that glitters is not gold but that is not case with Flutter. 254 OTS 2019 SODOBNE INFORMACIJSKE TEHNOLOGIJE IN STORITVE B. Soklevski, A. Kline: An Inside Look into Flutter Development REFERENCES [1] "Flutter - Beautiful native apps in record time." https://flutter.dev/. Accessed 1 May. 2019. [2] "Manning | Flutter in Action." https://www.manning.com/books/flutter-in-action. Accessed 13 May. 2019. [3] "Hot reload - Flutter." https://flutter.dev/docs/development/tools/hot-reload. Accessed 15 May. 2019. [4] "Introduction to declarative UI - Flutter." https://flutter.dev/docs/get-started/flutter-for/declarative. Accessed 13 May. 2019. [5] "StatelessWidget class - widgets library - Dart API - Flutter." https://docs.flutter.io/flutter/widgets/StatelessWidget-class.html. Accessed 14 May. 2019. [6] "1. Quick Start - Dart: Up and Running [Book] - O'Reilly Media." https://www.oreilly.com/library/view/dart- up-and/9781449330880/ch01.html. Accessed 23 Apr. 2019. [7] "Dart's Type System | Dart." https://www.dartlang.org/guides/language/sound-dart. Accessed 23 Apr. 2019. [8] "Dart: Up and Running: A New, Tool-Friendly Language for Structured" https://books.google.com/books?id=STrDtHUQv2oC&pg=PA12&lpg=PA12&dq=+dart+Everything+you+can+ place+in+a+variable+is+an+object,+and+every+object+is+an+instance+of+a+class.+Even+numbers,+functions, +and+null+are+objects.+All+objects+inherit+from+the+Object+class.&source=bl&ots=hOP7YeqB40&sig=ACf U3U1IC9ezb53eRi5K4PTVsUSgxLflCQ&hl=en. Accessed 25 Apr. 2019. [9] "Linux install - Flutter." https://flutter.dev/docs/get-started/install/linux. Accessed 25 Apr. 2019. [10] "The Fastest Growing Skills Among Software - LinkedIn Learning." 25 Mar. 2019, https://learning.linkedin.com/blog/tech-tips/the-fastest-growing-skills-among-software-engineers--and-how-to-. Accessed 13 May. 2019. OTS 2019 SODOBNE INFORMACIJSKE TEHNOLOGIJE IN STORITVE M. Heričko in K. Kous (ur.) MYPARK – MOBILNA APLIKACIJA ZA PREVERJANJE PARKIRNIH MEST MARK BERDNIK, GREGOR GRILC, MATIC STRAJNŠAK47 Povzetek: Prispevek predstavlja mobilno aplikacijo, ustvarjeno s sodobnim ogrodjem Flutter ter programskim jezikom Dart. S pomočjo omrežnega ogrodja DarkNet in knjižnice za računalniški vid OpenCV smo ustvarili video analitiko parkirišča, ki uporabnikom v aplikaciji izpiše, koliko je prostih parkirnih mest. Za administracijo celotne mobilne aplikacije smo kot nadzorno ploščo ustvarili spletno stran. Stran smo naredili s tehnologijo MERN (MongoDB, Express.js, React, Node.js) stack. Aplikacija ima tudi dva mikroservisa, to sta video analitika in strežnik (Node.js). Navedena mikroservisa smo virtualizirali z uporabo tehnologije Docker. Ključne besede: Flutter, Umetna inteligenca, video analitika, mikroservisi, MERN NASLOVI AVTORJEV: Mark Berdnik, dijak, Srednja elektro-računalniška šola, Maribor, Slovenija, e-pošta: mark.berdnik@sers.si. Gregor Gril, dijak, Srednja elektro-računalniška šola, Maribor, Slovenija, e-pošta: gregor.gril@sers.si. NASLOV MENTORJA: dipl. inz. rac. in inf. teh. Matic Strajnšak (un), Alcad d.o.o., Zgornja Bistrica, Slovenija, e-pošta: matic.strajnsak@alcad.si https://doi.org/10.18690/978-961-286-282-4.29 ISBN 978-961-286-282-4 Dostopno na: http://press.um.si 256 OTS 2019 SODOBNE INFORMACIJSKE TEHNOLOGIJE IN STORITVE M. Berdnik, G. Gril, M. Strajnšak: MyPark – Mobilna aplikacija za preverjanje parkirnih mest UVOD Živimo v modernem času in skoraj vsakdo že ima svoje osebno prevozno sredstvo, zaradi česar pa lahko hitro pride do stresa in težav pri iskanju prostih parkirnih mest. Rešitev za ta sodoben problem bi bila aplikacija MyPark, ki bi uporabniku prikazala prosta/zasedena parkirna mesta. Takšen pregled je mogoč z video analitiko parkirnih mest. Prepoznavanje slik v okviru strojnega vida je zmožnost programske opreme, da identificira objekte, mesta, ljudi, pisanje in dejanja v slikah. Računalniki uporabljajo tehnologijo strojnega vida v kombinaciji s fotoaparatom/kamero za umetno inteligenco, da dosežejo svoj cilj. Prepoznavanje slik se uporablja za izvedbo velikega števila vizualnih nalog, kot je označevanje vsebine slik z meta-oznakami, izvajanje iskanja vsebine slike in vodenje avtonomnih robotov, samovoznih avtomobilov in sistemov za izogibanje nesrečam. Čeprav človeški in živalski možgani prepoznajo predmete z lahkoto, imajo računalniki težave s to nalogo. Programska oprema za prepoznavanje slik namreč zahteva globoko strojno učenje. Učinkovitost reševanja problemov se zelo izboljša ob uporabi konvolucijskih nevronskih mrež in z uporabo namenske strojne opreme saj naloga zahteva veliko količino energije za intenzivne, kompleksne račune. Algoritmi za prepoznavanje slik so pogosto usposobljeni na milijonih predhodno označenih slik z vodenim računalniškim učenjem. Obdelava slik s Python3, OpenCV in Darknet je uporabljeno kot mikroservis. V mikroservisni arhitekturi je aplikacija razdeljena na tako imenovanje »mikrostoritve«. Vsaka storitev izvaja edinstven proces in običajno upravlja svojo lastno bazo podatkov. Storitev lahko generira opozorila, podatke dnevnika, podpira uporabniške vmesnike, obravnava identifikacijo ali overjanje uporabnikov in opravlja različne druge naloge. Paradigma mikroservisov zagotavlja razvojnim skupinam bolj decentraliziran pristop k izgradnji programske opreme. Mikrostoritve omogočajo, da je vsaka storitev obnovljena, prerazporejena in upravljana neodvisno. Na primer, če program ne ustvarja pravilno poročil, je lahko lažje izslediti težavo do določene storitve. Ta posebna storitev bi se lahko po potrebi preizkusila, ponovno zagnala, popravila in prerazporedila neodvisno od drugih storitev. Kako bi aplikacija delovala? Po svetu se uporabljajo kamere zaradi več razlogov, recimo varnost ljudi ali samo pregled določenega prostora. V našem primeru bi se uporabljale malo drugače, torej za implementacijo aplikacije bi bila potrebna kamera za pregled parkirišča. Kamera bi podatke o parkirišču posredovala aplikaciji in posledično tudi uporabniku. Uporabniku se na aplikaciji prikaže mapa določenega mesta in vsa vnesenega parkirišča, zraven pa še prostost le-teh. Ob kliku na izbrano parkirišče uporabnik vidi potrebne informacije o parkirišču kot so ime parkirišča, ulica parkirišča, število vseh parkirnih mest in število prostih ter zasedenih parkirnih mest. Uporabljene tehnologije Za izdelavo naše aplikacije smo uporabili sodobno ogrodje Flutter, s programskim jezikom Dart. Za dinamičnost aplikacije je uporabljena podatkovna baza MongoDB. Za pregled parkirnih mest je implementirano živčno omrežno ogrodje DarkNet (strojno učenje) in knjižnica OpenCV v programskem jeziku Python. Za administracijo spletne aplikacije smo izdelali spletno stran s tako imenovano MERN (MongoDB, Express, React, NodeJS) stack tehnologijo. PREDSTAVITEV TEHNOLOGIJ 2.1 Flutter Flutter je odprtokodno ogrodje za razvoj mobilnih aplikacij, ki ga je ustvaril Google leta 2017. Flutter ni jezik, temveč programski paket za razvoj oz. SDK (Software development kit). Za razvoj med platformami, ki uporabljajo Flutter, je DART uradni programski jezik. Vse komponente, ki se v Flutterju uporabljajo za delovanje aplikacije so tako imenovani gradniki oz. angleško widgets. Tako je tudi celotna aplikacija na koncu en widget Zgrajeni so z uporabo sodobnega ogrodja, ki ga navdihuje React. Dart je nov jezik s C-stilom, ki ga je razvil Google, prvič se je pojavil leta 2007. Uporablja se za razvoj aplikacij Android in IOS pa tudi kot osnovna metoda za ustvarjanje aplikaciji v Google Fuchsia. Flutter smo izbrali, saj je novejša tehnologija, deluje na OTS 2019 SODOBNE INFORMACIJSKE TEHNOLOGIJE IN STORITVE 257 M. Berdnik, G. Gril, M. Strajnšak: MyPark – Mobilna aplikacija za preverjanje parkirnih mest dveh platformah (Android in IOS), ponuja hitrejše in zmogljivejše aplikacije in lepši izgled. Prav tako je želja letošnje konference uporaba te tehnologije. 2.2 Dart Dart je splošen programski jezik, ki ga je prvotno razvil Google, kasneje pa ga je Ecma odobrila kot standard. Uporablja se za izdelavo spletnih, strežniških, namiznih in mobilnih aplikacij. Dart izgleda kot C in je objektno usmerjen programski jezik. Ustvarjen je za hitro univerzalno razvojno kodo, zato je skoraj vse v Flutter-ju napisano s tem programskim jezikom. Omogoča lažje ustvarjanje animacij in prehodov, ki se izvajajo pri 60fps. V Dart-u se najpogosteje uporabljajo Widgeti, Materiali (mobilno UI ogrodje) in Cupertino (IOS UI ogrodje). 2.3 MongoDB MongoDB je odprtokodni sistem za upravljanje podatkovnih baz, ki uporablja dokumentno usmerjen model baze podatkov, ki podpira različne oblike podatkov. Gre za eno od številnih ne-relacijskih tehnologij podatkovnih baz, ki so se pojavile sredi leta 2000 pod zastavico NoSQL. Za uporabo v velikih podatkovnih aplikacijah in drugih obdelovalnih opravilih, ki vključujejo množice podatke, ki se ne ujemajo s trdim relacijskim modelom. Arhitektura MongoDB je namesto uporabe tabel in vrstic kot v relacijskih bazah podatkov sestavljena iz zbirk in dokumentov. 2.4 React React je JavaScript knjižnica za izdelavo uporabniških vmesnikov. Vzdržuje jo Facebook in skupnost posameznih razvijalcev in podjetij. Vse v React-u so komponente, z gradnjo in združevanjem vseh teh komponent pa se ustvari dinamična spletna aplikacija. Največja prednost uporabe komponent je, da se lahko kadarkoli spremenijo, ne da bi to vplivalo na ostale aplikacije. Ta funkcija je najbolj učinkovita, če se izvaja z večjimi aplikacijami v realnem času, kjer se podatki pogosto spreminjajo. Vsakič, ko so dodani ali posodobljeni katerikoli podatki, ReactJS samodejno posodobi določeno komponento. To prihrani brskalniku nalogo ponovnega nalaganja celotne aplikacije, za odražanje sprememb. Zaradi teh razlogov se nam je React zdel najprimernejša knjižnica za izdelavo administracijske spletne strani, saj se tako podatki pogosteje nabirajo. 2.5 NodeJS Node.Js je odprtokodno JavaScript okolje za izvajanje tega programskega jezika zunaj brskalnika. Node.js je napisal Ryan Dahl leta 2009, približno trinajst let po uvedbi prvega JavaScript okolja na strežniški strani. Prvotna izdaja je podpirala le Linux in Mac OS X. Njegov razvoj in vzdrževanje je vodil Dahl, kasneje pa ga je sponzoriral Joyent. Razvijalcem omogoča uporabo JavaScripta za pisanje ukazov za skriptiranje na strežniku - izvajanje skriptnih strani strežnika za izdelavo dinamične vsebine spletne strani, preden se stran pošlje v spletni brskalnik uporabnika. Node.js lahko na strežniku ustvarja, odpre, bere, piše, briše in zapira datoteke. Lahko tudi zbira podatke obrazcev in dodaja, briše, spreminja podatke v bazi. Uporabili smo NodeJS za dinamiko spletne strani in z njim ustvarili svoj API. 2.6 ExpressJS ExpressJS je orodje za NodeJS kot brezplačna odprtokodna programska oprema pod licenco MIT. Zasnovan je za izdelavo spletnih aplikacij in API-jev. Ustanovil ga je TJ Holowaychuk, njegova prva izdaja po GitHub je bila 22. maja 2010. Express zagotavlja vmesnik za izdelavo spletnih aplikacij. Zagotavlja orodja, ki so potrebna za gradnjo aplikacije. Prilagodljiv je, saj so na voljo številni moduli, ki jih je mogoče neposredno priključiti v Express. 258 OTS 2019 SODOBNE INFORMACIJSKE TEHNOLOGIJE IN STORITVE M. Berdnik, G. Gril, M. Strajnšak: MyPark – Mobilna aplikacija za preverjanje parkirnih mest 2.7 DarkNet DarkNet je odprtokodno ogrodje, ki se uporablja za pripravo modelov ob uporabi strojnega učenja za potrebe problematike računalniškega vida.V zadnjem času pridobiva veliko pozornosti in to z dobrim razlogom. Z globokim učenjem se računalniški model nauči izvajati naloge razlikovanja iz slik, besedil ali zvoka. Modeli učenja lahko dosežejo najboljšo natančnost, ki je včasih boljša kot na človeški ravni. Modeli so usposobljeni z uporabo velikega števila označenih podatkovnih in nevronskih omrežnih arhitektur, ki vsebujejo veliko slojev. Odločili smo se za DarkNet, saj z njim najlažje določimo parametre za parkirna mesta, s katerimi bo računalnik prepoznal ali je mesto prosto/zasedeno. 2.8 OpenCV OpenCV je odprtokodna računalniška vizija in knjižnica programske opreme za strojno učenje. OpenCV je bil zgrajen, da bi zagotovil skupno infrastrukturo za aplikacije računalniškega vida in pospešil uporabo strojnega zaznavanja v komercialnih izdelkih. Knjižnica ima več kot 2500 algoritmov, ki vključujejo obsežen nabor klasičnih in najsodobnejših algoritmov za računalniški vid in strojno učenje. Ti algoritmi se lahko uporabljajo za zaznavanje in prepoznavanje obrazov, identifikacijo objektov, klasifikacijo akcij npr. klasificiranje človeških dejanj iz videoposnetkov, sledenje premikajočim objektom, podobo celotnega prizora, odstranitev rdečih oči s slik posnetih z uporabo bliskavice, itd… Knjižnica se pogosto uporablja v podjetjih, raziskovalnih skupinah in vladnih organih. S pomočjo programskega jezika Python, smo z OpenCV implementirali model nevronske mreže iz ogrodja DarkNet v naš program. Slika 1: Primer uporabe OpenCV [4] https://blog.paperspace.com/how-to-implement-a-yolo-v3-object-detector-from- scratch-in-pytorch-part-5/ 2.9 Docker Docker je orodje zasnovano za lažje ustvarjanje, uvajanje in zagon aplikacij z uporabo virtualizacije in tako imenovanih docker kontejnerjev. Kontejnerji omogočajo razvijalcu, da v končno rešitev zapakira in prilagodi vse elemente, ki jih aplikacija potrebuje za pravilno in neodvisno delovanje, kot so knjižnice, pravilne verzije programske opreme in druge dejavnike, in jih zbere kot en paket. Za razvijalce to pomeni, da se lahko osredotočijo na pisanje kode, ne da bi se morali ukvarjati s sistemom, na katerem se bo program na koncu izvajal. Omogoča jim tudi, da uporabo enega izmed tisočih programov, ki so že izdelani za izvajanje v Docker Hubu, kot del njihove aplikacije. OTS 2019 SODOBNE INFORMACIJSKE TEHNOLOGIJE IN STORITVE 259 M. Berdnik, G. Gril, M. Strajnšak: MyPark – Mobilna aplikacija za preverjanje parkirnih mest Kontejner je standardna enota programske opreme, ki pakira kodo in vse njene odvisnosti, tako da aplikacija teče hitro in tekoče in je prenosljiva iz enega računalnika na drugega kjer imamo nameščeno programsko opremo Docker. Docker image oz. slika kontejnerja je lahek in samostojen, izvršljiv paket programske opreme, ki vključuje vse, kar je potrebno za zagon aplikacije: koda, izvajalno okolje, sistemska orodja, sistemske knjižnice in nastavitve. PREDSTAVITEV APLIKACIJE Pričeli smo z izdelavo API-ja, s katerim bi podatki potovali preko strežnika na podatkovno bazo oziroma na aplikacijo. Izdelali smo ga z zgoraj opisanim okoljem NodeJS, ki uporablja programski jezik JavaScript. V tem so bile kasneje dodane končne točke (end point), za določene CRUD klice iz aplikacije. Da ima takšen API namen se uporablja podatkovna baza MongoDB. Baza služi shranjevanju vseh potrebnih podatkov za brezhibno dinamično delovanje aplikacije. API v podatkovno bazo shranjuje podatke v obliki JSON formata. JSON je odprta standardna oblika zapisa datotek, ki za branje podatkovnih objektov, ki jih sestavljajo pari atributov in vrednosti o nizu, uporablja človeku berljivo besedilo. Slika 2: JSON Parks Slika 4 prikazuje JSON zapis, v njem je prikazan tako imenovan Parks. API kliče podatke iz podatkovne baze in jih prikaže na aplikaciji. Nato smo pričeli izdelovati našo mobilno aplikacijo. Za varnosti in preglednost uporabnikov smo se lotili Login strani (prijava v aplikacijo). Menimo da je takšen Login sistem potreben za pregled statistike (aktivni uporabniki, število vseh uporabnikov) in lažjo administracijo celotne aplikacije. 3.1 Login/Register Da Login sistem deluje je potreben register, s katerim se podatki shranijo v podatkovno bazo. Oblikovali smo štiri potrebna polja za registracijo – uporabniško ime ( username), elektronska pošta ( e-mail), geslo ( password), potrditev gesla ( confirm password) in gumb za registracijo ( register). Ko uporabnik pravilno izpolni vsa polja in pritisne gumb, se podatki preko API-ja shranijo v podatkovno bazo. 260 OTS 2019 SODOBNE INFORMACIJSKE TEHNOLOGIJE IN STORITVE M. Berdnik, G. Gril, M. Strajnšak: MyPark – Mobilna aplikacija za preverjanje parkirnih mest Slika 3: Register Na prvi strani aplikacije (Login) smo ustvarili dva polja in dva gumba - elektronska pošta ( e-mail), geslo ( password) ter gumba login in register. Ob kliku na gumb Login aplikacija preveri če so vpisani podatki že v podatkovni bazi, če so, uporabnika vpiše in mu prikaže prvo stran aplikacije. Če uporabnik vpiše pravilne izbrane podatke v login sistem, se mu prikaže spodnji ekran: Slika 4: Login 3.2 Parks Da pri aplikaciji pridemo do bistva in da uporabnik čimprej najde svoje parkirno mesto, smo se odločili da bodo na prvi strani aplikacije vsa parkirišča ki jih podpira aplikacija MyPark. Podatki se na aplikaciji prikažejo preko API-ja iz podatkovne baze, prikazani so samo najpotrebnejši podatki. Za to smo ustvarili dinamično dodajanje parkirišč, na naši administracijski spletni strani jih je mogoče dodajati, urejati in izbrisati. Prikazani so podatki kot so - regija, mesto, ulica parkirišča in kljukica/križec ki povesta OTS 2019 SODOBNE INFORMACIJSKE TEHNOLOGIJE IN STORITVE 261 M. Berdnik, G. Gril, M. Strajnšak: MyPark – Mobilna aplikacija za preverjanje parkirnih mest uporabniku če ima parkirišče prosta oziroma zasedena parkirna mesta. S klikom na parkirišče nas aplikacija preusmeri na informacije o izbranem parkirišču. Slika 5: Parks 3.3 Dodatne informacije o parkiriščih Stran 'dodatne informacije' uporabniku izpiše vse podatke o parkirišču, ki jih potrebuje. Prikazana je slika parkirišča, ki se vsako minuto posodobi, saj kamera vsako minuto slika parkirišče, ga predela z video analitiko in prvotno sliko shrani v podatkovno bazo in posledično se slika preko API-ja prikaže na aplikaciji. Ostale dodatne informacije so – regija ( region), mesto ( city), ulica ( street), število vseh parkirnih mest ( total spaces), število prostih parkirnih mest ( available spaces) in ID parkirišča. Število prostih parkirnih mest se predela z video analitiko, nato se podatki shranijo v podatkovno bazo in, enako kot pri sliki, preko API-ja prikažejo na aplikaciji. Slika 6: Dodatne informacije o parkirišču 262 OTS 2019 SODOBNE INFORMACIJSKE TEHNOLOGIJE IN STORITVE M. Berdnik, G. Gril, M. Strajnšak: MyPark – Mobilna aplikacija za preverjanje parkirnih mest 3.4 Zemljevid Zemljevid je namenjen da uporabniku olajšamo oziroma izboljšamo vpogled na lokacijo izbranih parkirnih mest. Uporabili smo Googlov API in tako na aplikaciji prikazali njihove zemljevide in na njej so s puščicami označena naša izbrana parkirna mesta. Ob kliku na puščico se prikaže število vseh in število prostih parkirnih mest (primer 7/15). S klikom na parkirno mesto aplikacija uporabnika usmeri na stran o dodatnih informacijah. 3.5 Račun Stran račun smo ustvarili za lažjo preglednost in administracijo za uporabnike. Predvsem je namenjena temu, da si uporabniki po želji spremenijo svoje uporabniško ime ( username), elektronsko pošto ( e-mail) in geslo ( password). Navedene podatke si lahko na strani tudi ogledajo. SPLETNA STRAN ZA ADMINISTRACIJO Kot že rečeno, je stran namenjena administraciji celotne aplikacije in predvsem razvijalcem oziroma vzdrževalcem. Celotna spletna stran je narejena z MERN stack (MongoDB, Express, React in NodeJS). Vsebuje nadzorno ploščo, administracijo parkirišč in uporabnikov, celoten zemljevid in urejanje lastnega računa. 4.1 Nadzorna plošča Nadzorna plošča oziroma Dashboard prikazuje potrebne podatke in statistiko o aplikaciji. Del statistike je dinamičen grafikon ki prikazuje število vseh API klicev, ki jih opravi aplikacija. Druga grafikona prikazujeta število vseh uporabnikov v vseh mesecih in število vseh parkirišč ter kje se nahajajo (mesto). Slika 7: Nadzorna plošča 4.2 Parkirišča Ker celotna aplikacija temelji na parkiriščih, jih je potrebno tudi dodati in imeti nadzor nad podatki. Prva stran je identična tisti v aplikaciji, torej prikazani so podatki kot so - regija, mesto, ulica parkirišča in kljukica/križec ki povesta uporabniku če ima parkirišče prosta oziroma zasedena parkirna mesta. Desno zgoraj smo ustvarili gumb »dodaj parkirišče« ( add park), stran omogoča administratorju dodajanje vseh potrebnih informacij o OTS 2019 SODOBNE INFORMACIJSKE TEHNOLOGIJE IN STORITVE 263 M. Berdnik, G. Gril, M. Strajnšak: MyPark – Mobilna aplikacija za preverjanje parkirnih mest določenem parkirišču: Regijo ( Region), mesto ( city), ulico ( street), zemljepisno dolžino ( longitude), širino ( latitude) in število vseh parkirnih mest. V desnem zgornjem kotu se nahaja iskalna vrstica. Če v njo vnesemo pravilno mesto in ulico, nam pokaže željeno parkirišče. Slika 8: Dodajanje parkirišč 4.3 Uporabniki Za administracijo uporabniških računov smo na strani dodali stran Users, ki je namenjena predvsem dodajanju oziroma spreminjanju računov. Na začetni strani so izpisani vsi uporabniki aplikacije, zraven njihovih uporabniških imen, elektronske pošte, skupine in datum ustvarjenega računa, pa je gumb za urejanje. Na strani se nahaja gumb add users, služi za dodajanje uporabniških računov. Add users je namenjen predvsem za dodajanje administracijskih računov, saj ima aplikacija svoj registracijski sistem. Slika 9: Dodajanje uporabnika 264 OTS 2019 SODOBNE INFORMACIJSKE TEHNOLOGIJE IN STORITVE M. Berdnik, G. Gril, M. Strajnšak: MyPark – Mobilna aplikacija za preverjanje parkirnih mest PYTHON - VIDEO ANALITIKA Celotna aplikacija temelji na video analitiki, zato smo morali izdelati svojo delujočo video analitiko parkirišča. Polja smo določili tako, da kamera prepozna če je parkirno mesto zasedeno oziroma prosto. Rdeča pika nam pove da je parkirno mesto zasedeno, v nasprotnem primeru polje ostane prazno. Kamera vsako minuto zajame sliko parkirišča, jo z našo analitiko predela in posledično se podatki o predelani sliki preko strežnika prikažejo na aplikaciji. Slika 10: Parkirišče pred video analitiko [9] Slika 11: Parkirišče po video analitiki OTS 2019 SODOBNE INFORMACIJSKE TEHNOLOGIJE IN STORITVE 265 M. Berdnik, G. Gril, M. Strajnšak: MyPark – Mobilna aplikacija za preverjanje parkirnih mest ZAKLJUČEK Začetna ideja celotnega projekta je bila izdelati mobilno aplikacijo z uvedbo nam precej neznane tehnologije Flutter. Tekom izdelave aplikacije smo se spoznavali s programskim jezikom Dart. Za izvedbo izbrane ideje smo uporabili prav tako precej neznano področje video analitike, ki temelji na principu klasifikacij slik in detekciji objektov. Prva izdaja tehnologije Flutter leta 2017 je bila narejena striktno za izdelovanje mobilnih aplikacij. V zadnjem času pa napreduje in se izpopolnjuje, da bo lahko v prihodnosti uporabljena tudi za izdelovanje spletnih strani. Ob začetku izdelovanja arhitekture dela nismo bili prepričani, če bomo zmožni celotno aplikacijo uresničiti z vsemi tehnologijami, ki smo si jih izbrali. V poteku izdelave mobilne aplikacije smo se začeli zavedati, da bo projekt uspešen. Ustvarili smo celotno aplikacijo z novejšim ogrodjem, uporabili celotno tehnologijo MERN stack in uspešno uvedli eno izmed obetavnejših panog računalništva, video analitiko, in verjamemo, da bo s pomočjo nje človeštvo v prihodnosti pridobilo še veliko koristi. Globoko učenje se že dandanes uporablja v medicini in drugih strokovnih področjih. Razvili smo aplikacijo MyPark, ki pomaga uporabnikom pri iskanju prostih parkirnih mest ter omogoča vpogled v osnovne potrebne podatke o njih. Razvijalcem smo s pomočjo MERN stack ustvarili spletno stran z nadzorno ploščo in celotno administracijo nad aplikacijo. V prihodnosti bi v aplikaciji izboljšali video analitiko za natančno detekcijo objektov, videz aplikacije in dodali še več naprednejših uporabniških funkcij (npr. vodenje od vhoda na parkirni prostor do prvega prostega parkirnega mesta). Menimo, da je naša ideja zelo praktičnega pomena in bi jo bilo mogoče implementirati v resničnem svetu. LITERATURA [1] http://lvelho.impa.br/ip08/reading/rt-ocv.pdf, Real-Time Computer Vision with OpenCV, 10.5.2019 [2] https://medium.com/javascript-in-plain-english/full-stack-mongodb-react-node-js-express-js-in-one- simple-app-6cc8ed6de274, Flutter Layout Cheat Sheet, 10.5.2019 [3] https://medium.com/javascript-in-plain-english/full-stack-mongodb-react-node-js-express-js-in-one- simple-app-6cc8ed6de274, Build a full stack MongoDB, React, Node and Express (MERN) app, 10.5.2019 [4] https://blog.paperspace.com/how-to-implement-a-yolo-v3-object-detector-from-scratch-in-pytorch-part- 5/, Primer OpenCV slike, 10.5.2019 [5] https://cdn-images-1.medium.com/max/800/1*gqBLqChWtWLq33DvWm6Nog.png, Flutter logotip, 10.5.2019 [6] http://www.jsweet.org/wp-content/uploads/2016/04/react-logo-300x289.png, React logotip, 10.5.2019 [7] https://medium.com/@habibridho/docker-as-deployment-tools-5a6de294a5ff, How to Deploy App Using Docker, 10.5.2019 [8] https://link.springer.com/article/10.1007/s10278-017-9965-6, Toolkits and Libraries for Deep Learning, 10.5.2019 [9] https://www.google.com/maps/@46.3920561,15.5759222,3a,75y,214.13h,74.93t/data=!3m6!1e1!3m4! 1szPQxRg98n-clm-oCBAce3Q!2e0!7i13312!8i6656, Google maps. JAVA SWIFT C# NI LE OTOK NI LE AVTO NI SAMO TON eNag eN rada 2019 agrada 2 2019 About Us Point. Click. Blockchain. ARK empowers everyone, regardless of their aim or technical background, to quickly and easily leverage blockchain technology. ARK acts as a beacon for developers, enterprises, and communities who wish to apply blockchain technology as a foundation for their own projects, applications and businesses. Our open source code, extensive API’s and powerful frameworks empower developers to create and deploy customized blockchains in minutes. Simplicity Security Speed Scalability Sovereignty Our open source The modified Eight second block By using ARK provides the tools, frameworks Delegated- times on the ARK bridgechains to scale technology to create and products are Proof-of-Stake Public Network the ARK network, completely custom easy to understand (DPoS) consensus coupled with the newly created blockchains with and utilize by both mechanism utilized offloading of non- chains are able to bespoke governance developers and users by ARK features essential transactions communicate with the and settings meaning within an ecosystem 51 delegates that to a network of ARK Public Network that your network that reduces barriers maintain healthy bridgechains means and interoperate with operates to your own and learning curves network governance the mainnet is blazing non-ARK blockchain requirements and decentralization fast and bloat-free networks Tools & Resources Developer Community Enterprise Support With ARK you’ll get all the tools We empower our community of ARK blockchain technology and and resources you need to build. developers to collaborate and improve business services such as the Powered Our open source code, exhaustive the ARK platform through bounties and by ARK Program enable startups, documentation, easy to use products the ARK Improvement Proposal (AIP) enterprises and public institutions across and SDK’s provide you with everything initiative. Developers are also able to many industries to unlock the true value you need to create your own custom submit a proposal to the ARK Community of decentralized technology blockchain and project Fund (ACF) for project support Learn more at: ark.io ARK Deployer Create a Blockchain in Minutes ARK Deployer is a free and easy-to-use blockchain creation tool that enables you to build, customize and deploy your own blockchain. In just a few minutes, you’ll have your own scalable, efficient and decentralized blockchain network based on ARK’s core code, but completely customized to your project and business requirements Step 1 Step 2 Step 3 Prepare Customize Deploy There are a few things you’ll need to Create and customize your blockchain After customization, it’s now time to know before you get started - just follow settings and options to your unique deploy your blockchain with your genesis our Deployer preparation guide requirements node - just follow our Deployer launch guide Key Features Level Selection Help & Assistance ARK Deployer caters to developers of all skill levels allowing If you are unsure of any customization variable or parameter, you to choose the level that best represents your needs - use the help buttons for further information or select the providing a completely tailored experience ‘use default’ to automatically assign a default value Complete Customization Advanced Option Selection ARK Deployer allows developers to create a blockchain Customization options include: forging delegate count, in minutes that is completely unique to their project and block times, token count, chain prefixes, rewards, fee business requirements structures, network architecture and seed node setup among others Learn more at: ark.io/deployer SAP Analytics Cloud Managerska poročila prihodnosti! Zakaj ne bi že ukrepali, medtem ko konkurenti še čakajo na informacije? SAP Analytics Cloud prinaša moderno in dostopno rešitev za poslovno odločanje, ki jo odlikujeta hitra uvedba in preprosta uporaba. Odlična izbira za vse uporabnike SAP rešitev – na telefonu, tablici ali računalniku. VEDNO NA POPOLNA PRILAGOJENE UKVARJATE TEKOČEM SLIKA INFORMACIJE SE SAMO ŠE S POSLOM POSLOVANJA ZA VSE RAVNI Z VSEBINO ODLOČANJA Uporabniki SAP Analytics Clouda so predvsem iz vrst vrhnjega managementa in uprav. Cenijo izjemno uporabniško izkušnjo, ki v podjetje prinaša tudi uspešnejše managiranje vseh procesov. Managerska poročila, dashboardi, prikazi KPIjev … omogočajo sprotni pregled nad poslovanjem in zato boljše odločanje. Uvedba orodja je hitra, ko so podatki pripravljeni, jih naprej lahko oblikujejo kar sami. Igor Kavčič, vodja prodaje SAP rešitev Easy to work with We have a positive can-do attitude, readily adapting to needs and circumstances – working with people, not just for them. www.bearingpoint.com Integracija poslovnih aplikacij, podatkov tkov in informacij Pomagamo vam pri integraciji aplikacij, podatkov in ov in informacij z namenom avtomatizacije procesov in in izboljšanja zadovoljstva strank. Imamo bogate reference pri razvoju integracijskih rešitev tako s s platformami proizvajalca TIBCO, kot z ogrodji temeljeimi na odprtokodni Java arhitekturi. Upravljanje z družbenimi omrežji in CRM CRM integracija Družbena omrežja so eden izmed najhitreje rasto o ih kanalov, ki jih stranke uporabljajo za komunikacijo z o z znamkami. Z našo rešitvijo lahko poenostavite Osrednji nabiralnik, ki izboljšuje storitve za stranke in upravljanje z vašimi družbenimi omrežji, lažje poenostavi upravljanje družbenih medijev sodelujete z vašo marketinško agencijo in se z njo o integrirate z vašim CRM-jem. Uporabniški portali in portalne rešitve za ve za vaše stranke Vaši uporabniki zdaj uporabljajo razline digitalne e kanale in od vas priakujejo štiriindvajseturno dosegljivost za interakcijo, sedem dni v tednu. Da bi a bi izboljšali storitve za vaše stranke in integrirali marketinške iniciative, vam pomagamo implementirati ntirati spletne in mobilne rešitve. Kontakt: Glavna pisarna: Pisarna v Ljubljani: info@bintegra.com Železnikova 4 Stegne 23A +386 (0) 2 620 4861 /2 2000 Maribor 1000 Ljubljana +386 (0) 2 620 4863 Slovenia Slovenia An international company with 200+ software engineers that work on innovative projects within the gaming industry. Hiring › web developer › mobile developer › front-end developer › business analyst › software architect › test automation engineer › tester › BI developer › system engineer › C++ developer › DB developer › .NET developer fering Of Excellent working An international Opportunities for Expand your conditions and working professional and social circle relaxed atmosphere environment personal development Apply now: comtradegaming.com %NQWFDCUGF'42U[UVGO www.e-racuni.com HQT%GPVTCN'WTQRG www.eurofaktura.com Powered by Smalltalk objects since 2002. EQWPVTKGU WUGTU '4#ȷ70+FQQ 6KVQXCEGUVC /CTKDQT CARE .BETTER.W Okolje, kjer je WW varnost pacientov na prvem mestu. .expertise .innovation .partnership • razvoj celostnih informacijskih sistemov za zavarovalnice in njihove agente • rešitve v oblanih storitvah v mikrostoritveni arhitekturi z uporabo vsebnikov Docker • digitalizacija procesov • razvoj mobilnih aplikacij • agilen razvoj • ve kot 20 let zanesljiv in inovativen partner Kontakt: msg life odateam d.o.o. Titova cesta 8 SI-2000 Maribor Tel: + 386 2/ 2356 229 www.msg-life.si E-Mail: Andrej.Kline@msg-life.com Find your perfect place to work! #WEARE CashbackWorld CashbackSolutions GreenfinityFoundation ChildandFamilyFoundation myworld-solutions.com www.novum-online.si ENTERPRISE JAVA APPLICATION DEVELOPMENT AGILE SOFTWARE DEVELOPMENT INTERNATIONAL PROJECTS IT SOLUTIONS CLOUD SERVICES FOR FOR INSURERS INSURANCE BUSINESS Illnau Köln Maribor Nürnberg Salzburg Wien POSEBNA PONUDBA! PAKET PROGRAMOV ­#PmauP§P��uF�kP ��uku!P_0Ò'�_ �u'_0§_PM MAYO CLINIC A MA M YO CLINIC A NIC YO CLI 12 HABITS 12 HABITS WHEEL OF LIFE F LIF WHEEL O E RESILIENT MIND ILIENT MIND DIET DIET 24alifeTMMHFHORVWQDUHģLWHYNLVSRPRÏMR]QDQVWYHQRSRGSUWLKSURJUDPRY NOLQLNH0D\RYRGLGREROM]GUDYHJDQDÏLQDŀLYOMHQMDLQEROMģHJDSRÏXWMD Ζ]EROMģDMWH]DGRYROMVWYRLQSURGXNWLYQRVW]DSRVOHQLK]HQRVWDYQLPLSURJUDPL SURPRFLMH]GUDYMDSULGHOXXVPHUMHQLPLY]GUDYŀLYOMHQMVNLVORJLQREÏXWHN ]DGRYROMVWYDQDGHORYQHPPHVWX ÒmPÔ_§0ÒÒ'�_0k�u0Òm0�§�u a0Pm ÒP _§0��u'­a§Pmu�§ȷ Za vse informacije smo vam na voljo na DOLQD0RQLND=HOH]QLN#DOLIHFRP www.24alife.com GROW Your Bussines withbINNOVATION ACCELERATE TIME-TO-MARKET M O Monetize Anything-as-a-Service N ET Tridens Monetization is an I innovative, real-time, Z convergent charging, and A monetization platform for any T industry, any business model, IO and any revenue stream in N today’s digital economy. CHA Electric Vehicle Charging R G E Tridens Charge & Drive is & an all-in-one software solution for Charge Point D Operators (CPO) and e- R Mobility Service Providers I (EMP). V E D R Pay-As-You-Drive Insurance I V E Tridens Drive & Pay is a pay-as- you-go software solution for & insurance companies. Enabling them to charge their customers P for subscription and usage-based A consumption services. Y Tridens d.o.o. www.tridenstechnology.com Contact Us Zagrebška cesta 22 +386 31 627 462b 2000 Maribor +386 59 010 975bb Slovenia info@tridenstechnology.com RAČUNALNIŠKE NOVICE udeležencem konference OTS2019 ponujajo POSEBNO PONUDBO! 12 številk revije Računalniške novice plačate samo stroške pošiljanja 9,70 € za vseh 12 številk, brez vezave. NOVICE » VAR V NE BATERIJE premagati to oviro, verjamemo » Bo vo Bo v da rešila tež , da bod t o e t ri e je z ba lahk - a pr ave evzele mesto klasičnih liti skih, k j-ion NOVICE z eksplo s zivn i s - imi e v zadnjem času niso izkazale z od a st s o t t o n - bater o varne. bate ijami? GOOGLE BACKUP AND S W YNC IFI4EU ljo 15 gigabajtov prostora za v Liti arn j Liti - os j ion - Namiz tn s o s k s e k b h n r e a j a t e p n e j r ev ije n oda a , k a aplikaci - i se nahaj tkov a . V z jo v r am a e z n l ja ičnih p o za pl t ačilo 1 r t ošni r šk ošni o ,8 ev ih e ih - ra lek E se na m tro v n c up e sk ropa bo dobila hit orabn - ih napr Google Dr av ik pridobi 1 ah, niso p 00 gi v g a va o rne iv a r ba n vs e z em za e bo k jto a v p r obl o e tr pr a ošnik m o č s n t e o g e ra a . Ž alu , e večk za ra e t s n t e je namr in brez erabajt prost k o a ka e ra zza č a p pa lo lo, d plačne postala neupor , da se t o- bo p G o a o tr e o e b g b lu m no ate rije lahk gigab e o pr sečn e a o pr g jt r a abna e . je P imak jo i oleg te niti devet ev m n ga naj b ejo e v , v naj na- i rov s b . labšem prim s internet ilo do le vs ta em dr 2 eru p 025 a lahk ne točk o c ža e v lo ek dir e ljanom E dir v a s r jo. M plo- opsk e e edt uni d em k je na vo Goog H o le je pr so AN na z mobi ljo hitr e GZ a d H č k O etku let ln o o om ratkim običa U a 201 režje 5 jnim va 6 z G. Bol in le g p i or n e j v o e - ši dos an u s p lo k j orabn v ks e p m ni s lod top do s na m p ira še le a pr K v ga s et pli ik edv o s ov kaci om p s m p ne j e o z e o m let - ze nu ba unaj p lo z dil v pr te a ri a d j naj bi pr o e o v enos pr pa opravki in oljni in p o m mobi me h, p es so ri gra o r to m b t o el š e ž i n gos s l s z b n l ih t e j k e o ih i t ev e B or o s t t iln e ac o te Kita l k d e e e u - f p o lefon lo r n o o zi e v tiv jska bo sodne , dk tablic o p s o ali pr m, k n a o e e učin e n ,« nam je p s d e S y v n na g - d c, r k u i g en je i o o n p os s ve a o p dal Jak v l nim r o o ačunalnik darstv a oljo tak 2 20 v o vo O o 0 ic i z 16 1 i n dj m a 6 u z le n a HO an, p a ta a ke o čče om ž i o r e z a l o e p b l t b e n e e e ra r i a - ž p ž P a e I v minut o v N Sloveni e n a š e ln e k Z i c z a a s ijsk a h z j a i iz s l t ih a e ja sis s ve m t . U n db . t i s e k p m e a e čn eh HO ov spore reše le em W kt o vs r i o o z iska eh načr PIN TAX ndows kot gar nsk njem br t cije lahko p I ap e ih o lik M t,t c v v z k i a om ac i - - jih up ezplačnih t astav O o S g . T j o o ih u vala or lj č ab enih r rip ljajo ž Wi-Fi o za čk d ne ok išem a sa e dv ih b o o m vs ode e s om o dlični up jn t o ar s o v os to a tn p d no o rn e s o intern potreb rabniški i ostno kopir TTe k e n e upin t i in ze z ž a h k a ža . v u n v Z l šnji j a a v e a e k e p pr p . to lik o s ov t o i k so o z da ri kla prek in las ra a er s t- ičnih liti z s l t ič ituci ne i sebnih p n tabilnemu d inhr j j n -ion e E - o a dr lo oniz terneta s ugi s žb k e i l h b , ova acijo m a v nju ap t r e o r ps ij e a d lo h je t ke unije ( trani pa b likacije, k kalnimi map na, k ek Ev o Ev rab i up i o p či rops ro niku in vo o r - ps - ep k k tis ami in r i p a ep e uni rečuje p a E rl č v am ja o timi, ki s r z en rops en laj sl š nik o os elek k t i , s a ov la p anj o u omo shran tr e - g jeni v ob ičn vet in E oč e a en na , da s lak er vr t e gi opska k elekomunik kar najhi u. Prog el je m o ra ek mi najdet t m ektr s reje sk o tr e ij a G o dama d a) že pr cijske a in o o or o o g d le je . m T e t B . a d r t na čas gu d e p ko jav o ile m te el a čina p z la r r u a v z e n d jata na ž ckup an o e da - v e d S z a len r če oč te o y a lo n s k p k c d e v a gr rojekta čne o cijo. ejansko na Trajanje s b W laj a ba ev t š e t an iF a r ve d o i i je m rije je me 4EU, k . Ko Edina p a o p m lika e dnih p e nčni cil šč d p ate o cij a i Goog o d o re man st ln m g o jen e a n je p n j vs jk p- j l em, v prim a- os uk eh t rep e o h jivost je ob le Drive er ta čas in u nap vitev brezpl v pa je seve no poman Google Ph kov s dela del ake a v iz ačnih br da e voz jk n a otos e o v ikov n Ba d i d p vi pa l - in je st c s a e s a bili vs k lahk zžičnih dos tven up, ki odišča do o c in z , z ahk e ar lo p pnih t t o o mo adi č aj do o č - git g v l a ji e z v s l r lni tr d a s o r p e či p k. T i- rihaja d j zelo up ož a a pr r in v naj ojekt se b g Evropsk o nereali orabni reši sodiš ča m šem pr šem pri slab o dej e unije z nar zir o anih tvi za en očn im m - ans čil. »P no os o r er ko a s va t r a eru ek ude pod ov n v os - azlik u s uje p prak ja b pr lo n uj ašev , z si i , s l a i v tn jo b a sp nj o e go an o k a je je r opir te dars - rije j je pr an . K es z je p o t e t k og va lo velik oda a r in r ž am rav azvoja t o in v tkov v ob pogos lahk lahko k e, p no pr težk č lak to p o k a bi e ehn o ugo asih K . a vel m d k o alu dobili pr ratkim p alu do še E o l j v tr ogije. dimo er so običa a, da s postop o ti e ro dil vs ce ps em, k j j n v i i k a n i z rn i p e e bi s o lo p j k še b i pa e ž slov o a r e n čas t lam i e leli p u r p i n je z ent. eljati z nami, orabni i, najve b k i i č b ln i a pr jo šk e nap mo- zato še ve o or gra o m od ra dje z s o pr r ve ko a , s dn a pa utr i t ve, a e j s o i m o r W šč s a e a z iFi4E H m mo iskov U je 1 o no de pijo ošk alci nap 20 mili OPIN TAX ve vozn jno varnos odov ove jonov ev I ike,« je š tno kopi anci. V k jim je u jiim j dali, da rov » Om e d a o n dal ranje p itajs e s . k p usp t kov t o e e e d m m lo iz žak« er s at- e dela pr lo iz na ojek Han e g s z t ti hr njeg t inhr h u anilnik elek , o vi o onizacijo m ou, ki se tr s e nahaja na v ičn no d lo e v en i pa b kalnimi map k o ki z ki za er do zh a o elek e gi l je ek , v na Vsak z s ami in ti du K tr s i t o le ta l a ro it up dn li letih v vs jih čete timi, ki s - v j e ske rja , p t u or š k je t ab tir A o me a j l i j e a k h p ža sh a likaci k in obs r r vo anjeni v ob o, d do. eh ve a b čjih mestih članic E ja Hopin T toječi dispe odo s h č laku Back porni p P erji pr up and S o o s P Pole topk eg t oda HO i e - i teg o ga v a so a sprejeli z o y d s ro nc, c s o ps r xi v e le r P j hitr j a p k I pr z o e N i uni s - e k a ni e - ov stav j ili hitr e s d a o l pr c bili ves i j p timi r ši r . S ip o r o a e k di v li. V ami, s šč i e br li e š s , e e t k p zžične dos el enem letu po op na tr o pri G i se ukv e o leli pr g s o a l rj e lek se o a s s k o g t b t ž lu s r n opn o e epr e p d de - od p ori, p e e lo r , k to čit ejeli , i ki j čk nimi z in o jim do br e ečiti s pr ev ve m v , k z o i a d b - a o , da s n ez - ep e v m z ove e z te o ročila n r r d eb n e pl jo s et d ač ijo nami o o o m ž no n delov i in e veg a voljo vse anja n zne ap lektro tte a lik n e em k . vo jih sk m M zn ov acije G im p k e o d m ikov s HO ih n - u Drive o o o p o sl ov , g ov va ora s l a e a b j t je namr anj a P b bat r n e e os i m, r k ij t dos o a m. digitalno re P a n IN de i - d om ja e o n č vz . N sk naj e o t t e ni ve n op do s k av a d i z o p lo a č p , da b p a o r vetov nj v je sept trebna o so n e ne e e, o . P dn j g ce embr e sa luci r , r g s e a og e s a v s m a- p lo po a m ra o m b por o leta n ovžige jo e r ž lahk o ige in ek s a k j bi bi trgal plak - o na os va a lo k zreše ar z up - sp upaj om l a lo te n zi ebnih r je o , je tr o vega p a or enutna t gočen v 600 ve le med tak onudnika iz Slov čunalnikih up abo svetovn le v n v n eža čjih m orab ega s j v ške. Ko a e eni a p - do 1 ljali le še p n letna in s i živl estih v E življe jen s a 2. mar n i pre s js o dobne k k ski uni v v o i dobi rop ji in s - v ideli ca pr - , s , d o a o a ih m j jo l zi so u od n uni a i k h c p je a k e o g c o p r najkasn rabniki a dobr p a leta, m ijske tehn n na o e l e olo a no je do let ik dt p a em k g o po vno c i l o s i j ln jo e, ni k im p podp o a o a b r p o le 20 or o a z da b omen l 7 2 dos 0 rejel 0 . Hitr e 7 -k i, so v o c i, ra topn e a t, n obi Sr ečji d j ukin elo ča e t ed is jena ž tn j p n o i a o s o čk v eč ba e b gus erji z e 11 ojen t t . de e odo na vo a lansk ačeli p cembr je po o ok ri o in na o te k j let n o ol o u a let ka l pa i 5 ljo na š o je pr dgr jati Z o lo v živo pr i 0 5 a s 0 ra . 0-k t ev kr ev a rat o a . Č ilnih j ze pr jev di t. e a t splet nih k ek Č b nih m a ek ti s eg o e v m o s v a v z s - oje ap a n obiln v m an oje p am s lik r t tih, k i venik o e ap acije. T poroč er ozir o t s a oma pr m u o k lika ako je ap mo, d s n ci p jižnic je z a s et elo za lik i č oč e, bolnišnic ače nar aci im p nega v pr e, p l p o ja čan ne re ometne p arki, onujati slov je dan s j e p te re in nam - ide Ker s a. ost ašk aj e e e i PIN T i HO s m b n es p e tit odo s o AX - d t dobn I aksi p e nami odni s i j in m a o z vn nudnik no ap p i k e or r d l i, p a lik j jubljan nujna in t i skor acijo G ovez s i. E aj a k s ni s s i p vr kimi p Back oo a o up and S g rlam p- o o je napr le trgo pletn en nudnik vin o t je o prevo i t e d d y o p ak ek nc, k , o o zov p si , k d b i sle u i s je br dnik e je v Ljub e j rešev ov pr ovz zplačn ali pr ojek ročil pravo digit ljani z zara g di prih od o na voljo z ek splet 4E ta il nos na s a a, s U z WiFi a pre odnik a - l - h n t o r jam i ver ev e od al še vo e luci a HO pletni p ejo, da jim b - , da br nem jo. V PIN-a. ove ez l z p et a o l v u ačnih dos u si je aplikacijo K i https://www spešno uspelo z t n c .go o t a ljub t č opnih s om o m k n vo e / gle an e j mu da s driv . ce j b e p š lo o a o a ti ali m m o e e g t fo n o / o ne n e up do č t d e e o wn pr u le r p a - ab load av o nik iti s ra / b i z ap . U o it lo dn i p z ži orabn a lo v lik e z zb a a i e cijo in up r i os a č k k n ot 50.0 rabniš o i oblač t n tanke. S nih p je ose 00 u ko - v e s e G tori odne obr o b p da - orabn iz oo - tk k nave s a ov up iko v v ili s , opra ušnjo z gle D v e - or elo z rive imajo s abnik o ve - adovo bodo o namr v ali z č k ljni, p eveda br a o e k t 6 a č r o 5 pr a m .000 us i HO -u že P pripr IN ezplačno zpisoval og erc pešnih pr - na vo e hitr la ia š ln eva o - udele eje n evo a , s je v . l ž a zov in tr nutno je v s e- jajo nadgr enc j istemu na vo adnje aplikacije e , k m fizičn šle pr i bodo o ne bo treb E lj a do s v o ve rops č k e k d Po o a o vs le di uni t 50 em v s g t šča ja s vo e . ga s e ki z b s n o ik m o up ov eri še ve so or , e čas bo n do pr o lo abnik čjeg tila še pr om na vo a infor n m jih ir ov an ecej zmanjšali s z l ih up ja a ojek jo 2 p o o 4 dni s ve ta ur na dan čan or ki, ka tr r p o je š abnik š- iro K . l ko o o p v m a . » s jub t Ž e o elim ni, da s vne e g mu da s o a dos , da ima naš up i bodo t top o a do s bili ta rabnik v r o ožbo lahk t k o s - v is n ti v naš o pr e v g e a - tu ivoščili s o p k l a e i pr h vs ta di man z s es a ke t e infor g o o p lnici s j p m p o tični r d aci em inj j s e o m ož t d v ni oško a o . T n o a o žn n v a e os d j o b blike n vo tih pr zov, da s e ovanc t i. P a i a - 2 d ro r 0 o č ve s 25 im le- anja, s e prek odb ela na vo e je k h a i z t a ro lahko sa o s e p lj lo i m najb let o vs , da je Ljub z- a b aj 1 o odo s 0 lje o 0-m d o e lo dnik gabitn ljana po či, k p a o k to o v b i v kita ve treb a o l,« je r jsk z o p e a ov m m vo o ala d , m - Hangzhou ra e o o s go br az tu č o digit l e o p žil Jak a jih b no reš a it l e - a O zpi o m na an, k sa dgr v, k i li km a i s še do diti do en o jo upor s daj o z napr a, da alu. Če bo e a do pri g b a niki taksi prevo n bili v HO zov do le es - edkom in r ne uč le že- PIN TA a in X s k I t ap jo s e, b lik v o a oje s do p ciji. » t o U or dobn p it o ve z rabnik do e v lo z a so i s d o oljn a išča z z delo i - a za go - in se veselijo jese živela še v dr tov n o i i n konca le ugih k imajo t ta, k itajs a o k k im m sisti najve estih, v dal č dela časo j . šem vnem obdobju pa jih bomo mord u a lahk gleda o li tudi drugod po svetu. Upajmo pr , d i nas, s a tudi aj se sodni spori rešujejo zelo počasi. Kadrovske storitve d.o.o Pisarna Maribor: Beloruska ulica 7 Pisarna Ljubljana: Koprska ulica 98 LT1303 03 13 T1303 KADROVSKI MINIMUM T: 080 22 29 Kadrovski minimum vas ne obvaruje pred vsemi sankcijami LQģSHNWRUDWD]DGHORLQSRVWRSNLQDGHORYQHPVRGLģÏX » 8 Ra R čunalnišk ačunalniš e k novice september 2017 www.racunalniske-novice.com Računalniške novice 9 « 12 številk brezplačno Posebna ponudba velja samo do 31. 8. 2019! Naročite lahko na: maja@stromboli.si 01 620 88 00 kjer navedete geslo OTS. Spletne zgodbe, ki so mi blizu! Spremljajte nas na com μ Časnik Večer, Ulica slovenske osamosvojitve 2, 2000 Maribor .avtomatika.com www S5TEHNIKA.NET d.o.o. Uredništvo: Uredništvo: Sostrska cesta 43C Glavni urednik: 040 423 303 info@avtomatika.com 1261 Ljubljana Dobrunje Odg. urednik: 040 423 302 www.avtomatika.com GENERALNI POKROVITELJ POKROVITELJI MEDIJSKI POKROVITELJI INŠTITUT ZA INFORMATIKO