diff --git a/Latex/BP_Radek_Pus_2019.pdf b/Latex/BP_Radek_Pus_2019.pdf index 7cd85c5220e6074daa70ae5c7fb6884b49e3bf67..bc3c9e252c1e5651f07c391e5ebde5d177d4b0cf 100644 Binary files a/Latex/BP_Radek_Pus_2019.pdf and b/Latex/BP_Radek_Pus_2019.pdf differ diff --git a/Latex/BP_Radek_Pus_2019.tex b/Latex/BP_Radek_Pus_2019.tex index ef048645ad94ad3874ee816669d6e7a23c93cc3c..4e52bd1607f105267e280f7aee9754fdaabe9ab3 100644 --- a/Latex/BP_Radek_Pus_2019.tex +++ b/Latex/BP_Radek_Pus_2019.tex @@ -43,8 +43,8 @@ {V BakalářskĂ© práci byl Ĺ™ešen problĂ©m pĹ™edpovĂdánĂ budoucĂch transakcĂ klientovi, na základÄ› jeho uplynulĂ© finanÄŤnĂ historie. CĂlem práce je pokusit se implementovat toto pĹ™edvĂdánĂ pomocĂ umÄ›lĂ© inteligence spolu s vytvoĹ™enĂm webovĂ©ho rozhranĂ. Toho bylo dosaĹľeno pomocĂ Angularu JS, tvoĹ™ĂcĂ klienskou aplikaci, frameworkem .NET Core, kterĂ˝ tuto aplikaci obsluhuje ve spojenĂ s databázĂ Microsoft SQL. ZabezpeÄŤenĂ vyuĹľĂvá JWT tokenu a o šifrovánĂ uĹľivatelskĂ˝ch hesel se stará RFC~2898/SHA512. UmÄ›lá inteligence byla Ĺ™ešena jako lineárnĂ regrese. %============= % <= mÄ›lo by obsahovat mojĂ vlastnĂ implementaci problĂ©mu -\newline UmÄ›lou inteligenci jsem implementoval jako nÄ›kolik po sobÄ› jdoucĂch vrstev, jejichĹľ poÄŤet neuronu se postupnÄ› sniĹľuje na jeden jedinĂ˝, kterĂ˝ mi dává informaci, zdali se bude transakce opakovat, ÄŤi nikoli. Abych poslĂ©ze mohl vyhodnotit, zda se transakce opravdu opakovala, porovnával jsem velikosti transakcĂ po jednotlivĂ˝ch tĂ˝dnech a ty částkou si nejvĂce podobnĂ© jsem oznaÄŤil za opakujĂcĂ se. -\newline Tento zpĹŻsob pĹ™edvĂdánĂ jsem dále doplnil o odfiltrovánĂ trvalĂ˝ch transakcĂ, jeĹľ se uĹľ ze svĂ© podstaty vĹľdy opakujĂ. +\newline UmÄ›lá inteligence je implementována jako nÄ›kolik po sobÄ› jdoucĂch vrstev, jejichĹľ poÄŤet neuronĹŻ se postupnÄ› sniĹľuje na jeden jedinĂ˝, kterĂ˝ dává informaci, zdali se bude transakce opakovat, ÄŤi nikoli. Aby se poslĂ©ze mohlo vyhodnotit, zda se transakce opravdu opakovala, porovnávala se velikosti transakcĂ po jednotlivĂ˝ch tĂ˝dnech a ty částkou si nejvĂce podobnĂ© byly oznaÄŤeny za opakujĂcĂ se. +\newline Tento zpĹŻsob pĹ™edvĂdánĂ je dále doplnÄ›n o odfiltrovánĂ trvalĂ˝ch transakcĂ, jeĹľ se uĹľ ze svĂ© podstaty vĹľdy opakujĂ. } %============= \abstractEN{ @@ -92,12 +92,14 @@ Jak uĹľ název napovĂdá, je to web, skládajĂcĂ se z jedinĂ© stránky. Strá \subsection{Multiple Page website} Tyto weby, vĂ˝vojovÄ› staršĂ, obsahujĂ zpravidla hodnÄ› informacĂ. ObsahujĂ nÄ›jakou formu routovánĂ - aĹĄ uĹľ sloĹľitÄ›jšĂ, dynamickou, ÄŤi jednoduššĂ, statickou. UĹľivateli podávajĂ pomÄ›rnÄ› velkĂ© mnoĹľstvĂ informacĂ. Jsou to zpravidla nejrĹŻznÄ›jšà blogy, e-shopy, fĂłra. Jejich implementace je ÄŤasto snazšà (zejmĂ©na u statickĂ˝ch webĹŻ), jsou schopny, ÄŤasto pĹ™ehlednÄ›ji, zprostĹ™edkovat uĹľivateli vĂce informacĂ a jsou (i z historickĂ˝ch dĹŻvodĹŻ) běžnÄ›jšĂ. +\newpage \section{ZabezpeÄŤenĂ} -\subsection{Session} -\subsection{JWT} +V aplikaci bude nutnĂ© zabezpeÄŤit REST API. To je moĹľnĂ© pomocĂ Session anebo pomocĂ, novÄ›jšĂho, JWT tokenu. Tyto dva pĹ™Ăstupy se v zásadÄ› lišà zpĹŻsobem ukládánĂ informace o autentifikaci uĹľivatele. Session tuto informaci ukládá do databáze, kdeĹľto JWT tokeny jsou uloĹľeny u uĹľivatele. +UkládánĂ u uĹľivatele má tu vĂ˝hodu, Ĺľe se nemusĂ ukládat na serveru tolik dat do mezipamÄ›ti. UkládánĂ na stranÄ› serveru, v pĹ™ĂpadÄ› nÄ›kolika uĹľivatelĹŻ, nenĂ nijak zásadnĂ, avšak u vÄ›tšĂho mnoĹľstvĂ to pĹ™inášà podstatnÄ› vyššà nároky na server.\cite{JWTvsSessionPerformance} NavĂc JWT tokeny jsou imunnĂ vĹŻÄŤi CSRF Ăştoku\cite{JWTvsSessionCSRF}. +VĂ˝hodou ukládánĂ na server je zase fakt, Ĺľe je mnohem snazšà znevalidnit uĹľivatelskĂ© pĹ™ihlášenĂ - staÄŤĂ odebrat záznam z databáze. U JWT je nutnĂ© vyÄŤkat na vypršenĂ tokenu anebo vytvoĹ™it nÄ›jakou formu blacklistu (seznam neplatnĂ˝ch tokenĹŻ). -\section{Databáze} -PĹ™i vĂ˝bÄ›ru druhu databáze jsem se musel rozhodnout mezi strukturovanĂ˝m a nestrukturovanĂ˝m pĹ™Ăstupem k datĹŻm. PrvnĂ ze zmĂnÄ›nĂ˝ch je reprezentován SQL, druhĂ˝ pomocĂ NoSQL +\section{UkládánĂ data} +%TODO pĹ™epracovat v závislosti na koneÄŤnĂ©m vĂ˝sledku \subsection{NoSQL} % TODO screen z excelu Tento pĹ™Ăstup je vhodnĂ˝ pro nestrukturovanĂ© informace a zvaĹľoval jsem ho jako prvnĂ. VeškerĂ© záznamy, ve vĂ˝pisu z účtu, jsou tedy vlastnÄ› jen jedna \mbox{"velká tabulka"/super-entita.} Záznamy mohou bĂ˝t nevyplnÄ›nĂ© (pĹ™. jednotlivĂ© symboly) a na prvnĂ pohled nijak nesouvislĂ©. Pokud se ale na data zaměřĂm vĂce, mohu si všimnout, Ĺľe transakce lze rozdÄ›lit napĹ™Ăklad na TrvalĂ© a jednorázovĂ© pĹ™Ăkazy, poplatky~atp. PouĹľitĂ NoSQL databáze pro transakÄŤnĂ historii i tak ale nic nebránĂ. Nakonec zmĂnÄ›ná data dokonce vĹľdy dostanu jako jednu jednu jedinou, nic neĹ™ĂkajĂcĂ, tabulku. @@ -108,12 +110,34 @@ DruhĂ˝m pĹ™Ăstupem, kterĂ˝ jsem nakonec zvolil, jsou standardnĂ SQL databáze Na ÄŤeskĂ©m trhu je, co se týče pĹ™edpovĂdánĂ transakcĂ, velmi pravdÄ›podobnÄ› zatĂm jedinĂ© finanÄŤnĂ bankovnictvĂ ÄŚeskĂ© SpoĹ™itelny, zvanĂ© "\textit{George}." a jejĂ doplnÄ›k "\textit{Moje zdravĂ© finance}."\cite{George} Aplikace je pĹ™Ăstupná pouze klientĹŻm ÄŚeskĂ© spoĹ™itelny a zobrazuje pouze pĹ™Ăjmy a vĂ˝daje. V části "Moje zdravĂ© finance" lze pak vidÄ›t, jak dlouho mi vystaÄŤĂ souÄŤasnĂ© Ăşspory nebo napĹ™Ăklad odhadnout výši mĂ©ho budoucĂho dĹŻchodu. Je ale schopna pĹ™edpovÄ›dÄ›t nÄ›kterĂ© mĂ© budoucĂ transakce, tedy funkci, kterou mám za Ăşkol implementovat. Aplikace byla spuštÄ›na v prĹŻbÄ›hu kvÄ›tna 2018\cite{vznikGeorge_Investujeme},\cite{vznikGeorge_Mesec} (aÄŤkoli pĹ™esnĂ© datum jsem nebyl schopen dohledat), tedy chvĂli po schválenĂ zadánĂ mĂ© BakalářskĂ© práce. To tedy dokazuje, Ĺľe o tĂ©má je v praxi zájem, ale bohuĹľel takĂ© to, Ĺľe v meziÄŤase mĂ©ho vypracovávánĂ, byl problĂ©m zpracován jinde. \newline Na zahraniÄŤnĂm trhu pak existujĂ aplikace, kterĂ© umoĹľĹujĂ klientĹŻm sledovat napĹ™. jejich mÄ›sĂÄŤnĂ Ăştratu a na základÄ› vĂ˝poÄŤtu jim poskytnout informaci, jestli a jak moc, pĹ™ekroÄŤili prĹŻmÄ›rnĂ© vĂ˝daje v tom kterĂ©m mÄ›sĂci.\cite{zahranicni_aplikace}. Ve vyuĹľitĂ umÄ›lĂ© inteligence je tedy asi ÄŚeská spoĹ™itelna, resp. Erste Group. -\section{ObohacenĂ} +\begin{figure}\centering + \includegraphics[width=0.75\textwidth]{img/Moje_zdrave_finance_anonymized.png} + \caption[Moje zdravĂ© finance]{Moje zdravĂ© finance - pĹ™edpovĂdánĂ transakcĂ ÄŚeskĂ© spoĹ™itelny}\label{fig:float} + \end{figure} + +\section{ObohacenĂ dat} +Pro obohacenĂ dat by bylo moĹľnĂ© vyuĹľĂt teoreticky vyuĹľĂt veĹ™ejnÄ› dostupnou databázi MFÄŚR - ARES (AdminstrativnĂ registr ekonomickĂ˝ch subjektĹŻ)\cite{ARES_zip}. BohuĹľel data v nĂ nejsou ukládána jednotnĂ˝m zpĹŻsobem. Je sice zadefinována základnĂ struktura dokumentu\cite{ARES_struktura}, avšak data v nĂ nejsou nijak strukturována. Ĺ˝ivnosti jsou zadanĂ˝ naprosto nahodile a nenĂ vyuĹľito žádnĂ©ho oficiálnĂho klĂÄŤe. NedefinovanĂ© hodnoty obsahujĂ vĂ˝rázay jako: "0", "null", "NULL", "prázdnĂ©", "nic", "nenĂ", "nedefinováno",... Jako nejlepšà pĹ™Ăklad záznamu v databázi by pak mohla dobĹ™e poslouĹľit KomerÄŤnĂ banka. Ta nemá dokonce definováno vĹŻbec nic, aĹľ na popis, kterĂ˝ obsahuje pĹ™ibliĹľnÄ› 1500 znakĹŻ. Lze tedy usoudit, Ĺľe vyuĹľitĂ tohoto zdroje je tĂ©měř nemoĹľnĂ© a pro obohacenĂ se nehodĂ. +Dalšà moĹľnost, která by se nabĂzela je vyuĹľitĂ bankovnĂch symbolĹŻ. VariabilnĂ a specifickĂ© symboly opÄ›t neobsahujà žádnĂ© informace. NÄ›kdy do nich bĂ˝vá zadáváno IÄŚO, kterĂ© by se dalo napojit na ARES, ale jak uĹľ je zmĂnÄ›no výše, toto napojenĂ nepĹ™ipadá v Ăşvahu. +ZbĂ˝vajĂ tedy uĹľ jen KonstantnĂ symboly. Ty se bohuĹľel vyuĹľĂvajĂ pouze v rámci ÄŚeskĂ© Republiky, ale majĂ alespoŠčásteÄŤnÄ› definovanou strukturu. A aÄŤkoli jejĂ pouĹľitĂ jiĹľ nenĂ povinnĂ©, ve vĂ˝pisech z účtĹŻ, kterĂ© byly pro tuto práci zĂskány, se vyskytujĂ hojnÄ› a mohou o transakcĂch nÄ›co Ĺ™Ăci. \chapter{Realizace} \section{WebovĂ© rozhranĂ} -Pro webovĂ© rozhranĂ jsem zvolil, s vyjĂmkou stránek pro registraci a pĹ™ihlášenĂ, One Page website. NepotĹ™ebuji uĹľivateli pĹ™edávat velkĂ© mnoĹľstvĂ informacĂ. V zásadÄ› jen zobrazuji grafy a svĂ© pĹ™edpoklady. NemusĂm tedy vytvářet rozsáhlĂ˝ web a jen jednoduchĂ© routovánĂ. V pĹ™ĂpadÄ› jednĂ© stránky se navĂc snadnÄ›ji pracuje s responzivitou, protoĹľe ji staÄŤĂ vyladit na jednu, resp. dvÄ› stránky webu. U Multiple Page webu by mohl tuto responzivitu rozbĂt pĹ™echod na jinou stránku. To zde nemĹŻĹľe nastat. +Pro webovĂ© rozhranĂ byla zvolena, One Page website, doplnÄ›ná o stránky s registracĂ a pĹ™ihlášenĂm. NenĂ potĹ™eba uĹľivateli pĹ™edávat velkĂ© mnoĹľstvĂ informacĂ. V zásadÄ› jen zobrazovat grafy a pĹ™edpoklady. NemusĂ se tedy vytvářet rozsáhlĂ˝ web a jen jednoduchĂ© routovánĂ. V pĹ™ĂpadÄ› malĂ©ho mnoĹľstvĂ stránek se navĂc snadnÄ›ji pracuje s responzivitou, protoĹľe ji staÄŤĂ vyladit na jednu, resp. tĹ™i stránky webu. Jakákoli práce s responzivitou pro kaĹľdou dalšà stránku pak zvÄ›tšuje prostor na chybu. +\section{ZabezpeÄŤenĂ} +V pĹ™ĂpadÄ› zabezpeÄŤenĂ komunikace mezi backendem a frotendem (API) bylo vyuĹľito JWT tokenu. KromÄ› vĂ˝hod, uvedenĂ˝ch v analĂ˝ze, je tento pĹ™Ăstup k zabezpeÄŤenĂ i novÄ›jšà (dle Wikipedie poprvĂ© vydán 28.12.2010\cite{JWT_published} - v prĹŻbÄ›hu psanĂ práce starĂ˝ necelĂ˝ch osm let) a umoĹľnĂ vyzkoušet si novou technologii. +Pro zabezpeÄŤenĂ routovánĂ na stranÄ› Klienta bylo vyuĹľito tzv. GuardĹŻ - součást zabezpeÄŤenĂ pĹ™Ămo v Angular frameworku. A koneÄŤnÄ› k zabezpeÄŤenĂ uĹľivatelskĂ˝ch hesel se vyuĹľilo hashovacĂho algoritmu RFC~2898/SHA512. ZároveĹ se pro kaĹľdĂ© heslo generuje jiná sĹŻl a proto by nemÄ›lo bĂ˝t moĹľnĂ© v databázi najĂt dvÄ› stejná hesla se stejnĂ˝m hashem. + +\section {UmÄ›lá inteligence} +%FFFFFFFFFFFUUUUUUUUUUUUCCCCCCCCCCCCCCCCCKKKKKKKKKKKKKKK + +\section{Databáze} +PĹ™i vĂ˝bÄ›ru druhu databáze jsem se musel rozhodnout mezi strukturovanĂ˝m a nestrukturovanĂ˝m pĹ™Ăstupem k datĹŻm. PrvnĂ ze zmĂnÄ›nĂ˝ch je reprezentován SQL, druhĂ˝ pomocĂ NoSQL +\subsection{NoSQL} +% TODO screen z excelu +Tento pĹ™Ăstup je vhodnĂ˝ pro nestrukturovanĂ© informace a zvaĹľoval jsem ho jako prvnĂ. VeškerĂ© záznamy, ve vĂ˝pisu z účtu, jsou tedy vlastnÄ› jen jedna \mbox{"velká tabulka"/super-entita.} Záznamy mohou bĂ˝t nevyplnÄ›nĂ© (pĹ™. jednotlivĂ© symboly) a na prvnĂ pohled nijak nesouvislĂ©. Pokud se ale na data zaměřĂm vĂce, mohu si všimnout, Ĺľe transakce lze rozdÄ›lit napĹ™Ăklad na TrvalĂ© a jednorázovĂ© pĹ™Ăkazy, poplatky~atp. PouĹľitĂ NoSQL databáze pro transakÄŤnĂ historii i tak ale nic nebránĂ. Nakonec zmĂnÄ›ná data dokonce vĹľdy dostanu jako jednu jednu jedinou, nic neĹ™ĂkajĂcĂ, tabulku. +\subsection{SQL} +DruhĂ˝m pĹ™Ăstupem, kterĂ˝ jsem nakonec zvolil, jsou standardnĂ SQL databáze. Tento pĹ™Ăstup vyĹľaduje strukturovánĂ dat a to, jak jsem jiĹľ zmĂnil výše, je splnÄ›no. Lze zde nalĂ©zt rĹŻznĂ© závislosti. Pro vstupy pro mnou implementovanou umÄ›lou inteligenci je navĂc mnohem lepšà jasnÄ› definovanĂ© vstupy, coĹľ SQL pĹ™Ăstup nabĂzĂ. NavĂc veškerou historii transakcĂ všech uĹľivatelĹŻ nechci ukládat do databáze, ale radÄ›ji v *.csv souborech na disk a zaregistrovat jen nÄ›kterĂ© transakce. V opaÄŤnĂ©m pĹ™ĂpadÄ› by se celá databáze stala zbyteÄŤnÄ› velkou a pomalou. \section{Backend} PĹ™i vĂ˝bÄ›ru formy zpracovánĂ umÄ›lĂ© inteligence jsem se rozhodl pro vyuĹľitĂ neuronovĂ˝ch sĂtĂ. Tato forma zpracovánĂ je novÄ›jšĂ, ale jinak nemá žádnĂ© vĂ˝raznĂ© vĂ˝hody.\cite{DynamicCF}. Vybral jsem si ji tedy hlavnÄ› proto, Ĺľe se mi zdá zajĂmavÄ›jšĂ. Pro zjištÄ›nĂ, kterĂ˝ model je pĹ™esnÄ›jšĂ, bych ale musel implementovat obÄ› varianty, coĹľ je vĂ˝raznÄ› ÄŤasovÄ› nároÄŤnĂ˝ problĂ©m a rozdĂl by patrnÄ› nebyl markantnĂ. NavĂc lze jen těžko odhadnout, jak pĹ™esnÄ› by se jednotlivĂ© modely chovaly v horizontu let. @@ -139,12 +163,16 @@ Pro svou práci jsem si nastudoval syntaxi a pouĹľitĂ jazykĹŻ, jmenovitÄ› Types \appendix %============= seznam zkratek disabled =================== -%\chapter{Seznam pouĹľitĂ˝ch zkratek} -%% \printglossaries -%\begin{description} -% \item[GUI] Graphical user interface -% \item[XML] Extensible markup language -%\end{description} +\chapter{Seznam pouĹľitĂ˝ch zkratek} +%\printglossaries +\begin{description} + \item [JSON] JavaScript Object Notation + \item [JWT] JSON Web Token + \item [SQL] Structured Query Language + \item [NoSQL] non SQL + \item [CSRF] Cross-site request forgery + \item [ARES] AdministrativnĂ registr ekonomickĂ˝ch subjektĹŻ +\end{description} % % % % % % % % % % % % % % % % % % % % % % % % % % % % diff --git a/Latex/mybibliographyfile.bib b/Latex/mybibliographyfile.bib index 16948ec2ebead6a13a352315d16f7c285094b7f4..fd8eb0841574fd6cd1d731099b0cd73273e6acf3 100644 --- a/Latex/mybibliographyfile.bib +++ b/Latex/mybibliographyfile.bib @@ -26,6 +26,35 @@ note = "[cit. 2019-11-10]" } +@MANUAL{ARES_zip, + title = "Seznam všech IÄŚO - ARES (531MB) {[online]}", + organization = "Ministerstvo financĂ ÄŚeskĂ© republiky", + url = "https://wwwinfo.mfcr.cz/ares/ares_vreo_all.tar.gz", + note = "[cit. 2019-13-11]" +} + +@ARTICLE {JWTvsSessionCSRF, + title = "Auth Headers vs JWT vs Sessions: Choosing Right Auth Technique for APIs", + author = "Sripathi Krishnan", + journal = "HashedIn Technologies Pvt. Ltd. {[online]}", + howpublished = "[online]", + month = "18" # "leden", + year = "2018", + note = "[cit. 2019-13-11]", + url = "https://hashedin.com/blog/auth-headers-vs-jwt-vs-sessions-choosing-right-auth-technique-for-apis/" +} + +@ARTICLE {JWTvsSessionPerformance, + title = "JSON Web Tokens vs. Session Cookies: What’s the Difference?", + author = "Jenni McKinnon", + journal = "WP Rocket {[online]}", + howpublished = "[online]", + month = "21" # "kvÄ›ten", + year = "2019", + note = "[cit. 2019-13-11]", + url = "https://wp-rocket.me/blog/difference-json-web-tokens-vs-session-cookies/" +} + @ARTICLE {YoutubeTechnet, title = "Jak vám Google vnucuje videa? NahlĂ©dnÄ›te pod pokliÄŤku YouTube",