diff --git a/Makefile b/Makefile index 1efe2a3..5ca8f3d 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,6 @@ export TEXINPUTS=../tex//: -all: vlna prace.pdf sighup +all: prace.pdf sighup # LaTeX je potreba spustit nekolikrat, aby spravne spocital odkazy prace.pdf: prace.tex $(wildcard *.tex) literatura.bib prace.xmpdata @@ -9,9 +9,6 @@ prace.pdf: prace.tex $(wildcard *.tex) literatura.bib prace.xmpdata pdflatex $< pdflatex $< -vlna: $(wildcard *.tex) - -vlna -l $^ - clean: rm -f *.log *.dvi *.aux *.toc *.lof *.lot *.out *.bbl *.blg *.xmpi *.lol rm -f prace.pdf diff --git a/csplainnat.bst b/czplainnat.bst similarity index 76% rename from csplainnat.bst rename to czplainnat.bst index d5a598b..6c56ac3 100644 --- a/csplainnat.bst +++ b/czplainnat.bst @@ -1,21 +1,21 @@ -%% $Id$ -%% File: `csplainnat.bst' for use with natbib package -%% This is a modification of `plainnat.bst' for Czech references style -%% (According to "CSN ISO 690: Bibliograficke citace. Obsah, forma a struktura"). -%% Some modifications are commented, look for the keyword 'CHANGE' -%% For more detailed info use svn repository svn://kraken.pedf.cuni.cz/csplainnat/ +%% File: `plainnat.bst' +%% A modification of `plain.bst' for use with natbib package %% -%% Original plainnat.bst by Patrick W Daly -%% Modifications by David Mudr{\'{a}}k mudrd8mz@uxit.pedf.cuni.cz -%% -%% MAJOR MODIFICATIONS -%% * Added "@ONLINE" item type with added "cited" field. +%% Copyright 1993-2007 Patrick W Daly +%% Max-Planck-Institut f\"ur Sonnensystemforschung +%% Max-Planck-Str. 2 +%% D-37191 Katlenburg-Lindau +%% Germany +%% E-mail: daly@mps.mpg.de %% %% This program can be redistributed and/or modified under the terms %% of the LaTeX Project Public License Distributed from CTAN %% archives in directory macros/latex/base/lppl.txt; either %% version 1 of the License, or any later version. %% + % Version and source file information: + % \ProvidesFile{natbst.mbs}[2007/11/26 1.93 (PWD)] + % % BibTeX `plainnat' family % version 0.99b for BibTeX versions 0.99a or later, % for LaTeX versions 2.09 and 2e. @@ -72,7 +72,6 @@ ENTRY url volume year - cited } {} { label extra.label sort.label short.list } @@ -86,7 +85,7 @@ FUNCTION {init.state.consts} #3 'after.block := } -STRINGS { s t t1 t2 } % CHANGE mudrd8mz 2005-10-12 adding t1, t2 +STRINGS { s t } FUNCTION {output.nonnull} { 's := @@ -212,37 +211,39 @@ FUNCTION {emphasize} if$ } -FUNCTION {capitalize} % CHANGE mudrd8mz 2005-10-12 adding new function -{ - duplicate$ empty$ +FUNCTION {embolden} %% FUNCTION added by AK +{ duplicate$ empty$ { pop$ "" } - { "{\sc " swap$ * "}" * } %{ "u" change.case$ } + { "{\bf " swap$ * "}" * } if$ } +FUNCTION {scshape} %% FUNCTION added by AK +{ duplicate$ empty$ + { pop$ "" } + { "{\sc " swap$ * "}" * } + if$ +} INTEGERS { nameptr namesleft numnames } -FUNCTION {format.names.full} +FUNCTION {format.names} { 's := #1 'nameptr := s num.names$ 'numnames := numnames 'namesleft := { namesleft #0 > } - { s nameptr "{ll}" format.name$ 't1 := % CHANGE mudrd8mz 2005-10-12 - t1 capitalize 't1 := % CHANGE mudrd8mz 2005-10-12 - s nameptr "{, f.}{~j.}" format.name$ 't2 := % CHANGE mudrd8mz 2005-10-12 - t1 t2 * 't := + { s nameptr "{vv~}{ll}{, jj}{, f.}" format.name$ 't := %% {ff~}{vv~}{ll}{, jj} changed to {vv~}{ll}{, jj}{, f.} by AK nameptr #1 > { namesleft #1 > - { " -- " * t * } % CHANGE mudrd8mz 2005-10-13 : adding "--" + { ", " * t * } { numnames #2 > - { "" * } % CHANGE mudrd8mz 2005-10-12 + { "" * } %% { "," * } changed to { "" * } by AK (on suggestion by MK) 'skip$ if$ - t "OTHERS" = % CHANGE mudrd8mz 2005-10-12 because of capitalize - { " et~al." * } - { " -- " * t * } % CHANGE mudrd8mz 2005-10-12 : between the last and the one before + t "others" = + { " a~kol." * } %% et~al. changed to a~kol. by AK + { " {\rm a} " * t * } %% and changed to {\rm a} by AK if$ } if$ @@ -255,22 +256,6 @@ FUNCTION {format.names.full} while$ } -FUNCTION {format.names.short} % CHANGE mudrd8mz 2005-10-14 adding more authors version -{ 's := - s #1 "{ll}" format.name$ 't1 := - t1 capitalize 't1 := - s #1 "{, f.}{~j.}" format.name$ 't2 := - t1 t2 * " et~al." * -} - -FUNCTION {format.names} -{ duplicate$ - num.names$ #3 > - {format.names.short} % pokud ma citace vice nez 3 autory, uvadi se pouze PRVNI et al. - {format.names.full} % pokud ma citace max 3 autory, uvadi se vsichni - if$ -} - FUNCTION {format.key} { empty$ { key field.or.null } @@ -281,17 +266,17 @@ FUNCTION {format.key} FUNCTION {format.authors} { author empty$ { "" } - { author format.names } + { author format.names scshape} %% scshape added by AK if$ } FUNCTION {format.editors} { editor empty$ { "" } - { editor format.names + { editor format.names scshape %% scshape added by AK editor num.names$ #1 > - { " (Ed.)" * } % CHANGE mudrd8mz 2005-10-12 - { " (Ed.)" * } + { ", editors" * } + { ", editor" * } if$ } if$ @@ -314,12 +299,10 @@ FUNCTION {format.issn} FUNCTION {format.url} { url empty$ { "" } - { new.block "Dostupn{\'{e}}~z: \url{{" url * "}}" * } + { new.block "URL \url{" url * "}" * } if$ } - - FUNCTION {format.doi} { doi empty$ { "" } @@ -330,11 +313,10 @@ FUNCTION {format.doi} FUNCTION {format.title} { title empty$ { "" } - { title } + { title "t" change.case$ } if$ } - FUNCTION {format.full.names} {'s := #1 'nameptr := @@ -349,12 +331,12 @@ FUNCTION {format.full.names} { ", " * t * } { numnames #2 > - { "," * } + { "" * } %% { "," * } changed to { "" * } by AK (on suggestion by MK) 'skip$ if$ t "others" = - { " et~al." * } - { ", " * t * } % CHANGE mudrd8mz 2005-10-12 + { " a~kol." * } %% et~al. changed to a~kol. by AK + { " a " * t * } %% and changed to a by AK if$ } if$ @@ -449,7 +431,7 @@ FUNCTION {n.dashify} FUNCTION {format.date} { year duplicate$ empty$ { "empty year in " cite$ * warning$ - pop$ "" } + pop$ " " } 'skip$ if$ month empty$ @@ -461,6 +443,34 @@ FUNCTION {format.date} extra.label * } +%%% Non-successful atempt to change the function format.date to produce year in brackets +%FUNCTION {format.date} +%{ year duplicate$ empty$ +% { "empty year in " cite$ * warning$ +% pop$ " " } +% { +% " (" * year * %% 'skip$ replaced by { "(" * year * } by AK +% } +% if$ +% month empty$ +% 'skip$ +% { month +% " " * swap$ * +% } +% if$ +% extra.label * ")" * %% extra.label * changed to extra.label * ")" * by AK +%} + +FUNCTION {output.year.check} %% function added by AK +{ year empty$ %% It replaces original format.date on most places below + { "empty year in " cite$ * warning$ } + { write$ + " (" year * extra.label * ")" * + mid.sentence 'output.state := + } + if$ +} + FUNCTION {format.btitle} { title emphasize } @@ -483,10 +493,10 @@ FUNCTION {either.or.check} FUNCTION {format.bvolume} { volume empty$ { "" } - { "" volume tie.or.space.connect % CHANGE mudrd8mz 2005-10-12 removing "volume" + { "volume" volume tie.or.space.connect series empty$ 'skip$ - { " / " * series emphasize * } % CHANGE mudrd8mz 2005-10-12 "of" --> "/" + { " of " * series emphasize * } if$ "volume and number" number either.or.check } @@ -498,13 +508,13 @@ FUNCTION {format.number.series} { number empty$ { series field.or.null } { output.state mid.sentence = - { "{\v{c}}." } % CHANGE mudrd8mz 2005-10-12 "{\v{c}}" instead of "number" - { "{\v{C}}." } + { "number" } + { "Number" } if$ number tie.or.space.connect series empty$ { "there's a number but no series in " cite$ * warning$ } - { " v " * series * } % CHANGE mudrd8mz 2005-10-12 "in" --> "v" + { " in " * series * } if$ } if$ @@ -550,8 +560,8 @@ FUNCTION {format.pages} { pages empty$ { "" } { pages multi.page.check - { "s." pages n.dashify tie.or.space.connect } % CHANGE mudrd8mz 2007-03-15: 'pages' -> 's.' - { "s." pages tie.or.space.connect } % CHANGE mudrd8mz 2007-03-15: 'pages' -> 's.' + { "pages" pages n.dashify tie.or.space.connect } + { "page" pages tie.or.space.connect } if$ } if$ @@ -565,10 +575,10 @@ FUNCTION {format.eid} } FUNCTION {format.vol.num.pages} -{ volume field.or.null +{ volume field.or.null embolden %% embolden added by AK number empty$ 'skip$ - { ", " number * * + { "\penalty0 (" number * ")" * * volume empty$ { "there's a number but no volume in " cite$ * warning$ } 'skip$ @@ -579,7 +589,7 @@ FUNCTION {format.vol.num.pages} 'skip$ { duplicate$ empty$ { pop$ format.pages } - { ", s.~" * pages n.dashify * } + { ", \penalty0 " * pages n.dashify * } %% { ":\penalty0 " * pages n.dashify * } changed to { ", \penalty0 " * pages n.dashify * } by AK if$ } if$ @@ -589,7 +599,7 @@ FUNCTION {format.vol.num.eid} { volume field.or.null number empty$ 'skip$ - { "\penalty0, " number * * + { "\penalty0 (" number * ")" * * volume empty$ { "there's a number but no volume in " cite$ * warning$ } 'skip$ @@ -610,7 +620,7 @@ FUNCTION {format.chapter.pages} { chapter empty$ 'format.pages { type empty$ - { "" } % CHANGE mudrd8mz 2008-04-08 removing the word "chapter" + { "chapter" } { type "l" change.case$ } if$ chapter tie.or.space.connect @@ -627,7 +637,7 @@ FUNCTION {format.in.ed.booktitle} { "" } { editor empty$ { "In " booktitle emphasize * } - { "In " format.editors * " " * booktitle emphasize * } % CHANGE mudrd8mz 2005-10-12 + { "In " format.editors * ", " * booktitle emphasize * } if$ } if$ @@ -646,7 +656,9 @@ FUNCTION {empty.misc.check} FUNCTION {format.thesis.type} { type empty$ 'skip$ - { pop$ type } % CHANGE mudrd8mz 2007-03-15: Do not lowercase the thesis type + { pop$ + type "t" change.case$ + } if$ } @@ -671,9 +683,9 @@ FUNCTION {format.article.crossref} { "In \emph{" journal * "}" * } if$ } - { "In " key * } + { "In " } if$ - " \citep{" * crossref * "}" * + " \citet{" * crossref * "}" * } FUNCTION {format.book.crossref} @@ -697,12 +709,12 @@ FUNCTION {format.book.crossref} { "\emph{" * series * "}" * } if$ } - { key * } + 'skip$ if$ } 'skip$ if$ - ", \citet{" * crossref * "}" * + " \citet{" * crossref * "}" * } FUNCTION {format.incoll.inproc.crossref} @@ -718,7 +730,7 @@ FUNCTION {format.incoll.inproc.crossref} { "In \emph{" booktitle * "}" * } if$ } - { "In " key * } + { "In " } if$ } { "In " } @@ -730,17 +742,19 @@ FUNCTION {article} { output.bibitem format.authors "author" output.check author format.key output + new.block %% added by AK + %format.date "year" output.check %% added by AK, commented later on + output.year.check %% added by AK as replacement of format.date new.block format.title "title" output.check new.block crossref missing$ { journal emphasize "journal" output.check - new.sentence - format.date "year" output.check eid empty$ { format.vol.num.pages output } { format.vol.num.eid output } if$ + %% format.date "year" output.check %% commented by AK } { format.article.crossref output.nonnull eid empty$ @@ -757,33 +771,6 @@ FUNCTION {article} fin.entry } -FUNCTION {online} % CHANGE mudrd8mz 2005-10-12 addign new item type -{ output.bibitem - format.authors output - new.block - format.btitle " [online]" * output - new.sentence - publisher missing$ - 'skip$ - { publisher output } - if$ - year missing$ - 'skip$ - { format.date "year" output.check } - if$ - new.sentence - cited missing$ - 'skip$ - { "[cit.~" cited * "]" * output } - if$ - new.sentence - note output - new.sentence - format.url output - fin.entry -} - - FUNCTION {book} { output.bibitem author empty$ @@ -797,28 +784,30 @@ FUNCTION {book} if$ } if$ + new.block %% added by AK + %format.date "year" output.check %% added by AK, commented later on + output.year.check %% added by AK as replacement of format.date new.block format.btitle "title" output.check crossref missing$ - { new.block - format.bvolume output + { format.bvolume output + new.block format.number.series output new.sentence - publisher - % address "~: " * publisher * % CHANGE mudrd8mz 2005-10-12 - "publisher" output.check + publisher "publisher" output.check + address output } { new.block format.book.crossref output.nonnull } if$ format.edition output - format.date "year" output.check + %% format.date "year" output.check %% commented by AK + format.isbn output format.doi output format.url output new.block note output - format.isbn output fin.entry } @@ -826,17 +815,20 @@ FUNCTION {booklet} { output.bibitem format.authors output author format.key output + new.block %% added by AK + %format.date "year" output.check %% added by AK, commented later on + output.year.check %% added by AK as replacement of format.date new.block format.title "title" output.check howpublished address new.block.checkb howpublished output address output - format.date output + %format.date output %% commented by AK + format.isbn output format.doi output format.url output new.block note output - format.isbn output fin.entry } @@ -853,6 +845,9 @@ FUNCTION {inbook} if$ } if$ + new.block %% added by AK + %format.date "year" output.check %% added by AK, commented later on + output.year.check %% added by AK as replacement of format.date new.block format.btitle "title" output.check crossref missing$ @@ -870,12 +865,12 @@ FUNCTION {inbook} } if$ format.edition output - format.date "year" output.check + %format.date "year" output.check %% commented by AK + format.isbn output format.doi output format.url output new.block note output - format.isbn output fin.entry } @@ -883,6 +878,9 @@ FUNCTION {incollection} { output.bibitem format.authors "author" output.check author format.key output + new.block %% added by AK + %format.date "year" output.check %% added by AK, commented later on + output.year.check %% added by AK as replacement of format.date new.block format.title "title" output.check new.block @@ -890,24 +888,21 @@ FUNCTION {incollection} { format.in.ed.booktitle "booktitle" output.check format.bvolume output format.number.series output - new.sentence - address ": " * publisher * % CHANGE mudrd8mz 2005-10-12 - "publisher" output.check - %publisher "publisher" output.check - %address output - format.edition output - format.date "year" output.check - new.sentence format.chapter.pages output + new.sentence + publisher "publisher" output.check + address output + format.edition output + %format.date "year" output.check %% commented by AK } { format.incoll.inproc.crossref output.nonnull format.chapter.pages output } if$ + format.isbn output format.doi output format.url output new.block - format.isbn output note output fin.entry } @@ -916,6 +911,9 @@ FUNCTION {inproceedings} { output.bibitem format.authors "author" output.check author format.key output + new.block %% added by AK + %format.date "year" output.check %% added by AK, commented later on + output.year.check %% added by AK as replacement of format.date new.block format.title "title" output.check new.block @@ -928,7 +926,7 @@ FUNCTION {inproceedings} { organization publisher new.sentence.checkb organization output publisher output - format.date "year" output.check + %format.date "year" output.check %% commented by AK } { address output.nonnull format.date "year" output.check @@ -942,10 +940,10 @@ FUNCTION {inproceedings} format.pages output } if$ + format.isbn output format.doi output format.url output new.block - format.isbn output note output fin.entry } @@ -956,13 +954,16 @@ FUNCTION {manual} { output.bibitem format.authors output author format.key output + new.block %% added by AK + %format.date "year" output.check %% added by AK, commented later on + output.year.check %% added by AK as replacement of format.date new.block format.btitle "title" output.check organization address new.block.checkb organization output address output format.edition output - format.date output + %format.date output %% added by AK format.url output new.block note output @@ -973,13 +974,16 @@ FUNCTION {mastersthesis} { output.bibitem format.authors "author" output.check author format.key output + new.block %% added by AK + %format.date "year" output.check %% added by AK, commented later on + output.year.check %% added by AK as replacement of format.date new.block format.title "title" output.check new.block "Master's thesis" format.thesis.type output.nonnull school "school" output.check address output - format.date "year" output.check + %format.date "year" output.check %% added by AK format.url output new.block note output @@ -990,11 +994,15 @@ FUNCTION {misc} { output.bibitem format.authors output author format.key output + new.block %% added by AK + %format.date "year" output.check %% added by AK, commented later on + output.year.check %% added by AK as replacement of format.date + new.block %% added by AK title howpublished new.block.checkb format.title output howpublished new.block.checka howpublished output - format.date output + %format.date output %% commented by AK format.issn output format.url output new.block @@ -1007,13 +1015,16 @@ FUNCTION {phdthesis} { output.bibitem format.authors "author" output.check author format.key output + new.block %% added by AK + %format.date "year" output.check %% added by AK, commented later on + output.year.check %% added by AK as replacement of format.date new.block format.btitle "title" output.check new.block "PhD thesis" format.thesis.type output.nonnull school "school" output.check address output - format.date "year" output.check + %format.date "year" output.check %% commented by AK format.url output new.block note output @@ -1024,19 +1035,22 @@ FUNCTION {proceedings} { output.bibitem format.editors output editor format.key output + new.block %% added by AK + %format.date "year" output.check %% added by AK, commented later on + output.year.check %% added by AK as replacement of format.date new.block format.btitle "title" output.check format.bvolume output format.number.series output address output - format.date "year" output.check + %format.date "year" output.check %% commented by AK new.sentence organization output publisher output + format.isbn output format.doi output format.url output new.block - format.isbn output note output fin.entry } @@ -1045,13 +1059,16 @@ FUNCTION {techreport} { output.bibitem format.authors "author" output.check author format.key output + new.block %% added by AK + %format.date "year" output.check %% added by AK, commented later on + output.year.check %% added by AK as replacement of format.date new.block format.title "title" output.check new.block format.tr.number output.nonnull institution "institution" output.check address output - format.date "year" output.check + %format.date "year" output.check %% commented by AK format.url output new.block note output @@ -1062,12 +1079,15 @@ FUNCTION {unpublished} { output.bibitem format.authors "author" output.check author format.key output + new.block %% added by AK + %format.date "year" output.check %% added by AK, commented later on + output.year.check %% added by AK as replacement of format.date new.block format.title "title" output.check - format.url output new.block note "note" output.check - format.date output + %format.date output %% commented by AK + format.url output fin.entry } @@ -1165,12 +1185,12 @@ FUNCTION {format.lab.names} s #1 "{vv~}{ll}" format.name$ s num.names$ duplicate$ #2 > - { pop$ " et~al." * } + { pop$ " a~kol." * } %% originally et~al. { #2 < 'skip$ { s #2 "{ff }{vv }{ll}{ jj}" format.name$ "others" = - { " et~al." * } - { " -- " * s #2 "{vv~}{ll}" format.name$ * } % CHANGE mudrd8mz 2005-10-12: changed "and" + { " a~kol." * } %% AK change + { " a " * s #2 "{vv~}{ll}" format.name$ * } %% AK change if$ } if$ @@ -1393,6 +1413,10 @@ FUNCTION {presort} if$ " " * + year field.or.null sortify + * + " " + * cite$ * #1 entry.max$ substring$ diff --git a/kap-generatory.tex b/kap-generatory.tex index e3e1d8e..6bab955 100644 --- a/kap-generatory.tex +++ b/kap-generatory.tex @@ -1,50 +1,46 @@ -\chapter{Staticky generované webové stránky} +\chapter{Staticky generovaný web} -Princip statické webové stránky sahá až ke vzniku WWW, kdy existovaly pouze stránky statické, tedy stránky nevytvářené dynamicky na základě různých proměnných a na uživatelském vstupu. U~statických webových stránek dochází k~vytvoření HTML kódu ve chvíli, kdy je změněn zdrojový obsah nebo kdy autor ručně spustí generátor. \citep{pcmag_static} +Princip statické webové stránky sahá až ke vzniku WWW, kdy existovaly pouze stránky statické, tedy stejné pro každého uživatele. Jejich obsah může být průběžně aktualizován, ovšem negenerují se zvlášť pro každého uživatele na základě různých proměnných. U statických webů tedy dochází k vytvoření čistého HTML ve chvíli, kdy je změněn zdrojový obsah, nebo kdy autor ručně spustí generátor. \citep{pcmag_static} -Dynamické stránky jsou generovány speciálně pro každého uživatele na základě jeho nastavení, různých vstupů, proměnných a dalších vlastností ovlivňujících výslednou podobu či obsah stránky. Ke generování dochází ve chvíli, kdy si uživatel stránku vyžádá, nikoliv předem, jako je tomu u~staticky generovaných stránek. \citep{pcmag_dynamic} +Dynamické stránky jsou generovány speciálně pro každého uživatele na základě jeho nastavení, různých vstupů, proměnných a dalších vlastností. Ke generování dochází ve chvíli, kdy si uživatel stránku vyžádá, nikoliv předem, jako je tomu u staticky generovaných stránek. \citep{pcmag_dynamic} \section{Výhody statických webových stránek}\label{kap:vyhody-statickych-webovych-stranek} -Pro sdílení statického obsahu mezi různé uživatele stačí velmi jednoduchý HTTP\footnote{Hypertext Transfer Protocol -- Internetový protokol sloužící ke komunikaci s~WWW servery.} server bez jakýchkoliv dalších modulů typu \textit{PHP}, \textit{Python} a dalších systémů\footnote{Jedná se o~programovací jazyky nejčasteji používané ke tvorbě dynamických webových aplikací.}, které by obsah dynamicky generovaly například z~dat přečtených z~databáze nebo z~uživatelského vstupu. Na straně serveru tedy nedochází ke zpracování obsahu těsně před jeho odesláním uživateli, čímž se v~komunikaci mezi klientem a serverem výrazně snižuje \uv{Time To First Byte\footnote{Time To First Byte -- Čas mezi odesláním požadavku a přijmutím prvního bajtu dat.}}, a tím dochází ke snížení celkové latence. \citep{mozttfb} +Pro sdílení statického obsahu mezi různé uživatele stačí velmi jednoduchý HTTP server bez jakýchkoliv dalších modulů typu \textit{PHP}, \textit{Python} a dalších systémů, které by obsah dynamicky generovaly například z dat vytažených z databáze, nebo z uživatelského vstupu. Na straně serveru tedy nedochází ke zpracování obsahu těsně před jeho odesláním uživateli, čímž se v komunikaci mezi klientem a serverem drasticky snižuje \uv{Time To First Byte}\footnote{Time To First Byte --- čas mezi odesláním požadavku a přijmutím prvního bajtu dat.} a tím dochází ke snížení celkové latence. \citep{mozttfb} -Snížení latence může pozitivně přispět ke spokojenosti uživatelů, což dokazuje nespočet výzkumů na toto téma, například analýza z~webového portálu Financial Times, kde se uvádí, že rychlost webové stránky negativně ovlivňuje hloubku jejího užívání, ať už je odezva sebemenší. Jak je zde rovněž uvedeno, data ukazují, že z~pohledu uživatelské spokojenosti a finančního dopadu existují jasné a důležité výhody při zrychlení webové stránky. Z~tohoto výzkumu se autoři rozhodli v~měsících po vydání analýzy investovat více času do úprav všech aspektů svých nových webových stránek s~cílem jejich zrychlení. \citep{financialtimes} +Snížení samotné latence může pozitivně přispět ke spokojenosti uživatelů, což dokazuje nespočet výzkumů na toto téma, například analýza z webového portálu Financial Times, kde se uvádí, že rychlost webové stránky negativně ovlivňuje hloubku jejího užívání, ať už je odezva sebemenší. Jak je zde rovněž uvedeno, data ukazují, že z pohledu uživatelské spokojenosti a finančního dopadu existují jasné a důležité výhody při zrychlení webové stránky. Z tohoto výzkumu se autoři rozhodli v měsících po vydání analýzy investovat více času do úprav všech aspektů jejich nové stránky FT.com s cílem jejího zrychlení.\todo{Nechat opravit překlad} -Eliminováním dynamického obsahu se také předchází nevyžádaným vstupům od uživatele, jež mohou být i cílené na prolomení bezpečnostních nedostatků webové aplikace a v~některých případech mohou vést k~úniku citlivých dat, převzetí kontroly útočníka nad webovou aplikací nebo celým serverem, podstrčení falešných dat uživateli a mnoha dalším běžným útokům. Statický web eliminuje tento problém, jelikož nemá žádný uživatelský vstup. +Eliminováním dynamického obsahu se také předchází nevyžádaným vstupům od uživatele, které mohou být i cílené na prolomení bezpečnostních nedostatků webové aplikace a v některých případech mohou vést k úniku citlivých dat, převzetí kontroly útočníka nad webovou aplikací nebo celým serverem, podstrčení falešných dat uživateli a mnoha dalším běžným útokům. Statický web eliminuje tento problém, jelikož nemá žádný uživatelský vstup. -Sledování a analýze nejčastějších chyb webových aplikací a serverů se věnuje organizace OWASP\footnote{The Open Web Application Security Project (\url{https://owasp.org/}).}, která vydává aktualizované seznamy a statistiky. Podle \cite{owasp2017} se v~roce 2017 objevovaly nejčastěji tyto chyby a bezpečnostní nedostatky: +Sledování a analýze nejčastějších chyb webových aplikací a serverů se věnuje organizace OWASP\footnote{The Open Web Application Security Project --- \url{https://owasp.org/}.}, která vydává aktualizované seznamy a statistiky. Podle OWASP byly v roce 2017 nejčastější tyto chyby a bezpečnostní nedostatky: \begin{enumerate} - \item injekce, - \item rozbitá autentizace, - \item odhalení citlivých dat, - \item XML External Entities (XXE), - \item nefunkční řízení přístupu, - \item špatná konfigurace zabezpečení, - \item Cross-Site Scripting (XSS), - \item nezabezpečená deserializace, - \item užívání komponent se známými zranitelnostmi, - \item nedostatečné logování a monitorování. + \item{Injekce} + \item{Rozbitá autentizace} + \item{Odhalení citlivých dat} + \item{XML External Entities (XXE)} + \item{Nefunkční řízení přístupu} + \item{Špatná konfigurace zabezpečení} + \item{Cross-Site Scripting (XSS)} + \item{Nezabezpečená deserializace} + \item{Užívání komponent se známými zranitelnostmi} + \item{Nedostatečné logování a monitorování} \end{enumerate} -Většina těchto chyb se vztahuje právě k~dynamickým webovým aplikacím. Bezpečnost tedy závisí nejen na programátorovi, jenž aplikaci vytváří, ale také na tom, že programovací jazyk je bezpečně implementován. To nelze tvrdit o~nejpoužívanějším jazyce PHP, který obsahuje mnoho chyb, viz statistika nalezených bezpečnostních děr na serveru \cite{cve_php}, který se tímto tématem zabývá. Jazyk zároveň nevede programátora k~psaní bezpečného kódu, což má za následek nebezpečené aplikace, pokud si autor nedá pozor na správné ošetření vstupů a dalších bezpečnostních aspektů programu. +\citep{owasp2017} -Podstatným příkladem chybovosti dynamických webů je systém Wordpress, v~němž jsou podle serveru \cite{cve_wordpress} každý rok nalezeny desítky bezpečnostních chyb, přičemž mnoho dalších přibývá s~instalací nezabezpečených rozšíření. Napří\-klad na začátku roku 2020 byla nalezena bezpečnostní chyba v~rozšíření využívaném na více než dvě stě tisících webových stránkách, která útočníkům umožňovala smazat obsah databáze \citep{thehackernews_wordpress_1}. Na konci roku 2019 umožnila chyba ve dvou neza\-bezpečených rozšířeních neautorizované přihlášení k~účtu administrátora bez použití hesla \citep{thehackernews_wordpress_2}. +Většina těchto chyb se vztahuje právě k dynamickým webovým aplikacím. Bezpečnost tedy závisí nejen na programátorovi který aplikaci vytváří, ale také na tom, že programovací jazyk je bezpečně implementován. To nelze tvrdit o nejpoužívanějším jazyce PHP, který nejen že obsahuje mnoho chyb, viz seznam nalezených bezpečnostních děr \citep{cve_php}, ale zároveň nevede programátora k psaní bezpečného kódu, což má za následek nebezpečené aplikace, pokud si autor nedá pozor na správné ošetření vstupů a dalších bezpečnostních aspektů programu. -Údržba velkých webových aplikací je často problematická. Kód je nutné udržovat v~návaznosti na aktualizace daného jazyka, databázového systému a dalších aspektů. Těmto aktualizacím se z~bezpečnostních důvodů nelze vyhýbat. Statický web nemusí udržovat funkční propojení s~databázemi a dalšími částmi systému, a je tedy mnohem méně náročný na dlouhodobou údržbu. Při zvolení správného generátoru není nutná ani údržba šablon a celý systém při zachování stejného prostředí nepřestane fungovat. Protože statický generátor nepracuje s~uživatelským vstupem, vyhýbá se bezpečnostním chybám a tím i nutným aktualizacím. +Podstatným příkladem chybovosti dynamických webů je systém Wordpress, ve kterém jsou každý rok nalezeny desítky bezpečnostních chyb \citep{cve_wordpress}, přičemž mnoho dalších přibývá s instalací rozšíření, která postrádají bezpečnostní prvky. Například na začátku roku 2020 byla nalezena bezpečnostní chyba v rozšíření, které bylo využíváno na více než dvě stě tisících webových stránkách a potencionálním útočníkům umožňovala smazat obsah databáze \citep{thehackernews_wordpress_1}. Na konci roku 2019 umožnila chyba ve dvou nezabezpečených rozšířeních neautorizované přihlášení k účtu administrátora bez použití hesla \citep{thehackernews_wordpress_2}. -Jako každý jiný systém, i statické generátory mají své nevýhody. Hlavním z~problémů je, že tvorba a správa obsahu může být pro běžného uživatele náročnější než skrze klasické webové rozhraní s~administračním panelem a jednoduchou správou celého obsahu. Pro přidání nebo úpravu obsahu je nutné pracovat s~lokálními soubory ve stromové struktuře a při generování je často potřebný zásah do shellu\footnote{Program pro interpretování příkazů v~prostředí příkazové řádky.}. Tvorba systému pro automatizované generování je také náročnější než instalace některého z~běžných CMS\footnote{Systém pro správu a obsahu (Wordpress, Joomla, Drupal a podobně).}. \citep{softpedia_generators} +Údržba velkých webových aplikací je často problematická. Kód je nutné udržovat v návaznosti na aktualizace daného jazyka, databázového systému a dalších aspektů. Těmto aktualizacím se z bezpečnostních důvodů nelze vyhýbat. Statický web nemusí udržovat funkční propojení s databázemi a různými frameworky\todo{Lepši slovo?} a je tedy mnohem méně náročný na dlouhodobou údržbu. Při zvolení správného generátoru není nutná ani údržba šablon a celý systém při zachování stejného prostředí nepřestane fungovat. Protože statický generátor nepracuje s uživatelským vstupem, vyhýbá se bezpečnostním chybám a tím i nutným aktualizacím. + +Jako každý jiný systém, i statické generátory mají své nevýhody. Hlavním z problémů je to, že správa statického generátoru a tvorba obsahu je náročnější, než klasické webové rozhraní s administračním panelem, různými uživateli a jednoduchou správou pro běžné, méně technicky zaměřené uživatele. Pro přidání nebo úpravu obsahu je nutné pracovat s lokálními soubory ve stromové struktuře a při generování je často potřebný zásah do shellu\footnote{Program pro interpretování příkazů v prostředí příkazové řádky.}. Tvorba systému pro automatizované generování je také náročnější než instalace některého z běžných CMS\footnote{Content Management System}. \citep{softpedia_generators} \section{Princip generátorů}\label{kap:princip-generatoru} -Ekosystém generátoru statického obsahu je tvořen ze tří hlavních složek. +Ekosystém generátoru statického obsahu je tvořen ze tří hlavních složek. První částí jsou soubory šablon, které popisují rozložení stránky, vizuální vlastnosti, typografii, ale také vstupní a výstupní kódování a formáty. V podstatě definují jak a kam se bude obsah vkládat. Druhou částí je obsah samotný, napsaný v některém ze značkovacích jazyků, nejčastěji v jazyce Markdown. Obsah bývá strukturován do sekcí a souborů, aby bylo snadné rozlišit, do které části výsledné stránky patří. Třetí a poslední složkou je samotné jádro generátoru, které zpracovává obsah, vkládá ho do šablon a renderuje statickou webovou stránku. -První částí jsou soubory šablon, jež popisují rozložení stránky, vizuální vlastnosti, typografii, ale také vstupní a výstupní kódování a formáty. V~podstatě definují, jak a kam se bude obsah vkládat. - -Druhou částí je obsah samotný, napsaný v~některém ze značkovacích jazyků, jež jsou dále popsány v~kapitole \ref{kap:znackovaci-jazyky}. Obsah bývá strukturován do sekcí a souborů, aby bylo snadné rozlišit, do které části výsledné stránky patří. - -Třetí a poslední složkou je samotné jádro generátoru, jež zpracovává obsah, vkládá ho do šablon a generuje statickou webovou stránku. - -Většina generátorů zároveň umí pracovat s~konfiguračními soubory, pomocí nichž lze nastavit globální chování generátoru. Část z~nich také integruje jednoduchý webserver, který umožňuje autorovi náhled výstupních stránek, zatím co tvoří obsah. +Většina generátorů zároveň umí pracovat s konfiguračními soubory, kterými jde nastavit globální chování generátoru. Část z nich také integruje jednoduchý webserver, který umožňuje autorovi náhled výstupních stránek zatím co tvoří obsah. \citep{softpedia_generators} diff --git a/kap-markup.tex b/kap-markup.tex index 1c59c18..6469f6c 100644 --- a/kap-markup.tex +++ b/kap-markup.tex @@ -1,72 +1,60 @@ -\chapter{Značkovací jazyky}\label{kap:znackovaci-jazyky} - -Tato kapitola se zabývá analýzou nejběžnějších jazyků pro popis obsahu používaných ve statických generátorech z~předchozí kapitoly, dalším důležitým jazykům ze světa sázení a jejich pricipům. +\chapter{Značkovací jazyky pro popis obsahu} \section{Principy značkovacích jazyků} -Definici konceptu značkovacích jazyků nebo-li \uv{markup jazyků}, můžeme najít napří\-klad v~RFC 7764\footnote{Jako \textit{RFC} se označují standardy vydané organizací IETF (Internet Engineering Task Force).}, tedy, že v~počítačových systémech jsou kontextuální data ukládána a zpracovávána několika technikami. Informaci lze kódovat jako čistý text bez speciálních formátovacích znaků. Tento přístup je jednoduchý pro implementaci i použití, ovšem neumožňuje složitější formátování textu. +Definici konceptu značkovacích jazyků, nebo-li \uv{markup jazyků}, můžeme najít například v RFC 7764\footnote{Jako \textit{RFC} se označují standardy vydané organizací IETF (Internet Engineering Task Force).}, tedy že v počítačových systémech jsou kontextuální data ukládána a zpracována několika technikami. Informaci lze kódovat jako čistý text bez speciálních formátovacích znaků. Tento přístup je jednoduchý pro implementaci i použití, ovšem neumožňuje složitější formátování textu. -Kódovat můžeme i do binárních formátů určených ke zpracování a interpretaci specia\-lizovanými programy, jimiž mohou být například LibreOffice Writer, či proprietární software\footnote{Software nerespektující základní svobody uživatele, které jsou popsány na adrese \url{https://www.gnu.org/philosophy/free-sw.html}} Microsoft Word. Zřejmou nevýhodou je to, že zdroj není čitelný bez programu určeného pro jeho interpretaci. +Kódovat můžeme i do binárních formátů určených ke zpracování a interpretaci specializovaným programem. Zřejmou nevýhodou je to, že zdroj není čitelný bez programu určeného pro jeho interpretaci. -Markup jazyky se snaží o~spojení nejlepšího z~obou světů, tedy o~obsah s~možností formátování, který je jednoduše čitelný jak pro člověka, tak pro stroj. Toho je dosaženo tím, že v~je v~běžných textových souborech přiřazen vybraným znakům speciální význam. Uživatel je schopen tyto znaky psát bez potřeby speciálních nástrojů, a tím jednoduše tento speciální význam vyjádřit. Například v~rámci jazyka Markdown, jenž je popsán v~následujích sekcích, se význam znaku \texttt{\#} na začátku řádku mění z~běžného křížku na definování nadpisu první úrovně. \citep{rfc7764} +Markup jazyky se snaží o spojení nejlepšího z obou světů, tedy o obsah s možností formátování, který je jednoduše čitelný jak pro člověka, tak pro stroj. Toho je dosaženo tím, že v je v běžných textových souborech přiřezen vybraným znakům speciální význam. Uživatel je schopen tyto znaky psát bez potřeby speciálních nástrojů a tím jednoduše vyjádřit speciální význam. Například v rámci jazyka Markdown se znak \texttt{\#} změní z běžného křížku na definování nadpisu první úrovně, nebo také kombinace znaků \texttt{
} značí začátek odstavce v HTML. \citep{rfc7764} \section{Nejběžnější jazyky} -V~současnosti existuje nespočet značkovacích jazyků, z~nichž nejčastěji používaným je nepochybně HTML, ovšem tato práce se věnuje těm nejpoužívanějším jazykům, jež mají uživateli usnadnit psaní a sázení obsahu. Uživatel se tedy nemusí při jeho tvorbě nutně zabývat typografií a formátováním obsahu, což jsou aspekty, o~které se později stará generátor pomocí šablon. U~HTML je tomu naopak, uživatel řeší samotný obsah i formátování v~jednu chvíli skrze různé druhy formátovacích tagů. O~vyplňování obsahu do HTML se v~případě staticky generovaných webových stránek stará právě samotný generátor. +V současnosti existuje nespočet značkovacích jazyků. Nejpoužívanějším z nich je jednoznačně HTML, ovšem tato práce se věnuje těm nejpoužívanějším jazykům, které mají uživateli usnadnit psaní a sázení obsahu. Uživatel se tedy nemusí při tvorbě nutně zabývat typografií a formátováním obsahu, což jsou aspekty, o které se později postará generátor pomocí šablon. U HTML je tomu naopak, uživatel řeší samotný obsah i formátování v jednu chvíli skrze různé druhy formátovacích tagů. O vyplňování obsahu do HTML se v případě staticky generovaných webů stará právě samotný generátor. -Vybrané jazyky jsou zároveň cílené na čitelnost samotného zdrojového obsahu v~čistém textu bez nutnosti jeho interpretace speciálním prostředím či zpracováním do jiných formátů, jimiž mohou být PDF, DjVu, PostScript apod. Například podtržení textu je v~nějakém pseudo-jazyce reprezentováno opravdovým podtržením pomocí rovnítek, viz příklad \ref{lst:pseudo-jazyk}, nikoliv obalením nadpisu ve speciální deklaraci, jako je tomu právě u~jazyka HTML. Podtržení je poté pro čtenáře mnohem jasnější, jelikož nemusí přemýšlet, co v~kontextu HTML daný tag znamená, kdežto podtržení z~kontextu souboru vyplývá. +Vybrané jazyky jsou zároveň cílené na čitelnost samotného zdrojového obsahu v čistém textu bez nutnosti jeho interpretace speciálním prostředím či zpracováním do jiného formátu, například do PDF, DjVu, PostScript apod. Například podtržení textu je v nějakém pseudo-jazyce reprezentováno opravdovým podtržením pomocí spojovníků, nikoliv obalením nadpisu ve speciální deklaraci, jako je tomu například u HTML. Podtržení je poté pro čtenáře mnohem jasnější, jelikož nemusí přemýšlet, co v kontextu HTML daný tag znamená, kdežto podtržení vyplývá z kontextu. -\begin{lstlisting}[label=lst:pseudo-jazyk,caption=Příklad podtržení nadpisu ve značkovacím pseudo-jazyce] -Nadpis -====== -\end{lstlisting} - -Následující jazyky byly vybrány základě jejich výskytu u~generátorů vybraných v~předchozí kapitole a také podle aktuálních statistik ze serveru \cite{slant}, který se věnuje obecnému určení oblíbenosti na základě hodnocení ze strany uživatelů. - -\subsection{\TeX}\label{kap:tex} - -Tento jazyk se vzdaluje od původního konceptu čitelnosti zdroje, ovšem ve statických generátorech ho lze stále efektivně využít. Je jedním z~nejrozšířenějších sázecích jazyků se spoustou možností a funkcionalit, z~nichž velmi zajímavým rozšířením je prostředí pro psaní matematických formulí, díky němuž se jazyk stal velmi populárním v~oblasti technických publikací. Tyto funkcionality se často objevují i v~jiných jazycích a jsou efektivně využívány pro jejich rozšíření. - -Většina uživatelů se setkala spíše s~jazykem \LaTeX, tedy s~nadstavbou původního \TeX{}u, která má uživateli zjednodušit práci svými makry a rozšířeními. Realita je ovšem taková, že \LaTeX{} dělá celou práci složitější, jak popisuje RNDr. Olšák: - -\begin{quote} -Představte si, že si nějaký uživatel přečte \LaTeX{}ovou příručku a nabude doj\-mu, že mu bude stačit rozumět problematice sazby na úrovni této příručky. Pak se jednou překlepne třeba při sestavování tabulky a na terminálu na něj \TeX{} křičí: {\tt Extra alignment tab has been changed to "\verb|\cr|".} Uživatel začne znovu listovat ve své příručce a zjistí, že tam o~žádném "\verb|\cr|"{} není jediná zmínka. Má pak tři možnosti: (1)~Zmáčkne Enter a podobně se zachová i u~dalších chyb. Pomyslí si, že ten \LaTeX{} je něco tajemného a mys\-tického. (2)~Propadne zoufalství a jde od toho. Dojde k~závěru, ľe je lepší zůstat u~Wordu. Vždyť stačí vzít tabulku v~Excelu a jednoduše ji přemístit do Wordu a jaképak smolení se s~nějakým podezřelým "\verb|\cr|". (3)~Pořídí si \TeX{}book a po intenzivním studiu nakonec řekne: \uv{aha}. V~tuto chvíli ale už nepotřebuje, aby mu \LaTeX{} zakrýval složitost \TeX{}u. \citep{nolatex} -\end{quote} - -Ve výsledku je tedy lepší, z~různých důvodů popsaných RNDr. Olšákem v~jeho publikaci, použít samotný plain \TeX{} na úkor vyšší vstupní úrovně pro používání jazyka. - -\subsection{Troff} - -Troff je jedním z~nejstarších jazyků a předchůdcem jazyka \TeX. Autorem původní verze je Joe Ossanna, po jehož smrti převzal vývoj Brian Kernighan. Samotný Troff je reimplementací a rozšířením původního programu RUNOFF z~operačního systému CTSS. Vznikl za účelem sazby dokumentů na novém operačním systému Unix. \citep{ossanna1977troff} - -Dnes existuje celá řada různých implementací a modernizovaných rozšíření, například Groff\footnote{\url{https://www.gnu.org/software/groff/}}, Heirloom troff\footnote{\url{http://heirloom.sourceforge.net/doctools.html}}, nebo moderní Neatroff\footnote{\url{https://repo.or.cz/neatroff.git/}}, který se snaží o~spojení toho nejlepšího ze všech předchozích implementací. Sám Brian Kernighan v~soukromé emailové konverzaci doporučuje použití některé alternativní implementace, jež jsou podle Keringhana lepší ve všech směrech. - -I~přes vznik mnoha alternativních jazyků, například dříve zmíněného \TeX{}u a \LaTeX{}u, je Troff (Groff) stále hojně využíván v~praxi, zejména u~softwarové dokumentace v~Unixových operačních systémech. +Seznam nejoblíbenějších jazyků je sestaven podle aktuálních statistik ze serveru Slant, který se věnuje obecnému určení oblíbenosti na základě hodnocení ze strany uživatelů. \citep{slant} \subsection{Markdown}\label{kap:markdown} -Jazyk Markdown vznikl 19. března roku 2004, když John Gruber vydal první popis syntaxe a referenční implementaci. +Jazyka Markdown vznikl 19. března roku 2004, když John Gruber vydal první popis syntaxe a referenční implementaci. -Hlavním z~cílů syntaxe jazyka je vytvářet co možná nejčitelnější obsah podobě čistého textu. Dokument psaný v~Markdownu by měl být publikovatelný jako textový soubor bez dalších úprav a zpracování. Jazyk byl ovlivněn několika již existujícími specifikacemi jiných jazyků, ovšem největším zdrojem inspirace pro jeho vznik jsou čisté e-mailové korespondence\footnote{E-mail, který není formátován pomocí HTML.}. \citep{daringfireball} +Hlavním z cílů syntaxe jazyka je vytvářet co možná nejčitelnější obsah v syrové podobě. Dokument psaný v Markdownu by měl být publikovatelný sám o sobě jako čistý text bez dalších úprav a zpracování. Jazyk byl ovlivněn několika již existujícími specifikacemi jiných jazyků, ovšem největším zdrojem inspirace pro jeho vznik jsou čisté emailové korespondence. \citep{daringfireball} -První specifikaci Gruber vydal společně s~referenční implementací v~jazyce Perl, která prováděla konverzi zdrojového souboru popsaného v~jazyce Markdown do HTML. Tento program je také pojmenován \textit{Markdown}, ovšem mluvíme-li o~\textit{Markdownu}, máme nej\-častěji na mysli samotnou syntaxi. Ta má dnes mnoho implementací v~různých programovacích jazycích. Gruberova specifikace ovšem není formálním standardem, kvůli čemuž vznikl veliký počet alternativních a více či méně pozměněných implementací, jež nemusí být navzájem kompatibilní. Nejčastějšími z~nich jsou například Github Markdown, CommonMark, RMarkdown a mnoho dalších. \citep{commonmark} +První specifikaci Gruber vydal společně s referenční implementací v jazyce Perl, která prováděla konverzi Markdownu do HTML. Tento program je také pojmenován \uv{Markdown}, ovšem mluvíme-li o \uv{Markdownu}, máme nejčastěji na mysli samotnou syntaxi. Ta má dnes mnoho implementací v různých programovacích jazycích. Gruberova specifikace ovšem není formální standard, kvůli čemuž vznikl veliký počet alternativních a více či méně pozměněných implementací, které nemusí být navzájem kompatibilní. Nejčastějšími z nich jsou například Github Markdown, CommonMark, R Markdown a mnoho dalších. \citep{commonmark} -Nevyužívanější formální specifikací je právě CommonMark\footnote{\url{https://commonmark.org/}}, jenž slouží jako pevný základ většiny rozšíření. \citep{github_formal_markdown_spec} +Nevyužívanější formální specifikací je právě CommonMark\footnote{\url{https://commonmark.org/}}, který slouží jako pevný základ většiny rozšíření. \citep{github_formal_markdown_spec}. -Podobně, jako je tomu u~specifikací, existuje velké množství programů, které tyto různé specifikace překládají. Švýcarským nožem mezi nimi je program Pandoc\footnote{\url{https://pandoc.org/}}, jenž umí překládat Markdown do enormního výběru jiných formátů, nebo z~jiných formátů zpět. Tato funkcionalita se nevztahuje pouze na jazyk Markdown, Pandoc dokáže operovat mezi všemi podporovanými formáty, například dokáže konvertovat obsah z~HTML do \TeX{}u. Na druhou stranu existují i velmi jednoduché překladače, například program smu\footnote{\url{https://github.com/Gottox/smu/}}, který umí překládat Markdown do HTML nebo čistého textu a neobsahuje více než šest set řádků kódu hlavního programu. - -Užitečným rozšířením je, mimo jiné, také integrace matematického prostředí z~jazyka \TeX, viz sekce \ref{kap:tex}. +Podobně jako je tomu u specifikací, existuje velké množství programů, které tyto různé specifikace překládají. Švýcarským nožem mezi nimi je program Pandoc\footnote{\url{https://pandoc.org/}}, který umí překládat Markdown do enormního výběru jiných formátů, nebo z jiných formátů zpět. Tato funkcionalita se nevztahuje pouze na jazyk Markdown, Pandoc dokáže operovat mezi všemi podporovanými formáty, například dokáže konvertovat obsah z HTML do \TeX{}u. Na druhou stranu existují i velmi jednoduché překladače, například program smu\footnote{\url{https://github.com/Gottox/smu}}, který umí překládat Markdown do HTML nebo čistého textu a neobsahuje více než 600 SLOC\footnote{Source lines of code}, tedy řádků kódu hlavního programu. \subsection{Org-mode} -Org-mode vznikl jako jeden z~módů pro editor Emacs\footnote{\url{https://www.gnu.org/software/emacs/}}. Funguje podobně jako ostatní markup jazyky, tedy jako jeden centrální systém pro správu obsahu, ze kterého lze vytvářet jiné formáty, například HTML, \LaTeX, Open Document, Markdown, PDF a podobně s~možností přidání libovolného nového backendu. Cílem Org-mode je možnost ho používat i s~minimální úrovní jeho znalosti, ovšem jeho funkcionalita je vždy přístupná. Vše je realizováno pouze na čistých textových souborech, nejlépe přenositelným typem souboru. Editor Emacs je zároveň velmi často portován na různé druhy systémů, a je tedy možné ho využívat v~podstatě kdekoliv. \citep{orgmanual} +Org-mode vznikl jako jeden z módů pro editor Emacs\footnote{\url{https://www.gnu.org/software/emacs/}}. Funguje podobně jako ostatní markup jazyky, tedy jako jeden centrální systém pro správu obsahu, ze kterého lze vytvářet jiné formáty, například HTML, \LaTeX, Open Document, Markdown, PDF a podobně s možností přidání libovolného nového backendu\todo{České slovo?}. Cílem Org-mode je možnost ho používat i s minimální úrovní jeho znalosti, ovšem jeho funkcionalita je vždy přístupná. Vše je realizováno pouze na čistých textových souborech, nejlépe přenositelným typem souboru. Editor Emacs je zároveň velmi často portován na různé druhy systémů a je tedy možné ho využívat v podstatě kdekoliv. \citep{orgmanual} -Podporuje také \textit{literate programming} a \textit{reproducible research}, tedy, že Org soubory mohou obsahovat plně funkční bloky s~kódem, které lze hodnotit v~rámci systému, a výstup bloků lze automaticky vkládat přímo do dokumentu. \citep{environment_for_literate_programming} +Podporuje také \uv{literate programming} a \uv{reproducible research}, tedy že Org soubory mohou obsahovat plně funkční bloky s kódem, které lze hodnotit v rámci systému a výstup bloků lze automaticky vkládat přímo do dokumentu. \citep{environment_for_literate_programming} -Jak popisuje \cite{carsten_dominik} ve svém krátkém technickém popisu, Org-mode umí navrhování, psaní poznámek, hypertextové odkazy, tabulky, seznamy, plánování projektů, GTD, HTML a \LaTeX{}, a to všechno v~čistých textových souborech v~editoru Emacs. +Jak popisuje Carsten Dominik ve svém krátkém technickém popisu, Org-mode umí navrhování, psaní poznámek, hypertextové odkazy, tabulky, seznamy, plánování projektů, GTD, HTML a \LaTeX{}, a to všechno v čistých textových souborech v editoru Emacs. \citep{carsten_dominik} + +\subsection{AsciiDoc} + +... \subsection{reStructuredText} -Tento jazyk, známý také jako ReST, je, stejně jako Markdown, zároveň syntaxí i parsovacím systémem syntaxe pro tvorbu dokumentů a webových stránek. Svou oblibu získal hlavně v~komunitě jazyka Python. Ve své dokumentaci\footnote{\url{https://docutils.sourceforge.io/rst.html}} je popisován jako syntax pro využití ke psaní \textit{Python docstrings} a dalších druhů dokumentace, která je spolehlivá a jednoduchá. ReST vznikl v~návaznosti na jazyk StructuredText, jenž trpěl mnoha nedostatky. Cílem jazyka reStructuredText je tyto nedostatky opravit a doplnit. \citep{problems_with_structuredtext} +... + +\subsection{\TeX} + +Tento jazyk se již vzdaluje od původního konceptu čitelnosti zdroje, ovšem ve statických generátorech ho lze stále efektivně využít a jeho části se velmi často objevují jako rozšíření dříve zmíněných jazyků. Jedním z hlavních rozšíření jsou zápisy matematických rovnic, které z \TeX{}u vychází.\todo{Rozšířit o popis TeXu a matiky.} + +Většina uživatelů se setkala spíše s jazykem \LaTeX, tedy s nadstavbou původního \TeX{}u, která má uživateli zjednodušit práci svými makry a rozšířeními. Realita je ovšem taková, že \LaTeX{} dělá celou práci složitější, jak popisuje doktor Olšák: + +\begin{quote} +Představte si, že si nějaký uživatel přečte \LaTeX{}ovou příručku a nabude dojmu, že mu bude stačit rozumět problematice sazby na úrovni této příručky. Pak se jednou překlepne třeba při sestavování tabulky a na terminálu na něj \TeX{} křičí: {\tt Extra alignment tab has been changed to "\verb|\cr|".} Uživatel začne znovu listovat ve své příručce a zjistí, že tam o~žádném "\verb|\cr|" není jediná zmínka. Má pak tři možnosti: (1)~Zmáčkne Enter a podobně se zachová i u~dalších chyb. Pomyslí si, že ten \LaTeX{} je něco tajemného a mystického. (2)~Propadne zoufalství a jde od toho. Dojde k~závěru, ľe je lepší zůstat u~Wordu. Vždyť stačí vzít tabulku v~Excelu a jednoduše ji přemístit do Wordu a jaképak smolení se s~nějakým podezřelým "\verb|\cr|". (3)~Pořídí si \TeX{}book a po intenzivním studiu nakonec řekne: \uv{aha}. V~tuto chvíli ale už nepotřebuje, aby mu \LaTeX{} zakrýval složitost \TeX{}u. +\end{quote} \citep{nolatex} + +Ve výsledku je tedy lepší, z různých důvodů popsaných doktorem Olšákem v jeho publikaci, použít samotný plain \TeX{} na úkor vyšší vstupní úrovně pro použivání jazyka. + +\subsection{Troff} -S~jazykem se lze setkat u~značné části existujících generátorů statických webových stránek, z~nichž některé jsou zmíněny v~kapitole \ref{kap:paradigmata}. diff --git a/kap-modelova-implementace.tex b/kap-modelova-implementace.tex index b47571f..6b20d7b 100644 --- a/kap-modelova-implementace.tex +++ b/kap-modelova-implementace.tex @@ -1,49 +1,41 @@ \chapter{Modelová implementace}\label{kap:modelova-implementace} -Tato část práce se věnuje tvorbě modelové implementace systému pro generování sta\-tických webových stránek dle definovaných požadavků v~kapitole \ref{kap:taxonomie-pozadavku}. Jsou zde vybrány vhodné součásti, ze kterých je modelová implementace složena. +Tato část práce se věnuje tvorbě modelové implementace systému pro generování statického webu dle definovaných požadavků v kapitole \ref{kap:taxonomie-pozadavku}. Jsou zde vybrány vhodné součásti, ze kterých je modelová implementace složena. Systém je vytvářen na základě poznatků z předchozích částí práce. \section{Výběr vhodného systému}\label{kap:vyber-vhodneho-systemu} -Modelový systém se skládá ze dvou částí, a to z~verzovacího systému pro správu obsahu a generátoru statického HTML. Obě tyto součásti jsou vybírány na základě poznatků z~předchozích částí práce. +Modelový web se skládá ze dvou částí, a to z verzovacího systému pro správu obsahu a generátoru statického HTML. \subsection{Verzovací systém pro správu obsahu}\label{kap:vyber-vhodneho-systemu-verzovani} -Pro správu obsahu i šablon a statických souborů byl zvolen distribuovaný verzovací systém Git, jenž má v~porovnání s~jinými verzovacími systémy, zejména centralizovanými, spousty výhod. Jeho hlavní výhodou je rozšířené využití v~praxi a snadné používání. Díky svým decentralizovaným vlastnostem ho lze využívat v~mnoha odlišných pracovních postupech. S~naklonovaným repozitářem lze pracovat i bez připojení k~síti, což lze považovat i za druh zálohy. Git také umožňuje slučování různých změn od mnoha uživatelů a dovoluje jednoduše řešit potenciální konflikty. \citep{why_is_git_better_than_x} +Pro správu obsahu i šablon a statických souborů byl zvolen distribuovaný verzovací systém Git, který má v porovnání s jinými verzovacími systémy, zejména centralizovanými, spousty výhod. Hlavní jeho výhodou je rozšířené využití v praxi a snadné používání. Díky svým decentralizovaným vlastnostem ho lze využívat v mnoha odlišných pracovních postupech. S naklonovaným repozitářem lze pracovat i bez připojení k síti, což lze považovat i za druh zálohy. Git také umožňuje slučování různých změn od mnoha uživatelů a dovoluje jednoduše řešit potenciální konflikty. \citep{why_is_git_better_than_x} -Skvěle využitelnou funkcí pro modelovou implementaci je také to, že po provedení změn v~repozitáři lze pomocí Gitu spouštět skripty, které mohou provádět automatické gene\-rování obsahu a další užitečné operace. Tato funkcionalita je implementována v~rámci modelové implementace v~sekci \ref{kap:automaticke-generovani-obsahu}. +Skvěle využitelnou funkcí pro modelovou implementaci je také to, že po provedení změn v repozitáři lze pomocí Gitu spouštět skripty, které mohou provádět automatické generování obsahu a další užitečné operace. Tato funkcionalita je implementována v rámci modelové implementace v sekci \ref{kap:automaticke-generovani-obsahu}. \subsection{Generátor statického webu} -Protože forma modelového webu odpovídá paradigmatu webové prezentace ze sekce \ref{kap:paradigmata-webova-prezentace}, byl pro jeho generování použit program Zola\footnote{\url{https://www.getzola.org/}}. +Protože forma modelového webu odpovídá paradigmatu webové prezentace ze sekce \ref{kap:paradigmata-webova-prezentace}, byl pro jeho generování použit program Zola\footnote{\url{https://www.getzola.org/}}, jehož výhody jsou popsány v sekci \ref{kap:paradigmata-webova-prezentace}. -Vybraný generátor splňuje všechny požadavky z~kapitoly \ref{kap:taxonomie-pozadavku} a oproti jiným systémům je výhodný tím, že je napsaný v~jazyce Rust. Je tedy mnohem rychlejší a bezpečnější než většina jeho alternativ \citep{benchmarks_game}. Tato výhoda v~rychlosti se znatelně projevuje při zpracování obsáhlých webových stránek či mnoha obrázků. - -V~rámci generátoru je využíván značkovací jazyk Markdown, který je snadný a velmi rozšířený. Kromě těchto výhod si zachovává většinu funkcí a rysů, jež lze najít v~ostatních složitých systémech. Zároveň je možné generátor zkompilovat\footnote{Spustitelné programy musí být převedeny do strojového kódu procesem zvaným \textit{kompilace}.} do jednoho staticky linkovaného\footnote{Spustitelný soubor má všechny potřebné knihovny integrované v~sobě.} binárního souboru, s~nímž se pracuje mnohem lépe než se složitým frameworkem. +\todo[inline]{Přesunout výběr a výhody generátoru sem.} \section{Tvorba šablony} -Jak se uvádí v~dokumentaci\footnote{\url{https://www.getzola.org/documentation/content/overview/}}, Zola pracuje s~několika druhy stránek, primárně s~tak\-zvanou \textit{sekcí} a \textit{stránkou}. +Jak se uvádí v dokumentaci\footnote{\url{https://www.getzola.org/documentation/content/overview/}}, Zola pracuje s několika druhy stránek, primárně s takzvanou \uv{sekcí} a \uv{stránkou}. Každá sekce může mít vlastní obsah, ovšem může obsahovat i další subsekce, díky čemuž lze dělit obsah do stromové struktury. Stránka slouží pouze k předání obsahu a nikoliv k dalšímu větvení struktury. Dá se tedy říci, že stránka reprezentuje list v rámci stromovité struktury. Kořenem celého stromu je speciální sekce s názvem \uv{index}. Každá tato část standardně využívá vlastní HTML šablonu, to není ovšem pravidlo a každá část větve může využívat jinou šablonu. To je užitečné například u stránek s různými druhy obsahu. V rámci modelového webu zůstává druh obsahu stejný a není tedy třeba odchylovat se od standardní struktury. -\textit{Stránka} slouží pouze k~předání obsahu a nikoliv k~dalšímu větvení struktury. Dá se tedy říci, že stránka v~rámci stromové struktury reprezentuje konec větve. +Soubory se šablonami se nachází ve složce \texttt{templates/}, ve které generátor vždy očekává šablonu \texttt{index.html}. Ta se využívá jak k vykreslení úvodní kořenové stránky, tak jako základ, kterou mohou ostatní šablony rozšiřovat. Tato kořenová šablona tedy obsahuje základní strukturu celé stránky, přičemž navazující šablony jen mění určité části obsahu a nedefinují celou strukturu znovu. -Každá \textit{sekce} může mít vlastní obsah, ovšem může obsahovat i další subsekce, pomocí nichž lze obsah ve stromové struktuře větvit. Kořenem celého stromu je speciální sekce s~názvem \textit{index}. - -Pro každou část se obvykle používá vlastní HTML šablona, ovšem není to pravidlem a každá část větve může využívat šablonu jinou. To je užitečné například u~stránek s~různými druhy obsahu. V~rámci modelového webu zůstává druh obsahu stejný a není tedy třeba se odchylovat od standardní struktury. - -Soubory se šablonami se nachází ve složce \texttt{templates/}, ve které generátor vždy očekává šablonu \texttt{index.html}. Ta se využívá jak k~vykreslení úvodní kořenové stránky, tak jako základ, jež mohou ostatní šablony rozšiřovat. Tato kořenová šablona tedy obsahuje základní strukturu celé stránky, přičemž navazující šablony jen mění určité její části a nedefinují celou strukturu znovu. - -Generátor Zola v~šablonách hledá vlastní řídící sekvence, jež se popisují kombinací složených závorek a dalších znaků. Existují tři druhy kombinací, které lze použít: +Generátor v šablonách hledá vlastní řídící sekvence, které se popisují závorkami. Existují tři druhy kombinací, které lze použít: \begin{itemize} - \item \texttt{\{\% \%\}} -- Metoda, funkce, cykly, podmínky, práce s~proměnnou atd. + \item \texttt{\{\% \%\}} -- Metoda, funkce, cykly, podmínky, práce s proměnnou atd. \item \texttt{\{\{ \}\}} -- Výpis do HTML \item \texttt{\{\# \#\}} -- Komentář \end{itemize} -Generátor také vyžaduje konfigurační soubor \texttt{config.toml} v~kořenové složce projektu, jenž obsahuje různá nastavení stránky, globální proměnné a chování generátoru. +Generátor také vyžaduje konfigurační soubor \texttt{config.toml} v kořenové složce projektu, který obsahuje různé nastavení stránky, globální proměnné a chování generátoru. -\begin{lstlisting}[label=lst:jednoducha-konfigurace,caption=Příklad jednoduché konfigurace v~souboru \texttt{config.toml}] -# Adresa pro kterou se generují odkazy +\begin{lstlisting}[label=lst:jednoducha-konfigurace,caption=Příklad jednoduché konfigurace v souboru \texttt{config.toml}] +# Adresa ze které se generují odkazy base_url = "https://ucitelonline.pedf.cuni.cz" # Název stránky title = "Učitel online" @@ -53,7 +45,7 @@ description = "Web pro ditstribuci užitečných materiálů" compile_sass = true \end{lstlisting} -Systém vždy zpracuje úvodní šablonu \texttt{index.html}, ze které pak lze odvíjet ostatní šablony. Tato hlavní šablona obsahuje strukturu celé webové stránky a nesmí v~ní chybět validní HTML struktura, tedy hlavička, tělo, metadata, kódování a podobně. Do struktury lze vkládat libovolné řídící sekvence generátoru, které ovlivňují výsledný výstup. +Systém vždy zpracuje úvodní šablonu \texttt{index.html}, ze které pak lze odvíjet ostatní šablony. Tato hlavní šablona obsahuje strukturu celé webové stránky a nesmí v ní tedy chybět validní HTML struktura, tedy hlavička, tělo, metadata, kódování a podobně. Do struktury lze vkládat libovolné řídící sekvence pro generátor, které ovlivňují výsledný výstup. \begin{lstlisting}[label=lst:zakladni-sablona,caption=Základní šablona \texttt{index.html}] @@ -67,11 +59,11 @@ Systém vždy zpracuje úvodní šablonu \texttt{index.html}, ze které pak lze