1
0
Fork 0

migrate work to latex
continuous-integration/drone/push Build is passing Details

This commit is contained in:
Torma Kristóf 2020-05-12 03:10:32 +02:00
commit 8561ad3506
Signed by: tormakris
GPG Key ID: DC83C4F2C41B1047
34 changed files with 10396 additions and 0 deletions

23
.drone.yml Normal file
View File

@ -0,0 +1,23 @@
kind: pipeline
type: docker
name: default
steps:
- name: build
image: moss/xelatex
commands:
- cd src
- make
- cd ..
- name: gitea_release
image: plugins/gitea-release
settings:
api_key:
from_secret: GITEA_APIKEY
base_url: https://git.kmlabz.com
files: pdf/*
when:
event: tag
checksum:
- sha512

98
.gitignore vendored Normal file
View File

@ -0,0 +1,98 @@
thesis.pdf
thesis-pdflatex*.pdf
thesis-xelatex*.pdf
thesis-lualatex*.pdf
## Core latex/pdflatex auxiliary files:
*.aux
*.lof
*.log
*.lot
*.fls
*.out
*.toc
## Intermediate documents:
*.dvi
# these rules might exclude image files for figures etc.
*.ps
*.eps
#*.pdf
## Bibliography auxiliary files (bibtex/biblatex/biber):
*.bbl
*.bcf
*.blg
*-blx.aux
*-blx.bib
*.run.xml
## Build tool auxiliary files:
*.fdb_latexmk
*.synctex.gz
*.synctex.gz(busy)
*.pdfsync
## Auxiliary and intermediate files from other packages:
# algorithms
*.alg
*.loa
# amsthm
*.thm
# beamer
*.nav
*.snm
*.vrb
# glossaries
*.acn
*.acr
*.glg
*.glo
*.gls
# hyperref
*.brf
# listings
*.lol
# makeidx
*.idx
*.ilg
*.ind
*.ist
# minitoc
*.maf
*.mtc
*.mtc0
# minted
*.pyg
# nomencl
*.nlo
# sagetex
*.sagetex.sage
*.sagetex.py
*.sagetex.scmd
# sympy
*.sout
*.sympy
sympy-plots-for-*.tex/
# todonotes
*.tdo
# xindy
*.xdy
/tmp
/out
*.bib~*

17
.project Normal file
View File

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>diploma</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>net.sourceforge.texlipse.builder.TexlipseBuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>net.sourceforge.texlipse.builder.TexlipseNature</nature>
</natures>
</projectDescription>

View File

@ -0,0 +1,2 @@
eclipse.preferences.version=1
encoding/<project>=utf-8

14
.texlipse Normal file
View File

@ -0,0 +1,14 @@
#TeXlipse project settings
#Thu Aug 14 18:19:20 CEST 2014
markTmpDer=true
builderNum=2
outputDir=pdf
makeIndSty=
bibrefDir=
outputFormat=pdf
tempDir=tmp
mainTexFile=diploma.tex
outputFile=diploma.pdf
langSpell=hu
markDer=true
srcDir=src

24
.travis.yml Normal file
View File

@ -0,0 +1,24 @@
os: linux
dist: bionic
language: shell
addons:
apt:
packages:
- texlive-fonts-recommended
- texlive-latex-extra
- texlive-fonts-extra
- dvipng
- texlive-latex-recommended
- texlive-xetex
before_script:
- cd src
script:
- make
before_deploy:
- cd ..
deploy:
provider: releases
token: $GITHUB_KEY
file:
- pdf/thesis.pdf
skip_cleanup: true

8
README.md Normal file
View File

@ -0,0 +1,8 @@
# knative-report-latex
2019 Szakdolgozat Latex
[![Build Status](https://travis-ci.com/tormachris/knative-report-latex.svg?branch=master)](https://travis-ci.com/tormachris/knative-report-latex)
Drone:
[![Build Status](https://drone.kmlabz.com/api/badges/tormakris/knative-report-latex/status.svg)](https://drone.kmlabz.com/tormakris/knative-report-latex)

2
pdf/.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
*
!.gitignore

240
src/.kile/thesis.kilepr.gui Normal file
View File

@ -0,0 +1,240 @@
[General]
kile_livePreviewEnabled=true
kile_livePreviewStatusUserSpecified=true
kile_livePreviewTool=LivePreview-XeLaTeX
lastDocument=content/results.tex
[document-settings,item:../../thesis-template-latex/src/thesis.tex]
Bookmarks=
Encoding=UTF-8
Highlighting=LaTeX
Highlighting Set By User=false
Indentation Mode=normal
Mode=LaTeX
Mode Set By User=false
[document-settings,item:content/abstract.tex]
Bookmarks=
Encoding=UTF-8
Highlighting=LaTeX
Highlighting Set By User=false
Indentation Mode=normal
Mode=LaTeX
Mode Set By User=false
[document-settings,item:content/acknowledgement.tex]
Bookmarks=
Encoding=UTF-8
Highlighting=LaTeX
Highlighting Set By User=false
Indentation Mode=normal
Mode=LaTeX
Mode Set By User=false
[document-settings,item:content/appendices.tex]
Bookmarks=
Encoding=UTF-8
Highlighting=LaTeX
Highlighting Set By User=false
Indentation Mode=normal
Mode=LaTeX
Mode Set By User=false
[document-settings,item:content/closing.tex]
Bookmarks=
Encoding=UTF-8
Highlighting=LaTeX
Highlighting Set By User=false
Indentation Mode=normal
Mode=LaTeX
Mode Set By User=false
[document-settings,item:content/create-functions.tex]
Bookmarks=
Encoding=UTF-8
Highlighting=LaTeX
Highlighting Set By User=false
Indentation Mode=normal
Mode=LaTeX
Mode Set By User=false
[document-settings,item:content/introduction.tex]
Bookmarks=
Encoding=UTF-8
Highlighting=LaTeX
Highlighting Set By User=false
Indentation Mode=normal
Mode=LaTeX
Mode Set By User=false
[document-settings,item:content/preparation.tex]
Bookmarks=
Encoding=UTF-8
Highlighting=LaTeX
Highlighting Set By User=false
Indentation Mode=normal
Mode=LaTeX
Mode Set By User=false
[document-settings,item:content/results.tex]
Bookmarks=
Encoding=UTF-8
Highlighting=LaTeX
Highlighting Set By User=false
Indentation Mode=normal
Mode=LaTeX
Mode Set By User=false
[document-settings,item:content/theory.tex]
Bookmarks=
Encoding=UTF-8
Highlighting=LaTeX
Highlighting Set By User=false
Indentation Mode=normal
Mode=LaTeX
Mode Set By User=false
[document-settings,item:thesis.tex]
Bookmarks=
Encoding=UTF-8
Highlighting=LaTeX
Highlighting Set By User=false
Indentation Mode=normal
Mode=LaTeX
Mode Set By User=false
[item:../../thesis-template-latex/src/thesis.tex]
open=true
order=0
[item:content/abstract.tex]
open=false
order=0
[item:content/acknowledgement.tex]
open=true
order=3
[item:content/appendices.tex]
open=true
order=2
[item:content/closing.tex]
open=false
order=6
[item:content/create-functions.tex]
open=false
order=4
[item:content/introduction.tex]
open=false
order=1
[item:content/preparation.tex]
open=false
order=3
[item:content/results.tex]
open=true
order=1
[item:content/theory.tex]
open=true
order=0
[item:thesis.kilepr]
open=false
order=-1
[item:thesis.tex]
open=false
order=8
[view-settings,view=0,item:../../thesis-template-latex/src/thesis.tex]
CursorColumn=32
CursorLine=37
Dynamic Word Wrap=false
JumpList=
TextFolding=[]
ViMarks=
[view-settings,view=0,item:content/abstract.tex]
CursorColumn=141
CursorLine=10
Dynamic Word Wrap=true
JumpList=
TextFolding=[]
ViMarks=.,1,0,[,1,0,],1,0
[view-settings,view=0,item:content/acknowledgement.tex]
CursorColumn=0
CursorLine=7
Dynamic Word Wrap=false
JumpList=
TextFolding=[]
ViMarks=.,8,233,[,8,233,],8,233
[view-settings,view=0,item:content/appendices.tex]
CursorColumn=37
CursorLine=6
Dynamic Word Wrap=false
JumpList=
TextFolding=[]
ViMarks=.,181,0,[,181,0,],181,9
[view-settings,view=0,item:content/closing.tex]
CursorColumn=29
CursorLine=4
Dynamic Word Wrap=true
JumpList=
TextFolding=[]
ViMarks=.,4,28,[,4,19,],4,28
[view-settings,view=0,item:content/create-functions.tex]
CursorColumn=121
CursorLine=1
Dynamic Word Wrap=true
JumpList=
TextFolding=[]
ViMarks=.,34,55,[,34,38,],34,57
[view-settings,view=0,item:content/introduction.tex]
CursorColumn=24
CursorLine=5
Dynamic Word Wrap=true
JumpList=
TextFolding=[]
ViMarks=.,1,0,[,1,0,],1,0
[view-settings,view=0,item:content/preparation.tex]
CursorColumn=866
CursorLine=125
Dynamic Word Wrap=true
JumpList=
TextFolding=[]
ViMarks=.,123,241,[,123,232,],123,241
[view-settings,view=0,item:content/results.tex]
CursorColumn=0
CursorLine=195
Dynamic Word Wrap=true
JumpList=
TextFolding=[]
ViMarks=.,131,180,[,131,177,],131,180
[view-settings,view=0,item:content/theory.tex]
CursorColumn=404
CursorLine=125
Dynamic Word Wrap=true
JumpList=
TextFolding=[]
ViMarks=.,66,39,[,66,39,],66,39
[view-settings,view=0,item:thesis.tex]
CursorColumn=22
CursorLine=46
Dynamic Word Wrap=false
JumpList=
TextFolding=[]
ViMarks=.,12,39,[,12,39,],12,39

68
src/Makefile Executable file
View File

@ -0,0 +1,68 @@
DOCUMENT=thesis
#MODE=-interaction=batchmode
all: clean xelatex
echo
xelatex: compile_xelatex
mv $(DOCUMENT)-xelatex.pdf ../pdf/$(DOCUMENT).pdf
compile_xelatex:
xelatex $(MODE) $(DOCUMENT)
bibtex $(DOCUMENT)
xelatex $(MODE) $(DOCUMENT)
xelatex $(MODE) $(DOCUMENT)
mv $(DOCUMENT).pdf $(DOCUMENT)-xelatex.pdf
pdflatex: compile_pdflatex
mv $(DOCUMENT)-pdflatex.pdf ../pdf/$(DOCUMENT).pdf
compile_pdflatex:
pdflatex $(MODE) $(DOCUMENT)
bibtex $(DOCUMENT)
pdflatex $(MODE) $(DOCUMENT)
pdflatex $(MODE) $(DOCUMENT)
mv $(DOCUMENT).pdf $(DOCUMENT)-pdflatex.pdf
lualatex: compile_lualatex
mv $(DOCUMENT)-lualatex.pdf ../pdf/$(DOCUMENT).pdf
compile_lualatex:
lualatex $(MODE) $(DOCUMENT)
bibtex $(DOCUMENT)
lualatex $(MODE) $(DOCUMENT)
lualatex $(MODE) $(DOCUMENT)
mv $(DOCUMENT).pdf $(DOCUMENT)-lualatex.pdf
switch_to_hungarian:
sed -i "s|^\\\input{include/thesis-en}|%\\\input{include/thesis-en}|" $(DOCUMENT).tex
sed -i "s|^%\\\input{include/thesis-hu}|\\\input{include/thesis-hu}|" $(DOCUMENT).tex
test_hu:
${MAKE} clean compile_xelatex
${MAKE} clean compile_pdflatex
${MAKE} clean compile_lualatex
mv $(DOCUMENT)-xelatex.pdf ../pdf/$(DOCUMENT)-xelatex-hu.pdf
mv $(DOCUMENT)-pdflatex.pdf ../pdf/$(DOCUMENT)-pdflatex-hu.pdf
mv $(DOCUMENT)-lualatex.pdf ../pdf/$(DOCUMENT)-lualatex-hu.pdf
switch_to_english:
sed -i "s|^\\\input{include/thesis-hu}|%\\\input{include/thesis-hu}|" $(DOCUMENT).tex
sed -i "s|^%\\\input{include/thesis-en}|\\\input{include/thesis-en}|" $(DOCUMENT).tex
test_en:
${MAKE} switch_to_english
${MAKE} clean compile_xelatex
${MAKE} clean compile_pdflatex
${MAKE} clean compile_lualatex
mv $(DOCUMENT)-xelatex.pdf ../pdf/$(DOCUMENT)-xelatex-en.pdf
mv $(DOCUMENT)-pdflatex.pdf ../pdf/$(DOCUMENT)-pdflatex-en.pdf
mv $(DOCUMENT)-lualatex.pdf ../pdf/$(DOCUMENT)-lualatex-en.pdf
${MAKE} switch_to_hungarian
test: test_hu test_en
echo
clean:
echo Cleaning temporary files...
rm -f *.aux *.dvi *.thm *.lof *.log *.lot *.fls *.out *.toc *.bbl *.blg

402
src/bib/mybib.bib Normal file
View File

@ -0,0 +1,402 @@
@misc{dockervirt,
author = {Nick Janetakis},
howpublished = {\url{https://nickjanetakis.com/blog/comparing-virtual-machines-vs-docker-containers}},
note = {Megtekintve 2019-11-20},
title = {Comparing Virtual Machines vs Docker Containers}
}
@misc{docker-overview,
howpublished = {\url{https://docs.docker.com/engine/docker-overview/}},
note = {Megtekintve 2019-11-22},
title = {Docker overview}
}
@misc{linux-namespaces,
howpublished = {\url{http://man7.org/linux/man-pages/man7/namespaces.7.html}},
note = {Megtekintve 2019-11-20},
title = {namespaces - overview of Linux namespaces}
}
@misc{cgroups,
howpublished = {\url{https://access.redhat.com/documentation/en-us/red\_hat\_enterprise\_linux/6/html/resource\_management\_guide/ch01}},
note = {Megtekintve 2019-11-20},
title = {Introduction to Control Groups (Cgroups)}
}
@misc{mikroszeviz,
author = {Farkas G{\'a}bor},
howpublished = {\url{https://ithub.hu/blog/post/A\_microservice\_architekturarol\_diohejban/}},
note = {Megtekintve 2019-11-23},
title = {A microservice architekt{\'u}r{\'a}r{\'o}l di{\'o}h{\'e}jban}
}
@misc{kubernetes-pods,
howpublished = {\url{https://kubernetes.io/docs/concepts/workloads/pods/pod/}},
note = {Megtekintve 2019-11-21},
title = {Pods}
}
@misc{kubernetes-replicaset,
howpublished = {\url{https://kubernetes.io/docs/concepts/workloads/controllers/replicaset/}},
note = {Megtekintve 2019-11-20},
title = {ReplicaSet}
}
@misc{kubernetes-deployment,
howpublished = {\url{https://kubernetes.io/docs/concepts/workloads/controllers/deployment/}},
note = {Megtekintve 2019-11-20},
title = {Deployments}
}
@misc{kubernetes-crd,
howpublished = {\url{https://kubernetes.io/docs/tasks/access-kubernetes-api/custom-resources/custom-resource-definitions/}},
note = {Megtekintve 2019-11-20},
title = {Extend the Kubernetes API with CustomResourceDefinitions}
}
@misc{kubernetes-hpa,
howpublished = {\url{https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale/}},
note = {Megtekintve 2019-11-23},
title = {Horizontal Pod Autoscaler}
}
@misc{kubeless-http,
howpublished = {\url{https://kubeless.io/docs/http-triggers/}},
note = {Megtekintve 2019-11-23},
title = {Expose and secure Kubeless functions}
}
@misc{kubeless-pubsub,
howpublished = {\url{https://kubeless.io/docs/pubsub-functions/}},
note = {Megtekintve 2019-11-23},
title = {PubSub events}
}
@misc{kubernetes-ingress,
howpublished = {\url{https://kubernetes.io/docs/concepts/services-networking/ingress-controllers/}},
note = {Megtekintve 2019-11-24},
title = {Ingress Controllers}
}
@misc{kubernetes-nginx,
howpublished = {\url{https://kubernetes.github.io/ingress-nginx/}},
note = {Megtekintve 2019-11-24},
title = {NGINX Ingress Controller}
}
@misc{github-issue-1,
howpublished = {\url{https://github.com/kubernetes-incubator/metrics-server/issues/131}},
note = {Megtekintve 2019-11-24},
title = {Metrics server issue with hostname resolution of kubelet and apiserver unable to communicate with metric-server clusterIP}
}
@misc{kubeless-quickstart,
howpublished = {\url{https://kubeless.io/docs/quick-start/}},
note = {Megtekintve 2019-11-22},
title = {Installation}
}
@misc{github-hey,
howpublished = {\url{https://github.com/rakyll/hey}},
note = {Megtekintve 2019-11-21},
title = {HTTP load generator, ApacheBench (ab) replacement, formerly known as rakyll/boom}
}
@misc{github-wrk,
howpublished = {\url{https://github.com/wg/wrk}},
note = {Megtekintve 2019-11-21},
title = {Modern HTTP benchmarking tool}
}
@misc{docker-logging,
howpublished = {\url{https://docs.docker.com/config/containers/logging/configure/}},
note = {Megtekintve 2019-11-25},
title = {Configure logging drivers}
}
@misc{kubernetes-ephemeral-storage,
howpublished = {\url{https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/\#local-ephemeral-storage}},
note = {Megtekintve 2019-11-24},
title = {Managing Compute Resources for Containers - Local ephemeral storage}
}
@misc{kubernetes-eviction,
howpublished = {\url{https://kubernetes.io/docs/tasks/administer-cluster/out-of-resource/\#eviction-policy}},
note = {Megtekintve 2019-11-27},
title = {Configure Out of Resource Handling - Eviction Policy}
}
@misc{kubernetes-nodes,
howpublished = {\url{https://kubernetes.io/docs/concepts/architecture/nodes/}},
note = {Megtekintve 2019-11-27},
title = {Nodes}
}
@misc{kubernetes-kubelet,
howpublished = {\url{https://kubernetes.io/docs/reference/command-line-tools-reference/kubelet/}},
note = {Megtekintve 2019-11-27},
title = {kubelet}
}
@misc{cloud,
howpublished = {\url{https://www.ibm.com/cloud/learn/cloud-computing}},
note = {Megtekintve 2019-11-27},
title = {Cloud computing: A complete guide}
}
@misc{faas,
howpublished = {\url{https://www.cloudflare.com/learning/serverless/glossary/function-as-a-service-faas/}},
note = {Megtekintve 2019-11-23},
title = {What Is Function as a Service (FaaS)?}
}
@misc{saas,
howpublished = {\url{https://www.infoworld.com/article/3226386/what-is-saas-software-as-a-service-defined.html}},
note = {Megtekintve 2019-11-21},
title = {What is SaaS? Software-as-a-service defined}
}
@misc{paas,
howpublished = {\url{https://www.bmc.com/blogs/saas-vs-paas-vs-iaas-whats-the-difference-and-how-to-choose/}},
note = {Megtekintve 2019-11-21},
title = {SaaS vs PaaS vs IaaS: What{\rq}s The Difference and How To Choose}
}
@misc{iaas,
howpublished = {\url{https://www.techradar.com/news/what-is-infrastructure-as-a-service}},
note = {Megtekintve 2019-11-21},
title = {What is Infrastructure-as-a-Service? Everything you need to know}
}
@misc{os-virt,
howpublished = {\url{https://www.w3schools.in/cloud-virtualization/os-virtualization/}},
note = {Megtekintve 2019-11-22},
title = {Operating System (OS) Virtualization}
}
@misc{docker-layers,
howpublished = {\url{https://medium.com/@jessgreb01/digging-into-docker-layers-c22f948ed612}},
note = {Megtekintve 2019-11-21},
title = {Digging into Docker layers}
}
@misc{kubernetes-runtimes,
howpublished = {\url{https://kubernetes.io/docs/setup/production-environment/container-runtimes/}},
note = {Megtekintve 2019-11-21},
title = {Container runtimes}
}
@misc{kubernetes-concepts,
howpublished = {\url{https://kubernetes.io/docs/concepts/}},
note = {Megtekintve 2019-11-20},
title = {Concepts}
}
@misc{kube-apiserver,
howpublished = {\url{https://kubernetes.io/docs/reference/command-line-tools-reference/kube-apiserver/}},
note = {Megtekintve 2019-11-20},
title = {kube-apiserver}
}
@misc{etcd,
howpublished = {\url{https://etcd.io/docs/v3.4.0/learning/data\_model/}},
note = {Megtekintve 2019-11-20},
title = {Data model}
}
@misc{kubernetes-api,
howpublished = {\url{https://kubernetes.io/docs/concepts/overview/kubernetes-api/}},
note = {Megtekintve 2019-11-20},
title = {The Kubernetes API}
}
@misc{kuebrnetes-controller,
howpublished = {\url{https://kubernetes.io/docs/concepts/architecture/controller/}},
note = {Megtekintve 2019-11-20},
title = {Controllers}
}
@misc{kubernetes-node-controller,
howpublished = {\url{https://unofficial-kubernetes.readthedocs.io/en/latest/concepts/nodes/node/\#node-controller}},
note = {Megtekintve 2019-11-20},
title = {Node - Node Controller}
}
@misc{kuebrnetes-components,
howpublished = {\url{https://kubernetes.io/docs/concepts/overview/components/}},
note = {Megtekintve 2019-11-20},
title = {Kubernetes Components}
}
@misc{kubernetes-scheduler,
howpublished = {\url{https://kubernetes.io/docs/concepts/scheduling/kube-scheduler/}},
note = {Megtekintve 2019-11-20},
title = {Kubernetes Scheduler}
}
@misc{kubernetes-kube-proxy,
howpublished = {\url{https://kubernetes.io/docs/reference/command-line-tools-reference/kube-proxy/}},
note = {Megtekintve 2019-11-20},
title = {kube-proxy}
}
@misc{kubernetes-service,
howpublished = {\url{https://kubernetes.io/docs/concepts/services-networking/service/}},
note = {Megtekintve 2019-11-21},
title = {Service}
}
@misc{kubernetes-volume,
howpublished = {\url{https://kubernetes.io/docs/concepts/storage/volumes/}},
note = {Megtekintve 2019-11-21},
title = {Volumes}
}
@misc{kubernetes-ingress-resource,
howpublished = {\url{https://kubernetes.io/docs/concepts/services-networking/ingress/}},
note = {Megtekintve 2019-11-25},
title = {Ingress}
}
@misc{kubeless,
howpublished = {\url{https://itnext.io/kubeless-kubernetes-native-serverless-framework-3d0f96e03add}},
note = {Megtekintve 2019-11-25},
title = {Kubeless --- Kubernetes Native Serverless Framework}
}
@misc{kubeless-api-deploy,
howpublished = {\url{https://kubeless.io/docs/advanced-function-deployment/}},
note = {Megtekintve 2019-11-25},
title = {Deploying Kubeless Functions using Kubernetes API}
}
@misc{kubeless-build,
howpublished = {\url{https://kubeless.io/docs/building-functions/}},
note = {Megtekintve 2019-11-25},
title = {Build process for functions}
}
@misc{istio-service-mesh,
howpublished = {\url{https://istio.io/docs/concepts/what-is-istio/}},
note = {Megtekintve 2019-11-26},
title = {What is Istio?}
}
@misc{istio-observer,
howpublished = {\url{https://istio.io/docs/concepts/observability/}},
note = {Megtekintve 2019-11-26},
title = {Observability}
}
@misc{istio-mgmt,
howpublished = {\url{https://istio.io/docs/concepts/traffic-management/}},
note = {Megtekintve 2019-11-26},
title = {Traffic Management}
}
@misc{knative,
howpublished = {\url{https://containerjournal.com/topics/container-management/what-is-knative-and-what-can-it-do-for-you/}},
note = {Megtekintve 2019-11-26},
title = {What is Knative, and What Can It Do for You?}
}
@misc{knative-serving,
howpublished = {\url{https://knative.dev/docs/serving/}},
note = {Megtekintve 2019-11-27},
title = {Knative Serving}
}
@misc{knative-eventing,
howpublished = {\url{https://knative.dev/docs/eventing/}},
note = {Megtekintve 2019-11-27},
title = {Knative Eventing}
}
@misc{knative-thoughts,
howpublished = {\url{https://searchitoperations.techtarget.com/news/252469607/Knative-serverless-Kubernetes-bypasses-FaaS-to-revive-PaaS}},
note = {Megtekintve 2019-11-27},
title = {Knative serverless Kubernetes bypasses FaaS to revive PaaS}
}
@misc{knative-gateweay,
howpublished = {\url{https://knative.dev/v0.9-docs/serving/samples/knative-routing-go/}},
note = {Megtekintve 2019-11-27},
title = {Routing across multiple Knative services - Go}
}
@misc{knative-autoscaler,
howpublished = {\url{https://knative.dev/docs/serving/configuring-the-autoscaler/}},
note = {Megtekintve 2019-11-27},
title = {Configuring the Autoscaler}
}
@misc{knative-autoscaler-component,
howpublished = {\url{https://github.com/knative/serving/blob/master/docs/scaling/DEVELOPMENT.md}},
note = {Megtekintve 2019-11-24},
title = {Autoscaling}
}
@misc{knative-gloo,
howpublished = {\url{https://medium.com/solo-io/gloo-by-solo-io-is-the-first-alternative-to-istio-on-knative-324753586f3a}},
note = {Megtekintve 2019-11-25},
title = {Gloo, by Solo.io, is the first alternative to Istio on Knative}
}
@misc{knative-monitoring,
howpublished = {\url{https://github.com/knative/docs/blob/master/docs/serving/accessing-metrics.md}},
note = {Megtekintve 2019-11-22},
title = {Accessing Metrics}
}
@misc{knative-crd,
howpublished = {\url{https://github.com/knative/serving/blob/master/docs/spec/overview.md}},
note = {Megtekintve 2019-11-22},
title = {Resource Types}
}
@misc{cloudlab,
howpublished = {https://cloudlab.us/technology.php},
note = {Megtekintve 2019-10-29},
title = {Cloudlab - Software Technology}
}
@misc{influxdb-performance,
author = {Syeda Noor Zehra Naqvi and Sofia Yfantidou},
howpublished = {https://cs.ulb.ac.be/public/\_media/teaching/influxdb\_2017.pdf},
note = {Megtekintve 2020-03-29},
title = {Time Series Databases and InfluxDB}
}
@misc{microservices-apply,
howpublished = {https://microservices.io/articles/applying.html},
note = {Megtekintve 2020-02-29},
title = {Applying the microservice architecture pattern language}
}
@misc{microservices-intro,
author = {Chris Richardson},
howpublished = {https://www.nginx.com/blog/introduction-to-microservices/},
note = {Megtekintve 2020-02-10},
title = {Introduction to Microservices}
}
@misc{microservices-apigateway,
author = {Chris Richardson},
howpublished = {https://www.nginx.com/blog/building-microservices-using-an-api-gateway/},
note = {Megtekintve 2020-03-20},
title = {Building Microservices: Using an API Gateway}
}
@misc{microservices-messagequeue,
author = {Alexander Nnakwue},
howpublished = {https://blog.logrocket.com/understanding-message-queuing-systems-using-rabbitmq/},
note = {Megtekintve 2020-03-10},
title = {Understanding message queuing systems using RabbitMQ}
}
@misc{microservices-timeseriesdb,
howpublished = {https://www.influxdata.com/time-series-database/},
note = {Megtekintve 2020-02-28},
title = {Time series database (TSDB) explained}
}

67
src/content/beggining.tex Normal file
View File

@ -0,0 +1,67 @@
% !TeX root = ../thesis.tex
\chapter{A laboratóriumi munka környezetének ismertetése, a munka előzményei és kiindulási állapota}
\label{sec:first}
\section{Bevezető}
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. Az ilyen kártevő madarakat hangjuk alapján detektáló rendszert dolgozott ki diplomamunkája során Nagy Kristóf, amely a mesters\'eges intelligencia eszköztárát hívja segítségül. Féléves munkánk az Ő kutatására alapul.
A Kristóf által megalkotott detekciós algoritmus gyakorlati felhasználását egy olyan rendszerben látjuk, ahol költséghatékony módon kis számítási kapacitású Internet of Things eszközök gyűjtik a hangmintákat a termőföldekről, és továbbítják egy nagyobb számítási kapacitású központi feldolgozó egység felé, amely kiértékeli őket, és figyelmeztet a veszélyre, akár képes valamilyen formában automatizáltan beavatkozni.
Féléves munkánk során a központi feldolgozó egységen dolgoztunk. Célunk olyan rendszer megalkotása volt, amely kihasználja a manapság nagy népszerűségnek örvendő felhő alapú szolgáltatások előnyeit.
A projekten ketten dolgoztunk Pünkösd Marcell-lel, aki az MI komponens mikroszolgáltatásokra darabolásával, valamint a modellek és bemeneti hangfájlok tárolásával, valamint ezzel kapcsolatos felhő-natív technológiákkal foglalkozott. Én a félév során a rendszer bemeneti és az MI által adott eredményt feldolgozó mikroszolgáltatásokkal, valamint ezek felhő-natív megoldásával foglalkoztam.
\section{Elm\'eleti \"osszefoglal\'o}
\subsection{Felhő}
A felhőalapú számítástechnikában a felhasználó elől elrejtve, a szolgáltató erőforrás halmazán elosztva megvalósított szolgáltatásokat értjük, amit jellemzően virtualizációs technológiára építenek. Három szolgáltatási modellt különböztetünk meg: SaaS (Software as a Service \cite{saas}, Szoftver, mint Szolgáltatás, például: Office 365), PaaS (Platform as a Service, Platform, mint Szolgáltatás \cite{paas}, például: Oracle Cloud Platform) és IaaS (Infrastructure as a Service \cite{iaas}, Infrastruktúra, mint Szolgáltatás, például: Microsoft Azure).
\subsection{Kubernetes}
A Kubernetes egy Go nyelven írt, nyílt forráskódú konténer orkesztrációs platform, amely képes konténerek automatikus konfigurációjára, skálázására, valamint bizonyos hibák automatikus elhárítására is. Több konténer technológiát \cite{kubernetes-runtimes} támogat, köztük a Dockert is. Nagyon népszerű, gyors fejlesztés alatt álló projekt. Emiatt felhasználói és programozói interfésze gyakran változik, megkövetelve a ráépülő megoldásoktól a hasonló sebességű fejlesztést. Jól definiált interfésze miatt sok ráépülő, azt kiegészítő projekt létezik. A Kubernetes kiváló keretet nyújt mikroszolgáltatás alapú alkalmazások fejlesztésére.
Egy Kubernetes klaszterben két típusú hosztgép lehet. Mindkettőből lehet több darab, de legalább egy-egy példány kötelező. A \ref{fig:k8s-chart} \'abr\'an l\'athat\'o, hogy egy Kubernetes klaszter \cite{kubernetes-nodes} legal\'abb egy Masterből \'es Workerből \'ep\"ul fel, ezek több komponensből állnak.
A Kubernetes Master felelős a klaszterben lezajló folyamatok \cite{kubernetes-concepts} irányításáért, a Slave-ek vagy más néven Worker-ek, valamint az alkalmazások állapotának nyilvántartásáért. A klaszterben történő eseményekre válaszul klaszterszintű választ ad - például egy pod elindítása. Egy Master node számos komponensből áll, ezek a Master egy-egy feladatáért felelnek. Több Master node futtatása esetén - úgynevezett multimaster mode - csak az API Server \cite{kubernetes-api} és az etcd \cite{etcd} komponensekből jön létre több példány, a többiből egyszerre csak egy példány lehet aktív.A Pod \cite{kubernetes-pods} egy vagy több konténert összefogó logikai hoszt. Egy podon belül lévő konténerek osztoznak a hálózaton és a háttértáron, valamint azonos a futtatási specifikációjuk. Ez azt jelenti, hogy az egy podon belüli konténerek localhost-on keresztül elérik egymást, valamint van lehetőség, hogy a konténerekben futó alkalmazások lássák a másik konténerben futó folyamatokat. Egy Kubernetes rendszerben a Pod a legkisebb egység, amit futásra lehet ütemezni.
A Deployment \cite{kubernetes-deployment} segítségével deklaratívan leírható egy alkalmazást felépítő podok és azok kívánt állapota. Lehetőség van megadni, hány replikát hozzon létre a rendszer. Hasonló módon lehet a podok állapotát frissíteni vagy egy korábbi állapotra visszatérni. Egy Deploymentben lehetőség van több pod definiálására, ami az alkalmazás komponensek lazább csatolását teszi lehetővé.
A podok bármikor törlődhetnek, valamint új példány jöhet belőlük létre \cite{kubernetes-service}. Minden pod saját IP címmel rendelkezik, viszont szükség van valamilyen módszerre, aminek segítségével nyomon lehet követni, hogy egy pod által nyújtott szolgáltatás milyen címen érhető el. Erre a problémára nyújt megoldást a Service, ami absztrakciót jelent a podok felett.
Néhány fontosabb szolgáltatás, melyet a Kubernetes nyújt:
\begin{itemize}
\item Horizontális skálázás,
\item Konfiguráció és szenzitív adatok menedzsmentje,
\item Háttértár orkesztráció
\item Szolgáltatások név alapján történő felderítése
\end{itemize}
\subsection{Mikroszolg\'altat\'asok}
A mikroszolgáltatás vagy mikroszolgáltatás szoftverarchitektúra egy alkalmazás architektúra \cite{microservices-intro}, amelynek segítségével a komplex, skálázható alkalmazások fejlesztése egyszerűbb, valamint a kódbázis növekedésével átlátható marad. Ezt úgy éri el, hogy az alkalmazást kisebb, önálló komponensekre bontja, ezeket lazán, tipikusan REST API-val, vagy üzenet sorok (message queue) segítségével illeszti egymáshoz. Az architektúra alkalmazása esetén felmerülnek bizonyos problémák, mint például az egyes szolgáltatásoknak meg kell egymást találniuk, vagy több példány futtatása esetén megoldandó a terheléselosztás is. Az így fejlesztett alkalmazások kiválóan illeszkednek a felhő alapú rendszerekhez, például a Kuberneteshez.
Mikroszolgáltatás architektúra esetében figyelni kell az úgynevezett hidden monolitra, amikor a fejlesztett alkalmazás viselkedéséből adódóan igazából nem mikroszolgáltatás alapú. Például, ha minden mikroszolgáltatás függ egytől, akkor az adott architektúra rejtett monolit jellegű.
Pozitív tulajdonsága a mikroszolgáltatásoknak, hogy jól definiált API-k \cite{microservices-apply} mellett az egyes szolgáltatások a saját adatszerkezetüket a nekik legmegfelelőbb módon képesek kezelni, nincs szükség kompromisszumokra az egész alkalmazást figyelembe véve.
\subsection{Message Queue}
A message queue, vagy üzenetsor \cite{microservices-messagequeue} egy olyan szoftver vagy szoftverkomponens, amely az egyes önálló folyamatok közötti kommunikációt teszi lehetővé aszinkron üzenetek küldésével és fogadásával. Az ilyen rendszerek aszinkron jellegének hála nem szükséges a küldőnek és a fogadónak egyszerre kapcsolatban lennie az üzenetsorral, ugyanis egy-egy üzenet addig tárolódik az üzenetsorban, amíg a fogadó fél nem fogadja azokat. Ilyen módon nem csak egy-egy kommunikáció megvalósítása lehetséges, hanem egy-több is a küldő és fogadó felek minimális módosításával, mert az üzenetek sokszorosítását az üzenetsor rendszer végzi. Egy ilyen szoftver a RabbitMQ.
A message queue elősegíti a mikroszolgáltatás alapú rendszerek fejlesztését az aszinkronitás, valamint az egy a többhöz kommunikáció megvalósításával. Ezek gyakran előforduló problémák, melyeket üzenetsor nélkül bonyolult lenne megoldani. Tegyük fel például, hogy egy küldő fél által produkált adatokat egyszerre több módon szeretnénk feldolgozni. Ennél bonyolultabb eset lehet, ha a feldolgozó nagy erőforrásigényű műveleteket végez, ami miatt szeretnénk a példányszámát skálázni. Message queue nélkül a fejlesztőknek kéne a küldő komponensben nyilván tartani, hogy kinek kell elküldeni az adatokat, valamint a fogadók példányszámának növekedésével a küldés is egyre hosszadalmasabb lenne. Ezen problémákat hivatott megoldani a message queue.
\subsection{Timeseries Adatb\'azis}
Egy timeseries adatbázis olyan adatbázis, amely idő függvényében változó adatokat vagy adatsorokat képes hatékonyan tárolni és lekérdezni. Ilyen adatbázisban tipikusan valamilyen metrika jellegű adatot tárolnak. Általában az ilyen rendszerek elválasztják a konstans, diszkrét és a folyamatos adatokat pontok halmazába. Egy timeseries adatbáziskezelő \cite{microservices-timeseriesdb} rendszer az InfluxDB, amelynek sajátossága, hogy SQL-szerű lekérdezőnyelvvel rendelkezik. Van lehetőség ún. retention policy megadására, amik segítségével megadható, milyen pontossággal lehet lekérdezni az egyes múltbéli adatokat. Minél régebbi adatokat szeretnénk kinyerni, annál kisebb pontossággal lehet azt megtenni.
Feltételezve, hogy a régebbi adatokra nincs szükségünk túl nagy részletességgel, például tized másodperces felbontással, azokat elég órás vagy még régebbi adatok esetén akár napos felbontásban összegezve is letárolni. Ilyen lehetőségeket úgynevezett retention policy-k segítségével tudunk definiálni, ami ezt a viselkedést valósítja meg, ez által csökkentve az adatbázis tárhelyigényét.
Timeseries adatbázis használata nagyban megkönnyíti különböző kimutatások, grafikonok létrehozását, hiszen az adatok tárolási módjából adódóan készen állnak a grafikon kirajzolására. Az InfluxDB aszinkron REST API-jának köszönhetően kifejezetten nagy mennyiségű adatot képes befogadni adott idő alatt.
\subsection{Api Gateway}
Mikroszolgáltatás alapú rendszerekben fontos, a felhasználók számára egységes API kiszolgálása, viszont a belső rendszerek API-jait az egyes szolgáltatások saját és egymás működését segítő módon érdemes definiálni. Így minden belső API és rendszer jól definiált lehet. Emellett lehetséges, hogy egy kliens olyan információkra kíváncsi, amelyhez több szolgáltatáshoz kell fordulnia, hogy összeszedje mindet. Ugyanígy a rendszer növekedésével az egyes klienseknek szükséges lenne ismerni az általuk használni kívánt szolgáltatások elérhetőségét.
Ezeket a problémákat hivatott feloldani az API Gateway \cite{microservices-apigateway}, melynek feladata az egységes API kialakítása. Az API Gateway feladata többek között a kliensek leválasztása a konkrét rendszerarchitektúráról, egyes mikroszolgáltatások elérési információjának ismerete a kliensek helyett és a különböző protokollt használó API-k esetében protokollfordítás.
Mindemellett fontos még az úgynevezett circuit breaker logika biztosítása, amely megnöveli a felhasználói élményt, ugyanis az API Gateway képes észlelni, ha egy mikroszolgáltatás túl sokáig nem válaszol vagy nem elérhető, és ez esetben valamilyen logika alapján választ tud adni a klienseknek.
\section{A munka állapota, készültségi foka a félév elején}
A félév elején rendelkezésünkre álltak a Nagy Kristóf által tanított modellek, az általa használt audio fájlok és a futtató szoftver. Így a mesterséges intelligencia komponense a projektnek gyakorlatilag kulcsra készen rendelkezésre állt kezdéskor. A projekt kezdésekor Linuxos és Dockerrel kapcsolatos tudásunk jelentős volt. Kubernetessel Bsc Témalaboratórium tantárgy keretein belül ismerkedtem meg, azóta napi szinten használom. Kristóf által a hangfájlok analízisére használt szoftver Python nyelven készült.
Python programnyelven Marcell és én kényelmesen tudunk fejleszteni, tanulmányaink során számos szoftvert fejlesztettünk e nyelven, ezért úgy döntöttünk, hogy a mikroszolgáltatások nagy részét is e nyelven fejlesztjük le.

132
src/content/work.tex Normal file
View File

@ -0,0 +1,132 @@
% !TeX root = ../thesis.tex
\chapter{Az elvégzett munka és eredmények ismertetése}
\label{sec:second}
\section{Rendszer tervezése}
A \ref{fig:birbnetes-architecture} ábrán látható architektúrát logisztikai okokból kifolyólag a mesterséges intelligenciát megvalósító szoftver ismerete nélkül alkottuk. Úgy tekintettünk rá, mint egy fekete dobozra, amely képes fájlokat beolvasni valamilyen módon és a vizsgálat eredményét is közli a felhasználóval valamilyen módon. Fontos szempont volt, hogy az egyes mikroszolgáltatások belső működése tetszőlegesen refaktorálható legyen anélkül, hogy az másik komponensben módosítást tenne szükségessé.
Jelenleg a rendszer csővezetékként működik, egyik végén beérkeznek a bemeneti adatok, amin a mesterséges intelligencia klasszifikációt hajt végre, majd ennek az eredményét továbbítja a kimenetet feldolgozó szolgáltatások felé, akik a pipeline másik vége.
\begin{figure}[!ht]
\centering
\includegraphics[width=120mm, keepaspectratio]{figures/architecture-simple.png}
\caption{A rendszer komponensei \'es azok k\"oz\"otti kapcsolatok}
\label{fig:birbnetes-architecture}
\end{figure}
A rendszer tervezésekor célunk volt a bővíthetőség minél jobb támogatása, ezért megadtuk a lehetőségét annak, hogy a beérkező hangfájlt több mesterséges intelligencia is megvizsgálja párhuzamosan, az ilyen lehetséges elágazási pontokon üzenetsort használtunk. Így, ha a jelenleg egyenes pipeline-t szeretnénk leágaztatni, a megfelelő helyekre fel kell iratkoztatni az új komponenseket. Lentebb olvashatók részletesen az általam javasolt komponensek.
\subsection{Input Service}
Fogadja a bemeneti hangfájlokat, ezeket továbbítja a hosszú idejű tárolást megvalósító Storage Service felé. Ezen felül ellátja egy egyedi azonosítóval is és minimális validációt végez.
Kapcsolódik egy relációs adatbázishoz, amelyben lementi az információkat, amelyeket fogadott a hangfájllal együtt. Ezeket összerendeli az egyedi azonosítóval, amelyet ő adott a hangfájlnak.
Miután a Storage Service lementette a hangfájlt, a service publikál egy üzenetet az üzenetsorba, amely tartalmazza a mentett hangfájl címkéjét. A feliratkozott komponensek ezekután a tag használatával letölthetik a lementett hangot és folytathatják rajta a feldolgozást.
\subsection{Independent Results Service}
Feldolgozza a mesterséges intelligencia kimenetét, letárolja azt egy tetszőleges relációs adatbázisban. Lekérdezhető tőle - egymástól függetlenül - az egyes hangfájlokról hozott döntés. Az itt tárolt adatok összevethetők az Input Service-ben található adatokkal. Ez segíthet a hiba keresésben, valamint az itt található adatok segítségével a rendszerbe tanulás illeszthető.
\subsection{Results Statistics Service}
Feldolgozza a mesterséges intelligencia kimenetét. Az eredményeket egy idősoros adatbázisban tárolja le. Ez az adatbázis sokkal alkalmasabb és hatékonyabb az eredmények "mérés" szerű kezelésén, de cserébe nem lehet lekérni tőle egyesével a hangfájlokról hozott döntéseket. Használata lehetővé teszi dashboardok készítését, ahol heat-map vagy más grafikonok segítségével tájékozódhat a felhasználó.
\section{API-k tervez\'ese}
Mivel a projekten ketten dolgoztunk, fontos volt számunkra az egyes szolgáltatások API-jainak definiálása. Erre Swagger-t használtunk, ami egy jól dokumentált, nyitott definíciós eszköztár RESTful API-k leírására. Itt lényeges volt számomra, hogy az elvárt bemeneti formátumon felül minden lehetséges visszatérési státusz kódja és üzenetformátuma dokumentálva legyen az általam fejlesztett szolgáltatásoknak, ugyanis ez megkönnyíti a fejlesztést és a lehetséges félreértéseket is elkerüli. A rendszerben bevezettük a címkék vagy tagek fogalmát, amely egyedi azonosítója minden beküldött hangfájlnak. Az egyes tagekhez tárolt metaadatokat is le lehet kérdezni egy endpoint segítségével.
Az Input Service API-ján kifejezetten sokat gondolkodtam, ugyanis a fájlok és az azokat kísérő metaadatok fogadására több alternatíva létezik. Állományok feltöltése miatt adódik a http mulipart form használata, viszont a metaadatok kerülhetnek külön részbe a kérésnek, vagy egybe valamilyen JSON formátumú adatstruktúrában. Végül az utóbbi mellett döntöttem, ugyanis Pythonhoz rendkívül kiforrott JSON sémavalidációs könyvtárak érhetők el, ezzel szemben ilyen eszközt, ami elegánsan képes multipart formok sémáját validálni, nem találtam.
A Results Statistics Service nem szolgál ki REST-es API-t, csupán fogadja a message queue-n érkező eredményeket és azokat letárolja a hozzá kapcsolódó timeseries adatbázisban.
Ez előbbivel szemben az Independent Results Service egyik legfontosabb tulajdonsága, hogy egy REST API-t nyújt. Itt kihasználva a relációs adatbázis által nyújtott lehetőségeket definiáltam olyan végpontokat, melyek visszaadnak minden pozitív vagy negatív eredményt, valamint adott dátum előtt, illetve után rögzített eredményeket. A cél az volt, hogy le lehessen kérdezni azegyes hangfájlokhoz tartozó adatokat, és ezt egy olyan endpoint segítségével lehet megtenni, amelyben a hangfájl tagje alapján azonosítható ez be.
\section{Fejleszt\'es folyamata}
Fejlesztés során igyekeztem arra figyelni, hogy az általam írt kód helyes legyen, ezért a projekthez beállítottam egy folyamatos integrációs rendszert, amely minden git commitra lefuttatott teszteket, és amennyiben a kód átment ezeken a tesztken, container image-et épített és publikált az általam beállított container registry-be. Később a Kubernetes rendszerbe is innen kerültek be az egyes mikroszolgáltatások.
Az egyes komponensek futásakor keletkező kivételeket és hibaeseményeket egy központi rendszerben gyűjtöttük, ami képes volt kimutatások készítésére és egyes eseményekről értesítések küldésére. Mivel a rendszer Kubernetesben futott, jelentősen megkönnyítette a hibakeresési folyamatot, hogy a rendszer képes volt rámutatni arra a kódsorba, amely a hibát kiváltotta, valamint az aktuális környezetet és a hibaüzenetet is tárolta.
\subsection{Input Service}
Az Input Service implementálásához a Flask nevű Python web mikroframeworköt használtam. A Flask csak a webes rétegét valósítja meg egy alkalmazásnak, ORM-et (Object-relation mapping) vagy validációt nem nyújt a fejlesztőknek, viszont egyszerűen kiegészíthető tetszőleges beépülő modulokkal. Ebben a mikroszolgáltatásban viszont szükség volt adatbázissal történő kommunikációra és a kapott adatok sémájának validációjára.
Előbbire az SQLAlchemy nevű könyvtárat használtam, melynek kényelmes Flask-os pluginja van. Emiatt csupán definiálnom kellett az általam használt sémát, megadni a Flask-nak az adatbázis elérési helyét, ez után tetszőleges metódusban lehetett lekérdezni, beilleszteni és frissíteni rekordokat az adatbázisba.
Lényeges feladatom volt a konkrét adatbázis motor kiválasztása e. Számos népszerű adatbázis motort megvizsgáltam, hogy az általuk nyújtott szolgáltatások mennyire felelnek meg az igényeinknek. Az első és legfontosabb szempont az volt, hogy Kubernetesbe jól illeszkedjen, a másik lényeges szempont a kis erőforrás lábnyom.
Az első általam vizsgált adatbázis motor a MySQL volt. Ez az első szempontnak megfelelt, lévén, hogy ez az egyik legnépszerűbb adatbázis motor Kubernetesben futtatása megoldott. Emellett relatíve alacsony az erőforrás lábnyoma. Mindezek mellett viszont nem a MySQL-t tartottam a lehető legjobb választásnak a szegényes funkciókészlete miatt.
Kifejezetten tetszetős volt számomra a Microsoft által fejlesztett SQL Server, amit a legfrissebb kiadásban mélyen integráltak a Kubernetesbe és az általa nyújtott szolgáltatások is kedvezőek, viszont sajnos igen sok erőforrást használ.
Az ideális kompromisszumot a képességek, erőforrásigény és Kubernetesbe illeszthetőség között a Postgresql jelentette, amely egy népszerű, nyílt forráskódú adatbázis motor, emellett az SQLAlchemyvel is jól integrálható.
Mivel ez volt az első mikroszolgáltatás, amely üzenetsort is kellett használjon, itt is én választottam ki az általunk használt megoldást. Itt is megvizsgáltam számos megoldást. Ebben az esetben is fontos szempont volt a Kubernetesbe integrálhatóság, viszont funkciók terén csak annyi megkötésünk volt, hogy legyen képes egy küldő, több fogadó típusú üzenetsorok kezelésére.
A KubeMQ tűnt először az egyik legjobb csomagnak, ugyanis telepítése Kubernetesbe egyszerű, üzemeltetése pedig egyszerű. Ellene szól viszont, hogy az ingyenesen elérhető változata havi szinten limitált számú üzenetet képes továbbítani, emiatt használatát elvetettük.
Kipróbáltam az Apache Alapítvány több üzenetsor megoldását is. Az egyik ilyen az egyik legnépszerűbb message queue megoldás, a Kafka. Ez viszont timeseries üzenetek továbbítására specializálódott, ami kifejezetten nem a mi use-case-ünk. A másik az ActiveMQ, amely képességei lefedik a mi igényeinket, de Python-hoz másodrangú eszköztára van csak, a fejlesztők a Java-ban található Java Message Service API-ra koncentrálnak.
A választás végül a RabbitMQ-ra esett, amely egy Erlang nyelven készült, nyílt forráskódú megoldás. Elsőrangú Python könyvtárt készítettek hozzá, a Kubernetesbe telepítése Helm chart segítségével lehetséges. A fejlesztést megkönnyíti az adminisztrációs felülete, ahol minden üzenetsoron minden üzenetet, valamint ezekről statisztikákat is meg lehet tekinteni. Az egyes üzenetsorokhoz megadható a bejelentkezés szükségessége, így a mikroszolgáltatások biztonsági szempontból történő elválasztása is lehetséges. Sajnos nem létezik hozzá működő Flask plugin, ezért a kapcsolat életben tartását kézzel kellett elvégeznem. Ennek ellenére úgy gondoltam, hogy továbbra is a RabbitMQ a legjobb message queue megoldás, ami kielégíti minden igényünk.
A metaadatok validációjára Marshmallow-t használtam. Ez a könyvtár képes előre definiált séma alapján JSON-ből betölteni adatokat, valamint szerializálni őket. A fejlesztés során előkerült egy olyan probléma, hogy az SQLAlchemy segítségével lekérdezett rekordokat a Flask nem tudta automatikusan JSON-ba szerializálni a Python beépített szerializálójával. Erre is megoldást jelentett a Marshmallow, ugyanis létezik egy Marshmallow-SQLAlchemy nevű könyvtár, amely definiál olyan SQLAlchemy sémaosztályokat, amiket a Marshmallow képes JSON-be szerializálni és betölteni.
\subsection{Independent Results Service}
A mikroszolgáltatás architektúra lehetővé teszi divergens technológiák együttműködését. Ezt kihasználva az Independent Results Service mikroszolgáltatást nem Python, hanem Kotlin nyelven írtam. Ez azt jelentette, hogy a teljes eszköztár, melyet megismertem nem voltak használhatók e komponens fejlesztése esetében, viszont utóbbi programnyelvben elérhető coroutine-ok olyan előnyt jelentettek, ami miatt megérte megtanulni az új eszköztár használatát. Például a Kotlin esetében a webes logika megvalósítására a legnépszerűbb könyvtár a Ktor, melynek szolgáltatáskészlete hasonlít a Flaskhoz.
A Kotlin egy a Java Virtual Machine-t használó modern programnyelv, amelynek célja a Java hiányosságait, hátrányait javítani. A Java-hoz képest a legnagyobb különbség a null-safe viselkedése és a coroutine-ok használata. Utóbbi használatával könnyedén fejleszthető nagy teljesítményű alkalmazást. Mivel a Kotlin egy fiatal nyelv, valamint leginkább Android appok fejlesztésére használják, így az egyes könyvtárak nem feltétlen olyan fejlettek, mint a Python esetében. Ilyen volt például az általam használt ORM megoldás, az Exposed. Ennek előnye, hogy jól illeszkedik a kotlinos programozási paradigmákhoz, viszont nem képes connection poolingra másik library-k használata nélkül, a Postgresql-t viszont natívan támogatja.
Bár a Kotlin fiatal nyelv, mivel a kód JVM bájtkóddá fordul, minden Java nyelven írott kóddal együtt tud működni egy Kotlin nyelven írt alkalmazás. Ennek hála a a Kotlin RabbitMQ támogatása elsőrangú. A Javához készült RabbitMQ könyvtár használata mellett szükség volt egy olyan library-re, amely lehetővé teszi coroutine-t használó üzenetfeldolgozó metódusok írását.
A Kotlin használata akkor fizetődött ki, miután a REST API-t kiszolgáló réteget megírtam és az alkalmazásba kellett illesszem a message queuetól üzeneteket fogadó kódot. Itt egy tradicionális programnyelvben problémába ütköztem volna, ugyanis az üzenet feldolgozása vagy blokkolná a webes kérések kiszolgálását vagy bonyolult többszálú logikát kellene megvalósítsak. Ez esetben viszont elég volt egy új objektum létrehozása, amiben definiáltam a coroutine-t.
A mikroszolgáltatás fejlesztése során sok időt töltöttem az adatbázis réteg fejlesztésével, mert nehézkesen tudtam csak működésre bírni az Exposed könyvtárat a connection poolinggal és a JSON szerializációval.
\subsection{Result Statistics Service}
Timeseries adatbázist a rendszerben csak ez a mikroszolgáltatás használ, így ennek kiválasztása ezen komponens fejlesztése során történt. A kiválasztás során a szempontok csak a mikroszolgáltatás saját szempontjai voltak. Próbáltam kiválasztani a lehető legegyszerűbb megoldást, ugyanis nincs szükség például komplex adatstruktúrák támogatására, viszont a retention policy-k használatának lehetősége és a nagy teljesítmény követelmény volt.
Először a Prometheust vizsgáltam meg, amely egy népszerű timeseries adatbázis rendszer, amit főleg metrikák tárolására használnak. Emiatt támogatja a retention policy-ket, viszont nagy erőforrás lábnyomba van és a lehetőségeinek kis százalékát tudnám csak kihasználni.
Az InfluxDB egy nyílt forráskódú, nagy teljesítményű timeseries adatbázis. Nagy előnye az egyszerű API-ja és jó támogatottsága. Kellően alacsony az erőforrásigénye és SQL-szerű lekérdezőnyelve kedvező opcióvá teszi. Kifejezetten könnyű hozzá Grafana segítségével grafikonok, dashboardok készítése.
Végezetül az OpenTSDB timeseries adatbázist vizsgáltam meg. Könnyen lehet vele grafikus interfészén grafikonokat készíteni, viszont ezek az opciók limitáltibbak, mint a Grafana esetében, valamint az adatbázis rendszer Hadoop alapokon nyugszik, ami azt jelenti, hogy a projekt jelenlegi skáláján nem ez a legjobb választás.
A Result Statistics Service mikroszolgáltatást először C\# nyelven kezdtem el megvalósítani, ugyanis .NET fejlett aszinkron API-val rendelkezik és eredeti elképzeléseim szerint erre szükség lett volna annak érdekében, hogy az eredményeket megfelelő sebességgel le tudja tárolni a mikroszolgáltatás, viszont rövidesen olyan problémába ütköztem, amely megakadályozta a .NET Core platform használatát, ami az InfluxDB API-ját implementáló könyvtárak és azok dokumentációjának rossz minősége volt. Ez jelenthette volna az InfluxDB leváltását, viszont úgy gondoltam az itt ismertetett szakmai érvek erősek voltak annak megtartása mellett. Emiatt döntöttem úgy, hogy inkább a programnyelvet cserélem le Pythonra.
E mikroszolgáltatás esetében az üzleti logika eleve nem bonyolult, az üzenetsoron érkező üzenetben található adatot az aktuális idővel megcímkézve be kell illeszteni az InfluxDB-be. Ezt viszont szerettem volna aszinkron módon megtenni, ugyanis elképzelhető az üzenetsoron nagy számú üzenet érkezése rövid idő alatt. Ennek implementációját is elvetettem, ugyanis az InfluxDB, ahogy kutatásom során kiderült, olyan nagy számú kérést képes feldolgozni rövid idő alatt, hogy nem érné meg aszinkron logikával bonyolítani a mikroszolgáltatást \cite{influxdb-performance} .
\section{Kubernetes}
Az általunk használt Kubernetes klaszter egy fizikai számítógépen futott négy virtuális gépen. A rendszerben egy Master node és három Worker node volt. A tárterületet ugyanerről a fizikai gépről osztottuk ki a fürt számára NFS-sel, a Persistent Volume-okat statikusan definiáltuk. Az általam fejlesztett mikroszolgáltatásokat és az azokhoz kapcsolódó komponenseket magam telepítettem a klaszterbe.
Az általunk fejlesztett rendszer számára létrehoztam egy Kubernetes névteret, ahova telepítettük az általunk fejlesztett mikroszolgáltatásokat és minden általuk használt komponenst.
Minden mikroszolgáltatáshoz tartozó Kubernetes API obejktumokat leíró YAML állományt hasonlóan készítettem el. Magát az alkalmazást egy Deployment segítségével telepítettem a klaszterbe. Az egyes mikroszolgáltatások környezeti változók segítségével konfigurálhatók. Ezeket ConfigMap segítségével állítottam be. Mivel el kell érjék egymást a szolgáltatások, szükség volt Service objektum definiálása, ezek viszont ClusterIP típusúak voltak, hiszen a külvilágnak nem szabad közvetlen elérni egyes végpontokat.
A RabbitMQ telepítését Helm segítségével végeztem. Egészen pontosan a Helm legújabb, hármas verzióját használva, ami használatához nincs szükség semmilyen extra komponens telepítésére a klaszterbe. Az általam használt Helm Chartban lehetőség volt megadni a PersitentVolumeClaim (PVC) méretét, melyet 10 gigabájtra állítottam.
A PostgreSQL számára saját Deploymentet definiáltam, ugyanis a fejlesztők által készített konténer image ezt könnyedén elvégezhetővé teszi. Megadtam minden adatbázis számára egy-egy 10 gigabájtos PVC-t, valamint a saját komponenseimhez hasonlóan a konfigurációs környezeti változókat ConfigMapben adtam meg. Itt is szükség volt hálózati kommunikációra, ezért az adatbázis motoroknak is adtam meg saját ClusterIP típusú Service objektumot.
Az InfluxDB telepítése hasonló lépéseket követelt meg, csupán más paraméterekkel.
Mint azt az első fejezetben írtam, a mikroszolgáltatás alapú rendszerekhez gyakran használnak API Gateway-t. Ennek kiválasztását és telepítését is én végeztem. Megvizsgáltam olyan megoldásokat, amik Kubernetes Ingress Controllerként viselkednek és olyanokat is, amelyeket szimpla Kubernetesbe telepített alkalmazásként lehet használni.
Az egyik legnépszerűbb API Gateway, ami az utóbbi kategóriába sorolható a Netflix által Java nyelven fejlesztett Zuul. Ezt a megoldást nagy számú mikroszolgáltatásokból álló rendszerekhez tervezték, amelyek nagy számú kérést kell kiszolgáljanak. Konfigurációja Spring Boot segítségével lehetséges YAML fájllal, vagy Java kód alapú konfigurációval.
Alternatív a Spring projekt által készített Spring Cloud Gateway. Ez gyakorlatilag ugyanazon szolgáltatásokat nyújtja, mint a Zuul, viszont támogatja a reaktív programozási paradigmát, az általunk fejlesztett rendszer viszont nem ezt követi.
A Kubernetes-natív kategóriába sorolható API Gatewayek közé tartozik a Kong, ami a háttérben NGINX-et használ, annak konfigurációját generálja. Támogat minden fontosabb funkciót, melyet egy API Gateway-től elvárhatunk. Ilyen például a rate limiting, circuit breaking, fallback és autentikációs képességek. Előnye, hogy az Ingress objektumban lehet konfigurálni az egyes endpointokat.
Alternatíva az Ambassador használata, ami a háttérben Envoy-t használ. Szintén támogat minden fontos képességet, viszont hátránya, hogy konfigurációja label-be ágyazott YAML segítségével lehetséges. Ez nem kívánatos, hiszen erre Custom Resource Definitionöket hibabiztosabban és flexibilisebben lehetne használni.
Megvizsgáltam továbbáa Gloo-t, aminek különleges előnye, hogy képes automatikusan alkalmazások API-jának automatikus felismerésére OpenAPI definíciók segítségével, amiket mi a fejlesztési folyamat elején definiáltunk.
A választásom végül a Kong-ra esett, mert számomra szimpatikus volt, hogy egy egyszerű NGINX webszerver segítségével oldja meg funkcióit. A telepítést ez után az Ingress objektumok definiálásával és a klaszterbe telepítésével folytattam.
\section{Elkészült rendszer próbája}
A mikroszolgáltatások fejlesztése közben önmagukban teszteltem őket és próbáltam ki működésüket. A fejlesztési folyamat végén viszont közösen kipróbáltuk, hogy működnek együtt az általunk fejlesztett komponensek, milyen hibák jönnek itt elő.
Előkerültek olyan hibák, amik eltérő feltételezésekből következnek. Ezen esetekben egyeztettük a konvencióink, majd a javítás után újra teszteltük a működést.
\section{\"Osszefoglal\'as}
A félév során számos új tudással bővültem, többek között elsajátítottam a Kotlin nyelv alapszintű működését, valamint megtanultam, hogy kell mikroszolgáltatás alapú rendszert tervezni, fejleszteni és az ezek Kubernetesbe telepítésével kapcsolatos megontolásokat is részletesebben megismertem. Több technológia működésébe nyertem betekintést, ezzel tágítva az eszköztáram.
Elkészítettem több újra használható Kubernetes Deploymentet és a hozzájuk tartozó egyéb API objektumokat, ami a későbbi munkám során segítségemre lehet. Megterveztem és végrehajtottam az általunk fejlesztett komponensek automatikus Kubernetesbe telepítését és a frissítések automatikus elvégzését.
Marcell-lel közösen egy majdnem kész terméket fejlesztettünk le, amire büszke vagyok. A munkafolyamataink részletesen dokumentáltuk, így amennyiben a jövőben a projektet folytatni kívánja valaki az itt leírtak és az általunk felhalmozott dokumentáció alapján hatékonyan megteheti.
A továbbiakban véleményem szerint érdekes lehet a kialakított rendszert teljesítmény, áteresztőképesség szempontjából megvizsgálni, mire képes és hogyan viselkedik komolyabb terhelés alatt.

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

BIN
src/figures/bme_logo.pdf Normal file

Binary file not shown.

7
src/figures/convert.cmd Normal file
View File

@ -0,0 +1,7 @@
@echo off
for %%j in (*.eps) do (
echo converting file "%%j"
epstopdf "%%j"
)
echo done .

1910
src/huplain.bst Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,32 @@
\selectlanguage{magyar}
\pagenumbering{gobble}
%--------------------------------------------------------------------------------------
% Nyilatkozat
%--------------------------------------------------------------------------------------
\begin{center}
\large
\textbf{HALLGATÓI NYILATKOZAT}\\
\end{center}
Alulírott \emph{\vikszerzoVezeteknev{} \vikszerzoKeresztnev}, szigorló hallgató kijelentem, hogy ezt a \vikmunkatipusat{} meg nem engedett segítség nélkül, saját magam készítettem, csak a megadott forrásokat (szakirodalom, eszközök stb.) használtam fel. Minden olyan részt, melyet szó szerint, vagy azonos értelemben, de átfogalmazva más forrásból átvettem, egyértelműen, a forrás megadásával megjelöltem.
Hozzájárulok, hogy a jelen munkám alapadatait (szerző(k), cím, angol és magyar nyelvű tartalmi kivonat, készítés éve, konzulens(ek) neve) a BME VIK nyilvánosan hozzáférhető elektronikus formában, a munka teljes szövegét pedig az egyetem belső hálózatán keresztül (vagy autentikált felhasználók számára) közzétegye. Kijelentem, hogy a benyújtott munka és annak elektronikus verziója megegyezik. Dékáni engedéllyel titkosított diplomatervek esetén a dolgozat szövege csak 3 év eltelte után válik hozzáférhetővé.
\begin{flushleft}
\vspace*{1cm}
Budapest, \today
\end{flushleft}
\begin{flushright}
\vspace*{1cm}
\makebox[7cm]{\rule{6cm}{.4pt}}\\
\makebox[7cm]{\emph{\vikszerzoVezeteknev{} \vikszerzoKeresztnev}}\\
\makebox[7cm]{hallgató}
\end{flushright}
\thispagestyle{empty}
\vfill
\clearpage
\thispagestyle{empty} % an empty page
\selectthesislanguage

54
src/include/guideline.tex Normal file
View File

@ -0,0 +1,54 @@
\selecthungarian
%--------------------------------------------------------------------------------------
% Rovid formai es tartalmi tajekoztato
%--------------------------------------------------------------------------------------
\footnotesize
\begin{center}
\large
\textbf{\Large Általános információk, a diplomaterv szerkezete}\\
\end{center}
A diplomaterv szerkezete a BME Villamosmérnöki és Informatikai Karán:
\begin{enumerate}
\item Diplomaterv feladatkiírás
\item Címoldal
\item Tartalomjegyzék
\item A diplomatervező nyilatkozata az önálló munkáról és az elektronikus adatok kezeléséről
\item Tartalmi összefoglaló magyarul és angolul
\item Bevezetés: a feladat értelmezése, a tervezés célja, a feladat indokoltsága, a diplomaterv felépítésének rövid összefoglalása
\item A feladatkiírás pontosítása és részletes elemzése
\item Előzmények (irodalomkutatás, hasonló alkotások), az ezekből levonható következtetések
\item A tervezés részletes leírása, a döntési lehetőségek értékelése és a választott megoldások indoklása
\item A megtervezett műszaki alkotás értékelése, kritikai elemzése, továbbfejlesztési lehetőségek
\item Esetleges köszönetnyilvánítások
\item Részletes és pontos irodalomjegyzék
\item Függelék(ek)
\end{enumerate}
Felhasználható a következő oldaltól kezdődő \LaTeX diplomatervsablon dokumentum tartalma.
A diplomaterv szabványos méretű A4-es lapokra kerüljön. Az oldalak tükörmargóval készüljenek (mindenhol 2,5~cm, baloldalon 1~cm-es kötéssel). Az alapértelmezett betűkészlet a 12 pontos Times New Roman, másfeles sorközzel, de ettől kismértékben el lehet térni, ill. más betűtípus használata is megengedett.
Minden oldalon -- az első négy szerkezeti elem kivételével -- szerepelnie kell az oldalszámnak.
A fejezeteket decimális beosztással kell ellátni. Az ábrákat a megfelelő helyre be kell illeszteni, fejezetenként decimális számmal és kifejező címmel kell ellátni. A fejezeteket decimális aláosztással számozzuk, maximálisan 3 aláosztás mélységben (pl. 2.3.4.1.). Az ábrákat, táblázatokat és képleteket célszerű fejezetenként külön számozni (pl. 2.4. ábra, 4.2. táblázat vagy képletnél (3.2)). A fejezetcímeket igazítsuk balra, a normál szövegnél viszont használjunk sorkiegyenlítést. Az ábrákat, táblázatokat és a hozzájuk tartozó címet igazítsuk középre. A cím a jelölt rész alatt helyezkedjen el.
A képeket lehetőleg rajzoló programmal készítsék el, az egyenleteket egyenlet-szerkesztő segítségével írják le (A \LaTeX~ehhez kézenfekvő megoldásokat nyújt).
Az irodalomjegyzék szövegközi hivatkozása történhet sorszámozva (ez a preferált megoldás) vagy a Harvard-rendszerben (a szerző és az évszám megadásával). A teljes lista névsor szerinti sorrendben a szöveg végén szerepeljen (sorszámozott irodalmi hivatkozások esetén hivatkozási sorrendben). A szakirodalmi források címeit azonban mindig az eredeti nyelven kell megadni, esetleg zárójelben a fordítással. A listában szereplő valamennyi publikációra hivatkozni kell a szövegben (a \LaTeX-sablon a Bib\TeX~segítségével mindezt automatikusan kezeli). Minden publikáció a szerzők után a következő adatok szerepelnek: folyóirat cikkeknél a pontos cím, a folyóirat címe, évfolyam, szám, oldalszám tól-ig. A folyóiratok címét csak akkor rövidítsük, ha azok nagyon közismertek vagy nagyon hosszúak. Internetes hivatkozások megadásakor fontos, hogy az elérési út előtt megadjuk az oldal tulajdonosát és tartalmát (mivel a link egy idő után akár elérhetetlenné is válhat), valamint az elérés időpontját.
\vspace{5mm}
Fontos:
\begin{itemize}
\item A szakdolgozatkészítő / diplomatervező nyilatkozata (a jelen sablonban szereplő szövegtartalommal) kötelező előírás, Karunkon ennek hiányában a szakdolgozat/diplomaterv nem bírálható és nem védhető!
\item Mind a dolgozat, mind a melléklet maximálisan 15~MB méretű lehet!
\end{itemize}
\vspace{5mm}
\begin{center}
Jó munkát, sikeres szakdolgozatkészítést, ill. diplomatervezést kívánunk!
\end{center}
\normalsize
\selectthesislanguage

View File

@ -0,0 +1,77 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Ezt ne piszkáld!!!!
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\pagestyle{myheadings} % legyen fejléc
\newcommand{\onlabcim}{
\begin{center}
\huge{\textbf{Önálló laboratórium beszámoló}}
\small{Távközlési és Médiainformatikai Tanszék}
\end{center}
}
% Argumentumok: #1=Név, #2=Neptunkód, #3=szakirány, #4=email, #5 konzulens-1, #6 konzulens-1-email, #7 konzulens-2, #8 konzulens-2-email
\newcommand{\onlabszerzo}[8]{
\begin{center}
\begin{tabular}{ r l }
készítette: & \textbf{#1} \\
& \href{mailto:#4}{\textbf{#4}} \\
neptun-kód: & \textbf{\texttt{#2}} \\
ágazat: & \textbf{#3} \\
konzulens: & \textbf{#5} \\
& \href{mailto:#6}{\textbf{#6}} \\
konzulens: & \textbf{#7} \\
& \href{mailto:#8}{\textbf{#8}} \\
\end{tabular}
\end{center}
}
% % Argumentumok: #1=Név, #2=email
% \newcommand{\konzulens}[2]{
% \noindent\textbf{Konzulens:} #1
% \newline\emph{Email cím:}\/ \href{mailto:#2}{#2}
% \newline
%
% }
% Argumentumok: #1=Tanév (xxxx/xx alakban, #2=félév (pont nélkül)
\newcommand{\tanevfelev}[2]{
\large\noindent\textbf{Tanév:} #1. tanév, #2. félév
\newline
}
% Argumentumok: #1=téma címe
\newcommand{\feladatcim}[1]{
\large\noindent\textbf{Téma címe: #1}
\bigskip
}
% Argumentumok: #1=téma részletei
\newcommand{\feladatmaga}[1]{
\large\noindent\textbf{Feladat:}
\newline
#1
\newline
\smallskip
}
% A fejezetek közé beágyazott irod.jegyzék
\def\thebibliography#1{\renewcommand{%
\baselinestretch}{1}\subsection{A tanulm\'anyozott irodalom jegyz\'eke}\list
{\small [\arabic{enumi}]}{\settowidth\labelwidth{[#1]}\leftmargin\labelwidth
\advance\leftmargin\labelsep
\usecounter{enumi}}
\def\newblock{\small \hskip .11em plus .33em minus .07em}
\sloppy\clubpenalty4000\widowpenalty4000
\sfcode`\.=1000\relax}
\let\endthebibliography=\endlist%
%%% Local Variables:
%%% mode: latex
%%% TeX-master: "template"
%%% End:

73
src/include/packages.tex Normal file
View File

@ -0,0 +1,73 @@
% !TeX root = ../thesis.tex
% thanks to http://tex.stackexchange.com/a/47579/71109
\usepackage{ifxetex}
\usepackage{ifluatex}
\newif\ifxetexorluatex % a new conditional starts as false
\ifnum 0\ifxetex 1\fi\ifluatex 1\fi>0
\xetexorluatextrue
\fi
\ifxetexorluatex
\usepackage{fontspec}
\else
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[lighttt]{lmodern}
\fi
\usepackage[english,magyar]{babel} % Alapértelmezés szerint utoljára definiált nyelv lesz aktív, de később külön beállítjuk az aktív nyelvet.
%\usepackage{cmap}
\usepackage{amsfonts,amsmath,amssymb} % Mathematical symbols.
%\usepackage[ruled,boxed,resetcount,linesnumbered]{algorithm2e} % For pseudocodes. % beware: this is not compatible with LuaLaTeX, see http://tex.stackexchange.com/questions/34814/lualatex-and-algorithm2e
\usepackage{booktabs} % For publication quality tables for LaTeX
\usepackage{graphicx}
\usepackage{listings}
%\usepackage{fancyhdr}
%\usepackage{lastpage}
\usepackage{anysize}
%\usepackage{sectsty}
\usepackage{setspace} % For setting line spacing
\usepackage[unicode]{hyperref} % For hyperlinks in the generated document.
\usepackage{xcolor}
\usepackage{listings} % For source code snippets.
\usepackage[amsmath,thmmarks]{ntheorem} % Theorem-like environments.
\usepackage[hang]{caption}
\singlespacing
\newcommand{\selecthungarian}{
\selectlanguage{magyar}
\setlength{\parindent}{2em}
\setlength{\parskip}{0em}
\frenchspacing
}
\newcommand{\selectenglish}{
\selectlanguage{english}
\setlength{\parindent}{0em}
\setlength{\parskip}{0.5em}
\nonfrenchspacing
\renewcommand{\figureautorefname}{Figure}
\renewcommand{\tableautorefname}{Table}
\renewcommand{\partautorefname}{Part}
\renewcommand{\chapterautorefname}{Chapter}
\renewcommand{\sectionautorefname}{Section}
\renewcommand{\subsectionautorefname}{Section}
\renewcommand{\subsubsectionautorefname}{Section}
}
\usepackage[numbers]{natbib}
\usepackage{xspace}
\usepackage{tikz}
\usepackage{pgfplots}
\pgfplotsset{compat=1.6}
\PassOptionsToPackage{hyphens}{url}\usepackage{hyperref}

125
src/include/preamble.tex Normal file
View File

@ -0,0 +1,125 @@
%--------------------------------------------------------------------------------------
% Page layout setup
%--------------------------------------------------------------------------------------
% we need to redefine the pagestyle plain
% another possibility is to use the body of this command without \fancypagestyle
% and use \pagestyle{fancy} but in that case the special pages
% (like the ToC, the References, and the Chapter pages)remain in plane style
\pagestyle{plain}
\marginsize{35mm}{25mm}{15mm}{15mm}
\setcounter{tocdepth}{3}
%\sectionfont{\large\upshape\bfseries}
\setcounter{secnumdepth}{3}
\sloppy % Margón túllógó sorok tiltása.
\widowpenalty=10000 \clubpenalty=10000 %A fattyú- és árvasorok elkerülése
\def\hyph{-\penalty0\hskip0pt\relax} % Kötőjeles szavak elválasztásának engedélyezése
%--------------------------------------------------------------------------------------
% Setup hyperref package
%--------------------------------------------------------------------------------------
\hypersetup{
% bookmarks=true, % show bookmarks bar?
unicode=true, % non-Latin characters in Acrobat's bookmarks
pdftitle={\vikcim}, % title
pdfauthor={\szerzoMeta}, % author
pdfsubject={\vikdoktipus}, % subject of the document
pdfcreator={\szerzoMeta}, % creator of the document
pdfproducer={}, % producer of the document
pdfkeywords={}, % list of keywords (separate then by comma)
pdfnewwindow=true, % links in new window
colorlinks=true, % false: boxed links; true: colored links
linkcolor=black, % color of internal links
citecolor=black, % color of links to bibliography
filecolor=black, % color of file links
urlcolor=black % color of external links
}
%--------------------------------------------------------------------------------------
% Set up listings
%--------------------------------------------------------------------------------------
\definecolor{lightgray}{rgb}{0.95,0.95,0.95}
\lstset{
basicstyle=\scriptsize\ttfamily, % print whole listing small
keywordstyle=\color{black}\bfseries, % bold black keywords
identifierstyle=, % nothing happens
% default behavior: comments in italic, to change use
% commentstyle=\color{green}, % for e.g. green comments
stringstyle=\scriptsize,
showstringspaces=false, % no special string spaces
aboveskip=3pt,
belowskip=3pt,
backgroundcolor=\color{lightgray},
columns=flexible,
keepspaces=true,
escapeinside={(*@}{@*)},
captionpos=b,
breaklines=true,
frame=single,
float=!ht,
tabsize=2,
literate=*
{á}{{\'a}}1 {é}{{\'e}}1 {í}{{\'i}}1 {ó}{{\'o}}1 {ö}{{\"o}}1 {ő}{{\H{o}}}1 {ú}{{\'u}}1 {ü}{{\"u}}1 {ű}{{\H{u}}}1
{Á}{{\'A}}1 {É}{{\'E}}1 {Í}{{\'I}}1 {Ó}{{\'O}}1 {Ö}{{\"O}}1 {Ő}{{\H{O}}}1 {Ú}{{\'U}}1 {Ü}{{\"U}}1 {Ű}{{\H{U}}}1
}
%--------------------------------------------------------------------------------------
% Set up theorem-like environments
%--------------------------------------------------------------------------------------
% Using ntheorem package -- see http://www.math.washington.edu/tex-archive/macros/latex/contrib/ntheorem/ntheorem.pdf
\theoremstyle{plain}
\theoremseparator{.}
\newtheorem{example}{\pelda}
\theoremseparator{.}
%\theoremprework{\bigskip\hrule\medskip}
%\theorempostwork{\hrule\bigskip}
\theorembodyfont{\upshape}
\theoremsymbol{{\large \ensuremath{\centerdot}}}
\newtheorem{definition}{\definicio}
\theoremseparator{.}
%\theoremprework{\bigskip\hrule\medskip}
%\theorempostwork{\hrule\bigskip}
\newtheorem{theorem}{\tetel}
%--------------------------------------------------------------------------------------
% Some new commands and declarations
%--------------------------------------------------------------------------------------
\newcommand{\code}[1]{{\upshape\ttfamily\scriptsize\indent #1}}
\newcommand{\doi}[1]{DOI: \href{http://dx.doi.org/\detokenize{#1}}{\raggedright{\texttt{\detokenize{#1}}}}} % A hivatkozások közt így könnyebb DOI-t megadni.
\DeclareMathOperator*{\argmax}{arg\,max}
%\DeclareMathOperator*[1]{\floor}{arg\,max}
\DeclareMathOperator{\sign}{sgn}
\DeclareMathOperator{\rot}{rot}
%--------------------------------------------------------------------------------------
% Setup captions
%--------------------------------------------------------------------------------------
\captionsetup[figure]{
width=.75\textwidth,
aboveskip=10pt}
\renewcommand{\captionlabelfont}{\bf}
%\renewcommand{\captionfont}{\footnotesize\it}
%--------------------------------------------------------------------------------------
% Hyphenation exceptions
%--------------------------------------------------------------------------------------
\hyphenation{Shakes-peare Mar-seilles ár-víz-tű-rő tü-kör-fú-ró-gép}
\author{\vikszerzo}
\title{\viktitle}
\renewcommand{\lstlistingname}{K\'odr\'eszlet}% Listing -> Algorithm
\renewcommand{\lstlistlistingname}{List of \lstlistingname s}% List of Listings -> List of Algorithms

10
src/include/project.tex Normal file
View File

@ -0,0 +1,10 @@
%--------------------------------------------------------------------------------------
% Feladatkiiras (a tanszeken atveheto, kinyomtatott valtozat)
%--------------------------------------------------------------------------------------
\clearpage
\begin{center}
\large
\textbf{FELADATKIÍRÁS}\\
\end{center}
A feladatkiírást a tanszéki adminisztrációban lehet átvenni, és a leadott munkába eredeti, tanszéki pecséttel ellátott és a tanszékvezető által aláírt lapot kell belefűzni (ezen oldal \emph{helyett}, ez az oldal csak útmutatás). Az elektronikusan feltöltött dolgozatban már nem kell beleszerkeszteni ezt a feladatkiírást.

View File

@ -0,0 +1,11 @@
%--------------------------------------------------------------------------------------
% TDK-specifikus változók
%--------------------------------------------------------------------------------------
\newcommand{\tdkszerzoB}{Második Szerző} % Második szerző neve; hagyd üresen, ha egyedül írtad a TDK-t.
\newcommand{\tdkev}{2014} % A dolgozat írásának éve (pl. "2014") (Ez OTDK-nál eltérhet az aktuális évtől.)
% További adatok az OTDK címlaphoz (BME-s TDK-hoz nem kell kitölteni)
\newcommand{\tdkevfolyamA}{IV} % Első szerző évfolyama, római számmal (pl. IV).
\newcommand{\tdkevfolyamB}{III} % Második szerző évfolyama, római számmal (pl. III).
\newcommand{\tdkkonzulensbeosztasA}{egyetemi tanár} % Első konzulens beosztása (pl. egyetemi docens)
\newcommand{\tdkkonzulensbeosztasB}{doktorandusz} % Második konzulens beosztása (pl. egyetemi docens)

57
src/include/thesis-en.tex Normal file
View File

@ -0,0 +1,57 @@
%--------------------------------------------------------------------------------------
% Elnevezések
%--------------------------------------------------------------------------------------
\newcommand{\bme}{Budapest University of Technology and Economics}
\newcommand{\vik}{Faculty of Electrical Engineering and Informatics}
\newcommand{\bmemit}{Department of Measurement and Information Systems}
\newcommand{\bmetmit}{Department of Telecommunications and Media Informatics}
\newcommand{\keszitette}{Author}
\newcommand{\konzulens}{Advisor}
\newcommand{\bsc}{Bachelor's Thesis}
\newcommand{\msc}{Master's Thesis}
\newcommand{\tdk}{Scientific Students' Association Report}
\newcommand{\bsconlab}{BSc Project Laboratory}
\newcommand{\msconlabi}{MSc Project Laboratory 1}
\newcommand{\msconlabii}{MSc Project Laboratory 2}
\newcommand{\pelda}{Example}
\newcommand{\definicio}{Definition}
\newcommand{\tetel}{Theorem}
\newcommand{\bevezetes}{Introduction}
\newcommand{\koszonetnyilvanitas}{Acknowledgements}
\newcommand{\fuggelek}{Appendix}
% Optional custom titles
%\addto\captionsenglish{%
%\renewcommand*{\listfigurename}{Your list of figures title}
%\renewcommand*{\listtablename}{Your list of tables title}
%\renewcommand*{\bibname}{Your bibliography title}
%}
\newcommand{\szerzo}{\vikszerzoKeresztnev{} \vikszerzoVezeteknev}
\newcommand{\vikkonzulensA}{\vikkonzulensAMegszolitas\vikkonzulensAKeresztnev{} \vikkonzulensAVezeteknev}
\newcommand{\vikkonzulensB}{\vikkonzulensBMegszolitas\vikkonzulensBKeresztnev{} \vikkonzulensBVezeteknev}
\newcommand{\vikkonzulensC}{\vikkonzulensCMegszolitas\vikkonzulensCKeresztnev{} \vikkonzulensCVezeteknev}
\newcommand{\selectthesislanguage}{\selectenglish}
\bibliographystyle{unsrt}
\newcommand{\ie}{i.e.\@\xspace}
\newcommand{\Ie}{I.e.\@\xspace}
\newcommand{\eg}{e.g.\@\xspace}
\newcommand{\Eg}{E.g.\@\xspace}
\newcommand{\etal}{et al.\@\xspace}
\newcommand{\etc}{etc.\@\xspace}
\newcommand{\vs}{vs.\@\xspace}
\newcommand{\viz}{viz.\@\xspace} % videlicet
\newcommand{\cf}{cf.\@\xspace} % confer
\newcommand{\Cf}{Cf.\@\xspace}
\newcommand{\wrt}{w.r.t.\@\xspace} % with respect to
\newcommand{\approximately}{approx.\@\xspace}
\newcommand{\appendixnumber}{1} % a fofejezet-szamlalo az angol ABC 1. betuje (A) lesz

46
src/include/thesis-hu.tex Normal file
View File

@ -0,0 +1,46 @@
%--------------------------------------------------------------------------------------
% Elnevezések
%--------------------------------------------------------------------------------------
\newcommand{\bme}{Budapesti Műszaki és Gazdaságtudományi Egyetem}
\newcommand{\vik}{Villamosmérnöki és Informatikai Kar}
\newcommand{\bmemit}{Méréstechnika és Információs Rendszerek Tanszék}
\newcommand{\bmetmit}{Távközlési és Médiainformatikai Tanszék}
\newcommand{\keszitette}{Készítette}
\newcommand{\konzulens}{Konzulens}
\newcommand{\bsc}{Szakdolgozat}
\newcommand{\msc}{Diplomaterv}
\newcommand{\tdk}{TDK dolgozat}
\newcommand{\bsconlab}{BSc Önálló laboratórium}
\newcommand{\msconlabi}{MSc Önálló laboratórium 1.}
\newcommand{\msconlabii}{MSc Önálló laboratórium 2.}
\newcommand{\pelda}{Példa}
\newcommand{\definicio}{Definíció}
\newcommand{\tetel}{Tétel}
\newcommand{\bevezetes}{Bevezetés}
\newcommand{\koszonetnyilvanitas}{Köszönetnyilvánítás}
\newcommand{\fuggelek}{Függelék}
% Opcionálisan átnevezhető címek
%\addto\captionsmagyar{%
%\renewcommand{\listfigurename}{Saját ábrajegyzék cím}
%\renewcommand{\listtablename}{Saját táblázatjegyzék cím}
%\renewcommand{\bibname}{Saját irodalomjegyzék név}
%}
\newcommand{\szerzo}{\vikszerzoVezeteknev{} \vikszerzoKeresztnev}
\newcommand{\vikkonzulensA}{\vikkonzulensAMegszolitas\vikkonzulensAVezeteknev{} \vikkonzulensAKeresztnev}
\newcommand{\vikkonzulensB}{\vikkonzulensBMegszolitas\vikkonzulensBVezeteknev{} \vikkonzulensBKeresztnev}
\newcommand{\vikkonzulensC}{\vikkonzulensCMegszolitas\vikkonzulensCVezeteknev{} \vikkonzulensCKeresztnev}
\newcommand{\selectthesislanguage}{\selecthungarian}
\bibliographystyle{unsrt}
\def\lstlistingname{lista}
\newcommand{\appendixnumber}{6} % a fofejezet-szamlalo az angol ABC 6. betuje (F) lesz

View File

@ -0,0 +1,58 @@
%% OTDK külső címlap
\begin{titlepage}
$\;$
\vspace{5cm}
\begin{center}
\Huge
\textbf{TDK-dolgozat}\let\thefootnote\relax\footnote{A dolgozat bemutatását a XXXXXXXXX ``Lorem ipsum dolor sit amet'' című program támogatta.}
\end{center}
\vspace{13cm}
\Large
\hspace{8cm} \szerzo
\hspace{8cm} \tdkszerzoB
\hspace{8cm} \tdkev.
\end{titlepage}
\newpage
\thispagestyle{empty}
%% OTDK belső címlap
\begin{titlepage}
\begin{center}
\includegraphics[width=7cm]{./figures/bme_logo.pdf}
\vspace{0.3cm}
\bme \\
\vik \\
\viktanszek \\
\vspace{3.5cm}
\huge {\vikcim}
\vspace{1.5cm}
\large {\textbf{\vikdoktipus}}
\vfill
{\Large
{\large \keszitette:} \\ \vspace{0.2cm}
\szerzo \\ \tdkevfolyamA. évfolyam \\
\vspace{0.5cm}
\tdkszerzoB \\ \tdkevfolyamB. évfolyam \\
\vspace{1.5cm}
{\large \konzulens:} \\ \vspace{0.2cm}
\vikkonzulensA,\\ \tdkkonzulensbeosztasA \\
\vspace{0.5cm}
\vikkonzulensB,\\ \tdkkonzulensbeosztasB \\
}
\vspace{2cm}
\large {\tdkev.}
\end{center}
\end{titlepage}

View File

@ -0,0 +1,32 @@
%% TDK címlap
\begin{titlepage}
\begin{center}
\includegraphics[width=7cm]{./figures/bme_logo.pdf}
\vspace{0.3cm}
\bme \\
\vik \\
\viktanszek \\
\vspace{5cm}
\huge {\vikcim}
\vspace{1.5cm}
\large {\textbf{\tdk}}
\vfill
{\Large
\keszitette: \\ \vspace{0.3cm}
\szerzo \\
\tdkszerzoB \\
\vspace{1.5cm}
\konzulens: \\ \vspace{0.3cm}
\vikkonzulensA \\
\vikkonzulensB \\
}
\vspace{2cm}
\large {\tdkev}
\end{center}
\end{titlepage}
%% Címlap vége

View File

@ -0,0 +1,47 @@
% !TeX root = main.tex
\begin{titlepage}
%bme logo
\begin{figure}[h]
\centering
\includegraphics[width=12cm]{figures/bme_logo.pdf}
\label{fig:bme_logo}
\end{figure}
\thispagestyle{empty}
%cím generálás
\onlabcim
% \begin{center}
% \begin{tabular}{ p{3cm} p{5cm} }
%
% Készítette: & Beszámoló Péter \\
% Neptun-kód: & BPOX43 \\
% Ágazat: & Médiainformatika \\
% E-mail cím: & b.peter@onlab.hu \\
% Konzulens: & Dr. Péhádes István \\
% E-mail cím: & pehades@tmit.bme.hu \\
% Konzulens: & Doktor Andusz \\
% E-mail cím: & doktora@tmit.bme.hu \\
%
% \end{tabular}
% \end{center}
%\szerzo argumentumok: #1=Név, #2=Neptunkód, #3=szakirány, #4=email,#5 konzulens-1, #6 konzulens-1-email, #7 konzulens-2, #8 konzulens-2-email
\onlabszerzo{\szerzoMeta}{\vikszerzoNeptun}{\vikszerzoAgazat}{\vikszerzoEmail}{\vikkonzulensAMeta}{\vikkonzulensAEmail}{\vikkonzulensBMeta}{\vikkonzulensBEmail}
%\feladatcim argumentuma a feladat rövid, 1 soros címe
\feladatcim{\vikcim}
%\feladatmaga argumentuma a feladat 1-2 bekezdésnyi ismertetése
\feladatmaga{\feladatSzovege}
%\tanevfelev argumentumok:
% #1=Tanév (xxxx/xx alakban), #2=félév (pont nélkül!)
\tanevfelev{2019/20}{II}
\end{titlepage}

33
src/include/titlepage.tex Normal file
View File

@ -0,0 +1,33 @@
\hypersetup{pageanchor=false}
%--------------------------------------------------------------------------------------
% The title page
%--------------------------------------------------------------------------------------
\begin{titlepage}
\begin{center}
\includegraphics[width=60mm,keepaspectratio]{figures/bme_logo.pdf}\\
\vspace{0.3cm}
\textbf{\bme}\\
\textmd{\vik}\\
\textmd{\viktanszek}\\[5cm]
\vspace{0.4cm}
{\huge \bfseries \vikcim}\\[0.8cm]
\vspace{0.5cm}
\textsc{\Large \vikdoktipus}\\[4cm]
{
\renewcommand{\arraystretch}{0.85}
\begin{tabular}{cc}
\makebox[7cm]{\emph{\keszitette}} & \makebox[7cm]{\emph{\konzulens}} \\ \noalign{\smallskip}
\makebox[7cm]{\szerzo} & \makebox[7cm]{\vikkonzulensA} \\
& \makebox[7cm]{\vikkonzulensB} \\
& \makebox[7cm]{\vikkonzulensC} \\
\end{tabular}
}
\vfill
{\large \today}
\end{center}
\end{titlepage}
\hypersetup{pageanchor=false}

731
src/lua/language.dat.lua Normal file
View File

@ -0,0 +1,731 @@
-- Generated by ./install-tl on Sun Feb 12 19:17:26 2017
-- $Id: language.us.lua 18737 2010-06-04 17:09:02Z karl $
--[[
language.us.dat (and the start of language.dat.lua), used by:
- a special luatex version of hyphen.cfg (derived from the babel system);
- a special luatex version of etex.src (from the e-TeX distributon).
See luatex-hyphen.pdf (currently part of the hyph-utf8 package) for details.
DO NOT EDIT THIS FILE (language.dat.lua)! It is generated by tlmgr.
See language.dat (or language.us) for more information.
Warning: formats using this file also use one of language.dat or
language.def. Update them accordingly. The interaction between these
files is documented in luatex-hyphen.pdf, but here is a summary:
- a language must be mentioned in language.dat or language.def to be
available; if, in addition, it is:
- not mentioned in language.dat.lua, then it is dumped in the format;
- mentioned in language.dat.lua with a key special="disabled:<reason>",
then it is not available at all;
- mentioned in language.dat.lua with a normal entry, then it will not
be dumped in the format, but loaded at runtime when activated.
]]
return {
["english"]={
loader="hyphen.tex",
special="language0", -- should be dumped in the format
lefthyphenmin=2,
righthyphenmin=3,
synonyms={"usenglish","USenglish","american"},
},
-- dumylang and zerohyph are dumped in the format,
-- since they contain either very few or no patterns at all
-- END of language.us.lua (missing '}' appended after all entries)
-- from dehyph-exptl:
['german-x-2014-05-21'] = {
loader = 'dehypht-x-2014-05-21.tex',
lefthyphenmin = 2,
righthyphenmin = 2,
synonyms = { 'german-x-latest' },
patterns = 'hyph-de-1901.pat.txt',
hyphenation = 'hyph-de-1901.hyp.txt',
},
['ngerman-x-2014-05-21'] = {
loader = 'dehyphn-x-2014-05-21.tex',
lefthyphenmin = 2,
righthyphenmin = 2,
synonyms = { 'ngerman-x-latest' },
patterns = 'hyph-de-1996.pat.txt',
hyphenation = 'hyph-de-1996.hyp.txt',
},
-- from hyphen-afrikaans:
['afrikaans'] = {
loader = 'loadhyph-af.tex',
lefthyphenmin = 1,
righthyphenmin = 2,
synonyms = { },
patterns = 'hyph-af.pat.txt',
hyphenation = 'hyph-af.hyp.txt',
},
-- from hyphen-ancientgreek:
['ancientgreek'] = {
loader = 'loadhyph-grc.tex',
lefthyphenmin = 1,
righthyphenmin = 1,
synonyms = { },
patterns = 'hyph-grc.pat.txt',
hyphenation = '',
},
['ibycus'] = {
loader = 'ibyhyph.tex',
lefthyphenmin = 2,
righthyphenmin = 2,
synonyms = { },
special = 'disabled:8-bit only',
},
-- from hyphen-arabic:
['arabic'] = {
loader = 'zerohyph.tex',
lefthyphenmin = 2,
righthyphenmin = 3,
synonyms = { },
patterns = '',
},
-- from hyphen-armenian:
['armenian'] = {
loader = 'loadhyph-hy.tex',
lefthyphenmin = 1,
righthyphenmin = 2,
synonyms = { },
patterns = 'hyph-hy.pat.txt',
hyphenation = '',
},
-- from hyphen-basque:
['basque'] = {
loader = 'loadhyph-eu.tex',
lefthyphenmin = 2,
righthyphenmin = 2,
synonyms = { },
patterns = 'hyph-eu.pat.txt',
hyphenation = '',
},
-- from hyphen-bulgarian:
['bulgarian'] = {
loader = 'loadhyph-bg.tex',
lefthyphenmin = 2,
righthyphenmin = 2,
synonyms = { },
patterns = 'hyph-bg.pat.txt',
hyphenation = '',
},
-- from hyphen-catalan:
['catalan'] = {
loader = 'loadhyph-ca.tex',
lefthyphenmin = 2,
righthyphenmin = 2,
synonyms = { },
patterns = 'hyph-ca.pat.txt',
hyphenation = 'hyph-ca.hyp.txt',
},
-- from hyphen-chinese:
['pinyin'] = {
loader = 'loadhyph-zh-latn-pinyin.tex',
lefthyphenmin = 1,
righthyphenmin = 1,
synonyms = { },
patterns = 'hyph-zh-latn-pinyin.pat.txt',
hyphenation = '',
},
-- from hyphen-churchslavonic:
['churchslavonic'] = {
loader = 'loadhyph-cu.tex',
lefthyphenmin = 1,
righthyphenmin = 2,
synonyms = { },
patterns = 'hyph-cu.pat.txt',
hyphenation = 'hyph-cu.hyp.txt',
},
-- from hyphen-coptic:
['coptic'] = {
loader = 'loadhyph-cop.tex',
lefthyphenmin = 1,
righthyphenmin = 1,
synonyms = { },
patterns = 'hyph-cop.pat.txt',
hyphenation = '',
},
-- from hyphen-croatian:
['croatian'] = {
loader = 'loadhyph-hr.tex',
lefthyphenmin = 2,
righthyphenmin = 2,
synonyms = { },
patterns = 'hyph-hr.pat.txt',
hyphenation = '',
},
-- from hyphen-czech:
['czech'] = {
loader = 'loadhyph-cs.tex',
lefthyphenmin = 2,
righthyphenmin = 3,
synonyms = { },
patterns = 'hyph-cs.pat.txt',
hyphenation = 'hyph-cs.hyp.txt',
},
-- from hyphen-danish:
['danish'] = {
loader = 'loadhyph-da.tex',
lefthyphenmin = 2,
righthyphenmin = 2,
synonyms = { },
patterns = 'hyph-da.pat.txt',
hyphenation = '',
},
-- from hyphen-dutch:
['dutch'] = {
loader = 'loadhyph-nl.tex',
lefthyphenmin = 2,
righthyphenmin = 2,
synonyms = { },
patterns = 'hyph-nl.pat.txt',
hyphenation = 'hyph-nl.hyp.txt',
},
-- from hyphen-english:
['ukenglish'] = {
loader = 'loadhyph-en-gb.tex',
lefthyphenmin = 2,
righthyphenmin = 3,
synonyms = { 'british', 'UKenglish' },
patterns = 'hyph-en-gb.pat.txt',
hyphenation = 'hyph-en-gb.hyp.txt',
},
['usenglishmax'] = {
loader = 'loadhyph-en-us.tex',
lefthyphenmin = 2,
righthyphenmin = 3,
synonyms = { },
patterns = 'hyph-en-us.pat.txt',
hyphenation = 'hyph-en-us.hyp.txt',
},
-- from hyphen-esperanto:
['esperanto'] = {
loader = 'loadhyph-eo.tex',
lefthyphenmin = 2,
righthyphenmin = 2,
synonyms = { },
patterns = 'hyph-eo.pat.txt',
hyphenation = '',
},
-- from hyphen-estonian:
['estonian'] = {
loader = 'loadhyph-et.tex',
lefthyphenmin = 2,
righthyphenmin = 3,
synonyms = { },
patterns = 'hyph-et.pat.txt',
hyphenation = '',
},
-- from hyphen-ethiopic:
['ethiopic'] = {
loader = 'loadhyph-mul-ethi.tex',
lefthyphenmin = 1,
righthyphenmin = 1,
synonyms = { 'amharic', 'geez' },
patterns = 'hyph-mul-ethi.pat.txt',
hyphenation = '',
},
-- from hyphen-farsi:
['farsi'] = {
loader = 'zerohyph.tex',
lefthyphenmin = 2,
righthyphenmin = 3,
synonyms = { 'persian' },
patterns = '',
},
-- from hyphen-finnish:
['finnish'] = {
loader = 'loadhyph-fi.tex',
lefthyphenmin = 2,
righthyphenmin = 2,
synonyms = { },
patterns = 'hyph-fi.pat.txt',
hyphenation = '',
},
-- from hyphen-french:
['french'] = {
loader = 'loadhyph-fr.tex',
lefthyphenmin = 2,
righthyphenmin = 2,
synonyms = { 'patois', 'francais' },
patterns = 'hyph-fr.pat.txt',
hyphenation = '',
},
-- from hyphen-friulan:
['friulan'] = {
loader = 'loadhyph-fur.tex',
lefthyphenmin = 2,
righthyphenmin = 2,
synonyms = { },
patterns = 'hyph-fur.pat.txt',
hyphenation = '',
},
-- from hyphen-galician:
['galician'] = {
loader = 'loadhyph-gl.tex',
lefthyphenmin = 2,
righthyphenmin = 2,
synonyms = { },
patterns = 'hyph-gl.pat.txt',
hyphenation = '',
},
-- from hyphen-georgian:
['georgian'] = {
loader = 'loadhyph-ka.tex',
lefthyphenmin = 1,
righthyphenmin = 2,
synonyms = { },
patterns = 'hyph-ka.pat.txt',
hyphenation = '',
},
-- from hyphen-german:
['german'] = {
loader = 'loadhyph-de-1901.tex',
lefthyphenmin = 2,
righthyphenmin = 2,
synonyms = { },
patterns = 'hyph-de-1901.pat.txt',
hyphenation = '',
},
['ngerman'] = {
loader = 'loadhyph-de-1996.tex',
lefthyphenmin = 2,
righthyphenmin = 2,
synonyms = { },
patterns = 'hyph-de-1996.pat.txt',
hyphenation = '',
},
['swissgerman'] = {
loader = 'loadhyph-de-ch-1901.tex',
lefthyphenmin = 2,
righthyphenmin = 2,
synonyms = { },
patterns = 'hyph-de-ch-1901.pat.txt',
hyphenation = '',
},
-- from hyphen-greek:
['monogreek'] = {
loader = 'loadhyph-el-monoton.tex',
lefthyphenmin = 1,
righthyphenmin = 1,
synonyms = { },
patterns = 'hyph-el-monoton.pat.txt',
hyphenation = '',
},
['greek'] = {
loader = 'loadhyph-el-polyton.tex',
lefthyphenmin = 1,
righthyphenmin = 1,
synonyms = { 'polygreek' },
patterns = 'hyph-el-polyton.pat.txt',
hyphenation = '',
},
-- from hyphen-hungarian:
['hungarian'] = {
loader = 'loadhyph-hu.tex',
lefthyphenmin = 2,
righthyphenmin = 2,
synonyms = { 'hungarian', 'magyar' },
patterns = 'hyph-hu.pat.txt',
hyphenation = '',
},
-- from hyphen-icelandic:
['icelandic'] = {
loader = 'loadhyph-is.tex',
lefthyphenmin = 2,
righthyphenmin = 2,
synonyms = { },
patterns = 'hyph-is.pat.txt',
hyphenation = '',
},
-- from hyphen-indic:
['assamese'] = {
loader = 'loadhyph-as.tex',
lefthyphenmin = 1,
righthyphenmin = 1,
synonyms = { },
patterns = 'hyph-as.pat.txt',
hyphenation = '',
},
['bengali'] = {
loader = 'loadhyph-bn.tex',
lefthyphenmin = 1,
righthyphenmin = 1,
synonyms = { },
patterns = 'hyph-bn.pat.txt',
hyphenation = '',
},
['gujarati'] = {
loader = 'loadhyph-gu.tex',
lefthyphenmin = 1,
righthyphenmin = 1,
synonyms = { },
patterns = 'hyph-gu.pat.txt',
hyphenation = '',
},
['hindi'] = {
loader = 'loadhyph-hi.tex',
lefthyphenmin = 1,
righthyphenmin = 1,
synonyms = { },
patterns = 'hyph-hi.pat.txt',
hyphenation = '',
},
['kannada'] = {
loader = 'loadhyph-kn.tex',
lefthyphenmin = 1,
righthyphenmin = 1,
synonyms = { },
patterns = 'hyph-kn.pat.txt',
hyphenation = '',
},
['malayalam'] = {
loader = 'loadhyph-ml.tex',
lefthyphenmin = 1,
righthyphenmin = 1,
synonyms = { },
patterns = 'hyph-ml.pat.txt',
hyphenation = '',
},
['marathi'] = {
loader = 'loadhyph-mr.tex',
lefthyphenmin = 1,
righthyphenmin = 1,
synonyms = { },
patterns = 'hyph-mr.pat.txt',
hyphenation = '',
},
['oriya'] = {
loader = 'loadhyph-or.tex',
lefthyphenmin = 1,
righthyphenmin = 1,
synonyms = { },
patterns = 'hyph-or.pat.txt',
hyphenation = '',
},
['panjabi'] = {
loader = 'loadhyph-pa.tex',
lefthyphenmin = 1,
righthyphenmin = 1,
synonyms = { },
patterns = 'hyph-pa.pat.txt',
hyphenation = '',
},
['tamil'] = {
loader = 'loadhyph-ta.tex',
lefthyphenmin = 1,
righthyphenmin = 1,
synonyms = { },
patterns = 'hyph-ta.pat.txt',
hyphenation = '',
},
['telugu'] = {
loader = 'loadhyph-te.tex',
lefthyphenmin = 1,
righthyphenmin = 1,
synonyms = { },
patterns = 'hyph-te.pat.txt',
hyphenation = '',
},
-- from hyphen-indonesian:
['indonesian'] = {
loader = 'loadhyph-id.tex',
lefthyphenmin = 2,
righthyphenmin = 2,
synonyms = { },
patterns = 'hyph-id.pat.txt',
hyphenation = 'hyph-id.hyp.txt',
},
-- from hyphen-interlingua:
['interlingua'] = {
loader = 'loadhyph-ia.tex',
lefthyphenmin = 2,
righthyphenmin = 2,
synonyms = { },
patterns = 'hyph-ia.pat.txt',
hyphenation = 'hyph-ia.hyp.txt',
},
-- from hyphen-irish:
['irish'] = {
loader = 'loadhyph-ga.tex',
lefthyphenmin = 2,
righthyphenmin = 3,
synonyms = { },
patterns = 'hyph-ga.pat.txt',
hyphenation = 'hyph-ga.hyp.txt',
},
-- from hyphen-italian:
['italian'] = {
loader = 'loadhyph-it.tex',
lefthyphenmin = 2,
righthyphenmin = 2,
synonyms = { },
patterns = 'hyph-it.pat.txt',
hyphenation = '',
},
-- from hyphen-kurmanji:
['kurmanji'] = {
loader = 'loadhyph-kmr.tex',
lefthyphenmin = 2,
righthyphenmin = 2,
synonyms = { },
patterns = 'hyph-kmr.pat.txt',
hyphenation = '',
},
-- from hyphen-latin:
['latin'] = {
loader = 'loadhyph-la.tex',
lefthyphenmin = 2,
righthyphenmin = 2,
synonyms = { },
patterns = 'hyph-la.pat.txt',
hyphenation = '',
},
['classiclatin'] = {
loader = 'loadhyph-la-x-classic.tex',
lefthyphenmin = 2,
righthyphenmin = 2,
synonyms = { },
patterns = 'hyph-la-x-classic.pat.txt',
hyphenation = '',
},
['liturgicallatin'] = {
loader = 'loadhyph-la-x-liturgic.tex',
lefthyphenmin = 2,
righthyphenmin = 2,
synonyms = { },
patterns = 'hyph-la-x-liturgic.pat.txt',
hyphenation = '',
},
-- from hyphen-latvian:
['latvian'] = {
loader = 'loadhyph-lv.tex',
lefthyphenmin = 2,
righthyphenmin = 2,
synonyms = { },
patterns = 'hyph-lv.pat.txt',
hyphenation = '',
},
-- from hyphen-lithuanian:
['lithuanian'] = {
loader = 'loadhyph-lt.tex',
lefthyphenmin = 2,
righthyphenmin = 2,
synonyms = { },
patterns = 'hyph-lt.pat.txt',
hyphenation = '',
},
-- from hyphen-mongolian:
['mongolian'] = {
loader = 'loadhyph-mn-cyrl.tex',
lefthyphenmin = 2,
righthyphenmin = 2,
synonyms = { },
patterns = 'hyph-mn-cyrl.pat.txt',
hyphenation = '',
},
['mongolianlmc'] = {
loader = 'loadhyph-mn-cyrl-x-lmc.tex',
lefthyphenmin = 2,
righthyphenmin = 2,
synonyms = { },
special = 'disabled:only for 8bit montex with lmc encoding',
},
-- from hyphen-norwegian:
['bokmal'] = {
loader = 'loadhyph-nb.tex',
lefthyphenmin = 2,
righthyphenmin = 2,
synonyms = { 'norwegian', 'norsk' },
patterns = 'hyph-nb.pat.txt',
hyphenation = 'hyph-nb.hyp.txt',
},
['nynorsk'] = {
loader = 'loadhyph-nn.tex',
lefthyphenmin = 2,
righthyphenmin = 2,
synonyms = { },
patterns = 'hyph-nn.pat.txt',
hyphenation = 'hyph-nn.hyp.txt',
},
-- from hyphen-occitan:
['occitan'] = {
loader = 'loadhyph-oc.tex',
lefthyphenmin = 2,
righthyphenmin = 2,
synonyms = { },
patterns = 'hyph-oc.pat.txt',
hyphenation = '',
},
-- from hyphen-piedmontese:
['piedmontese'] = {
loader = 'loadhyph-pms.tex',
lefthyphenmin = 2,
righthyphenmin = 2,
synonyms = { },
patterns = 'hyph-pms.pat.txt',
hyphenation = '',
},
-- from hyphen-polish:
['polish'] = {
loader = 'loadhyph-pl.tex',
lefthyphenmin = 2,
righthyphenmin = 2,
synonyms = { },
patterns = 'hyph-pl.pat.txt',
hyphenation = 'hyph-pl.hyp.txt',
},
-- from hyphen-portuguese:
['portuguese'] = {
loader = 'loadhyph-pt.tex',
lefthyphenmin = 2,
righthyphenmin = 3,
synonyms = { 'portuges' },
patterns = 'hyph-pt.pat.txt',
hyphenation = 'hyph-pt.hyp.txt',
},
-- from hyphen-romanian:
['romanian'] = {
loader = 'loadhyph-ro.tex',
lefthyphenmin = 2,
righthyphenmin = 2,
synonyms = { },
patterns = 'hyph-ro.pat.txt',
hyphenation = '',
},
-- from hyphen-romansh:
['romansh'] = {
loader = 'loadhyph-rm.tex',
lefthyphenmin = 2,
righthyphenmin = 2,
synonyms = { },
patterns = 'hyph-rm.pat.txt',
hyphenation = '',
},
-- from hyphen-russian:
['russian'] = {
loader = 'loadhyph-ru.tex',
lefthyphenmin = 2,
righthyphenmin = 2,
synonyms = { },
patterns = 'hyph-ru.pat.txt',
hyphenation = 'hyph-ru.hyp.txt',
},
-- from hyphen-sanskrit:
['sanskrit'] = {
loader = 'loadhyph-sa.tex',
lefthyphenmin = 1,
righthyphenmin = 3,
synonyms = { },
patterns = 'hyph-sa.pat.txt',
hyphenation = '',
},
-- from hyphen-serbian:
['serbian'] = {
loader = 'loadhyph-sr-latn.tex',
lefthyphenmin = 2,
righthyphenmin = 2,
synonyms = { },
patterns = 'hyph-sh-latn.pat.txt,hyph-sh-cyrl.pat.txt',
hyphenation = 'hyph-sh-latn.hyp.txt,hyph-sh-cyrl.hyp.txt',
},
['serbianc'] = {
loader = 'loadhyph-sr-cyrl.tex',
lefthyphenmin = 2,
righthyphenmin = 2,
synonyms = { },
patterns = 'hyph-sh-latn.pat.txt,hyph-sh-cyrl.pat.txt',
hyphenation = 'hyph-sh-latn.hyp.txt,hyph-sh-cyrl.hyp.txt',
},
-- from hyphen-slovak:
['slovak'] = {
loader = 'loadhyph-sk.tex',
lefthyphenmin = 2,
righthyphenmin = 3,
synonyms = { },
patterns = 'hyph-sk.pat.txt',
hyphenation = 'hyph-sk.hyp.txt',
},
-- from hyphen-slovenian:
['slovenian'] = {
loader = 'loadhyph-sl.tex',
lefthyphenmin = 2,
righthyphenmin = 2,
synonyms = { 'slovene' },
patterns = 'hyph-sl.pat.txt',
hyphenation = '',
},
-- from hyphen-spanish:
['spanish'] = {
loader = 'loadhyph-es.tex',
lefthyphenmin = 2,
righthyphenmin = 2,
synonyms = { 'espanol' },
patterns = 'hyph-es.pat.txt',
hyphenation = '',
},
-- from hyphen-swedish:
['swedish'] = {
loader = 'loadhyph-sv.tex',
lefthyphenmin = 2,
righthyphenmin = 2,
synonyms = { },
patterns = 'hyph-sv.pat.txt',
hyphenation = '',
},
-- from hyphen-thai:
['thai'] = {
loader = 'loadhyph-th.tex',
lefthyphenmin = 2,
righthyphenmin = 3,
synonyms = { },
patterns = 'hyph-th.pat.txt',
hyphenation = '',
},
-- from hyphen-turkish:
['turkish'] = {
loader = 'loadhyph-tr.tex',
lefthyphenmin = 2,
righthyphenmin = 2,
synonyms = { },
patterns = 'hyph-tr.pat.txt',
hyphenation = '',
},
-- from hyphen-turkmen:
['turkmen'] = {
loader = 'loadhyph-tk.tex',
lefthyphenmin = 2,
righthyphenmin = 2,
synonyms = { },
patterns = 'hyph-tk.pat.txt',
hyphenation = '',
},
-- from hyphen-ukrainian:
['ukrainian'] = {
loader = 'loadhyph-uk.tex',
lefthyphenmin = 2,
righthyphenmin = 2,
synonyms = { },
patterns = 'hyph-uk.pat.txt',
hyphenation = '',
},
-- from hyphen-uppersorbian:
['uppersorbian'] = {
loader = 'loadhyph-hsb.tex',
lefthyphenmin = 2,
righthyphenmin = 2,
synonyms = { },
patterns = 'hyph-hsb.pat.txt',
hyphenation = 'hyph-hsb.hyp.txt',
},
-- from hyphen-welsh:
['welsh'] = {
loader = 'loadhyph-cy.tex',
lefthyphenmin = 2,
righthyphenmin = 3,
synonyms = { },
patterns = 'hyph-cy.pat.txt',
hyphenation = '',
},
}

5801
src/magyar.ldf Normal file

File diff suppressed because it is too large Load Diff

85
src/thesis.kilepr Normal file
View File

@ -0,0 +1,85 @@
[General]
bib_extensions=.bib
bibliographyBackendAutoDetected=
bibliographyBackendUserOverride=BibTeX
def_graphic_ext=
img_extIsRegExp=false
img_extensions=.eps .jpg .jpeg .png .pdf .ps .fig .gif
kileprversion=3
kileversion=2.9.93
masterDocument=
name=thesis
pkg_extIsRegExp=false
pkg_extensions=.cls .sty .bbx .cbx .lbx
src_extIsRegExp=false
src_extensions=.tex .ltx .latex .dtx .ins
[Tools]
MakeIndex=
QuickBuild=
[item:content/abstract.tex]
archive=true
encoding=UTF-8
highlight=LaTeX
mode=LaTeX
[item:content/acknowledgement.tex]
archive=true
encoding=UTF-8
highlight=LaTeX
mode=LaTeX
[item:content/appendices.tex]
archive=true
encoding=UTF-8
highlight=LaTeX
mode=LaTeX
[item:content/closing.tex]
archive=true
encoding=UTF-8
highlight=LaTeX
mode=LaTeX
[item:content/create-functions.tex]
archive=true
encoding=UTF-8
highlight=LaTeX
mode=LaTeX
[item:content/introduction.tex]
archive=true
encoding=UTF-8
highlight=LaTeX
mode=LaTeX
[item:content/preparation.tex]
archive=true
encoding=UTF-8
highlight=LaTeX
mode=LaTeX
[item:content/results.tex]
archive=true
encoding=UTF-8
highlight=LaTeX
mode=LaTeX
[item:content/theory.tex]
archive=true
encoding=UTF-8
highlight=LaTeX
mode=LaTeX
[item:thesis.kilepr]
archive=true
encoding=
highlight=
mode=
[item:thesis.tex]
archive=true
encoding=UTF-8
highlight=LaTeX
mode=LaTeX

110
src/thesis.tex Normal file
View File

@ -0,0 +1,110 @@
% !TeX spellcheck = hu_HU
% !TeX encoding = UTF-8
% !TeX program = xelatex
\documentclass[11pt,a4paper,oneside]{report} % Single-side
%\documentclass[11pt,a4paper,twoside,openri\cite{microservices-apply}ght]{report} % Duplex
\input{include/packages}
% Set the main variables
\newcommand{\vikszerzoVezeteknev}{Torma}
\newcommand{\vikszerzoKeresztnev}{Krist\'of}
\newcommand{\vikszerzoNeptun}{Y8O353}
\newcommand{\vikszerzoAgazat}{Internet architektúra és szolgáltatások}
\newcommand{\vikszerzoEmail}{tormakristof@tormakristof.eu}
\newcommand{\vikkonzulensAMegszolitas}{Dr.~}
\newcommand{\vikkonzulensAVezeteknev}{Maliosz}
\newcommand{\vikkonzulensAKeresztnev}{Markosz}
\newcommand{\vikkonzulensAEmail}{maliosz@tmit.bme.hu}
\newcommand{\vikkonzulensAMeta}{\vikkonzulensAMegszolitas{} \vikkonzulensAVezeteknev \vikkonzulensAKeresztnev}
\newcommand{\vikkonzulensBMegszolitas}{Dr.~}
\newcommand{\vikkonzulensBVezeteknev}{Simon}
\newcommand{\vikkonzulensBKeresztnev}{Csaba}
\newcommand{\vikkonzulensBEmail}{simon@tmit.bme.hu}
\newcommand{\vikkonzulensBMeta}{\vikkonzulensBMegszolitas{} \vikkonzulensBVezeteknev \vikkonzulensBKeresztnev}
\newcommand{\vikkonzulensCMegszolitas}{}
\newcommand{\vikkonzulensCVezeteknev}{}
\newcommand{\vikkonzulensCKeresztnev}{}
\newcommand{\vikcim}{Felhő-natív mesterséges intelligencia alapú rendszerek fejlesztése} % Cím
\newcommand{\feladatSzovege}{A félév során a feladatom egy Mesterséges Intelligencián alapuló, monolit architektúrájú szoftver átalakítása felhő natívvá. Ezzel kapcsolatban feladatom volt a rendszer felhasználótól bemenetet fogadó, valamint a Mesterséges Intelligencia (MI) kimenetét feldolgozó mikroszolgáltatások megtervezése és fejlesztése, valamint a rendszer skálázhatóságát segítő technológiák felkutatása. }
\newcommand{\viktanszek}{\bmetmit} % Tanszék
\newcommand{\vikdoktipus}{\msc} % Dokumentum típusa (\bsc vagy \msc)
\newcommand{\vikmunkatipusat}{szakdolgozatot} % a "hallgató nyilatkozat" részhez: szakdolgozatot vagy diplomatervet
%\input{include/tdk-variables}
\newcommand{\szerzoMeta}{\vikszerzoVezeteknev{} \vikszerzoKeresztnev} % egy szerző esetén
%\newcommand{\szerzoMeta}{\vikszerzoVezeteknev{} \vikszerzoKeresztnev, \tdkszerzoB} % két szerző esetén
%Language configuration -- choose one
% Beállítások magyar nyelvű dolgozathoz
\input{include/thesis-hu}
% Settings for English documents
%\input{include/thesis-en}
%Onlab beallitasok
\input{include/onlab-variables}
%\input{include/preamble}
%--------------------------------------------------------------------------------------
% Table of contents and the main text
%--------------------------------------------------------------------------------------
\begin{document}
\pagenumbering{gobble}
%These includes define guidelines -- remove these
%~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
%\include{include/guideline}
%\include{include/project}
\selectthesislanguage
%Titlepage -- choose one from below
%~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
\input{include/titlepage-tmit} % Szakdolgozat/Diplomaterv címlap
%\include{include/titlepage-tdk} % TDK címlap
%\include{include/titlepage-otdk} % OTDK címlap
% Table of Contents
%~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
%\tableofcontents\vfill
\clearpage
% The main part of the thesis
%~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
\pagenumbering{arabic}
%import your own content
\input{content/beggining}
\input{content/work}
% Acknowledgements
%~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
%\input{content/acknowledgement}
% List of Figures, Tables
%~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
%\listoffigures\addcontentsline{toc}{chapter}{\listfigurename}
%\listoftables\addcontentsline{toc}{chapter}{\listtablename}
% Bibliography
%~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
\addcontentsline{toc}{chapter}{\bibname}
\bibliography{bib/mybib}
% Appendix
%~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
%\input{content/appendices}
%\label{page:last}
\end{document}