diff --git a/kap-generatory.tex b/kap-generatory.tex index 4a15fd1..47100cc 100644 --- a/kap-generatory.tex +++ b/kap-generatory.tex @@ -1,16 +1,16 @@ \chapter{Staticky generované webové stránky} -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í čistého HTML 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 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} -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} +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} \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 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 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\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} -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ů jejich nové stránky FT.com s~cílem jejího zrychlení. \citep{financialtimes} +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} -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. +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. 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: @@ -27,18 +27,24 @@ Sledování a analýze nejčastějších chyb webových aplikací a serverů se \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, 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. +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. -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}. +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 nezabezpečených rozšířeních neautorizované přihlášení k~účtu administrátora bez použití hesla \citep{thehackernews_wordpress_2}. -Ú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, 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. +Ú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. -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 -- Systém pro správu a verzování obsahu.}. \citep{softpedia_generators} +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} \section{Princip generátorů}\label{kap:princip-generatoru} -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. +Ekosystém generátoru statického obsahu je tvořen ze tří hlavních složek. -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. +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, pomcí 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. \citep{softpedia_generators} diff --git a/kap-markup.tex b/kap-markup.tex index 1eb6341..e7f7728 100644 --- a/kap-markup.tex +++ b/kap-markup.tex @@ -1,34 +1,54 @@ -\chapter{Značkovací jazyky} +\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. \section{Principy značkovacích jazyků} -Definici konceptu značkovacích jazyků neboli \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. +Definici konceptu značkovacích jazyků neboli \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 specializovaným programem. 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 specia\-lizovaným programem, 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. -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 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 kombinace znaků \texttt{
} v~HTML značí začátek odstavce. \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ř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} \section{Nejběžnější jazyky} -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. +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, jenž 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. -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. +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í spojovníků, 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á. -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} +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 doktor 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 doktorem 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. \subsection{Markdown}\label{kap:markdown} -Jazyka Markdown vznikl 19. března roku 2004, když John Gruber vydal první popis syntaxe a referenční implementaci. +Jazyk 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 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} +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} -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 jako \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ím standardem, 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} +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 jako \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ím standardem, kvůli čemuž vznikl veliký počet alternativních a více či méně pozměněných implementací, jenž 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} -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} +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} -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. +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}. @@ -42,26 +62,6 @@ Jak popisuje \cite{carsten_dominik} ve svém krátkém technickém popisu, Org-m \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 syntaxe 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, který trpěl mnoha nedostatky. Cílem jazyka reStructuredText je tyto nedostatky opravit a doplnit. \citep{problems_with_structuredtext} +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 syntaxe 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} 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}. - -\subsection{\TeX}\label{kap: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. 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 kterému jazyk stal velmi populárním v~oblasti technických publikací. Tyto funkcionality se často objevují i v~jiných jazycích, které 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 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. \citep{nolatex} -\end{quote} - -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ží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 doporučuje v~soukromé emailové konverzaci použití některé alternativní implementace, které 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. diff --git a/kap-modelova-implementace.tex b/kap-modelova-implementace.tex index 5bba522..07d9747 100644 --- a/kap-modelova-implementace.tex +++ b/kap-modelova-implementace.tex @@ -1,30 +1,38 @@ \chapter{Modelová implementace}\label{kap:modelova-implementace} -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. +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. \section{Výběr vhodného systému}\label{kap:vyber-vhodneho-systemu} -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. +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. \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, 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} +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. 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é 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}. +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}. \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/}}, jehož výhody jsou v~sekci \ref{kap:paradigmata-webova-prezentace} popsány. +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/}}. -Jako nejvhodnější generátor pro modelovou implementaci byl vybrán software Zola. Ten 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 a je tedy mnohem rychlejší a bezpečnější, než většina jeho alternativ \citep{benchmarks_game}. Kromě těchto výhod si zachovává většinu funkcí a rysů, které lze najít v~ostatních složitých systémech. Zároveň je možné generátor zkompilovat do jednoho staticky linkovaného binárního souboru, se kterým se pracuje mnohem lépe než se složitým frameworkem. +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, se nímž se pracuje mnohem lépe než se složitým frameworkem. \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~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}. 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 odchylovat se od standardní struktury. +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}. -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, který 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. +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. -Generátor v~šablonách hledá vlastní řídící sekvence, které se popisují závorkami. Existují tři druhy kombinací, které lze použít: +Každá 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 odchylovat se 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, jenž se popisují kombinací složených závorek a dalších znaků. Existují tři druhy kombinací, které lze použít: \begin{itemize} \item \texttt{\{\% \%\}} -- Metoda, funkce, cykly, podmínky, práce s~proměnnou atd. @@ -32,10 +40,10 @@ Generátor v~šablonách hledá vlastní řídící sekvence, které se popisuj \item \texttt{\{\# \#\}} -- Komentář \end{itemize} -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. +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. \begin{lstlisting}[label=lst:jednoducha-konfigurace,caption=Příklad jednoduché konfigurace v~souboru \texttt{config.toml}] -# Adresa ze které se generují odkazy +# Adresa pro kterou se generují odkazy base_url = "https://ucitelonline.pedf.cuni.cz" # Název stránky title = "Učitel online" @@ -45,7 +53,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í 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. +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. \begin{lstlisting}[label=lst:zakladni-sablona,caption=Základní šablona \texttt{index.html}] @@ -61,7 +69,7 @@ Systém vždy zpracuje úvodní šablonu \texttt{index.html}, ze které pak lze V~příkladu \ref{lst:zakladni-sablona} je název stránky mezi tagy \texttt{