This commit is contained in:
Martin Slachta
2026-04-21 11:31:52 +02:00
parent 6956e40f43
commit ab536bdb54
23 changed files with 4441 additions and 850 deletions
Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 127 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 119 KiB

File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 159 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 117 KiB

+1 -1
View File
@@ -1 +1 @@
\glossaryentry{UPOL?\glossentry{UPOL}|setentrycounter[]{page}"\glsnumberformat}{42}
\glossaryentry{UPOL?\glossentry{UPOL}|setentrycounter[]{page}"\glsnumberformat}{45}
+242 -222
View File
@@ -1,4 +1,5 @@
\relax
\providecommand{\transparent@use}[1]{}
\providecommand \babel@aux [2]{\global \let \babel@toc \@gobbletwo }
\@nameuse{bbl@beforestart}
\catcode `"\active
@@ -8,8 +9,8 @@
\providecommand\HyField@AuxAddToCoFields[2]{}
\providecommand\BKM@entry[2]{}
\abx@aux@refcontext{none/global//global/global/global}
\BKM@entry{id=1,open,dest={6B693A7061706572},srcline={149}}{5C3337365C3337375C303030535C303030745C303030795C3030306C5C3030305C3034305C303030705C303030725C3030306F5C3030305C3034305C303030745C303030655C303030785C303030745C3030305C3034305C3030307A5C3030305C3334315C303030765C3030315C3033335C303030725C303030655C3030315C3031355C3030306E5C3030305C3335315C3030305C3034305C303030705C303030725C3030305C3334315C303030635C30303065}
\BKM@entry{id=2,open,dest={6B693A7469746C65},srcline={149}}{5C3337365C3337375C303030545C303030695C303030745C303030755C3030306C5C3030306E5C3030305C3335355C3030305C3034305C303030735C303030745C303030725C303030615C3030306E5C30303061}
\BKM@entry{id=1,open,dest={6B693A7061706572},srcline={150}}{5C3337365C3337375C3030304D5C303030655C303030745C3030306F5C303030645C303030795C3030305C3034305C3030306F5C303030705C303030745C303030695C3030306D5C303030615C3030306C5C303030695C3030307A5C303030615C303030635C303030655C3030305C3034305C303030705C3030315C3133315C303030655C3030306E5C3030306F5C303030735C303030755C3030305C3034305C303030645C303030615C303030745C3030305C3034305C303030765C3030305C3034305C303030645C303030695C303030735C303030745C303030725C303030695C303030625C303030755C3030306F5C303030765C303030615C3030306E5C3030305C3335315C3030306D5C3030305C3034305C303030735C303030795C303030735C303030745C3030305C3335315C3030306D5C30303075}
\BKM@entry{id=2,open,dest={6B693A7469746C65},srcline={150}}{5C3337365C3337375C303030545C303030695C303030745C303030755C3030306C5C3030306E5C3030305C3335355C3030305C3034305C303030735C303030745C303030725C303030615C3030306E5C30303061}
\providecommand\@newglossary[4]{}
\@newglossary{main}{glg}{gls}{glo}
\@newglossary{acronym}{alg}{acr}{acn}
@@ -19,239 +20,258 @@
\@istfilename{kidiplom.ist}
\@glsorder{word}
\babel@aux{czech}{}
\BKM@entry{id=3,open,dest={6B693A616E6F746174696F6E},srcline={149}}{5C3337365C3337375C303030415C3030306E5C3030306F5C303030745C303030615C303030635C30303065}
\BKM@entry{id=4,open,dest={6B693A746F63},srcline={149}}{5C3337365C3337375C3030304F5C303030625C303030735C303030615C30303068}
\BKM@entry{id=5,open,dest={73656374696F6E2E31},srcline={160}}{5C3337365C3337375C303030315C3030305C3034305C3030305C3333325C303030765C3030306F5C30303064}
\BKM@entry{id=3,open,dest={6B693A616E6F746174696F6E},srcline={150}}{5C3337365C3337375C303030415C3030306E5C3030306F5C303030745C303030615C303030635C30303065}
\BKM@entry{id=4,open,dest={6B693A746F63},srcline={150}}{5C3337365C3337375C3030304F5C303030625C303030735C303030615C30303068}
\BKM@entry{id=5,open,dest={73656374696F6E2E31},srcline={161}}{5C3337365C3337375C303030315C3030305C3034305C3030305C3333325C303030765C3030306F5C30303064}
\@writefile{toc}{\contentsline {section}{\numberline {1}Úvod}{9}{section.1}\protected@file@percent }
\BKM@entry{id=6,open,dest={73656374696F6E2E32},srcline={166}}{5C3337365C3337375C303030325C3030305C3034305C303030445C303030695C303030735C303030745C303030725C303030695C303030625C303030755C3030306F5C303030765C303030615C3030306E5C3030305C3335315C3030305C3034305C303030735C303030795C303030735C303030745C3030305C3335315C3030306D5C30303079}
\BKM@entry{id=7,open,dest={73756273656374696F6E2E322E31},srcline={182}}{5C3337365C3337375C303030325C3030302E5C303030315C3030305C3034305C3030304B5C3030306F5C3030306D5C303030755C3030306E5C303030695C3030306B5C303030615C303030635C303030655C3030305C3034305C303030765C3030305C3034305C303030735C3030305C3335355C303030745C30303069}
\BKM@entry{id=8,open,dest={73756273656374696F6E2E322E32},srcline={195}}{5C3337365C3337375C303030325C3030302E5C303030325C3030305C3034305C303030545C303030435C303030505C3030302F5C303030495C30303050}
\BKM@entry{id=6,open,dest={73656374696F6E2E32},srcline={176}}{5C3337365C3337375C303030325C3030305C3034305C303030445C303030695C303030735C303030745C303030725C303030695C303030625C303030755C3030306F5C303030765C303030615C3030306E5C3030305C3335315C3030305C3034305C303030735C303030795C303030735C303030745C3030305C3335315C3030306D5C30303079}
\BKM@entry{id=7,open,dest={73756273656374696F6E2E322E31},srcline={190}}{5C3337365C3337375C303030325C3030302E5C303030315C3030305C3034305C303030505C3030306F5C3030315C3031355C3030305C3335355C303030745C303030615C3030315C3031355C3030306F5C303030765C3030305C3335315C3030305C3034305C303030735C3030305C3335355C303030745C3030315C303333}
\@writefile{toc}{\contentsline {section}{\numberline {2}Distribuované systémy}{10}{section.2}\protected@file@percent }
\@writefile{loe}{\contentsline {definition}{\ifthmt@listswap Definice~1\else \numberline {1}Definice\fi \thmtformatoptarg {Počítačováť}}{10}{definition.1}\protected@file@percent }
\@writefile{loe}{\contentsline {definition}{\ifthmt@listswap Definice~2\else \numberline {2}Definice\fi \thmtformatoptarg {Distribuovaný systém}}{10}{definition.2}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {2.1}Komunikace v síti}{10}{subsection.2.1}\protected@file@percent }
\@writefile{loe}{\contentsline {definition}{\ifthmt@listswap Definice~3\else \numberline {3}Definice\fi \thmtformatoptarg {Komunikační protokol}}{10}{definition.3}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {2.2}TCP/IP}{11}{subsection.2.2}\protected@file@percent }
\BKM@entry{id=9,open,dest={73756273656374696F6E2E322E33},srcline={229}}{5C3337365C3337375C303030325C3030302E5C303030335C3030305C3034305C303030415C303030725C303030635C303030685C303030695C303030745C303030655C3030306B5C303030745C303030755C303030725C30303079}
\BKM@entry{id=10,open,dest={73756273756273656374696F6E2E322E332E31},srcline={233}}{5C3337365C3337375C303030325C3030302E5C303030335C3030302E5C303030315C3030305C3034305C3030304B5C3030306C5C303030695C303030655C3030306E5C303030745C3030302D5C303030535C303030655C303030725C303030765C303030655C30303072}
\BKM@entry{id=11,open,dest={73756273756273656374696F6E2E322E332E32},srcline={237}}{5C3337365C3337375C303030325C3030302E5C303030335C3030302E5C303030325C3030305C3034305C303030505C303030655C303030655C303030725C3030302D5C303030745C3030306F5C3030302D5C303030505C303030655C303030655C30303072}
\BKM@entry{id=12,open,dest={73756273656374696F6E2E322E34},srcline={239}}{5C3337365C3337375C303030325C3030302E5C303030345C3030305C3034305C303030525C3030306F5C303030645C303030695C3030306E5C303030615C3030305C3034305C303030705C303030725C3030306F5C303030745C3030306F5C3030306B5C3030306F5C3030306C5C3030315C3135375C3030305C3034305C303030545C303030435C303030505C3030302F5C303030495C30303050}
\@writefile{toc}{\contentsline {subsection}{\numberline {2.3}Architektury}{12}{subsection.2.3}\protected@file@percent }
\@writefile{toc}{\contentsline {subsubsection}{\numberline {2.3.1}Klient-Server}{12}{subsubsection.2.3.1}\protected@file@percent }
\@writefile{toc}{\contentsline {subsubsection}{\numberline {2.3.2}Peer-to-Peer}{12}{subsubsection.2.3.2}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {2.4}Rodina protokolů TCP/IP}{12}{subsection.2.4}\protected@file@percent }
\BKM@entry{id=13,open,dest={73756273656374696F6E2E322E35},srcline={248}}{5C3337365C3337375C303030325C3030302E5C303030355C3030305C3034305C303030505C303030725C3030306F5C303030745C3030306F5C3030306B5C3030306F5C3030306C5C303030795C3030305C3034305C303030765C3030305C3034305C303030745C303030725C303030615C3030306E5C303030735C303030705C3030306F5C303030725C303030745C3030306E5C3030305C3335355C3030305C3034305C303030765C303030725C303030735C303030745C303030765C3030315C303333}
\BKM@entry{id=14,open,dest={73756273756273656374696F6E2E322E352E31},srcline={252}}{5C3337365C3337375C303030325C3030302E5C303030355C3030302E5C303030315C3030305C3034305C303030535C3030306F5C303030635C3030306B5C303030655C303030745C30303079}
\BKM@entry{id=15,open,dest={73756273756273656374696F6E2E322E352E32},srcline={258}}{5C3337365C3337375C303030325C3030302E5C303030355C3030302E5C303030325C3030305C3034305C303030545C303030435C30303050}
\@writefile{toc}{\contentsline {subsection}{\numberline {2.5}Protokoly v transportní vrstvě}{13}{subsection.2.5}\protected@file@percent }
\@writefile{toc}{\contentsline {subsubsection}{\numberline {2.5.1}Sockety}{13}{subsubsection.2.5.1}\protected@file@percent }
\@writefile{toc}{\contentsline {subsubsection}{\numberline {2.5.2}TCP}{13}{subsubsection.2.5.2}\protected@file@percent }
\BKM@entry{id=16,open,dest={73756273756273656374696F6E2E322E352E33},srcline={266}}{5C3337365C3337375C303030325C3030302E5C303030355C3030302E5C303030335C3030305C3034305C303030535C303030705C3030306F5C3030306C5C303030655C303030685C3030306C5C303030695C303030765C3030306F5C303030735C30303074}
\BKM@entry{id=17,open,dest={73756273756273656374696F6E2E322E352E34},srcline={274}}{5C3337365C3337375C303030325C3030302E5C303030355C3030302E5C303030345C3030305C3034305C303030555C303030445C30303050}
\BKM@entry{id=18,open,dest={73756273756273656374696F6E2E322E352E35},srcline={281}}{5C3337365C3337375C303030325C3030302E5C303030355C3030302E5C303030355C3030305C3034305C303030515C303030555C303030495C30303043}
\@writefile{toc}{\contentsline {subsubsection}{\numberline {2.5.3}Spolehlivost}{14}{subsubsection.2.5.3}\protected@file@percent }
\@writefile{toc}{\contentsline {subsubsection}{\numberline {2.5.4}UDP}{14}{subsubsection.2.5.4}\protected@file@percent }
\@writefile{toc}{\contentsline {subsubsection}{\numberline {2.5.5}QUIC}{15}{subsubsection.2.5.5}\protected@file@percent }
\BKM@entry{id=19,open,dest={73756273656374696F6E2E322E36},srcline={299}}{5C3337365C3337375C303030325C3030302E5C303030365C3030305C3034305C303030505C303030725C3030306F5C303030745C3030306F5C3030306B5C3030306F5C3030306C5C303030795C3030305C3034305C303030765C3030305C3034305C303030615C303030705C3030306C5C303030695C3030306B5C303030615C3030315C3031355C3030306E5C3030305C3335355C3030305C3034305C303030765C303030725C303030735C303030745C303030765C3030315C303333}
\BKM@entry{id=20,open,dest={73756273756273656374696F6E2E322E362E31},srcline={303}}{5C3337365C3337375C303030325C3030302E5C303030365C3030302E5C303030315C3030305C3034305C303030485C303030545C303030545C30303050}
\BKM@entry{id=21,open,dest={73756273756273656374696F6E2E322E362E32},srcline={309}}{5C3337365C3337375C303030325C3030302E5C303030365C3030302E5C303030325C3030305C3034305C303030485C303030545C303030545C303030505C3030302F5C30303033}
\BKM@entry{id=22,open,dest={73756273756273656374696F6E2E322E362E33},srcline={313}}{5C3337365C3337375C303030325C3030302E5C303030365C3030302E5C303030335C3030305C3034305C303030675C303030525C303030505C30303043}
\BKM@entry{id=23,open,dest={73756273756273656374696F6E2E322E362E34},srcline={317}}{5C3337365C3337375C303030325C3030302E5C303030365C3030302E5C303030345C3030305C3034305C3030304D5C303030695C303030645C303030645C3030306C5C303030655C303030775C303030615C303030725C30303065}
\@writefile{toc}{\contentsline {subsection}{\numberline {2.6}Protokoly v aplikační vrstvě}{16}{subsection.2.6}\protected@file@percent }
\@writefile{toc}{\contentsline {subsubsection}{\numberline {2.6.1}HTTP}{16}{subsubsection.2.6.1}\protected@file@percent }
\@writefile{toc}{\contentsline {subsubsection}{\numberline {2.6.2}HTTP/3}{16}{subsubsection.2.6.2}\protected@file@percent }
\@writefile{toc}{\contentsline {subsubsection}{\numberline {2.6.3}gRPC}{16}{subsubsection.2.6.3}\protected@file@percent }
\BKM@entry{id=24,open,dest={73756273656374696F6E2E322E37},srcline={324}}{5C3337365C3337375C303030325C3030302E5C303030375C3030305C3034305C303030505C3030306F5C303030735C3030305C3335355C3030306C5C3030305C3334315C3030306E5C3030305C3335355C3030305C3034305C3030307A5C303030705C303030725C3030305C3334315C30303076}
\BKM@entry{id=25,open,dest={73756273756273656374696F6E2E322E372E31},srcline={328}}{5C3337365C3337375C303030325C3030302E5C303030375C3030302E5C303030315C3030305C3034305C303030535C303030655C303030725C303030695C303030615C3030306C5C303030695C3030307A5C303030615C303030635C30303065}
\@writefile{toc}{\contentsline {subsubsection}{\numberline {2.6.4}Middleware}{17}{subsubsection.2.6.4}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {2.7}Posílání zpráv}{17}{subsection.2.7}\protected@file@percent }
\@writefile{toc}{\contentsline {subsubsection}{\numberline {2.7.1}Serializace}{17}{subsubsection.2.7.1}\protected@file@percent }
\BKM@entry{id=26,open,dest={73756273756273656374696F6E2E322E372E32},srcline={363}}{5C3337365C3337375C303030325C3030302E5C303030375C3030302E5C303030325C3030305C3034305C3030304B5C3030305C3336335C303030645C3030306F5C303030765C3030305C3334315C3030306E5C3030305C3335355C3030305C3034305C3030307A5C303030705C303030725C3030305C3334315C30303076}
\@writefile{lol}{\contentsline {lstlisting}{\numberline {1}C++}{18}{lstlisting.1}\protected@file@percent }
\@writefile{lol}{\contentsline {lstlisting}{\numberline {2}C++}{18}{lstlisting.2}\protected@file@percent }
\@writefile{toc}{\contentsline {subsubsection}{\numberline {2.7.2}Kódování zpráv}{18}{subsubsection.2.7.2}\protected@file@percent }
\BKM@entry{id=27,open,dest={73756273756273656374696F6E2E322E372E33},srcline={371}}{5C3337365C3337375C303030325C3030302E5C303030375C3030302E5C303030335C3030305C3034305C303030495C3030306D5C303030705C3030306C5C303030655C3030306D5C303030655C3030306E5C303030745C303030615C303030635C30303065}
\BKM@entry{id=28,open,dest={73756273756273656374696F6E2E322E372E34},srcline={377}}{5C3337365C3337375C303030325C3030302E5C303030375C3030302E5C303030345C3030305C3034305C303030445C303030655C303030745C303030655C3030306B5C303030635C303030655C3030305C3034305C303030615C3030305C3034305C3030306E5C3030305C3334315C303030705C303030725C303030615C303030765C303030615C3030305C3034305C303030635C303030685C303030795C30303062}
\BKM@entry{id=29,open,dest={73756273656374696F6E2E322E38},srcline={385}}{5C3337365C3337375C303030325C3030302E5C303030385C3030305C3034305C303030415C303030735C303030795C3030306E5C303030635C303030685C303030725C3030306F5C3030306E5C3030305C3335355C3030305C3034305C303030495C3030304F}
\@writefile{toc}{\contentsline {subsubsection}{\numberline {2.7.3}Implementace}{19}{subsubsection.2.7.3}\protected@file@percent }
\@writefile{toc}{\contentsline {subsubsection}{\numberline {2.7.4}Detekce a náprava chyb}{19}{subsubsection.2.7.4}\protected@file@percent }
\BKM@entry{id=30,open,dest={73756273756273656374696F6E2E322E382E31},srcline={391}}{5C3337365C3337375C303030325C3030302E5C303030385C3030302E5C303030315C3030305C3034305C3030305A5C303030655C303030725C3030306F5C3030304D5C30303051}
\BKM@entry{id=31,open,dest={73756273756273656374696F6E2E322E382E32},srcline={397}}{5C3337365C3337375C303030325C3030302E5C303030385C3030302E5C303030325C3030305C3034305C303030575C3030306F5C303030725C3030306B5C3030305C3034305C303030735C303030745C303030655C303030615C3030306C5C303030695C3030306E5C30303067}
\BKM@entry{id=32,open,dest={73756273756273656374696F6E2E322E382E33},srcline={401}}{5C3337365C3337375C303030325C3030302E5C303030385C3030302E5C303030335C3030305C3034305C303030415C303030735C303030795C3030306E5C303030635C3030302F5C303030415C303030775C303030615C303030695C30303074}
\@writefile{toc}{\contentsline {subsection}{\numberline {2.8}Asynchroní IO}{20}{subsection.2.8}\protected@file@percent }
\@writefile{toc}{\contentsline {subsubsection}{\numberline {2.8.1}ZeroMQ}{20}{subsubsection.2.8.1}\protected@file@percent }
\@writefile{toc}{\contentsline {subsubsection}{\numberline {2.8.2}Work stealing}{20}{subsubsection.2.8.2}\protected@file@percent }
\@writefile{toc}{\contentsline {subsubsection}{\numberline {2.8.3}Async/Await}{20}{subsubsection.2.8.3}\protected@file@percent }
\BKM@entry{id=33,open,dest={73756273756273656374696F6E2E322E382E34},srcline={407}}{5C3337365C3337375C303030325C3030302E5C303030385C3030302E5C303030345C3030305C3034305C303030425C3030306F5C3030306F5C303030735C303030745C3030305C3034305C303030415C303030735C303030695C3030306F}
\BKM@entry{id=34,open,dest={73756273756273656374696F6E2E322E382E35},srcline={419}}{5C3337365C3337375C303030325C3030302E5C303030385C3030302E5C303030355C3030305C3034305C303030535C303030745C303030615C303030635C3030306B5C3030305C3034305C303030705C3030306F5C303030695C3030306E5C303030745C303030655C30303072}
\@writefile{toc}{\contentsline {subsubsection}{\numberline {2.8.4}Boost Asio}{21}{subsubsection.2.8.4}\protected@file@percent }
\@writefile{toc}{\contentsline {subsubsection}{\numberline {2.8.5}Stack pointer}{21}{subsubsection.2.8.5}\protected@file@percent }
\BKM@entry{id=35,open,dest={73756273656374696F6E2E322E39},srcline={431}}{5C3337365C3337375C303030325C3030302E5C303030395C3030305C3034305C3030304D5C303030655C303030745C303030725C303030695C3030306B5C30303079}
\BKM@entry{id=36,open,dest={73756273756273656374696F6E2E322E392E31},srcline={435}}{5C3337365C3337375C303030325C3030302E5C303030395C3030302E5C303030315C3030305C3034305C303030545C303030695C3030306D5C303030655C303030735C303030635C303030615C3030306C5C303030655C303030445C30303042}
\BKM@entry{id=37,open,dest={73756273756273656374696F6E2E322E392E32},srcline={439}}{5C3337365C3337375C303030325C3030302E5C303030395C3030302E5C303030325C3030305C3034305C303030475C303030725C303030615C303030665C303030615C3030306E5C30303061}
\BKM@entry{id=38,open,dest={73756273756273656374696F6E2E322E392E33},srcline={445}}{5C3337365C3337375C303030325C3030302E5C303030395C3030302E5C303030335C3030305C3034305C303030495C3030306D5C303030475C303030755C30303069}
\BKM@entry{id=39,open,dest={73756273756273656374696F6E2E322E392E34},srcline={449}}{5C3337365C3337375C303030325C3030302E5C303030395C3030302E5C303030345C3030305C3034305C303030545C303030725C303030615C303030635C30303079}
\@writefile{toc}{\contentsline {subsection}{\numberline {2.9}Metriky}{22}{subsection.2.9}\protected@file@percent }
\@writefile{toc}{\contentsline {subsubsection}{\numberline {2.9.1}TimescaleDB}{22}{subsubsection.2.9.1}\protected@file@percent }
\@writefile{toc}{\contentsline {subsubsection}{\numberline {2.9.2}Grafana}{22}{subsubsection.2.9.2}\protected@file@percent }
\@writefile{toc}{\contentsline {subsubsection}{\numberline {2.9.3}ImGui}{22}{subsubsection.2.9.3}\protected@file@percent }
\@writefile{toc}{\contentsline {subsubsection}{\numberline {2.9.4}Tracy}{22}{subsubsection.2.9.4}\protected@file@percent }
\BKM@entry{id=40,open,dest={73756273756273656374696F6E2E322E392E35},srcline={453}}{5C3337365C3337375C303030325C3030302E5C303030395C3030302E5C303030355C3030305C3034305C3030304B5C3030306F5C3030306E5C3030306B5C303030725C3030305C3335315C303030745C3030306E5C3030305C3335355C3030305C3034305C3030306D5C303030655C303030745C303030725C303030695C3030306B5C30303079}
\BKM@entry{id=41,open,dest={73756273756273656374696F6E2E322E392E36},srcline={469}}{5C3337365C3337375C303030325C3030302E5C303030395C3030302E5C303030365C3030305C3034305C303030535C303030625C3030305C3335355C303030725C3030305C3334315C3030306E5C3030305C3335355C3030305C3034305C303030765C3030305C3034305C303030725C303030655C3030305C3334315C3030306C5C3030306E5C3030305C3335315C3030306D5C3030305C3034305C3030315C3031355C303030615C303030735C30303065}
\@writefile{toc}{\contentsline {subsubsection}{\numberline {2.9.5}Konkrétní metriky}{23}{subsubsection.2.9.5}\protected@file@percent }
\@writefile{toc}{\contentsline {subsubsection}{\numberline {2.9.6}Sbírání v reálném čase}{23}{subsubsection.2.9.6}\protected@file@percent }
\BKM@entry{id=42,open,dest={73656374696F6E2E33},srcline={487}}{5C3337365C3337375C303030335C3030305C3034305C303030485C303030725C303030615C3030305C3034305C303030705C303030725C3030306F5C3030305C3034305C303030765C3030305C3335355C303030635C303030655C3030305C3034305C303030685C303030725C3030305C3334315C3030315C3031355C3030315C313537}
\BKM@entry{id=43,open,dest={73756273656374696F6E2E332E31},srcline={493}}{5C3337365C3337375C303030335C3030302E5C303030315C3030305C3034305C303030485C303030725C30303079}
\BKM@entry{id=44,open,dest={73756273756273656374696F6E2E332E312E31},srcline={507}}{5C3337365C3337375C303030335C3030302E5C303030315C3030302E5C303030315C3030305C3034305C303030455C3030306E5C303030745C30303074}
\@writefile{toc}{\contentsline {section}{\numberline {3}Hra pro více hráčů}{24}{section.3}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {3.1}Hry}{24}{subsection.3.1}\protected@file@percent }
\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.1.1}Entt}{24}{subsubsection.3.1.1}\protected@file@percent }
\BKM@entry{id=45,open,dest={73756273656374696F6E2E332E32},srcline={546}}{5C3337365C3337375C303030335C3030302E5C303030325C3030305C3034305C303030535C303030765C3030315C3033335C30303074}
\@writefile{lol}{\contentsline {lstlisting}{\numberline {3}C++}{25}{lstlisting.3}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {3.2}Svět}{25}{subsection.3.2}\protected@file@percent }
\BKM@entry{id=46,open,dest={73756273756273656374696F6E2E332E322E31},srcline={550}}{5C3337365C3337375C303030335C3030302E5C303030325C3030302E5C303030315C3030305C3034305C3030304F5C303030765C3030306C5C303030615C303030645C303030615C3030315C3031355C3030305C3034305C303030705C303030725C3030306F5C3030305C3034305C303030685C303030725C303030755C3030305C3034305C3030306A5C303030655C303030645C3030306E5C3030306F5C303030685C3030306F5C3030305C3034305C303030685C303030725C3030305C3334315C3030315C3031355C30303065}
\BKM@entry{id=47,open,dest={73756273756273656374696F6E2E332E322E32},srcline={554}}{5C3337365C3337375C303030335C3030302E5C303030325C3030302E5C303030325C3030305C3034305C3030304F5C303030765C3030306C5C303030615C303030645C303030615C3030315C3031355C3030305C3034305C303030705C303030725C3030306F5C3030305C3034305C303030685C303030725C303030755C3030305C3034305C303030765C3030305C3335355C303030635C303030655C3030305C3034305C303030685C303030725C3030305C3334315C3030315C3031355C3030315C313537}
\BKM@entry{id=48,open,dest={73756273656374696F6E2E332E33},srcline={562}}{5C3337365C3337375C303030335C3030302E5C303030335C3030305C3034305C3030304B5C3030306C5C303030695C303030655C3030306E5C303030745C3030302D5C303030535C303030655C303030725C303030765C303030655C303030725C3030305C3034305C303030615C303030725C303030635C303030685C303030695C303030745C303030655C3030306B5C303030745C303030755C303030725C30303061}
\BKM@entry{id=49,open,dest={73756273656374696F6E2E332E34},srcline={574}}{5C3337365C3337375C303030335C3030302E5C303030345C3030305C3034305C303030535C303030655C303030725C303030765C303030655C30303072}
\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.2.1}Ovladač pro hru jednoho hráče}{26}{subsubsection.3.2.1}\protected@file@percent }
\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.2.2}Ovladač pro hru více hráčů}{26}{subsubsection.3.2.2}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {3.3}Klient-Server architektura}{26}{subsection.3.3}\protected@file@percent }
\BKM@entry{id=50,open,dest={73756273756273656374696F6E2E332E342E31},srcline={579}}{5C3337365C3337375C303030335C3030302E5C303030345C3030302E5C303030315C3030305C3034305C303030525C303030655C303030675C303030695C303030735C303030745C303030725C3030305C3034305C303030735C303030705C3030306F5C3030306A5C303030655C3030306E5C3030305C333535}
\BKM@entry{id=51,open,dest={73756273756273656374696F6E2E332E342E32},srcline={587}}{5C3337365C3337375C303030335C3030302E5C303030345C3030302E5C303030325C3030305C3034305C303030525C303030655C303030705C3030306C5C303030695C3030306B5C3030305C3334315C303030745C3030306F5C30303072}
\BKM@entry{id=52,open,dest={73756273756273656374696F6E2E332E342E33},srcline={593}}{5C3337365C3337375C303030335C3030302E5C303030345C3030302E5C303030335C3030305C3034305C303030495C3030306E5C303030745C303030655C303030725C303030655C303030735C303030745C3030305C3034305C3030306D5C303030615C3030306E5C303030615C303030675C303030655C30303072}
\@writefile{toc}{\contentsline {subsection}{\numberline {3.4}Server}{27}{subsection.3.4}\protected@file@percent }
\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.4.1}Registr spojení}{27}{subsubsection.3.4.1}\protected@file@percent }
\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.4.2}Replikátor}{27}{subsubsection.3.4.2}\protected@file@percent }
\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.4.3}Interest manager}{27}{subsubsection.3.4.3}\protected@file@percent }
\BKM@entry{id=53,open,dest={73756273656374696F6E2E332E35},srcline={603}}{5C3337365C3337375C303030335C3030302E5C303030355C3030305C3034305C3030304B5C3030306C5C303030695C303030655C3030306E5C30303074}
\BKM@entry{id=54,open,dest={73756273756273656374696F6E2E332E352E31},srcline={607}}{5C3337365C3337375C303030335C3030302E5C303030355C3030302E5C303030315C3030305C3034305C303030525C303030655C303030705C3030306C5C303030695C303030635C303030615C303030745C3030306F5C303030725C3030305C3034305C303030635C3030306F5C3030306E5C303030745C303030725C3030306F5C3030306C5C3030306C5C303030655C30303072}
\BKM@entry{id=55,open,dest={73756273756273656374696F6E2E332E352E32},srcline={611}}{5C3337365C3337375C303030335C3030302E5C303030355C3030302E5C303030325C3030305C3034305C303030495C3030306E5C303030745C303030655C303030725C303030705C3030306F5C3030306C5C303030615C303030635C30303065}
\BKM@entry{id=56,open,dest={73756273756273656374696F6E2E332E352E33},srcline={620}}{5C3337365C3337375C303030335C3030302E5C303030355C3030302E5C303030335C3030305C3034305C303030525C3030306F5C3030306C5C3030306C5C303030625C303030615C303030635C3030306B5C3030305C3034305C303030615C3030305C3034305C303030735C303030695C3030306D5C303030755C3030306C5C303030615C303030635C303030655C3030305C3034305C303030765C3030306C5C303030615C303030735C303030745C3030306E5C3030305C3335355C303030685C3030306F5C3030305C3034305C303030685C303030725C3030305C3334315C3030315C3031355C30303065}
\@writefile{toc}{\contentsline {subsection}{\numberline {3.5}Klient}{28}{subsection.3.5}\protected@file@percent }
\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.5.1}Replicator controller}{28}{subsubsection.3.5.1}\protected@file@percent }
\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.5.2}Interpolace}{28}{subsubsection.3.5.2}\protected@file@percent }
\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.5.3}Rollback a simulace vlastního hráče}{28}{subsubsection.3.5.3}\protected@file@percent }
\BKM@entry{id=57,open,dest={73756273656374696F6E2E332E36},srcline={628}}{5C3337365C3337375C303030335C3030302E5C303030365C3030305C3034305C3030304B5C3030306F5C3030306D5C303030755C3030306E5C303030695C3030306B5C303030615C3030315C3031355C3030306E5C3030305C3335355C3030305C3034305C303030705C303030725C3030306F5C303030745C3030306F5C3030306B5C3030306F5C3030306C}
\BKM@entry{id=58,open,dest={73756273656374696F6E2E332E37},srcline={640}}{5C3337365C3337375C303030335C3030302E5C303030375C3030305C3034305C303030505C303030725C3030306F5C303030745C3030306F5C3030306B5C3030306F5C3030306C5C3030305C3034305C303030515C303030555C303030495C303030435C30303072}
\@writefile{toc}{\contentsline {subsection}{\numberline {2.1}Počítačové}{10}{subsection.2.1}\protected@file@percent }
\BKM@entry{id=8,open,dest={73756273656374696F6E2E322E32},srcline={233}}{5C3337365C3337375C303030325C3030302E5C303030325C3030305C3034305C3030304B5C3030306F5C3030306D5C303030755C3030306E5C303030695C3030306B5C303030615C303030635C303030655C3030305C3034305C303030765C3030305C3034305C303030735C3030305C3335355C303030745C30303069}
\BKM@entry{id=9,open,dest={73756273656374696F6E2E322E33},srcline={241}}{5C3337365C3337375C303030325C3030302E5C303030335C3030305C3034305C303030525C3030306F5C303030645C303030695C3030306E5C303030615C3030305C3034305C303030705C303030725C3030306F5C303030745C3030306F5C3030306B5C3030306F5C3030306C5C3030315C3135375C3030305C3034305C303030545C303030435C303030505C3030302F5C303030495C30303050}
\@writefile{lof}{\contentsline {figure}{\numberline {1}{\ignorespaces Příklad využití propojovacích bodů}}{11}{figure.1}\protected@file@percent }
\newlabel{fig:network01}{{1}{11}{Příklad využití propojovacích bodů}{figure.1}{}}
\@writefile{toc}{\contentsline {subsection}{\numberline {2.2}Komunikace v síti}{11}{subsection.2.2}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {2.3}Rodina protokolů TCP/IP}{11}{subsection.2.3}\protected@file@percent }
\BKM@entry{id=10,open,dest={73756273656374696F6E2E322E34},srcline={276}}{5C3337365C3337375C303030325C3030302E5C303030345C3030305C3034305C303030505C303030725C3030306F5C303030745C3030306F5C3030306B5C3030306F5C3030306C5C303030795C3030305C3034305C303030765C3030305C3034305C303030615C303030705C3030306C5C303030695C3030306B5C303030615C3030315C3031355C3030306E5C3030305C3335355C3030305C3034305C303030765C303030725C303030735C303030745C303030765C3030315C303333}
\@writefile{toc}{\contentsline {subsection}{\numberline {2.4}Protokoly v aplikační vrstvě}{12}{subsection.2.4}\protected@file@percent }
\BKM@entry{id=11,open,dest={73756273756273656374696F6E2E322E342E31},srcline={280}}{5C3337365C3337375C303030325C3030302E5C303030345C3030302E5C303030315C3030305C3034305C3030304D5C303030695C303030645C303030645C3030306C5C303030655C303030775C303030615C303030725C30303065}
\BKM@entry{id=12,open,dest={73756273756273656374696F6E2E322E342E32},srcline={284}}{5C3337365C3337375C303030325C3030302E5C303030345C3030302E5C303030325C3030305C3034305C303030485C303030545C303030545C30303050}
\BKM@entry{id=13,open,dest={73756273756273656374696F6E2E322E342E33},srcline={294}}{5C3337365C3337375C303030325C3030302E5C303030345C3030302E5C303030335C3030305C3034305C303030485C303030545C303030545C303030505C3030302F5C30303033}
\BKM@entry{id=14,open,dest={73756273756273656374696F6E2E322E342E34},srcline={298}}{5C3337365C3337375C303030325C3030302E5C303030345C3030302E5C303030345C3030305C3034305C303030675C303030525C303030505C30303043}
\BKM@entry{id=15,open,dest={73756273756273656374696F6E2E322E342E35},srcline={304}}{5C3337365C3337375C303030325C3030302E5C303030345C3030302E5C303030355C3030305C3034305C303030495C3030306E5C303030745C303030655C303030725C3030306E5C303030655C303030745C3030305C3034305C303030705C303030725C3030306F5C303030745C3030306F5C303030635C3030306F5C3030306C}
\@writefile{lof}{\contentsline {figure}{\numberline {2}{\ignorespaces Komunikace vrstev TCP/IP}}{13}{figure.2}\protected@file@percent }
\newlabel{fig:tcpip}{{2}{13}{Komunikace vrstev TCP/IP}{figure.2}{}}
\@writefile{toc}{\contentsline {subsubsection}{\numberline {2.4.1}Middleware}{13}{subsubsection.2.4.1}\protected@file@percent }
\@writefile{toc}{\contentsline {subsubsection}{\numberline {2.4.2}HTTP}{13}{subsubsection.2.4.2}\protected@file@percent }
\@writefile{toc}{\contentsline {subsubsection}{\numberline {2.4.3}HTTP/3}{13}{subsubsection.2.4.3}\protected@file@percent }
\BKM@entry{id=16,open,dest={73756273656374696F6E2E322E35},srcline={309}}{5C3337365C3337375C303030325C3030302E5C303030355C3030305C3034305C303030505C303030725C3030306F5C303030745C3030306F5C3030306B5C3030306F5C3030306C5C303030795C3030305C3034305C303030765C3030305C3034305C303030745C303030725C303030615C3030306E5C303030735C303030705C3030306F5C303030725C303030745C3030306E5C3030305C3335355C3030305C3034305C303030765C303030725C303030735C303030745C303030765C3030315C303333}
\BKM@entry{id=17,open,dest={73756273756273656374696F6E2E322E352E31},srcline={313}}{5C3337365C3337375C303030325C3030302E5C303030355C3030302E5C303030315C3030305C3034305C303030545C303030435C30303050}
\BKM@entry{id=18,open,dest={73756273756273656374696F6E2E322E352E32},srcline={323}}{5C3337365C3337375C303030325C3030302E5C303030355C3030302E5C303030325C3030305C3034305C303030535C303030705C3030306F5C3030306C5C303030655C303030685C3030306C5C303030695C303030765C3030306F5C303030735C30303074}
\@writefile{toc}{\contentsline {subsubsection}{\numberline {2.4.4}gRPC}{14}{subsubsection.2.4.4}\protected@file@percent }
\@writefile{toc}{\contentsline {subsubsection}{\numberline {2.4.5}Internet protocol}{14}{subsubsection.2.4.5}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {2.5}Protokoly v transportní vrstvě}{14}{subsection.2.5}\protected@file@percent }
\@writefile{toc}{\contentsline {subsubsection}{\numberline {2.5.1}TCP}{14}{subsubsection.2.5.1}\protected@file@percent }
\@writefile{toc}{\contentsline {subsubsection}{\numberline {2.5.2}Spolehlivost}{14}{subsubsection.2.5.2}\protected@file@percent }
\BKM@entry{id=19,open,dest={73756273756273656374696F6E2E322E352E33},srcline={331}}{5C3337365C3337375C303030325C3030302E5C303030355C3030302E5C303030335C3030305C3034305C303030555C303030445C30303050}
\BKM@entry{id=20,open,dest={73756273756273656374696F6E2E322E352E34},srcline={338}}{5C3337365C3337375C303030325C3030302E5C303030355C3030302E5C303030345C3030305C3034305C303030515C303030555C303030495C30303043}
\@writefile{toc}{\contentsline {subsubsection}{\numberline {2.5.3}UDP}{15}{subsubsection.2.5.3}\protected@file@percent }
\@writefile{toc}{\contentsline {subsubsection}{\numberline {2.5.4}QUIC}{15}{subsubsection.2.5.4}\protected@file@percent }
\BKM@entry{id=21,open,dest={73756273656374696F6E2E322E36},srcline={368}}{5C3337365C3337375C303030325C3030302E5C303030365C3030305C3034305C303030415C303030735C303030795C3030306E5C303030635C303030685C303030725C3030306F5C3030306E5C3030305C3335355C3030305C3034305C303030495C3030304F}
\BKM@entry{id=22,open,dest={73756273756273656374696F6E2E322E362E31},srcline={374}}{5C3337365C3337375C303030325C3030302E5C303030365C3030302E5C303030315C3030305C3034305C3030305A5C303030655C303030725C3030306F5C3030304D5C30303051}
\BKM@entry{id=23,open,dest={73756273756273656374696F6E2E322E362E32},srcline={380}}{5C3337365C3337375C303030325C3030302E5C303030365C3030302E5C303030325C3030305C3034305C303030575C3030306F5C303030725C3030306B5C3030305C3034305C303030735C303030745C303030655C303030615C3030306C5C303030695C3030306E5C30303067}
\BKM@entry{id=24,open,dest={73756273756273656374696F6E2E322E362E33},srcline={384}}{5C3337365C3337375C303030325C3030302E5C303030365C3030302E5C303030335C3030305C3034305C303030415C303030735C303030795C3030306E5C303030635C3030302F5C303030415C303030775C303030615C303030695C30303074}
\@writefile{toc}{\contentsline {subsection}{\numberline {2.6}Asynchroní IO}{17}{subsection.2.6}\protected@file@percent }
\@writefile{toc}{\contentsline {subsubsection}{\numberline {2.6.1}ZeroMQ}{17}{subsubsection.2.6.1}\protected@file@percent }
\@writefile{toc}{\contentsline {subsubsection}{\numberline {2.6.2}Work stealing}{17}{subsubsection.2.6.2}\protected@file@percent }
\@writefile{toc}{\contentsline {subsubsection}{\numberline {2.6.3}Async/Await}{17}{subsubsection.2.6.3}\protected@file@percent }
\BKM@entry{id=25,open,dest={73756273756273656374696F6E2E322E362E34},srcline={390}}{5C3337365C3337375C303030325C3030302E5C303030365C3030302E5C303030345C3030305C3034305C303030425C3030306F5C3030306F5C303030735C303030745C3030305C3034305C303030415C303030735C303030695C3030306F}
\BKM@entry{id=26,open,dest={73756273756273656374696F6E2E322E362E35},srcline={402}}{5C3337365C3337375C303030325C3030302E5C303030365C3030302E5C303030355C3030305C3034305C303030535C303030745C303030615C303030635C3030306B5C3030305C3034305C303030705C3030306F5C303030695C3030306E5C303030745C303030655C30303072}
\@writefile{toc}{\contentsline {subsubsection}{\numberline {2.6.4}Boost Asio}{18}{subsubsection.2.6.4}\protected@file@percent }
\@writefile{toc}{\contentsline {subsubsection}{\numberline {2.6.5}Stack pointer}{18}{subsubsection.2.6.5}\protected@file@percent }
\BKM@entry{id=27,open,dest={73756273656374696F6E2E322E37},srcline={444}}{5C3337365C3337375C303030325C3030302E5C303030375C3030305C3034305C303030415C303030725C303030635C303030685C303030695C303030745C303030655C3030306B5C303030745C303030755C303030725C30303079}
\BKM@entry{id=28,open,dest={73756273756273656374696F6E2E322E372E31},srcline={448}}{5C3337365C3337375C303030325C3030302E5C303030375C3030302E5C303030315C3030305C3034305C3030304B5C3030306C5C303030695C303030655C3030306E5C303030745C3030302D5C303030535C303030655C303030725C303030765C303030655C30303072}
\BKM@entry{id=29,open,dest={73756273756273656374696F6E2E322E372E32},srcline={452}}{5C3337365C3337375C303030325C3030302E5C303030375C3030302E5C303030325C3030305C3034305C303030505C303030655C303030655C303030725C3030302D5C303030745C3030306F5C3030302D5C303030505C303030655C303030655C30303072}
\BKM@entry{id=30,open,dest={73656374696F6E2E33},srcline={467}}{5C3337365C3337375C303030335C3030305C3034305C303030485C303030725C303030615C3030305C3034305C303030705C303030725C3030306F5C3030305C3034305C303030765C3030305C3335355C303030635C303030655C3030305C3034305C303030685C303030725C3030305C3334315C3030315C3031355C3030315C313537}
\BKM@entry{id=31,open,dest={73756273656374696F6E2E332E31},srcline={473}}{5C3337365C3337375C303030335C3030302E5C303030315C3030305C3034305C303030485C303030725C30303079}
\@writefile{toc}{\contentsline {subsection}{\numberline {2.7}Architektury}{20}{subsection.2.7}\protected@file@percent }
\@writefile{toc}{\contentsline {subsubsection}{\numberline {2.7.1}Klient-Server}{20}{subsubsection.2.7.1}\protected@file@percent }
\@writefile{toc}{\contentsline {subsubsection}{\numberline {2.7.2}Peer-to-Peer}{20}{subsubsection.2.7.2}\protected@file@percent }
\@writefile{toc}{\contentsline {section}{\numberline {3}Hra pro více hráčů}{20}{section.3}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {3.1}Hry}{20}{subsection.3.1}\protected@file@percent }
\BKM@entry{id=32,open,dest={73756273756273656374696F6E2E332E312E31},srcline={489}}{5C3337365C3337375C303030335C3030302E5C303030315C3030302E5C303030315C3030305C3034305C303030455C3030306E5C303030745C30303074}
\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.1.1}Entt}{21}{subsubsection.3.1.1}\protected@file@percent }
\@writefile{lol}{\contentsline {lstlisting}{\numberline {1}Příklad použití knihovny Entt}{21}{lstlisting.1}\protected@file@percent }
\BKM@entry{id=33,open,dest={73756273656374696F6E2E332E32},srcline={528}}{5C3337365C3337375C303030335C3030302E5C303030325C3030305C3034305C303030535C303030765C3030315C3033335C30303074}
\BKM@entry{id=34,open,dest={73756273756273656374696F6E2E332E322E31},srcline={532}}{5C3337365C3337375C303030335C3030302E5C303030325C3030302E5C303030315C3030305C3034305C3030304F5C303030765C3030306C5C303030615C303030645C303030615C3030315C3031355C3030305C3034305C303030705C303030725C3030306F5C3030305C3034305C303030685C303030725C303030755C3030305C3034305C3030306A5C303030655C303030645C3030306E5C3030306F5C303030685C3030306F5C3030305C3034305C303030685C303030725C3030305C3334315C3030315C3031355C30303065}
\BKM@entry{id=35,open,dest={73756273756273656374696F6E2E332E322E32},srcline={536}}{5C3337365C3337375C303030335C3030302E5C303030325C3030302E5C303030325C3030305C3034305C3030304F5C303030765C3030306C5C303030615C303030645C303030615C3030315C3031355C3030305C3034305C303030705C303030725C3030306F5C3030305C3034305C303030685C303030725C303030755C3030305C3034305C303030765C3030305C3335355C303030635C303030655C3030305C3034305C303030685C303030725C3030305C3334315C3030315C3031355C3030315C313537}
\BKM@entry{id=36,open,dest={73756273656374696F6E2E332E33},srcline={544}}{5C3337365C3337375C303030335C3030302E5C303030335C3030305C3034305C3030304B5C3030306C5C303030695C303030655C3030306E5C303030745C3030302D5C303030535C303030655C303030725C303030765C303030655C303030725C3030305C3034305C303030615C303030725C303030635C303030685C303030695C303030745C303030655C3030306B5C303030745C303030755C303030725C30303061}
\@writefile{toc}{\contentsline {subsection}{\numberline {3.2}Svět}{22}{subsection.3.2}\protected@file@percent }
\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.2.1}Ovladač pro hru jednoho hráče}{22}{subsubsection.3.2.1}\protected@file@percent }
\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.2.2}Ovladač pro hru více hráčů}{22}{subsubsection.3.2.2}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {3.3}Klient-Server architektura}{22}{subsection.3.3}\protected@file@percent }
\BKM@entry{id=37,open,dest={73756273656374696F6E2E332E34},srcline={554}}{5C3337365C3337375C303030335C3030302E5C303030345C3030305C3034305C303030505C3030306F5C303030735C3030305C3335355C3030306C5C3030305C3334315C3030306E5C3030305C3335355C3030305C3034305C3030307A5C303030705C303030725C3030305C3334315C30303076}
\BKM@entry{id=38,open,dest={73756273756273656374696F6E2E332E342E31},srcline={558}}{5C3337365C3337375C303030335C3030302E5C303030345C3030302E5C303030315C3030305C3034305C303030535C303030655C303030725C303030695C303030615C3030306C5C303030695C3030307A5C303030615C303030635C30303065}
\@writefile{toc}{\contentsline {subsection}{\numberline {3.4}Posílání zpráv}{23}{subsection.3.4}\protected@file@percent }
\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.4.1}Serializace}{23}{subsubsection.3.4.1}\protected@file@percent }
\BKM@entry{id=39,open,dest={73756273756273656374696F6E2E332E342E32},srcline={593}}{5C3337365C3337375C303030335C3030302E5C303030345C3030302E5C303030325C3030305C3034305C3030304B5C3030305C3336335C303030645C3030306F5C303030765C3030305C3334315C3030306E5C3030305C3335355C3030305C3034305C3030307A5C303030705C303030725C3030305C3334315C30303076}
\@writefile{lol}{\contentsline {lstlisting}{\numberline {2}cpp}{24}{lstlisting.2}\protected@file@percent }
\@writefile{lol}{\contentsline {lstlisting}{\numberline {3}cpp}{24}{lstlisting.3}\protected@file@percent }
\BKM@entry{id=40,open,dest={73756273756273656374696F6E2E332E342E33},srcline={601}}{5C3337365C3337375C303030335C3030302E5C303030345C3030302E5C303030335C3030305C3034305C303030495C3030306D5C303030705C3030306C5C303030655C3030306D5C303030655C3030306E5C303030745C303030615C303030635C30303065}
\BKM@entry{id=41,open,dest={73756273756273656374696F6E2E332E342E34},srcline={607}}{5C3337365C3337375C303030335C3030302E5C303030345C3030302E5C303030345C3030305C3034305C303030445C303030655C303030745C303030655C3030306B5C303030635C303030655C3030305C3034305C303030615C3030305C3034305C3030306E5C3030305C3334315C303030705C303030725C303030615C303030765C303030615C3030305C3034305C303030635C303030685C303030795C30303062}
\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.4.2}Kódování zpráv}{25}{subsubsection.3.4.2}\protected@file@percent }
\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.4.3}Implementace}{25}{subsubsection.3.4.3}\protected@file@percent }
\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.4.4}Detekce a náprava chyb}{25}{subsubsection.3.4.4}\protected@file@percent }
\BKM@entry{id=42,open,dest={73756273656374696F6E2E332E35},srcline={613}}{5C3337365C3337375C303030335C3030302E5C303030355C3030305C3034305C303030535C303030655C303030725C303030765C303030655C30303072}
\BKM@entry{id=43,open,dest={73756273756273656374696F6E2E332E352E31},srcline={618}}{5C3337365C3337375C303030335C3030302E5C303030355C3030302E5C303030315C3030305C3034305C303030525C303030655C303030675C303030695C303030735C303030745C303030725C3030305C3034305C303030735C303030705C3030306F5C3030306A5C303030655C3030306E5C3030305C333535}
\BKM@entry{id=44,open,dest={73756273756273656374696F6E2E332E352E32},srcline={626}}{5C3337365C3337375C303030335C3030302E5C303030355C3030302E5C303030325C3030305C3034305C303030525C303030655C303030705C3030306C5C303030695C3030306B5C3030305C3334315C303030745C3030306F5C30303072}
\BKM@entry{id=45,open,dest={73756273756273656374696F6E2E332E352E33},srcline={632}}{5C3337365C3337375C303030335C3030302E5C303030355C3030302E5C303030335C3030305C3034305C303030535C303030705C303030725C3030305C3334315C303030765C303030615C3030305C3034305C3030307A5C3030305C3334315C3030306A5C3030306D5C3030315C313537}
\@writefile{toc}{\contentsline {subsection}{\numberline {3.5}Server}{26}{subsection.3.5}\protected@file@percent }
\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.5.1}Registr spojení}{26}{subsubsection.3.5.1}\protected@file@percent }
\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.5.2}Replikátor}{26}{subsubsection.3.5.2}\protected@file@percent }
\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.5.3}Správa zájmů}{26}{subsubsection.3.5.3}\protected@file@percent }
\BKM@entry{id=46,open,dest={73756273656374696F6E2E332E36},srcline={642}}{5C3337365C3337375C303030335C3030302E5C303030365C3030305C3034305C3030304B5C3030306C5C303030695C303030655C3030306E5C30303074}
\BKM@entry{id=47,open,dest={73756273756273656374696F6E2E332E362E31},srcline={646}}{5C3337365C3337375C303030335C3030302E5C303030365C3030302E5C303030315C3030305C3034305C303030525C303030655C303030705C3030306C5C303030695C303030635C303030615C303030745C3030306F5C303030725C3030305C3034305C303030635C3030306F5C3030306E5C303030745C303030725C3030306F5C3030306C5C3030306C5C303030655C30303072}
\BKM@entry{id=48,open,dest={73756273756273656374696F6E2E332E362E32},srcline={650}}{5C3337365C3337375C303030335C3030302E5C303030365C3030302E5C303030325C3030305C3034305C303030495C3030306E5C303030745C303030655C303030725C303030705C3030306F5C3030306C5C303030615C303030635C30303065}
\BKM@entry{id=49,open,dest={73756273756273656374696F6E2E332E362E33},srcline={659}}{5C3337365C3337375C303030335C3030302E5C303030365C3030302E5C303030335C3030305C3034305C303030525C3030306F5C3030306C5C3030306C5C303030625C303030615C303030635C3030306B5C3030305C3034305C303030615C3030305C3034305C303030735C303030695C3030306D5C303030755C3030306C5C303030615C303030635C303030655C3030305C3034305C303030765C3030306C5C303030615C303030735C303030745C3030306E5C3030305C3335355C303030685C3030306F5C3030305C3034305C303030685C303030725C3030305C3334315C3030315C3031355C30303065}
\@writefile{toc}{\contentsline {subsection}{\numberline {3.6}Klient}{27}{subsection.3.6}\protected@file@percent }
\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.6.1}Replicator controller}{27}{subsubsection.3.6.1}\protected@file@percent }
\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.6.2}Interpolace}{27}{subsubsection.3.6.2}\protected@file@percent }
\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.6.3}Rollback a simulace vlastního hráče}{27}{subsubsection.3.6.3}\protected@file@percent }
\BKM@entry{id=50,open,dest={73756273656374696F6E2E332E37},srcline={675}}{5C3337365C3337375C303030335C3030302E5C303030375C3030305C3034305C3030304D5C303030655C303030745C303030725C303030695C3030306B5C30303079}
\BKM@entry{id=51,open,dest={73756273756273656374696F6E2E332E372E31},srcline={679}}{5C3337365C3337375C303030335C3030302E5C303030375C3030302E5C303030315C3030305C3034305C303030545C303030695C3030306D5C303030655C303030735C303030635C303030615C3030306C5C303030655C303030445C30303042}
\BKM@entry{id=52,open,dest={73756273756273656374696F6E2E332E372E32},srcline={683}}{5C3337365C3337375C303030335C3030302E5C303030375C3030302E5C303030325C3030305C3034305C303030475C303030725C303030615C303030665C303030615C3030306E5C30303061}
\BKM@entry{id=53,open,dest={73756273756273656374696F6E2E332E372E33},srcline={689}}{5C3337365C3337375C303030335C3030302E5C303030375C3030302E5C303030335C3030305C3034305C303030495C3030306D5C303030475C303030755C30303069}
\BKM@entry{id=54,open,dest={73756273756273656374696F6E2E332E372E34},srcline={693}}{5C3337365C3337375C303030335C3030302E5C303030375C3030302E5C303030345C3030305C3034305C303030545C303030725C303030615C303030635C30303079}
\@writefile{toc}{\contentsline {subsection}{\numberline {3.7}Metriky}{28}{subsection.3.7}\protected@file@percent }
\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.7.1}TimescaleDB}{28}{subsubsection.3.7.1}\protected@file@percent }
\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.7.2}Grafana}{28}{subsubsection.3.7.2}\protected@file@percent }
\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.7.3}ImGui}{28}{subsubsection.3.7.3}\protected@file@percent }
\BKM@entry{id=55,open,dest={73756273756273656374696F6E2E332E372E35},srcline={697}}{5C3337365C3337375C303030335C3030302E5C303030375C3030302E5C303030355C3030305C3034305C3030304B5C3030306F5C3030306E5C3030306B5C303030725C3030305C3335315C303030745C3030306E5C3030305C3335355C3030305C3034305C3030306D5C303030655C303030745C303030725C303030695C3030306B5C30303079}
\BKM@entry{id=56,open,dest={73756273756273656374696F6E2E332E372E36},srcline={713}}{5C3337365C3337375C303030335C3030302E5C303030375C3030302E5C303030365C3030305C3034305C303030535C303030625C3030305C3335355C303030725C3030305C3334315C3030306E5C3030305C3335355C3030305C3034305C303030765C3030305C3034305C303030725C303030655C3030305C3334315C3030306C5C3030306E5C3030305C3335315C3030306D5C3030305C3034305C3030315C3031355C303030615C303030735C30303065}
\BKM@entry{id=57,open,dest={73756273656374696F6E2E332E38},srcline={718}}{5C3337365C3337375C303030335C3030302E5C303030385C3030305C3034305C303030505C303030725C3030306F5C303030745C3030306F5C3030306B5C3030306F5C3030306C5C3030305C3034305C303030515C303030555C303030495C303030435C30303072}
\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.7.4}Tracy}{29}{subsubsection.3.7.4}\protected@file@percent }
\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.7.5}Konkrétní metriky}{29}{subsubsection.3.7.5}\protected@file@percent }
\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.7.6}Sbírání v reálném čase}{29}{subsubsection.3.7.6}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {3.8}Protokol QUICr}{29}{subsection.3.8}\protected@file@percent }
\gdef \LT@i {\LT@entry
{1}{142.93542pt}\LT@entry
{1}{1048.79956pt}\LT@entry
{1}{0.0pt}}
\BKM@entry{id=59,open,dest={73756273756273656374696F6E2E332E372E31},srcline={663}}{5C3337365C3337375C303030335C3030302E5C303030375C3030302E5C303030315C3030305C3034305C303030465C303030725C303030615C3030306D5C30303065}
\@writefile{toc}{\contentsline {subsection}{\numberline {3.6}Komunikační protokol}{29}{subsection.3.6}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {3.7}Protokol QUICr}{29}{subsection.3.7}\protected@file@percent }
\@writefile{lot}{\contentsline {table}{\numberline {1}{Rozhraní třídy QuicrEndpoint}}{29}{table.1}\protected@file@percent }
\newlabel{tab:prepinace}{{1}{29}{Rozhraní třídy QuicrEndpoint}{table.1}{}}
\BKM@entry{id=60,open,dest={73756273756273656374696F6E2E332E372E32},srcline={669}}{5C3337365C3337375C303030335C3030302E5C303030375C3030302E5C303030325C3030305C3034305C303030485C303030615C3030306E5C303030645C303030735C303030685C303030615C3030306B5C30303065}
\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.7.1}Frame}{30}{subsubsection.3.7.1}\protected@file@percent }
\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.7.2}Handshake}{30}{subsubsection.3.7.2}\protected@file@percent }
\BKM@entry{id=61,open,dest={73756273756273656374696F6E2E332E372E33},srcline={696}}{5C3337365C3337375C303030335C3030302E5C303030375C3030302E5C303030335C3030305C3034305C303030535C303030705C3030306F5C3030306C5C303030655C303030685C3030306C5C303030695C303030765C3030306F5C303030735C30303074}
\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.7.3}Spolehlivost}{31}{subsubsection.3.7.3}\protected@file@percent }
\BKM@entry{id=62,open,dest={73756273756273656374696F6E2E332E372E34},srcline={724}}{5C3337365C3337375C303030335C3030302E5C303030375C3030302E5C303030345C3030305C3034305C303030455C3030306E5C3030306B5C3030306F5C303030645C3030305C3335315C30303072}
\BKM@entry{id=63,open,dest={73756273756273656374696F6E2E332E372E35},srcline={730}}{5C3337365C3337375C303030335C3030302E5C303030375C3030302E5C303030355C3030305C3034305C303030545C303030655C303030735C303030745C3030306F5C303030765C3030305C3334315C3030306E5C3030305C333535}
\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.7.4}Enkodér}{32}{subsubsection.3.7.4}\protected@file@percent }
\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.7.5}Testová}{32}{subsubsection.3.7.5}\protected@file@percent }
\BKM@entry{id=64,open,dest={73756273756273656374696F6E2E332E372E36},srcline={767}}{5C3337365C3337375C303030335C3030302E5C303030375C3030302E5C303030365C3030305C3034305C3030304F5C303030645C303030655C303030735C3030305C3335355C3030306C5C3030305C3334315C3030306E5C3030305C333535}
\BKM@entry{id=65,open,dest={73756273756273656374696F6E2E332E372E37},srcline={778}}{5C3337365C3337375C303030335C3030302E5C303030375C3030302E5C303030375C3030305C3034305C3030315C3031345C303030745C303030655C3030306E5C3030305C333535}
\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.7.6}Odesílání}{33}{subsubsection.3.7.6}\protected@file@percent }
\newlabel{integrationcomparison}{{3.7.5}{34}{Testování}{subsubsection.3.7.5}{}}
\@writefile{lof}{\contentsline {figure}{\numberline {1}{\ignorespaces Integrace}}{34}{figure.1}\protected@file@percent }
\newlabel{playerbenchmark}{{3.7.5}{34}{Testování}{figure.1}{}}
\@writefile{lof}{\contentsline {figure}{\numberline {2}{\ignorespaces 301 připojených hráčů}}{34}{figure.2}\protected@file@percent }
\BKM@entry{id=66,open,dest={73756273756273656374696F6E2E332E372E38},srcline={784}}{5C3337365C3337375C303030335C3030302E5C303030375C3030302E5C303030385C3030305C3034305C3030315C3134305C303030695C303030665C303030725C3030306F5C303030765C3030305C3334315C3030306E5C3030305C333535}
\BKM@entry{id=67,open,dest={73756273756273656374696F6E2E332E372E39},srcline={788}}{5C3337365C3337375C303030335C3030302E5C303030375C3030302E5C303030395C3030305C3034305C303030535C303030505C303030525C3030302D5C30303036}
\BKM@entry{id=68,open,dest={73756273756273656374696F6E2E332E372E3130},srcline={793}}{5C3337365C3337375C303030335C3030302E5C303030375C3030302E5C303030315C303030305C3030305C3034305C3030304C5C3030306F5C303030635C3030306B5C303030735C303030745C303030655C30303070}
\BKM@entry{id=69,open,dest={73756273756273656374696F6E2E332E372E3131},srcline={797}}{5C3337365C3337375C303030335C3030302E5C303030375C3030302E5C303030315C303030315C3030305C3034305C303030435C3030306F5C3030306E5C303030675C303030655C303030735C303030745C303030695C3030306F5C3030306E5C3030305C3034305C303030635C3030306F5C3030306E5C303030745C303030725C3030306F5C3030306C}
\BKM@entry{id=70,open,dest={73756273756273656374696F6E2E332E372E3132},srcline={799}}{5C3337365C3337375C303030335C3030302E5C303030375C3030302E5C303030315C303030325C3030305C3034305C303030425C303030615C3030306E5C303030645C303030775C303030695C303030645C303030745C303030685C3030305C3034305C303030635C3030306F5C3030306E5C303030745C303030725C3030306F5C3030306C}
\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.7.7}Čtení}{35}{subsubsection.3.7.7}\protected@file@percent }
\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.7.8}Šifrování}{35}{subsubsection.3.7.8}\protected@file@percent }
\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.7.9}SPR-6}{35}{subsubsection.3.7.9}\protected@file@percent }
\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.7.10}Lockstep}{35}{subsubsection.3.7.10}\protected@file@percent }
\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.7.11}Congestion control}{35}{subsubsection.3.7.11}\protected@file@percent }
\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.7.12}Bandwidth control}{35}{subsubsection.3.7.12}\protected@file@percent }
\BKM@entry{id=71,open,dest={73756273656374696F6E2E332E38},srcline={803}}{5C3337365C3337375C303030335C3030302E5C303030385C3030305C3034305C303030535C303030685C303030615C303030725C303030645C303030695C3030306E5C30303067}
\BKM@entry{id=72,open,dest={73756273656374696F6E2E332E39},srcline={807}}{5C3337365C3337375C303030335C3030302E5C303030395C3030305C3034305C3030304B5C3030306F5C3030306D5C303030705C303030725C303030655C303030735C30303065}
\BKM@entry{id=73,open,dest={73756273756273656374696F6E2E332E392E31},srcline={811}}{5C3337365C3337375C303030335C3030302E5C303030395C3030302E5C303030315C3030305C3034305C303030425C303030695C303030745C3030305C3034305C303030425C303030755C303030665C303030665C303030655C30303072}
\BKM@entry{id=74,open,dest={73756273756273656374696F6E2E332E392E32},srcline={815}}{5C3337365C3337375C303030335C3030302E5C303030395C3030302E5C303030325C3030305C3034305C3030304B5C3030306F5C3030306D5C303030705C303030725C303030655C303030735C303030655C3030305C3034305C303030515C303030555C303030495C303030435C30303072}
\BKM@entry{id=75,open,dest={73756273756273656374696F6E2E332E392E33},srcline={819}}{5C3337365C3337375C303030335C3030302E5C303030395C3030302E5C303030335C3030305C3034305C3030304B5C3030306F5C3030306D5C303030705C303030725C303030655C303030735C303030655C3030305C3034305C303030705C303030725C3030306F5C303030745C3030306F5C3030306B5C3030306F5C3030306C5C303030755C3030305C3034305C303030725C303030655C303030705C3030306C5C303030695C3030306B5C3030305C3334315C303030745C3030306F5C303030725C30303075}
\BKM@entry{id=76,open,dest={73656374696F6E2E34},srcline={830}}{5C3337365C3337375C303030345C3030305C3034305C303030535C303030745C303030795C3030306C5C303030795C3030305C3034305C303030705C303030725C3030306F5C3030305C3034305C303030705C303030735C303030615C3030306E5C3030305C3335355C3030305C3034305C303030625C303030615C3030306B5C303030615C3030306C5C3030305C3334315C3030315C3133315C303030735C3030306B5C3030305C3337355C303030635C303030685C3030305C3034305C303030615C3030305C3034305C303030645C303030695C303030705C3030306C5C3030306F5C3030306D5C3030306F5C303030765C3030305C3337355C303030635C303030685C3030305C3034305C303030705C303030725C303030615C303030635C3030305C333535}
\BKM@entry{id=77,open,dest={73756273656374696F6E2E342E31},srcline={833}}{5C3337365C3337375C303030345C3030302E5C303030315C3030305C3034305C303030505C3030306F5C3030315C3137365C303030615C303030645C303030615C303030765C3030306B5C303030795C3030305C3034305C303030615C3030305C3034305C303030705C3030306F5C303030645C303030705C303030725C3030306F5C303030765C303030615C3030306E5C3030305C3334315C3030305C3034305C303030705C303030725C3030306F5C303030735C303030745C3030315C3133315C303030655C303030645C3030305C333535}
\@writefile{toc}{\contentsline {subsection}{\numberline {3.8}Sharding}{36}{subsection.3.8}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {3.9}Komprese}{36}{subsection.3.9}\protected@file@percent }
\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.9.1}Bit Buffer}{36}{subsubsection.3.9.1}\protected@file@percent }
\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.9.2}Komprese QUICr}{36}{subsubsection.3.9.2}\protected@file@percent }
\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.9.3}Komprese protokolu replikátoru}{36}{subsubsection.3.9.3}\protected@file@percent }
\@writefile{toc}{\contentsline {section}{\numberline {4}Styly pro psaní bakalářských a diplomových prací}{36}{section.4}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {4.1}Požadavky a podprovaná prostředí}{36}{subsection.4.1}\protected@file@percent }
\BKM@entry{id=78,open,dest={73756273656374696F6E2E342E32},srcline={855}}{5C3337365C3337375C303030345C3030302E5C303030325C3030305C3034305C303030505C3030315C3133315C303030655C303030705C3030305C3335355C3030306E5C303030615C3030315C3031355C30303065}
\BKM@entry{id=58,open,dest={73756273756273656374696F6E2E332E382E31},srcline={746}}{5C3337365C3337375C303030335C3030302E5C303030385C3030302E5C303030315C3030305C3034305C303030465C303030725C303030615C3030306D5C30303065}
\@writefile{lot}{\contentsline {table}{\numberline {1}{Rozhraní třídy QuicrEndpoint}}{30}{table.1}\protected@file@percent }
\newlabel{tab:prepinace}{{1}{30}{Rozhraní třídy QuicrEndpoint}{table.1}{}}
\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.8.1}Frame}{30}{subsubsection.3.8.1}\protected@file@percent }
\BKM@entry{id=59,open,dest={73756273756273656374696F6E2E332E382E32},srcline={756}}{5C3337365C3337375C303030335C3030302E5C303030385C3030302E5C303030325C3030305C3034305C303030485C303030615C3030306E5C303030645C303030735C303030685C303030615C3030306B5C30303065}
\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.8.2}Handshake}{31}{subsubsection.3.8.2}\protected@file@percent }
\BKM@entry{id=60,open,dest={73756273756273656374696F6E2E332E382E33},srcline={783}}{5C3337365C3337375C303030335C3030302E5C303030385C3030302E5C303030335C3030305C3034305C303030535C303030705C3030306F5C3030306C5C303030655C303030685C3030306C5C303030695C303030765C3030306F5C303030735C30303074}
\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.8.3}Spolehlivost}{32}{subsubsection.3.8.3}\protected@file@percent }
\BKM@entry{id=61,open,dest={73756273756273656374696F6E2E332E382E34},srcline={811}}{5C3337365C3337375C303030335C3030302E5C303030385C3030302E5C303030345C3030305C3034305C303030455C3030306E5C3030306B5C3030306F5C303030645C3030305C3335315C30303072}
\BKM@entry{id=62,open,dest={73756273756273656374696F6E2E332E382E35},srcline={817}}{5C3337365C3337375C303030335C3030302E5C303030385C3030302E5C303030355C3030305C3034305C303030545C303030655C303030735C303030745C3030306F5C303030765C3030305C3334315C3030306E5C3030305C333535}
\BKM@entry{id=63,open,dest={73756273756273656374696F6E2E332E382E36},srcline={824}}{5C3337365C3337375C303030335C3030302E5C303030385C3030302E5C303030365C3030305C3034305C3030304D5C3030315C3033335C3030315C3133315C303030655C3030306E5C3030305C333535}
\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.8.4}Enkodér}{33}{subsubsection.3.8.4}\protected@file@percent }
\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.8.5}Testování}{33}{subsubsection.3.8.5}\protected@file@percent }
\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.8.6}Měře}{33}{subsubsection.3.8.6}\protected@file@percent }
\BKM@entry{id=64,open,dest={73756273656374696F6E2E332E39},srcline={860}}{5C3337365C3337375C303030335C3030302E5C303030395C3030305C3034305C3030304F5C303030705C303030745C303030695C3030306D5C303030615C3030306C5C303030695C3030307A5C303030615C303030635C303030655C3030305C3034305C303030725C303030655C303030705C3030306C5C303030695C3030306B5C3030305C3334315C303030745C3030306F5C303030725C30303075}
\@writefile{lof}{\contentsline {figure}{\numberline {3}{\ignorespaces Porovnání odezvy TCP a QUICr}}{34}{figure.3}\protected@file@percent }
\newlabel{fig:latencycomparison}{{3}{34}{Porovnání odezvy TCP a QUICr}{figure.3}{}}
\@writefile{toc}{\contentsline {subsection}{\numberline {3.9}Optimalizace replikátoru}{34}{subsection.3.9}\protected@file@percent }
\newlabel{fig:integrationcomparison}{{3.8.6}{35}{Měření}{figure.3}{}}
\@writefile{lof}{\contentsline {figure}{\numberline {4}{\ignorespaces Porovnání integrace TCP a QUICr}}{35}{figure.4}\protected@file@percent }
\newlabel{fig:playerbenchmark}{{3.8.6}{35}{Měření}{figure.4}{}}
\@writefile{lof}{\contentsline {figure}{\numberline {5}{\ignorespaces 301 připojených hráčů}}{35}{figure.5}\protected@file@percent }
\newlabel{fig:tracyreplicator}{{3.9}{36}{Optimalizace replikátoru}{subsection.3.9}{}}
\@writefile{lof}{\contentsline {figure}{\numberline {6}{\ignorespaces Analýza replikátoru}}{36}{figure.6}\protected@file@percent }
\newlabel{fig:ecs_optimization_tracy_01}{{3.9}{36}{Optimalizace replikátoru}{figure.6}{}}
\@writefile{lof}{\contentsline {figure}{\numberline {7}{\ignorespaces Analýza optimalizace replikátoru pro ECS}}{36}{figure.7}\protected@file@percent }
\BKM@entry{id=65,open,dest={73756273656374696F6E2E332E3130},srcline={911}}{5C3337365C3337375C303030335C3030302E5C303030315C303030305C3030305C3034305C3030304F5C303030705C303030745C303030695C3030306D5C303030615C3030306C5C303030695C3030307A5C303030615C303030635C303030655C3030305C3034305C3030306D5C303030615C3030306E5C303030615C3030315C3137365C303030655C303030725C303030615C3030305C3034305C3030307A5C3030305C3334315C3030306A5C3030306D5C3030315C313537}
\newlabel{fig:ecs_optimization_tracy_02}{{3.9}{37}{Optimalizace replikátoru}{figure.7}{}}
\@writefile{lof}{\contentsline {figure}{\numberline {8}{\ignorespaces Analýza optimalizace replikátoru pro ECS}}{37}{figure.8}\protected@file@percent }
\newlabel{table:serialization_comparison}{{3.9}{37}{Optimalizace replikátoru}{figure.8}{}}
\@writefile{lof}{\contentsline {figure}{\numberline {9}{\ignorespaces Porovnání serializátorů}}{37}{figure.9}\protected@file@percent }
\BKM@entry{id=66,open,dest={73756273656374696F6E2E332E3131},srcline={939}}{5C3337365C3337375C303030335C3030302E5C303030315C303030315C3030305C3034305C3030304F5C303030705C303030745C303030695C3030306D5C303030615C3030306C5C303030695C3030307A5C303030615C303030635C303030655C3030305C3034305C303030515C303030555C303030495C303030435C30303072}
\BKM@entry{id=67,open,dest={73756273756273656374696F6E2E332E31312E31},srcline={943}}{5C3337365C3337375C303030335C3030302E5C303030315C303030315C3030302E5C303030315C3030305C3034305C3030315C3134305C303030695C303030665C303030725C3030306F5C303030765C3030305C3334315C3030306E5C3030305C333535}
\BKM@entry{id=68,open,dest={73756273756273656374696F6E2E332E31312E32},srcline={947}}{5C3337365C3337375C303030335C3030302E5C303030315C303030315C3030302E5C303030325C3030305C3034305C303030535C303030505C303030525C3030302D5C30303036}
\newlabel{table:range_query_comparison}{{3.10}{38}{Optimalizace manažera zájmů}{subsection.3.10}{}}
\@writefile{lof}{\contentsline {figure}{\numberline {10}{\ignorespaces Porovnání algoritmů}}{38}{figure.10}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {3.10}Optimalizace manažera zájmů}{38}{subsection.3.10}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {3.11}Optimalizace QUICr}{38}{subsection.3.11}\protected@file@percent }
\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.11.1}Šifrování}{38}{subsubsection.3.11.1}\protected@file@percent }
\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.11.2}SPR-6}{38}{subsubsection.3.11.2}\protected@file@percent }
\BKM@entry{id=69,open,dest={73756273756273656374696F6E2E332E31312E33},srcline={952}}{5C3337365C3337375C303030335C3030302E5C303030315C303030315C3030302E5C303030335C3030305C3034305C3030304C5C3030306F5C303030635C3030306B5C303030735C303030745C303030655C30303070}
\BKM@entry{id=70,open,dest={73756273756273656374696F6E2E332E31312E34},srcline={956}}{5C3337365C3337375C303030335C3030302E5C303030315C303030315C3030302E5C303030345C3030305C3034305C303030435C3030306F5C3030306E5C303030675C303030655C303030735C303030745C303030695C3030306F5C3030306E5C3030305C3034305C303030635C3030306F5C3030306E5C303030745C303030725C3030306F5C3030306C}
\BKM@entry{id=71,open,dest={73756273756273656374696F6E2E332E31312E35},srcline={958}}{5C3337365C3337375C303030335C3030302E5C303030315C303030315C3030302E5C303030355C3030305C3034305C303030425C303030615C3030306E5C303030645C303030775C303030695C303030645C303030745C303030685C3030305C3034305C303030635C3030306F5C3030306E5C303030745C303030725C3030306F5C3030306C}
\BKM@entry{id=72,open,dest={73756273656374696F6E2E332E3132},srcline={962}}{5C3337365C3337375C303030335C3030302E5C303030315C303030325C3030305C3034305C303030535C303030685C303030615C303030725C303030645C303030695C3030306E5C30303067}
\BKM@entry{id=73,open,dest={73756273656374696F6E2E332E3133},srcline={966}}{5C3337365C3337375C303030335C3030302E5C303030315C303030335C3030305C3034305C3030304B5C3030306F5C3030306D5C303030705C303030725C303030655C303030735C30303065}
\BKM@entry{id=74,open,dest={73756273756273656374696F6E2E332E31332E31},srcline={970}}{5C3337365C3337375C303030335C3030302E5C303030315C303030335C3030302E5C303030315C3030305C3034305C303030425C303030695C303030745C3030305C3034305C303030425C303030755C303030665C303030665C303030655C30303072}
\BKM@entry{id=75,open,dest={73756273756273656374696F6E2E332E31332E32},srcline={974}}{5C3337365C3337375C303030335C3030302E5C303030315C303030335C3030302E5C303030325C3030305C3034305C3030304B5C3030306F5C3030306D5C303030705C303030725C303030655C303030735C303030655C3030305C3034305C303030515C303030555C303030495C303030435C30303072}
\BKM@entry{id=76,open,dest={73756273756273656374696F6E2E332E31332E33},srcline={978}}{5C3337365C3337375C303030335C3030302E5C303030315C303030335C3030302E5C303030335C3030305C3034305C3030304B5C3030306F5C3030306D5C303030705C303030725C303030655C303030735C303030655C3030305C3034305C303030705C303030725C3030306F5C303030745C3030306F5C3030306B5C3030306F5C3030306C5C303030755C3030305C3034305C303030725C303030655C303030705C3030306C5C303030695C3030306B5C3030305C3334315C303030745C3030306F5C303030725C30303075}
\BKM@entry{id=77,open,dest={73656374696F6E2E34},srcline={989}}{5C3337365C3337375C303030345C3030305C3034305C303030535C303030745C303030795C3030306C5C303030795C3030305C3034305C303030705C303030725C3030306F5C3030305C3034305C303030705C303030735C303030615C3030306E5C3030305C3335355C3030305C3034305C303030625C303030615C3030306B5C303030615C3030306C5C3030305C3334315C3030315C3133315C303030735C3030306B5C3030305C3337355C303030635C303030685C3030305C3034305C303030615C3030305C3034305C303030645C303030695C303030705C3030306C5C3030306F5C3030306D5C3030306F5C303030765C3030305C3337355C303030635C303030685C3030305C3034305C303030705C303030725C303030615C303030635C3030305C333535}
\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.11.3}Lockstep}{39}{subsubsection.3.11.3}\protected@file@percent }
\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.11.4}Congestion control}{39}{subsubsection.3.11.4}\protected@file@percent }
\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.11.5}Bandwidth control}{39}{subsubsection.3.11.5}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {3.12}Sharding}{39}{subsection.3.12}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {3.13}Komprese}{39}{subsection.3.13}\protected@file@percent }
\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.13.1}Bit Buffer}{39}{subsubsection.3.13.1}\protected@file@percent }
\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.13.2}Komprese QUICr}{39}{subsubsection.3.13.2}\protected@file@percent }
\@writefile{toc}{\contentsline {subsubsection}{\numberline {3.13.3}Komprese protokolu replikátoru}{39}{subsubsection.3.13.3}\protected@file@percent }
\BKM@entry{id=78,open,dest={73756273656374696F6E2E342E31},srcline={992}}{5C3337365C3337375C303030345C3030302E5C303030315C3030305C3034305C303030505C3030306F5C3030315C3137365C303030615C303030645C303030615C303030765C3030306B5C303030795C3030305C3034305C303030615C3030305C3034305C303030705C3030306F5C303030645C303030705C303030725C3030306F5C303030765C303030615C3030306E5C3030305C3334315C3030305C3034305C303030705C303030725C3030306F5C303030735C303030745C3030315C3133315C303030655C303030645C3030305C333535}
\BKM@entry{id=79,open,dest={73756273656374696F6E2E342E32},srcline={1014}}{5C3337365C3337375C303030345C3030302E5C303030325C3030305C3034305C303030505C3030315C3133315C303030655C303030705C3030305C3335355C3030306E5C303030615C3030315C3031355C30303065}
\@writefile{toc}{\contentsline {section}{\numberline {4}Styly pro psaní bakalářských a diplomových prací}{40}{section.4}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {4.1}Požadavky a podprovaná prostředí}{40}{subsection.4.1}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {4.2}Přepínače}{40}{subsection.4.2}\protected@file@percent }
\@writefile{lol}{\contentsline {lstlisting}{\numberline {4}Volání třídy \textbf {kidiplom}}{40}{lstlisting.4}\protected@file@percent }
\gdef \LT@ii {\LT@entry
{1}{83.40999pt}\LT@entry
{1}{98.16246pt}\LT@entry
{1}{239.62204pt}}
\@writefile{toc}{\contentsline {subsection}{\numberline {4.2}Přepínače}{37}{subsection.4.2}\protected@file@percent }
\@writefile{lol}{\contentsline {lstlisting}{\numberline {4}Volání třídy \textbf {kidiplom}}{37}{lstlisting.4}\protected@file@percent }
\@writefile{lot}{\contentsline {table}{\numberline {2}{Seznam přepínačů}}{37}{table.2}\protected@file@percent }
\newlabel{tab:prepinace}{{2}{37}{Seznam přepínačů}{table.2}{}}
\BKM@entry{id=79,open,dest={73756273656374696F6E2E342E33},srcline={947}}{5C3337365C3337375C303030345C3030302E5C303030335C3030305C3034305C303030475C303030655C3030306F5C3030306D5C303030655C303030745C303030725C303030695C303030655C3030305C3034305C303030735C303030745C303030725C3030305C3334315C3030306E5C3030306B5C30303079}
\BKM@entry{id=80,open,dest={73656374696F6E2E35},srcline={950}}{5C3337365C3337375C303030355C3030305C3034305C303030535C303030615C3030307A5C303030625C303030615C3030305C3034305C3030315C3031355C3030305C3334315C303030735C303030745C3030305C3335355C3030305C3034305C303030645C3030306F5C3030306B5C303030755C3030306D5C303030655C3030306E5C303030745C30303075}
\BKM@entry{id=81,open,dest={73756273656374696F6E2E352E31},srcline={951}}{5C3337365C3337375C303030355C3030302E5C303030315C3030305C3034305C303030535C303030615C3030307A5C303030625C303030615C3030305C3034305C3030305C3337325C303030765C3030306F5C303030645C3030306E5C3030305C3335355C3030305C3034305C303030735C303030745C303030725C303030615C3030306E5C303030795C3030305C3034305C3030315C3031355C303030695C3030305C3034305C3030306F5C303030625C303030735C303030615C303030685C30303075}
\BKM@entry{id=82,open,dest={73756273656374696F6E2E352E32},srcline={954}}{5C3337365C3337375C303030355C3030302E5C303030325C3030305C3034305C3030305A5C3030305C3334315C303030765C3030315C3033335C303030725C30303079}
\BKM@entry{id=83,open,dest={73756273656374696F6E2E352E33},srcline={969}}{5C3337365C3337375C303030355C3030302E5C303030335C3030305C3034305C3030304D5C303030615C303030745C303030655C3030306D5C303030615C303030745C303030695C3030306B5C30303061}
\@writefile{toc}{\contentsline {subsection}{\numberline {4.3}Geometrie stránky}{40}{subsection.4.3}\protected@file@percent }
\@writefile{toc}{\contentsline {section}{\numberline {5}Sazba částí dokumentu}{40}{section.5}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {5.1}Sazba úvodní strany či obsahu}{40}{subsection.5.1}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {5.2}Závěry}{40}{subsection.5.2}\protected@file@percent }
\@writefile{lol}{\contentsline {lstlisting}{\numberline {5}Sazba závěrů}{40}{lstlisting.5}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {5.3}Matematika}{40}{subsection.5.3}\protected@file@percent }
\BKM@entry{id=84,open,dest={73756273656374696F6E2E352E34},srcline={994}}{5C3337365C3337375C303030355C3030302E5C303030345C3030305C3034305C303030535C303030615C3030307A5C303030625C303030615C3030305C3034305C3030306C5C303030695C303030745C303030655C303030725C303030615C303030745C303030755C303030725C30303079}
\BKM@entry{id=85,open,dest={73756273756273656374696F6E2E352E342E31},srcline={996}}{5C3337365C3337375C303030355C3030302E5C303030345C3030302E5C303030315C3030305C3034305C303030535C303030615C3030307A5C303030625C303030615C3030305C3034305C303030625C303030695C303030625C3030306C5C303030695C3030306F5C303030675C303030725C303030615C303030665C303030695C303030655C3030305C3034305C303030705C3030315C3133315C303030655C303030735C3030305C3034305C303030425C303030695C303030625C3030304C5C303030615C303030545C303030655C30303058}
\BKM@entry{id=86,open,dest={73756273756273656374696F6E2E352E342E32},srcline={1005}}{5C3337365C3337375C303030355C3030302E5C303030345C3030302E5C303030325C3030305C3034305C3030304D5C303030615C3030306E5C303030755C3030305C3334315C3030306C5C3030306E5C3030305C3335355C3030305C3034305C303030735C303030615C3030307A5C303030625C303030615C3030305C3034305C303030625C303030695C303030625C3030306C5C303030695C3030306F5C303030675C303030725C303030615C303030665C303030695C30303065}
\BKM@entry{id=87,open,dest={73756273656374696F6E2E352E35},srcline={1010}}{5C3337365C3337375C303030355C3030302E5C303030355C3030305C3034305C303030445C303030725C3030306F5C303030625C3030306E5C3030305C3334315C3030305C3034305C3030306D5C303030615C3030306B5C303030725C30303061}
\@writefile{toc}{\contentsline {subsection}{\numberline {5.4}Sazba literatury}{41}{subsection.5.4}\protected@file@percent }
\@writefile{toc}{\contentsline {subsubsection}{\numberline {5.4.1}Sazba bibliografie přes \textsc {Bib}\LaTeX {}}{41}{subsubsection.5.4.1}\protected@file@percent }
\@writefile{toc}{\contentsline {subsubsection}{\numberline {5.4.2}Manuální sazba bibliografie}{41}{subsubsection.5.4.2}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {5.5}Drobná makra}{41}{subsection.5.5}\protected@file@percent }
\BKM@entry{id=88,open,dest={73756273656374696F6E2E352E36},srcline={1036}}{5C3337365C3337375C303030355C3030302E5C303030365C3030305C3034305C303030535C303030615C3030307A5C303030625C303030615C3030305C3034305C303030725C303030655C3030306A5C303030735C303030745C3030315C3133315C3030305C3335355C3030306B5C30303075}
\BKM@entry{id=89,open,dest={73756273656374696F6E2E352E37},srcline={1051}}{5C3337365C3337375C303030355C3030302E5C303030375C3030305C3034305C303030535C303030615C3030307A5C303030625C303030615C3030305C3034305C3030307A5C303030645C303030725C3030306F5C3030306A5C3030306F5C303030765C3030305C3337355C303030635C303030685C3030305C3034305C3030306B5C3030305C3336335C303030645C3030315C313537}
\@writefile{toc}{\contentsline {subsection}{\numberline {5.6}Sazba rejstříku}{42}{subsection.5.6}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {5.7}Sazba zdrojových kódů}{42}{subsection.5.7}\protected@file@percent }
\@writefile{loe}{\contentsline {definition}{\ifthmt@listswap Definice~4\else \numberline {4}Definice\fi \thmtformatoptarg {Název definice}}{42}{definition.4}\protected@file@percent }
\@writefile{lot}{\contentsline {table}{\numberline {3}{\ignorespaces Odstavce v tabulkách}}{43}{table.3}\protected@file@percent }
\newlabel{tab:odstavce}{{3}{43}{Odstavce v tabulkách}{table.3}{}}
\@writefile{loe}{\contentsline {proof}{\ifthmt@listswap \else \numberline {\let \autodot \@empty }\fi D\r {u}kaz\thmtformatoptarg {Název důkazu}}{44}{thmt@dummyctr.dummy.5}\protected@file@percent }
\@writefile{loe}{\contentsline {remark}{\ifthmt@listswap Pozn\'{a}mka~5\else \numberline {5}Pozn\'{a}mka\fi \thmtformatoptarg {Pumpovací věta}}{44}{remark.5}\protected@file@percent }
\@writefile{loe}{\contentsline {example}{\ifthmt@listswap P\v {r}\'{i}klad~6\else \numberline {6}P\v {r}\'{i}klad\fi \thmtformatoptarg {Pumpovací věta}}{44}{example.6}\protected@file@percent }
\@writefile{loe}{\contentsline {lemma}{\ifthmt@listswap Lemma~7\else \numberline {7}Lemma\fi \thmtformatoptarg {Název definice}}{44}{lemma.7}\protected@file@percent }
\@writefile{loe}{\contentsline {consequence}{\ifthmt@listswap D\r {u}sledek~8\else \numberline {8}D\r {u}sledek\fi \thmtformatoptarg {Název důkazu}}{44}{consequence.8}\protected@file@percent }
\@writefile{loe}{\contentsline {theorem}{\ifthmt@listswap V\v {e}ta~9\else \numberline {9}V\v {e}ta\fi \thmtformatoptarg {Pumpovací věta}}{44}{theorem.9}\protected@file@percent }
\newlabel{kod:cpp}{{6}{44}{\cpp }{lstlisting.6}{}}
\@writefile{lol}{\contentsline {lstlisting}{\numberline {6}C\kern -.05em\raise .38ex\hbox {\scriptsize {++}}}{44}{lstlisting.6}\protected@file@percent }
\@writefile{lol}{\contentsline {lstlisting}{\numberline {7}JS}{44}{lstlisting.7}\protected@file@percent }
\@writefile{lol}{\contentsline {lstlisting}{\numberline {8}C\kern -.03em\raise .38ex\hbox {\scriptsize {\#}}}{45}{lstlisting.8}\protected@file@percent }
\@writefile{lol}{\contentsline {lstlisting}{\numberline {9}SQL}{45}{lstlisting.9}\protected@file@percent }
\@writefile{lol}{\contentsline {lstlisting}{\numberline {10}TutorialD}{45}{lstlisting.10}\protected@file@percent }
\BKM@entry{id=90,open,dest={73656374696F6E2A2E33},srcline={1120}}{5C3337365C3337375C3030305A5C3030305C3334315C303030765C3030315C3033335C30303072}
\@writefile{toc}{\contentsline {section}{Z\'av\v er}{46}{section*.3}\protected@file@percent }
\@writefile{lot}{\contentsline {table}{\numberline {2}{Seznam přepínačů}}{41}{table.2}\protected@file@percent }
\newlabel{tab:prepinace}{{2}{41}{Seznam přepínačů}{table.2}{}}
\BKM@entry{id=80,open,dest={73756273656374696F6E2E342E33},srcline={1106}}{5C3337365C3337375C303030345C3030302E5C303030335C3030305C3034305C303030475C303030655C3030306F5C3030306D5C303030655C303030745C303030725C303030695C303030655C3030305C3034305C303030735C303030745C303030725C3030305C3334315C3030306E5C3030306B5C30303079}
\BKM@entry{id=81,open,dest={73656374696F6E2E35},srcline={1109}}{5C3337365C3337375C303030355C3030305C3034305C303030535C303030615C3030307A5C303030625C303030615C3030305C3034305C3030315C3031355C3030305C3334315C303030735C303030745C3030305C3335355C3030305C3034305C303030645C3030306F5C3030306B5C303030755C3030306D5C303030655C3030306E5C303030745C30303075}
\BKM@entry{id=82,open,dest={73756273656374696F6E2E352E31},srcline={1110}}{5C3337365C3337375C303030355C3030302E5C303030315C3030305C3034305C303030535C303030615C3030307A5C303030625C303030615C3030305C3034305C3030305C3337325C303030765C3030306F5C303030645C3030306E5C3030305C3335355C3030305C3034305C303030735C303030745C303030725C303030615C3030306E5C303030795C3030305C3034305C3030315C3031355C303030695C3030305C3034305C3030306F5C303030625C303030735C303030615C303030685C30303075}
\BKM@entry{id=83,open,dest={73756273656374696F6E2E352E32},srcline={1113}}{5C3337365C3337375C303030355C3030302E5C303030325C3030305C3034305C3030305A5C3030305C3334315C303030765C3030315C3033335C303030725C30303079}
\BKM@entry{id=84,open,dest={73756273656374696F6E2E352E33},srcline={1128}}{5C3337365C3337375C303030355C3030302E5C303030335C3030305C3034305C3030304D5C303030615C303030745C303030655C3030306D5C303030615C303030745C303030695C3030306B5C30303061}
\@writefile{toc}{\contentsline {subsection}{\numberline {4.3}Geometrie stránky}{43}{subsection.4.3}\protected@file@percent }
\@writefile{toc}{\contentsline {section}{\numberline {5}Sazba částí dokumentu}{43}{section.5}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {5.1}Sazba úvodní strany či obsahu}{43}{subsection.5.1}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {5.2}Závěry}{43}{subsection.5.2}\protected@file@percent }
\@writefile{lol}{\contentsline {lstlisting}{\numberline {5}Sazba závěrů}{43}{lstlisting.5}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {5.3}Matematika}{43}{subsection.5.3}\protected@file@percent }
\BKM@entry{id=85,open,dest={73756273656374696F6E2E352E34},srcline={1153}}{5C3337365C3337375C303030355C3030302E5C303030345C3030305C3034305C303030535C303030615C3030307A5C303030625C303030615C3030305C3034305C3030306C5C303030695C303030745C303030655C303030725C303030615C303030745C303030755C303030725C30303079}
\BKM@entry{id=86,open,dest={73756273756273656374696F6E2E352E342E31},srcline={1155}}{5C3337365C3337375C303030355C3030302E5C303030345C3030302E5C303030315C3030305C3034305C303030535C303030615C3030307A5C303030625C303030615C3030305C3034305C303030625C303030695C303030625C3030306C5C303030695C3030306F5C303030675C303030725C303030615C303030665C303030695C303030655C3030305C3034305C303030705C3030315C3133315C303030655C303030735C3030305C3034305C303030425C303030695C303030625C3030304C5C303030615C303030545C303030655C30303058}
\BKM@entry{id=87,open,dest={73756273756273656374696F6E2E352E342E32},srcline={1164}}{5C3337365C3337375C303030355C3030302E5C303030345C3030302E5C303030325C3030305C3034305C3030304D5C303030615C3030306E5C303030755C3030305C3334315C3030306C5C3030306E5C3030305C3335355C3030305C3034305C303030735C303030615C3030307A5C303030625C303030615C3030305C3034305C303030625C303030695C303030625C3030306C5C303030695C3030306F5C303030675C303030725C303030615C303030665C303030695C30303065}
\BKM@entry{id=88,open,dest={73756273656374696F6E2E352E35},srcline={1169}}{5C3337365C3337375C303030355C3030302E5C303030355C3030305C3034305C303030445C303030725C3030306F5C303030625C3030306E5C3030305C3334315C3030305C3034305C3030306D5C303030615C3030306B5C303030725C30303061}
\@writefile{toc}{\contentsline {subsection}{\numberline {5.4}Sazba literatury}{44}{subsection.5.4}\protected@file@percent }
\@writefile{toc}{\contentsline {subsubsection}{\numberline {5.4.1}Sazba bibliografie přes \textsc {Bib}\LaTeX {}}{44}{subsubsection.5.4.1}\protected@file@percent }
\@writefile{toc}{\contentsline {subsubsection}{\numberline {5.4.2}Manuální sazba bibliografie}{44}{subsubsection.5.4.2}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {5.5}Drobná makra}{44}{subsection.5.5}\protected@file@percent }
\BKM@entry{id=89,open,dest={73756273656374696F6E2E352E36},srcline={1195}}{5C3337365C3337375C303030355C3030302E5C303030365C3030305C3034305C303030535C303030615C3030307A5C303030625C303030615C3030305C3034305C303030725C303030655C3030306A5C303030735C303030745C3030315C3133315C3030305C3335355C3030306B5C30303075}
\BKM@entry{id=90,open,dest={73756273656374696F6E2E352E37},srcline={1210}}{5C3337365C3337375C303030355C3030302E5C303030375C3030305C3034305C303030535C303030615C3030307A5C303030625C303030615C3030305C3034305C3030307A5C303030645C303030725C3030306F5C3030306A5C3030306F5C303030765C3030305C3337355C303030635C303030685C3030305C3034305C3030306B5C3030305C3336335C303030645C3030315C313537}
\@writefile{toc}{\contentsline {subsection}{\numberline {5.6}Sazba rejstříku}{45}{subsection.5.6}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {5.7}Sazba zdrojových kódů}{45}{subsection.5.7}\protected@file@percent }
\@writefile{loe}{\contentsline {definition}{\ifthmt@listswap Definice~1\else \numberline {1}Definice\fi \thmtformatoptarg {Název definice}}{45}{definition.1}\protected@file@percent }
\@writefile{lot}{\contentsline {table}{\numberline {3}{\ignorespaces Odstavce v tabulkách}}{46}{table.3}\protected@file@percent }
\newlabel{tab:odstavce}{{3}{46}{Odstavce v tabulkách}{table.3}{}}
\@writefile{loe}{\contentsline {proof}{\ifthmt@listswap \else \numberline {\let \autodot \@empty }\fi D\r {u}kaz\thmtformatoptarg {Název důkazu}}{47}{thmt@dummyctr.dummy.2}\protected@file@percent }
\@writefile{loe}{\contentsline {remark}{\ifthmt@listswap Pozn\'{a}mka~2\else \numberline {2}Pozn\'{a}mka\fi \thmtformatoptarg {Pumpovací věta}}{47}{remark.2}\protected@file@percent }
\@writefile{loe}{\contentsline {example}{\ifthmt@listswap P\v {r}\'{i}klad~3\else \numberline {3}P\v {r}\'{i}klad\fi \thmtformatoptarg {Pumpovací věta}}{47}{example.3}\protected@file@percent }
\@writefile{loe}{\contentsline {lemma}{\ifthmt@listswap Lemma~4\else \numberline {4}Lemma\fi \thmtformatoptarg {Název definice}}{47}{lemma.4}\protected@file@percent }
\@writefile{loe}{\contentsline {consequence}{\ifthmt@listswap D\r {u}sledek~5\else \numberline {5}D\r {u}sledek\fi \thmtformatoptarg {Název důkazu}}{47}{consequence.5}\protected@file@percent }
\@writefile{loe}{\contentsline {theorem}{\ifthmt@listswap V\v {e}ta~6\else \numberline {6}V\v {e}ta\fi \thmtformatoptarg {Pumpovací věta}}{47}{theorem.6}\protected@file@percent }
\newlabel{kod:cpp}{{6}{47}{\cpp }{lstlisting.6}{}}
\@writefile{lol}{\contentsline {lstlisting}{\numberline {6}C\kern -.05em\raise .38ex\hbox {\scriptsize {++}}}{47}{lstlisting.6}\protected@file@percent }
\@writefile{lol}{\contentsline {lstlisting}{\numberline {7}JS}{47}{lstlisting.7}\protected@file@percent }
\@writefile{lol}{\contentsline {lstlisting}{\numberline {8}C\kern -.03em\raise .38ex\hbox {\scriptsize {\#}}}{48}{lstlisting.8}\protected@file@percent }
\@writefile{lol}{\contentsline {lstlisting}{\numberline {9}SQL}{48}{lstlisting.9}\protected@file@percent }
\@writefile{lol}{\contentsline {lstlisting}{\numberline {10}TutorialD}{48}{lstlisting.10}\protected@file@percent }
\BKM@entry{id=91,open,dest={73656374696F6E2A2E33},srcline={1279}}{5C3337365C3337375C3030305A5C3030305C3334315C303030765C3030315C3033335C30303072}
\@writefile{toc}{\contentsline {section}{Z\'av\v er}{49}{section*.3}\protected@file@percent }
\babel@aux{czech}{}
\babel@aux{czech}{}
\BKM@entry{id=91,open,dest={73656374696F6E2A2E35},srcline={1123}}{5C3337365C3337375C303030435C3030306F5C3030306E5C303030635C3030306C5C303030755C303030735C303030695C3030306F5C3030306E5C30303073}
\@writefile{toc}{\contentsline {section}{Conclusions}{47}{section*.5}\protected@file@percent }
\BKM@entry{id=92,open,dest={73656374696F6E2A2E35},srcline={1282}}{5C3337365C3337375C303030435C3030306F5C3030306E5C303030635C3030306C5C303030755C303030735C303030695C3030306F5C3030306E5C30303073}
\@writefile{toc}{\contentsline {section}{Conclusions}{50}{section*.5}\protected@file@percent }
\babel@aux{english}{}
\babel@aux{czech}{}
\BKM@entry{id=92,open,dest={617070656E6469782E41},srcline={1130}}{5C3337365C3337375C303030415C3030305C3034305C303030505C303030725C303030765C3030306E5C3030305C3335355C3030305C3034305C303030705C3030315C3133315C3030305C3335355C3030306C5C3030306F5C303030685C30303061}
\BKM@entry{id=93,open,dest={617070656E6469782E42},srcline={1133}}{5C3337365C3337375C303030425C3030305C3034305C303030445C303030725C303030755C303030685C3030305C3334315C3030305C3034305C303030705C3030315C3133315C3030305C3335355C3030306C5C3030306F5C303030685C30303061}
\BKM@entry{id=94,open,dest={617070656E6469782E43},srcline={1138}}{5C3337365C3337375C303030435C3030305C3034305C3030304F5C303030625C303030735C303030615C303030685C3030305C3034305C303030655C3030306C5C303030655C3030306B5C303030745C303030725C3030306F5C3030306E5C303030695C303030635C3030306B5C3030305C3337355C303030635C303030685C3030305C3034305C303030645C303030615C30303074}
\@writefile{toc}{\contentsline {section}{\numberline {A}První příloha}{48}{appendix.A}\protected@file@percent }
\@writefile{toc}{\contentsline {section}{\numberline {B}Druhá příloha}{48}{appendix.B}\protected@file@percent }
\@writefile{toc}{\contentsline {section}{\numberline {C}Obsah elektronických dat}{48}{appendix.C}\protected@file@percent }
\newlabel{sec:ObsahData}{{C}{48}{Obsah elektronických dat}{appendix.C}{}}
\BKM@entry{id=95,open,dest={73656374696F6E2A2E37},srcline={1205}}{5C3337365C3337375C303030535C303030655C3030307A5C3030306E5C303030615C3030306D5C3030305C3034305C3030307A5C3030306B5C303030725C303030615C303030745C303030655C3030306B}
\BKM@entry{id=93,open,dest={617070656E6469782E41},srcline={1289}}{5C3337365C3337375C303030415C3030305C3034305C303030505C303030725C303030765C3030306E5C3030305C3335355C3030305C3034305C303030705C3030315C3133315C3030305C3335355C3030306C5C3030306F5C303030685C30303061}
\BKM@entry{id=94,open,dest={617070656E6469782E42},srcline={1292}}{5C3337365C3337375C303030425C3030305C3034305C303030445C303030725C303030755C303030685C3030305C3334315C3030305C3034305C303030705C3030315C3133315C3030305C3335355C3030306C5C3030306F5C303030685C30303061}
\BKM@entry{id=95,open,dest={617070656E6469782E43},srcline={1297}}{5C3337365C3337375C303030435C3030305C3034305C3030304F5C303030625C303030735C303030615C303030685C3030305C3034305C303030655C3030306C5C303030655C3030306B5C303030745C303030725C3030306F5C3030306E5C303030695C303030635C3030306B5C3030305C3337355C303030635C303030685C3030305C3034305C303030645C303030615C30303074}
\@writefile{toc}{\contentsline {section}{\numberline {A}První příloha}{51}{appendix.A}\protected@file@percent }
\@writefile{toc}{\contentsline {section}{\numberline {B}Druhá příloha}{51}{appendix.B}\protected@file@percent }
\@writefile{toc}{\contentsline {section}{\numberline {C}Obsah elektronických dat}{51}{appendix.C}\protected@file@percent }
\newlabel{sec:ObsahData}{{C}{51}{Obsah elektronických dat}{appendix.C}{}}
\BKM@entry{id=96,open,dest={73656374696F6E2A2E37},srcline={1364}}{5C3337365C3337375C303030535C303030655C3030307A5C3030306E5C303030615C3030306D5C3030305C3034305C3030307A5C3030306B5C303030725C303030615C303030745C303030655C3030306B}
\abx@aux@nociteall
\@writefile{toc}{\contentsline {section}{Seznam zkratek}{50}{section*.7}\protected@file@percent }
\BKM@entry{id=96,open,dest={73656374696F6E2A2E38},srcline={1215}}{5C3337365C3337375C3030304C5C303030695C303030745C303030655C303030725C303030615C303030745C303030755C303030725C30303061}
\abx@aux@read@bbl@mdfivesum{D41D8CD98F00B204E9800998ECF8427E}
\@writefile{toc}{\contentsline {section}{Seznam zkratek}{53}{section*.7}\protected@file@percent }
\BKM@entry{id=97,open,dest={73656374696F6E2A2E38},srcline={1374}}{5C3337365C3337375C3030304C5C303030695C303030745C303030655C303030725C303030615C303030745C303030755C303030725C30303061}
\BKM@entry{id=98,open,dest={73656374696F6E2A2E3130},srcline={1}}{5C3337365C3337375C303030525C303030655C3030306A5C303030735C303030745C3030315C3133315C3030305C3335355C3030306B}
\@writefile{toc}{\contentsline {section}{Literatura}{54}{section*.8}\protected@file@percent }
\@writefile{toc}{\contentsline {section}{Rejst\v {r}\'{i}k}{54}{section*.10}\protected@file@percent }
\abx@aux@read@bbl@mdfivesum{nobblfile}
\abx@aux@read@bblrerun
\newlabel{LastPage}{{C}{50}{Obsah elektronických dat}{page.50}{}}
\gdef\lastpage@lastpage{50}
\gdef\lastpage@lastpageHy{50}
\gdef \@abspage@last{50}
\newlabel{LastPage}{{C}{54}{Obsah elektronických dat}{page.54}{}}
\gdef\lastpage@lastpage{54}
\gdef\lastpage@lastpageHy{54}
\gdef\svg@ink@ver@settings{{\m@ne }{inkscape}{\m@ne }}
\gdef \@abspage@last{54}
File diff suppressed because it is too large Load Diff
+286
View File
@@ -0,0 +1,286 @@
# Fdb version 4
["biber kidiplom"] 1776151719.94363 "kidiplom.bcf" "kidiplom.bbl" "kidiplom" 1776763887.70722 2
"bibliografie.bib" 1681557593 4922 d52777d7240f85c9a2e8b2b7fbcf7b44 ""
"kidiplom.bcf" 1776763887.44931 100507 e04409a00ea07820a76aae942e927593 "pdflatex"
(generated)
"kidiplom.bbl"
"kidiplom.blg"
(rewritten before read)
["makeindex kidiplom.idx"] 1776762025.14874 "kidiplom.idx" "kidiplom.ind" "kidiplom" 1776763887.70696 0
"kidiplom.idx" 1776763887.45159 66 0f327e1f9a599765b8c755246ec704aa "pdflatex"
(generated)
"kidiplom.ilg"
"kidiplom.ind"
(rewritten before read)
["pdflatex"] 1776763883.06023 "/home/martin/projects/kidiplom/kidiplom.tex" "kidiplom.pdf" "kidiplom" 1776763887.70766 0
"/home/martin/projects/kidiplom/kidiplom.tex" 1776763878.04907 111967 8a5d3275003cd46da47789a086b1ed1f ""
"/usr/share/texmf-dist/fonts/enc/dvips/base/8r.enc" 1775415801 4850 80dc9bab7f31fb78a000ccfed0e27cab ""
"/usr/share/texmf-dist/fonts/enc/dvips/lm/lm-ec.enc" 1775415801 2375 baa924870cfb487815765f9094cf3728 ""
"/usr/share/texmf-dist/fonts/enc/dvips/lm/lm-mathex.enc" 1775415801 3486 c7eadf5dcc57b3b2d11736679f6636ba ""
"/usr/share/texmf-dist/fonts/enc/dvips/lm/lm-mathit.enc" 1775415801 2405 5dcf2c1b967ee25cc46c58cd52244aed ""
"/usr/share/texmf-dist/fonts/enc/dvips/lm/lm-mathsy.enc" 1775415801 2840 216e6e45ad352e2456e1149f28885bee ""
"/usr/share/texmf-dist/fonts/enc/dvips/lm/lm-rm.enc" 1775415801 2327 9d6df24f9c4f7368395224341a95523a ""
"/usr/share/texmf-dist/fonts/enc/dvips/lm/lm-ts1.enc" 1775415801 3031 6c4d3515bf7115d8518af1c9ab97ca44 ""
"/usr/share/texmf-dist/fonts/map/fontname/texfonts.map" 1775415801 3524 cb3e574dea2d1052e39280babc910dc8 ""
"/usr/share/texmf-dist/fonts/tfm/adobe/courier/pcrb8r.tfm" 1775415801 1292 3059476c50a24578715759f22652f3d0 ""
"/usr/share/texmf-dist/fonts/tfm/adobe/courier/pcrb8t.tfm" 1775415801 1384 87406e4336af44af883a035f17f319d9 ""
"/usr/share/texmf-dist/fonts/tfm/adobe/courier/pcrr8r.tfm" 1775415801 1292 bd42be2f344128bff6d35d98474adfe3 ""
"/usr/share/texmf-dist/fonts/tfm/adobe/courier/pcrr8t.tfm" 1775415801 1384 4632f5e54900a7dadbb83f555bc61e56 ""
"/usr/share/texmf-dist/fonts/tfm/public/amsfonts/symbols/msam10.tfm" 1775415801 916 f87d7c45f9c908e672703b83b72241a3 ""
"/usr/share/texmf-dist/fonts/tfm/public/amsfonts/symbols/msam7.tfm" 1775415801 928 2dc8d444221b7a635bb58038579b861a ""
"/usr/share/texmf-dist/fonts/tfm/public/amsfonts/symbols/msbm10.tfm" 1775415801 908 2921f8a10601f252058503cc6570e581 ""
"/usr/share/texmf-dist/fonts/tfm/public/amsfonts/symbols/msbm7.tfm" 1775415801 940 228d6584342e91276bf566bcf9716b83 ""
"/usr/share/texmf-dist/fonts/tfm/public/cm/cmr12.tfm" 1775415801 1288 655e228510b4c2a1abe905c368440826 ""
"/usr/share/texmf-dist/fonts/tfm/public/lm/ec-lmbx10.tfm" 1775415801 12076 b54175e02101bea1addf6b2d0197ed12 ""
"/usr/share/texmf-dist/fonts/tfm/public/lm/ec-lmbx12.tfm" 1775415801 12088 d750ac78274fa7c9f73ba09914c04f8a ""
"/usr/share/texmf-dist/fonts/tfm/public/lm/ec-lmbx8.tfm" 1775415801 12076 360d279d01701e9e9f0f2427c1d230fe ""
"/usr/share/texmf-dist/fonts/tfm/public/lm/ec-lmcsc10.tfm" 1775415801 11276 116dd5bea6621ce4a1999f96d876084c ""
"/usr/share/texmf-dist/fonts/tfm/public/lm/ec-lmr10.tfm" 1775415801 12056 7e13df7fe4cbce21b072ba7c4f4deb6e ""
"/usr/share/texmf-dist/fonts/tfm/public/lm/ec-lmr12.tfm" 1775415801 12092 7b1546e2d096cfd5dcbd4049b0b1ec2e ""
"/usr/share/texmf-dist/fonts/tfm/public/lm/ec-lmr17.tfm" 1775415801 12156 ca1ae6a3c8564e89597f1f993fba1608 ""
"/usr/share/texmf-dist/fonts/tfm/public/lm/ec-lmr8.tfm" 1775415801 12064 a35db870f0b76c338d749c56dc030ef5 ""
"/usr/share/texmf-dist/fonts/tfm/public/lm/ec-lmri12.tfm" 1775415801 17144 271aaf9ebb339934b04110dc5211fba4 ""
"/usr/share/texmf-dist/fonts/tfm/public/lm/ec-lmri8.tfm" 1775415801 17152 c8240fef851c4991afefdae37a539ee1 ""
"/usr/share/texmf-dist/fonts/tfm/public/lm/lmex10.tfm" 1775415801 992 ce925c9346c7613270a79afbee98c070 ""
"/usr/share/texmf-dist/fonts/tfm/public/lm/lmmi10.tfm" 1775415801 1528 6d36b2385e0ca062a654de6ac59cb34f ""
"/usr/share/texmf-dist/fonts/tfm/public/lm/lmmi12.tfm" 1775415801 1524 753b192b18f2991794f9d41a8228510b ""
"/usr/share/texmf-dist/fonts/tfm/public/lm/lmmi6.tfm" 1775415801 1512 94a3fd88c6f27dbd9ecb46987e297a4e ""
"/usr/share/texmf-dist/fonts/tfm/public/lm/lmmi8.tfm" 1775415801 1520 a3fe5596932db2db2cbda300920dd4e9 ""
"/usr/share/texmf-dist/fonts/tfm/public/lm/lmsy10.tfm" 1775415801 1308 02cc510f9dd6012e5815d0c0ffbf6869 ""
"/usr/share/texmf-dist/fonts/tfm/public/lm/lmsy6.tfm" 1775415801 1300 b0605d44c16c22d99dc001808e4f24ea ""
"/usr/share/texmf-dist/fonts/tfm/public/lm/lmsy8.tfm" 1775415801 1304 cdc9a17df9ef0d2dc320eff37bbab1c4 ""
"/usr/share/texmf-dist/fonts/tfm/public/lm/rm-lmr10.tfm" 1775415801 11868 4f81e9b6033c032bdaf9884f4d7ef412 ""
"/usr/share/texmf-dist/fonts/tfm/public/lm/rm-lmr12.tfm" 1775415801 11888 6841b91e46b65cf41a49b160e6e74130 ""
"/usr/share/texmf-dist/fonts/tfm/public/lm/rm-lmr6.tfm" 1775415801 11836 e3b6ce3e601aec94f64a536e7f4224d5 ""
"/usr/share/texmf-dist/fonts/tfm/public/lm/rm-lmr8.tfm" 1775415801 11864 309fd7f43e4a0ba39f6f7644d76e8edf ""
"/usr/share/texmf-dist/fonts/tfm/public/lm/ts1-lmr12.tfm" 1775415801 1596 1d4548788e389ded56d0b01b28377882 ""
"/usr/share/texmf-dist/fonts/type1/public/amsfonts/symbols/msam10.pfb" 1775415801 31764 459c573c03a4949a528c2cc7f557e217 ""
"/usr/share/texmf-dist/fonts/type1/public/lm/lmbx10.pfb" 1775415801 121021 1bf809ce4a594679006bd72263eba59b ""
"/usr/share/texmf-dist/fonts/type1/public/lm/lmbx12.pfb" 1775415801 116908 1fca96723793882c2e0160350c192fc8 ""
"/usr/share/texmf-dist/fonts/type1/public/lm/lmbx8.pfb" 1775415801 125241 1d6de6a4ab0d08571b46009b6426dace ""
"/usr/share/texmf-dist/fonts/type1/public/lm/lmcsc10.pfb" 1775415801 116427 4a5b1ccaa7cce719091920a86b58608d ""
"/usr/share/texmf-dist/fonts/type1/public/lm/lmex10.pfb" 1775415801 23055 2e5b42921de910eaa97b85df04ca4891 ""
"/usr/share/texmf-dist/fonts/type1/public/lm/lmmi12.pfb" 1775415801 30696 2654571912f9cd384da9f7cb8a60c568 ""
"/usr/share/texmf-dist/fonts/type1/public/lm/lmmi8.pfb" 1775415801 30635 833ec815d446ec453a4913fc26d24cbc ""
"/usr/share/texmf-dist/fonts/type1/public/lm/lmr10.pfb" 1775415801 119235 f35b44530a1d90eb90fe15d9cba67ea0 ""
"/usr/share/texmf-dist/fonts/type1/public/lm/lmr12.pfb" 1775415801 113634 f99c44d58bae0863375faf0e1d74d612 ""
"/usr/share/texmf-dist/fonts/type1/public/lm/lmr17.pfb" 1775415801 119752 1bd8d06e4079df624bf59ce3ad7c9aa6 ""
"/usr/share/texmf-dist/fonts/type1/public/lm/lmr8.pfb" 1775415801 122174 a7a08406857c9530a0320a2517f60370 ""
"/usr/share/texmf-dist/fonts/type1/public/lm/lmri12.pfb" 1775415801 109265 32320cb6133d4d76bf83e27b5eb4009b ""
"/usr/share/texmf-dist/fonts/type1/public/lm/lmri8.pfb" 1775415801 109952 3dd76c0c5c680d519bb6d59a066c0826 ""
"/usr/share/texmf-dist/fonts/type1/public/lm/lmsy10.pfb" 1775415801 27863 09ce3735688ffde955e72da27c95b61a ""
"/usr/share/texmf-dist/fonts/type1/public/lm/lmsy8.pfb" 1775415801 27802 5c876bb2c4040caaf035d60bd74a86bd ""
"/usr/share/texmf-dist/fonts/type1/urw/courier/ucrb8a.pfb" 1775415801 50493 4ed1f7e9eba8f1f3e1ec25195460190d ""
"/usr/share/texmf-dist/fonts/type1/urw/courier/ucrr8a.pfb" 1775415801 45758 19968a0990191524e34e1994d4a31cb6 ""
"/usr/share/texmf-dist/fonts/vf/adobe/courier/pcrb8t.vf" 1775415801 2184 5d20c8b00cd914e50251116c274e2d0b ""
"/usr/share/texmf-dist/fonts/vf/adobe/courier/pcrr8t.vf" 1775415801 2184 8475af1b9cfa983db5f46f5ed4b8f9f7 ""
"/usr/share/texmf-dist/tex/context/base/mkii/supp-pdf.mkii" 1775415801 71627 94eb9990bed73c364d7f53f960cc8c5b ""
"/usr/share/texmf-dist/tex/generic/babel-czech/czech.ldf" 1775415801 15910 20b36fee6c6cdcfa90232891da7a9f34 ""
"/usr/share/texmf-dist/tex/generic/babel-english/english.ldf" 1775415801 7008 9ff5fdcc865b01beca2b0fe4a46231d4 ""
"/usr/share/texmf-dist/tex/generic/babel/babel.sty" 1775415801 147019 f2ca437186bfeb562e1066ad59426a04 ""
"/usr/share/texmf-dist/tex/generic/babel/locale/cs/babel-cs.ini" 1775415801 4447 101a02f96e435504c452e6c6f0f16371 ""
"/usr/share/texmf-dist/tex/generic/babel/locale/cs/babel-czech.tex" 1775415801 372 c7568ddcbdc696082db4d13e860e7448 ""
"/usr/share/texmf-dist/tex/generic/babel/locale/en/babel-en.ini" 1775415801 3936 fef897bbcfe8e9d18c93a3d2d53cf9d8 ""
"/usr/share/texmf-dist/tex/generic/babel/locale/en/babel-english.tex" 1775415801 374 a9c05f002d9437e6de45ac1cc23d56c2 ""
"/usr/share/texmf-dist/tex/generic/babel/txtbabel.def" 1775415801 5231 c1599e5bf7d2ee42743212a7f8d20a56 ""
"/usr/share/texmf-dist/tex/generic/bigintcalc/bigintcalc.sty" 1775415801 40635 c40361e206be584d448876bba8a64a3b ""
"/usr/share/texmf-dist/tex/generic/bitset/bitset.sty" 1775415801 33961 6b5c75130e435b2bfdb9f480a09a39f9 ""
"/usr/share/texmf-dist/tex/generic/gettitlestring/gettitlestring.sty" 1775415801 8371 9d55b8bd010bc717624922fb3477d92e ""
"/usr/share/texmf-dist/tex/generic/iftex/ifpdf.sty" 1775415801 480 5778104efadad304ced77548ca2184b1 ""
"/usr/share/texmf-dist/tex/generic/iftex/iftex.sty" 1775415801 7984 7dbb9280f03c0a315425f1b4f35d43ee ""
"/usr/share/texmf-dist/tex/generic/iftex/ifvtex.sty" 1775415801 1057 525c2192b5febbd8c1f662c9468335bb ""
"/usr/share/texmf-dist/tex/generic/infwarerr/infwarerr.sty" 1775415801 8356 7bbb2c2373aa810be568c29e333da8ed ""
"/usr/share/texmf-dist/tex/generic/intcalc/intcalc.sty" 1775415801 31769 002a487f55041f8e805cfbf6385ffd97 ""
"/usr/share/texmf-dist/tex/generic/kvdefinekeys/kvdefinekeys.sty" 1775415801 5412 d5a2436094cd7be85769db90f29250a6 ""
"/usr/share/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty" 1775415801 17865 1a9bd36b4f98178fa551aca822290953 ""
"/usr/share/texmf-dist/tex/generic/pdfescape/pdfescape.sty" 1775415801 19007 15924f7228aca6c6d184b115f4baa231 ""
"/usr/share/texmf-dist/tex/generic/pdftexcmds/pdftexcmds.sty" 1775415801 20089 80423eac55aa175305d35b49e04fe23b ""
"/usr/share/texmf-dist/tex/generic/pgf/pgf.revision.tex" 1775415801 116 760d50e6a16543bf6edb475635793673 ""
"/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgf.cfg" 1775415801 926 2963ea0dcf6cc6c0a770b69ec46a477b ""
"/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsys-common-pdf.def" 1775415801 5542 32f75a31ea6c3a7e1148cd6d5e93dbb7 ""
"/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsys-pdftex.def" 1775415801 12612 7774ba67bfd72e593c4436c2de6201e3 ""
"/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsys.code.tex" 1775415801 61355 39904e7552da3800a6838d41440943a5 ""
"/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsysprotocol.code.tex" 1775415801 1896 b8e0ca0ac371d74c0ca05583f6313c91 ""
"/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsyssoftpath.code.tex" 1775415801 7778 53c8b5623d80238f6a20aa1df1868e63 ""
"/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfkeys.code.tex" 1775415801 39784 414c54e866ebab4b801e2ad81d9b21d8 ""
"/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfkeyslibraryfiltered.code.tex" 1775415801 37436 50ba7794827e363eec9ea3467c15c6d7 ""
"/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfrcs.code.tex" 1775415801 4385 510565c2f07998c8a0e14f0ec07ff23c ""
"/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfutil-common.tex" 1775415801 30029 c49ea8f95207c46731469c614daf4e33 ""
"/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfutil-latex.def" 1775415801 7067 11553488d1600cac6a0cfca012fca111 ""
"/usr/share/texmf-dist/tex/generic/stringenc/stringenc.sty" 1775415801 21514 b7557edcee22835ef6b03ede1802dad4 ""
"/usr/share/texmf-dist/tex/generic/tracklang/tracklang.tex" 1775415801 152705 c906707a12ed9475745f81566006dbd7 ""
"/usr/share/texmf-dist/tex/generic/uniquecounter/uniquecounter.sty" 1775415801 7008 f92eaa0a3872ed622bbf538217cd2ab7 ""
"/usr/share/texmf-dist/tex/generic/xkeyval/xkeyval.tex" 1775415801 19299 c7c03646b32f5a7caaa137673b7e76d2 ""
"/usr/share/texmf-dist/tex/generic/xkeyval/xkvutils.tex" 1775415801 7787 7dfc2f158253fc82fd655393220e6620 ""
"/usr/share/texmf-dist/tex/latex/amscls/amsthm.sty" 1775415801 12594 0d51ac3a545aaaa555021326ff22a6cc ""
"/usr/share/texmf-dist/tex/latex/amsfonts/amsfonts.sty" 1775415801 5949 3f3fd50a8cc94c3d4cbf4fc66cd3df1c ""
"/usr/share/texmf-dist/tex/latex/amsfonts/amssymb.sty" 1775415801 13829 94730e64147574077f8ecfea9bb69af4 ""
"/usr/share/texmf-dist/tex/latex/amsfonts/euscript.sty" 1775415801 1319 275cecae59b75cbd38ce73df76acdb23 ""
"/usr/share/texmf-dist/tex/latex/amsfonts/umsa.fd" 1775415801 961 6518c6525a34feb5e8250ffa91731cff ""
"/usr/share/texmf-dist/tex/latex/amsfonts/umsb.fd" 1775415801 961 d02606146ba5601b5645f987c92e6193 ""
"/usr/share/texmf-dist/tex/latex/amsmath/amsbsy.sty" 1775415801 2222 27db7d52163edae53881b71ff62e754e ""
"/usr/share/texmf-dist/tex/latex/amsmath/amsgen.sty" 1775415801 4173 1b3e76addfb8afcb47db4811d66e1dc6 ""
"/usr/share/texmf-dist/tex/latex/amsmath/amsmath.sty" 1775415801 88471 b1bb09142edddebd46ba986341b867bd ""
"/usr/share/texmf-dist/tex/latex/amsmath/amsopn.sty" 1775415801 4474 c510a88aa5f51b8c773b50a7ee92befd ""
"/usr/share/texmf-dist/tex/latex/amsmath/amstext.sty" 1775415801 2444 9983e1d0683f102e3b190c64a49313aa ""
"/usr/share/texmf-dist/tex/latex/auxhook/auxhook.sty" 1775415801 3935 57aa3c3e203a5c2effb4d2bd2efbc323 ""
"/usr/share/texmf-dist/tex/latex/base/article.cls" 1775415801 20144 b966087dda3b194755eb460d32e2ef75 ""
"/usr/share/texmf-dist/tex/latex/base/fontenc.sty" 1775415801 5275 6f9d359641b36842524cdb97716ab75f ""
"/usr/share/texmf-dist/tex/latex/base/ifthen.sty" 1775415801 5525 1593ca62a2554dd7423fc8a4e5a82125 ""
"/usr/share/texmf-dist/tex/latex/base/inputenc.sty" 1775415801 5048 0270515b828149155424600fd2d58ac5 ""
"/usr/share/texmf-dist/tex/latex/base/makeidx.sty" 1775415801 1939 6a53b9b28a14b26311df6cf40fff84ab ""
"/usr/share/texmf-dist/tex/latex/base/size12.clo" 1775415801 8449 8dc66c6c313c8eb2d774af83bca435dd ""
"/usr/share/texmf-dist/tex/latex/biblatex-iso690/iso-numeric.dbx" 1775415801 402 83e064b3bf05af557635d4cb8ec3c5d8 ""
"/usr/share/texmf-dist/tex/latex/biblatex/biblatex.cfg" 1775415801 69 249fa6df04d948e51b6d5c67bea30c42 ""
"/usr/share/texmf-dist/tex/latex/biblatex/biblatex.def" 1775415801 96838 ffbc2c4ed45b0b76660254a85df40e90 ""
"/usr/share/texmf-dist/tex/latex/biblatex/biblatex.sty" 1775415801 537439 2a9e171c3538c29f9ba74ff3cff6f014 ""
"/usr/share/texmf-dist/tex/latex/biblatex/blx-case-expl3.sty" 1775415801 9961 107fdb78f652fccae7bce0d23bdc19cd ""
"/usr/share/texmf-dist/tex/latex/biblatex/blx-compat.def" 1775415801 13919 5426dbe90e723f089052b4e908b56ef9 ""
"/usr/share/texmf-dist/tex/latex/biblatex/blx-dm.def" 1775415801 32761 18d14e3b502c120f79b2184de4e21d14 ""
"/usr/share/texmf-dist/tex/latex/biblatex/blx-natbib.def" 1775415801 2190 4b4fcc6752fa7201177431e523c40d74 ""
"/usr/share/texmf-dist/tex/latex/biblatex/cbx/numeric.cbx" 1775415801 4676 d3f90f6377ee43f043262aa587deb6de ""
"/usr/share/texmf-dist/tex/latex/biblatex/lbx/english.lbx" 1775415801 40021 daa5a82ed0967f3ac4b77cb8384cac55 ""
"/usr/share/texmf-dist/tex/latex/bookmark/bkm-pdftex.def" 1775415801 8818 aa5157b46368efebf023abff55611467 ""
"/usr/share/texmf-dist/tex/latex/bookmark/bookmark.sty" 1775415801 18245 97e6be180cf07bb6f7008cfdaaecfce5 ""
"/usr/share/texmf-dist/tex/latex/colortbl/colortbl.sty" 1775415801 12709 4ca3cf5f9f1d551b8a1090fba11ac95d ""
"/usr/share/texmf-dist/tex/latex/csquotes/csquotes.cfg" 1775415801 7068 06f8d141725d114847527a66439066b6 ""
"/usr/share/texmf-dist/tex/latex/csquotes/csquotes.def" 1775415801 22135 0975a49eeaed232aa861e9425ffb2e7c ""
"/usr/share/texmf-dist/tex/latex/csquotes/csquotes.sty" 1775415801 62767 e79d6d7a989e7da62dcf3d0a65c1faee ""
"/usr/share/texmf-dist/tex/latex/datatool-english/datatool-english-utf8.ldf" 1775415801 3089 d52a4c355b25c3dd529891c3a45f909f ""
"/usr/share/texmf-dist/tex/latex/datatool-english/datatool-english.ldf" 1775415801 13644 e87d3e24e9d57f23552bacd982741384 ""
"/usr/share/texmf-dist/tex/latex/datatool/datatool-base.sty" 1775415801 300696 d64c0f6926b342caf0237aca7adc4565 ""
"/usr/share/texmf-dist/tex/latex/datatool/datatool-l3fp.def" 1775415801 8399 46cc9ec75e799cc8dab7047c95556626 ""
"/usr/share/texmf-dist/tex/latex/datatool/datatool-utf8.ldf" 1775415801 4460 214e95070da2307b91ff7e1a67406558 ""
"/usr/share/texmf-dist/tex/latex/epstopdf-pkg/epstopdf-base.sty" 1775415801 13886 d1306dcf79a944f6988e688c1785f9ce ""
"/usr/share/texmf-dist/tex/latex/etoolbox/etoolbox.sty" 1775415801 46885 8953c67ffba03252c6090aa19568b8ba ""
"/usr/share/texmf-dist/tex/latex/geometry/geometry.sty" 1775415801 41601 9cf6c5257b1bc7af01a58859749dd37a ""
"/usr/share/texmf-dist/tex/latex/glossaries-english/glossaries-english.ldf" 1775415801 3656 cfd7063dcf1f89f4d3681b9a8bd5be4d ""
"/usr/share/texmf-dist/tex/latex/glossaries/base/glossaries.sty" 1775415801 263604 afa61de25e12f99bb1305606fa9e1ddf ""
"/usr/share/texmf-dist/tex/latex/glossaries/styles/glossary-hypernav.sty" 1775415801 7346 20a6fbcba8f370c2b7d92a5a20321b54 ""
"/usr/share/texmf-dist/tex/latex/glossaries/styles/glossary-list.sty" 1775415801 7729 7146f0a2bfdee482a9b65ea7004d6500 ""
"/usr/share/texmf-dist/tex/latex/glossaries/styles/glossary-long.sty" 1775415801 9620 8591e606650ad0f162261aac7c7e8507 ""
"/usr/share/texmf-dist/tex/latex/glossaries/styles/glossary-super.sty" 1775415801 10639 48c47d2eadf7b08958cc1dd323db6849 ""
"/usr/share/texmf-dist/tex/latex/glossaries/styles/glossary-tree.sty" 1775415801 96632 7b39c1bccbc94c2cff19084b6ff5ed7e ""
"/usr/share/texmf-dist/tex/latex/graphics-cfg/color.cfg" 1775415801 1213 620bba36b25224fa9b7e1ccb4ecb76fd ""
"/usr/share/texmf-dist/tex/latex/graphics-cfg/graphics.cfg" 1775415801 1224 978390e9c2234eab29404bc21b268d1e ""
"/usr/share/texmf-dist/tex/latex/graphics-def/pdftex.def" 1775415801 19626 23e2822b9b2b5005f4c549ca98b9334d ""
"/usr/share/texmf-dist/tex/latex/graphics/color.sty" 1775415801 7245 a7e8457a46cda4920df85d975267efb4 ""
"/usr/share/texmf-dist/tex/latex/graphics/dvipsnam.def" 1775415801 5009 f48e1006c67ca6c50094e2f41e884d72 ""
"/usr/share/texmf-dist/tex/latex/graphics/graphics.sty" 1775415801 18363 69bb4f5538964bfea50d1e6d89cbe69f ""
"/usr/share/texmf-dist/tex/latex/graphics/graphicx.sty" 1775415801 8118 43b99e52946c33a23f5f43b52d5cc5ec ""
"/usr/share/texmf-dist/tex/latex/graphics/keyval.sty" 1775415801 2671 d9941f4bf4750e9b0603c9a2ec54693b ""
"/usr/share/texmf-dist/tex/latex/graphics/mathcolor.ltx" 1775415801 2885 9c645d672ae17285bba324998918efd8 ""
"/usr/share/texmf-dist/tex/latex/graphics/trig.sty" 1775415801 4023 e66acf578d6b564c4670fb57ff336a7a ""
"/usr/share/texmf-dist/tex/latex/hycolor/hycolor.sty" 1775415801 17914 4c28a13fc3d975e6e81c9bea1d697276 ""
"/usr/share/texmf-dist/tex/latex/hyperref/hpdftex.def" 1775415801 48140 0d317d7fb0c7460a10b7b2713db57305 ""
"/usr/share/texmf-dist/tex/latex/hyperref/hyperref.sty" 1775415801 223349 c7928c099a8656537a829ba316c95536 ""
"/usr/share/texmf-dist/tex/latex/hyperref/nameref.sty" 1775415801 11459 697f11f6c439d25d39d2674b99566af4 ""
"/usr/share/texmf-dist/tex/latex/hyperref/pd1enc.def" 1775415801 14249 b94983bbccc8d5739c16cc91d1fd1c3b ""
"/usr/share/texmf-dist/tex/latex/hyperref/puenc.def" 1775415801 117118 2e3ba580751de5583beacf2e5fee69a9 ""
"/usr/share/texmf-dist/tex/latex/koma-script/scrbase.sty" 1775415801 101071 5c33e7845f9afaab8705ab53e1c47a1a ""
"/usr/share/texmf-dist/tex/latex/koma-script/scrlfile-hook.sty" 1775415801 11187 bb19b68b7570b0a5839776e49029dfc6 ""
"/usr/share/texmf-dist/tex/latex/koma-script/scrlfile.sty" 1775415801 3330 524ef98f49a363d012453fece1f26677 ""
"/usr/share/texmf-dist/tex/latex/koma-script/scrlogo.sty" 1775415801 2164 c44cdb4bc4dc3e1eacfb6a8e57830b70 ""
"/usr/share/texmf-dist/tex/latex/kvoptions/kvoptions.sty" 1775415801 22555 6d8e155cfef6d82c3d5c742fea7c992e ""
"/usr/share/texmf-dist/tex/latex/kvsetkeys/kvsetkeys.sty" 1775415801 13815 760b0c02f691ea230f5359c4e1de23a7 ""
"/usr/share/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def" 1775415801 30662 bfd6e864f4ffc5018b0e2b6260c3181c ""
"/usr/share/texmf-dist/tex/latex/l3kernel/expl3.sty" 1775415801 6558 45786cbbf5684a09ee65aa45a7b367e0 ""
"/usr/share/texmf-dist/tex/latex/l3packages/l3keys2e/l3keys2e.sty" 1775415801 4674 ff006c14a0adf55e7318570f962bcbbb ""
"/usr/share/texmf-dist/tex/latex/l3packages/xparse/xparse.sty" 1775415801 10176 c2fc1c663b3f3899ddac6e6ed3fb1d7e ""
"/usr/share/texmf-dist/tex/latex/lastpage/lastpage.sty" 1775415801 2865 8ccb2521cf80bdb5bc6042e2df32d144 ""
"/usr/share/texmf-dist/tex/latex/lastpage/lastpage2e.sty" 1775415801 2716 b320fe74b8aadca5b2805ffb7b0f33c6 ""
"/usr/share/texmf-dist/tex/latex/lastpage/lastpagemodern.sty" 1775415801 9397 191b1ee46e1309b0f90d3f19218f6750 ""
"/usr/share/texmf-dist/tex/latex/latexconfig/epstopdf-sys.cfg" 1775415801 678 4792914a8f45be57bb98413425e4c7af ""
"/usr/share/texmf-dist/tex/latex/lipsum/lipsum.ltd.tex" 1775415801 95525 6fd0552101a6b1f9b7a84b402ec435ba ""
"/usr/share/texmf-dist/tex/latex/lipsum/lipsum.sty" 1775415801 14690 c2c754218a7108db7823a4839c1bc3cd ""
"/usr/share/texmf-dist/tex/latex/listings/listings.cfg" 1775415801 1865 73df61e45e2dfdc239ef37ab16d87d6a ""
"/usr/share/texmf-dist/tex/latex/listings/listings.sty" 1775415801 81627 6a9c17f89f356724d1c9813b7025f0c1 ""
"/usr/share/texmf-dist/tex/latex/listings/lstlang1.sty" 1775415801 206518 095934a0019dcba14af528744bf9b295 ""
"/usr/share/texmf-dist/tex/latex/listings/lstlang2.sty" 1775415801 106030 54239571eb5e01f352181dfbfb7c527f ""
"/usr/share/texmf-dist/tex/latex/listings/lstlang3.sty" 1775415801 92877 426b9bccf7c135073bc47c1f72c07086 ""
"/usr/share/texmf-dist/tex/latex/listings/lstmisc.sty" 1775415801 77105 002e983b638eadbf04e580642335f689 ""
"/usr/share/texmf-dist/tex/latex/listings/lstpatch.sty" 1775415801 353 9024412f43e92cd5b21fe9ded82d0610 ""
"/usr/share/texmf-dist/tex/latex/lm/lmodern.sty" 1775415801 1608 b00724785a9e9c599e5181bb8729160b ""
"/usr/share/texmf-dist/tex/latex/lm/omllmm.fd" 1775415801 890 57f5adccd504fb5c98bdf99ed7e7f195 ""
"/usr/share/texmf-dist/tex/latex/lm/omslmsy.fd" 1775415801 807 3de192f3efa968913bd2f096a7b430d8 ""
"/usr/share/texmf-dist/tex/latex/lm/omxlmex.fd" 1775415801 568 a5494d810f2680caf10205cd1226c76c ""
"/usr/share/texmf-dist/tex/latex/lm/ot1lmr.fd" 1775415801 1882 28c08db1407ebff35a658fd141753d16 ""
"/usr/share/texmf-dist/tex/latex/lm/t1lmr.fd" 1775415801 1867 996fe743d88a01aca041ed22cc10e1bb ""
"/usr/share/texmf-dist/tex/latex/lm/ts1lmr.fd" 1775415801 1914 884882d7ebb0fd65cea93fca77ff6f5a ""
"/usr/share/texmf-dist/tex/latex/logreq/logreq.def" 1775415801 1620 fb1c32b818f2058eca187e5c41dfae77 ""
"/usr/share/texmf-dist/tex/latex/logreq/logreq.sty" 1775415801 6187 b27afc771af565d3a9ff1ca7d16d0d46 ""
"/usr/share/texmf-dist/tex/latex/mfirstuc/mfirstuc.sty" 1775415801 18640 ecc51f3cc513cfff843ce5d9f457c3b9 ""
"/usr/share/texmf-dist/tex/latex/pgf/systemlayer/pgfsys.sty" 1775415801 443 8c872229db56122037e86bcda49e14f3 ""
"/usr/share/texmf-dist/tex/latex/pgf/utilities/pgfrcs.sty" 1775415801 325 f9f16d12354225b7dd52a3321f085955 ""
"/usr/share/texmf-dist/tex/latex/psnfss/t1pcr.fd" 1775415801 798 d5895e9edc628f2be019beb2c0ec66df ""
"/usr/share/texmf-dist/tex/latex/refcount/refcount.sty" 1775415801 9878 9e94e8fa600d95f9c7731bb21dfb67a4 ""
"/usr/share/texmf-dist/tex/latex/rerunfilecheck/rerunfilecheck.sty" 1775415801 9684 a33a14b82ce60d6e77cb9be689d79ee6 ""
"/usr/share/texmf-dist/tex/latex/savesym/savesym.sty" 1775415801 2076 969b46b87cb8b982a532fc328300998e ""
"/usr/share/texmf-dist/tex/latex/supertabular/supertabular.sty" 1775415801 16217 4373543ac84bc0161205d94fecd4b8bf ""
"/usr/share/texmf-dist/tex/latex/svg/svg.sty" 1775415801 43468 671ae75b3a15019004495eff4c0911e8 ""
"/usr/share/texmf-dist/tex/latex/thmtools/aliasctr.sty" 1775415801 2547 a5a59eb03f587b4c267981c894cde4cb ""
"/usr/share/texmf-dist/tex/latex/thmtools/parseargs.sty" 1775415801 1696 0b33b5336cb99d15b904405f9c077915 ""
"/usr/share/texmf-dist/tex/latex/thmtools/thm-amsthm.sty" 1775415801 4682 8f2186b1227fdefc9dcd77a366d53aa3 ""
"/usr/share/texmf-dist/tex/latex/thmtools/thm-autoref.sty" 1775415801 3272 133720bc624d01252e2858c1a29ee3de ""
"/usr/share/texmf-dist/tex/latex/thmtools/thm-kv.sty" 1775415801 15445 e93b10139ca6d334bd7f636226a85389 ""
"/usr/share/texmf-dist/tex/latex/thmtools/thm-listof.sty" 1775415801 6224 5b50b2177552839e49f62ff6045310e1 ""
"/usr/share/texmf-dist/tex/latex/thmtools/thm-patch.sty" 1775415801 6878 1730928da9b392ec6c2f6b0e2273b4b9 ""
"/usr/share/texmf-dist/tex/latex/thmtools/thm-restate.sty" 1775415801 8051 10018eb9c2d166333bfceb517a425f4d ""
"/usr/share/texmf-dist/tex/latex/thmtools/thmtools.sty" 1775415801 1913 873bc7fbf18d7dd934dc3a6cc156472e ""
"/usr/share/texmf-dist/tex/latex/tools/array.sty" 1775415801 15651 9d7c62df82cb29a555c00550babfe364 ""
"/usr/share/texmf-dist/tex/latex/tools/longtable.sty" 1775415801 16014 dfa4b4d4e04a78a3f05a90c19711737a ""
"/usr/share/texmf-dist/tex/latex/tools/multicol.sty" 1775415801 33142 efe8f4750fc02524935e7423b4bdef69 ""
"/usr/share/texmf-dist/tex/latex/tools/shellesc.sty" 1775415801 4121 d611256e8b768e99aa5a680aad44990d ""
"/usr/share/texmf-dist/tex/latex/tracklang/tracklang.sty" 1775415801 10062 6009a67f1c2bd376a9f34880dc509a07 ""
"/usr/share/texmf-dist/tex/latex/translator/translator.sty" 1775415801 8765 56d370785f0143111ff9898b5adfe08e ""
"/usr/share/texmf-dist/tex/latex/transparent/transparent-nometadata.sty" 1775415801 4218 953818299bf47dea89e603d2b8a390d8 ""
"/usr/share/texmf-dist/tex/latex/transparent/transparent.sty" 1775415801 1797 4ef4500488e0ea48fd76f41e2a351a2e ""
"/usr/share/texmf-dist/tex/latex/trimspaces/trimspaces.sty" 1775415801 1380 971a51b00a14503ddf754cab24c3f209 ""
"/usr/share/texmf-dist/tex/latex/url/url.sty" 1775415801 12796 8edb7d69a20b857904dd0ea757c14ec9 ""
"/usr/share/texmf-dist/tex/latex/xcolor/xcolor.sty" 1775415801 55384 b454dec21c2d9f45ec0b793f0995b992 ""
"/usr/share/texmf-dist/tex/latex/xfor/xfor.sty" 1775415801 2689 44855b72da58344b1c1d9b3087bce6ca ""
"/usr/share/texmf-dist/tex/latex/xkeyval/xkeyval.sty" 1775415801 5006 d7e899bb5d9717c7f214e9bc0284de7b ""
"/usr/share/texmf-dist/web2c/texmf.cnf" 1775415801 43569 fd570f2fa160877d211e859f687312ba ""
"/var/lib/texmf/fonts/map/pdftex/updmap/pdftex.map" 1775754247 326941 2435a15e28edd8c15348e7007d177b30 ""
"/var/lib/texmf/web2c/pdftex/pdflatex.fmt" 1775754238 2352580 88d3ed5fab13e4c39094adf4a84511d2 ""
"czech-iso.lbx" 1681557593 294 7ce53d925459ba9e674024c57d6c7af9 ""
"czech.lbx" 1681557593 23857 01707bd906156286610d5e5bcb06aa09 ""
"english-iso.lbx" 1681557593 292 ce1004c4c0d380cc5ae6d84de8c03da6 ""
"graphics/300playerstrace.png" 1775758530.81909 49763 3cc41557a1ddcc2acef988ea4667dfe8 ""
"graphics/TcpIp.png" 1775414953.33879 64639 00f2319f3474a2ac8cf43569bc9af998 ""
"graphics/UP_znak.pdf" 1681557593 3121 caaf4f5447a3a0b25b356a30208583d1 ""
"graphics/ecs_optimization_tracy_01.png" 1776022974.05461 130401 258005bf8593377b2ff6bade36c08384 ""
"graphics/ecs_optimization_tracy_02.png" 1776023016.44493 121676 ab7b6fd1d3d0d0b0a564447c2067c920 ""
"graphics/integrationcomparison.pdf" 1775588282.49964 20019 870793ee528516a5c736ac47a287f24f ""
"graphics/kititle-cz-nofont.pdf" 1681557593 12762 4b9f69751f3c44debf721c7e80adffc7 ""
"graphics/latencycomparison.pdf" 1775588277.51972 19017 25d4b3a10e48313d5320492d27c6375d ""
"graphics/network01.pdf" 1775677988.13486 41700 2c2b8af0695a9efcb41151cf3cf8c0d3 ""
"graphics/playerbenchmark.png" 1774990129.78598 36699 4e11286fcaf50fefe34cf42456e981bc ""
"iso-numeric.bbx" 1681557593 319 50b9ccdb608c40ac14dd498079e9ab29 ""
"iso-numeric.cbx" 1681557593 73 45828f8df9dead5135d2c8a727f5b601 ""
"iso.bbx" 1681557593 13233 9f9e9c852fe772bfe1efaacc6b415eb7 ""
"kibase.sty" 1681557593 23853 021ae8236751950ac5e18f6a5bcf1da7 ""
"kidiplom.acr" 0 -1 0 ""
"kidiplom.aux" 1776763887.40731 48477 1832b6ee9f1400e92afabb64c1f09e0e "pdflatex"
"kidiplom.bbl" 0 -1 0 "biber kidiplom"
"kidiplom.cls" 1681557593 18598 7684b2d13ac67d7b017c4eea1e12fa0c ""
"kidiplom.glsdefs" 1776763887.45159 525 791a05cd0a9f8650067804d8f5ff3f41 "pdflatex"
"kidiplom.ind" 1776762025.16852 97 93cd0da9f80df19615dd6260cd130842 "makeindex kidiplom.idx"
"kidiplom.lot" 1776763887.45159 393 b739e721d36e3a408e2ce0469f912651 "pdflatex"
"kidiplom.run.xml" 1776763887.45159 2535 4e001a965ee2f4de88dc6271855a61ea "pdflatex"
"kidiplom.tex" 1776763878.04907 111967 8a5d3275003cd46da47789a086b1ed1f ""
"kidiplom.toc" 1776763887.45159 8240 43b90c8a8f9022863b7db6ded58c0808 "pdflatex"
(generated)
"kidiplom.acn"
"kidiplom.aux"
"kidiplom.bcf"
"kidiplom.glo"
"kidiplom.glsdefs"
"kidiplom.idx"
"kidiplom.ist"
"kidiplom.log"
"kidiplom.lot"
"kidiplom.pdf"
"kidiplom.run.xml"
"kidiplom.toc"
(rewritten before read)
+605
View File
@@ -0,0 +1,605 @@
PWD /home/martin/projects/kidiplom
INPUT /usr/share/texmf-dist/web2c/texmf.cnf
INPUT /var/lib/texmf/web2c/pdftex/pdflatex.fmt
INPUT /home/martin/projects/kidiplom/kidiplom.tex
OUTPUT kidiplom.log
INPUT ./kidiplom.cls
INPUT kidiplom.cls
INPUT /usr/share/texmf-dist/tex/latex/base/article.cls
INPUT /usr/share/texmf-dist/tex/latex/base/article.cls
INPUT /usr/share/texmf-dist/tex/latex/base/size12.clo
INPUT /usr/share/texmf-dist/tex/latex/base/size12.clo
INPUT /usr/share/texmf-dist/tex/latex/base/size12.clo
INPUT /usr/share/texmf-dist/fonts/map/fontname/texfonts.map
INPUT /usr/share/texmf-dist/fonts/tfm/public/cm/cmr12.tfm
INPUT /usr/share/texmf-dist/tex/latex/kvoptions/kvoptions.sty
INPUT /usr/share/texmf-dist/tex/latex/kvoptions/kvoptions.sty
INPUT /usr/share/texmf-dist/tex/latex/graphics/keyval.sty
INPUT /usr/share/texmf-dist/tex/latex/graphics/keyval.sty
INPUT /usr/share/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty
INPUT /usr/share/texmf-dist/tex/generic/ltxcmds/ltxcmds.sty
INPUT /usr/share/texmf-dist/tex/latex/kvsetkeys/kvsetkeys.sty
INPUT /usr/share/texmf-dist/tex/latex/kvsetkeys/kvsetkeys.sty
INPUT ./kibase.sty
INPUT kibase.sty
INPUT /usr/share/texmf-dist/tex/latex/base/inputenc.sty
INPUT /usr/share/texmf-dist/tex/latex/base/inputenc.sty
INPUT /usr/share/texmf-dist/tex/generic/babel/babel.sty
INPUT /usr/share/texmf-dist/tex/generic/babel/babel.sty
INPUT /usr/share/texmf-dist/tex/generic/babel/txtbabel.def
INPUT /usr/share/texmf-dist/tex/generic/babel/locale/cs/babel-czech.tex
INPUT /usr/share/texmf-dist/tex/generic/babel/locale/cs/babel-czech.tex
INPUT /usr/share/texmf-dist/tex/generic/babel/locale/cs/babel-czech.tex
INPUT /usr/share/texmf-dist/tex/generic/babel/locale/en/babel-english.tex
INPUT /usr/share/texmf-dist/tex/generic/babel/locale/en/babel-english.tex
INPUT /usr/share/texmf-dist/tex/generic/babel/locale/en/babel-english.tex
INPUT /usr/share/texmf-dist/tex/generic/babel/locale/cs/babel-czech.tex
INPUT /usr/share/texmf-dist/tex/generic/babel/locale/cs/babel-cs.ini
INPUT /usr/share/texmf-dist/tex/generic/babel-czech/czech.ldf
INPUT /usr/share/texmf-dist/tex/generic/babel-czech/czech.ldf
INPUT /usr/share/texmf-dist/tex/generic/babel-czech/czech.ldf
INPUT /usr/share/texmf-dist/tex/generic/babel/locale/en/babel-en.ini
INPUT /usr/share/texmf-dist/tex/generic/babel-english/english.ldf
INPUT /usr/share/texmf-dist/tex/generic/babel-english/english.ldf
INPUT /usr/share/texmf-dist/tex/generic/babel-english/english.ldf
INPUT /usr/share/texmf-dist/tex/generic/babel/locale/cs/babel-cs.ini
INPUT /usr/share/texmf-dist/tex/generic/babel-czech/czech.ldf
INPUT /usr/share/texmf-dist/tex/latex/xcolor/xcolor.sty
INPUT /usr/share/texmf-dist/tex/latex/xcolor/xcolor.sty
INPUT /usr/share/texmf-dist/tex/latex/graphics-cfg/color.cfg
INPUT /usr/share/texmf-dist/tex/latex/graphics-cfg/color.cfg
INPUT /usr/share/texmf-dist/tex/latex/graphics-cfg/color.cfg
INPUT /usr/share/texmf-dist/tex/latex/graphics-def/pdftex.def
INPUT /usr/share/texmf-dist/tex/latex/graphics-def/pdftex.def
INPUT /usr/share/texmf-dist/tex/latex/graphics-def/pdftex.def
INPUT /usr/share/texmf-dist/tex/latex/graphics/mathcolor.ltx
INPUT /usr/share/texmf-dist/tex/latex/graphics/mathcolor.ltx
INPUT /usr/share/texmf-dist/tex/latex/graphics/mathcolor.ltx
INPUT /usr/share/texmf-dist/tex/latex/graphics/dvipsnam.def
INPUT /usr/share/texmf-dist/tex/latex/graphics/dvipsnam.def
INPUT /usr/share/texmf-dist/tex/latex/graphics/dvipsnam.def
INPUT /usr/share/texmf-dist/tex/latex/colortbl/colortbl.sty
INPUT /usr/share/texmf-dist/tex/latex/colortbl/colortbl.sty
INPUT /usr/share/texmf-dist/tex/latex/tools/array.sty
INPUT /usr/share/texmf-dist/tex/latex/tools/array.sty
INPUT /usr/share/texmf-dist/tex/latex/graphics/color.sty
INPUT /usr/share/texmf-dist/tex/latex/hyperref/hyperref.sty
INPUT /usr/share/texmf-dist/tex/latex/hyperref/hyperref.sty
INPUT /usr/share/texmf-dist/tex/generic/iftex/iftex.sty
INPUT /usr/share/texmf-dist/tex/generic/iftex/iftex.sty
INPUT /usr/share/texmf-dist/tex/generic/kvdefinekeys/kvdefinekeys.sty
INPUT /usr/share/texmf-dist/tex/generic/kvdefinekeys/kvdefinekeys.sty
INPUT /usr/share/texmf-dist/tex/generic/pdfescape/pdfescape.sty
INPUT /usr/share/texmf-dist/tex/generic/pdfescape/pdfescape.sty
INPUT /usr/share/texmf-dist/tex/generic/pdftexcmds/pdftexcmds.sty
INPUT /usr/share/texmf-dist/tex/generic/pdftexcmds/pdftexcmds.sty
INPUT /usr/share/texmf-dist/tex/generic/infwarerr/infwarerr.sty
INPUT /usr/share/texmf-dist/tex/generic/infwarerr/infwarerr.sty
INPUT /usr/share/texmf-dist/tex/latex/hycolor/hycolor.sty
INPUT /usr/share/texmf-dist/tex/latex/hycolor/hycolor.sty
INPUT /usr/share/texmf-dist/tex/latex/hyperref/nameref.sty
INPUT /usr/share/texmf-dist/tex/latex/hyperref/nameref.sty
INPUT /usr/share/texmf-dist/tex/latex/refcount/refcount.sty
INPUT /usr/share/texmf-dist/tex/latex/refcount/refcount.sty
INPUT /usr/share/texmf-dist/tex/generic/gettitlestring/gettitlestring.sty
INPUT /usr/share/texmf-dist/tex/generic/gettitlestring/gettitlestring.sty
INPUT /usr/share/texmf-dist/tex/latex/etoolbox/etoolbox.sty
INPUT /usr/share/texmf-dist/tex/latex/etoolbox/etoolbox.sty
INPUT /usr/share/texmf-dist/tex/generic/stringenc/stringenc.sty
INPUT /usr/share/texmf-dist/tex/generic/stringenc/stringenc.sty
INPUT /usr/share/texmf-dist/tex/latex/hyperref/pd1enc.def
INPUT /usr/share/texmf-dist/tex/latex/hyperref/pd1enc.def
INPUT /usr/share/texmf-dist/tex/latex/hyperref/pd1enc.def
INPUT /usr/share/texmf-dist/tex/generic/intcalc/intcalc.sty
INPUT /usr/share/texmf-dist/tex/generic/intcalc/intcalc.sty
INPUT /usr/share/texmf-dist/tex/latex/hyperref/puenc.def
INPUT /usr/share/texmf-dist/tex/latex/hyperref/puenc.def
INPUT /usr/share/texmf-dist/tex/latex/hyperref/puenc.def
INPUT /usr/share/texmf-dist/tex/latex/url/url.sty
INPUT /usr/share/texmf-dist/tex/latex/url/url.sty
INPUT /usr/share/texmf-dist/tex/generic/bitset/bitset.sty
INPUT /usr/share/texmf-dist/tex/generic/bitset/bitset.sty
INPUT /usr/share/texmf-dist/tex/generic/bigintcalc/bigintcalc.sty
INPUT /usr/share/texmf-dist/tex/generic/bigintcalc/bigintcalc.sty
INPUT /usr/share/texmf-dist/tex/latex/hyperref/hpdftex.def
INPUT /usr/share/texmf-dist/tex/latex/hyperref/hpdftex.def
INPUT /usr/share/texmf-dist/tex/latex/hyperref/hpdftex.def
INPUT /usr/share/texmf-dist/tex/latex/rerunfilecheck/rerunfilecheck.sty
INPUT /usr/share/texmf-dist/tex/latex/rerunfilecheck/rerunfilecheck.sty
INPUT /usr/share/texmf-dist/tex/generic/uniquecounter/uniquecounter.sty
INPUT /usr/share/texmf-dist/tex/generic/uniquecounter/uniquecounter.sty
INPUT /usr/share/texmf-dist/tex/latex/bookmark/bookmark.sty
INPUT /usr/share/texmf-dist/tex/latex/bookmark/bookmark.sty
INPUT /usr/share/texmf-dist/tex/latex/bookmark/bkm-pdftex.def
INPUT /usr/share/texmf-dist/tex/latex/bookmark/bkm-pdftex.def
INPUT /usr/share/texmf-dist/tex/latex/bookmark/bkm-pdftex.def
INPUT /usr/share/texmf-dist/tex/latex/listings/listings.sty
INPUT /usr/share/texmf-dist/tex/latex/listings/listings.sty
INPUT /usr/share/texmf-dist/tex/latex/listings/lstpatch.sty
INPUT /usr/share/texmf-dist/tex/latex/listings/lstpatch.sty
INPUT /usr/share/texmf-dist/tex/latex/listings/lstpatch.sty
INPUT /usr/share/texmf-dist/tex/latex/listings/lstmisc.sty
INPUT /usr/share/texmf-dist/tex/latex/listings/lstmisc.sty
INPUT /usr/share/texmf-dist/tex/latex/listings/lstmisc.sty
INPUT /usr/share/texmf-dist/tex/latex/listings/listings.cfg
INPUT /usr/share/texmf-dist/tex/latex/listings/listings.cfg
INPUT /usr/share/texmf-dist/tex/latex/listings/listings.cfg
INPUT /usr/share/texmf-dist/tex/generic/iftex/ifpdf.sty
INPUT /usr/share/texmf-dist/tex/generic/iftex/ifpdf.sty
INPUT /usr/share/texmf-dist/tex/latex/base/ifthen.sty
INPUT /usr/share/texmf-dist/tex/latex/base/ifthen.sty
INPUT /usr/share/texmf-dist/tex/latex/savesym/savesym.sty
INPUT /usr/share/texmf-dist/tex/latex/savesym/savesym.sty
INPUT /usr/share/texmf-dist/tex/latex/glossaries/base/glossaries.sty
INPUT /usr/share/texmf-dist/tex/latex/glossaries/base/glossaries.sty
INPUT /usr/share/texmf-dist/tex/latex/xkeyval/xkeyval.sty
INPUT /usr/share/texmf-dist/tex/latex/xkeyval/xkeyval.sty
INPUT /usr/share/texmf-dist/tex/generic/xkeyval/xkeyval.tex
INPUT /usr/share/texmf-dist/tex/generic/xkeyval/xkvutils.tex
INPUT /usr/share/texmf-dist/tex/latex/mfirstuc/mfirstuc.sty
INPUT /usr/share/texmf-dist/tex/latex/mfirstuc/mfirstuc.sty
INPUT /usr/share/texmf-dist/tex/latex/xfor/xfor.sty
INPUT /usr/share/texmf-dist/tex/latex/xfor/xfor.sty
INPUT /usr/share/texmf-dist/tex/latex/amsmath/amsgen.sty
INPUT /usr/share/texmf-dist/tex/latex/amsmath/amsgen.sty
INPUT /usr/share/texmf-dist/tex/latex/supertabular/supertabular.sty
INPUT /usr/share/texmf-dist/tex/latex/supertabular/supertabular.sty
INPUT /usr/share/texmf-dist/tex/latex/tracklang/tracklang.sty
INPUT /usr/share/texmf-dist/tex/latex/tracklang/tracklang.sty
INPUT /usr/share/texmf-dist/tex/generic/tracklang/tracklang.tex
INPUT /usr/share/texmf-dist/tex/generic/tracklang/tracklang.tex
INPUT /usr/share/texmf-dist/tex/generic/tracklang/tracklang.tex
INPUT /usr/share/texmf-dist/tex/generic/tracklang/tracklang.tex
INPUT /usr/share/texmf-dist/tex/generic/tracklang/tracklang.tex
INPUT /usr/share/texmf-dist/tex/latex/translator/translator.sty
INPUT /usr/share/texmf-dist/tex/latex/translator/translator.sty
INPUT /usr/share/texmf-dist/tex/latex/translator/translator.sty
INPUT /usr/share/texmf-dist/tex/latex/glossaries-english/glossaries-english.ldf
INPUT /usr/share/texmf-dist/tex/latex/glossaries-english/glossaries-english.ldf
INPUT /usr/share/texmf-dist/tex/latex/glossaries-english/glossaries-english.ldf
INPUT /usr/share/texmf-dist/tex/latex/datatool/datatool-base.sty
INPUT /usr/share/texmf-dist/tex/latex/datatool/datatool-base.sty
INPUT /usr/share/texmf-dist/tex/latex/amsmath/amsmath.sty
INPUT /usr/share/texmf-dist/tex/latex/amsmath/amsmath.sty
INPUT /usr/share/texmf-dist/tex/latex/amsmath/amsopn.sty
INPUT /usr/share/texmf-dist/tex/latex/amsmath/amstext.sty
INPUT /usr/share/texmf-dist/tex/latex/amsmath/amstext.sty
INPUT /usr/share/texmf-dist/tex/latex/amsmath/amsbsy.sty
INPUT /usr/share/texmf-dist/tex/latex/amsmath/amsbsy.sty
INPUT /usr/share/texmf-dist/tex/latex/amsmath/amsopn.sty
INPUT /usr/share/texmf-dist/tex/latex/datatool/datatool-l3fp.def
INPUT /usr/share/texmf-dist/tex/latex/datatool/datatool-l3fp.def
INPUT /usr/share/texmf-dist/tex/latex/datatool/datatool-l3fp.def
INPUT /usr/share/texmf-dist/tex/latex/datatool/datatool-utf8.ldf
INPUT /usr/share/texmf-dist/tex/latex/datatool/datatool-utf8.ldf
INPUT /usr/share/texmf-dist/tex/latex/datatool/datatool-utf8.ldf
INPUT /usr/share/texmf-dist/tex/latex/datatool-english/datatool-english.ldf
INPUT /usr/share/texmf-dist/tex/latex/datatool-english/datatool-english.ldf
INPUT /usr/share/texmf-dist/tex/latex/datatool-english/datatool-english.ldf
INPUT /usr/share/texmf-dist/tex/latex/datatool-english/datatool-english-utf8.ldf
INPUT /usr/share/texmf-dist/tex/latex/datatool-english/datatool-english-utf8.ldf
INPUT /usr/share/texmf-dist/tex/latex/datatool-english/datatool-english-utf8.ldf
INPUT /usr/share/texmf-dist/tex/latex/glossaries/styles/glossary-hypernav.sty
INPUT /usr/share/texmf-dist/tex/latex/glossaries/styles/glossary-hypernav.sty
INPUT /usr/share/texmf-dist/tex/latex/glossaries/styles/glossary-list.sty
INPUT /usr/share/texmf-dist/tex/latex/glossaries/styles/glossary-list.sty
INPUT /usr/share/texmf-dist/tex/latex/glossaries/styles/glossary-long.sty
INPUT /usr/share/texmf-dist/tex/latex/glossaries/styles/glossary-long.sty
INPUT /usr/share/texmf-dist/tex/latex/tools/longtable.sty
INPUT /usr/share/texmf-dist/tex/latex/tools/longtable.sty
INPUT /usr/share/texmf-dist/tex/latex/glossaries/styles/glossary-super.sty
INPUT /usr/share/texmf-dist/tex/latex/glossaries/styles/glossary-super.sty
INPUT /usr/share/texmf-dist/tex/latex/supertabular/supertabular.sty
INPUT /usr/share/texmf-dist/tex/latex/glossaries/styles/glossary-tree.sty
INPUT /usr/share/texmf-dist/tex/latex/glossaries/styles/glossary-tree.sty
INPUT /usr/share/texmf-dist/tex/latex/lm/lmodern.sty
INPUT /usr/share/texmf-dist/tex/latex/lm/lmodern.sty
INPUT /usr/share/texmf-dist/tex/latex/base/fontenc.sty
INPUT /usr/share/texmf-dist/tex/latex/base/fontenc.sty
INPUT /usr/share/texmf-dist/tex/latex/lm/t1lmr.fd
INPUT /usr/share/texmf-dist/tex/latex/lm/t1lmr.fd
INPUT /usr/share/texmf-dist/tex/latex/lm/t1lmr.fd
INPUT /usr/share/texmf-dist/fonts/tfm/public/lm/ec-lmr12.tfm
INPUT /usr/share/texmf-dist/tex/latex/graphics/graphicx.sty
INPUT /usr/share/texmf-dist/tex/latex/graphics/graphicx.sty
INPUT /usr/share/texmf-dist/tex/latex/graphics/graphics.sty
INPUT /usr/share/texmf-dist/tex/latex/graphics/graphics.sty
INPUT /usr/share/texmf-dist/tex/latex/graphics/trig.sty
INPUT /usr/share/texmf-dist/tex/latex/graphics/trig.sty
INPUT /usr/share/texmf-dist/tex/latex/graphics-cfg/graphics.cfg
INPUT /usr/share/texmf-dist/tex/latex/graphics-cfg/graphics.cfg
INPUT /usr/share/texmf-dist/tex/latex/graphics-cfg/graphics.cfg
INPUT /usr/share/texmf-dist/tex/latex/csquotes/csquotes.sty
INPUT /usr/share/texmf-dist/tex/latex/csquotes/csquotes.sty
INPUT /usr/share/texmf-dist/tex/latex/csquotes/csquotes.def
INPUT /usr/share/texmf-dist/tex/latex/csquotes/csquotes.def
INPUT /usr/share/texmf-dist/tex/latex/csquotes/csquotes.def
INPUT /usr/share/texmf-dist/tex/latex/csquotes/csquotes.cfg
INPUT /usr/share/texmf-dist/tex/latex/csquotes/csquotes.cfg
INPUT /usr/share/texmf-dist/tex/latex/csquotes/csquotes.cfg
OUTPUT kidiplom.glo
OUTPUT kidiplom.acn
OUTPUT kidiplom.idx
INPUT /usr/share/texmf-dist/tex/latex/base/makeidx.sty
INPUT /usr/share/texmf-dist/tex/latex/base/makeidx.sty
INPUT /usr/share/texmf-dist/tex/latex/tools/multicol.sty
INPUT /usr/share/texmf-dist/tex/latex/tools/multicol.sty
OUTPUT kidiplom.idx
INPUT /usr/share/texmf-dist/tex/latex/biblatex/biblatex.sty
INPUT /usr/share/texmf-dist/tex/latex/biblatex/biblatex.sty
INPUT /usr/share/texmf-dist/tex/latex/logreq/logreq.sty
INPUT /usr/share/texmf-dist/tex/latex/logreq/logreq.sty
INPUT /usr/share/texmf-dist/tex/latex/logreq/logreq.def
INPUT /usr/share/texmf-dist/tex/latex/logreq/logreq.def
INPUT /usr/share/texmf-dist/tex/latex/logreq/logreq.def
INPUT /usr/share/texmf-dist/tex/latex/biblatex/blx-dm.def
INPUT /usr/share/texmf-dist/tex/latex/biblatex/blx-dm.def
INPUT /usr/share/texmf-dist/tex/latex/biblatex/blx-dm.def
INPUT /usr/share/texmf-dist/tex/latex/biblatex-iso690/iso-numeric.dbx
INPUT /usr/share/texmf-dist/tex/latex/biblatex-iso690/iso-numeric.dbx
INPUT /usr/share/texmf-dist/tex/latex/biblatex-iso690/iso-numeric.dbx
INPUT /usr/share/texmf-dist/tex/latex/biblatex/blx-compat.def
INPUT /usr/share/texmf-dist/tex/latex/biblatex/blx-compat.def
INPUT /usr/share/texmf-dist/tex/latex/biblatex/blx-compat.def
INPUT /usr/share/texmf-dist/tex/latex/biblatex/biblatex.def
INPUT /usr/share/texmf-dist/tex/latex/biblatex/biblatex.def
INPUT /usr/share/texmf-dist/tex/latex/biblatex/biblatex.def
INPUT /usr/share/texmf-dist/tex/latex/biblatex/blx-natbib.def
INPUT /usr/share/texmf-dist/tex/latex/biblatex/blx-natbib.def
INPUT /usr/share/texmf-dist/tex/latex/biblatex/blx-natbib.def
INPUT ./iso-numeric.bbx
INPUT ./iso-numeric.bbx
INPUT iso-numeric.bbx
INPUT ./iso.bbx
INPUT ./iso.bbx
INPUT iso.bbx
INPUT ./iso-numeric.cbx
INPUT ./iso-numeric.cbx
INPUT iso-numeric.cbx
INPUT /usr/share/texmf-dist/tex/latex/biblatex/cbx/numeric.cbx
INPUT /usr/share/texmf-dist/tex/latex/biblatex/cbx/numeric.cbx
INPUT /usr/share/texmf-dist/tex/latex/biblatex/cbx/numeric.cbx
INPUT /usr/share/texmf-dist/tex/latex/biblatex/biblatex.cfg
INPUT /usr/share/texmf-dist/tex/latex/biblatex/biblatex.cfg
INPUT /usr/share/texmf-dist/tex/latex/biblatex/biblatex.cfg
INPUT /usr/share/texmf-dist/tex/latex/l3kernel/expl3.sty
INPUT /usr/share/texmf-dist/tex/latex/l3kernel/expl3.sty
INPUT /usr/share/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def
INPUT /usr/share/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def
INPUT /usr/share/texmf-dist/tex/latex/biblatex/blx-case-expl3.sty
INPUT /usr/share/texmf-dist/tex/latex/biblatex/blx-case-expl3.sty
INPUT /usr/share/texmf-dist/tex/latex/l3packages/xparse/xparse.sty
INPUT /usr/share/texmf-dist/tex/latex/l3packages/xparse/xparse.sty
INPUT /usr/share/texmf-dist/tex/latex/listings/lstlang1.sty
INPUT /usr/share/texmf-dist/tex/latex/listings/lstlang1.sty
INPUT /usr/share/texmf-dist/tex/latex/listings/lstlang1.sty
INPUT /usr/share/texmf-dist/tex/latex/listings/lstlang2.sty
INPUT /usr/share/texmf-dist/tex/latex/listings/lstlang2.sty
INPUT /usr/share/texmf-dist/tex/latex/listings/lstlang2.sty
INPUT /usr/share/texmf-dist/tex/latex/listings/lstlang3.sty
INPUT /usr/share/texmf-dist/tex/latex/listings/lstlang3.sty
INPUT /usr/share/texmf-dist/tex/latex/listings/lstlang3.sty
INPUT /usr/share/texmf-dist/tex/latex/listings/lstmisc.sty
INPUT /usr/share/texmf-dist/tex/latex/listings/lstmisc.sty
INPUT /usr/share/texmf-dist/tex/latex/listings/lstmisc.sty
INPUT /usr/share/texmf-dist/tex/latex/amscls/amsthm.sty
INPUT /usr/share/texmf-dist/tex/latex/amscls/amsthm.sty
INPUT /usr/share/texmf-dist/tex/latex/thmtools/thmtools.sty
INPUT /usr/share/texmf-dist/tex/latex/thmtools/thmtools.sty
INPUT /usr/share/texmf-dist/tex/latex/thmtools/thm-patch.sty
INPUT /usr/share/texmf-dist/tex/latex/thmtools/thm-patch.sty
INPUT /usr/share/texmf-dist/tex/latex/thmtools/parseargs.sty
INPUT /usr/share/texmf-dist/tex/latex/thmtools/parseargs.sty
INPUT /usr/share/texmf-dist/tex/latex/thmtools/thm-kv.sty
INPUT /usr/share/texmf-dist/tex/latex/thmtools/thm-kv.sty
INPUT /usr/share/texmf-dist/tex/latex/thmtools/thm-autoref.sty
INPUT /usr/share/texmf-dist/tex/latex/thmtools/thm-autoref.sty
INPUT /usr/share/texmf-dist/tex/latex/thmtools/aliasctr.sty
INPUT /usr/share/texmf-dist/tex/latex/thmtools/aliasctr.sty
INPUT /usr/share/texmf-dist/tex/latex/thmtools/thm-listof.sty
INPUT /usr/share/texmf-dist/tex/latex/thmtools/thm-listof.sty
INPUT /usr/share/texmf-dist/tex/latex/thmtools/thm-restate.sty
INPUT /usr/share/texmf-dist/tex/latex/thmtools/thm-restate.sty
INPUT /usr/share/texmf-dist/tex/latex/thmtools/thm-amsthm.sty
INPUT /usr/share/texmf-dist/tex/latex/thmtools/thm-amsthm.sty
INPUT /usr/share/texmf-dist/tex/latex/geometry/geometry.sty
INPUT /usr/share/texmf-dist/tex/latex/geometry/geometry.sty
INPUT /usr/share/texmf-dist/tex/generic/iftex/ifvtex.sty
INPUT /usr/share/texmf-dist/tex/generic/iftex/ifvtex.sty
INPUT /usr/share/texmf-dist/tex/latex/lastpage/lastpage.sty
INPUT /usr/share/texmf-dist/tex/latex/lastpage/lastpage.sty
INPUT /usr/share/texmf-dist/tex/latex/lastpage/lastpage2e.sty
INPUT /usr/share/texmf-dist/tex/latex/lastpage/lastpage2e.sty
INPUT /usr/share/texmf-dist/tex/latex/lastpage/lastpagemodern.sty
INPUT /usr/share/texmf-dist/tex/latex/lastpage/lastpagemodern.sty
INPUT /usr/share/texmf-dist/tex/latex/amsfonts/amssymb.sty
INPUT /usr/share/texmf-dist/tex/latex/amsfonts/amssymb.sty
INPUT /usr/share/texmf-dist/tex/latex/amsfonts/amsfonts.sty
INPUT /usr/share/texmf-dist/tex/latex/amsfonts/amsfonts.sty
INPUT /usr/share/texmf-dist/tex/latex/amsfonts/euscript.sty
INPUT /usr/share/texmf-dist/tex/latex/amsfonts/euscript.sty
INPUT /usr/share/texmf-dist/tex/latex/lipsum/lipsum.sty
INPUT /usr/share/texmf-dist/tex/latex/lipsum/lipsum.sty
INPUT /usr/share/texmf-dist/tex/latex/l3packages/l3keys2e/l3keys2e.sty
INPUT /usr/share/texmf-dist/tex/latex/l3packages/l3keys2e/l3keys2e.sty
INPUT /usr/share/texmf-dist/tex/latex/lipsum/lipsum.ltd.tex
INPUT /usr/share/texmf-dist/tex/latex/lipsum/lipsum.ltd.tex
INPUT /usr/share/texmf-dist/tex/latex/svg/svg.sty
INPUT /usr/share/texmf-dist/tex/latex/svg/svg.sty
INPUT /usr/share/texmf-dist/tex/latex/koma-script/scrbase.sty
INPUT /usr/share/texmf-dist/tex/latex/koma-script/scrbase.sty
INPUT /usr/share/texmf-dist/tex/latex/koma-script/scrlfile.sty
INPUT /usr/share/texmf-dist/tex/latex/koma-script/scrlfile.sty
INPUT /usr/share/texmf-dist/tex/latex/koma-script/scrlfile-hook.sty
INPUT /usr/share/texmf-dist/tex/latex/koma-script/scrlfile-hook.sty
INPUT /usr/share/texmf-dist/tex/latex/koma-script/scrlogo.sty
INPUT /usr/share/texmf-dist/tex/latex/koma-script/scrlogo.sty
INPUT /usr/share/texmf-dist/tex/latex/trimspaces/trimspaces.sty
INPUT /usr/share/texmf-dist/tex/latex/trimspaces/trimspaces.sty
INPUT /usr/share/texmf-dist/tex/latex/tools/shellesc.sty
INPUT /usr/share/texmf-dist/tex/latex/tools/shellesc.sty
INPUT /usr/share/texmf-dist/tex/latex/transparent/transparent.sty
INPUT /usr/share/texmf-dist/tex/latex/transparent/transparent.sty
INPUT /usr/share/texmf-dist/tex/latex/transparent/transparent-nometadata.sty
INPUT /usr/share/texmf-dist/tex/latex/transparent/transparent-nometadata.sty
INPUT /usr/share/texmf-dist/tex/latex/auxhook/auxhook.sty
INPUT /usr/share/texmf-dist/tex/latex/auxhook/auxhook.sty
INPUT /usr/share/texmf-dist/tex/latex/pgf/systemlayer/pgfsys.sty
INPUT /usr/share/texmf-dist/tex/latex/pgf/systemlayer/pgfsys.sty
INPUT /usr/share/texmf-dist/tex/latex/pgf/utilities/pgfrcs.sty
INPUT /usr/share/texmf-dist/tex/latex/pgf/utilities/pgfrcs.sty
INPUT /usr/share/texmf-dist/tex/generic/pgf/utilities/pgfutil-common.tex
INPUT /usr/share/texmf-dist/tex/generic/pgf/utilities/pgfutil-latex.def
INPUT /usr/share/texmf-dist/tex/generic/pgf/utilities/pgfrcs.code.tex
INPUT /usr/share/texmf-dist/tex/generic/pgf/utilities/pgfrcs.code.tex
INPUT /usr/share/texmf-dist/tex/generic/pgf/utilities/pgfrcs.code.tex
INPUT /usr/share/texmf-dist/tex/generic/pgf/pgf.revision.tex
INPUT /usr/share/texmf-dist/tex/generic/pgf/pgf.revision.tex
INPUT /usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsys.code.tex
INPUT /usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsys.code.tex
INPUT /usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsys.code.tex
INPUT /usr/share/texmf-dist/tex/generic/pgf/utilities/pgfkeys.code.tex
INPUT /usr/share/texmf-dist/tex/generic/pgf/utilities/pgfkeyslibraryfiltered.code.tex
INPUT /usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgf.cfg
INPUT /usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsys-pdftex.def
INPUT /usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsys-pdftex.def
INPUT /usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsys-common-pdf.def
INPUT /usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsyssoftpath.code.tex
INPUT /usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsyssoftpath.code.tex
INPUT /usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsyssoftpath.code.tex
INPUT /usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsysprotocol.code.tex
INPUT /usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsysprotocol.code.tex
INPUT /usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsysprotocol.code.tex
INPUT ./kidiplom.aux
INPUT ./kidiplom.aux
INPUT kidiplom.aux
OUTPUT kidiplom.aux
INPUT /usr/share/texmf-dist/tex/context/base/mkii/supp-pdf.mkii
INPUT /usr/share/texmf-dist/tex/context/base/mkii/supp-pdf.mkii
INPUT /usr/share/texmf-dist/tex/context/base/mkii/supp-pdf.mkii
INPUT /usr/share/texmf-dist/tex/latex/epstopdf-pkg/epstopdf-base.sty
INPUT /usr/share/texmf-dist/tex/latex/epstopdf-pkg/epstopdf-base.sty
INPUT /usr/share/texmf-dist/tex/latex/latexconfig/epstopdf-sys.cfg
INPUT /usr/share/texmf-dist/tex/latex/latexconfig/epstopdf-sys.cfg
INPUT /usr/share/texmf-dist/tex/latex/latexconfig/epstopdf-sys.cfg
OUTPUT kidiplom.pdf
INPUT ./kidiplom.glsdefs
INPUT ./kidiplom.glsdefs
INPUT kidiplom.glsdefs
INPUT ./czech-iso.lbx
INPUT ./czech-iso.lbx
INPUT czech-iso.lbx
INPUT ./czech.lbx
INPUT ./czech.lbx
INPUT czech.lbx
INPUT ./english-iso.lbx
INPUT ./english-iso.lbx
INPUT english-iso.lbx
INPUT /usr/share/texmf-dist/tex/latex/biblatex/lbx/english.lbx
INPUT /usr/share/texmf-dist/tex/latex/biblatex/lbx/english.lbx
INPUT /usr/share/texmf-dist/tex/latex/biblatex/lbx/english.lbx
INPUT ./czech.lbx
INPUT ./czech.lbx
INPUT czech.lbx
INPUT ./english-iso.lbx
INPUT ./english-iso.lbx
INPUT english-iso.lbx
INPUT /usr/share/texmf-dist/tex/latex/biblatex/lbx/english.lbx
INPUT /usr/share/texmf-dist/tex/latex/biblatex/lbx/english.lbx
INPUT /usr/share/texmf-dist/tex/latex/biblatex/lbx/english.lbx
INPUT ./english-iso.lbx
INPUT ./english-iso.lbx
INPUT english-iso.lbx
INPUT /usr/share/texmf-dist/tex/latex/biblatex/lbx/english.lbx
INPUT /usr/share/texmf-dist/tex/latex/biblatex/lbx/english.lbx
INPUT /usr/share/texmf-dist/tex/latex/biblatex/lbx/english.lbx
INPUT /usr/share/texmf-dist/tex/latex/biblatex/lbx/english.lbx
INPUT /usr/share/texmf-dist/tex/latex/biblatex/lbx/english.lbx
INPUT /usr/share/texmf-dist/tex/latex/biblatex/lbx/english.lbx
OUTPUT kidiplom.bcf
INPUT ./graphics/kititle-cz-nofont.pdf
INPUT ./graphics/kititle-cz-nofont.pdf
INPUT ./graphics/kititle-cz-nofont.pdf
INPUT ./graphics/kititle-cz-nofont.pdf
INPUT /usr/share/texmf-dist/fonts/tfm/public/lm/ec-lmr17.tfm
INPUT /usr/share/texmf-dist/fonts/tfm/public/lm/ec-lmbx12.tfm
INPUT /usr/share/texmf-dist/fonts/tfm/public/lm/ec-lmr17.tfm
INPUT /usr/share/texmf-dist/fonts/tfm/public/lm/ec-lmr12.tfm
INPUT ./graphics/UP_znak.pdf
INPUT ./graphics/UP_znak.pdf
INPUT ./graphics/UP_znak.pdf
INPUT ./graphics/UP_znak.pdf
INPUT /usr/share/texmf-dist/tex/latex/lm/ot1lmr.fd
INPUT /usr/share/texmf-dist/tex/latex/lm/ot1lmr.fd
INPUT /usr/share/texmf-dist/tex/latex/lm/ot1lmr.fd
INPUT /usr/share/texmf-dist/fonts/tfm/public/lm/rm-lmr12.tfm
INPUT /usr/share/texmf-dist/fonts/tfm/public/lm/rm-lmr8.tfm
INPUT /usr/share/texmf-dist/fonts/tfm/public/lm/rm-lmr6.tfm
INPUT /usr/share/texmf-dist/tex/latex/lm/omllmm.fd
INPUT /usr/share/texmf-dist/tex/latex/lm/omllmm.fd
INPUT /usr/share/texmf-dist/tex/latex/lm/omllmm.fd
INPUT /usr/share/texmf-dist/fonts/tfm/public/lm/lmmi12.tfm
INPUT /usr/share/texmf-dist/fonts/tfm/public/lm/lmmi8.tfm
INPUT /usr/share/texmf-dist/fonts/tfm/public/lm/lmmi6.tfm
INPUT /usr/share/texmf-dist/tex/latex/lm/omslmsy.fd
INPUT /usr/share/texmf-dist/tex/latex/lm/omslmsy.fd
INPUT /usr/share/texmf-dist/tex/latex/lm/omslmsy.fd
INPUT /usr/share/texmf-dist/fonts/tfm/public/lm/lmsy10.tfm
INPUT /usr/share/texmf-dist/fonts/tfm/public/lm/lmsy8.tfm
INPUT /usr/share/texmf-dist/fonts/tfm/public/lm/lmsy6.tfm
INPUT /usr/share/texmf-dist/tex/latex/lm/omxlmex.fd
INPUT /usr/share/texmf-dist/tex/latex/lm/omxlmex.fd
INPUT /usr/share/texmf-dist/tex/latex/lm/omxlmex.fd
INPUT /usr/share/texmf-dist/fonts/tfm/public/lm/lmex10.tfm
INPUT /usr/share/texmf-dist/tex/latex/amsfonts/umsa.fd
INPUT /usr/share/texmf-dist/tex/latex/amsfonts/umsa.fd
INPUT /usr/share/texmf-dist/tex/latex/amsfonts/umsa.fd
INPUT /usr/share/texmf-dist/fonts/tfm/public/amsfonts/symbols/msam10.tfm
INPUT /usr/share/texmf-dist/fonts/tfm/public/amsfonts/symbols/msam10.tfm
INPUT /usr/share/texmf-dist/fonts/tfm/public/amsfonts/symbols/msam7.tfm
INPUT /usr/share/texmf-dist/tex/latex/amsfonts/umsb.fd
INPUT /usr/share/texmf-dist/tex/latex/amsfonts/umsb.fd
INPUT /usr/share/texmf-dist/tex/latex/amsfonts/umsb.fd
INPUT /usr/share/texmf-dist/fonts/tfm/public/amsfonts/symbols/msbm10.tfm
INPUT /usr/share/texmf-dist/fonts/tfm/public/amsfonts/symbols/msbm10.tfm
INPUT /usr/share/texmf-dist/fonts/tfm/public/amsfonts/symbols/msbm7.tfm
INPUT /usr/share/texmf-dist/fonts/tfm/public/lm/ec-lmr10.tfm
OUTPUT kidiplom.ist
INPUT /var/lib/texmf/fonts/map/pdftex/updmap/pdftex.map
INPUT /usr/share/texmf-dist/fonts/enc/dvips/lm/lm-ec.enc
INPUT /usr/share/texmf-dist/fonts/tfm/public/lm/ec-lmbx10.tfm
INPUT /usr/share/texmf-dist/fonts/tfm/public/lm/rm-lmr10.tfm
INPUT /usr/share/texmf-dist/fonts/tfm/public/lm/lmmi10.tfm
INPUT /usr/share/texmf-dist/fonts/tfm/public/lm/lmsy10.tfm
INPUT /usr/share/texmf-dist/fonts/tfm/public/amsfonts/symbols/msam10.tfm
INPUT /usr/share/texmf-dist/fonts/tfm/public/amsfonts/symbols/msbm10.tfm
INPUT /usr/share/texmf-dist/fonts/tfm/public/lm/ec-lmbx12.tfm
INPUT /usr/share/texmf-dist/fonts/tfm/public/lm/ec-lmri12.tfm
INPUT /usr/share/texmf-dist/fonts/tfm/public/lm/ec-lmri8.tfm
INPUT /usr/share/texmf-dist/fonts/tfm/public/lm/ec-lmbx12.tfm
INPUT ./kidiplom.toc
INPUT ./kidiplom.toc
INPUT kidiplom.toc
INPUT /usr/share/texmf-dist/fonts/tfm/public/lm/ec-lmcsc10.tfm
INPUT /usr/share/texmf-dist/fonts/tfm/public/lm/ec-lmr8.tfm
OUTPUT kidiplom.toc
INPUT ./kidiplom.lot
INPUT ./kidiplom.lot
INPUT kidiplom.lot
OUTPUT kidiplom.lot
INPUT /usr/share/texmf-dist/fonts/tfm/public/lm/ec-lmbx12.tfm
INPUT ./graphics/network01.pdf
INPUT ./graphics/network01.pdf
INPUT ./graphics/network01.pdf
INPUT ./graphics/network01.pdf
INPUT ./graphics/TcpIp.png
INPUT ./graphics/TcpIp.png
INPUT ./graphics/TcpIp.png
INPUT ./graphics/TcpIp.png
INPUT /usr/share/texmf-dist/fonts/enc/dvips/lm/lm-mathit.enc
INPUT /usr/share/texmf-dist/fonts/tfm/public/lm/ec-lmr10.tfm
INPUT /usr/share/texmf-dist/tex/latex/psnfss/t1pcr.fd
INPUT /usr/share/texmf-dist/tex/latex/psnfss/t1pcr.fd
INPUT /usr/share/texmf-dist/tex/latex/psnfss/t1pcr.fd
INPUT /usr/share/texmf-dist/fonts/tfm/adobe/courier/pcrr8t.tfm
INPUT /usr/share/texmf-dist/fonts/tfm/adobe/courier/pcrr8t.tfm
INPUT /usr/share/texmf-dist/fonts/tfm/adobe/courier/pcrb8t.tfm
INPUT /usr/share/texmf-dist/fonts/tfm/adobe/courier/pcrr8t.tfm
INPUT /usr/share/texmf-dist/fonts/vf/adobe/courier/pcrr8t.vf
INPUT /usr/share/texmf-dist/fonts/tfm/adobe/courier/pcrr8r.tfm
INPUT /usr/share/texmf-dist/fonts/enc/dvips/base/8r.enc
INPUT /usr/share/texmf-dist/fonts/vf/adobe/courier/pcrr8t.vf
INPUT /usr/share/texmf-dist/fonts/tfm/adobe/courier/pcrr8r.tfm
INPUT /usr/share/texmf-dist/fonts/vf/adobe/courier/pcrb8t.vf
INPUT /usr/share/texmf-dist/fonts/tfm/adobe/courier/pcrb8r.tfm
INPUT /usr/share/texmf-dist/fonts/enc/dvips/lm/lm-mathsy.enc
INPUT /usr/share/texmf-dist/fonts/enc/dvips/lm/lm-rm.enc
INPUT /usr/share/texmf-dist/fonts/vf/adobe/courier/pcrr8t.vf
INPUT /usr/share/texmf-dist/fonts/tfm/adobe/courier/pcrr8r.tfm
INPUT /usr/share/texmf-dist/fonts/tfm/adobe/courier/pcrb8t.tfm
INPUT /usr/share/texmf-dist/fonts/vf/adobe/courier/pcrb8t.vf
INPUT /usr/share/texmf-dist/fonts/tfm/adobe/courier/pcrb8r.tfm
INPUT ./graphics/latencycomparison.pdf
INPUT ./graphics/latencycomparison.pdf
INPUT ./graphics/latencycomparison.pdf
INPUT ./graphics/latencycomparison.pdf
INPUT ./graphics/latencycomparison.pdf
INPUT ./graphics/integrationcomparison.pdf
INPUT ./graphics/integrationcomparison.pdf
INPUT ./graphics/integrationcomparison.pdf
INPUT ./graphics/integrationcomparison.pdf
INPUT ./graphics/integrationcomparison.pdf
INPUT ./graphics/playerbenchmark.png
INPUT ./graphics/playerbenchmark.png
INPUT ./graphics/playerbenchmark.png
INPUT ./graphics/playerbenchmark.png
INPUT ./graphics/playerbenchmark.png
INPUT ./graphics/300playerstrace.png
INPUT ./graphics/300playerstrace.png
INPUT ./graphics/300playerstrace.png
INPUT ./graphics/300playerstrace.png
INPUT ./graphics/300playerstrace.png
INPUT ./graphics/ecs_optimization_tracy_01.png
INPUT ./graphics/ecs_optimization_tracy_01.png
INPUT ./graphics/ecs_optimization_tracy_01.png
INPUT ./graphics/ecs_optimization_tracy_01.png
INPUT ./graphics/ecs_optimization_tracy_01.png
INPUT ./graphics/ecs_optimization_tracy_02.png
INPUT ./graphics/ecs_optimization_tracy_02.png
INPUT ./graphics/ecs_optimization_tracy_02.png
INPUT ./graphics/ecs_optimization_tracy_02.png
INPUT ./graphics/ecs_optimization_tracy_02.png
INPUT /usr/share/texmf-dist/tex/latex/lm/ts1lmr.fd
INPUT /usr/share/texmf-dist/tex/latex/lm/ts1lmr.fd
INPUT /usr/share/texmf-dist/tex/latex/lm/ts1lmr.fd
INPUT /usr/share/texmf-dist/fonts/tfm/public/lm/ts1-lmr12.tfm
INPUT /usr/share/texmf-dist/tex/latex/listings/lstlang1.sty
INPUT /usr/share/texmf-dist/tex/latex/listings/lstlang1.sty
INPUT /usr/share/texmf-dist/tex/latex/listings/lstlang1.sty
INPUT /usr/share/texmf-dist/tex/latex/listings/lstlang2.sty
INPUT /usr/share/texmf-dist/tex/latex/listings/lstlang2.sty
INPUT /usr/share/texmf-dist/tex/latex/listings/lstlang2.sty
INPUT /usr/share/texmf-dist/tex/latex/listings/lstlang3.sty
INPUT /usr/share/texmf-dist/tex/latex/listings/lstlang3.sty
INPUT /usr/share/texmf-dist/tex/latex/listings/lstlang3.sty
INPUT /usr/share/texmf-dist/tex/latex/listings/lstlang1.sty
INPUT /usr/share/texmf-dist/tex/latex/listings/lstlang1.sty
INPUT /usr/share/texmf-dist/tex/latex/listings/lstlang1.sty
INPUT /usr/share/texmf-dist/tex/latex/listings/lstlang2.sty
INPUT /usr/share/texmf-dist/tex/latex/listings/lstlang2.sty
INPUT /usr/share/texmf-dist/tex/latex/listings/lstlang2.sty
INPUT /usr/share/texmf-dist/tex/latex/listings/lstlang3.sty
INPUT /usr/share/texmf-dist/tex/latex/listings/lstlang3.sty
INPUT /usr/share/texmf-dist/tex/latex/listings/lstlang3.sty
INPUT /usr/share/texmf-dist/tex/latex/listings/lstmisc.sty
INPUT /usr/share/texmf-dist/tex/latex/listings/lstmisc.sty
INPUT /usr/share/texmf-dist/tex/latex/listings/lstmisc.sty
INPUT /usr/share/texmf-dist/fonts/enc/dvips/lm/lm-ts1.enc
INPUT /usr/share/texmf-dist/fonts/enc/dvips/lm/lm-mathex.enc
INPUT /usr/share/texmf-dist/fonts/tfm/public/lm/ec-lmbx8.tfm
INPUT /usr/share/texmf-dist/fonts/tfm/public/lm/ec-lmbx10.tfm
OUTPUT kidiplom.glsdefs
INPUT ./kidiplom.ind
INPUT ./kidiplom.ind
INPUT kidiplom.ind
INPUT kidiplom.aux
INPUT kidiplom.run.xml
OUTPUT kidiplom.run.xml
INPUT /usr/share/texmf-dist/fonts/type1/public/lm/lmbx10.pfb
INPUT /usr/share/texmf-dist/fonts/type1/public/lm/lmbx12.pfb
INPUT /usr/share/texmf-dist/fonts/type1/public/lm/lmbx8.pfb
INPUT /usr/share/texmf-dist/fonts/type1/public/lm/lmcsc10.pfb
INPUT /usr/share/texmf-dist/fonts/type1/public/lm/lmex10.pfb
INPUT /usr/share/texmf-dist/fonts/type1/public/lm/lmmi12.pfb
INPUT /usr/share/texmf-dist/fonts/type1/public/lm/lmmi8.pfb
INPUT /usr/share/texmf-dist/fonts/type1/public/lm/lmr10.pfb
INPUT /usr/share/texmf-dist/fonts/type1/public/lm/lmr12.pfb
INPUT /usr/share/texmf-dist/fonts/type1/public/lm/lmr17.pfb
INPUT /usr/share/texmf-dist/fonts/type1/public/lm/lmr8.pfb
INPUT /usr/share/texmf-dist/fonts/type1/public/lm/lmri12.pfb
INPUT /usr/share/texmf-dist/fonts/type1/public/lm/lmri8.pfb
INPUT /usr/share/texmf-dist/fonts/type1/public/lm/lmsy10.pfb
INPUT /usr/share/texmf-dist/fonts/type1/public/lm/lmsy8.pfb
INPUT /usr/share/texmf-dist/fonts/type1/public/amsfonts/symbols/msam10.pfb
INPUT /usr/share/texmf-dist/fonts/type1/urw/courier/ucrb8a.pfb
INPUT /usr/share/texmf-dist/fonts/type1/urw/courier/ucrr8a.pfb
+1 -1
View File
@@ -1 +1 @@
\indexentry{výraz|hyperxindexformat{\hypertarget{1ind.ind}}}{42}
\indexentry{výraz|hyperxindexformat{\hypertarget{1ind.ind}}}{45}
+6
View File
@@ -0,0 +1,6 @@
This is makeindex, version 2.18 [TeX Live 2026] (kpathsea + Thai support).
Scanning input file kidiplom.idx....done (1 entries accepted, 0 rejected).
Sorting entries...done (0 comparisons).
Generating output file kidiplom.ind....done (5 lines written, 0 warnings).
Output written in kidiplom.ind.
Transcript written in kidiplom.ilg.
+5
View File
@@ -0,0 +1,5 @@
\begin{theindex}
\item výraz, \hyperxindexformat{\hypertarget{1ind.ind}}{45}
\end{theindex}
+1 -1
View File
@@ -1,5 +1,5 @@
% makeindex style file created by the glossaries package
% for document 'kidiplom' on 2026-4-8
% for document 'kidiplom' on 2026-4-21
actual '?'
encap '|'
level '!'
+286 -173
View File
@@ -1,9 +1,9 @@
This is pdfTeX, Version 3.141592653-2.6-1.40.29 (TeX Live 2026/Arch Linux) (preloaded format=pdflatex 2026.3.13) 8 APR 2026 10:03
This is pdfTeX, Version 3.141592653-2.6-1.40.29 (TeX Live 2026/Arch Linux) (preloaded format=pdflatex 2026.4.9) 21 APR 2026 11:31
entering extended mode
restricted \write18 enabled.
%&-line parsing enabled.
**kidiplom.tex
(./kidiplom.tex
**/home/martin/projects/kidiplom/kidiplom.tex
(/home/martin/projects/kidiplom/kidiplom.tex
LaTeX2e <2025-11-01>
L3 programming layer <2026-01-19>
(./kidiplom.cls
@@ -1148,6 +1148,112 @@ Package: lipsum 2021-09-20 v2.7 150 paragraphs of Lorem Ipsum dummy text
\l__lipsum_b_int=\count508
(/usr/share/texmf-dist/tex/latex/lipsum/lipsum.ltd.tex))
(/usr/share/texmf-dist/tex/latex/svg/svg.sty
Package: svg 2020/11/26 v2.02k (include SVG pictures)
(/usr/share/texmf-dist/tex/latex/koma-script/scrbase.sty
Package: scrbase 2026/02/02 v3.49.2 KOMA-Script package (KOMA-Script-independen
t basics and keyval usage)
(/usr/share/texmf-dist/tex/latex/koma-script/scrlfile.sty
Package: scrlfile 2026/02/02 v3.49.2 KOMA-Script package (file load hooks)
(/usr/share/texmf-dist/tex/latex/koma-script/scrlfile-hook.sty
Package: scrlfile-hook 2026/02/02 v3.49.2 KOMA-Script package (using LaTeX hook
s)
(/usr/share/texmf-dist/tex/latex/koma-script/scrlogo.sty
Package: scrlogo 2026/02/02 v3.49.2 KOMA-Script package (logo)
)))
Applying: [2021/05/01] Usage of raw or classic option list on input line 254.
Already applied: [0000/00/00] Usage of raw or classic option list on input line
370.
)
(/usr/share/texmf-dist/tex/latex/trimspaces/trimspaces.sty
Package: trimspaces 2009/09/17 v1.1 Trim spaces around a token list
)
(/usr/share/texmf-dist/tex/latex/tools/shellesc.sty
Package: shellesc 2023/07/08 v1.0d unified shell escape interface for LaTeX
Package shellesc Info: Restricted shell escape enabled on input line 77.
)
\c@svg@param@lastpage=\count509
\svg@box=\box112
\c@svg@param@currpage=\count510
)
(/usr/share/texmf-dist/tex/latex/transparent/transparent.sty
Package: transparent 2025-06-23 v1.6 Transparency with color stacks
(/usr/share/texmf-dist/tex/latex/transparent/transparent-nometadata.sty
Package: transparent-nometadata 2025-06-23 v1.6 Transparency via pdfTeX's color
stack (HO)
(/usr/share/texmf-dist/tex/latex/auxhook/auxhook.sty
Package: auxhook 2019-12-17 v1.6 Hooks for auxiliary files (HO)
)))
(/usr/share/texmf-dist/tex/latex/pgf/systemlayer/pgfsys.sty
(/usr/share/texmf-dist/tex/latex/pgf/utilities/pgfrcs.sty
(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfutil-common.tex
\pgfutil@everybye=\toks51
\pgfutil@tempdima=\dimen268
\pgfutil@tempdimb=\dimen269
)
(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfutil-latex.def
\pgfutil@abb=\box113
)
(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfrcs.code.tex
(/usr/share/texmf-dist/tex/generic/pgf/pgf.revision.tex)
Package: pgfrcs 2025-08-29 v3.1.11a (3.1.11a)
))
(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsys.code.tex
Package: pgfsys 2025-08-29 v3.1.11a (3.1.11a)
(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfkeys.code.tex
\pgfkeys@pathtoks=\toks52
\pgfkeys@temptoks=\toks53
(/usr/share/texmf-dist/tex/generic/pgf/utilities/pgfkeyslibraryfiltered.code.te
x
\pgfkeys@tmptoks=\toks54
))
\pgf@x=\dimen270
\pgf@y=\dimen271
\pgf@xa=\dimen272
\pgf@ya=\dimen273
\pgf@xb=\dimen274
\pgf@yb=\dimen275
\pgf@xc=\dimen276
\pgf@yc=\dimen277
\pgf@xd=\dimen278
\pgf@yd=\dimen279
\w@pgf@writea=\write9
\r@pgf@reada=\read4
\c@pgf@counta=\count511
\c@pgf@countb=\count512
\c@pgf@countc=\count513
\c@pgf@countd=\count514
\t@pgf@toka=\toks55
\t@pgf@tokb=\toks56
\t@pgf@tokc=\toks57
\pgf@sys@id@count=\count515
(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgf.cfg
File: pgf.cfg 2025-08-29 v3.1.11a (3.1.11a)
)
Driver file for pgf: pgfsys-pdftex.def
(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsys-pdftex.def
File: pgfsys-pdftex.def 2025-08-29 v3.1.11a (3.1.11a)
(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsys-common-pdf.def
File: pgfsys-common-pdf.def 2025-08-29 v3.1.11a (3.1.11a)
)))
(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsyssoftpath.code.tex
File: pgfsyssoftpath.code.tex 2025-08-29 v3.1.11a (3.1.11a)
\pgfsyssoftpath@smallbuffer@items=\count516
\pgfsyssoftpath@bigbuffer@items=\count517
)
(/usr/share/texmf-dist/tex/generic/pgf/systemlayer/pgfsysprotocol.code.tex
File: pgfsysprotocol.code.tex 2025-08-29 v3.1.11a (3.1.11a)
))
Package csquotes Info: Checking for multilingual support...
Package csquotes Info: ... found 'babel' package.
Package csquotes Info: Enabling multilingual quotes.
@@ -1160,11 +1266,11 @@ Package biblatex Warning: Attempt to redefine deprecated '\mkbibnamelast'.
Package biblatex Warning: Conflicting options.
(biblatex) 'urldate=iso' requires 'seconds=true'.
(biblatex) Setting 'seconds=true' on input line 144.
(biblatex) Setting 'seconds=true' on input line 145.
(./kidiplom.aux
Package babel Info: 'czech' activates 'czech' shorthands.
(babel) Reported on input line 21.
(babel) Reported on input line 22.
LaTeX Warning: Label `tab:prepinace' multiply defined.
@@ -1172,37 +1278,37 @@ LaTeX Warning: Label `tab:prepinace' multiply defined.
)
\openout1 = `kidiplom.aux'.
LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 144.
LaTeX Font Info: ... okay on input line 144.
LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 144.
LaTeX Font Info: ... okay on input line 144.
LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 144.
LaTeX Font Info: ... okay on input line 144.
LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 144.
LaTeX Font Info: ... okay on input line 144.
LaTeX Font Info: Checking defaults for TS1/cmr/m/n on input line 144.
LaTeX Font Info: ... okay on input line 144.
LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 144.
LaTeX Font Info: ... okay on input line 144.
LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 144.
LaTeX Font Info: ... okay on input line 144.
LaTeX Font Info: Checking defaults for PD1/pdf/m/n on input line 144.
LaTeX Font Info: ... okay on input line 144.
LaTeX Font Info: Checking defaults for PU/pdf/m/n on input line 144.
LaTeX Font Info: ... okay on input line 144.
LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 145.
LaTeX Font Info: ... okay on input line 145.
LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 145.
LaTeX Font Info: ... okay on input line 145.
LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 145.
LaTeX Font Info: ... okay on input line 145.
LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 145.
LaTeX Font Info: ... okay on input line 145.
LaTeX Font Info: Checking defaults for TS1/cmr/m/n on input line 145.
LaTeX Font Info: ... okay on input line 145.
LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 145.
LaTeX Font Info: ... okay on input line 145.
LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 145.
LaTeX Font Info: ... okay on input line 145.
LaTeX Font Info: Checking defaults for PD1/pdf/m/n on input line 145.
LaTeX Font Info: ... okay on input line 145.
LaTeX Font Info: Checking defaults for PU/pdf/m/n on input line 145.
LaTeX Font Info: ... okay on input line 145.
(/usr/share/texmf-dist/tex/context/base/mkii/supp-pdf.mkii
[Loading MPS to PDF converter (version 2006.09.02).]
\scratchcounter=\count509
\scratchdimen=\dimen268
\scratchbox=\box112
\nofMPsegments=\count510
\nofMParguments=\count511
\everyMPshowfont=\toks51
\MPscratchCnt=\count512
\MPscratchDim=\dimen269
\MPnumerator=\count513
\makeMPintoPDFobject=\count514
\everyMPtoPDFconversion=\toks52
\scratchcounter=\count518
\scratchdimen=\dimen280
\scratchbox=\box114
\nofMPsegments=\count519
\nofMParguments=\count520
\everyMPshowfont=\toks58
\MPscratchCnt=\count521
\MPscratchDim=\dimen281
\MPnumerator=\count522
\makeMPintoPDFobject=\count523
\everyMPtoPDFconversion=\toks59
) (/usr/share/texmf-dist/tex/latex/epstopdf-pkg/epstopdf-base.sty
Package: epstopdf-base 2020-01-24 v2.11 Base part for package epstopdf
Package epstopdf-base Info: Redefining graphics rule for `.eps' on input line 4
@@ -1212,8 +1318,8 @@ Package epstopdf-base Info: Redefining graphics rule for `.eps' on input line 4
File: epstopdf-sys.cfg 2010/07/13 v1.3 Configuration of (r)epstopdf for TeX Liv
e
))
Package hyperref Info: Link coloring ON on input line 144.
\c@lstlisting=\count515
Package hyperref Info: Link coloring ON on input line 145.
\c@lstlisting=\count524
(./kidiplom.glsdefs)
Package biblatex Info: Trying to load language 'czech' -> 'czech-iso'...
@@ -1268,11 +1374,11 @@ Package biblatex Info: Data encoding 'utf8' specified.
\openout8 = `kidiplom.bcf'.
Package biblatex Info: Trying to load bibliographic data...
Package biblatex Info: ... file 'kidiplom.bbl' found.
(./kidiplom.bbl)
Package biblatex Info: Reference section=0 on input line 144.
Package biblatex Info: Reference segment=0 on input line 144.
Package biblatex Info: ... file 'kidiplom.bbl' not found.
No file kidiplom.bbl.
Package biblatex Info: Reference section=0 on input line 145.
Package biblatex Info: Reference segment=0 on input line 145.
*geometry* detected driver: pdftex
*geometry* verbose mode - [ preamble ] result:
* driver: pdftex
@@ -1306,65 +1412,58 @@ Package biblatex Info: Reference segment=0 on input line 144.
* \@reversemarginfalse
* (1in=72.27pt=25.4mm, 1cm=28.453pt)
<graphics/kititle-cz-nofont.pdf, id=4, 375.4025pt x 72.27pt>
<graphics/kititle-cz-nofont.pdf, id=7, 375.4025pt x 72.27pt>
File: graphics/kititle-cz-nofont.pdf Graphic file (type pdf)
<use graphics/kititle-cz-nofont.pdf>
Package pdftex.def Info: graphics/kititle-cz-nofont.pdf used on input line 149
Package pdftex.def Info: graphics/kititle-cz-nofont.pdf used on input line 150
.
(pdftex.def) Requested size: 225.24323pt x 43.36232pt.
<graphics/UP_znak.pdf, id=8, 101.59215pt x 101.59215pt>
File: graphics/UP_znak.pdf Graphic file (type pdf)
<use graphics/UP_znak.pdf>
Package pdftex.def Info: graphics/UP_znak.pdf used on input line 150.
(pdftex.def) Requested size: 101.59187pt x 101.59187pt.
LaTeX Font Info: Trying to load font information for OT1+lmr on input line 1
49.
50.
(/usr/share/texmf-dist/tex/latex/lm/ot1lmr.fd
File: ot1lmr.fd 2015/05/01 v1.6.1 Font defs for Latin Modern
)
LaTeX Font Info: Trying to load font information for OML+lmm on input line 1
49.
50.
(/usr/share/texmf-dist/tex/latex/lm/omllmm.fd
File: omllmm.fd 2015/05/01 v1.6.1 Font defs for Latin Modern
)
LaTeX Font Info: Trying to load font information for OMS+lmsy on input line
149.
150.
(/usr/share/texmf-dist/tex/latex/lm/omslmsy.fd
File: omslmsy.fd 2015/05/01 v1.6.1 Font defs for Latin Modern
)
LaTeX Font Info: Trying to load font information for OMX+lmex on input line
149.
150.
(/usr/share/texmf-dist/tex/latex/lm/omxlmex.fd
File: omxlmex.fd 2015/05/01 v1.6.1 Font defs for Latin Modern
)
LaTeX Font Info: External font `lmex10' loaded for size
(Font) <14.4> on input line 149.
(Font) <12> on input line 150.
LaTeX Font Info: External font `lmex10' loaded for size
(Font) <10> on input line 149.
(Font) <8> on input line 150.
LaTeX Font Info: External font `lmex10' loaded for size
(Font) <7> on input line 149.
LaTeX Font Info: Trying to load font information for U+msa on input line 149
(Font) <6> on input line 150.
LaTeX Font Info: Trying to load font information for U+msa on input line 150
.
(/usr/share/texmf-dist/tex/latex/amsfonts/umsa.fd
File: umsa.fd 2013/01/14 v3.01 AMS symbols A
)
LaTeX Font Info: Trying to load font information for U+msb on input line 149
LaTeX Font Info: Trying to load font information for U+msb on input line 150
.
(/usr/share/texmf-dist/tex/latex/amsfonts/umsb.fd
File: umsb.fd 2013/01/14 v3.01 AMS symbols B
)
<graphics/UP_znak.pdf, id=5, 101.59215pt x 101.59215pt>
File: graphics/UP_znak.pdf Graphic file (type pdf)
<use graphics/UP_znak.pdf>
Package pdftex.def Info: graphics/UP_znak.pdf used on input line 149.
(pdftex.def) Requested size: 101.59187pt x 101.59187pt.
LaTeX Font Info: External font `lmex10' loaded for size
(Font) <12> on input line 149.
LaTeX Font Info: External font `lmex10' loaded for size
(Font) <8> on input line 149.
LaTeX Font Info: External font `lmex10' loaded for size
(Font) <6> on input line 149.
[1
) [1
\openout3 = `kidiplom.ist'.
@@ -1372,7 +1471,7 @@ LaTeX Font Info: External font `lmex10' loaded for size
/enc/dvips/lm/lm-ec.enc} <./graphics/kititle-cz-nofont.pdf> <./graphics/UP_znak
.pdf>]
LaTeX Font Info: External font `lmex10' loaded for size
(Font) <10.95> on input line 149.
(Font) <10.95> on input line 150.
[2] [3
] [4
@@ -1381,113 +1480,132 @@ LaTeX Font Info: External font `lmex10' loaded for size
(./kidiplom.toc [5
] [6])
\tf@toc=\write9
\openout9 = `kidiplom.toc'.
\tf@toc=\write10
\openout10 = `kidiplom.toc'.
[7] (./kidiplom.lot)
\tf@lot=\write10
\openout10 = `kidiplom.lot'.
\tf@lot=\write11
\openout11 = `kidiplom.lot'.
[8
] [9
]
Package hyperref Info: bookmark level for unknown definition defaults to 0 on i
nput line 170.
[10]
<graphics/TcpIp.png, id=264, 805.0075pt x 512.91624pt>
<graphics/network01.pdf, id=264, 377.49028pt x 233.9139pt>
File: graphics/network01.pdf Graphic file (type pdf)
<use graphics/network01.pdf>
Package pdftex.def Info: graphics/network01.pdf used on input line 202.
(pdftex.def) Requested size: 204.7506pt x 126.87555pt.
[10] [11 <./graphics/network01.pdf>]
<graphics/TcpIp.png, id=285, 805.0075pt x 512.91624pt>
File: graphics/TcpIp.png Graphic file (type png)
<use graphics/TcpIp.png>
Package pdftex.def Info: graphics/TcpIp.png used on input line 221.
Package pdftex.def Info: graphics/TcpIp.png used on input line 266.
(pdftex.def) Requested size: 409.50119pt x 260.91075pt.
[11{/usr/share/texmf-dist/fonts/enc/dvips/lm/lm-mathit.enc}] [12 <./graphics/T
cpIp.png>] [13]
[14] [15] [16] (/usr/share/texmf-dist/tex/latex/listings/lstlang1.sty
File: lstlang1.sty 2025/11/14 1.11b listings language file
)
LaTeX Font Info: Trying to load font information for T1+pcr on input line 33
0.
(/usr/share/texmf-dist/tex/latex/psnfss/t1pcr.fd
File: t1pcr.fd 2001/06/04 font definitions for T1/pcr.
) [17{/usr/share/texmf-dist/fonts/enc/dvips/base/8r.enc}]
Package hyperref Info: bookmark level for unknown lstlisting defaults to 0 on i
nput line 336.
[18] [19]
Overfull \hbox (15.3443pt too wide) in paragraph at lines 393--394
[12{/usr/share/texmf-dist/fonts/enc/dvips/lm/lm-mathit.enc}]
[13 <./graphics/TcpIp.png>] [14] [15] [16]
Overfull \hbox (15.3443pt too wide) in paragraph at lines 376--377
\T1/lmr/m/n/12 P°i po-u-ºití knihovny Ze-roMQ vy-tvá-°íme ob-jekt `ctx = zmq_co
ntext(num_threads)`.
[]
Overfull \hbox (4.16487pt too wide) in paragraph at lines 403--404
Overfull \hbox (4.16487pt too wide) in paragraph at lines 386--387
\T1/lmr/m/n/12 Populární im-ple-men-tací, kte-rou vi-díme na-p°í-klad v Rust ne
bo C#, je async/await.
[]
[20] [21]
Overfull \hbox (4.1038pt too wide) in paragraph at lines 451--452
\T1/lmr/m/n/12 Pro m¥-°ení vý-konu pro-gramu ser-veru po-u-ºí-vám vý-borný pro-
fi-ler Tracy. Je zdarma,
[]
[22] [23]
Overfull \hbox (3.57536pt too wide) in paragraph at lines 509--510
\T1/lmr/m/n/12 necraft pro Win-dows. Nej-prve vy-tvo-°íme re-gistr, coº je ob-j
ekt typu `entt::registry`,
[]
[24] [25] [26]
Overfull \hbox (46.2356pt too wide) in paragraph at lines 581--582
[17] [18] [19] [20]
Package hyperref Info: bookmark level for unknown lstlisting defaults to 0 on i
nput line 493.
LaTeX Font Info: Trying to load font information for T1+pcr on input line 49
3.
(/usr/share/texmf-dist/tex/latex/psnfss/t1pcr.fd
File: t1pcr.fd 2001/06/04 font definitions for T1/pcr.
) [21{/usr/share/texmf-dist/fonts/enc/dvips/base/8r.enc}] [22] [23] [24] [25]
Overfull \hbox (46.2356pt too wide) in paragraph at lines 620--621
\T1/lmr/m/n/12 kdo se práv¥ p°i-po-jil a kdo od-po-jil. T°ída na to má dv¥ me-t
ody: [][][]
[]
[27] [28{/usr/share/texmf-dist/fonts/enc/dvips/lm/lm-mathsy.enc}{/usr/share/tex
[26] [27{/usr/share/texmf-dist/fonts/enc/dvips/lm/lm-mathsy.enc}{/usr/share/tex
mf-dist/fonts/enc/dvips/lm/lm-rm.enc}]
Overfull \hbox (782.2338pt too wide) in alignment at lines 647--656
Overfull \hbox (4.1038pt too wide) in paragraph at lines 695--696
\T1/lmr/m/n/12 Pro m¥-°ení vý-konu pro-gramu ser-veru po-u-ºí-vám vý-borný pro-
fi-ler Tracy. Je zdarma,
[]
[28] [29]
Overfull \hbox (782.2338pt too wide) in alignment at lines 727--736
[] [] []
[]
[29] [30] [31]
Overfull \hbox (2.99237pt too wide) in paragraph at lines 722--723
[30] [31]
Overfull \hbox (2.99237pt too wide) in paragraph at lines 809--810
\T1/lmr/m/n/12 do pro-to-kolu za-tím ne-p°i-dá-vali, pro-toºe si stejn¥ do pa-k
etu uklá-dáme £íslo snímku,
[]
[32]
<graphics/latencycomparison.pdf, id=392, 462.52798pt x 346.89601pt>
[32] [33]
<graphics/latencycomparison.pdf, id=416, 462.52798pt x 346.89601pt>
File: graphics/latencycomparison.pdf Graphic file (type pdf)
<use graphics/latencycomparison.pdf>
Package pdftex.def Info: graphics/latencycomparison.pdf used on input line 743
Package pdftex.def Info: graphics/latencycomparison.pdf used on input line 834
.
(pdftex.def) Requested size: 327.60219pt x 245.71564pt.
<graphics/integrationcomparison.pdf, id=393, 462.52798pt x 346.89601pt>
<graphics/integrationcomparison.pdf, id=417, 462.52798pt x 346.89601pt>
File: graphics/integrationcomparison.pdf Graphic file (type pdf)
<use graphics/integrationcomparison.pdf>
Package pdftex.def Info: graphics/integrationcomparison.pdf used on input line
749.
(pdftex.def) Requested size: 409.50119pt x 307.14322pt.
<graphics/playerbenchmark.png, id=396, 1926.19624pt x 1221.56375pt>
842.
(pdftex.def) Requested size: 327.60219pt x 245.71564pt.
<graphics/playerbenchmark.png, id=420, 1926.19624pt x 1221.56375pt>
File: graphics/playerbenchmark.png Graphic file (type png)
<use graphics/playerbenchmark.png>
Package pdftex.def Info: graphics/playerbenchmark.png used on input line 761.
Package pdftex.def Info: graphics/playerbenchmark.png used on input line 854.
(pdftex.def) Requested size: 204.7506pt x 129.84302pt.
<graphics/OutboundArchitecture.png, id=397, 6697.02pt x 2376.88pt>
File: graphics/OutboundArchitecture.png Graphic file (type png)
<use graphics/OutboundArchitecture.png>
Package pdftex.def Info: graphics/OutboundArchitecture.png used on input line
774.
(pdftex.def) Requested size: 409.50119pt x 145.32677pt.
[33 <./graphics/latencycomparison.pdf>] [34 <./graphics/integrationcomparison.
pdf> <./graphics/playerbenchmark.png>] [35 <./graphics/OutboundArchitecture.png
>]
LaTeX Font Info: Trying to load font information for TS1+lmr on input line 8
36.
[34 <./graphics/latencycomparison.pdf>] [35 <./graphics/integrationcomparison.
pdf> <./graphics/playerbenchmark.png>]
<graphics/300playerstrace.png, id=508, 1348.03625pt x 397.485pt>
File: graphics/300playerstrace.png Graphic file (type png)
<use graphics/300playerstrace.png>
Package pdftex.def Info: graphics/300playerstrace.png used on input line 866.
(pdftex.def) Requested size: 409.50119pt x 120.74449pt.
<graphics/ecs_optimization_tracy_01.png, id=510, 1707.37875pt x 472.76625pt>
File: graphics/ecs_optimization_tracy_01.png Graphic file (type png)
<use graphics/ecs_optimization_tracy_01.png>
Package pdftex.def Info: graphics/ecs_optimization_tracy_01.png used on input
line 877.
(pdftex.def) Requested size: 409.50119pt x 113.38686pt.
<graphics/ecs_optimization_tracy_02.png, id=511, 1196.47pt x 583.17876pt>
File: graphics/ecs_optimization_tracy_02.png Graphic file (type png)
<use graphics/ecs_optimization_tracy_02.png>
Package pdftex.def Info: graphics/ecs_optimization_tracy_02.png used on input
line 884.
(pdftex.def) Requested size: 409.50119pt x 199.59514pt.
[36 <./graphics/300playerstrace.png> <./graphics/ecs_optimization_tracy_01.png
>] [37 <./graphics/ecs_optimization_tracy_02.png>]
Underfull \hbox (badness 10000) in paragraph at lines 923--923
[]|\T1/lmr/m/n/12 Název
[]
Underfull \hbox (badness 10000) in paragraph at lines 927--927
[]|\T1/lmr/m/n/12 Fixní
[]
Underfull \hbox (badness 10000) in paragraph at lines 929--929
[]|\T1/lmr/m/n/12 Hashovací
[]
[38] [39]
LaTeX Font Info: Trying to load font information for TS1+lmr on input line 9
95.
(/usr/share/texmf-dist/tex/latex/lm/ts1lmr.fd
File: ts1lmr.fd 2015/05/01 v1.6.1 Font defs for Latin Modern
) [36{/usr/share/texmf-dist/fonts/enc/dvips/lm/lm-ts1.enc}]
)
(/usr/share/texmf-dist/tex/latex/listings/lstlang1.sty
File: lstlang1.sty 2025/11/14 1.11b listings language file
)
@@ -1508,70 +1626,73 @@ File: lstlang3.sty 2025/11/14 1.11b listings language file
)
(/usr/share/texmf-dist/tex/latex/listings/lstmisc.sty
File: lstmisc.sty 2025/11/14 1.11b (Carsten Heinz)
)
Overfull \hbox (11.6933pt too wide) in alignment at lines 881--943
) [40{/usr/share/texmf-dist/fonts/enc/dvips/lm/lm-ts1.enc}]
Overfull \hbox (11.6933pt too wide) in alignment at lines 1040--1102
[] [] []
[]
ignored: Infinite glue shrinkage found in box being split [37]
ignored: Infinite glue shrinkage fo
und in box being split [38]
ignored: Infinite glue shrinkage found in box being split [41]
Overfull \vbox (0.47247pt too high) has occurred while \output is active []
[39] [40{/usr/share/texmf-dist/fonts/enc/dvips/lm/lm-mathex.enc}]
Overfull \hbox (12.74097pt too wide) in paragraph at lines 995--996
[42] [43{/usr/share/texmf-dist/fonts/enc/dvips/lm/lm-mathex.enc}]
Overfull \hbox (12.74097pt too wide) in paragraph at lines 1154--1155
\T1/lmr/m/n/12 Pro sazbu li-te-ra-tury má uºi-va-tel dv¥ moº-nosti. M·ºe po-u-º
ít slu-ºeb ba-lík· \T1/lmr/m/sc/12 Bib\T1/lmr/m/n/12 L[]T[]X,
[]
LaTeX Font Warning: Font shape `T1/lmr/bx/sc' undefined
(Font) using `T1/lmr/bx/n' instead on input line 996.
(Font) using `T1/lmr/bx/n' instead on input line 1155.
Overfull \hbox (33.70378pt too wide) in paragraph at lines 1013--1014
Overfull \hbox (33.70378pt too wide) in paragraph at lines 1172--1173
[][][][][][][][][][][]\T1/lmr/m/n/12 . Na da-nou zkratku se pak lze od-ka-zo-va
t jed-no-du²e, [].
[]
[41]
[44]
Package lipsum Warning: Unknown language 'latin'. Hyphenation patterns for
(lipsum) 'czech' will be used instead.
\@gls@deffile=\write11
\openout11 = `kidiplom.glsdefs'.
\@gls@deffile=\write12
\openout12 = `kidiplom.glsdefs'.
Package hyperref Info: bookmark level for unknown definition defaults to 0 on i
nput line 1221.
Package hyperref Info: bookmark level for unknown proof defaults to 0 on input
line 1066.
[42] [43]
line 1225.
[45] [46]
Package hyperref Info: bookmark level for unknown remark defaults to 0 on input
line 1070.
line 1229.
Package hyperref Info: bookmark level for unknown example defaults to 0 on inpu
t line 1074.
t line 1233.
Package hyperref Info: bookmark level for unknown lemma defaults to 0 on input
line 1078.
line 1237.
Package hyperref Info: bookmark level for unknown consequence defaults to 0 on
input line 1082.
input line 1241.
Package hyperref Info: bookmark level for unknown theorem defaults to 0 on inpu
t line 1086.
[44] [45] [46
t line 1245.
[47] [48] [49
] [47
] [50
] [48
] [51
] [49]
] [52]
No file kidiplom.acr.
[50
[53
]
LaTeX Warning: Empty bibliography on input line 1215.
LaTeX Warning: Empty bibliography on input line 1374.
No file kidiplom.ind.
(./kidiplom.ind [54
])
enddocument/afterlastpage (AED): lastpage setting LastPage.
(./kidiplom.aux)
@@ -1599,25 +1720,17 @@ Package logreq Info: Writing requests to 'kidiplom.run.xml'.
)
Here is how much of TeX's memory you used:
31791 strings out of 469481
588463 string characters out of 5469630
1700795 words of memory out of 5000000
59687 multiletter control sequences out of 15000+600000
713119 words of font info for 105 fonts, out of 8000000 for 9000
33856 strings out of 469481
636341 string characters out of 5469631
1770024 words of memory out of 5000000
61664 multiletter control sequences out of 15000+600000
701070 words of font info for 90 fonts, out of 8000000 for 9000
24 hyphenation exceptions out of 8191
110i,12n,125p,2606b,2308s stack positions out of 10000i,1000n,20000p,200000b,200000s
pdfTeX warning (dest): name{section*.8} has been referenced but does not exist,
replaced by a fixed one
110i,11n,125p,2637b,2312s stack positions out of 10000i,1000n,20000p,200000b,200000s
pdfTeX warning (dest): name{glo:UPOL} has been referenced but does not exist, r
eplaced by a fixed one
pdfTeX warning (dest): name{1ind.ind} has been referenced but does not exist, r
eplaced by a fixed one
</usr/share/texmf-dist/fonts/type1/public/lm/lmbx10.pfb></usr/share/texmf-dist/
fonts/type1/public/lm/lmbx12.pfb></usr/share/texmf-dist/fonts/type1/public/lm/l
mbx8.pfb></usr/share/texmf-dist/fonts/type1/public/lm/lmcsc10.pfb></usr/share/t
@@ -1631,10 +1744,10 @@ lmri8.pfb></usr/share/texmf-dist/fonts/type1/public/lm/lmsy10.pfb></usr/share/t
exmf-dist/fonts/type1/public/lm/lmsy8.pfb></usr/share/texmf-dist/fonts/type1/pu
blic/amsfonts/symbols/msam10.pfb></usr/share/texmf-dist/fonts/type1/urw/courier
/ucrb8a.pfb></usr/share/texmf-dist/fonts/type1/urw/courier/ucrr8a.pfb>
Output written on kidiplom.pdf (50 pages, 789781 bytes).
Output written on kidiplom.pdf (54 pages, 822926 bytes).
PDF statistics:
1073 PDF objects out of 1200 (max. 8388607)
899 compressed objects within 9 object streams
254 named destinations out of 1000 (max. 500000)
804 words of extra memory for PDF output out of 10000 (max. 10000000)
1132 PDF objects out of 1200 (max. 8388607)
946 compressed objects within 10 object streams
263 named destinations out of 1000 (max. 500000)
847 words of extra memory for PDF output out of 10000 (max. 10000000)
+3 -3
View File
@@ -1,7 +1,7 @@
\babel@toc {czech}{}\relax
\contentsline {table}{\numberline {1}{Rozhraní třídy QuicrEndpoint}}{29}{table.1}%
\contentsline {table}{\numberline {2}{Seznam přepínačů}}{37}{table.2}%
\contentsline {table}{\numberline {3}{\ignorespaces Odstavce v tabulkách}}{43}{table.3}%
\contentsline {table}{\numberline {1}{Rozhraní třídy QuicrEndpoint}}{30}{table.1}%
\contentsline {table}{\numberline {2}{Seznam přepínačů}}{41}{table.2}%
\contentsline {table}{\numberline {3}{\ignorespaces Odstavce v tabulkách}}{46}{table.3}%
\babel@toc {czech}{}\relax
\babel@toc {czech}{}\relax
\babel@toc {english}{}\relax
BIN
View File
Binary file not shown.
Binary file not shown.
+486 -327
View File
@@ -55,7 +55,7 @@
%% nesází (u theorems a sourcecodes výchozí)
\documentclass[
% master,
master,
% program=ainfvs,
% printversion,
biblatex,
@@ -69,8 +69,8 @@
index
]{kidiplom}
\title{Hra}
\title[english]{A style for thesis}
%\title{Hra}
%\title[english]{A style for thesis}
@@ -82,13 +82,13 @@
%% použitím makra s uvedením jazyka jako nepovinného parametru.
%% Název práce, česky a anglicky. Měl by se vysázet na jeden řádek.
\title{Styl pro text závěrečné práce}
\title[english]{A style for thesis}
\title{Metody optimalizace přenosu dat v distribuovaném systému}
\title[english]{Methods of data transfer optimizations in distributed systems}
%% Volitelný podnázev práce, česky a anglicky. Měl by se vysázet na
%% jeden řádek. Výchozí je prázdný.
\subtitle{Ukázkový text a dokumentace stylu v \LaTeX{}u}
\subtitle[english]{Sample text and documentation of the \LaTeX{} style}
%% \subtitle{Ukázkový text a dokumentace stylu v \LaTeX{}u}
%% \subtitle[english]{Sample text and documentation of the \LaTeX{} style}
%% Jméno autora práce. Makro nemá nepovinný parametr pro uvedení
%% jazyka.
@@ -140,6 +140,7 @@
%% práce.
\usepackage{lipsum}
\usepackage{longtable}
\usepackage{svg}
\begin{document}
%% Sazba úvodních stran -- titulní, s bibliografickými údaji, s
@@ -159,107 +160,163 @@
\section{Úvod}
V práci se budeme zabývat technikami a způsoby pro optimalizaci datového přenosu, ať už pro šířku pásma nebo odezvu.
\newpage
\section{Distribuované systémy}
V této kapitole si představíme problematiku distribuovaných systémů a princip jejich fungovaní. Distribuované systémy jsou takové, které svůj úkol plní pomocí více počítačů, propojených v jedné síti. Příkladem takové sítě je Internet, která je největší a skládá se z mnoha podsítí. Výhoda oproti paralelním systémům je spolehlivost a škálovatelnost.
% Chtěl bych začít síťovými systémy jako takovými. Udělat rozdělení na centralizované a distribuované. V síťovém systému běží služby, kde každá je implementována jako kolekce procesů a zdrojů rozprostřených na více počítačů.
\begin{definition}[Počítačová síť]
Skupina komunikujících počítačů, které komunikují s ostatními v síti pomocí komunikačních protokolů, se nazývá počítačová síť.
\end{definition}
Počítačový systém se skládá ze služeb, každá implementována jako kolekce procesů. Pokud jsou počítače propojeny v síti a procesy systémů jsou rozprostřeny přes více komunikujících počítačů, dostaneme \uv{síťový systém}. Ty mohou mít různé topologie podle toho, jak v systému komunikují. Příkladem takového systému je World Wide Web, který poskytuje dokumenty podle adresy \uv{URL}, tedy Unique Resource Location.
Počítačovou síť si lze představit jako graf, kde vrcholy jsou jednotlivé počítače a hrana je přímé spojení mezi dvěma počítači, jako třeba měděný kabel nebo optické vlákno. Každý počítač v síti, neboli vrchol, má síťovou adresu, jeden nebo více procesů a vlastní paměť, kterou mezi sebou nemohou počítače sdílet. Namísto sdílené paměti musejí vrcholy komunikovat pomocí zpráv.
Distribuovaný systém se snaží skrýt svou distribuovanost pomocí \uv{middleware}. Ten slouží jako vrstva mezi síťí a problémy s ní spjaté a samotnou aplikací. Představíme dva přístupy: Message Oriented Middleware (MOM) a Remote Procedure Call (RPC).
\begin{definition}[Distribuovaný systém]
Systém je \uv{distribuovaný}, když svůj úkol plní pomocí více počítačů, které jsou propojené v síti a mohou tak spolu komunikovat.
\end{definition}
RPC je přirozenější přístup, který umožňuje zavolat proceduru lokálně, která se zabalí do zprávy a odešle na jiný počítač. Ten zprávu přečte a podle instrukcí začne vykonávat. Výsledek pak odešle zpět jako zprávu. Odesílatel tedy implementačně nemusí vědět, že se vykonala na jiném počítači. Problémem tohoto přístupu je jednak to, že strana která odesílá zprávu musí znát adresu druhé strany. Druhá nevýhoda je, že obě strany musí běžet současně.
Podobné jsou paralelní systémy, které také řeší společný problém více procesy, které běží souběžně. Rozdíl je ten, že v distribuovaném systému má každý proces vlastní paměť, kterou mezi sebou počítače nemohou sdílet. Procesy mezi sebou musejí komunikovat posíláním zpráv.
Druhým přístupem je posílání zpráv. V tomto přístupu aplikace posílají zprávy na čistě logický cíl. Např. identifikovaný typem zprávy. Aplikace pak může projevit zájem o různé typy zpráv a middleware se postará o to, že tyto zprávy aplikace dostane. Přístupu se říká \uv{publish-subscribe}.
\subsection{Počítačové sítě}
% Různé typy sítí jako LAN a WAN
Nedílnou součástí distribuovaného systému je síť, přes kterou je schopný komunikovat. Počítačová síť je skupina propojených počítačů, které si mezi sebou přenášejí data. Například lokální sítě (LAN) propojují až tisíce počítačů, které jsou geograficky blízko, například v rámci jedné budovy. Rozsáhlé sítě (WAN) propojují miliony různých zařízení po celém světě. Příkladem je síť Internet. Můžeme díky ní snadno posílat zprávy z jednoho kontinentu na druhý. Kvůli této rozmanitosti musí síť podporovat různá přenosová média, jako měděný kabel pro rychlé ale krátké vzdálenosti, nebo bezdrátové připojení pomocí satelitu pro pomalejší, ale na delší vzdálenost apod.
% Lze si představit jako graf - vrcholy a hrany
Počítačovou síť si lze představit jako graf, ve kterém počítače představují vrcholy a fyzická média mezi nimi jsou hrany. Vrcholy dále dělíme na \uv{koncové body} a \uv{propojovací prvky}. Koncové body jsou počítače, mobilní telefony a jiná zařízení, na kterých běží procesy. Dva procesy na dvou různých počítačích si mezi sebou mohou posílat zprávy. Propojovací prvky jsou přepínače, rozbočovače a opakovače. Ty naopak slouží pouze k směřování zpráv po síti. Využití je propojení skupiny počítačů do sítě přes jedno spojení jako vidíme na obrázku \ref{fig:network01}. Propojovací body jsou E a D. Není potřeba připojovat každý počítač s každým.
\begin{figure}
\begin{center}
\includegraphics[width=0.5\textwidth]{graphics/network01}
\end{center}
\caption{Příklad využití propojovacích bodů}
\label{fig:network01}
\end{figure}
Dva počítače, přímo propojené fyzickým médiem, komunikují posíláním n-tic bytů zvané \uv{rámce}. Variantou jsou \uv{přepínané} sítě, které nemusejí mít mezi všemi dvojicemi počítačů přímé spojení, ale využívají \uv{přepínače}. Proces, kdy doručujeme zprávu na cílový počítač přes vícero přepínačů se nazývá \uv{směrování}. K tomu je třeba, aby každé zařízení mělo přiřazenou unikátní adresu a posílali se formátované rámce zvané \uv{pakety}. Ty se skládají z hlavičky, ve které najdeme informace ke směřovaní, a tělu obsahujícím samotnou přenášenou zprávu.
Do přepínače můžeme připojovat počítače. Na obrázku TODO vidíme, jak tato topologie vypadá, říká se jí hvězda. Tato skupina propojených zařízení přes přepínače tvoří síť. Dva počítače v ní mezi sebou nemusejí mít přímé spojení, protože si pakety posílají přes přepínač, který ho nasměruje na správný počítač. Tato skupina počítačů propojených přepínačem tvoří síť. Můžeme propojovat i přepínače a vytvořit tak síť sítí. Bežným příkladem je Internet, největší síť sítí na světě.
% Jednotka pro přenos v síti je \uv{rámec}. Ta ale slouží jen mezi dvě počítači spojenými přímo. Rámec jako takový neobsahuje nic konkrétního, a to ani ke směřování. Představme si to jako obálku, na které není nic, ani adresa. Jediná naše možnost je hodit jej do cílové schránky přímo. Nelze využít služby pošty, která by anonymní obálku doručila.
% Pro využití služeb pošty musíme splňovat jejich protokol, tedy soubor pravidel pro komunikaci. Jedno z nich je právě to, že na obálku musíme napsat adresu. Zároveň musí být v konkrétním formátu. Představíme protějšek pro komunikaci v síti, tzv. Internetový protokol. Definuje, že prvních $n$ bytů je tzv. hlavička a zbytek je . Prvky pro směřování se podívají pouze na hlavičku a zbytek rámce neřeší. Podle adresy odešle nový rámec se stejným obsahem tam, kam patří. Takovému rámci se říká IP \uv{paket}.
% V analogii s poštou je každý dům protějškem počítače v síti a adresa je jeho síťová adresa. Mezi domy můžeme posílat dopisy. Představme si poštu, jako komunikační protokol. Pokud ji chceme využít, musíme na obálku správně napsat adresu. Nemůžeme ji napsat dovnitř nebo kamkoliv jinam. Stejně tak musíme do IP paketu vložit hlavičku, kterou si propojovací prvek přečte a nasměruje.
% Pokud se dům nachází v jiném státě, dopis necestuje přímo, ale přes různé prostředníky, například depa, kde se třídí podle cílové destinace. Takto funguje přepínač. Pokud má na cílový počítač přímé spojení, odešle rámec rovnou tam. Jinak zvolí další propojovací body, které mohou být cílovému počítači o něco blíž. Propojovací prvek může být satelit nebo router.
% Distribuované systémy jsou takové, které svůj úkol plní pomocí více počítačů, propojených v jedné síti. Příkladem takové sítě je Internet, která je největší a skládá se z mnoha podsítí. Výhoda oproti paralelním systémům je spolehlivost a škálovatelnost.
% Počítačovou síť si lze představit jako graf, kde vrcholy jsou jednotlivé počítače a hrana je přímé spojení mezi dvěma počítači, jako třeba měděný kabel nebo optické vlákno. Každý počítač v síti, neboli vrchol, má síťovou adresu, jeden nebo více procesů a vlastní paměť, kterou mezi sebou nemohou počítače sdílet. Namísto sdílené paměti musejí vrcholy komunikovat pomocí zpráv.
%\begin{definition}[Distribuovaný systém]
%Systém je \uv{distribuovaný}, když svůj úkol plní pomocí více počítačů, které jsou propojené v síti a mohou tak spolu komunikovat.
%\end{definition}
%Podobné jsou paralelní systémy, které také řeší společný problém více procesy, které běží souběžně. Rozdíl je ten, že v distribuovaném systému má každý proces vlastní paměť, kterou mezi sebou počítače nemohou sdílet. Procesy mezi sebou musejí komunikovat posíláním zpráv.
\subsection{Komunikace v síti}
V síti počítače komunikují pomocí komunikačního protokolu, kterému musejí rozumět. Komunikační protokol je soubor pravidel pro výměnu informací mezi počítači. Mají často různé charakteristiky, např. jestli jsou vyžadují navázání spojení nebo ne. To chápejme jako domluvu mezi dvěma stranami před tím, než začne přenos aplikačních dat pro systém.
V této části představíme jak probíhá komunikace v síti. Aby si dva počítače navzájem rozuměly, používají tzv. \uv{komunikační protokol}: soubor pravidel pro výměnu informací mezi počítači. Definují syntaxi, sémantiku a synchronizaci zpráv. Mají různé charakteristiky, např. jestli potřebují navázat spojení, které obě strany odsouhlasí, aby mohla začít komunikace mezi procesy. Další vlastností je způsob řešení spolehlivosti doručení rámců.
Nejčastěji se strany domlouvají na tajném klíči pro symetrické šifrování zpráv mezi sebou tak, aby nemohli být odposlouchávány. Dále si mohou vyměnit informace o verzi protokolu a omezeních, jako rychlost přenosu apod. Opakem jsou protokoly bez připojení. V takovém protokolu může na počítač A přijít zpráva z počítače B, o kterém A nemuselo nikdy předtím slyšet. Protokol pak může mít definované různé chování pro tento případ.
Nejčastěji se strany domlouvají na tajném klíči pro symetrické šifrování zpráv mezi sebou tak, aby nemohli být odposlouchávány. Dále si mohou vyměnit informace o verzi protokolu a omezeních, jako rychlost přenosu apod. Pokud protokol nevyžaduje navázání spojení, může přes něj na proces přijít zpráva z libovolného počítače bez předešlého souhlasu. Protokol často definuje, co se má v takových situacích stát.
\begin{definition}[Komunikační protokol]
Soubor pravidel pro výměnu informací mezi počítači se nazývá \uv{komunikační protokol}.
\end{definition}
% komunikaci rozdělujeme na Message Oriented Middleware a Remote Procedure Call.
\subsection{Rodina protokolů TCP/IP}
Představíme rodinu protokolů pro komunikaci v síti Internet, která se nazývá TCP/IP. Jedná se o celou soustavu protokolů, které fungují ruku v ruce jako vrstvy. Název se skládá ze dvou důležitých protokolů: IP (Internet Protocol) a TCP (Transmission Control Protocol). IP slouží pro směrování paketů a TCP pro řízení přenosu. IP umožňuje komunikaci libovolných dvou uzlů počítačů v propojených sítích. TCP zajišťuje spolehlivý obousměrný přenos dat mezi procesy na dvou počítačích (ne nutně různých).
\subsection{TCP/IP}
Rodina protokolů pro komunikaci v síti Internet se nazývá TCP/IP. Název se skládá ze dvou nejdůležitějších protokolů: IP, neboli Internet Protocol a TCP (Transmission Control Protocol) - protokol pro řízení přenosu. IP umožňuje komunikaci libovolných dvou uzlů počítačů v propojených sítích. TCP zajišťuje spolehlivý obousměrný přenos dat mezi procesy na dvou počítačích (ne nutně různých).
Síťová komunikace je rozdělena do několika vrstev, každá s jinou zodpovědností. Jednotlivé vrstvy pak mezi sebou komunikují, podobně jako vidíme na obrázku . Konkrétně architektura TCP/IP je rozdělena do čtyř vrstev: aplikační, transportní, síťová a síťové rozhraní. Každá vrstva obsahuje vlastní protokoly, které lze měnit podle toho, co je třeba.
Rodina je tvořena vrstvami. Vrstva čte a zapisuje do vrstvy pod ní. Konkrétně architektura TCP/IP je rozdělena do čtyř vrstev: aplikační, transportní, síťová a síťové rozhraní. Každá vrstva obsahuje množinu protokolů a pro každou situaci lze sestavit ideální čtveřice. Vrstvy podrobněji představíme.
\begin{description}
\item[{Síťové rozhraní}] \hfill \\
Nejnižší vrstva, která se stará o přenos přes fyzické médium. Pro různé sítě bude vyžadovat různé protokoly. Příkladem jsou Ethernet, Token ring, apod.
\item[{Síťová}] \hfill \\
Pro adresaci máme vrstvu síťovou. Ta směruje a předává jednotlivé datagramy. Příkladem protokolů jsou IP, ARP, RARP nebo IPSEC. Je nutné, aby stejně jako vrstva síťového rozhraní, byla implementována ve všech prvcích sítě.
\item[{Aplikační}] \hfill \\
Nejvyšší je \uv{aplikační} vrstva, ve které jsou aplikace. Příkladem protokolů jsou HTTP nebo gRPC, které spadají do kategorie tzv. \uv{middleware}. To znamená, že protokol není nutně specifický pro konkrétní aplikaci. Narozdíl od protokolu pro hru World of Warcraft nebo STMP.
\item[{Transportní}] \hfill \\
Předposlední vrstva je transportní. Tato vrstva je rozbalena až na koncových bodech, nikoliv po cestě. Není totiž důležitá pro směrování packetů. Stará se o to, jaké packety přišli, jestli nejsou poškozené a nebo jestli jsou všechny. Příkladem je TCP, UDP nebo QUIC.
Druhá vrstva je \uv{transportní}. Tato vrstva je rozbalena až na koncových bodech, jak vidíme na obrázku \ref{fig:tcpip}, nikoliv po cestě. Není totiž důležitá pro směrování packetů. Stará se o to, jaké packety přišli, v jakém pořadí a jestli nejsou poškozené. Příkladem protokolů jsou TCP, UDP nebo QUIC.
\item[{Aplikační}] \hfill \\
Poslední vrstva je aplikační a v ní jsou právě aplikace. Příkladem protokolů jsou HTTP nebo gRPC, které spadají do kategorie tzv. middleware. To znamená, že protokol není nutně specifický pro konkrétní aplikaci.
\item[{Síťová}] \hfill \\
Pro adresaci máme vrstvu síťovou. Ta směruje a předává jednotlivé datagramy. Příkladem protokolů jsou IP, ARP, RARP nebo IPSEC. Je nutné, aby stejně jako vrstva síťového rozhraní, byla implementována ve všech vrcholech na cestě mezi dvěma počítači, které chtějí v internetu komunikovat.
\item[{Síťové rozhraní}] \hfill \\
Nejnižší vrstva, která se stará o přenos přes fyzické médium. Pro různé média bude vyžadovat různé protokoly. Příkladem jsou Ethernet, Token ring, apod.
\end{description}
V práci se zaměříme na rodinu protokolů TCP/IP, která na síťové vrstvě využívá Internet protokol a na transportní TCP nebo UDP. Na obrázku TODO vidíme, jak mezi sebou jednotlivé vrstvy komunikují. Aplikace na počítači $A$ odešle zprávu, kterou počítač $D$ uvidí ve své instanci aplikace. Vrstva zná pouze vrstvu pod sebou. Plnou čarou vidíme datový tok zprávy, jak putuje přes jednotlivé vrstvy. Šrafovaná čára reprezentuje abstrahovaný datový tok, tak jak ho vidí jednotlivé vrstvy, které neřeší vrstvu pod nimi. Počítače B a C jsou tzv. redistribuční body. Všimněme si, že se vůbec nedostanou do transportní nebo aplikační vrstvy, pouze si rozbalí IP paket a zjistí, kam mají pakety posílat dál. Vrstva síťového rozhraní pracuje s různými médii, jak také vidíme na obrázku. ř
Na obrázku \ref{fig:tcpip} vidíme, jak mezi sebou jednotlivé vrstvy komunikují. Aplikace na počítači $A$ odešle zprávu, kterou počítač $D$ uvidí ve své instanci aplikace. Vrstva zná pouze vrstvu pod sebou. Plnou čarou vidíme datový tok zprávy, jak putuje přes jednotlivé vrstvy. Šrafovaná čára reprezentuje abstrahovaný datový tok tak, jak ho vidí vrstva. Počítače B a C jsou propojovací body. Všimněme si, že se nepoužívají transportní nebo aplikační vrstvy, pouze si rozbalí IP paket a zjistí, kam mají pakety posílat dál. Vrstva síťového rozhraní pracuje s různými médii, jak také vidíme na obrázku.
\begin{figure}
\begin{center}
\includegraphics[width=1\textwidth]{graphics/TcpIp}
\end{center}
\caption{Komunikace vrstev TCP/IP}
\label{fig:tcpip}
\end{figure}
Vrstvy jsou modelované pomocí hlaviček. Poslaný paket obsahuje hlavičku pro každou vrstvu. Nejnižší (linková) vrstva, např. s Ethernet protokolem, přenáší \uv{rámce}. Síťová vrstva s Internet protokolem přenáší IP pakety a hlavička obsahuje IP adresu odesílatele, příjemce a další informace potřebné k nasměrování rámce. TCP protokol přenáší \uv{segmenty} a UDP \uv{datagramy}.
% Vrstvy jsou modelované pomocí hlaviček. Poslaný paket obsahuje hlavičku pro každou vrstvu. Nejnižší (linková) vrstva, např. s Ethernet protokolem, přenáší \uv{rámce}. Síťová vrstva s Internet protokolem přenáší IP pakety a hlavička obsahuje IP adresu odesílatele, příjemce a další informace potřebné k nasměrování rámce. TCP protokol přenáší \uv{segmenty} a UDP \uv{datagramy}.
% Zaměřím se na tzv. rodinou protokolů TCP/IP která definuje, jak má probíhat komunikace v síti Internet, na kterou bych se v práci chtěl zaměřit. Síť internet je celosvětová síť sítí, na které najdeme webové stránky, souborová úložiště a informační systémy. Problém jakékoliv komunikace, včetně té na internetu, je propustnost, která je omezená. Malá propustnost může způsobit pomalé načtení webové stránky, což může potenciálního zákazníka odradit. Nebo například příliš opožděné reakce v informačním systému, který tak může snižovat produktivitu.
\subsection{Architektury}
\subsection{Protokoly v aplikační vrstvě}
Distribuované systémy mají různé architektury. Liší se např. v tom, kdo má v systému jak velké slovo a kdo komunikuje s kým. My zmíníme dvě: klient-server a peer-to-peer.
Nejvyšší v rodině protokolů TCP/IP je aplikační vrstva s protokoly jako HTTP, gRPC nebo SMTP. Aplikačním protokolům, které ale nejsou specifické pro konkrétní aplikaci, se říká middleware. Mezi takové řadíme právě HTTP nebo gRPC, které jsou pro obecné posílání zpráv. V aplikační vrstvě děláme autentizaci a autorizaci. Další příkladem protokolu je API pro službu STAG.
\subsubsection{Klient-Server}
\subsubsection{Middleware}
První architekturu, kterou zmíníme, je klient-server. Vrcholy v síti jsou rozděleny na
Speciálním případem protokolů v aplikační vrstvě je \uv{middleware}. Je to takový protokol, který není specifický pro žádnou konkrétní aplikaci. Příkladem jsou protokoly gRPC, HTTP, OAuth apod. Existuje celá řada různých aplikací, které je mohou využívat právě díky své obecnosti. Typické jsou různé typy rozhraní pro posílání zpráv. Pokročilejším případem jsou autentizační a autorizační middleware. Authentizace je ověření, že klient je opravdu ten, za koho se vydává. Autorizace je ověření, že klient má právo na to, co se snaží udělat. Je jasné, že tato problematika bude trápit více různých aplikací s ne nutně jinak společnou částí.
\subsubsection{Peer-to-Peer}
\subsubsection{HTTP}
\subsection{Rodina protokolů TCP/IP}
% - Velmi častý
% - Původně pro přenos HTML dokumentů, ale i obrázků, videí apod.
% - Klient-server protokol - pouze jedna strana posílá požadavky
Mezi uzly v síti je potřeba komunikovat. Narozdíl od komunikace mezi procesy na stejném počítači, nemáme k dispozici sdílenou paměť. Komunikace v síti je založena na posílání primitivních zpráv. Primitivních znamená formou n-tice bytů. Pokud proces A chce poslat zprávu procesu B, který je na jiném počítači, tak sestaví zprávu M. Tuto zprávu odešle procesu B pomocí systémového volání `send`. Toto systémové volání podporuje většina operačních systémů. Proces B jiným systémovým voláním `read` zprávu přečte a může na ni zareagovat, například provedením výpočtu a zasláním výsledku zprávou zpět na proces A. V této interakci mezi procesy počítáme s tím, že se oba shodnou, co jednotlivé bity ve zprávě znamenají.
% Velmi používaným protokolem je HTTP, neboli Hyper Text Transport Protocol. Používá se převážně pro přenos HTML dokumentů. Byl navržen ke komunikaci mezi webovými prohlížeči a webovými servery, ale často se používá i pro API pro komunikaci mezi dvěma programy. Tento protocol je bezestavový. To znamená, že si žádná data neukládá mezi dvěma HTTP dotazy. Každý dotaz musí obsahovat kompletní informace k jeho vyhodnocení.
% ref: https://cs.wikipedia.org/wiki/TCP/IP
Komunikační protokol je množina pravidel, která určují syntaxi a význam jednotlivých zpráv při komunikaci.
Síťová komunikace je rozdělena do vrstev. Každá vrstva má svou zodpovědnost. Internet protokol, neboli IP, určuje navigaci zpráv v síti. IP adresa počítače je protějšek adresy domu.
\subsubsection{HTTP/3}
Poměrně zajímavou novinkou je HTTP/3, která běží na protokolu QUIC. Jinak je podobný protocolu HTTP/2.
\subsubsection{gRPC}
\subsubsection{Internet protocol}
V síťové vrstvě, která se stará o směrování zpráv, se v síti Internet používá tzv. Internet Protocol.
\subsection{Protokoly v transportní vrstvě}
Nejčastější protokoly transportní vrstvy pro komunikaci v síti Internet jsou TCP a UDP. Problém jiných protokolů je, že ne všechny uzly je musí podporovat, což může způsobovat ztracené packety, nebo dokonce žádná cesta nemusí existovat. Protokoly TCP i UDP si představíme.
\subsubsection{Sockety}
Tyto protokoly se v aplikacích používají pomocí tzv. socketů. Jedná se o objekt, který se chová jako soubor. Můžeme ho otevřít, zapsat, přečíst a zavřít. Představím přesně tyto funkce, protože je budu v práci využívat. Konkrétně budu používat Linuxové rozhraní.
Pro začátek komunikace pomocí těchto protokolů musím otevřít socket pomocí `socket`. Funkce má parametr pro typ protokolu, který chceme použít. Po vytvoření socketu ho můžeme navázat na konkrétní port pomocí `bind` s číslem portu. Pokud socket nenavážeme, přiřadí nám operační systém libovolný volný port.
Nejčastější protokoly transportní vrstvy jsou TCP a UDP. V roce 2012 představila společnost Google ještě protokol QUIC, který využívá UDP. Tyto protokoly si představíme, protože jejich vlastností budeme využívat při optimalizacích.
\subsubsection{TCP}
Nejběžnější protokol je TCP. Při použití mezi sebou dva koncové body vytvoří spojení, přes které mohou posílat zprávy obousměrně. Protokol garantuje spolehlivé doručení dat v pořadí, ve kterém byla odeslána. Zároveň za Vás řeší tzv. congestion control. Jedná se o problém přetížení sítě, kdy v případě, že uzel může začít packety zahazovat. Příkladem může být omezení rychlosti stahování. Pokud platíte u poskytovatele 300Mb/s a začnou Vám chodit data rychlostí 500Mb/s, přebytečné packety se prostě zahodí.
Nejběžnější protokol je TCP. Při použití mezi sebou dva koncové body vytvoří spojení, přes které mohou posílat zprávy obousměrně. Protokol garantuje spolehlivé doručení dat v pořadí, ve kterém byla odeslány. Zároveň za Vás řeší zahlcení sítě. Internet protokol říká, že propojovací prvky mohou v případě, že jsou zahlcené, pakety zahodit. Příkladem může být omezení rychlosti stahování poskytovatelem internetového připojení. Pokud platíte za 300Mb/s a začnou Vám chodit data rychlostí 500Mb/s, přebytečné pakety se prostě zahodí.
Po vytvoření socketu pro TCP můžeme použít funkci `accept`, která přijme první připojení ve frontě. Pokud se na náš socket někdo pokusí připojit, operační systém vykoná tzv. handshake a přidá nové připojení do fronty. Z fronty můžeme vytahovat právě pomocí `accept`. Zjistit, jestli ve frontě už nějaké připojení máme, můžeme pomocí funkce `listen`, která blokuje, dokud nějaké připojení nepřibyde.
Spojení v TCP musí odsouhlasit obě strany. Jedna strana se připojuje a druhá pomocí volání \cpp{accept} spojení přijme.
Pokud se na náš socket někdo pokusí připojit, operační systém vykoná tzv. handshake a přidá nové připojení do fronty. Z fronty můžeme vytahovat právě pomocí `accept`. Zjistit, jestli ve frontě už nějaké připojení máme, můžeme pomocí funkce `listen`, která blokuje, dokud nějaké připojení nepřibyde.
Nové přijaté připojení bude mít svůj vlastní socket s vlastním portem. Když zavoláme `write` a do argumentu dáme ukazatel na data a jejich délku, operační systém je odešle na druhou stranu, která s námi navázala spojení. Zaručí to, že na druhou stranu dojdou všechna data, nebo žádná. Druhá strana může pomocí `read` do alokované paměti přečíst to, co mu do socketu přišlo. Je nutné si uvědomit, že pokud zavoláme `write` pro data o délce řekněme 1000 bytů, tak druhá strana nemusí dostat všechna data pomocí jednoho `read`. Tento příkaz vrací počet bytů, které přečetl. Pokud tak přečte méně, než očekáváme, musíme provést volání znova, dokud nepřečteme vše co očekáváme. Mohlo by nás zarazit: jak může druhá strana vědět, kolik má očekávat dat? Pro to slouží tzv. komunikační protokol, který rozeberu v kapitole...
@@ -296,87 +353,13 @@ Jak QUIC řeší spolehlivost už jsem trochu vysvětlil při handshake. Obecně
\subsection{Protokoly v aplikační vrstvě}
Nejvyšší v rodině protokolů TCP/IP je aplikační vrstva. V ní najdeme protokoly jako HTTP, gRPC nebo SMTP. Aplikačním protokolům, které ale nejsou specifické pro konkrétní aplikaci, se říká middleware. Mezi takové řadíme právě HTTP nebo gRPC, které jsou pro obecné posílání zpráv. V aplikační vrstvě děláme autentizaci a autorizaci.
\subsubsection{HTTP}
Velmi používaným protokolem je HTTP, neboli Hyper Text Transport Protocol. Používá se např. na přenos HTML stránek. Byl navržen ke komunikaci mezi webovými prohlížeči a webovými servery, ale často se používá i pro API pro komunikaci mezi dvěma programy. Tento protocol je bezestavový. To znamená, že žádná data si neukládá mezi dvěma HTTP dotazy. Každý HTTP dotaz musí obsahovat kompletní informace k jeho vyhodnocení.
\subsubsection{HTTP/3}
Poměrně zajímavou novinkou je HTTP/3, která běží na protokolu QUIC. Jinak je podobný protocolu HTTP/2.
\subsubsection{gRPC}
Další protokol od Googlu je gRPC, který je binární a snaží se simulovat volání metod v objektech. Je to intuitivní alternativa k posílání zpráv.
\subsubsection{Middleware}
Speciálním případem protokolů v aplikační vrstvě je tzv. middleware. Je charakteristický tím, že není specifický pro žádnou aplikaci. Příkladem jsou právě protokoly zmíněné výše, jako gRPC nebo HTTP, protože libovolná aplikace je může využívat. Typické jsou různé typy rozhraní pro posílání zpráv. Pokročilejším případem jsou autentizační a autorizační middleware. Authentizace je ověření, že klient je opravdu ten, za koho se vydává. Autorizace je ověření, že klient má právo na to, co se snaží udělat. Je jasné, že tato problematika bude trápit více různých aplikací s ne nutně jinak společnou částí.
\subsection{Posílání zpráv}
V této sekci se budu soustředit na middleware pro komunikaci mezi procesy pomocí zpráv. Rozeberu jak lze zprávy kódovat a strukturovaná data serializovat. Komunikovat pomocí zpráv sice neschovává síťovou komunikaci, jako třeba RPC.
\subsubsection{Serializace}
V systému jsem chtěl zprávu reprezentovat jako instanci konkrétního objektu. To znamená pro zprávu, která říká, že hráč napsal něco do chatu, bude existovat třída \kiinlinecode{C++}{!}{NewChatMessage} a konkrétní hodnoty budou v instanci této třídy. Díky tomu jsem schopný snadno vytvářet zprávy v systému. Alternativou je implementovat dynamický strom, který bych následně kódoval jako JSON. Uzly by byly JSON objekty a listy JSON hodnoty. Podmínkou je, že každý list musí být převeditelný na hodnotu v JSONu a musí mít klíč. Druhý přístup ale zbytečně obchází vlastnosti jazyka C++, jako dědičnost, kontrolu typů (i když ta je v C++ slabá) a další. Na druhou stranu je tento přístup hodně dynamický, proto se hodí například, kdyby schéma zprávy definoval sám uživatel, až po kompilaci programu.
Pokud jsem chtěl posílat instance objektů, musel jsem instance převést na n-tici bytů. Tomuto procesu se říká serializace (resp. deserializace při převedení n-tice bytů na instance objektu). Velmi častým příkladem je serializace do JSON formátu, hojně využívaná v aplikacích s REST API rozhraním, nebo do XML v případě SOAP API rozhraní. To jsou tzv. textové formáty, které jsou pro člověka čitelné. Díky tomu jsou vhodné pro webové aplikace, kde rozhraní musí být srozumitelné pro snadnou práci. Nevýhoda je paměťová náročnost. Například číslo 1 000 000 se v JSON zakóduje do 7 bytů, i když binární reprezentace stejného čísla se vleze do 4 bytů. Rozdíl je směšný, ale téměř dvojnásobný. Druhým kamenem úrazu je struktura. Každý atribut objektu se v JSONu reprezentuje řetězcem, namísto třeba čísla o 2 bytech, které by unikátně atribut identifikovalo.
Všechna tato snížení prostorové náročnosti řeší binární formáty. Známým příkladem je ProtoBuf, FlatBuffers, Parquet nebo Cap'n'Proto. Postupně je rozeberu jejich specializace. ProtoBuf je volně dostupný protokol od Googlu pro serializaci strukturovaných dat. Pro použití je třeba definovat v univerzálním jazyce to, jakou má zpráva strukturu. Jazyk je podobný definici struktur v jazyce C. Pro přestavu si ukážeme:
\begin{kicode}{C++}{}{C++}
message EntitySpawnMessage {
uint32 entity_id = 1;
bool is_player = 2;
string name = 3;
}
\end{kicode}
Vidíme, že místo \kiinlinecode{C++}{!}{struct} píšeme \kiinlinecode{C++}{!}{message} a atributy musí mít unikátní ID. Důvodem je kompatibilita verzí definice. Pokud bychom měli systém o dvou službách, a v jedné bychom přidali atribut `position`, jak vidíme v příkladě, mohla by být druhá služba stále schopná serializovaná data první službou deserializovat.
\begin{kicode}{C++}{}{C++}
message EntitySpawnMessage {
uint32 entity_id = 1;
Vector3 position = 4;
bool is_player = 2;
string name = 3;
}
\end{kicode}
Stejnou vlastnost má i JSON, kdy unikátní ID je právě řetězec pro klíč. Serializující služba může přidávat atributy, ale deserializaci to neovlivní. Z .proto souboru se vygenerují přímo třídy do potřebného jazyka. V mém případě C++. Výhoda definovat zprávy v univerzálním jazyce je čitelnost, možnost převést do libovolného programovacího jazyka a především reflexe.
FlatBuffers je opět protokol od Googlu, který se vyvýjel pro použití v herních enginech pro hry více hráčů. Jeho výhoda je, že není třeba zprávu "deserializovat". Instanci třídy čte atributy přímo z n-tice bytů. V případě 60 zpráv za vteřinu zprávy od stovek hráčů, je rozdíl mezi deserializací a FlatBuffers znát.
Parquet je formát pro sloupcová data, který umožňuje v serializovaných datech vyhledávat a má menší paměťovou náročnost, takže je vhodný i pro přenos.
Posledním příkladem je Cap'n'Proto, čteno Captain Proto. Je to volně dostupný protokol, který nemá deserializaci, a je tak velmi rychlý. Jeho tvůrce navíc pracoval právě na ProtoBuf.
\subsubsection{Kódování zpráv}
Při čtení dat ze socketu pomocí TCP protokolu dostáváme proud bytů. Je potřeba z proudu zprávy dekódovat a naopak je být schopni do proudu zakódovat. Proto jsem definoval kódování zpráv a komponentu Messenger. TCP je spolehlivý protokol, proto se málokdy stane, že zprávy nebudou následovat hned po sobě. Pro zakódování zprávy zakóduju nejprve tzv. hlavičku. To je prvních pár bytů, které ukládají informaci o zprávě, jako třeba délku nebo typ. Za hlavičkou následuje serializovaná zpráva. V hlavičce budou první 4 byty tzv. magické číslo, které označuje začátek kóvání a slouží k synchronizaci čtecí hlavy v případě, že došlo při deserializaci k chybě. Dalšími 4 byty je n pro n-tici bytů pro serializovanou zprávu.
Při zavolání peek na instanci Messenger, se do bufferu v instanci, který má velikost 64KB, přečte funkcí recv z TCP socketu. Volání není nutné opakovat, protože peek budeme opakovat hned další snímek za pár milisekund. Po zavolání `recv` skenujeme vstupní buffer a hledáme magické číslo. Jakmile ho najdeme, čteme další 4 byty jako délku $n$. Pokud v bufferu zbývá ještě alespoň $n$ bytů, vložíme je do fronty zpráv a odebereme z bufferu pro uvolnění místa. Nakonec funkce `peek` ověří, jestli něco ve frontě je, pokud ano, vrátí typ nejstarší zprávy ve frontě.
Druhou funkcí je `pop`, která má template s argumentem T pro datový typ zprávy. Uživatel instance `Messenger` musí umět z čísla, které reprezentuje typ, dostat datový typ. To jsem udělal pomocí tzv. template specialization. Uživatel musí zavolat `peek` a podle vracené hodnoty zavolat `pop` se správným template argumentem. Funkce `pop` zavolá deserializační funkci generovanou ProtoBuf.
\subsubsection{Implementace}
Bylo potřeba zadefinovat, jak se zpráva bude posílat přes síť. Cílem nebyla univerzálnost a čitelnost, jako je například protokol HTTP, ale optimalizace velikosti. Je třeba definovat, jak zpráva v toku dat vypadá, a jak ji dekódovat.
První čtyři byty obsahují tzv. `MAGIC` číslo. Může to být libovolná konstanta, protože jediný její význam je synchronizace toho, kde zpráva začíná. Důvod si ukážeme v části o nápravě chyb. Další byte je typ zprávy. Další 2 byty je délka zprávy. Průměrná délka packetu je 1200-1500 bytů, nemá proto smysl posílat delší zprávy. K tomu tento protokol není. Nakonec následuje samotná serializovaná zpráva. Těmto prvním 6 bytům se říká hlavička.
\subsubsection{Detekce a náprava chyb}
Občas mohou nastat v proudu chyby, kdy zprávu nelze dekódovat, nebo nastane chyba při deserializaci. Proto jsem do kódování implementoval nápravu chyb. Definoval jsem maximální délku bytů, kterou lze přeskočit při hledání magického čísla. To nestačí, pokud jsou data náhodná, protože se může stát, že číslo objeví i tak (i když je pravděpodobnost 1/(256\^4)). Proto si dekodér pro socket počítá chyby. Pokud se objeví 3 po sobě jdoucí chyby, tak spojení ukončí. Příkladem takové chyby je selhání deserializace nebo `recv` vrátí chybu.
@@ -428,6 +411,267 @@ Všimněme si, že můžeme job vytvářet i z jiného jobu, a tím v podstatě
\newpage
\subsection{Architektury}
Distribuované systémy mají různé architektury. Liší se např. v tom, kdo má v systému jak velké slovo a kdo komunikuje s kým. My zmíníme dvě: klient-server a peer-to-peer.
\subsubsection{Klient-Server}
První architekturu, kterou zmíníme, je klient-server. Vrcholy v síti jsou rozděleny na
\subsubsection{Peer-to-Peer}
\section{Hra pro více hráčů}
Pro zkoušku různých technik jsme se rozhodli vytvořit hru pro více hráčů. Nejprve představíme, jak vypadá architektura hry jednoho hráče. Podporu pro více hráčů jsme implementovali jako rozšiřující vrstvu, která příliš neovlivňuje klasickou architekturu her. Ve hře se jednotlivý hráči uvidí, budou se moct pohybovat a interagovat s vybranými objekty.
Představíme komponenty, které jsme do programu implementovali a proč. Pro komunikaci jsme vytvořili nový protokol QUICr, který je podobný QUIC, ale upouští od spolehlivost a nabízí tak lepší odezvu.
\subsection{Hry}
Program hry většinou obsahuje smyčku, kde jedné iteraci říkáme \uv{snímek}. Moderní hry iterují od 60 do 240 snímků za sekundu, někdy více. V našem případě jsme se rozhodli pro jednoduchou 3D hru s vykreslováním 60 snímků za sekundu, která pro naše účely stačí. Zajímají nás různé metody pro optimalizaci her více hráčů. Hra si také udržuje svůj stav, jako entity ve světě, počasí, terén, herní pravidla apod.
Každý snímek nejprve posbírá vstupy od hráče, převede je na jednotlivé akce, podle toho, co pro hru vstupy znamenají, a aplikuje je na stav hry. Například stisknutí tlačítka W převede na akci: pohyb dopředu. Tyto akce budou tvořit derivaci stavu hru. Tu následně aplikuje na aktuální stav hry, čímž ho integrujeme a dostaneme se do dalšího stavu. Takto postupně iterujeme z počátečního stavu hry.
Architektura programů her je specifická tím, že tolik nevyužívá dědičnost a virtuální funkce. V případě milionu entity, pro které voláme funkci 60 krát za sekundu, se i virtualizované volání negativně projeví ve výkonu. Druhý důvod je čistě praktický. Pokud chceme mít obrovský svět s různými postavami, kde každá má různé schopnosti a vlastnosti, špatně by se nám modeloval strom dědičnosti. Daleko lépe se různé entity modelují skládáním jejich vlastností.
https://cowboyprogramming.com/2007/01/05/evolve-your-heirachy/
Logika vlastností a schopností, které různé entity mohou mít, se rozdělí do tzv. \uv{komponent}. Příkladem je komponenta pro obchodníka, stráž, kouzelníka, truhlu, dialog apod. Ty skládáme do tzv. \uv{entit}, která je pouhým identifikátor se svým seznamem komponent. Tento styl je podobný kompozici objektů, ale s tím rozdílem, že komponenty skládáme do entity až za běhu programu. Nedefinujeme třídu pro každý typ, který může ve hře být.
Seznam všech entit a jejich komponent je stav hry. Pro integraci stavu z derivace máme tzv. \uv{systémy}. Ty iterují přes seznam všech komponent konkrétního typu a provádí jejich transformaci. Tomuto přístupu se říká Entity, Component, System, zkráceně ECS.
\subsubsection{Entt}
Pro ECS využíváme knihovnu Entt. Příkladem her, které ji využívají taky je třeba Minecraft pro Windows. Nejprve vytvoříme registr, což je objekt typu `entt::registry`, který spravuje své entity a jejich komponenty. Entita je v tomto případě pouze unikátně identifikační číslo, komponenta je libovolný typ a systém je lambda. Pro vytvoření systému musíme definovat pohled, tedy n-tici komponent. Tento pohled pak bude iterátor přes všechny entity, které mají každou z těchto komponent. Můžeme pak podle stavu jedné aktualizovat jinou a dělat různé interakce mezi nimi.
\begin{kicode}{cpp}{}{Příklad použití knihovny Entt}
entt::registry registry;
entt::entity entity = registry.create();
registry.emplace<Transform>(entity, Transform::from_position(position));
registry.view<Transform, CharacterBody>()
.each([&](Transform& ts, CharacterBody& rb) {
auto character = rb.m_character;
auto transform = character->GetWorldTransform();
memcpy(&ts.transform, &transform, sizeof(glm::mat4));
});
\end{kicode}
Představíme komponenty, které jsme pro hru definovali a proč:
\begin{description}
\item[{Transform}] \hfill \\
Obsahuje transformační matici. Entity, které chceme zobrazit ve světě, tuto komponentu potřebují. Příkladem entity, která ji mít nebude, je zpráva v chatu.
\item[{Mesh}] \hfill \\
Obsahuje mesh, který má hra využít pro vykreslení entity. Mesh je n-tici bodů, které dohromady dávají 3D povrch objektu. Systém, který entity vykresluje si vytvoří pohled na Mesh a Transform, protože je potřeba vědět kam entitu vykreslit.
\item[{Rigidbody}] \hfill \\
Slouží pro fyzikální informace o entitě, jako hmotnost a sílu, kterou na entitu budeme aplikovat. Systém pro tuto komponentu bude fyzický engine.
\end{description}
\subsection{Svět}
Stav hry reprezentujeme kompletně ve třídě Svět, neboli `World`. Obsahuje registr všech entit a jejich komponent. Objekt zvaný ovladač, pak bude sbírat vstupy a stav světa postupně aktualizovat. V případě hry pro jednoho hráče získá ovladač vstupy z klávesnice a myši a vhodně aktualizuju svět. Například při zmáčknutí klávesy W pro posun dopředu, nastavím rychlost RigidBody entity pro hráče tak, aby při zavolání integrace posunula Transform hráče. Oddělím tak logiku která drží stav a tu která stav mění.
\subsubsection{Ovladač pro hru jednoho hráče}
Definujeme, jak bude vypadat ovladač světa, tedy vrstva, která transformuje vstupy od hráče na akce ve hře, a podle nich postupně mění stav světa. Pro tento přístup jsme vytvořili `LocalWorldController`.
\subsubsection{Ovladač pro hru více hráčů}
V případě hry pro více hráčů jsme vytvořil \kiinlinecode{cpp}{!}{\\ClientWorldController}. Ve jméně je zmíněný *Client*, protože pro peer-to-peer architekturu by ovladač vypadal jinak. Nejedná se tedy o univerzální řešení pro hru více hráčů. Další součástí systému je `WorldServer`. Ten má v případě klient-server architektury zodpovědnost přijímat vstupy od klientů a odesílat zpátky stav světa. Architektura je podobná té pro hru jednoho hráče, pouze se změnilo kdo integruje.
% #image("ClientServerArchitecture.png")
Protějškem je hra šachů, kterou ovládáme hlasem a někdo jiný za nás táhne. Zvoláme "pěšec XY na ZW", tahač táhne a my vidíme, jak se našim vstupem změnil stav hry. Stejně tak to vidí i druhý hráč. Všimněme si, že druhý hráč vůbec nemusí vědět, co byl náš vstup (ten může dostat derivací), ale stačí mu pouze stav.
\subsection{Klient-Server architektura}
Hry budeme programovat s architekturou klient-server. To znamená, že hráči budou mít klienta a někde v síti musí být dostupný server, na který se klienti budou připojovat. Server bude mít absolutní autoritu. Klienti budou na server posílat pouze vstupy, server se k nim bude chovat stejně, jako by se jednalo o hru jednoho hráče a on je přečetl z klávesnice a myši. Server bude na klienty posílat co nejčastěji stav světa. Tento stav se bude postupně měnit. Zodpovědnost programu klienta je tento stav správně zobrazit. Například vykreslit všechny entity na správných pozicích apod.
Alternativou je peer-to-peer architektura, kdy každý uzel je zároveň server i klient, neboli peers. Na rozdíl od klient-server ale nemá nikdo autoritu. Uzly si mezi sebou posílají opět jen vstupy. Hra se simuluje na každém peerovi zvlášť. Zde nastává problém synchronizace, protože simulace se nám mohou snadno rozejít. Musíme tedy definovat, jak zjistit, že se desynchronizace stala a co s ní dělat. Musíme si dát pozor na pseudo-náhodné generátory, aby náhodné prvky hry se vyhodnotili všude stejně. Další problém může nastav v přesnosti čísel s plovoucí desetinou čárkou. Některé procesory mohou udělat operaci jinak a způsobit desynchronizaci.
Detekovat desynchronizaci můžeme tak, že si jednou za čas peers pošlou snapshot svého stavu.
\subsection{Posílání zpráv}
V této sekci se budu soustředit na middleware pro komunikaci mezi procesy pomocí zpráv. Rozeberu jak lze zprávy kódovat a strukturovaná data serializovat. Komunikovat pomocí zpráv sice neschovává síťovou komunikaci, jako třeba RPC.
\subsubsection{Serializace}
V systému jsem chtěl zprávu reprezentovat jako instanci konkrétního objektu. To znamená pro zprávu, která říká, že hráč napsal něco do chatu, bude existovat třída \kiinlinecode{cpp}{!}{NewChatMessage} a konkrétní hodnoty budou v instanci této třídy. Díky tomu jsem schopný snadno vytvářet zprávy v systému. Alternativou je implementovat dynamický strom, který bych následně kódoval jako JSON. Uzly by byly JSON objekty a listy JSON hodnoty. Podmínkou je, že každý list musí být převeditelný na hodnotu v JSONu a musí mít klíč. Druhý přístup ale zbytečně obchází vlastnosti jazyka C++, jako dědičnost, kontrolu typů (i když ta je v C++ slabá) a další. Na druhou stranu je tento přístup hodně dynamický, proto se hodí například, kdyby schéma zprávy definoval sám uživatel, až po kompilaci programu.
Pokud jsem chtěl posílat instance objektů, musel jsem instance převést na n-tici bytů. Tomuto procesu se říká serializace (resp. deserializace při převedení n-tice bytů na instance objektu). Velmi častým příkladem je serializace do JSON formátu, hojně využívaná v aplikacích s REST API rozhraním, nebo do XML v případě SOAP API rozhraní. To jsou tzv. textové formáty, které jsou pro člověka čitelné. Díky tomu jsou vhodné pro webové aplikace, kde rozhraní musí být srozumitelné pro snadnou práci. Nevýhoda je paměťová náročnost. Například číslo 1 000 000 se v JSON zakóduje do 7 bytů, i když binární reprezentace stejného čísla se vleze do 4 bytů. Rozdíl je směšný, ale téměř dvojnásobný. Druhým kamenem úrazu je struktura. Každý atribut objektu se v JSONu reprezentuje řetězcem, namísto třeba čísla o 2 bytech, které by unikátně atribut identifikovalo.
Všechna tato snížení prostorové náročnosti řeší binární formáty. Známým příkladem je ProtoBuf, FlatBuffers, Parquet nebo Cap'n'Proto. Postupně je rozeberu jejich specializace. ProtoBuf je volně dostupný protokol od Googlu pro serializaci strukturovaných dat. Pro použití je třeba definovat v univerzálním jazyce to, jakou má zpráva strukturu. Jazyk je podobný definici struktur v jazyce C. Pro přestavu si ukážeme:
\begin{kicode}{cpp}{}{cpp}
message EntitySpawnMessage {
uint32 entity_id = 1;
bool is_player = 2;
string name = 3;
}
\end{kicode}
Vidíme, že místo \kiinlinecode{cpp}{!}{struct} píšeme \kiinlinecode{cpp}{!}{message} a atributy musí mít unikátní ID. Důvodem je kompatibilita verzí definice. Pokud bychom měli systém o dvou službách, a v jedné bychom přidali atribut `position`, jak vidíme v příkladě, mohla by být druhá služba stále schopná serializovaná data první službou deserializovat.
\begin{kicode}{cpp}{}{cpp}
message EntitySpawnMessage {
uint32 entity_id = 1;
Vector3 position = 4;
bool is_player = 2;
string name = 3;
}
\end{kicode}
Stejnou vlastnost má i JSON, kdy unikátní ID je právě řetězec pro klíč. Serializující služba může přidávat atributy, ale deserializaci to neovlivní. Z .proto souboru se vygenerují přímo třídy do potřebného jazyka. V mém případě C++. Výhoda definovat zprávy v univerzálním jazyce je čitelnost, možnost převést do libovolného programovacího jazyka a především reflexe.
FlatBuffers je opět protokol od Googlu, který se vyvýjel pro použití v herních enginech pro hry více hráčů. Jeho výhoda je, že není třeba zprávu "deserializovat". Instanci třídy čte atributy přímo z n-tice bytů. V případě 60 zpráv za vteřinu zprávy od stovek hráčů, je rozdíl mezi deserializací a FlatBuffers znát.
Parquet je formát pro sloupcová data, který umožňuje v serializovaných datech vyhledávat a má menší paměťovou náročnost, takže je vhodný i pro přenos.
Posledním příkladem je Cap'n'Proto, čteno Captain Proto. Je to volně dostupný protokol, který nemá deserializaci, a je tak velmi rychlý. Jeho tvůrce navíc pracoval právě na ProtoBuf.
\subsubsection{Kódování zpráv}
Při čtení dat ze socketu pomocí TCP protokolu dostáváme proud bytů. Je potřeba z proudu zprávy dekódovat a naopak je být schopni do proudu zakódovat. Proto jsem definoval kódování zpráv a komponentu Messenger. TCP je spolehlivý protokol, proto se málokdy stane, že zprávy nebudou následovat hned po sobě. Pro zakódování zprávy zakóduju nejprve tzv. hlavičku. To je prvních pár bytů, které ukládají informaci o zprávě, jako třeba délku nebo typ. Za hlavičkou následuje serializovaná zpráva. V hlavičce budou první 4 byty tzv. magické číslo, které označuje začátek kóvání a slouží k synchronizaci čtecí hlavy v případě, že došlo při deserializaci k chybě. Dalšími 4 byty je n pro n-tici bytů pro serializovanou zprávu.
Při zavolání peek na instanci Messenger, se do bufferu v instanci, který má velikost 64KB, přečte funkcí recv z TCP socketu. Volání není nutné opakovat, protože peek budeme opakovat hned další snímek za pár milisekund. Po zavolání `recv` skenujeme vstupní buffer a hledáme magické číslo. Jakmile ho najdeme, čteme další 4 byty jako délku $n$. Pokud v bufferu zbývá ještě alespoň $n$ bytů, vložíme je do fronty zpráv a odebereme z bufferu pro uvolnění místa. Nakonec funkce `peek` ověří, jestli něco ve frontě je, pokud ano, vrátí typ nejstarší zprávy ve frontě.
Druhou funkcí je `pop`, která má template s argumentem T pro datový typ zprávy. Uživatel instance `Messenger` musí umět z čísla, které reprezentuje typ, dostat datový typ. To jsem udělal pomocí tzv. template specialization. Uživatel musí zavolat `peek` a podle vracené hodnoty zavolat `pop` se správným template argumentem. Funkce `pop` zavolá deserializační funkci generovanou ProtoBuf.
\subsubsection{Implementace}
Bylo potřeba zadefinovat, jak se zpráva bude posílat přes síť. Cílem nebyla univerzálnost a čitelnost, jako je například protokol HTTP, ale optimalizace velikosti. Je třeba definovat, jak zpráva v toku dat vypadá, a jak ji dekódovat.
První čtyři byty obsahují tzv. `MAGIC` číslo. Může to být libovolná konstanta, protože jediný její význam je synchronizace toho, kde zpráva začíná. Důvod si ukážeme v části o nápravě chyb. Další byte je typ zprávy. Další 2 byty je délka zprávy. Průměrná délka packetu je 1200-1500 bytů, nemá proto smysl posílat delší zprávy. K tomu tento protokol není. Nakonec následuje samotná serializovaná zpráva. Těmto prvním 6 bytům se říká hlavička.
\subsubsection{Detekce a náprava chyb}
Občas mohou nastat v proudu chyby, kdy zprávu nelze dekódovat, nebo nastane chyba při deserializaci. Proto jsem do kódování implementoval nápravu chyb. Definoval jsem maximální délku bytů, kterou lze přeskočit při hledání magického čísla. To nestačí, pokud jsou data náhodná, protože se může stát, že číslo objeví i tak (i když je pravděpodobnost 1/(256\^4)). Proto si dekodér pro socket počítá chyby. Pokud se objeví 3 po sobě jdoucí chyby, tak spojení ukončí. Příkladem takové chyby je selhání deserializace nebo `recv` vrátí chybu.
\subsection{Server}
Rozebereme si jak vypadá program pro server. Ukážeme komponenty, které jsme pro podporu více hráčů museli přidat. Architektura se skládá z replikátoru a manažera zájmu. Stav světa, který server odesílá na klienty, se skládá z entity a komponent, které chceme synchronizovat. Replikátor pro každého hráče zakóduje entity a jejich komponenty a udržuje je synchronizované. Pomocná komponenta je manažer zájmu. Ta říká, které entity se mají synchronizovat kterým. Základní implementace by pro hráče $A$ mohla omezit entity, které mu server bude synchronizovat, na ty v maximální vzdálenosti $d$ metrů.
\subsubsection{Registr spojení}
Vytvořili jsme registr, ve kterém jsou všichni připojení hráči. Tato komponenta slouží jako sifon pro všechny zprávy, které klienti odesílají. Zároveň z ní lze zjistit kdo se právě připojil a kdo odpojil. Třída na to má dvě metody: \kiinlinecode{cpp}{!}{\\popDisconnectedPlayers} a \kiinlinecode{cpp}{!}{\\popConnectedPlayers}. Třída si udržuje seznam nových připojení od posledního zavolání \kiinlinecode{cpp}{!}{\\popConnectedPlayers}.
Také zde udržujeme počet selhání, které u klienta nastali a jakmile počet překročí určitou hranici, např. 5 chyb, relaci s klientem ukončíme.
% Pro odstínění zbytku logiky od síťové vrstvy slouží registr spojení. O to se stará pouze třída `ClientSessionManager`. Ta hlídá, jestli se nesnaží připojit někdo další. Pokud ano, udělá s ním patřičný handshake, ve kterém si vymění důležité informace o spojení jako session ID a tajný klíč. Na rozhraní bude mít funkci `update`, která při zavolání zkontroluje nová připojení a stavy handshake. V případě, že se klient nebude dlouho ozývat, vyřadí ho z registru. Tuto skutečnost o vyřazení, a samozřejmě o připojení, by měla dát vědět. Vytvořil jsem dvě fronty, jednu pro nově připojené a jednu pro odpojené klienty. Ovladač pro svět si každý snímek tyto fronty vyprázdní.
\subsubsection{Replikátor}
Systém hry pro více hráčů se snaží mít na všech zařízeních stejný stav. O to se stará replikátor. Pro každého klienta si drží seznam entit, které musí danému klientovi synchronizovat, aby svůj úkol splnil. V případě klient-server architektury odesílá server svůj stav klientům. Naopak klienti posílají pouze své vstupy. Základní implementace by posílala každý snímek kompletní stav entity se všemi komponentami. Lepší varianta je posílat pouze změny. Pokud se například pozice nezmění, není třeba posílat stejnou pozici jako minule. Na druhé straně u klienta máme replicator receiver. Ten se stará o dekódování zpráv a správné aktualizaci komponent entit.
% Druhým důležitým systémem je replikátor. Ten pro každého klienta získá z Interest manageru seznam entit, které odebírá. Ty mu pak replikuje. Replikátor je už vrstva, která má zájem o to minimalizovat bandwidth. Všechny entity, které klient odebírá, mu musí udržovat synchronizované, ale může dělat například delta-compression. Tedy pokud se něco nezmění, tak to nebude synchronizovat. Je ale třeba, aby u každé komponenty věděl, jestli a jak ji má synchronizovat.
\subsubsection{Správa zájmů}
Zájem, neboli seznam entit, které se musí klientovi $A$ synchronizovat, vybírá komponenta manažer zájmů.
Systém, který se bude starat o to, které entity se musejí klientům synchronizovat, se nazývá *Interest manager*. Nejprve klientovi, podle jeho ID, přiřadíme tzv. delegáta ve světě. Bude to entita s transformací. Pro každého delegáta bude v pravidelných intervalech kontrolovat a přiřazovat do zájmu ty entity, které jsou v dostatečné blízkosti. Nejprve jsem udělal základní ground-truth implementaci, která funguje na principu brute-force a nevyužívá akceleračních struktur. Jednoduše pro každou jinou entitu pomocí Pythagorovy věty zjistí, jestli je dostatečně blízko.
Dotazu na všechny body, které jsou v určité vzdálenosti, se říká `range-query`. Datové struktury, které mi pomohli tento proces zrychlit jsou spatial grid, quad stromy a nebo kd-stromy. Techniky představím a porovnám:
\subsection{Klient}
V klientské aplikaci mám komponenty svět a ovladač. ClientWorldController, která obstarává vše kolem síťování. Třída World funguje stejně jako na serveru a stará se o klasický běh hry.
\subsubsection{Replicator controller}
Abychom oddělili to, jak replikátor funguje, vytvořili jsme pro něj na straně klienta ovladač. To nám později umožnilo měnit protokol mezi klientem a server podle potřeby.
\subsubsection{Interpolace}
Když jsme začali systém měřit, zjistili jsme, že áž příliš zatěžuje síť. Graf s průměry pro počet hráčů vidíme na grafu. Prvně jsme snížili počet snímků za sekundu, které server na klienty posílá, na 20 za sekundu. To snížilo zátěž na třetinu. Problém ale byl neplynulost hry. Klient sice vykresloval 60 krát za vteřinu, ale méně časté aktualizace způsobili neplynulý pohyb. Řešení je na klientovi interpolovat spojité proměnné, jako pozice nebo rotace. Do ovladače pro replikátor jsme přidali komponentu interpolátor. Do něj registrujeme jednotlivé komponenty, které chceme interpolovat. Interpolátor si je ukládá i s časovou známkou do bufferu. Na rozhraní jsem vytvořili funkci s argumentem čas a typ komponenty.
Technika měla nepříjemný důsledek zvýšení odezvy. To vadí především pro entity, které hráč ovládá, jako např. hráčova postava. Problém je, že když na interpolátor přijde snapshot $n$, může teprve začít interpolovat z pozice $n-1$. Proto
% Když jsem ale architekturu vyměnil za hru pro více hráčů, narazil jsem na obrovské zatížení sítě, protože posílat 60x za vteřinu $n$ vstupů a pak $n$ set snapshotů zpátky má objem. Především řeším velikost snapshotů, protože vstupy hráče lze reprezentovat velmi úsporně, a to bitem pro každou akci, kterou mohl vyvolat.
% Pro snížení náročnosti jsem umožnil nastavit počet snímků za vteřinu a nastavil 20. To pomohlo, ale za cenu velmi neplynulého hraní. Naštěstí pro plynulost hraní nám stačí pozice a rotace, a ty můžeme interpolovat. Přidal jsem tedy klientovi možnost si pozice uložit do bufferu a postupně, s fixním zpožděním, je interpolovat.
\subsubsection{Rollback a simulace vlastního hráče}
Interpolovat sice pomohlo pro plynulost, ale zvýšilo odezvu, což je nepříjemné. Způsob, jakým jsem se rozhodl tento problém řešit, je integrovat hráče pro daného klienta přímo na klientovi. Nejen že odezva bude v podstatě nulová, ale navíc bude ještě nižší než před interpolací. Musel jsem ale vytvořit mechanismus, který v případě, že se simulace neshodnou, tak na klientovi stav hráče opraví.
Do bufferu jsem si ukládal pro konkrétní snímky vstup od hráče, který pošlu na server, a aktuální stav, ve kterém hráč je. Následně když ve snímku $x$ přijde snapshot pro snímek $x - t$, který má až moc velkou odchylku, tak vrátíme stav světa na $x - t$ a podle vstupů z bufferu znova integrujeme. Tím dostaneme novou a opravenou pozici.
% Pro použití UDP jsem musel přepracovat jak komponenta Messenger funguje. Shrnu co všechno bylo potřeba při návrhu vzít v potaz. Spolehlivost tak, aby nemusela být potřeba vždycky. TCP se čte jako proud bytů bez jasného rozdělení na jednotlivé packety, zatímco když na UDP socket zavolám `recv`, dostanu právě jeden datagram. Potřeboval jsem kódování zpráv, které bude pasovat na oba typy.
% Rozdělil jsem program architektonicky do tří vrstev. První je síťová, která ze socketu čte data a dekóduje z nich rámce. Komponenta, která toto řeší, jsem pojmenoval `QuicrEndpoint`. Ten po vytvoření instance otevře socket. Obsahuje rozhraní pro `bind`, který socketu přiřadí konkrétní port. k
% Problém je, kam umístit fronty. V případě serveru totiž chceme jednu velkou příchozí frontu rámců, ale frontu zvlášť pro každé připojení. Důvod univerzální fronty je, že můžeme mít více workerů, které zprávy budou obstarávat. Důvodem individuální fronty pro každé připojení je, aby se nestalo, že jeden hladový socket zablokuje všechny ostatní. Je proto třeba být v posílání packetů fér.
\subsection{Metriky}
Abych byl schopný správně optimalizovat tok dat, potřeboval jsem sbírat metriky. Proto jsou třeba dvě komponenty. První je úložiště, kde budu metriky ukládat. Může se jednat o CSV soubor nebo databázi. Druhá je rozhraní, ve kterém budu metriky vizualizovat. Představím dvě služby, které pro to využívám. Následně si představíme samotné metriky, které budu měřit a proč. Všechny metriky budu měřit po vteřinách, některé jako sumu, jako např. množství odchozích dat, a jiné jako průměr, jako např. odezvu.
@@ -468,180 +712,16 @@ Ukážu různé metriky, které lze měřit, jak a hlavně proč. Je dobré zmí
\subsubsection{Sbírání v reálném čase}
Přímo v hráčově klientské aplikaci jsme chtěli mít možnost vidět metriky v reálném čase. Do síťové vrstvy jsme přidali komponentu pro reportování událostí a jejich metrik zvanou \kiinlinecode{C++}{!}{\\NetworkMetricReporter}, která obsahuje metody jako \kiinlinecode{C++}{!}{\\reportInbound} a \kiinlinecode{C++}{!}{\\reportOutbound}. První metoda hlásí příchozí byty a druhá odchozí.
Přímo v hráčově klientské aplikaci jsme chtěli mít možnost vidět metriky v reálném čase. Do síťové vrstvy jsme přidali komponentu pro reportování událostí a jejich metrik zvanou \kiinlinecode{cpp}{!}{\\NetworkMetricReporter}, která obsahuje metody jako \kiinlinecode{cpp}{!}{\\reportInbound} a \kiinlinecode{cpp}{!}{\\reportOutbound}. První metoda hlásí příchozí byty a druhá odchozí.
\newpage
\section{Hra pro více hráčů}
Pro zkoušku různých technik jsme se rozhodli vytvořit hru pro více hráčů. Nejprve představíme, jak vypadá architektura hry jednoho hráče. Podporu pro více hráčů jsme implementovali jako rozšiřující vrstvu, která příliš neovlivňuje klasickou architekturu her. Ve hře se jednotlivý hráči uvidí, budou se moct pohybovat a interagovat s vybranými objekty.
Ukážu, jaké komponenty jsem přidal a proč, jak jsem je měřil a analyzoval a případné optimalizace, které jsem pro ně použil. Představím svůj protokol QUICr, který je inspirovaný QUIC, ale upouští od spolehlivosti, což je ideální pro hry.
\subsection{Hry}
Program hry většinou obsahuje smyčku, kde jedné iteraci říkáme snímek. Moderní hry iterují od 60 do až 240 snímků za sekundu, někdy více. V našem případě jsme se rozhodli pro jednoduchou 3D hru s vykreslováním 60 snímků za vteřinu. Zajímá nás aplikace různých technik. Hra si také udržuje svůj stav, jako entity ve světě, počasí, terén, herní pravidla apod.
Každý snímek nejprve posbírá vstupy od hráče, převede je na jednotlivé akce, podle toho, co pro hru vstupy znamenají, a aplikuje je na stav hry. Například stisknutí tlačítka W převede na akci: pohyb dopředu. Takto postupně iterujeme z počátečního stavu hry.
Architektura programů her je specifická tím, že tolik nevyužívá dědičnost a především virtuální funkce. V případě milionu entity, pro které voláme funkci 60 krát za sekundu, se i virtualizované volání negativně projeví ve výkonu. Např. chceme li mít obrovský svět s různými postavami, kde každá má různé schopnosti a vlastnosti, špatně by se nám modeloval strom dědičnosti.
https://cowboyprogramming.com/2007/01/05/evolve-your-heirachy/
Namísto toho se logika vlastností a schopností, které různé entity mohou mít, rozdělí do tzv. komponent. Např. komponenta pro obchodníka, stráž, kouzelníka, truhlu, dialog apod. Ve světě pak máme entity, kde každá má svůj individuální list komponent, které má. Tento styl je podobný kompozici objektů, ale s tím rozdílem, že komponenty skládáme do entity až za běhu programu. Nedefinujeme třídu pro každý typ entity, který může ve hře být.
Samotná logika je pak v tzv. systémech. Každý iteruje přes konkrétní komponentu, která v sobě musí mít stav a zároveň derivaci, kterou systém aplikuje, resp. provede integraci. Tomuto návrhu se říká Entity, Component, System, neboli zkráceně ECS.
\subsubsection{Entt}
V našem případě využíváme knihovnu entt, která obsahuje různé nástroje pro ECS a vývoj tak zjednodušuje. Příkladem her, které ji využívají taky je třeba Minecraft pro Windows. Nejprve vytvoříme registr, což je objekt typu `entt::registry`, který spravuje své entity a jejich komponenty. Entita je v tomto případě pouze unikátně identifikační číslo, komponenta je libovolný typ a systém je lambda. Pro vytvoření systému musíme definovat pohled, tedy n-tici komponent. Tento pohled pak bude iterátor přes všechny entity, které mají každou z těchto komponent. Můžeme pak podle stavu jedné aktualizovat jinou a dělat různé interakce mezi nimi.
\begin{kicode}{C++}{}{C++}
entt::registry registry;
entt::entity entity = registry.create();
registry.emplace<Transform>(entity, Transform::from_position(position));
registry.view<Transform, CharacterBody>()
.each([&](Transform& ts, CharacterBody& rb) {
auto character = rb.m_character;
auto transform = character->GetWorldTransform();
memcpy(&ts.transform, &transform, sizeof(glm::mat4));
});
\end{kicode}
Představíme komponenty, které jsme pro hru definovali a proč:
\begin{description}
\item[{Transform}] \hfill \\
Obsahuje transformační matici. Entity, které chceme zobrazit ve světě, tuto komponentu potřebují. Příkladem entity, která ji mít nebude, je zpráva v chatu.
\item[{Mesh}] \hfill \\
Obsahuje mesh, který má hra využít pro vykreslení entity. Mesh je n-tici bodů, které dohromady dávají 3D povrch objektu. Systém, který entity vykresluje si vytvoří pohled na Mesh a Transform, protože je potřeba vědět kam entitu vykreslit.
\item[{Rigidbody}] \hfill \\
Slouží pro fyzikální informace o entitě, jako hmotnost a sílu, kterou na entitu budeme aplikovat. Systém pro tuto komponentu bude fyzický engine.
\end{description}
\subsection{Svět}
Stav hry reprezentujeme kompletně ve třídě Svět, neboli `World`. Ta bude obsahovat právě entt registr pro entity ve světě. Další komponenta, zvaná ovladač, pak bude sbírat vstupy a stav světa postupně aktualizovat. V případě hry pro jednoho hráče získá ovladač vstupy z klávesnice a myši a vhodně aktualizuju svět. Například při zmáčknutí klávesy W pro posun dopředu, nastavím rychlost RigidBody entity pro hráče tak, aby při zavolání integrace posunula Transform hráče. Oddělím tak logiku která drží stav a tu která stav mění.
\subsubsection{Ovladač pro hru jednoho hráče}
Definujeme, jak bude vypadat ovladač světa, tedy vrstva, která transformuje vstupy od hráče na akce ve hře, a podle nich postupně mění stav světa. Pro tento přístup jsme vytvořili `LocalWorldController`.
\subsubsection{Ovladač pro hru více hráčů}
V případě hry pro více hráčů jsme vytvořil \kiinlinecode{C++}{!}{\\ClientWorldController}. Ve jméně je zmíněný *Client*, protože pro peer-to-peer architekturu by ovladač vypadal jinak. Nejedná se tedy o univerzální řešení pro hru více hráčů. Další součástí systému je `WorldServer`. Ten má v případě klient-server architektury zodpovědnost přijímat vstupy od klientů a odesílat zpátky stav světa. Architektura je podobná té pro hru jednoho hráče, pouze se změnilo kdo integruje.
% #image("ClientServerArchitecture.png")
Protějškem je hra šachů, kterou ovládáme hlasem a někdo jiný za nás táhne. Zvoláme "pěšec XY na ZW", tahač táhne a my vidíme, jak se našim vstupem změnil stav hry. Stejně tak to vidí i druhý hráč. Všimněme si, že druhý hráč vůbec nemusí vědět, co byl náš vstup (ten může dostat derivací), ale stačí mu pouze stav.
\subsection{Klient-Server architektura}
Hry budeme programovat s architekturou klient-server. To znamená, že hráči budou mít klienta a někde v síti musí být dostupný server, na který se klienti budou připojovat. Server bude mít absolutní autoritu. Klienti budou na server posílat pouze vstupy, server se k nim bude chovat stejně, jako by se jednalo o hru jednoho hráče a on je přečetl z klávesnice a myši. Server bude na klienty posílat co nejčastěji stav světa. Tento stav se bude postupně měnit. Zodpovědnost programu klienta je tento stav správně zobrazit. Například vykreslit všechny entity na správných pozicích apod.
Alternativou je peer-to-peer architektura, kdy každý uzel je zároveň server i klient, neboli peers. Na rozdíl od klient-server ale nemá nikdo autoritu. Uzly si mezi sebou posílají opět jen vstupy. Hra se simuluje na každém peerovi zvlášť. Zde nastává problém synchronizace, protože simulace se nám mohou snadno rozejít. Musíme tedy definovat, jak zjistit, že se desynchronizace stala a co s ní dělat. Musíme si dát pozor na pseudo-náhodné generátory, aby náhodné prvky hry se vyhodnotili všude stejně. Další problém může nastav v přesnosti čísel s plovoucí desetinou čárkou. Některé procesory mohou udělat operaci jinak a způsobit desynchronizaci.
Detekovat desynchronizaci můžeme tak, že si jednou za čas peers pošlou snapshot svého stavu.
\subsection{Server}
Rozebereme si jak vypadá program pro server. Ukážeme komponenty, které jsme pro podporu více hráčů museli přidat. Architektura se skládá z replikátoru a manažera zájmu. Stav světa, který server odesílá na klienty, se skládá z entity a komponent, které chceme synchronizovat. Replikátor pro každého hráče zakóduje entity a jejich komponenty a udržuje je synchronizované. Pomocná komponenta je manažer zájmu. Ta říká, které entity se mají synchronizovat kterým. Základní implementace by pro hráče $A$ mohla omezit entity, které mu server bude synchronizovat, na ty v maximální vzdálenosti $d$ metrů.
\subsubsection{Registr spojení}
Vytvořili jsme registr, ve kterém jsou všichni připojení hráči. Tato komponenta slouží jako sifon pro všechny zprávy, které klienti odesílají. Zároveň z ní lze zjistit kdo se právě připojil a kdo odpojil. Třída na to má dvě metody: \kiinlinecode{C++}{!}{\\popDisconnectedPlayers} a \kiinlinecode{C++}{!}{\\popConnectedPlayers}. Třída si udržuje seznam nových připojení od posledního zavolání \kiinlinecode{C++}{!}{\\popConnectedPlayers}.
Také zde udržujeme počet selhání, které u klienta nastali a jakmile počet překročí určitou hranici, např. 5 chyb, relaci s klientem ukončíme.
% Pro odstínění zbytku logiky od síťové vrstvy slouží registr spojení. O to se stará pouze třída `ClientSessionManager`. Ta hlídá, jestli se nesnaží připojit někdo další. Pokud ano, udělá s ním patřičný handshake, ve kterém si vymění důležité informace o spojení jako session ID a tajný klíč. Na rozhraní bude mít funkci `update`, která při zavolání zkontroluje nová připojení a stavy handshake. V případě, že se klient nebude dlouho ozývat, vyřadí ho z registru. Tuto skutečnost o vyřazení, a samozřejmě o připojení, by měla dát vědět. Vytvořil jsem dvě fronty, jednu pro nově připojené a jednu pro odpojené klienty. Ovladač pro svět si každý snímek tyto fronty vyprázdní.
\subsubsection{Replikátor}
Systém hry pro více hráčů se snaží mít na všech zařízeních stejný stav. V případě klient-server architektury odesílá server svůj stav klientům. O to se stará replikátor. Pro každého klienta si drží seznam entit, které mu musí synchronizovat. Jeho zodpovědnost je odesílat zprávy klientům tak, aby vždy měli aktuální stav. Základní implementace by posílala každý snímek kompletní stav entity se všemi komponentami. Lepší varianta je posílat pouze změny. Pokud se například pozice nezmění, není třeba posílat stejnou pozici jako minule. Na druhé straně u klienta máme replicator receiver. Ten se stará o dekódování zpráv a správné aktualizaci komponent entit.
% Druhým důležitým systémem je replikátor. Ten pro každého klienta získá z Interest manageru seznam entit, které odebírá. Ty mu pak replikuje. Replikátor je už vrstva, která má zájem o to minimalizovat bandwidth. Všechny entity, které klient odebírá, mu musí udržovat synchronizované, ale může dělat například delta-compression. Tedy pokud se něco nezmění, tak to nebude synchronizovat. Je ale třeba, aby u každé komponenty věděl, jestli a jak ji má synchronizovat.
\subsubsection{Interest manager}
Zájem, neboli seznam entit, které se musí klientovi $A$ synchronizovat, vybírá komponenta manažer zájmů.
Systém, který se bude starat o to, které entity se musejí klientům synchronizovat, se nazývá *Interest manager*. Nejprve klientovi, podle jeho ID, přiřadíme tzv. delegáta ve světě. Bude to entita s transformací. Pro každého delegáta bude v pravidelných intervalech kontrolovat a přiřazovat do zájmu ty entity, které jsou v dostatečné blízkosti. Nejprve jsem udělal základní ground-truth implementaci, která funguje na principu brute-force a nevyužívá akceleračních struktur. Jednoduše pro každou jinou entitu pomocí Pythagorovy věty zjistí, jestli je dostatečně blízko.
Dotazu na všechny body, které jsou v určité vzdálenosti, se říká `range-query`. Datové struktury, které mi pomohli tento proces zrychlit jsou spatial grid, quad stromy a nebo kd-stromy. Techniky představím a porovnám:
\subsection{Klient}
V klientské aplikaci mám komponenty svět a ovladač. ClientWorldController, která obstarává vše kolem síťování. Třída World funguje stejně jako na serveru a stará se o klasický běh hry.
\subsubsection{Replicator controller}
Abychom oddělili to, jak replikátor funguje, vytvořili jsme pro něj na straně klienta ovladač. To nám později umožnilo měnit protokol mezi klientem a server podle potřeby.
\subsubsection{Interpolace}
Když jsme začali systém měřit, zjistili jsme, že áž příliš zatěžuje síť. Graf s průměry pro počet hráčů vidíme na grafu. Prvně jsme snížili počet snímků za sekundu, které server na klienty posílá, na 20 za sekundu. To snížilo zátěž na třetinu. Problém ale byl neplynulost hry. Klient sice vykresloval 60 krát za vteřinu, ale méně časté aktualizace způsobili neplynulý pohyb. Řešení je na klientovi interpolovat spojité proměnné, jako pozice nebo rotace. Do ovladače pro replikátor jsme přidali komponentu interpolátor. Do něj registrujeme jednotlivé komponenty, které chceme interpolovat. Interpolátor si je ukládá i s časovou známkou do bufferu. Na rozhraní jsem vytvořili funkci s argumentem čas a typ komponenty.
Technika měla nepříjemný důsledek zvýšení odezvy. To vadí především pro entity, které hráč ovládá, jako např. hráčova postava. Problém je, že když na interpolátor přijde snapshot $n$, může teprve začít interpolovat z pozice $n-1$. Proto
% Když jsem ale architekturu vyměnil za hru pro více hráčů, narazil jsem na obrovské zatížení sítě, protože posílat 60x za vteřinu $n$ vstupů a pak $n$ set snapshotů zpátky má objem. Především řeším velikost snapshotů, protože vstupy hráče lze reprezentovat velmi úsporně, a to bitem pro každou akci, kterou mohl vyvolat.
% Pro snížení náročnosti jsem umožnil nastavit počet snímků za vteřinu a nastavil 20. To pomohlo, ale za cenu velmi neplynulého hraní. Naštěstí pro plynulost hraní nám stačí pozice a rotace, a ty můžeme interpolovat. Přidal jsem tedy klientovi možnost si pozice uložit do bufferu a postupně, s fixním zpožděním, je interpolovat.
\subsubsection{Rollback a simulace vlastního hráče}
Interpolovat sice pomohlo pro plynulost, ale zvýšilo odezvu, což je nepříjemné. Způsob, jakým jsem se rozhodl tento problém řešit, je integrovat hráče pro daného klienta přímo na klientovi. Nejen že odezva bude v podstatě nulová, ale navíc bude ještě nižší než před interpolací. Musel jsem ale vytvořit mechanismus, který v případě, že se simulace neshodnou, tak na klientovi stav hráče opraví.
Do bufferu jsem si ukládal pro konkrétní snímky vstup od hráče, který pošlu na server, a aktuální stav, ve kterém hráč je. Následně když ve snímku $x$ přijde snapshot pro snímek $x - t$, který má až moc velkou odchylku, tak vrátíme stav světa na $x - t$ a podle vstupů z bufferu znova integrujeme. Tím dostaneme novou a opravenou pozici.
\subsection{Komunikační protokol}
Představíme komunikační protokol, který replikátor využívá.
% Pro použití UDP jsem musel přepracovat jak komponenta Messenger funguje. Shrnu co všechno bylo potřeba při návrhu vzít v potaz. Spolehlivost tak, aby nemusela být potřeba vždycky. TCP se čte jako proud bytů bez jasného rozdělení na jednotlivé packety, zatímco když na UDP socket zavolám `recv`, dostanu právě jeden datagram. Potřeboval jsem kódování zpráv, které bude pasovat na oba typy.
% Rozdělil jsem program architektonicky do tří vrstev. První je síťová, která ze socketu čte data a dekóduje z nich rámce. Komponenta, která toto řeší, jsem pojmenoval `QuicrEndpoint`. Ten po vytvoření instance otevře socket. Obsahuje rozhraní pro `bind`, který socketu přiřadí konkrétní port. k
% Problém je, kam umístit fronty. V případě serveru totiž chceme jednu velkou příchozí frontu rámců, ale frontu zvlášť pro každé připojení. Důvod univerzální fronty je, že můžeme mít více workerů, které zprávy budou obstarávat. Důvodem individuální fronty pro každé připojení je, aby se nestalo, že jeden hladový socket zablokuje všechny ostatní. Je proto třeba být v posílání packetů fér.
\subsection{Protokol QUICr}
Naše hra používala ke komunikaci mezi vrcholy protokol TCP. Zmínili jsme ale, že ten pro hry nemusí být vhodný. Vytvořil jsme proto protokol inspirovaný QUIC, který využívá UDP, ale upustil jsem podmínky pro spolehlivost, konkrétně jistotu doručení a uspořádání. V protokolu je možné na každém rámci definovat spolehlivost zvlášť. Ty, které budou obsahovat pozice hráčů, tak budu moct odesílat nespolehlivě, zatímco změny stavu, jako výměna animace nebo modelu, budu posílat spolehlivě. Pro vytvoření spojení budu používat dva objekty: koncový bod a spojení.
Naše hra používala ke komunikaci mezi vrcholy protokol TCP. Zmínili jsme ale, že ten pro hry nemusí být vhodný. Vytvořil jsme proto protokol inspirovaný QUIC, který využívá UDP, ale upustil jsem podmínky pro spolehlivost, konkrétně jistotu doručení a uspořádání. Nakonec jsme TPC a QUICr porovnali, abychom se o optimalizaci přesvědčili.
Koncový bod se stará o socket, tedy čtení a zápis na něj, a udržuje si objekty spojení, které ho využívají. Když přijde na socket datagram, správně ho přiřadí spojení. Jeho chování je definované jako ťik. V něm posbírá zprávy, které se spojení snaží poslat a pošle je, následně přečte socket a roztřídí datagramy.
Protokol využívá UDP a přenáší tak datagramy. Ty se skládají z paketu a ten z jednoho nebo více rámců. Rámce můžeme rozdělit na dva typy: datové a ovládací. Ovládací slouží pro handshake nebo ukončení spojení a budou vždy spolehlivě doručené. Datové obsahují aplikační data a mohou definovat svou spolehlivost. Ty, které budou obsahovat pozice hráčů, tak budeme moct odesílat nespolehlivě, zatímco změny stavu, jako výměna animace nebo modelu, budu posílat spolehlivě. Pro spojení budu používat dva objekty: \uv{koncový bod} a \uv{spojení}.
Objekt pro koncový bod se stará o soket: čtení a zápis na něj, a udržuje si objekty spojení, které ho využívají. Když přijde na soket datagram, správně ho přiřadí spojení. Jeho chování je definované jako tik. V něm posbírá zprávy, které se spojení snaží poslat a pošle je, následně přečte data ze soketu a roztřídí je do navázaných spojení.
\begin{center}
\begin{longtable}{>{\bfseries}l >{\ttfamily}c L{cm}}
@@ -656,19 +736,26 @@ Koncový bod se stará o socket, tedy čtení a zápis na něj, a udržuje si ob
\end{longtable}
\end{center}
Druhý objekt, spojení, je navenek stavový stroj a fronta zpráv, podobně jako TCP spojení. Stavový stroj mění stavy v reakci na příchozí rámce. Když na koncový bod přijde datagram, odešle ho do správného objektu připojení. Tento objekt si datagram přečte a postupně prochází rámce v něm. Stavový stroj bude důležitý hlavně v procesu zvaném "handshake", který definuju níže.
Objekt spojení je navenek stavový stroj a fronta zpráv, podobně jako TCP spojení. Stavy se mění v reakci na příchozí rámce. Když na koncový bod přijde datagram, odešle ho do správného objektu připojení. Tento objekt si datagram přečte a přeloží na pakety a rámce. Ty postupně prochází. Stavový stroj bude důležitý hlavně v procesu zvaném "handshake", který definuju níže.
Zároveň jsem se rozhodl, že na spojení nebude zdánlivě nekonečný proud bytů, jako je tomu například v TCP, ale fronta zpráv. Výhoda je, že když začnu číst datagram, tak mám jistotu, že nenarazím na konec bufferu a budu si muset načíst další část. V mém případě jedno čtení znamená čitelná zpráva, tak jak jsme byla odeslána. Zároveň mám z aplikace kontrolu nad datagramy. Replikátor může sám od sebe vytvořit namísto jedné velké zprávy více malých a odeslat je. Klient nemusí čekat, až by mu přišla celý zpráva a protokol by mu ji poskládal.
Zároveň jsem se rozhodl, že na spojení nebude zdánlivě nekonečný proud bytů, jako je tomu například v TCP, ale fronta zpráv. Výhoda je, že když začnu číst datagram, tak mám jistotu, že nenarazím na konec bufferu a budu si muset načíst další část. V mém případě jedno čtení znamená čitelná zpráva, tak jak jsme byla odeslána.
\subsubsection{Frame}
Inspiroval jsem se u protokolu QUIC, který datagram rozděluje na tzv. framy neboli \uv{rámce}. Tyto rámce můžu kódovat jak v TCP, tak v UDP. V případě UDP jsem se rozhodl u každého rámce definovat jeho spolehlivost, tedy jestli musí frame dojít vždy. Připojení pak bude mít jednotku pro spolehlivost, která bude spolehlivost zaručovat.
Inspiroval jsem se u protokolu QUIC, který datagram rozděluje na tzv. frame neboli \uv{rámce}. Tyto rámce jsou vhodná reprezentace pro ovládání protokolu, protože je můžeme kódovat proudem bytů v TCP i datagramem v UDP. Využili jsme nespolehlivosti a rychlosti UDP a u každého rámce definujeme jeho spolehlivost, tedy jestli musí rámec vždy dojít. Objekt pro připojení obsahuje jednotku pro spolehlivost, kterou si představíme v kapitole o spolehlivosti.
U UDP je další problém, a to ten, že když implementuju připojení pro UDP, tak všechny datagramy budou chodit na socket, na kterém poslouchám. Když budu ze socketu číst, dostanu libovolný datagram, který zrovna přišel, společně s adresou, ze které přišel. Tuto adresu přečtu z IP hlavičky, která není zašifrovaná, a tudíž ji kdokoliv může zfalšovat. Tomu se říká tzv. IP spoofing. Tento útok je poměrně slabý, protože v případě odpovědi budu stále odesílat data zpět na správnou adresu. Útok může sloužit například pro poslání požadavku na odpojení, nebo posílat jiné vstupy. Jedná se tedy spíše o neškodný ale otravný charakter útoku.
\subsubsection{Handshake}
Po vytvoření instance připojení z koncového bodu je připojení ve stavu `Closed`, neboli uzavřené. Pro navázání spojení jsem potřeboval, aby se dva objekty domluvili, například na svých ID, tajném klíči a verzi. Proto jsem definoval **handshake**. Mějme dva koncové body $A$ a $B$, které se mezi sebou budou snažit navázat spojení. Začne koncový bod $A$, a to tím, že odešle na koncový bod $B$ paket typu Initial, který obsahuje rámec typu `Hello`. Jakmile na koncový bod dorazí QUICr paket, který má v hlavičce jako Destination ID číslo, které nemá v registru, tak si ho přidá a přiřadí novou instanci připojení. Nová instance se chová stejně jako na straně $A$ a vygeneruje si unikátní identifikátor. Po vytvoření instance nechá koncový bod toto připojení tento paket zpracovat celý.
Po vytvoření instance připojení z koncového bodu je připojení ve stavu `Closed`, neboli uzavřené. Pro navázání spojení jsem potřeboval, aby se dva objekty domluvili na svých ID, tajném klíči a verzi. Proto jsem definoval proces zvaný \uv{handshake}. Mějme dva koncové body $A$ a $B$, které se mezi sebou budou snažit navázat spojení. Začne koncový bod $A$, a to tím, že odešle na koncový bod $B$ paket typu Initial, který obsahuje rámec typu `Hello`. Jakmile na koncový bod dorazí QUICr paket, který má v hlavičce jako Destination ID číslo, které nemá v registru, tak si ho přidá a přiřadí novou instanci připojení. Nová instance se chová stejně jako na straně $A$ a vygeneruje si unikátní identifikátor. Po vytvoření instance nechá koncový bod toto připojení tento paket zpracovat celý.
Nové připojení projde všechny rámce v paketu. Měl by narazit na rámec Hello, který když najde, a je ve stavu `Initial`, tak z hlavičky zjistí unikátní ID druhé strany a uloží si ho. Reaguje na rámec tak, že druhé straně odešle přes koncový bod paket, který obsahuje: rámec ACK o tom, že paket s číslem přijal, a rámec Hello. ACK si pro začátek představme zakódovaný jako: první 4 byty reprezentují kladné celé číslo pro počet rámců, řekněme $n$, které chceme označit jako přijaté. Následně přečteme $4n$ bytů. Každé 4 byty představují číslo paketu, který označíme jako ACKed. Jednotce, která udržuje stav o tom, jaké pakety jsou potřeba oznámit jako ACK a které je třeba poslat znovu, budu říkat `RealiabilityUnit` a podrobněji ji rozeberu později.
@@ -699,11 +786,11 @@ Pro spolehlivost se protokol stará podobně jako QUIC, s tím rozdílem, že ji
\begin{description}
\item[\texttt{push\_reliable\_frame(deadline, frame)}] \hfill \\
\item[\texttt{push\_reliable\_frame\_to\_send(deadline, frame)}] \hfill \\
Uloží si zakódovaný rámec a nastaví si u něj čas deadline. Jakmile bude po deadline, jednotka se bude snažit odeslat rámec znovu.
\item[\texttt{peek/pop\_reliable\_frames\_to\_send(packet\_number)}] \hfill \\
Vrátí rámce, které je potřeba v tomto okamžiku odeslat. Číslo paketu je důležité proto, aby jednotka věděla, které všechny rámce může ACK pro určitý paket označit jako hotové.
Vrátí rámce, které je potřeba v tomto okamžiku odeslat. Číslo paketu je důležité proto, aby jednotka věděla, které všechny rámce může ACK pro určitý paket označit jako spolehlivě doručené.
\item[\texttt{push\_ack(packet\_number)}] \hfill \\
Uloží si do seznamu číslo paketu a v další iteraci ho odešle jako ACK.
@@ -723,63 +810,135 @@ Možná jste si všimli, že nezaručujeme spolehlivost pořadí. Tuto záruku j
\subsubsection{Enkodér}
Pro kódování jsme vytvořili komponentu \kiinlinecode{C++}{!}{\\QuicrEncoder}, která přes konstruktor získá cílový buffer, do kterého má kódovat a na rozhraní má různé pomocné metody pro kódování hlaviček a rámců. Specifická vlastnost, kterou jsme potřebovali, je kódovat, dokud je v bufferu místo. Pokud zbývá $r$ bytů místa a replikátor by chtěl zakódovat rámec, který má $> r$ bytů, musí metoda vrátit informaci o neúspěchu, ale nevyhazovat vyjímku, ani neposunovat kurzor. Důvodem je, že UDP je nad protokolem IP, který může začít fragmentovat datagramy. Proto se většina protokolů snaží držet velikost datagramů kolem 1200 bytů. Podobný přístup jsme adaptovali my.
Pro kódování jsme vytvořili komponentu \kiinlinecode{cpp}{!}{\\QuicrEncoder}, která přes konstruktor získá cílový buffer, do kterého má kódovat a na rozhraní má různé pomocné metody pro kódování hlaviček a rámců. Specifická vlastnost, kterou jsme potřebovali, je kódovat, dokud je v bufferu místo. Pokud zbývá $r$ bytů místa a replikátor by chtěl zakódovat rámec, který má $> r$ bytů, musí metoda vrátit informaci o neúspěchu, ale nevyhazovat vyjímku, ani neposunovat kurzor. Důvodem je, že UDP je nad protokolem IP, který může začít fragmentovat datagramy. Proto se většina protokolů snaží držet velikost datagramů kolem 1200 bytů. Podobný přístup jsme adaptovali my.
Dále musel umožňovat zakódovat hodnotu zpětně, jako například délku, kterou kvůli omezení bufferu víme až později.
\subsubsection{Testování}
Při implementaci jsme zjistili, že je dobré začít testy, které definují jednotlivé vlastnosti, jako například: "Spojení začne komunikaci rámcem Hello", "Po rámci Hello odpoví spojení rámcem Hello a ACK", "Na pakety obsahující spolehlivé rámce odpoví spojení ACK rámcem" apod. V testu jsem pak tyto vlastnosti ověřil. Tomuto přístupu se říká test driven development.
Při implementaci jsme zjistili, že je dobré začít testy, které definují jednotlivé vlastnosti, jako například: "Spojení začne komunikaci rámcem Hello", "Po rámci Hello odpoví spojení rámcem Hello a ACK", "Na pakety obsahující spolehlivé rámce odpoví spojení ACK rámcem" apod. Tomuto přístupu se říká test driven development.
% Pro vývoj protokolu jsem si nejprve zkoušel zapsat specifikaci, následně udělat vývoj a nakonec otestovat. Tento přístup ale způsoboval časté chyby v návrhu protokolu. Daleko více se mi osvědčil tzv. Test Driven Development, kdy začneme tvorbou testů, které slouží v podstatě jako specifikace chování. Příkladem jsou testy: "Client begins with Hello datagram", "Connection reacts to Hello with ACK \& Hello" nebo "Both connections have correct IDs after Initial exchange". Tímto způsobem jsem definoval jak chci, aby se protokol a komponenty v něm chovali.
% Popsal jsem problémy, které jsem potřeboval vyřešit. Představím protokol, který je pro mě řeší. Vytvořil jsem třídu `QuicrConnection`, která bude reprezentovat stavový stroj připojení a zároveň umožní číst a zapisovat. Rozhodl jsem se, že zapisovat bude zprávy, nikoliv pouze proud bytů. Proto jsem použil tzv. message frame. Pokud něco popnu z QuicrConnection, je to vždy celá zpráva, která přišla. Stejný princip používá i ZeroMQ. Vytvořil jsem dvě třídy: QuicrConnection a QuicrConnectionListener. QuicrConnection obsahuje stavový stroj připojení a rozhraní pro příjímání a odesílání zpráv. QuicrConnectionListener obsahuje rozhraní pro poslouchání nově příchozích spojení. Nasluchač bude spravovat UDP socket. Když přijde nový datagram z adresy, kterou ještě nezná, a přišla zpráva Hello, tak si do seznamu přidá připojení ve stavu HelloReceived. Při datagramu z adresy, kterou zná, pošle tento datagram přímo do spojení na spracování. Každé spojení si bude udržovat svoji frontu příchozích zpráv.
Protokol měl za cíl snížit odezvu na nespolehlivé síti. Proto jsme vytvořili test, ve kterém máme klienta, který na server posílá datagram a měří, za jak dlouho dostane odpověď pro konkrétní snímek. Tato metrika se někdy nazývá RTT, neboli round-trip-time. Jak vidíme na obrázku, náš protokol je v případě ztráty paketů stabilnější.
\subsubsection{Měření}
Pro nasimulování nespolehlivosti sítě jsme využili Linuxový nástroj \uv{tc}. Ten obsahuje network emulator, který umožňuje například nastavit, kolik procent paketů má zahodit, jaká má být odezva nebo jak moc se budou prohazovat pakety. Nástroj a jeho vlastnosti, které budeme využívat, si představíme.
Protokol měl za cíl snížit odezvu na nespolehlivé síti. Vytvořili jsme test, který simuluje program hry. V testu jsou dvě vlákna, jedno pro klienta a druhé pro server. Oba mají svou vlastní smyčku, ve kterém iterují snímky. Klient odesílá hodnotu derivace typu double. Server si udržuje stav hodnoty, nazvěme ji \uv{pozice}. Při obdržení derivace ji přičte k derivaci. Každý snímek server odesílá na klienta stav pozice, kterou si klient aplikuje.
Pro nasimulování nespolehlivosti sítě jsme využili Linuxový nástroj \uv{tc}. Ten obsahuje network emulator, který umožňuje například nastavit, kolik procent paketů má zahodit, jaká má být odezva nebo jak moc se budou prohazovat pakety. Nástroj a jeho vlastnosti, které budeme využívat, si představíme. Nastavili jsme odezvu na 20-100ms a 2\% paketů se zahodí.
V prvním testu jsme pouze měřili odezvu mezi odesláním vstupu od klienta pro snímek $n$ a získáním jeho integrovaného stavu ze serveru. Na obrázku \ref{fig:latencycomparison} vidíme, že TCP obsahuje skoky a QUICr je stabilnější.
\begin{figure}
\begin{center}
\includegraphics[width=0.8\textwidth]{graphics/latencycomparison.pdf}
\end{center}
\caption{Porovnání odezvy TCP a QUICr}
\label{fig:latencycomparison}
\end{figure}
\begin{figure}
\begin{center}
\includegraphics[width=1\textwidth]{graphics/integrationcomparison.pdf}
\includegraphics[width=0.8\textwidth]{graphics/integrationcomparison.pdf}
\end{center}
\label{integrationcomparison}
\caption{Integrace}
\label{fig:integrationcomparison}
\caption{Porovnání integrace TCP a QUICr}
\end{figure}
Následně jsme zkusili, jak se nespolehlivost sítě projeví pro integraci proměnné. Přidali na server hodnotu, kterou pomocí hodnot od klienta inkrementujeme. Pro derivaci jsme použili sinusoidu, abychom ji mohli zreplikovat snadno v TCP i QUICr. Na obrázku \ref{integrationcomparison} vidíme, že TCP při ztrátě paketů způsobuje skoky, které nemusí být pro hráče příjemné. Naopak náš protokol má daleko méně znatelné skoky.
Následně jsme zkusili, jak se nespolehlivost sítě a skoky odezvy z prvního měření projeví v integraci proměnné. Pro derivaci jsme použili sinusoidu, abychom ji mohli zreplikovat snadno v TCP i QUICr. Na obrázku \ref{fig:integrationcomparison} vidíme, že TCP při ztrátě paketů způsobuje skoky, které nemusí být pro hráče příjemné. Naopak náš protokol má integraci plynulejší.
Nakonec jsme integrovali protokol přímo do replikátoru. Na obrázku \ref{playerbenchmark} vidíme 301 hráčů, kde 300 je simulovaných, avšak individuálních připojení a jeden je náš hráč. Server se občas zasekl, ale zátěž zvládl.
Nakonec jsme integrovali protokol přímo do replikátoru. Vytvořili jsme simulovaného klienta, který na server posílá náhodné vstupy a způsobuje na serveru svůj pohyb. Těchto simulovaných klientů můžeme spouštět libovolný počet. Každý naváže se serverem spojení a komunikuje s ním klasicky přes replikátor a ovladač. Můžeme tak snadno měřit, jak se zatížení projeví v síti, a zároveň můžeme využít nástroje jako tc pro různé podmínky. Na obrázku \ref{fig:playerbenchmark} vidíme 301 hráčů, kde 300 je simulovaných individuálních připojení a jeden je náš hráč. Server počítal každý snímek dlouho, asi 250ms, ale zátěž zvládl. Dalším krokem bylo zvýšit počet snímku za sekundu pro stovky hráčů.
\begin{figure}
\begin{center}
\centering
\includegraphics[width=0.5\textwidth]{graphics/playerbenchmark.png}
\end{center}
\label{playerbenchmark}
\label{fig:playerbenchmark}
\caption{301 připojených hráčů}
\end{figure}
\subsubsection{Odesílání}
Nejprve představím, jak jsem navrhnul odesílání zpráv. Na obrázku vidíme, celou architekturu. Vidíme dvě velké komponenty, a to Network Sender a Player Session Registry. První komponenta je celá logika, která práci posílání zpráv organizuje. Vytahuje z fronty zprávy, které pomocí Message Serializeru převede na rámce. Reliability System je jednotka, která určuje, které rámce budou v dalším datagramu. Důvod je ten, aby se kontrolovali rámce, pro které nemáme ACK a prioritizovalo se jejich odeslání. Výstupem Reliability System je tedy přímo sestavený datagram. To kdo a jak sestavuje datagram z rámců je detail.
\subsection{Optimalizace replikátoru}
Test s 301 hráči odhalil nedostatečný výkon serveru. Pomocí Tracy jsme začali program analyzovat. Na obrázku \ref{fig:tracyreplicator} vidíme, že pouze aktualizace replikátoru trvá každý snímek kolem 100ms. Pro představu, pokud bychom chtěli, aby server integroval 20 krát za sekundu, museli bychom všechno, nejen aktualizaci replikátoru, stihnout do 50 milisekund. Proto je aktuální stav nepřijatelně dlouhá doba. Úzké hrdlo najednou nebyla síť, ale příprava smysluplných dat, kterými síť zatížíme. Soustředili jsme další optimalizace právě na replikátor.
\begin{figure}
\begin{center}
\includegraphics[width=1\textwidth]{graphics/OutboundArchitecture}
\end{center}
\centering
\includegraphics[width=1\textwidth]{graphics/300playerstrace.png}
\label{fig:tracyreplicator}
\caption{Analýza replikátoru}
\end{figure}
\subsubsection{Čtení}
Z analýzy vyšlo najevo, že problém je skládání zprávy. Tedy vkládání pozic entit, o které se klient zajímá, do objektu. Je to právě tento objekt, který se serializuje přes ProtoBuf a odesílá skrze soket na klienta.
Replikátor pro každého klienta zjistil jeho zájem a pro každou entitu v něm vyhledával jeho komponenty. Vyhledávání je v případě Entt v $O(1)$. Začali jsme měřit i jiná řešení. Rozhodli jsme optimalizovat pro ECS architekturu. Vytvořili jsme buffer instancí zpráv pro každého klienta. Přes komponentu, kterou jsme chtěli replikovat, jsme vytvořili Entt pohled a iterovali. Pro každý prvek jsem komponentu zapsali do zprávy pro každého klienta, kterého zajímala. Výslednou analýzu vidíme na obrázku \ref{fig:ecs_optimization_tracy_01}. Optimalizace snížila dobu, kterou trvá aktualizace replikátoru, na polovinu.
\begin{figure}
\centering
\includegraphics[width=1\textwidth]{graphics/ecs_optimization_tracy_01.png}
\label{fig:ecs_optimization_tracy_01}
\caption{Analýza optimalizace replikátoru pro ECS}
\end{figure}
\begin{figure}
\centering
\includegraphics[width=1\textwidth]{graphics/ecs_optimization_tracy_02.png}
\label{fig:ecs_optimization_tracy_02}
\caption{Analýza optimalizace replikátoru pro ECS}
\end{figure}
Replikátor jsme začali analyzovat do větších detailů. Na obrázku \ref{fig:ecs_optimization_tracy_02} vidíme, které jeho části zabrali jakou dobu. Zjistili jsme, že problém byl samotný ProtoBuf. Formát je podobně jako JSON orientovaný na strukturu objektů. V našem případě je ale zpráva pro snapshot světa primitivní. Rozhodli jsme udělat porovnání s FlatBuffers. V testu jsme simulovali 100 snímků, tak, abychom si mohli dopředu alokovat všechnu potřebnou paměť, kterou můžeme mezi snímky využívat. Dopředu si vytvoříme vektor pozic, které v testu budeme serializovat. Stejně jako v replikátoru používáme architekturu orientovanou na ECS a procházíme všechny pozice, ty pak umisťujeme do alokovaných bloků paměti pro každého klienta a simulujeme tak skládání rámců, které můžeme odesílat. Všimli jsme si, že v případě primitivní zprávy, jako je snapshot stavu světa, by nám stačila klasická funkce ze standartní C knihovny zvaná \kiinlinecode{cpp}{!}{memcpy} a do testu jsme ji zařadili. Výsledky vidíme v tabulce \ref{table:serialization_comparison}.
\begin{figure}
\begin{center}
\begin{tabular}{ | m{5em} | m{3cm}| m{3cm} | m{3cm} | }
\hline
& ProtoBuf & FlatBuffers & Memcpy \\
\hline
Čas (s) & 9.455691762 & 10.345692894 & 0.754350866 \\
\hline
\end{tabular}
\label{table:serialization_comparison}
\caption{Porovnání serializátorů}
\end{center}
\end{figure}
Zjistili jsme, že problémem byl ProtoBuf a FlatBuffers by nám nepomohl. Nikoho nepřekvapí, že memcpy byl nejrychlejší. Rozhodli jsme se tedy, že budeme pro serializaci a deserializaci snapshotů světa používat vlastní enkodér a dekodér.
Pro kódování jsme využili už existující \kiinlinecode{cpp}{!}{ByteBuffer}, který umožňuje snadné kódování po bytech do vektoru. Třída \kiinlinecode{cpp}{!}{WorldStateWriter} obsahuje konkrétní kódování pro tyto zprávy a přes konstruktor je nutné předat instanci \kiinlinecode{cpp}{!}{ByteBuffer}.
Zpráva obsahuje hlavičku, ve které je počet aktualizovaných entit a počet nových entit. Počet odebraných entit můžeme vynechat, ten jsme schopni zjistit z délky zprávy a zbylých počtů.
\subsection{Optimalizace manažera zájmů}
Další na řadě byla optimalizace manažera zájmů, který trval každý snímek kolem 60 milisekund. Nejprve jsme se rozhodli přidat datové struktury. Druhým cílem bylo zlepšit API, kterým se replikátor dotazuje, jestli je entita pro klienta zajímavá.
Jedna s datových struktur, která má nízkou složitost pro dotaz na seznam entit ve vzdálenosti maximálně, je klasická mřížka. Charakteristika hráčů ve hrách je, že se hodně pohybují. Mřížka nepotřebuje žádný přepočet, pouze vložit do předem alokovaného bufferu, nebo z něj naopak odebrat.
Testovali jsme 4 implementace, z toho 3 různé datové struktury a jednou naivní přístup. Simulovali jsme pohyb 100 000 různých entit po dobu 100 snímků. Všechny možnosti představíme. Naivní přístup využívá pouze Pythagorovu větu, aby získal vzdálenost dvou bodů. Jediná optimalizace je vynechat odmocninu a umocnit místo toho vzdálenost. Druhá a třetí implementace využívá mřížku a entity rozděluje do svých polí. Fixní mřížka je vhodná pro světy, které nemění svou velikost, jako např. World of Warcraft. Naopak hashovací mřížka přiřazuje entity do polí pomocí hashe jejich pozice. Jsou tak ideální pro dynamické a potencionálně nekonečné světy, jako např. Minecraft. Poslední je quad tree. Jedná se o obdobu binárního stromu rozšířenou o rozměr. V tabulce \ref{table:range_query_comparison} vidíme výsledky testu. Quad tree implementace se ukázala jako nevhodná. S přibývající hloubkou je navíc pomalejší. Ideální se ukázali varianty s fixní a hashovací mřížkou.
\begin{figure}
\begin{center}
\begin{tabular}{ | m{5em} | m{3cm} | m{3cm} | m{3cm} | }
\hline
Název testu & Celkový čas & Čas vkládání & Čas dotazování \\
\hline
Naivní & 38770 & 0 & 38650 (99.96\%) \\
\hline
Fixní mřížka & 467 & 301 (64.56\%) & 17 (3.74\%) \\
\hline
Hashovací mřížka & 1070 & 736.63 (68.76\%) & 42 (3.93\%) \\
\hline
Quad tree & 1830 & 1560 (85.45\%) & 30.29 (1.66\%) \\
\hline
\end{tabular}
\label{table:range_query_comparison}
\caption{Porovnání algoritmů}
\end{center}
\end{figure}
\subsection{Optimalizace QUICr}
Představím architekturu přijímání zpráv. Opět vidíme registr spojení. Když nám ze sítě přijde nový datagram, přepošleme ho do reliability systému. Ten z něj vytvoří rámce a pošle do Frame Routeru. Zodpovědnost Frame Routeru je třídit rámce podle toho, jestli se má serializovat na zprávu, nebo jestli je to tzv. ovládací rámec. Příklad ovládacích rámců je třeba HELLO, HELLO\_ACK, nebo CRYPTO. Handshake handler si poté drží stav handshaků a v případě, že některý dokončil, registruje v Player Session Registry novou session.
% #image("InboundArchitecture.png")
\subsubsection{Šifrování}
+92 -89
View File
@@ -1,96 +1,99 @@
\babel@toc {czech}{}\relax
\contentsline {section}{\numberline {1}Úvod}{9}{section.1}%
\contentsline {section}{\numberline {2}Distribuované systémy}{10}{section.2}%
\contentsline {subsection}{\numberline {2.1}Komunikace v síti}{10}{subsection.2.1}%
\contentsline {subsection}{\numberline {2.2}TCP/IP}{11}{subsection.2.2}%
\contentsline {subsection}{\numberline {2.3}Architektury}{12}{subsection.2.3}%
\contentsline {subsubsection}{\numberline {2.3.1}Klient-Server}{12}{subsubsection.2.3.1}%
\contentsline {subsubsection}{\numberline {2.3.2}Peer-to-Peer}{12}{subsubsection.2.3.2}%
\contentsline {subsection}{\numberline {2.4}Rodina protokolů TCP/IP}{12}{subsection.2.4}%
\contentsline {subsection}{\numberline {2.5}Protokoly v transportní vrstvě}{13}{subsection.2.5}%
\contentsline {subsubsection}{\numberline {2.5.1}Sockety}{13}{subsubsection.2.5.1}%
\contentsline {subsubsection}{\numberline {2.5.2}TCP}{13}{subsubsection.2.5.2}%
\contentsline {subsubsection}{\numberline {2.5.3}Spolehlivost}{14}{subsubsection.2.5.3}%
\contentsline {subsubsection}{\numberline {2.5.4}UDP}{14}{subsubsection.2.5.4}%
\contentsline {subsubsection}{\numberline {2.5.5}QUIC}{15}{subsubsection.2.5.5}%
\contentsline {subsection}{\numberline {2.6}Protokoly v aplikační vrstvě}{16}{subsection.2.6}%
\contentsline {subsubsection}{\numberline {2.6.1}HTTP}{16}{subsubsection.2.6.1}%
\contentsline {subsubsection}{\numberline {2.6.2}HTTP/3}{16}{subsubsection.2.6.2}%
\contentsline {subsubsection}{\numberline {2.6.3}gRPC}{16}{subsubsection.2.6.3}%
\contentsline {subsubsection}{\numberline {2.6.4}Middleware}{17}{subsubsection.2.6.4}%
\contentsline {subsection}{\numberline {2.7}Posílání zpráv}{17}{subsection.2.7}%
\contentsline {subsubsection}{\numberline {2.7.1}Serializace}{17}{subsubsection.2.7.1}%
\contentsline {subsubsection}{\numberline {2.7.2}Kódování zpráv}{18}{subsubsection.2.7.2}%
\contentsline {subsubsection}{\numberline {2.7.3}Implementace}{19}{subsubsection.2.7.3}%
\contentsline {subsubsection}{\numberline {2.7.4}Detekce a náprava chyb}{19}{subsubsection.2.7.4}%
\contentsline {subsection}{\numberline {2.8}Asynchroní IO}{20}{subsection.2.8}%
\contentsline {subsubsection}{\numberline {2.8.1}ZeroMQ}{20}{subsubsection.2.8.1}%
\contentsline {subsubsection}{\numberline {2.8.2}Work stealing}{20}{subsubsection.2.8.2}%
\contentsline {subsubsection}{\numberline {2.8.3}Async/Await}{20}{subsubsection.2.8.3}%
\contentsline {subsubsection}{\numberline {2.8.4}Boost Asio}{21}{subsubsection.2.8.4}%
\contentsline {subsubsection}{\numberline {2.8.5}Stack pointer}{21}{subsubsection.2.8.5}%
\contentsline {subsection}{\numberline {2.9}Metriky}{22}{subsection.2.9}%
\contentsline {subsubsection}{\numberline {2.9.1}TimescaleDB}{22}{subsubsection.2.9.1}%
\contentsline {subsubsection}{\numberline {2.9.2}Grafana}{22}{subsubsection.2.9.2}%
\contentsline {subsubsection}{\numberline {2.9.3}ImGui}{22}{subsubsection.2.9.3}%
\contentsline {subsubsection}{\numberline {2.9.4}Tracy}{22}{subsubsection.2.9.4}%
\contentsline {subsubsection}{\numberline {2.9.5}Konkrétní metriky}{23}{subsubsection.2.9.5}%
\contentsline {subsubsection}{\numberline {2.9.6}Sbírání v reálném čase}{23}{subsubsection.2.9.6}%
\contentsline {section}{\numberline {3}Hra pro více hráčů}{24}{section.3}%
\contentsline {subsection}{\numberline {3.1}Hry}{24}{subsection.3.1}%
\contentsline {subsubsection}{\numberline {3.1.1}Entt}{24}{subsubsection.3.1.1}%
\contentsline {subsection}{\numberline {3.2}Svět}{25}{subsection.3.2}%
\contentsline {subsubsection}{\numberline {3.2.1}Ovladač pro hru jednoho hráče}{26}{subsubsection.3.2.1}%
\contentsline {subsubsection}{\numberline {3.2.2}Ovladač pro hru více hráčů}{26}{subsubsection.3.2.2}%
\contentsline {subsection}{\numberline {3.3}Klient-Server architektura}{26}{subsection.3.3}%
\contentsline {subsection}{\numberline {3.4}Server}{27}{subsection.3.4}%
\contentsline {subsubsection}{\numberline {3.4.1}Registr spojení}{27}{subsubsection.3.4.1}%
\contentsline {subsubsection}{\numberline {3.4.2}Replikátor}{27}{subsubsection.3.4.2}%
\contentsline {subsubsection}{\numberline {3.4.3}Interest manager}{27}{subsubsection.3.4.3}%
\contentsline {subsection}{\numberline {3.5}Klient}{28}{subsection.3.5}%
\contentsline {subsubsection}{\numberline {3.5.1}Replicator controller}{28}{subsubsection.3.5.1}%
\contentsline {subsubsection}{\numberline {3.5.2}Interpolace}{28}{subsubsection.3.5.2}%
\contentsline {subsubsection}{\numberline {3.5.3}Rollback a simulace vlastního hráče}{28}{subsubsection.3.5.3}%
\contentsline {subsection}{\numberline {3.6}Komunikační protokol}{29}{subsection.3.6}%
\contentsline {subsection}{\numberline {3.7}Protokol QUICr}{29}{subsection.3.7}%
\contentsline {subsubsection}{\numberline {3.7.1}Frame}{30}{subsubsection.3.7.1}%
\contentsline {subsubsection}{\numberline {3.7.2}Handshake}{30}{subsubsection.3.7.2}%
\contentsline {subsubsection}{\numberline {3.7.3}Spolehlivost}{31}{subsubsection.3.7.3}%
\contentsline {subsubsection}{\numberline {3.7.4}Enkodér}{32}{subsubsection.3.7.4}%
\contentsline {subsubsection}{\numberline {3.7.5}Testová}{32}{subsubsection.3.7.5}%
\contentsline {subsubsection}{\numberline {3.7.6}Odesílání}{33}{subsubsection.3.7.6}%
\contentsline {subsubsection}{\numberline {3.7.7}Čtení}{35}{subsubsection.3.7.7}%
\contentsline {subsubsection}{\numberline {3.7.8}Šifrování}{35}{subsubsection.3.7.8}%
\contentsline {subsubsection}{\numberline {3.7.9}SPR-6}{35}{subsubsection.3.7.9}%
\contentsline {subsubsection}{\numberline {3.7.10}Lockstep}{35}{subsubsection.3.7.10}%
\contentsline {subsubsection}{\numberline {3.7.11}Congestion control}{35}{subsubsection.3.7.11}%
\contentsline {subsubsection}{\numberline {3.7.12}Bandwidth control}{35}{subsubsection.3.7.12}%
\contentsline {subsection}{\numberline {3.8}Sharding}{36}{subsection.3.8}%
\contentsline {subsection}{\numberline {3.9}Komprese}{36}{subsection.3.9}%
\contentsline {subsubsection}{\numberline {3.9.1}Bit Buffer}{36}{subsubsection.3.9.1}%
\contentsline {subsubsection}{\numberline {3.9.2}Komprese QUICr}{36}{subsubsection.3.9.2}%
\contentsline {subsubsection}{\numberline {3.9.3}Komprese protokolu replikátoru}{36}{subsubsection.3.9.3}%
\contentsline {section}{\numberline {4}Styly pro psaní bakalářských a diplomových prací}{36}{section.4}%
\contentsline {subsection}{\numberline {4.1}Požadavky a podprovaná prostředí}{36}{subsection.4.1}%
\contentsline {subsection}{\numberline {4.2}Přepínače}{37}{subsection.4.2}%
\contentsline {subsection}{\numberline {4.3}Geometrie stránky}{40}{subsection.4.3}%
\contentsline {section}{\numberline {5}Sazba částí dokumentu}{40}{section.5}%
\contentsline {subsection}{\numberline {5.1}Sazba úvodní strany či obsahu}{40}{subsection.5.1}%
\contentsline {subsection}{\numberline {5.2}Závěry}{40}{subsection.5.2}%
\contentsline {subsection}{\numberline {5.3}Matematika}{40}{subsection.5.3}%
\contentsline {subsection}{\numberline {5.4}Sazba literatury}{41}{subsection.5.4}%
\contentsline {subsubsection}{\numberline {5.4.1}Sazba bibliografie přes \textsc {Bib}\LaTeX {}}{41}{subsubsection.5.4.1}%
\contentsline {subsubsection}{\numberline {5.4.2}Manuální sazba bibliografie}{41}{subsubsection.5.4.2}%
\contentsline {subsection}{\numberline {5.5}Drobná makra}{41}{subsection.5.5}%
\contentsline {subsection}{\numberline {5.6}Sazba rejstříku}{42}{subsection.5.6}%
\contentsline {subsection}{\numberline {5.7}Sazba zdrojových kódů}{42}{subsection.5.7}%
\contentsline {section}{Z\'av\v er}{46}{section*.3}%
\contentsline {subsection}{\numberline {2.1}Počítačové sítě}{10}{subsection.2.1}%
\contentsline {subsection}{\numberline {2.2}Komunikace v síti}{11}{subsection.2.2}%
\contentsline {subsection}{\numberline {2.3}Rodina protokolů TCP/IP}{11}{subsection.2.3}%
\contentsline {subsection}{\numberline {2.4}Protokoly v aplikační vrstvě}{12}{subsection.2.4}%
\contentsline {subsubsection}{\numberline {2.4.1}Middleware}{13}{subsubsection.2.4.1}%
\contentsline {subsubsection}{\numberline {2.4.2}HTTP}{13}{subsubsection.2.4.2}%
\contentsline {subsubsection}{\numberline {2.4.3}HTTP/3}{13}{subsubsection.2.4.3}%
\contentsline {subsubsection}{\numberline {2.4.4}gRPC}{14}{subsubsection.2.4.4}%
\contentsline {subsubsection}{\numberline {2.4.5}Internet protocol}{14}{subsubsection.2.4.5}%
\contentsline {subsection}{\numberline {2.5}Protokoly v transportní vrstvě}{14}{subsection.2.5}%
\contentsline {subsubsection}{\numberline {2.5.1}TCP}{14}{subsubsection.2.5.1}%
\contentsline {subsubsection}{\numberline {2.5.2}Spolehlivost}{14}{subsubsection.2.5.2}%
\contentsline {subsubsection}{\numberline {2.5.3}UDP}{15}{subsubsection.2.5.3}%
\contentsline {subsubsection}{\numberline {2.5.4}QUIC}{15}{subsubsection.2.5.4}%
\contentsline {subsection}{\numberline {2.6}Asynchroní IO}{17}{subsection.2.6}%
\contentsline {subsubsection}{\numberline {2.6.1}ZeroMQ}{17}{subsubsection.2.6.1}%
\contentsline {subsubsection}{\numberline {2.6.2}Work stealing}{17}{subsubsection.2.6.2}%
\contentsline {subsubsection}{\numberline {2.6.3}Async/Await}{17}{subsubsection.2.6.3}%
\contentsline {subsubsection}{\numberline {2.6.4}Boost Asio}{18}{subsubsection.2.6.4}%
\contentsline {subsubsection}{\numberline {2.6.5}Stack pointer}{18}{subsubsection.2.6.5}%
\contentsline {subsection}{\numberline {2.7}Architektury}{20}{subsection.2.7}%
\contentsline {subsubsection}{\numberline {2.7.1}Klient-Server}{20}{subsubsection.2.7.1}%
\contentsline {subsubsection}{\numberline {2.7.2}Peer-to-Peer}{20}{subsubsection.2.7.2}%
\contentsline {section}{\numberline {3}Hra pro více hráčů}{20}{section.3}%
\contentsline {subsection}{\numberline {3.1}Hry}{20}{subsection.3.1}%
\contentsline {subsubsection}{\numberline {3.1.1}Entt}{21}{subsubsection.3.1.1}%
\contentsline {subsection}{\numberline {3.2}Svět}{22}{subsection.3.2}%
\contentsline {subsubsection}{\numberline {3.2.1}Ovladač pro hru jednoho hráče}{22}{subsubsection.3.2.1}%
\contentsline {subsubsection}{\numberline {3.2.2}Ovladač pro hru více hráčů}{22}{subsubsection.3.2.2}%
\contentsline {subsection}{\numberline {3.3}Klient-Server architektura}{22}{subsection.3.3}%
\contentsline {subsection}{\numberline {3.4}Posílání zpráv}{23}{subsection.3.4}%
\contentsline {subsubsection}{\numberline {3.4.1}Serializace}{23}{subsubsection.3.4.1}%
\contentsline {subsubsection}{\numberline {3.4.2}Kódování zpráv}{25}{subsubsection.3.4.2}%
\contentsline {subsubsection}{\numberline {3.4.3}Implementace}{25}{subsubsection.3.4.3}%
\contentsline {subsubsection}{\numberline {3.4.4}Detekce a náprava chyb}{25}{subsubsection.3.4.4}%
\contentsline {subsection}{\numberline {3.5}Server}{26}{subsection.3.5}%
\contentsline {subsubsection}{\numberline {3.5.1}Registr spojení}{26}{subsubsection.3.5.1}%
\contentsline {subsubsection}{\numberline {3.5.2}Replikátor}{26}{subsubsection.3.5.2}%
\contentsline {subsubsection}{\numberline {3.5.3}Správa zájmů}{26}{subsubsection.3.5.3}%
\contentsline {subsection}{\numberline {3.6}Klient}{27}{subsection.3.6}%
\contentsline {subsubsection}{\numberline {3.6.1}Replicator controller}{27}{subsubsection.3.6.1}%
\contentsline {subsubsection}{\numberline {3.6.2}Interpolace}{27}{subsubsection.3.6.2}%
\contentsline {subsubsection}{\numberline {3.6.3}Rollback a simulace vlastního hráče}{27}{subsubsection.3.6.3}%
\contentsline {subsection}{\numberline {3.7}Metriky}{28}{subsection.3.7}%
\contentsline {subsubsection}{\numberline {3.7.1}TimescaleDB}{28}{subsubsection.3.7.1}%
\contentsline {subsubsection}{\numberline {3.7.2}Grafana}{28}{subsubsection.3.7.2}%
\contentsline {subsubsection}{\numberline {3.7.3}ImGui}{28}{subsubsection.3.7.3}%
\contentsline {subsubsection}{\numberline {3.7.4}Tracy}{29}{subsubsection.3.7.4}%
\contentsline {subsubsection}{\numberline {3.7.5}Konkrétní metriky}{29}{subsubsection.3.7.5}%
\contentsline {subsubsection}{\numberline {3.7.6}Sbírání v reálném čase}{29}{subsubsection.3.7.6}%
\contentsline {subsection}{\numberline {3.8}Protokol QUICr}{29}{subsection.3.8}%
\contentsline {subsubsection}{\numberline {3.8.1}Frame}{30}{subsubsection.3.8.1}%
\contentsline {subsubsection}{\numberline {3.8.2}Handshake}{31}{subsubsection.3.8.2}%
\contentsline {subsubsection}{\numberline {3.8.3}Spolehlivost}{32}{subsubsection.3.8.3}%
\contentsline {subsubsection}{\numberline {3.8.4}Enkodér}{33}{subsubsection.3.8.4}%
\contentsline {subsubsection}{\numberline {3.8.5}Testování}{33}{subsubsection.3.8.5}%
\contentsline {subsubsection}{\numberline {3.8.6}Měře}{33}{subsubsection.3.8.6}%
\contentsline {subsection}{\numberline {3.9}Optimalizace replikátoru}{34}{subsection.3.9}%
\contentsline {subsection}{\numberline {3.10}Optimalizace manažera zájmů}{38}{subsection.3.10}%
\contentsline {subsection}{\numberline {3.11}Optimalizace QUICr}{38}{subsection.3.11}%
\contentsline {subsubsection}{\numberline {3.11.1}Šifrování}{38}{subsubsection.3.11.1}%
\contentsline {subsubsection}{\numberline {3.11.2}SPR-6}{38}{subsubsection.3.11.2}%
\contentsline {subsubsection}{\numberline {3.11.3}Lockstep}{39}{subsubsection.3.11.3}%
\contentsline {subsubsection}{\numberline {3.11.4}Congestion control}{39}{subsubsection.3.11.4}%
\contentsline {subsubsection}{\numberline {3.11.5}Bandwidth control}{39}{subsubsection.3.11.5}%
\contentsline {subsection}{\numberline {3.12}Sharding}{39}{subsection.3.12}%
\contentsline {subsection}{\numberline {3.13}Komprese}{39}{subsection.3.13}%
\contentsline {subsubsection}{\numberline {3.13.1}Bit Buffer}{39}{subsubsection.3.13.1}%
\contentsline {subsubsection}{\numberline {3.13.2}Komprese QUICr}{39}{subsubsection.3.13.2}%
\contentsline {subsubsection}{\numberline {3.13.3}Komprese protokolu replikátoru}{39}{subsubsection.3.13.3}%
\contentsline {section}{\numberline {4}Styly pro psaní bakalářských a diplomových prací}{40}{section.4}%
\contentsline {subsection}{\numberline {4.1}Požadavky a podprovaná prostředí}{40}{subsection.4.1}%
\contentsline {subsection}{\numberline {4.2}Přepínače}{40}{subsection.4.2}%
\contentsline {subsection}{\numberline {4.3}Geometrie stránky}{43}{subsection.4.3}%
\contentsline {section}{\numberline {5}Sazba částí dokumentu}{43}{section.5}%
\contentsline {subsection}{\numberline {5.1}Sazba úvodní strany či obsahu}{43}{subsection.5.1}%
\contentsline {subsection}{\numberline {5.2}Závěry}{43}{subsection.5.2}%
\contentsline {subsection}{\numberline {5.3}Matematika}{43}{subsection.5.3}%
\contentsline {subsection}{\numberline {5.4}Sazba literatury}{44}{subsection.5.4}%
\contentsline {subsubsection}{\numberline {5.4.1}Sazba bibliografie přes \textsc {Bib}\LaTeX {}}{44}{subsubsection.5.4.1}%
\contentsline {subsubsection}{\numberline {5.4.2}Manuální sazba bibliografie}{44}{subsubsection.5.4.2}%
\contentsline {subsection}{\numberline {5.5}Drobná makra}{44}{subsection.5.5}%
\contentsline {subsection}{\numberline {5.6}Sazba rejstříku}{45}{subsection.5.6}%
\contentsline {subsection}{\numberline {5.7}Sazba zdrojových kódů}{45}{subsection.5.7}%
\contentsline {section}{Z\'av\v er}{49}{section*.3}%
\babel@toc {czech}{}\relax
\babel@toc {czech}{}\relax
\contentsline {section}{Conclusions}{47}{section*.5}%
\contentsline {section}{Conclusions}{50}{section*.5}%
\babel@toc {english}{}\relax
\babel@toc {czech}{}\relax
\contentsline {section}{\numberline {A}První příloha}{48}{appendix.A}%
\contentsline {section}{\numberline {B}Druhá příloha}{48}{appendix.B}%
\contentsline {section}{\numberline {C}Obsah elektronických dat}{48}{appendix.C}%
\contentsline {section}{Seznam zkratek}{50}{section*.7}%
\contentsline {section}{\numberline {A}První příloha}{51}{appendix.A}%
\contentsline {section}{\numberline {B}Druhá příloha}{51}{appendix.B}%
\contentsline {section}{\numberline {C}Obsah elektronických dat}{51}{appendix.C}%
\contentsline {section}{Seznam zkratek}{53}{section*.7}%
\contentsline {section}{Literatura}{54}{section*.8}%
\contentsline {section}{Rejst\v {r}\'{i}k}{54}{section*.10}%