My brain is fried

This commit is contained in:
kunkliricsi 2020-12-07 23:19:09 +01:00
parent 251a00eaa6
commit 7588b58453
16 changed files with 4043 additions and 3187 deletions

View File

@ -17,13 +17,13 @@ namespace Birdmap.BLL.Services
using System = global::System; using System = global::System;
[System.CodeDom.Compiler.GeneratedCode("NSwag", "13.8.2.0 (NJsonSchema v10.2.1.0 (Newtonsoft.Json v12.0.0.0))")] [System.CodeDom.Compiler.GeneratedCode("NSwag", "13.8.2.0 (NJsonSchema v10.2.1.0 (Newtonsoft.Json v12.0.0.0))")]
public partial class LiveDummyService : IDeviceService public partial class LiveDeviceService : IDeviceService
{ {
private string _baseUrl = "https://birb.k8s.kmlabz.com"; private string _baseUrl = "https://birb.k8s.kmlabz.com";
private System.Net.Http.HttpClient _httpClient; private System.Net.Http.HttpClient _httpClient;
private System.Lazy<Newtonsoft.Json.JsonSerializerSettings> _settings; private System.Lazy<Newtonsoft.Json.JsonSerializerSettings> _settings;
public LiveDummyService(string baseUrl, System.Net.Http.HttpClient httpClient) public LiveDeviceService(string baseUrl, System.Net.Http.HttpClient httpClient)
{ {
_baseUrl = baseUrl; _baseUrl = baseUrl;
_httpClient = httpClient; _httpClient = httpClient;

View File

@ -33,10 +33,10 @@ namespace Birdmap.BLL
var service = new LiveInputService(baseUrl, httpClient); var service = new LiveInputService(baseUrl, httpClient);
return service; return service;
}); });
services.AddTransient<IDeviceService, LiveDummyService>(serviceProvider => services.AddTransient<IDeviceService, LiveDeviceService>(serviceProvider =>
{ {
var httpClient = serviceProvider.GetService<HttpClient>(); var httpClient = serviceProvider.GetService<HttpClient>();
var service = new LiveDummyService(baseUrl, httpClient); var service = new LiveDeviceService(baseUrl, httpClient);
return service; return service;
}); });
} }

View File

@ -1,111 +1,157 @@
@misc{kubernetes, @misc{kubernetes,
title = {A Kubernetes hivatalos oldala}, title = {A Kubernetes hivatalos oldala},
url = {https://kubernetes.io}, url = {https://kubernetes.io},
note = {Megtekintve: 2020.11.28},
} }
@misc{kubernetes-dashboard, @misc{kubernetes-dashboard,
title = {A Kubernetes Dashboard hivatalos oldala}, title = {A Kubernetes Dashboard hivatalos oldala},
url = {https://kubernetes.io/docs/tasks/access-application-cluster/web-ui-dashboard/}, url = {https://kubernetes.io/docs/tasks/access-application-cluster/web-ui-dashboard/},
note = {Megtekintve: 2020.11.28},
} }
@misc{docker, @misc{docker,
title = {A Docker hivatalos oldala}, title = {A Docker hivatalos oldala},
url = {https://www.docker.com}, url = {https://www.docker.com},
note = {Megtekintve: 2020.11.28},
} }
@misc{grafana, @misc{grafana,
title = {A Grafana hivatalos oldala}, title = {A Grafana hivatalos oldala},
url = {https://grafana.com/}, url = {https://grafana.com/},
note = {Megtekintve: 2020.11.29},
} }
@misc{kibana, @misc{kibana,
title = {A Kibana hivatalos oldala}, title = {A Kibana hivatalos oldala},
url = {https://www.elastic.co/kibana}, url = {https://www.elastic.co/kibana},
note = {Megtekintve: 2020.11.29},
} }
@misc{git, @misc{git,
title = {A Git hivatalos oldala}, title = {A Git hivatalos oldala},
url = {https://git-scm.com/}, url = {https://git-scm.com/},
note = {Megtekintve: 2020.11.30},
} }
@misc{trello, @misc{trello,
title = {A Trello hivatalos oldala}, title = {A Trello hivatalos oldala},
url = {https://trello.com}, url = {https://trello.com},
note = {Megtekintve: 2020.11.30},
} }
@misc{vs, @misc{vs,
title = {A Microsoft Visual Studio hivatalos oldala}, title = {A Microsoft Visual Studio hivatalos oldala},
url = {https://visualstudio.microsoft.com/}, url = {https://visualstudio.microsoft.com/},
note = {Megtekintve: 2020.11.30},
} }
@misc{vs-code, @misc{vs-code,
title = {A Microsoft Visual Studio Code hivatalos oldala}, title = {A Microsoft Visual Studio Code hivatalos oldala},
url = {https://code.visualstudio.com/}, url = {https://code.visualstudio.com/},
note = {Megtekintve: 2020.11.30},
} }
@misc{nlog, @misc{nlog,
title = {Az NLog hivatalos oldala}, title = {Az NLog hivatalos oldala},
url = {https://nlog-project.org/}, url = {https://nlog-project.org/},
note = {Megtekintve: 2020.11.30},
} }
@misc{jwt, @misc{jwt,
title = {Az JSON Web Token hivatalos oldala}, title = {Az JSON Web Token hivatalos oldala},
url = {https://jwt.io/introduction/}, url = {https://jwt.io/introduction/},
note = {Megtekintve: 2020.12.02},
} }
@misc{automapper, @misc{automapper,
title = {Az AutoMapper hivatalos oldala}, title = {Az AutoMapper hivatalos oldala},
url = {https://automapper.org/}, url = {https://automapper.org/},
note = {Megtekintve: 2020.11.30},
} }
@misc{react, @misc{react,
title = {A React.js hivatalos oldala}, title = {A React.js hivatalos oldala},
url = {https://reactjs.org/}, url = {https://reactjs.org/},
note = {Megtekintve: 2020.11.31},
} }
@misc{react-context, @misc{react-context,
title = {A React Context dokumentációja}, title = {A React Context dokumentációja},
url = {https://reactjs.org/docs/context.html}, url = {https://reactjs.org/docs/context.html},
note = {Megtekintve: 2020.11.31},
} }
@misc{material, @misc{material,
title = {A Material hivatalos oldala}, title = {A Material hivatalos oldala},
url = {https://material.io/}, url = {https://material.io/},
note = {Megtekintve: 2020.11.31},
} }
@misc{material-ui, @misc{material-ui,
title = {A Material UI hivatalos oldala}, title = {A Material UI hivatalos oldala},
url = {https://material-ui.com/}, url = {https://material-ui.com/},
note = {Megtekintve: 2020.11.31},
} }
@misc{apexcharts, @misc{apexcharts,
title = {Az Apexcharts hivatalos oldala}, title = {Az Apexcharts hivatalos oldala},
url = {https://apexcharts.com/}, url = {https://apexcharts.com/},
note = {Megtekintve: 2020.11.31},
} }
@misc{google-map-react, @misc{google-map-react,
title = {A Google Map React hivatalos oldala}, title = {A Google Map React hivatalos oldala},
url = {https://www.npmjs.com/package/google-map-react}, url = {https://www.npmjs.com/package/google-map-react},
note = {Megtekintve: 2020.11.31},
} }
@misc{nswag, @misc{nswag,
title = {Az NSwag github oldala}, title = {Az NSwag github oldala},
url = {https://github.com/RicoSuter/NSwag}, url = {https://github.com/RicoSuter/NSwag},
note = {Megtekintve: 2020.12.01},
} }
@misc{nswag-studio, @misc{nswag-studio,
title = {Az NSwag Studio github oldala}, title = {Az NSwag Studio github oldala},
url = {https://github.com/RicoSuter/NSwag/wiki/NSwagStudio}, url = {https://github.com/RicoSuter/NSwag/wiki/NSwagStudio},
note = {Megtekintve: 2020.12.01},
} }
@misc{swagger-ui, @misc{swagger-ui,
title = {A Swagger UI hivatalos oldala}, title = {A Swagger UI hivatalos oldala},
url = {https://swagger.io/tools/swagger-ui/}, url = {https://swagger.io/tools/swagger-ui/},
note = {Megtekintve: 2020.12.01},
} }
@misc{hmacsha512, @misc{hmacsha512,
title = {Az HMACSHA512 dokumentációja}, title = {Az HMACSHA512 dokumentációja},
url = {https://docs.microsoft.com/en-us/dotnet/api/system.security.cryptography.hmacsha512}, url = {https://docs.microsoft.com/en-us/dotnet/api/system.security.cryptography.hmacsha512},
note = {Megtekintve: 2020.12.02},
}
@misc{nuget,
title = {An introduction to NuGet},
url = {https://docs.microsoft.com/en-us/nuget/what-is-nuget},
note = {Megtekintve: 2020.12.04},
}
@misc{signalr,
title = {Introduction to ASP.NET Core SignalR},
url = {https://docs.microsoft.com/en-us/aspnet/core/signalr/introduction?view=aspnetcore-5.0},
note = {Megtekintve: 2020.12.04},
}
@misc{mqttnet-winforms,
title = {Az MQTT.NET tesztelő alkalmazásának github oldala},
url = {https://github.com/SeppPenner/MQTTnet.TestApp.WinForm},
note = {Megtekintve: 2020.12.07},
}
@misc{mqttnet-examples,
title = {Az MQTT.NET github oldalán található példák},
url = {https://github.com/chkr1011/MQTTnet/wiki/Examples},
note = {Megtekintve: 2020.12.07},
} }
@thesis{birdnetes-tdk, @thesis{birdnetes-tdk,
@ -115,3 +161,11 @@
type = {tdk}, type = {tdk},
year = {2020}, year = {2020},
} }
@thesis{birdnetes-thesis,
author = {Nagy Kristóf},
institution = {Budapesti Műszaki és Gazdaságtudományi Egyetem},
title = {Tömeges gép-gép kommunikáció mezőgazdasági alkalmazása},
type = {thesis},
year = {2020},
}

View File

@ -72,7 +72,7 @@ Majd hozzáadja az újonnan beolvasott értékeket.
%---------------------------------------------------------------------------- %----------------------------------------------------------------------------
\section{Üzleti logikai réteg} \section{Üzleti logikai réteg}
%---------------------------------------------------------------------------- %----------------------------------------------------------------------------
Ebben a rétegben található meg a szerver legtöbb szolgáltatása. It vannak implementálva a Birdnetes Command and Control és Input komponensekkel kommunikáló szolgáltatások is, Ebben a rétegben található meg a szerver legtöbb szolgáltatása. It vannak implementálva a Birbnetes Command and Control és Input komponensekkel kommunikáló szolgáltatások is,
melyeket azok OpenAPI leírói alapján az NSwag Studio \cite{nswag-studio} alkalmazással generáltam. Az OpenAPI a klienseken kívül definiálja még az azok által használt modelleket is. melyeket azok OpenAPI leírói alapján az NSwag Studio \cite{nswag-studio} alkalmazással generáltam. Az OpenAPI a klienseken kívül definiálja még az azok által használt modelleket is.
A Command and Control által használt \verb+Device+ modell tartalmazza annak egyedi azonosítóját, státuszát, koordinátáit és a használt szenzorok listáját, A Command and Control által használt \verb+Device+ modell tartalmazza annak egyedi azonosítóját, státuszát, koordinátáit és a használt szenzorok listáját,
melyeknek szintén van egy modellje \verb+Sensor+ néven. Ennek szintén van azonosítója és státusza. Az Input szolgáltatásnak is van saját modellje, melyeknek szintén van egy modellje \verb+Sensor+ néven. Ennek szintén van azonosítója és státusza. Az Input szolgáltatásnak is van saját modellje,
@ -98,7 +98,7 @@ Egy másik megoldás a SignalR használata, amellyel a klienseket eseményvezér
Így a kliensek csak akkor indítanak kéréseket amikor az adat tényleg változott. Ezzel a technológiával oldottam meg például, hogy az eszközök állapotainak változására Így a kliensek csak akkor indítanak kéréseket amikor az adat tényleg változott. Ezzel a technológiával oldottam meg például, hogy az eszközök állapotainak változására
frissüljön a felület. frissüljön a felület.
Egy másik szerveroldalon használt szolgáltatás a Birdnetes MQTT kommunikációért felelős szolgáltatás, Egy másik szerveroldalon használt szolgáltatás a Birbnetes MQTT kommunikációért felelős szolgáltatás,
mely felregisztrál a \ref{subsect:birdnetes-ai-service}-as alfejezetben bemutatott AI Service által publikált üzenetekre. mely felregisztrál a \ref{subsect:birdnetes-ai-service}-as alfejezetben bemutatott AI Service által publikált üzenetekre.
Ezekben az üzenetekben található a hanganyagok egyedi azonosítója, illetve azok seregélytől való származásának valószínüsége. Ezekben az üzenetekben található a hanganyagok egyedi azonosítója, illetve azok seregélytől való származásának valószínüsége.
Ha a szolgáltatás kap egy ilyen üzenetet akkor lekérdezi a \ref{subsect:birdnetes-input-service}-es alfejezetben bemutatott Input Service-től Ha a szolgáltatás kap egy ilyen üzenetet akkor lekérdezi a \ref{subsect:birdnetes-input-service}-es alfejezetben bemutatott Input Service-től
@ -194,7 +194,7 @@ A szerveroldalon négy különböző kontroller található, melyek mindegyikén
illetve az imént említett végpontok authorizálása és kiszolgálása. Ezeken kívül a kontrollerek speciális feladata a következő: illetve az imént említett végpontok authorizálása és kiszolgálása. Ezeken kívül a kontrollerek speciális feladata a következő:
\begin{itemize} \begin{itemize}
\item Az \textbf{AuthController} felel a felhasználók bejelentkezésének lebonyolításáért, a JSON Web Token elkészítéséért. Az \verb+[Authorize]+ helyett itt az \verb+[AllowAnonymous]+ attribútum van használva, mellyel azt lehet jelezni, hogy a végpont bejelentkezés nélkül is hívható. \item Az \textbf{AuthController} felel a felhasználók bejelentkezésének lebonyolításáért, a JSON Web Token elkészítéséért. Az \verb+[Authorize]+ helyett itt az \verb+[AllowAnonymous]+ attribútum van használva, mellyel azt lehet jelezni, hogy a végpont bejelentkezés nélkül is hívható.
\item A \textbf{ServiceController} felel az alkalmazás által használt külső szolgáltatások állapotának lekérdezhetőségéért. Ilyenek például a Birdnetes rendszer vagy az MQTT szolgáltatás állapota. \item A \textbf{ServiceController} felel az alkalmazás által használt külső szolgáltatások állapotának lekérdezhetőségéért. Ilyenek például a Birbnetes rendszer vagy az MQTT szolgáltatás állapota.
\item A \textbf{DevicesController} felel a Command and Control mikroszolgáltatással való kommunikáció megvalósításáért, illetve a SignalR használatáért. Ha egy felhasználó valamelyik végpontot használva változtat valamelyik eszköz állapotán, akkor a kontroller jelez erről a klienseknek. \item A \textbf{DevicesController} felel a Command and Control mikroszolgáltatással való kommunikáció megvalósításáért, illetve a SignalR használatáért. Ha egy felhasználó valamelyik végpontot használva változtat valamelyik eszköz állapotán, akkor a kontroller jelez erről a klienseknek.
\item A \textbf{LogController} felel azért, hogy az \verb+Admin+ jogosultságú felhasználók letölthessék a szerveroldalon készült naplófájlokat. \item A \textbf{LogController} felel azért, hogy az \verb+Admin+ jogosultságú felhasználók letölthessék a szerveroldalon készült naplófájlokat.
\end{itemize} \end{itemize}

View File

@ -145,7 +145,7 @@ Továbbá hogy a különböző diagrammok animációi is zökkenőmentesek legye
\subsubsection{Külső szolgáltatások} \subsubsection{Külső szolgáltatások}
%---------------------------------------------------------------------------- %----------------------------------------------------------------------------
Az alkalmazás használatának szempontjából van néhány olyan külső szolgáltatás, melyek elérhetősége hiányában a rendszer működésképtelen. Az alkalmazás használatának szempontjából van néhány olyan külső szolgáltatás, melyek elérhetősége hiányában a rendszer működésképtelen.
Ilyen például a Birdnetes klasztere vagy a szerver MQTT szolgáltatása. Ilyen például a Birbnetes klasztere vagy a szerver MQTT szolgáltatása.
Ezért készítettem el az \ref{fig:dashboard-services-loaded}-ös ábrán látható információs panelt, ahol a szolgáltatások állapotát lehet látni, hogy a felhasználó tudja miért nem működik esetleg az alkalmazás. Ezért készítettem el az \ref{fig:dashboard-services-loaded}-ös ábrán látható információs panelt, ahol a szolgáltatások állapotát lehet látni, hogy a felhasználó tudja miért nem működik esetleg az alkalmazás.
A felület megvalósításhoz a Material UI \verb+Accordion+ elemét használtam, ami lényegében egy lenyíló lista. A felület megvalósításhoz a Material UI \verb+Accordion+ elemét használtam, ami lényegében egy lenyíló lista.
Ennek fejlécében a szolgáltatás neve, elérési útvonala és státusza látható. A lenyíló elemben a szolgáltatástól érkezett válasz van megjelenítve. Ennek fejlécében a szolgáltatás neve, elérési útvonala és státusza látható. A lenyíló elemben a szolgáltatástól érkezett válasz van megjelenítve.

View File

@ -2,29 +2,27 @@
\chapter{Tervek és alternatívák} \chapter{Tervek és alternatívák}
\label{chapt:birdmap-introduction} \label{chapt:birdmap-introduction}
%---------------------------------------------------------------------------- %----------------------------------------------------------------------------
Ebben a fejezetben bemutatom a fejlesztés előtti állapotot, amikor még csak tervezgettük, hogy milyen is legyen az alkalmazás. Ebben a fejezetben bemutatom a fejlesztés előtti állapotot, amikor a munkám elején a fontosabb vizualizációs alternatívákat értékeltem.
Illetve bemutatok, néhány vizualizációs alternatívát, melyek jó iránymutatásként szólgálltak a fejlesztés során.
%---------------------------------------------------------------------------- %----------------------------------------------------------------------------
\section{Tervezés} \section{Tervezés}
%---------------------------------------------------------------------------- %----------------------------------------------------------------------------
Az első dolgom az volt, hogy Kristóffal és Marcellel beültünk egy Teams\footnotemark-en tartott gyűlésre, A munkám elején egyeztettem a seregély riasztó keretrendszert fejlesztő kollégákkal,
ahol elmagyarázták nagyvonalakban, hogy hogyan is működik a rendszer, mik az egyes kompnensek feladatai. hogy ki tudjam választani a vizualizáció szempontjából legfontosabb komponenseket.
Ezek után az előttem álló fejlesztésre váró alkalmazás részleteit beszéltük meg, az elvárt igényeket azzal kapcsolatban. A jellemző adatvizualizációs megoldások közül az alábbi hármat találtam kulcsfontosságúnak a következő célokra:
Itt rögtön több ötlet is felmerült, melyek közül a legkiemelkedőbbek:
\begin{itemize} \begin{itemize}
\item \textbf{Hőtérkép}. Hasznos lenne egy olyan felület, ahol az eszközök GPS koordinátái és a seregély detektálást jelző üzenetek alapján, meg lehetne jeleníteni a seregélyek hozzávetőleges előfordulásának helyeit és gyakoriságát egy térképen, hőtérképes formában. \item \textbf{Hőtérkép}. Hasznos lenne egy olyan felület, ahol az eszközök GPS koordinátái és a seregély detektálást jelző üzenetek alapján, meg lehetne jeleníteni a seregélyek hozzávetőleges előfordulásának helyeit és gyakoriságát egy térképen, hőtérképes formában.
\item \textbf{Eszköz állapotok}. Jelenleg a Command and Control mikroszolgáltatás felé indított kéréseken kívül, nincs lehetőség a kihelyezett eszközök állapotának vizsgálatára. Szükség lenne egy olyan felületre, ahol ezek állapotai láthatóak, esetleg dinamikusan is frissülnek. \item \textbf{Eszköz állapotok}. Jelenleg a Command and Control mikroszolgáltatás felé indított kéréseken kívül, nincs lehetőség a kihelyezett eszközök állapotának vizsgálatára. Szükség lenne egy olyan felületre, ahol ezek állapotai láthatóak, esetleg dinamikusan is frissülnek.
\item \textbf{Diagrammok}. A hőtérképen kívül egyéb olyan diagrammok is hasznosak lehetnek, ahol látható például, hogy melyik eszköz melyik percben észlelt madárhangot vagy, hogy egy eszköz összesen hány madárhangot észelt. Minnél több információ, annál jobb. \item \textbf{Diagrammok}. A hőtérképen kívül egyéb olyan diagrammok is hasznosak lehetnek, ahol látható például, hogy melyik eszköz melyik percben észlelt madárhangot vagy, hogy egy eszköz összesen hány madárhangot észelt. Minnél több információ, annál jobb.
\end{itemize} \end{itemize}
Ezeken kívül fontos követelmény volt még, hogy az alkalmazásom futtatható legyen Linux környezetben is, hogy az telepíthető legyen a Birdnetes Kubernetes\cite{kubernetes} klaszterébe. Ezeken kívül fontos követelmény volt még, hogy az alkalmazásom futtatható legyen Linux környezetben is, hogy az telepíthető legyen a Birbnetes Kubernetes \cite{kubernetes} klaszterébe.
Az alkalmazásom kapott egy nevet is, mely a Birdnetes-t és az említett hőtérképes ötletet ötvözve Birdmap lett. Az alkalmazásom kapott egy nevet is, mely a Birbnetes-t és az említett hőtérképes ötletet ötvözve Birdmap lett.
\footnotetext{Microsoft Teams: Csevegő és gyülekezés tartó alkalmazás.} \footnotetext{Microsoft Teams: Csevegő és gyülekezés tartó alkalmazás.}
%---------------------------------------------------------------------------- %----------------------------------------------------------------------------
\section{Alternatívák} \section{Alternatívák}
%---------------------------------------------------------------------------- %----------------------------------------------------------------------------
Az imént vázolt igények kielégítésére rengeteg kiforrott megoldás létezik már, melyek jó példát mutattak a saját alkalmazásom fejlesztése során. Az imént vázolt igények kielégítésére sok, széles körben alkalmazott megoldás létezik már, melyek jó példát mutattak a saját alkalmazásom fejlesztése során.
%---------------------------------------------------------------------------- %----------------------------------------------------------------------------
\subsection{Grafana} \subsection{Grafana}

View File

@ -19,13 +19,13 @@ Megkönnyíti az egy projekten dolgozó programozók közötti kooperációt. Ma
%---------------------------------------------------------------------------- %----------------------------------------------------------------------------
\subsection{Trello} \subsection{Trello}
%---------------------------------------------------------------------------- %----------------------------------------------------------------------------
A Trello\cite{trello} egy webes lista készítő és kezelő alkalmazás. A Trello \cite{trello} egy webes projektmenedszment alkalmazás.
Azért használtam a fejlesztés során, mert szerettem volna egy helyet, ami tükrözi a fejlesztés állapotát, ahova le tudom írni az alkalmazással kapcsolatos ötleteimet. Azért használtam a fejlesztés során, mert szerettem volna egy helyet, ami tükrözi a fejlesztés állapotát, ahova le tudom írni az alkalmazással kapcsolatos ötleteimet.
Különböző listákban tároltam a fejlesztésre váró és a kész feladatokat szerver, kliens és egyéb szerint. Különböző listákban tároltam a fejlesztésre váró és a kész feladatokat szerver, kliens és egyéb szerint.
\begin{figure}[!ht] \begin{figure}[!ht]
\centering \centering
\includegraphics[width=150mm, keepaspectratio]{figures/trello-cropped.png} \includegraphics[width=150mm, keepaspectratio]{figures/trello-3.png}
\caption{Egy példa állapot a Trello felületére a fejlesztés során} \caption{Egy példa állapot a Trello felületére a fejlesztés során}
\label{fig:trello} \label{fig:trello}
\end{figure} \end{figure}
@ -58,7 +58,8 @@ Mindemellett a .NET teljesen platformüggetlen, mely az egyik legfontosabb köve
%---------------------------------------------------------------------------- %----------------------------------------------------------------------------
\subsection{ASP.NET Core} \subsection{ASP.NET Core}
%---------------------------------------------------------------------------- %----------------------------------------------------------------------------
Az ASP.NET Core a .NET család ingyenes, nyílt forráskódú webes keretrendszere. Gyors és moduláris fejlesztést tesz lehetővé, mely főként a NuGet csomagoknak köszönhető. Az ASP.NET Core a .NET család ingyenes, nyílt forráskódú webes keretrendszere. Gyors és moduláris fejlesztést tesz lehetővé,
mely főként a csomagkezelő rendszerének, a NuGet-nek \cite{nuget} köszönhető.
Használatána egyik előnye, hogy ugyan az a C\# kód tud futni a szerver éa a kliens oldalon, de támogat más kliens oldali keretrendszereket is, mint például az Angular-t, a Vue.js-t Használatána egyik előnye, hogy ugyan az a C\# kód tud futni a szerver éa a kliens oldalon, de támogat más kliens oldali keretrendszereket is, mint például az Angular-t, a Vue.js-t
vagy a React.js-t. vagy a React.js-t.
@ -66,7 +67,7 @@ vagy a React.js-t.
\subsection{Entity Framework Core} \subsection{Entity Framework Core}
%---------------------------------------------------------------------------- %----------------------------------------------------------------------------
Az Entity Framework Core (röviden EF Core) egy objektum-relációs leképező keretrendszer a .NET-hez. Az adatbázissal való kommunikációt könnyítését szolgálja. Az Entity Framework Core (röviden EF Core) egy objektum-relációs leképező keretrendszer a .NET-hez. Az adatbázissal való kommunikációt könnyítését szolgálja.
Használatával C\#-ban lehet adatbázis lekérdezéseket írni a LINQ (Language-Integrated Query) segítségével. Használatával C\#-ban lehet adatbázis lekérdezéseket írni a LINQ (Language-Integrated Query) szoftvercsomag segítségével.
%---------------------------------------------------------------------------- %----------------------------------------------------------------------------
\subsection{JSON Web Token} \subsection{JSON Web Token}
@ -82,19 +83,20 @@ A szerveroldal jogosultság kezelését ezzel a csomaggal oldottam meg.
%---------------------------------------------------------------------------- %----------------------------------------------------------------------------
\subsection{SignalR} \subsection{SignalR}
%---------------------------------------------------------------------------- %----------------------------------------------------------------------------
A SignalR egy .NET szoftvercsomag, mely lehetővé teszi a szerveroldal számára a kliensekkel való aszinkron kommunikációt. A SignalR \cite{signalr} egy .NET szoftvercsomag, mely lehetővé teszi a szerveroldal számára a kliensekkel való aszinkron kommunikációt.
A szerver valós időben tud értesítéseket küldeni a kliensek számára, amelyek feliratkoztak az ilyen eseményekre. A szerver valós időben tud értesítéseket küldeni a kliensek számára, amelyek feliratkoztak az ilyen eseményekre.
%---------------------------------------------------------------------------- %----------------------------------------------------------------------------
\subsection{MQTT.NET} \subsection{MQTT.NET}
%---------------------------------------------------------------------------- %----------------------------------------------------------------------------
Az MQTT.NET is egy .NET szoftvercsomag, mely a Birdnetes által is használt, a \ref{subsect:mqtt}-es alfejezetben bemutatott MQTT kommunikáció C\# nyelvű megvalósítását szolgálja. Az MQTT.NET is egy .NET szoftvercsomag, mely a Birbnetes által is használt, a \ref{subsect:mqtt}-es alfejezetben bemutatott MQTT kommunikáció C\# nyelvű megvalósítását szolgálja.
%---------------------------------------------------------------------------- %----------------------------------------------------------------------------
\subsection{NLog} \subsection{NLog}
%---------------------------------------------------------------------------- %----------------------------------------------------------------------------
A szerveroldali naplózás megvalósítására több szoftvercsomag is létezik. Az NLog \cite{nlog}-ot választottam, egyrészt mert egyszerű a használata, A szerveroldali naplózás megvalósítására több szoftvercsomag is létezik. Az NLog \cite{nlog}-ot választottam, egyrészt mert egyszerű a használata,
másrészt mert már használtam korábban. másrészt mert már korábban használtam. Konfigurációs fájljában meg lehet adni a naplózott események célját, mely lehet akár fájl vagy konzol is.
Meg lehet még adni az események elrendezését, hogy azok milyen formában kerüljenek a célokba, milyen plusz információt tartalmazzanak.
%---------------------------------------------------------------------------- %----------------------------------------------------------------------------
\section{Frontend technológiák} \section{Frontend technológiák}

View File

@ -1,4 +1,61 @@
%---------------------------------------------------------------------------- %----------------------------------------------------------------------------
\chapter{Tesztkörnyezet} \chapter{Tesztkörnyezet}
\label{chapt:birdnetes-test} \label{chapt:birdmap-test}
%---------------------------------------------------------------------------- %----------------------------------------------------------------------------
Az alkalmazásom fejlesztésének megkönnyítése érdekében nagy hangsúlyt fektettem a tesztelhetőségre.
Helyettesíteni akartam az éles rendszer komponenseivel való kommunikációt,
hogy abban az esetben is folyni tudjon a fejlesztés, ha a rendszer épp nem elérhető.
Ezen kívül hasznos, ha az alkalmazás által feldolgozott adatok személyre szabhatóak,
hiszen sokszor olyan problémákra lehet így fényt deríteni, amelyek nem vagy csak jóval később jönnének elő az éles rendszer használata során.
A tesztelhetőség megvalósításához három szoftver komponenst kell helyettesítenem,
melyeket az alábbi szekciókban ismertetek.
%----------------------------------------------------------------------------
\section{Helyettesítő szolgáltatások}
%----------------------------------------------------------------------------
Az alkalmazásom szerver oldali szolgáltatásai a Birbnetes Command and Control (a kódban Device) és Input Service-ekkel azok OpenAPI leíróiból generált interfészein keresztül kommunikál.
Ezen intefészek mögé bármilyen implementáció regisztrálható, mely helyettesíti az éles rendszer működését.
Készítettem egy osztályt \verb+DummyDeviceAndInputService+ néven, mely a szerver indulásakor mű eszközadatokat generál egy lokális változóval állítható darabszámban,
majd ezeket egy belső listában tárolja. Az eszközök státuszát és koordinátáit egy véletlenszám generátor segítségével határozom meg.
Az osztály implementálja a Device Service interfészét, melynek metódusai az imént említett mű eszközlista elemeivel dolgoznak,
azok státuszát olvassák és módosítják.
Illetve implementálja az Input Service interfészét,
melynek metódusa bármilyen paraméterből kapott egyedi azonosító esetén visszaad egy véletlenszerűen kiválasztott bekapcsolt státuszú eszközt a listából.
Az alkalmazás által regisztrált és ezáltal használt intefész implementációi a konfigurációs fájl egy logikai értéke alapján cserélhető az éles és a helyettesítő között,
a \ref{lst:dummy-service-registration}-es listában látható módon.
\newpage
\begin{lstlisting}[style=csharp, caption=A helyettesítő és az éles szolgáltatások regisztrálásának logikája, label=lst:dummy-service-registration]
if (configuration.GetValue<bool>("UseDummyServices"))
{
services.AddTransient<IInputService, DummyDeviceAndInputService>();
services.AddTransient<IDeviceService, DummyDeviceAndInputService>();
}
else
{
services.AddTransient<IInputService, LiveInputService>();
services.AddTransient<IDeviceService, LiveDeviceService>();
}
\end{lstlisting}
%----------------------------------------------------------------------------
\section{MQTT teszt alkalmazás}
%----------------------------------------------------------------------------
Az MQTT.NET szoftvercsomag github oldalán található néhány példa a csomag használatára \cite{mqttnet-examples}.
Ezek között találtam Sepp Penner MQTTnet.TestApp.WinForm \cite{mqttnet-winforms} projektjét,
mely egy Windows Forms applikáció az említett szoftvercsomag által nyújtott funkcionalitások tesztelésére.
Indítható vele MQTT szerver, feliratkozó kliens és publikáló kliens is.
Ezek meglétével az alkalmazás képes az üzenetek manuális publikálására egy a felületen beállítható témában.
Én azonban szerettem volna az üzeneteket automatikusan bizonyos időközönként küldeni,
ezért átalakítottam az alkalmazást az igényeimnek megfelelően a \ref{fig:mqtt-tester}-es ábrán látható módon.
Elhelyeztem a fejlületen egy csúszkát, mellyel az üzenet küldés intervalluma állítható, illetve két új gombot,
melyekkel az üzenet küldő időzítő indítható és megállítható.
Az alkalmazás képes üzenetek adatainak generálására, mellyel az AI Service által publikált üzenetek modelljeivel azonos adatokat generálok.
\begin{figure}[!ht]
\centering
\includegraphics[width=150mm, keepaspectratio]{figures/MQTT-Tester.png}
\caption{Az MQTT kommunikációt tesztelő alkalmazás}
\label{fig:mqtt-tester}
\end{figure}

View File

@ -1,26 +1,27 @@
%---------------------------------------------------------------------------- %----------------------------------------------------------------------------
\chapter{A Birdnetes bemutatása} \chapter{A vizualizálni kívánt rendszer bemutatása}
\label{chapt:birdnetes-introduction} \label{chapt:birdnetes-introduction}
%---------------------------------------------------------------------------- %----------------------------------------------------------------------------
Ebben a fejezetben ismertetem a Birdnetes mikroszolgáltatás rendszerének architektúráját és az általa használt technológiákat. Az alkalmazásom célja egy létező rendszer, a Birbnetes folyamatainak vizualizálása.
Ebben a fejezetben ismertetem a Birbnetes mikroszolgáltatás rendszerének architektúráját és az általa használt technológiákat.
Részletesen kifejtem az alkalmazásom szempontjából fontos komponensek feladatát és működését. Részletesen kifejtem az alkalmazásom szempontjából fontos komponensek feladatát és működését.
%---------------------------------------------------------------------------- %----------------------------------------------------------------------------
\section{Gyors elméleti összefoglaló} \section{Elméleti összefoglaló}
%---------------------------------------------------------------------------- %----------------------------------------------------------------------------
Ez a szakasz nem azt a célt szolgálja, hogy minnél részletesebb képet mutasson az itt leírt technológiákról. A bemutatásra kerülő rendszert a tanszéken egy projekt keretén belül készítették kollégáim,
Arra sokkal jobb eszköz Pünkösdi Marcellnek és Torma Kristófnak, a Birdnetes alkótóinak TDK dolgozata\cite{birdnetes-tdk}. melyet részletesen dokumentálták korábbi nyilvános publikációkban \cite{birdnetes-tdk} \cite{birdnetes-thesis}.
Ez csupán egy rövid összefoglaló a Birdnetes működésének megértése szempontjából elengedhetetlen technológiákról és elvekről, A következőkben a rendszer által használt technológiákat és elveket csak olyan szinten részletezem,
hogy valamennyire érthetőbbek legyenek a fejezetben elhangzó kifejezések. hogy annak működése érhető legyen.
%---------------------------------------------------------------------------- %----------------------------------------------------------------------------
\subsection{Cloud, felhő} \subsection{Cloud, felhő alapú rendszerek}
%---------------------------------------------------------------------------- %----------------------------------------------------------------------------
A cloud lényegében annyit jelent, hogy a szervert, amin az alkalmazás fut, nem a fejlesztőnek kell üzemeltetnie, A cloud lényegében annyit jelent, hogy a szervert, amin az alkalmazás fut, nem a fejlesztőnek kell üzemeltetnie,
hanem valamilyen másik szervezet\footnotemark által vannak karban tartva. hanem valamilyen másik szervezet\footnotemark által vannak karban tartva.
Ez több okból is hasznos: Ez több okból is hasznos:
\begin{itemize} \begin{itemize}
\item \textbf{Olcsóbb}. Nem kell berendezéseket vásárolni, nincs üzemeltetési díj. Az egyetlen költség a bérlés, ami általában töredéke annak, amit akkor fizetnénk ha magunk csinálnánk az egészet. \item \textbf{Költséghatékonyabb}. Nem szükséges berendezéseket vásárolni, azok üzemeltetési díja nem közvetlen a fejlesztőt éri. Az egyetlen költség a bérlés, ami általában töredéke annak, amit akkor fizetnénk ha magunk csinálnánk az egészet.
\item \textbf{Gyorsabb fejlesztés}. Az alkalmazás futtatására használt szervereket általában a fejlesztő nem látja, ezekkel nem kell foglalkoznia. Ha az alkalmazásnak hirtelen nagyobb erőforrás igénye lesz, a rendszer automatikusan skálázódik. \item \textbf{Gyorsabb fejlesztés}. Az alkalmazás futtatására használt szervereket általában a fejlesztő nem látja, ezekkel nem kell foglalkoznia. Ha az alkalmazásnak hirtelen nagyobb erőforrás igénye lesz, a rendszer automatikusan skálázódik.
\item \textbf{Nagyobb megbízhatóság}. Az ilyen szolgáltatást nyújtó szervezeteknek ez az egyik legnagyobb feladata. Az alkalmazás bárhol és bármikor elérhető. \item \textbf{Nagyobb megbízhatóság}. Az ilyen szolgáltatást nyújtó szervezeteknek ez az egyik legnagyobb feladata. Az alkalmazás bárhol és bármikor elérhető.
\end{itemize} \end{itemize}
@ -29,7 +30,7 @@ Ez több okból is hasznos:
%---------------------------------------------------------------------------- %----------------------------------------------------------------------------
\subsubsection{Mikroszolgáltatások} \subsubsection{Mikroszolgáltatások}
%---------------------------------------------------------------------------- %----------------------------------------------------------------------------
A mikroszolgáltatások nem sok mindenben különböznek egy általános szolgáltatástól. A mikroszolgáltatások (microservices) nem sok mindenben különböznek egy általános szolgáltatástól.
Ugyan úgy valamilyen kéréseket kiszolgáló egységek, legyen az web kérések kiszolgálása HTTP-n keresztül Ugyan úgy valamilyen kéréseket kiszolgáló egységek, legyen az web kérések kiszolgálása HTTP-n keresztül
vagy akár parancssori utasítások feldolgozása. Az egyetlen fő különbség az a szolgáltatások felelősségköre. vagy akár parancssori utasítások feldolgozása. Az egyetlen fő különbség az a szolgáltatások felelősségköre.
A mikroszolgáltatások fejlesztésénél a fejlesztők elsősorban arra törekednek, hogy egy komponensnek minnél kevesebb feladata és függősége legyen, A mikroszolgáltatások fejlesztésénél a fejlesztők elsősorban arra törekednek, hogy egy komponensnek minnél kevesebb feladata és függősége legyen,
@ -38,20 +39,20 @@ ezzel megnő a tesztelhetőség és könyebb a skálázhatóság.
%---------------------------------------------------------------------------- %----------------------------------------------------------------------------
\subsubsection{Konténerek} \subsubsection{Konténerek}
%---------------------------------------------------------------------------- %----------------------------------------------------------------------------
A konténer technikailag semmivel sem több mint egy Linux-on futó processz amelyre különböző korlátozásokat szabtak. A konténerek az operációs rendszer virtualizációt megvalósító egyik alkalmazása.
Ilyen korlátozások lehetnek például, hogy a konténer nem látja a teljes fájlrendszert, annak csak egy kijelölt részét, Ezekre különböző korlátozások rakhatók például, hogy a konténer nem látja a teljes fájlrendszert, annak csak egy kijelölt részét,
megadható a konténer által használható processzor és memória igény vagy akár korlátozható az is, hogy a konténer hogyan használhatja a hálózatot. megadható a konténer által használható processzor és memória igény vagy akár korlátozható az is, hogy a konténer hogyan használhatja a hálózatot.
Léteznek eszközök, például a Docker \cite{docker}, mely lehetővé teszi a fejlesztők számára az ilyen konténerek könnyed létrehozását és futtatását. Léteznek eszközök, például a Docker \cite{docker}, mely lehetővé teszi a fejlesztők számára az ilyen konténerek könnyed létrehozását és futtatását.
%---------------------------------------------------------------------------- %----------------------------------------------------------------------------
\subsubsection{Kubernetes} \subsubsection{Kubernetes}
%---------------------------------------------------------------------------- %----------------------------------------------------------------------------
A Kubernetes\cite{kubernetes} az ilyen komplex konténerizált mikroszolgáltatás rendszerek menedzselésének könnyítését szolgálja. A Kubernetes \cite{kubernetes} a komplex konténerizált mikroszolgáltatás rendszerek menedzselésének könnyítését szolgálja.
Kihasználja és ötvözi az imént említett technológiák előnyeit, hogy egy robosztus rendszert alkosson. Kihasználja és ötvözi az imént említett technológiák előnyeit, hogy egy robosztus rendszert alkosson.
Használatával felgyorsulhat és automatizált lehet az egyes konténerek telepítése, futtatása, de talán a legfőbb előnye, Használatával felgyorsulhat és automatizált lehet az egyes konténerek telepítése, futtatása, de talán a legfőbb előnye,
hogy segítségével könnyedén megoldható a rendszert ért terhelési igények szerinti dinamikus skálázódás. hogy segítségével könnyedén megoldható a rendszert ért terhelési igények szerinti dinamikus skálázódás.
Azok a mikroszolgáltatások, amikre a rendszernek épp nincs szüksége, nem futnak, nem igényelnek erőforrást a szerveren, Azok a mikroszolgáltatások, amikre a rendszernek épp nincs szüksége, minimális erőforrást igényelnek a szerveren,
így nem kell utánnuk fizetni sem. Ezzel ellentétben, ha valamely szolgáltatás után hirtelen megnő az igény, így nem kell utánnuk annyit fizetni sem. Ezzel ellentétben, ha valamely szolgáltatás után hirtelen megnő az igény,
akkor az könnyedén duplikálható. akkor az könnyedén duplikálható.
%---------------------------------------------------------------------------- %----------------------------------------------------------------------------
@ -73,7 +74,7 @@ melyet használva a fejlesztők könnyedén képesek a kommunikációra képes k
%---------------------------------------------------------------------------- %----------------------------------------------------------------------------
\section{Rendszerszintű architektúra} \section{Rendszerszintű architektúra}
%---------------------------------------------------------------------------- %----------------------------------------------------------------------------
A Birdnetes fejlesztése során kifejezetten fontos szerepe volt a mikroszolgáltatás alapú rendszerek elvei követésének. A Birbnetes fejlesztése során kifejezetten fontos szerepe volt a mikroszolgáltatás alapú rendszerek elvei követésének.
A rendszer egy Kubernetes klaszterben van telepítve és több kisebb komponensből áll, melyek egymás között a HTTP és az MQTT protokollok segítségével kommunikálnak. A rendszer egy Kubernetes klaszterben van telepítve és több kisebb komponensből áll, melyek egymás között a HTTP és az MQTT protokollok segítségével kommunikálnak.
A rendszer összes szolgáltatásának van egy Open API leírója, melyet használva hamar volt egy olyan kódbázisom, amely képes volt a rendszerrel való kommunikációra. A rendszer összes szolgáltatásának van egy Open API leírója, melyet használva hamar volt egy olyan kódbázisom, amely képes volt a rendszerrel való kommunikációra.
@ -89,7 +90,7 @@ A következő alszakaszokban bemutatom az alkalmazásom szempontjából fontosab
\begin{figure}[!ht] \begin{figure}[!ht]
\centering \centering
\includegraphics[width=150mm, keepaspectratio]{figures/architecture-redesigned.png} \includegraphics[width=150mm, keepaspectratio]{figures/architecture-redesigned.png}
\caption{A Birdnetes rendszer architektúrája} \caption{A Birbnetes rendszer architektúrája. Forrás: Madárhang azonosító és riasztó felhő-natív rendszer TDK dolgozat \cite{birdnetes-tdk}}
\label{fig:birdnetes-components} \label{fig:birdnetes-components}
\end{figure} \end{figure}
@ -106,10 +107,10 @@ Tartalmaznak még egy hangszórót is, mely a madarak elijesztését szolgálja.
\label{subsect:birdnetes-input-service} \label{subsect:birdnetes-input-service}
%---------------------------------------------------------------------------- %----------------------------------------------------------------------------
A kihelyezett IoT eszközök által felvett hangfájlok ezen a komponensen keresztül érkeznek be a rendszerbe. A kihelyezett IoT eszközök által felvett hangfájlok ezen a komponensen keresztül érkeznek be a rendszerbe.
Itt történik a hanganyaghoz tartozó metaadatok lementése az Input Service saját adatbázisába. Itt történik a hanganyaghoz tartozó metaadatok lementése az Input Service saját relációs adatbázisába.
Ilyenek például a beküldő eszköz azonosítója, a beérkezés dátuma vagy a hangüzenet rendszerszintű egyedi azonosítója. Ilyenek például a beküldő eszköz azonosítója, a beérkezés dátuma vagy a hangüzenet rendszerszintű egyedi azonosítója.
Amint a szolgáltatás a berékezett üzenettel kapcsolatban elvégezte az összes feladatát, Amint a szolgáltatás a berékezett üzenettel kapcsolatban elvégezte az összes feladatát,
publikál egy üzenetet az MQTT üzenetsorra a többi kliensnek feldolgozásra. publikál egy üzenetet egy másik üzenetsorra a többi kliensnek feldolgozásra.
%---------------------------------------------------------------------------- %----------------------------------------------------------------------------
\subsubsection{AI Service} \subsubsection{AI Service}

View File

@ -2,7 +2,7 @@
\chapter{\bevezetes} \chapter{\bevezetes}
%---------------------------------------------------------------------------- %----------------------------------------------------------------------------
Szőlőtulajdonosoknak éves szinten jelentős kárt okoznak a seregélyek, akik előszeretettel választják táplálékul a megtermelt szőlőt. Szőlőtulajdonosoknak éves szinten jelentős kárt okoznak a seregélyek, akik előszeretettel választják táplálékul a megtermelt szőlőt.
Erre a problémára dolgoztak ki a tanszéken diáktársaim egy felhő alapú konténerizált rendszert, a Birdnetes-t Erre a problémára dolgoztak ki a tanszéken diáktársaim egy felhő alapú konténerizált rendszert, a Birbnetes-t
mely a természetben elkelyezett eszközökkel kommunikál, azokat vezérli. mely a természetben elkelyezett eszközökkel kommunikál, azokat vezérli.
Az eszközök bizonyos időközönként hangfelvételt készítenek a környezetükről, Az eszközök bizonyos időközönként hangfelvételt készítenek a környezetükről,
majd valamilyen formában elküldik ezeket a felvételeket a központi rendszernek, majd valamilyen formában elküldik ezeket a felvételeket a központi rendszernek,
@ -16,8 +16,8 @@ berendezését, hogy elijessze a madarakat.
%---------------------------------------------------------------------------- %----------------------------------------------------------------------------
A jelen rendszer használata során nincs vizuális visszacsatolás az esetleges riasztásokról azok gyakoriságáról A jelen rendszer használata során nincs vizuális visszacsatolás az esetleges riasztásokról azok gyakoriságáról
és a rendszer állapotáról sem. Különböző diagnosztikai eszközök ugyan implementálva lettek mint például és a rendszer állapotáról sem. Különböző diagnosztikai eszközök ugyan implementálva lettek mint például
a logolás vagy a hiba bejelentés, de ezek használata nehézkes, nem kézenfekvő. a naplózás vagy a hiba bejelentés, de ezek használata nehézkes, nem kézenfekvő.
Szükség van valamire amivel egy helyen és egyszerűen lehet kezelni és felügyelni a rendszer egyes elemeit. Szükség van egy olyan megoldásra amivel egy helyen és egyszerűen lehet kezelni és felügyelni a rendszer egyes elemeit.
%---------------------------------------------------------------------------- %----------------------------------------------------------------------------
\section{A megoldás} \section{A megoldás}
@ -31,7 +31,8 @@ az eszközöktől másodpercenként.
%---------------------------------------------------------------------------- %----------------------------------------------------------------------------
\section{A szakdolgozat felépítése} \section{A szakdolgozat felépítése}
%---------------------------------------------------------------------------- %----------------------------------------------------------------------------
A szakdolgozatom első részében, a \ref{chapt:birdnetes-introduction}. fejezetben, bemutatom a Birdnetes felépítését, az egyes komponensek közötti kapcsolatokat és a technológiát, amire épült. A szakdolgozatom első részében, a \ref{chapt:birdnetes-introduction}. fejezetben, bemutatom a vizualizálni kívánt rendszer felépítését, az egyes komponensek közötti kapcsolatokat,
valamint a vizualizációs szempontból releváns technológiákat, amire a rendszer épült.
A 3. fejezetben ismertetem a jelenleg az iparban is használt mikroszolgáltatás működését vizualizáló alternatívákat, majd a saját megoldásom tervezetét, az arra vonatkozó elvárásokat. A 3. fejezetben ismertetem a jelenleg az iparban is használt mikroszolgáltatás működését vizualizáló alternatívákat, majd a saját megoldásom tervezetét, az arra vonatkozó elvárásokat.
A 4. fejezetben az alkalmazásom által használt technológiákat mutatom be, ezzel előkészítve az 5. és 6. fejezetet, ahol ismertetem a szerver- és kliensalkalmazások felépítését. A 4. fejezetben az alkalmazásom által használt technológiákat mutatom be, ezzel előkészítve az 5. és 6. fejezetet, ahol ismertetem a szerver- és kliensalkalmazások felépítését.
A 7. és 8. fejezet az alkalmazás teszteléséről és telepítéséről szól. A 7. és 8. fejezet az alkalmazás teszteléséről és telepítéséről szól.

View File

@ -2,3 +2,11 @@
\chapter{Összefoglalás} \chapter{Összefoglalás}
\label{chapt:summary} \label{chapt:summary}
%---------------------------------------------------------------------------- %----------------------------------------------------------------------------
%----------------------------------------------------------------------------
\section{Eredmények és tapasztalatok}
%----------------------------------------------------------------------------
%----------------------------------------------------------------------------
\section{Továbbfejlesztési lehetőségek}
%----------------------------------------------------------------------------

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 61 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 80 KiB

View File

@ -97,8 +97,8 @@
double, lock, stackalloc, double, lock, stackalloc,
else, long, static, else, long, static,
enum, namespace, string}, enum, namespace, string},
morekeywords=[2]{CreateMap, ForMember, MapFrom, ReverseMap, Onlineall, GetMapper, GetUserFromDb, Map}, morekeywords=[2]{CreateMap, ForMember, MapFrom, ReverseMap, Onlineall, GetMapper, GetUserFromDb, Map, AddTransient, GetValue},
morekeywords=[3]{Id, Name, PasswordHash, PasswordSalt, Role, IsFromConfig, Url, Username, UserRole, mapper, user, response}, morekeywords=[3]{Id, Name, PasswordHash, PasswordSalt, Role, IsFromConfig, Url, Username, UserRole, mapper, user, response, services, configuration},
keywordstyle=\color{blue}, keywordstyle=\color{blue},
keywordstyle={[2]\color{orange}}, keywordstyle={[2]\color{orange}},
keywordstyle={[3]\color{lightblue}}, keywordstyle={[3]\color{lightblue}},

File diff suppressed because it is too large Load Diff