<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="atom.xsl"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <id>https://hrad.perunhq.org/</id>
    <title>Môj kód, môj hrad Blog</title>
    <updated>2026-09-11T00:00:00.000Z</updated>
    <generator>https://github.com/jpmonette/feed</generator>
    <link rel="alternate" href="https://hrad.perunhq.org/"/>
    <subtitle>Môj kód, môj hrad Blog</subtitle>
    <icon>https://hrad.perunhq.org/img/favicon.ico</icon>
    <entry>
        <title type="html"><![CDATA[Frontendové zvesti #4]]></title>
        <id>https://hrad.perunhq.org/2026/09/11/frontendove-zvesti-4</id>
        <link href="https://hrad.perunhq.org/2026/09/11/frontendove-zvesti-4"/>
        <updated>2026-09-11T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Dnešných noviniek je veľa a z rôznych oblastí. Dostanete tipy na nové nástroje, dokumentárne filmy]]></summary>
        <content type="html"><![CDATA[<p>Dnešných noviniek je veľa a z rôznych oblastí. Dostanete tipy na nové nástroje, dokumentárne filmy
o histórii technológií. Nevyhneme sa ani umelej inteligencii a na koniec sa chvíľu pobavíme aj
o prepise naozaj veľkej hry (EVE Online) do Python-u 3.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="bol-vydaný-vitest-vo-verzii-50">Bol vydaný Vitest vo verzii 5.0<a href="https://hrad.perunhq.org/2026/09/11/frontendove-zvesti-4#bol-vydan%C3%BD-vitest-vo-verzii-50" class="hash-link" aria-label="Priama linka na Bol vydaný Vitest vo verzii 5.0" title="Priama linka na Bol vydaný Vitest vo verzii 5.0" translate="no">​</a></h2>
<ul>
<li class="">
<p><a href="https://vitest.dev/blog/vitest-5.html" target="_blank" rel="noopener noreferrer" class="">https://vitest.dev/blog/vitest-5.html</a></p>
</li>
<li class="">
<p>Zámerom tohto vydania bol hlavne vylepšený výkon. Môžete očakávať, že vaše testy budú bežat rýchlejšie aspoň o zopár percent (8% - 53% podľa ich benchmarkov).</p>
</li>
<li class="">
<p>Máme k dispozícii novú pomocnú metódu <code>vi.when</code>, ktorú vyuzijeme v situáciách kde potrebujeme, aby namockovaná funkcia vracala hodnoty na základe daných argumentov.</p>
<div class="language-tsx codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-tsx codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> findById </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> vi</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">fn</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">vi</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">when</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">findById</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">calledWith</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">thenResolve</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> id</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> name</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Ella"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">calledWith</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">2</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">thenResolve</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> id</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> name</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Gracie"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">calledWith</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">expect</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">any</span><span class="token punctuation" style="color:#393A34">(</span><span class="token known-class-name class-name">Number</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">thenReject</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token class-name">Error</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"not found"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
</li>
<li class="">
<p>chyby pochádzajúce z neschopnosti nájsť element budú odteraz vypisovať strom s použitím ARIA rolí a názvov. Mali by sme to zobrať ako príležitosť sa ich naučiť a používať lepšie.</p>
</li>
<li class="">
<p>falošné časovače po novom mockujú aj <code>Temporal</code> API, nie iba <code>Date</code></p>
</li>
<li class="">
<p>nastavenie <code>clearMocks</code> je teraz predvolene zapnuté (<code>true</code>). Predchádzajúce verzie to mali vypnuté (<code>false</code>).</p>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="svg-react-a-defs">SVG, React a <code>&lt;defs&gt;</code><a href="https://hrad.perunhq.org/2026/09/11/frontendove-zvesti-4#svg-react-a-defs" class="hash-link" aria-label="Priama linka na svg-react-a-defs" title="Priama linka na svg-react-a-defs" translate="no">​</a></h2>
<p>Vykresľujete na jednej stránke viacero kópií rovnakého SVG obrázku a radi by ste používali <code>&lt;defs&gt;</code>, aby ste sa zbavili duplicitného markupu, ale nemôžete, lebo vám v tom bráni fungovanie React-u? Nuž, tak si prečítajte tieto dva články a naučíte sa, aké máte možnosti:</p>
<ul>
<li class=""><a href="https://julesblom.com/writing/colocated-svg-defs" target="_blank" rel="noopener noreferrer" class="">https://julesblom.com/writing/colocated-svg-defs</a></li>
<li class=""><a href="https://julesblom.com/writing/hoistable-svg-defs-ii" target="_blank" rel="noopener noreferrer" class="">https://julesblom.com/writing/hoistable-svg-defs-ii</a></li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="ako-vy-osobne-môžete-ovplyvniť-a-zmeniť-javascript">Ako vy osobne môžete ovplyvniť a zmeniť JavaScript?<a href="https://hrad.perunhq.org/2026/09/11/frontendove-zvesti-4#ako-vy-osobne-m%C3%B4%C5%BEete-ovplyvni%C5%A5-a-zmeni%C5%A5-javascript" class="hash-link" aria-label="Priama linka na Ako vy osobne môžete ovplyvniť a zmeniť JavaScript?" title="Priama linka na Ako vy osobne môžete ovplyvniť a zmeniť JavaScript?" translate="no">​</a></h2>
<p>Kratučké video o tom, ako sa aj vy môžete stať súčasťou vývoja jazyka a jeho špecifikácie:</p>
<p><a href="https://www.youtube.com/watch?v=OkuNJo9tTtg" target="_blank" rel="noopener noreferrer" class="">https://www.youtube.com/watch?v=OkuNJo9tTtg</a></p>
<iframe width="560" height="315" src="https://www.youtube.com/embed/OkuNJo9tTtg?si=AzhKdNciMUyI4jHU" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin"></iframe>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="opäť-ďalšie-riešenie-na-tvorbu-natívnych-aplikácií-v-javascript-e">Opäť ďalšie riešenie na tvorbu natívnych aplikácií v JavaScript-e<a href="https://hrad.perunhq.org/2026/09/11/frontendove-zvesti-4#op%C3%A4%C5%A5-%C4%8Fal%C5%A1ie-rie%C5%A1enie-na-tvorbu-nat%C3%ADvnych-aplik%C3%A1ci%C3%AD-v-javascript-e" class="hash-link" aria-label="Priama linka na Opäť ďalšie riešenie na tvorbu natívnych aplikácií v JavaScript-e" title="Priama linka na Opäť ďalšie riešenie na tvorbu natívnych aplikácií v JavaScript-e" translate="no">​</a></h2>
<p>Ľudia stojaci za editorom Zed vytvorili svoj vlastný v Rust-e napísaný GPU akcelerovaný
UI framework nazvaný GPUI. Poskytujú k nemu aj binding-y pre React pod názvom GPUIX.
Znamená to, že môžeme písať aplikácie pre počítače, ktoré môžu využívať silu grafických kariet
pre vykreslovanie (napriamo cez Metal, DirectX alebo Vulkan) použitím jazyka (JavaScript/TypeScript) a UI frameworku (React), ktoré dobre poznáme.</p>
<ul>
<li class="">GPUIX: <a href="https://gpuix.dev/" target="_blank" rel="noopener noreferrer" class="">https://gpuix.dev/</a></li>
<li class="">GPUI (UI framework): <a href="https://github.com/zed-industries/zed/tree/main/crates/gpui" target="_blank" rel="noopener noreferrer" class="">https://github.com/zed-industries/zed/tree/main/crates/gpui</a></li>
<li class="">Zed editor: <a href="https://zed.dev/" target="_blank" rel="noopener noreferrer" class="">https://zed.dev/</a></li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="umelá-inteligencia">Umelá inteligencia<a href="https://hrad.perunhq.org/2026/09/11/frontendove-zvesti-4#umel%C3%A1-inteligencia" class="hash-link" aria-label="Priama linka na Umelá inteligencia" title="Priama linka na Umelá inteligencia" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="s-ai-pre-nás-môže-byť-lepšie-použiť-primitívy-namiesto-abstraktných-knižníc">S AI pre nás môže byť lepšie použiť primitívy namiesto abstraktných knižníc<a href="https://hrad.perunhq.org/2026/09/11/frontendove-zvesti-4#s-ai-pre-n%C3%A1s-m%C3%B4%C5%BEe-by%C5%A5-lep%C5%A1ie-pou%C5%BEi%C5%A5-primit%C3%ADvy-namiesto-abstraktn%C3%BDch-kni%C5%BEn%C3%ADc" class="hash-link" aria-label="Priama linka na S AI pre nás môže byť lepšie použiť primitívy namiesto abstraktných knižníc" title="Priama linka na S AI pre nás môže byť lepšie použiť primitívy namiesto abstraktných knižníc" translate="no">​</a></h3>
<p>Žijeme v historických časoch (niekto múdry kedysi povedal, že je oveľa lepšie žiť v pokojných a nudných časoch),
kedy musíme prehodnocovať aj dlho-platiace pravdy, zákonitosti a paradigmy okolo programovania.</p>
<p>Robin Wieruch nedávno napísal článok o svojej skúsenosti z jedného projektu. Uvedomil si,
že programovanie pomocou AI agentov zmenilo "ekonomiku" výberu medzi použitím knižnice tretej strany
poskytujúcej abstrakciu problému (spolu s názormi a pravidlami) na jednej strane. Alebo na druhej strane,
vytvorením vlastného riešenia na zelenej lúke pomocou "primitív".</p>
<p>Mne Robinove vysvetlenia dávajú zmysel a jeho argumentáciu si môžete prečítať v nasledovnom článku:</p>
<ul>
<li class=""><a href="https://www.robinwieruch.de/agentic-coding-bet-on-primitives/" target="_blank" rel="noopener noreferrer" class="">https://www.robinwieruch.de/agentic-coding-bet-on-primitives/</a></li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="apokalyptický-pohľad-na-vývoj-ai-od-bývalého-zamestnance-anthropic-u-a-openai">Apokalyptický pohľad na vývoj AI od bývalého zamestnance Anthropic-u a OpenAI<a href="https://hrad.perunhq.org/2026/09/11/frontendove-zvesti-4#apokalyptick%C3%BD-poh%C4%BEad-na-v%C3%BDvoj-ai-od-b%C3%BDval%C3%A9ho-zamestnance-anthropic-u-a-openai" class="hash-link" aria-label="Priama linka na Apokalyptický pohľad na vývoj AI od bývalého zamestnance Anthropic-u a OpenAI" title="Priama linka na Apokalyptický pohľad na vývoj AI od bývalého zamestnance Anthropic-u a OpenAI" translate="no">​</a></h3>
<p>Nie som si istý, čo k tomuto dodať a čo si o tom myslieť. Je to síce krátke, ale veľmi smutné čítanie.</p>
<ul>
<li class=""><a href="https://x.com/hilbertspaess/status/2097476196791709843" target="_blank" rel="noopener noreferrer" class="">https://x.com/hilbertspaess/status/2097476196791709843</a></li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="kopec-dokumentárnych-filmov-o-technológiách-ktoré-používame-a-máme-radi">Kopec dokumentárnych filmov o technológiách, ktoré používame a máme radi<a href="https://hrad.perunhq.org/2026/09/11/frontendove-zvesti-4#kopec-dokument%C3%A1rnych-filmov-o-technol%C3%B3gi%C3%A1ch-ktor%C3%A9-pou%C5%BE%C3%ADvame-a-m%C3%A1me-radi" class="hash-link" aria-label="Priama linka na Kopec dokumentárnych filmov o technológiách, ktoré používame a máme radi" title="Priama linka na Kopec dokumentárnych filmov o technológiách, ktoré používame a máme radi" translate="no">​</a></h2>
<p>Z nasledovnej štvorice filmov som zatiaľ videl iba ten prvý o Visual Studio Code
a môžem ho s kľudným srdcom odporučiť. Hneď zo začiatku ma prekvapilo, že za vývoj
VS Code je zodpovedný Erich Gamma, čo je jeden zo štvorice autorov, ktorý spísali
knihu o návrhových vzoroch.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-story-of-vs-code">The Story of VS Code<a href="https://hrad.perunhq.org/2026/09/11/frontendove-zvesti-4#the-story-of-vs-code" class="hash-link" aria-label="Priama linka na The Story of VS Code" title="Priama linka na The Story of VS Code" translate="no">​</a></h3>
<p><a href="https://www.youtube.com/watch?v=kHL3XzjpT5w" target="_blank" rel="noopener noreferrer" class="">https://www.youtube.com/watch?v=kHL3XzjpT5w</a></p>
<iframe width="560" height="315" src="https://www.youtube.com/embed/kHL3XzjpT5w?si=1jiaZP15siXvR3GI" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin"></iframe>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-java-story">The Java Story<a href="https://hrad.perunhq.org/2026/09/11/frontendove-zvesti-4#the-java-story" class="hash-link" aria-label="Priama linka na The Java Story" title="Priama linka na The Java Story" translate="no">​</a></h3>
<p><a href="https://www.youtube.com/watch?v=ZqGSg4b_cZA" target="_blank" rel="noopener noreferrer" class="">https://www.youtube.com/watch?v=ZqGSg4b_cZA</a></p>
<iframe width="560" height="315" src="https://www.youtube.com/embed/ZqGSg4b_cZA?si=pI9j9bsKRGKEIJmN" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin"></iframe>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="vite-the-documentary">Vite: The Documentary<a href="https://hrad.perunhq.org/2026/09/11/frontendove-zvesti-4#vite-the-documentary" class="hash-link" aria-label="Priama linka na Vite: The Documentary" title="Priama linka na Vite: The Documentary" translate="no">​</a></h3>
<p><a href="https://www.youtube.com/watch?v=bmWQqAKLgT4" target="_blank" rel="noopener noreferrer" class="">https://www.youtube.com/watch?v=bmWQqAKLgT4</a></p>
<iframe width="560" height="315" src="https://www.youtube.com/embed/bmWQqAKLgT4?si=-DxYXg42r2awEv-6" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin"></iframe>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="nodejs-the-documentary--an-origin-story">Node.js: The Documentary | An origin story<a href="https://hrad.perunhq.org/2026/09/11/frontendove-zvesti-4#nodejs-the-documentary--an-origin-story" class="hash-link" aria-label="Priama linka na Node.js: The Documentary | An origin story" title="Priama linka na Node.js: The Documentary | An origin story" translate="no">​</a></h3>
<p><a href="https://www.youtube.com/watch?v=LB8KwiiUGy0" target="_blank" rel="noopener noreferrer" class="">https://www.youtube.com/watch?v=LB8KwiiUGy0</a></p>
<iframe width="560" height="315" src="https://www.youtube.com/embed/LB8KwiiUGy0?si=elDYrV-gUu0dd2s8" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin"></iframe>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="vytvorte-svoje-vlastné-ssr-riešenia-s-použitím-vite">Vytvorte svoje vlastné SSR riešenia s použitím Vite<a href="https://hrad.perunhq.org/2026/09/11/frontendove-zvesti-4#vytvorte-svoje-vlastn%C3%A9-ssr-rie%C5%A1enia-s-pou%C5%BEit%C3%ADm-vite" class="hash-link" aria-label="Priama linka na Vytvorte svoje vlastné SSR riešenia s použitím Vite" title="Priama linka na Vytvorte svoje vlastné SSR riešenia s použitím Vite" translate="no">​</a></h2>
<p>Mám rád jednoduché riešenie a takisto ráď zisťujem, ako veci fungujú. Pokiaľ ste v tomto na tom podobne
a chceli by ste vedieť, ako si nastaviť server-side rendering pre vašu React stránku s použitím Vite,
tak nasledovný článok je pre vás. Ale upozorňujem, v titulku a najmä v druhej polovici článku autor
používa termín SSG (Static Site Generation, generovanie statických html stránok), ale v skutočnosti
ukazuje SSR (Server-side rendering).</p>
<ul>
<li class=""><a href="https://tendto.github.io/en/posts/ssg-for-react-with-vite/" target="_blank" rel="noopener noreferrer" class="">https://tendto.github.io/en/posts/ssg-for-react-with-vite/</a></li>
</ul>
<p>Okrem iných vecí, autor v článku odkazuje aj na plugin <code>vite-react-ssg</code>, čo mne z neznámych príčin
pripomenulo niekdajší plugin zvaný <code>vite-plugin-ssr</code>. Po nejakú dobu som ho spokojne používal.
Medzičasom sa tento plugin vyvinul v plnohodnotný framework pod názvom Vike. Ak by ste chceli mať
pod kontrolou úplne všetko vo vašej aplikácii, tak Vike je presne pre vás.</p>
<ul>
<li class=""><a href="https://github.com/Daydreamer-riri/vite-react-ssg" target="_blank" rel="noopener noreferrer" class="">https://github.com/Daydreamer-riri/vite-react-ssg</a></li>
<li class=""><a href="https://vike.dev/" target="_blank" rel="noopener noreferrer" class="">https://vike.dev/</a></li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="zatkli-dvoch-členov-skupiny-teampcp-zodpovednej-za-niektoré-zo-shai-hulud-útokov">Zatkli dvoch členov skupiny TeamPCP zodpovednej za niektoré zo Shai-Hulud útokov<a href="https://hrad.perunhq.org/2026/09/11/frontendove-zvesti-4#zatkli-dvoch-%C4%8Dlenov-skupiny-teampcp-zodpovednej-za-niektor%C3%A9-zo-shai-hulud-%C3%BAtokov" class="hash-link" aria-label="Priama linka na Zatkli dvoch členov skupiny TeamPCP zodpovednej za niektoré zo Shai-Hulud útokov" title="Priama linka na Zatkli dvoch členov skupiny TeamPCP zodpovednej za niektoré zo Shai-Hulud útokov" translate="no">​</a></h2>
<p>Predpokladám, že si pamätáte nekonečné vlny útokov na supply-chain infraštruktúru z pred pár mesiacov,
ktoré sme skrátene volali Shai-Hulud. Už som dnes písal, že žijeme v historických časoch a zdá sa,
že s príchodom LLM majú aj script-kiddies k dispozícii oveľa mocnejšie nástroje. Z prvých dojmov
sa mi zdá, že TeamPCP nie sú typickými aktérmi s nejakým plánom, agendou (alebo štátom za chrbtom),
ale iba zopár mladíkov, ktorí sa chytili príležitosti. To však neznamená, že nie sú nebezpeční.
A nielen pre IT infraštruktúru, ale aj fyzicky nebezpeční. Ak chcete vedieť viac, prečítajte si
nasledovný článok, ktorý napísal bezpečnostný výskumník Charlie Eriksen:</p>
<ul>
<li class=""><a href="https://www.aikido.dev/blog/teampcp-arrested-supply-chain" target="_blank" rel="noopener noreferrer" class="">https://www.aikido.dev/blog/teampcp-arrested-supply-chain</a></li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="eve-online-migruje-na-python-3">EVE Online migruje na Python 3<a href="https://hrad.perunhq.org/2026/09/11/frontendove-zvesti-4#eve-online-migruje-na-python-3" class="hash-link" aria-label="Priama linka na EVE Online migruje na Python 3" title="Priama linka na EVE Online migruje na Python 3" translate="no">​</a></h2>
<p>Táto novinka sa netýka frontendu, ani JavaScriptu. Vyzerá to tak, že s pomocou AI&nbsp;agentov je dnes
veľmi jednoduché portovať projekt z jedného frameworku do druhého. Dokonca aj z jedného jazyka
do druhého. Ako príklady sme nedávno videli TypeScript alebo Bun. Kedysi nám zvyklo zabrať mesiace
a roky vymeniť niečo takéto alebo zorganizovat masívny refaktoring. Dnes sa z toho stáva záležitosť
na týždne, dni a občas dokonca hodiny.</p>
<p>Ale stále existujú projekty a firmy, ktoré si zvolili inú cestu a stále vo veľkom spoliehajú na
ručný prepis aspoň v kriticky dôležitých častiach ich aplikácie.</p>
<p>Jednou z takých spoločností je Fenris Creations a projekt nie je nič menšie ako EVE Online.
Najväčšia online MMORPG hra odohrávajúca sa v jednom sharde (svete). Áno, sú aj väčšie MORPG hry,
ale tie majú zväčša množstvo shardov (svetov), v ktorých sa pohybujú ich hráči. V EVE Online hráči
zdieľajú jeden svet už vyše 25 rokov. A je to v skutku svet sám o sebe.</p>
<p>Táto hra nie je ľahká (poznáte inú hru, ktoré má oficiálny plugin do MS Office?), ani lacná má
vlastnú vyspelú ekonomiku. Čokoľvek v hre viete priamo prerátať na peniaze skutočného sveta.
Takže pre tvorcov je veľmi dôležité, aby všetky výpočty prebiehali správne, nech robia akúkoľvek
zmenu. Nieto ešte, keď robia kompletný prepis z jedného jazyka do druhého.</p>
<p>A to je presne to, čo práve robia. Prechádzajú z používania Python 2 (už niekoľko rokov sa nevyvíja)
na Python 3. Ak vás zaujíma, ako si to naplánovali, aké výzvy musia prekonávať, tak mám pre vás dva
zdroje. Jeden článok so všeobecnými informáciami a potom video z konferencie, ktoré ide viac
do detailov:</p>
<ul>
<li class=""><a href="https://www.eveonline.com/news/view/the-move-to-python-3-begins" target="_blank" rel="noopener noreferrer" class="">https://www.eveonline.com/news/view/the-move-to-python-3-begins</a></li>
<li class=""><a href="https://www.youtube.com/watch?v=4uaEhx7LNAc" target="_blank" rel="noopener noreferrer" class="">https://www.youtube.com/watch?v=4uaEhx7LNAc</a></li>
</ul>
<iframe width="560" height="315" src="https://www.youtube.com/embed/4uaEhx7LNAc?si=L2C-QvHVnN_RsMlk" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin"></iframe>
<p>Ak ste EVE Online nepoznali a chcete vedieť viac:</p>
<ul>
<li class="">Zhrnutie na Wikipédii: <a href="https://en.wikipedia.org/wiki/Eve_Online" target="_blank" rel="noopener noreferrer" class="">https://en.wikipedia.org/wiki/Eve_Online</a></li>
<li class="">Jeden z mnohých trailerov (tento má 17 rokov): <a href="https://www.youtube.com/watch?v=08hmqyejCYU" target="_blank" rel="noopener noreferrer" class="">https://www.youtube.com/watch?v=08hmqyejCYU</a></li>
</ul>
<iframe width="560" height="315" src="https://www.youtube.com/embed/08hmqyejCYU?si=z4XguLp8yDnbdBL0" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin"></iframe>
<ul>
<li class="">Dokumentárny film "The Making of EVE Online": <a href="https://www.youtube.com/watch?v=vnUvuV1QFKk" target="_blank" rel="noopener noreferrer" class="">https://www.youtube.com/watch?v=vnUvuV1QFKk</a> (toto naozaj odporúčam)</li>
</ul>
<iframe width="560" height="315" src="https://www.youtube.com/embed/vnUvuV1QFKk?si=ein3Q0c7TRwHd10Z" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin"></iframe>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="let-tak-pre-zábavu">Let tak pre zábavu<a href="https://hrad.perunhq.org/2026/09/11/frontendove-zvesti-4#let-tak-pre-z%C3%A1bavu" class="hash-link" aria-label="Priama linka na Let tak pre zábavu" title="Priama linka na Let tak pre zábavu" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="niekto-vytvoril-hľadanie-mín-len-v-247-bajtoch-js-kódu">Niekto vytvoril Hľadanie mín len v 247 bajtoch JS kódu<a href="https://hrad.perunhq.org/2026/09/11/frontendove-zvesti-4#niekto-vytvoril-h%C4%BEadanie-m%C3%ADn-len-v-247-bajtoch-js-k%C3%B3du" class="hash-link" aria-label="Priama linka na Niekto vytvoril Hľadanie mín len v 247 bajtoch JS kódu" title="Priama linka na Niekto vytvoril Hľadanie mín len v 247 bajtoch JS kódu" translate="no">​</a></h3>
<p>Niekedy len žasnem nad tým, čo niektorí ľudia dokážu a aká je úroveň ich znalostí:</p>
<ul>
<li class=""><a href="https://yui.dev/blog/minesweeper-in-247-bytes" target="_blank" rel="noopener noreferrer" class="">https://yui.dev/blog/minesweeper-in-247-bytes</a></li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="koniec-softvérového-vývoja-">Koniec softvérového vývoja 🤣<a href="https://hrad.perunhq.org/2026/09/11/frontendove-zvesti-4#koniec-softv%C3%A9rov%C3%A9ho-v%C3%BDvoja-" class="hash-link" aria-label="Priama linka na Koniec softvérového vývoja 🤣" title="Priama linka na Koniec softvérového vývoja 🤣" translate="no">​</a></h3>
<p><img decoding="async" loading="lazy" alt="Najnovšia kniha od O&amp;#39;Reilly" src="https://hrad.perunhq.org/assets/images/end-of-swe-5e878fef22a0f9ea6d93f978ddccd8a1.webp" width="921" height="1258" class="img_ev3q"></p>
<p>Zdroj obrázku: <a href="https://www.reddit.com/r/ProgrammerHumor/comments/1wangyc/thelastoreillyjustdropped/" target="_blank" rel="noopener noreferrer" class="">https://www.reddit.com/r/ProgrammerHumor/comments/1wangyc/thelastoreillyjustdropped/</a></p>]]></content>
        <category label="AI" term="AI"/>
        <category label="návrhové vzory" term="návrhové vzory"/>
        <category label="EVE Online" term="EVE Online"/>
        <category label="GPUI" term="GPUI"/>
        <category label="GPUIX" term="GPUIX"/>
        <category label="JavaScript" term="JavaScript"/>
        <category label="native" term="native"/>
        <category label="novinky" term="novinky"/>
        <category label="prepis" term="prepis"/>
        <category label="Python" term="Python"/>
        <category label="React" term="React"/>
        <category label="refaktoring" term="refaktoring"/>
        <category label="Rust" term="Rust"/>
        <category label="Shai Hulud" term="Shai Hulud"/>
        <category label="supply-chain attack" term="supply-chain attack"/>
        <category label="SVG" term="SVG"/>
        <category label="Vike" term="Vike"/>
        <category label="Vitest" term="Vitest"/>
        <category label="Zed" term="Zed"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Frontendové zvesti #3]]></title>
        <id>https://hrad.perunhq.org/2024/04/07-frontendove-zvesti-3/</id>
        <link href="https://hrad.perunhq.org/2024/04/07-frontendove-zvesti-3/"/>
        <updated>2024-04-07T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Tentokrát som z môjho zoznamu prečítaných vecí vybral zosumarizovanie toho, ako fungujú spojené typy v TypeScript-e,]]></summary>
        <content type="html"><![CDATA[<p>Tentokrát som z môjho zoznamu prečítaných vecí vybral zosumarizovanie toho, ako fungujú spojené typy v TypeScript-e,
ako v React-e naimplementovať návrhový vzor Strategy, ako urobiť globálny stav len pomocou hookov a nakoniec si dovolím malú predpoveď
o tom, či nás čaká obdobie plné nových frameworkov pre React.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="spojené-typy-v-typescript-e">Spojené typy v TypeScript-e<a href="https://hrad.perunhq.org/2024/04/07-frontendove-zvesti-3/#spojen%C3%A9-typy-v-typescript-e" class="hash-link" aria-label="Priama linka na Spojené typy v TypeScript-e" title="Priama linka na Spojené typy v TypeScript-e" translate="no">​</a></h2>
<p>Článok: <a href="https://claritydev.net/blog/typescript-union-types-guide" target="_blank" rel="noopener noreferrer" class="">https://claritydev.net/blog/typescript-union-types-guide</a></p>
<p>Alex Khomenko uverejnil 17. marca na svojom blogu článok, kde rýchlo, jasne a jednoducho vysvetľuje, čo sú a ako fungujú spojené typy (<em>union types</em>) v TypeScript-e.
Alex ukazuje aj to, akými spôsobmi TypeScript-u pomôžete presnejšie určiť konkrétny typ (<em>type narrowing</em>) a uvidíte aj <em>type guard</em> funkciu, čo je veľmi užitočný
konštrukt. Je to fajn čítanie nielen pre učenie sa, ale aj pre osvieženie vedomostí.</p>
<p>Pokiaľ sa učíte TypeScript, tak vám dám tip na celkom dobrú knižku. Napísal ju <a href="https://www.joshuakgoldberg.com/" target="_blank" rel="noopener noreferrer" class="">Josh Goldberg</a> a volá sa <a href="https://www.learningtypescript.com/" target="_blank" rel="noopener noreferrer" class="">Learning TypeScipt.</a></p>
<p><img decoding="async" loading="lazy" alt="Obal knihy Learning TypeScript" src="https://hrad.perunhq.org/assets/images/2024-04-07-learning-typescript-cover-ef7ccb54e13100f306f31e9ee7bb52e4.png" width="306" height="432" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="návrhový-vzor-strategy-v-react-e">Návrhový vzor Strategy v React-e<a href="https://hrad.perunhq.org/2024/04/07-frontendove-zvesti-3/#n%C3%A1vrhov%C3%BD-vzor-strategy-v-react-e" class="hash-link" aria-label="Priama linka na Návrhový vzor Strategy v React-e" title="Priama linka na Návrhový vzor Strategy v React-e" translate="no">​</a></h2>
<p>Článok: <a href="https://dev.to/itswillt/applying-design-patterns-in-react-strategy-pattern-enn" target="_blank" rel="noopener noreferrer" class="">https://dev.to/itswillt/applying-design-patterns-in-react-strategy-pattern-enn</a></p>
<p>Koncom marca sa na dev.to objavilo pokračovanie jedného článku o implementácii návrhového vzoru Strategy v React-e. Odporúčam si prečítať
články pekne v poradí, najskôr <a href="https://dev.to/itswillt/applying-design-patterns-in-react-strategy-pattern-enn" target="_blank" rel="noopener noreferrer" class="">prvý diel</a> a
potom <a href="https://dev.to/itswillt/applying-design-patterns-in-react-strategy-pattern-part-2-221i" target="_blank" rel="noopener noreferrer" class="">ten druhý</a>.</p>
<p>V prvej časti uvidíte implementáciu Strategy vzoru pomocou tried a v druhej pomocou niečoho, čomu ja hovorím mapovacie objekty. Mapovacie objekty sú fajn,
pretože nielenže eliminujú Shotgun Surgery, ale zároveň nám otvárajú možnosti konfigurácie mimo kódu. Pozrite sa napríklad na kód <code>Button.utils.ts</code> z
predposledného príkladu. Keby sme mali názvy fieldov a objekty definované mimo funkcie <code>getButtonVariantMapping</code> alebo objektu <code>BUTTON_SIZE_STYLE_MAPPING</code>, tak
by sme ich vedeli vyskladať aj dynamicky.</p>
<p>Nie každá situácia a každý projekt však takúto možnosť potrebuje. Je to predsa len komplikácia a ďalšia abstrakcia navyše. Pokiaľ ju však v kóde máme,
tak zrazu máme k dispozícii mechanizmus na vytváranie vysoko konfigurovateľných aplikácií.</p>
<p>Tu je približný náčrt, ako by to mohlo fungovať:</p>
<div class="language-typescript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-typescript codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> allowedVariants </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">await</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">loadFromConfiguration</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">async</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">function</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">loadFromConfiguration</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token builtin">Promise</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain">ButtonVariant</span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// tu načítame pole z databázy alebo súboru,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// vyzerá napríklad takto:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"contained"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"outlined"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"text"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> getButtonVariantMapping </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">createButtonVariantMapping</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">allowedVariants</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">function</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">createButtonVariantMapping</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">allowedVariants</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> ButtonVariant</span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">function</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">getButtonVariantMapping</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">color</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> ButtonColor </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"primary"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> mapping </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">for</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> variant </span><span class="token keyword" style="color:#00009f">of</span><span class="token plain"> allowedVariants</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            mapping</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">variant</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">getAvailableButtonVariant</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">variant</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> color</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> mapping</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic">// stále musíme mať miesto, kde sú definované všetky dostupné varianty</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">function</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">getAvailableButtonVariant</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">variant</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> ButtonVariant</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> color</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> ButtonColor</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> allVariants </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        contained</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            backgroundColor</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">${</span><span class="token template-string interpolation">color</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">}</span><span class="token template-string string" style="color:#e3116c">.main</span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            color</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"white"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token string-property property" style="color:#36acaa">"&amp;:hover"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                backgroundColor</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">${</span><span class="token template-string interpolation">color</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">}</span><span class="token template-string string" style="color:#e3116c">.dark</span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        outlined</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            backgroundColor</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"transparent"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            color</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">${</span><span class="token template-string interpolation">color</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">}</span><span class="token template-string string" style="color:#e3116c">.main</span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            border</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"1px solid"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            borderColor</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">${</span><span class="token template-string interpolation">color</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">}</span><span class="token template-string string" style="color:#e3116c">.main</span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token string-property property" style="color:#36acaa">"&amp;:hover"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">                backgroundColor</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">${</span><span class="token template-string interpolation">color</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">}</span><span class="token template-string string" style="color:#e3116c">.light</span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic">// tu budú všetky ostatné varianty</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> allVariants</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">variant</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<p>Ešte si dovolím jednu poslednú poznámku k článku. Pokiaľ sa v kóde snažíte dôsledne dodržiavať SOLID princípy a špeciálne <a class="" href="https://hrad.perunhq.org/2023/10/01-open-closed-principle">Open-Closed</a>,
tak v kóde častokrát dôjdete k implementácii Strategy vzoru úplne prirodzene a možno ani nebudete vedieť, že to nejaký návrhový vzor je. SOLID
princípy sú totiž naozaj základným stavebným kameňom dobrej architektúry a všetko ostatné len stavia na nich.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="globálny-stav-v-react-e-bez-redux-u-a-kontextu">Globálny stav v React-e bez Redux-u a kontextu<a href="https://hrad.perunhq.org/2024/04/07-frontendove-zvesti-3/#glob%C3%A1lny-stav-v-react-e-bez-redux-u-a-kontextu" class="hash-link" aria-label="Priama linka na Globálny stav v React-e bez Redux-u a kontextu" title="Priama linka na Globálny stav v React-e bez Redux-u a kontextu" translate="no">​</a></h2>
<p>Článok: <a href="https://yoavik.com/snippets/use-global-state" target="_blank" rel="noopener noreferrer" class="">https://yoavik.com/snippets/use-global-state</a></p>
<p>Narazil som na článok popisujúci celkom pekné riešenie, ako pomocou základných hookov (<code>useState</code>, <code>useEffect</code> a <code>useSyncExternalStore</code>) dosiahnuť, že v aplikácii
budete mať globálny stav bez toho, aby ste použili externý store typu Redux alebo prípadne kontext. Môžete sa z článku inšpirovať pre svoje potreby, prípadne si len
pozrieť toto elegantné riešenie.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="nové-meta-frameworky-pre-react">Nové meta frameworky pre React<a href="https://hrad.perunhq.org/2024/04/07-frontendove-zvesti-3/#nov%C3%A9-meta-frameworky-pre-react" class="hash-link" aria-label="Priama linka na Nové meta frameworky pre React" title="Priama linka na Nové meta frameworky pre React" translate="no">​</a></h2>
<p>Zistil som, že vznikol nový meta framework <a href="https://github.com/dai-shi/waku" target="_blank" rel="noopener noreferrer" class="">Waku</a>. On teda vznikol už v marci 2023, ale v širšom povedomí sa objavil až teraz. Možno sa mýlim,
ale predpokladám, že o nových meta frameworkoch založených na React-e budeme v dohľadnej dobe počúvať viac. Jednak príchod <em>React Server Components</em> (<em>RSC</em>) vyslovene láka na to,
aby si ich niektorí ľudia vyskúšali naimplementovať po svojom. Zároveň je nie každý spokojný so všetkými aspektami <em>RSC</em> a niektoré ich súčasti chcú robiť po svojom (napríklad
namiesto <em>Server Actions</em> používať <em>tRPC</em> alebo niečo podobné). V neposlednom rade nesmieme podceniť ani nespokojnosť veľkej časti vývojárov s tým, ako v Next.js lámu doterajšie
paradigmy a s niektorými vecami idú proti štandardom. Myslím si preto, že doba je zrelá a kopa šikovných ľudí už pracuje na vlastných frameworkoch.</p>]]></content>
        <category label="novinky" term="novinky"/>
        <category label="TypeScript" term="TypeScript"/>
        <category label="React" term="React"/>
        <category label="návrhové vzory" term="návrhové vzory"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Frontendové zvesti #2]]></title>
        <id>https://hrad.perunhq.org/2024/03/17-frontendove-zvesti-2/</id>
        <link href="https://hrad.perunhq.org/2024/03/17-frontendove-zvesti-2/"/>
        <updated>2024-03-17T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Dnes si prečítate, ako lepšie písať testy s Testing Library, k čomu je nástroj Testing Playground,]]></summary>
        <content type="html"><![CDATA[<p>Dnes si prečítate, ako lepšie písať testy s Testing Library, k čomu je nástroj Testing Playground,
že Vike už má v sebe čiastočnú podporu pre React Server Components, Remix a Vite je hotová vec a mali
by ste plánovať upgrade. Nakoniec vám pri príležitosti vydania linuxovej verzie terminálu Warp
dám zopár tipov aj na iné terminály a pri troche šťastia vás ukecám na vyskúšanie tmux-u.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="najlepšie-spôsoby-ako-písať-testy-s-použitím-testing-library">Najlepšie spôsoby, ako písať testy s použitím Testing Library<a href="https://hrad.perunhq.org/2024/03/17-frontendove-zvesti-2/#najlep%C5%A1ie-sp%C3%B4soby-ako-p%C3%ADsa%C5%A5-testy-s-pou%C5%BEit%C3%ADm-testing-library" class="hash-link" aria-label="Priama linka na Najlepšie spôsoby, ako písať testy s použitím Testing Library" title="Priama linka na Najlepšie spôsoby, ako písať testy s použitím Testing Library" translate="no">​</a></h2>
<p>Článok: <a href="https://claritydev.net/blog/improving-react-testing-library-tests" target="_blank" rel="noopener noreferrer" class="">https://claritydev.net/blog/improving-react-testing-library-tests</a></p>
<p>V prípade, že mám medzi čitateľmi niekoho, kto programuje frontend a ešte nepíše testy pomocou
<a href="https://testing-library.com/" target="_blank" rel="noopener noreferrer" class="">Testing Library</a>, tak o veľa prichádza. Naozaj odporúčam sa na knižnicu pozrieť a čo najskôr ju
zaradiť medzi svoje používané nástroje.</p>
<p>Testing Library je totiž knižnica, ktorú môžete jednoducho, rýchlo a bez zložitého nastavovania používať
vo svojich Jest alebo Vitest testoch (ale aj v iných test runneroch) na overovanie správania vašich
komponent. Pokiaľ používate Cypress alebo Playwright, tak vedzte, že Testing Library nie je ich náhradou,
ale veľmi vhodným a rýchlejším doplnkom.</p>
<p>A teraz k článku. Alex Khomenko si dal tú prácu a na svojom blogu spísal tipy, ako by sa podľa neho mali písať
testy pre Testing Library. Zameral sa síce na jej verziu pre React, ale všetko tam spomenuté platí aj pre
iné UI knižnice.</p>
<p>Alex píše o tom, že pokiaľ sa len trochu dá, tak by sme mali elementy v komponente vyhľadávať pomocou
<code>*byRole</code> funkcií (v nomenklatúre Testing Library sa týmto funkciám hovorí queries). Vďaka tomu si
nepriamo otestujeme, či sú naše komponenty dobre navrhnuté aj z hľadiska prístupnosti a zároveň sa naučíme,
ako ich správne vytvárať. A to je veľmi dôležité pre každého návštevníka, ktorý má s používaním nášho
webu nejaké problémy (zrakové, ovládacie atď). Alex v článku ukazuje aj nejaké príklady zlých testov,
ktoré následne upravuje.</p>
<p>Ďalej v článku rozoberá aj to, prečo by sme mali používať <code>userEvent</code> namiesto <code>fireEvent</code>. Hlavný dôvod
je ten, že kým <code>fireEvent</code> len vyvolá udalosť pomocou API prehliadača, tak <code>userEvent</code> simuluje aj ďalšie
veci, ktoré by sa udiali, keby udalosť vyvolával skutočný ľudský používateľ.</p>
<p>Pekné príklady Alex vytvoril aj pre návod, ako sa pomocou <code>findBy*</code> vieme zbaviť používania <code>waitFor</code>.</p>
<p>V článku je toho ešte viac, takže pokiaľ Testing Library používate, tak si ho bežte pozrieť a určite
sa niečo nové naučíte.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="testing-playground">Testing Playground<a href="https://hrad.perunhq.org/2024/03/17-frontendove-zvesti-2/#testing-playground" class="hash-link" aria-label="Priama linka na Testing Playground" title="Priama linka na Testing Playground" translate="no">​</a></h2>
<p>Webstránka: <a href="https://testing-playground.com/" target="_blank" rel="noopener noreferrer" class="">https://testing-playground.com/</a></p>
<p>Z Alexovho článku zmieňovaného vyššie som sa dozvedel o nástroji <a href="https://testing-playground.com/" target="_blank" rel="noopener noreferrer" class="">Testing Playground</a>,
ktorý nám pomôže s výberom vhodnej query na nájdenie elementu. Stačí do editora vložiť vygenerované
HTML, pobehať myšou po náhľade a sledovať odporúčané query. Nástroj sa snaží preferovať <code>*byRole</code>
funkcie, aby sme mali dobrú prístupnosť.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="vike-má-podporu-pre-react-server-components">Vike má(?) podporu pre React Server Components<a href="https://hrad.perunhq.org/2024/03/17-frontendove-zvesti-2/#vike-m%C3%A1-podporu-pre-react-server-components" class="hash-link" aria-label="Priama linka na Vike má(?) podporu pre React Server Components" title="Priama linka na Vike má(?) podporu pre React Server Components" translate="no">​</a></h2>
<p>Stránka v dokumentácii: <a href="https://vike.dev/react" target="_blank" rel="noopener noreferrer" class="">https://vike.dev/react</a></p>
<p>Kedysi, keď som potreboval pre svoje SPA aplikácie vo Vue.js alebo React-e pridať aj podporu pre
rendrovanie na serveri (SSR) alebo generovať statickú stránku počas buildu (SSG), tak som na to
používal plugin pre <a href="https://vitejs.dev/" target="_blank" rel="noopener noreferrer" class="">Vite</a> nazývaný vite-pluggin-ssr. Už vtedy to nebol ani
tak plugin, ako skôr nástroj na tvorbu vlastného frameworku pre ľubovoľnú rendrovaciu knižnicu.
Medzičasom toho vie tento nástroj ešte viac a autori si to uvedomujú, tak projekt premenovali
na <a href="https://vike.dev/" target="_blank" rel="noopener noreferrer" class="">Vike</a>.</p>
<p>Keďže som postupne predsa len prešiel na Next.js, tak Vike už tak nesledujem, ale tento týždeň
som zistil, že podporujú aj React Server Components. Z troch zložiek RSC majú síce podporu len
pre dve: <em>Server Actions</em> a <em>Progressive Rendering</em> a aj z toho pre serverové akcie používajú
<a href="https://telefunc.com/" target="_blank" rel="noopener noreferrer" class="">Telefunc</a> namiesto <code>use server</code>. Niet sa veľmi, čo čudovať. Autorom
Telefunc-u je <a href="https://github.com/brillout" target="_blank" rel="noopener noreferrer" class="">ten istý človek</a>, ktorý stvoril Vike.</p>
<p>Ja som sa na Telefunc len rýchlo pozrel a musím povedať, že to nevyzerá zle. Je to menej magické,
ako <code>use server</code> a tak aj jednoduchšie na pochopenie. Možno, keby autori React-u urobili podobné
nemagické riešenie, tak by si ušetrili kopu negatívnych komentárov od komunity. Na druhej strane,
keď už niekto pochopí, ako serverové akcie fungujú, tak vie, že <code>use server</code> je vlastne len syntax
suggar pre niečo také, ako robí Telefunc.</p>
<p>Treťou zložkou RSC sú samotné <em>serverové komponenty</em> a tieto zatiaľ Vike nepodporuje, pretože
podľa autorov ešte nie sú vhodné do produkcie (tie v React-e, nie vo Vike). Odporúčajú naďalej
používať SSR, SSG a SPA a veria tomu, že malé výkonnostné zisky so serverovými komponentami nestoja
za zložitejší programátorský zážitok (DX, Developer eXperience). Nuž, neviem. Mne sa zdá, že
programátorský zážitok pred problémami používateľov uprednostňujeme posledných 15 rokov a už je na
čase, aby sme hľadali používateľsky vhodnejšie riešenia a to aj za cenu (dočasne) zhoršeného DX.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="vite-v-remix-e-je-stabilná-vec">Vite v Remix-e je stabilná vec<a href="https://hrad.perunhq.org/2024/03/17-frontendove-zvesti-2/#vite-v-remix-e-je-stabiln%C3%A1-vec" class="hash-link" aria-label="Priama linka na Vite v Remix-e je stabilná vec" title="Priama linka na Vite v Remix-e je stabilná vec" translate="no">​</a></h2>
<p>Oznámenie: <a href="https://remix.run/blog/remix-vite-stable" target="_blank" rel="noopener noreferrer" class="">https://remix.run/blog/remix-vite-stable</a></p>
<p><a href="https://remix.run/" target="_blank" rel="noopener noreferrer" class="">Remix</a> je po Next.js asi druhý najpopulárnejší meta-framework pre React. A na rozdiel od Next.js
si v Remix-e dávajú veľmi záležať na tom, aby podporovali štandardné webové API, správanie a štandardy
celkovo. Pokiaľ vás štve, že Next.js poslednú dobu na štandardy kašle a niekedy ide vyslovene proti nim
a máte slobodu zmeniť framework, tak pouvažujte nad Remix-om.</p>
<p>Remix tím 20. februára oznámil, že sa im podarilo dosiahnuť, aby bolo použite Remix-u spolu s Vite-om
stabilné. Je to veľká vec, pretože od tejto chvíle budú všetky nové veci v Remix-e vyvíjané len
pre Vite, dokumentácia sa bude postupne upravovať a Remix 3 bude podporovať iba Vite. Je teda čas
si naplánovať upgrade.</p>
<p>V oznámení sa píše, že vďaka prechodu na Vite sa v Remix-e urobili nejaké nové architektonické rozhodnutia,
alebo sa upravili staré a nevhodné. Menovite to je napríklad nový tzv. <a href="https://remix.run/docs/en/main/future/spa-mode" target="_blank" rel="noopener noreferrer" class="">SPA mode</a>,
ktorý umožňuje vybuildiť celú Remix aplikáciu do statického tvaru, takže nepotrebujete JavaScript na serveri.
Upravila sa konfigurácia pre <code>basename</code>, cieľové adresáre pre build a prišli nové spôsoby na oddeľovanie
serverového a klientského kódu (<code>.server</code> priečinky, <code>serverOnly$</code> makro na označovanie kusov kódu).</p>
<p>Noviniek je viac, v oznámení je každej venovaný vlastný priestor aj s linkami na prípadné detailnejšie informácie.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="warp-terminál-je-už-aj-pre-linux">Warp terminál je už aj pre Linux<a href="https://hrad.perunhq.org/2024/03/17-frontendove-zvesti-2/#warp-termin%C3%A1l-je-u%C5%BE-aj-pre-linux" class="hash-link" aria-label="Priama linka na Warp terminál je už aj pre Linux" title="Priama linka na Warp terminál je už aj pre Linux" translate="no">​</a></h2>
<p>Oznámenie: <a href="https://www.warp.dev/blog/warp-for-linux" target="_blank" rel="noopener noreferrer" class="">https://www.warp.dev/blog/warp-for-linux</a></p>
<p>Toto nie je úplne frontendová novinka, ale keďže terminál je nástroj, v ktorom bežne pracujeme,
tak som sa rozhodol ju sem zaradiť.</p>
<p>Na Mac-och už programátori mohli nejakú dobu používať terminál <a href="https://www.warp.dev/" target="_blank" rel="noopener noreferrer" class="">Warp</a>,
ktorý má príjemný a prívetivejší vizuál a to najmä pre začiatočníkov. Kombinuje terminálové
rozhranie s rôznymi menu, dialógmi a comboboxami známymi z bežných aplikácií a tak pôsobí menej
nepriateľsky pre "konzolovo-slabých" 😅. Okrem toho má skvelý nápovedný systém (Warp AI) a podporu pre niečo, ako bookmarkovanie
príkazov.</p>
<p>Pokiaľ nemáte prácu v termináli radi, alebo chcete krajší zážitok, tak sa na Warp určite pozrite,
možno je to niečo, čo hľadáte. Pre niekoho môže byť nevýhodou to, že nejde o open-source projekt.</p>
<p>Koncom februára vyšla verzia Warp-u konečne aj pre Linux, takže keď sa mi jedného dňa znepáči
môj aktuálne používaný terminálový emulátor, tak si Warp pridám do kandidátov na preskúmanie.</p>
<p>Keby vás zaujímalo, čo používam ja, tak je to <a href="https://alacritty.org/" target="_blank" rel="noopener noreferrer" class="">Alacritty</a>. Rýchly terminál
s jednoduchou konfigurácou v yaml formáte, rendrujúci cez GPU.</p>
<p>Alacritty však nemá podporu pre taby, čo niekomu môže prekážať. Ja taby nepoužívam a nepotrebujem,
pretože namiesto nich mám tmux, čo je oveľa mocnejší nástroj. K tmux-u som napísal aj sériu článkov
a natočil videá: <a class="" href="https://hrad.perunhq.org/2021/03/27-tmux-co-to-je/">predstavenie</a>, <a class="" href="https://hrad.perunhq.org/2021/04/22-tmux-konfiguracia/">moja konfigurácia</a>
a návod, ako si pomocou tmux-u viete vytvoriť tzv. <a class="" href="https://hrad.perunhq.org/2021/05/28-startovacie-skripty-pre-projekty/">štartovacie skripty pre projekty</a>.
K videám sa prekliknete priamo z článkov, hneď pod nadpisom je URL na Youtube.</p>
<p>Dám vám tipy aj na ďalšie zaujímavé terminály, na ktoré z času na čas pozriem a chvíľu skúšam:</p>
<ul>
<li class="">
<p><a href="https://sw.kovidgoyal.net/kitty/" target="_blank" rel="noopener noreferrer" class="">kitty</a> - rýchly a pekný terminál pre Linux, macOS a BSD. Má super podporu pre
taby, rozdeľovanie okien, skriptovanie a tisíc iných vecí. Škoda, že ich nepotrebujem, lebo mám tmux.</p>
</li>
<li class="">
<p><a href="https://www.enlightenment.org/about-terminology.md" target="_blank" rel="noopener noreferrer" class="">Terminology</a> - toto je terminál len pre Linux a BSD systémy.
Je neuveriteľne rýchly, podporuje taby, rozdeľovanie okien, animované pozadia, prehrávanie videí na pozadí (áno,
môžete programovať a za vaším kódom vám beží film). Pre mňa je blbé to, že nespolupracuje dobre s tmux-om,
nemá textový konfiguračný súbor (musím používať myš a vyklikávať možnosti!) a jeho stabilita je vecou náhody.</p>
</li>
</ul>
<p>Ešte jeden tip na terminál, ktorý som používal celé roky:</p>
<ul>
<li class=""><a href="https://gnome-terminator.org/" target="_blank" rel="noopener noreferrer" class="">Terminator</a> je terminál pre Linux, ktorý umožňuje rozdeliť jedno okno na viacero
menších a v každom z nich je klasický Gnome Terminal, čo je predvolený terminál v Ubuntu. Používate tak známu klasiku
novým spôsobom.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="záver">Záver<a href="https://hrad.perunhq.org/2024/03/17-frontendove-zvesti-2/#z%C3%A1ver" class="hash-link" aria-label="Priama linka na Záver" title="Priama linka na Záver" translate="no">​</a></h2>
<p>Noviniek vo frontende sa udialo samozrejme oveľa viac, než som spomenul. Opäť mám viac novo otvorených tabov v prehliadači
čakajúcich na prečítanie, než som ich prečítal a zavrel. Tento týždeň je to o to horšie, že mám novú hračku. Kúpil som si
<a href="https://foundryvtt.com/" target="_blank" rel="noopener noreferrer" class="">Foundry</a>, čo je pomôcka na hranie dračáku online, tak sa to teraz učím ovládať.</p>]]></content>
        <category label="Testing Library" term="Testing Library"/>
        <category label="testovanie" term="testovanie"/>
        <category label="Vike" term="Vike"/>
        <category label="Vite" term="Vite"/>
        <category label="Remix" term="Remix"/>
        <category label="terminál" term="terminál"/>
        <category label="Warp" term="Warp"/>
        <category label="kitty" term="kitty"/>
        <category label="Terminology" term="Terminology"/>
        <category label="terminator" term="terminator"/>
        <category label="Alacritty" term="Alacritty"/>
        <category label="Foundry VTT" term="Foundry VTT"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Ťažké časy pre React?]]></title>
        <id>https://hrad.perunhq.org/2024/03/09-tazke-casy-pre-react/</id>
        <link href="https://hrad.perunhq.org/2024/03/09-tazke-casy-pre-react/"/>
        <updated>2024-03-09T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Už niekoľko týždňov sa na internete objavujú vyjadrenia od známych aj menej známych používateľov React-u,]]></summary>
        <content type="html"><![CDATA[<p>Už niekoľko týždňov sa na internete objavujú vyjadrenia od známych aj menej známych používateľov React-u,
v ktorých vyjadrujú svoju nespokojnosť s jeho stavom. Počet takýchto vyjadrení sa nedal ignorovať,
takže sa mi v hlave prirodzene objavili otázky, či sa o React treba obávať a či prípadne nehľadať náhradu.
V nasledujúcom texte sa dozviete, prečo sú teraz ľudia s React-tom nespokojní a k akej odpovedi na predchádzajúce otázky som sa dopracoval.</p>
<!-- -->
<p>V roku 2023 sme sa v práci rozhodli, že React bude našou knižnicou prvej voľby pre každý nový projekt.
A ako odporúčaný framework sme si vybrali Next.js. Rozhodli sme sa tak napriek tomu,
že už vtedy bolo vidieť medzi vývojármi rastúcu popularitu <a href="https://dev.to/this-is-learning/the-evolution-of-signals-in-javascript-8ob" target="_blank" rel="noopener noreferrer" class="">signálov</a>
a <a href="https://www.builder.io/blog/hydration-is-pure-overhead" target="_blank" rel="noopener noreferrer" class="">resumability</a> a tieto koncepty nejdú úplne
dokopy s filozofiou React-u, kde výzor UI je len jednoduchou funkciou stavu.</p>
<p>React navyše prinášal svoje vlastné riešenie pre problémy s veľkým množstvom JavaScript-u v prehliadači
a nabobtnanou hydráciou. Týmto riešením sú React Server Components (RSC) a možno síce nie sú také efektívne,
ako resumability v <a href="https://qwik.dev/" target="_blank" rel="noopener noreferrer" class="">Qwik-u</a>, ale sú v súlade s React filozofiou a tak by mali byť jednoduchšie na pochopenie.</p>
<p>Pre mňa je to dostatočne dobrý dôvod ostať na React-e aj pre firemné, aj pre svoje osobné projekty. Mojou najväčšou výtkou voči RSC
je teraz to, že do prehliadača potrebujeme dostať viac JavaScript-u na oživenie stránky, ako by sme potrebovali
napríklad v už spomínanom Qwiku. Verím však, že časom prídu optimalizácie a rozdiel nebude taký veľký.</p>
<p>Po tom, čo začal RSC podporovať <a href="https://nextjs.org/blog/next-13-4" target="_blank" rel="noopener noreferrer" class="">Next.js</a> (vo verzii 13.4), tak si ich mohlo pomerne
jednoducho vyskúšať široké publikum vývojárov. Čo čert nechcel, publikum začalo šomrať.</p>
<p>Posledné týždne sledujem, že k tomuto šomraniu sa pridáva stále viac prominentných vývojárov a komunitných lídrov. Ako príklad
uvediem post od Cassidy Williams nazvaný <a href="https://blog.cassidoo.co/post/annoyed-at-react/" target="_blank" rel="noopener noreferrer" class="">Kind of annoyed at React</a> a ďalší,
ktorý napísal Matteo Frana a volá sa <a href="https://dev.to/matfrana/react-where-are-you-going-5284" target="_blank" rel="noopener noreferrer" class="">React, where are you going?</a>.
V tom druhom odporúčam pozrieť sa aj na komentáre, kde Mark Erikson (core vývojár Redux-u a Redux Toolkit-u) prispel svojím názorom.</p>
<p>Človek by ľahko mohol nadobudnúť pocit, že to nevyzerá pre React dobre a možno bude naozaj lepšie sa začať obzerať
po nejakej náhrade.</p>
<p>Ja to však až takto čierne nevidím. Prečo? Pretože aj keď problémy, na ktoré ľudia poukazujú, nie sú vymyslené, tak vo svojej
podstate pramenia z toho, že React sa mení. A ľudia všeobecne nemajú radi, keď sa ich obľúbené veci menia, ani keby to malo byť
k lepšiemu.</p>
<p>Môžeme si to skúsiť len veľmi zrýchlene rozobrať na jednotlivé problémy:</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="slabá-komunikácia-vývojárov-react-u-s-komunitou">Slabá komunikácia vývojárov React-u s komunitou<a href="https://hrad.perunhq.org/2024/03/09-tazke-casy-pre-react/#slab%C3%A1-komunik%C3%A1cia-v%C3%BDvoj%C3%A1rov-react-u-s-komunitou" class="hash-link" aria-label="Priama linka na Slabá komunikácia vývojárov React-u s komunitou" title="Priama linka na Slabá komunikácia vývojárov React-u s komunitou" translate="no">​</a></h3>
<p>Ľudia sa sťažujú, že React tím slabo komunikuje do sveta svoje zámery a tak nevedia, čo majú čakať. Ja osobne toto nevnímam
a môj dojem bol skôr opačný. Mám pocit, že nejaký zástupca hovoril na každej konferencii, ktorú som minulý rok sledoval.
Zároveň viem, že som čítal viacero článkov a postov od vývojárov všemožných knižníc o tom, ako teraz intenzívne komunikujú
s React tímom ohľadom toho, ako by mohla ich knižnica podporovať RSC.</p>
<p>Treba však povedať, že ja nie som vývojár žiadnej populárnej knižnice a ani žiadna osobnosť v komunite a tak možno len nevidím,
že na každého vývojára, s ktorým React tím komunikuje, je 50 ďalších, ktorí na svoje otázky odpovede nedostali.</p>
<p>Otázne podľa mňa je, čím je táto nekomunikácia zo strany React vývojárov spôsobená. Je to odo mňa dosť veľká špekulácia
a budúcnosť ukáže, nakoľko sa mýlim, ale podľa mňa môžu byť dôvody aj pomerne prozaické.</p>
<p>React tím teraz vyvíja niekoľko veľkých projektov zároveň, ktoré odčerpávajú energiu. Jednak sú to RSC a veci s nimi súvisiace (actions),
potom React compiler (Forget) a totálne prekopanie oficiálnej dokumentácie, ktorá je po novom skôr interaktívnym kurzom.</p>
<p>Vývoj React-u už nezastrešuje len jedna firma (Meta), ale dve (Vercel) a zladiť ich záujmy a komunikačnú stratégiu môže
nejaký čas trvať.</p>
<p>Veľa core vývojárov a ešte viac tých ostatných menilo prácu. Meta (a nielen) prepúšťala vývojárov vo veľkom.
Títo si museli nájsť nové zamestnanie, ideálne také, aby mohli pokračovať v práci na React-e, uchytiť sa v ňom a prispôsobiť
sa novým okolnostiam.</p>
<p>Viem si živo predstaviť, že by mi pri kombinácii takýchto okolností neostávalo veľa času a ani energie na dodatočnú komunikáciu
s komunitou. Už len samotná zmena práce vie byť veľmi náročná.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="zložitosť-rsc">Zložitosť RSC<a href="https://hrad.perunhq.org/2024/03/09-tazke-casy-pre-react/#zlo%C5%BEitos%C5%A5-rsc" class="hash-link" aria-label="Priama linka na Zložitosť RSC" title="Priama linka na Zložitosť RSC" translate="no">​</a></h3>
<p>Ukazuje sa, že pomerne jednoduchý koncept serverových komponent spôsobuje problémy v detailoch. Musíme zrazu premýšľať, či je možné komponent
rendrovať iba na serverovej strane a pokiaľ nie, tak ho označiť ako klientský (<code>use client</code>). Zároveň sa otvára otázka organizácie komponentov
v projekte a konkrétne to, či chceme serverové a klientské komponenty držať pokope alebo v oddelených priečinkoch.</p>
<p>Podobne je to s <a href="https://react.dev/reference/react/use-server#server-actions-in-forms" target="_blank" rel="noopener noreferrer" class="">akciami</a>, ktorých kód sa môže nachádzať v súbore
s klientským komponentom, ale vykonávajú sa na serveri.</p>
<p>RSC aj pozmenili rovnicu, podľa ktorej bolo vykreslené používateľské rozhranie iba funkciou stavu. Po novom je to už funkcia stavu a dát, pričom
dáta sú na serverovej strane a stav na klientskej.</p>
<p>Všetky tieto zmeny vyžadujú iné uvažovanie o aplikácii, o kóde a jeho organizácii. A možno to síce nie je diametrálne iné uvažovanie,
ale stále je iné, než na aké sme boli v React aplikácii po celé roky zvyknutí.</p>
<p>Osobne verím tomu, že RSC bol krok správnym smerom a aktuálne sťažnosti na zložitosť odznejú, keď si na nový spôsob premýšľania ľudia viac zvyknú.
Nie som ale taký naivný, aby som tvrdil, že všetko okolo RSC bolo navrhnuté dobre. Predsa len ide o veľkú zmenu a očakávam, že o niektorých
veciach časom zistíme, že ich treba premyslieť. Nebolo by to prvýkrát (spomeňme si na mixiny alebo triedne komponenty celkovo).</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="knižnica-alebo-framework">Knižnica alebo framework<a href="https://hrad.perunhq.org/2024/03/09-tazke-casy-pre-react/#kni%C5%BEnica-alebo-framework" class="hash-link" aria-label="Priama linka na Knižnica alebo framework" title="Priama linka na Knižnica alebo framework" translate="no">​</a></h3>
<p>React o sebe doteraz tvrdil, že je iba obyčajnou knižnicou a stále sa toho drží. V čase, keď toto píšem, tak domovská stránka React-u stále definuje
React ako "The library for web and native user interfaces".</p>
<p><img decoding="async" loading="lazy" alt="Domovská stránka React-u" src="https://hrad.perunhq.org/assets/images/2024-03-09-react-hp-d43c4b5c0c1acc9a5fdd9d7ae5f45806.png" width="820" height="395" class="img_ev3q"></p>
<p>Knižnice sa vyznačujú tým, že sú iba nástrojom, ktorý môžeme používať tak, ako sa nám hodí a nenútia nás do určitého štýlu alebo architektúry.</p>
<p>Pokiaľ však chceme používať React Server Components, tak nás to tlačí do architektúry, kde nemáme veľa priestoru pre vlastné riešenia.</p>
<p>Mnohých ľudí to hnevá a boli by radšej, keby React rovno priznal, že sa stal frameworkom. Ja si myslím, že React je aktuálne na hrane. Má síce niektoré
frameworkové črty, ale nedá sa vyhlásiť za framework. Zo všetkých aktuálne diskutovaných problémov React sveta je tento pre mňa najmenej podstatným.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="nová-dokumentácia">Nová dokumentácia<a href="https://hrad.perunhq.org/2024/03/09-tazke-casy-pre-react/#nov%C3%A1-dokument%C3%A1cia" class="hash-link" aria-label="Priama linka na Nová dokumentácia" title="Priama linka na Nová dokumentácia" translate="no">​</a></h3>
<p>Určitú nevôľu v komunite spôsobuje aj nová dokumentácia k React-u. Konkrétne tá jej časť, ktorá pojednáva o <a href="https://react.dev/learn/start-a-new-react-project" target="_blank" rel="noopener noreferrer" class="">inštalácii</a>. Prečo?
Pretože autori v nej odporúčajú používať React spolu s nejakým meta-frameworkom a na výber dávajú Next.js, Remix a Gatsby. Tým trochu nahnevali
všetkých, ktorí doteraz používali React bez frameworku a bundlovanie, routing a prípadne aj SSR si riešili takými nástrojmi, aké im vyhovali.
Nuž, a keďže Create React App (už nevyvíjaný), Vite a Parcel ponúkajú veľmi jednoduché spôsoby, ako naštartovať nový React projekt, tak takýchto používateľov je väčšina.</p>
<p><img decoding="async" loading="lazy" alt="Dokumentácia odporúča použiť framework" src="https://hrad.perunhq.org/assets/images/2024-03-09-react-fw-5630d9e92fc852f0e28fad45f04d5938.png" width="928" height="353" class="img_ev3q"></p>
<p>Keď sa teda v React dokumentácii zjavilo odporúčanie na používanie frameworku a odhováranie od doterajších metód, tak sa čast ľudí zľakla, či vývoj nesmeruje k tomu, že
ich spôsob používania React-u prestane byť podporovaný.</p>
<p>Zdá sa, že toto sa našťastie nedeje a vývojári nám žiadne možnosti nezobrali. Ja situáciu chápem tak, že príchod RSC skomplikuje situáciu všetkým, ktorí používajú vlastnú
kombináciu nástrojov a budú chcieť RSC podporovať. Pretože nastaviť si veci správne nemusí byť zrovna triviálne a bude vyžadovať nemalú mieru trpezlivosti. Takže výmena vlastného
setupu za nejaký známy framework môže byť pre mnohých ľudí zmysluplnou možnosťou.</p>
<p>Musíme si však priznať aj to, že za týmto odporúčaním je v nemalej miere určite aj snaha viac spropagovať Next.js framework vyvíjaný firmou Vercel.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="monopolizácia-používania-nových-čŕt-len-pre-vercel-a-meta">Monopolizácia používania nových čŕt len pre Vercel a Meta<a href="https://hrad.perunhq.org/2024/03/09-tazke-casy-pre-react/#monopoliz%C3%A1cia-pou%C5%BE%C3%ADvania-nov%C3%BDch-%C4%8D%C5%95t-len-pre-vercel-a-meta" class="hash-link" aria-label="Priama linka na Monopolizácia používania nových čŕt len pre Vercel a Meta" title="Priama linka na Monopolizácia používania nových čŕt len pre Vercel a Meta" translate="no">​</a></h3>
<p>Veľkú kritiku od komunity schytáva firma Vercel za to, že vo svojich stabilných verziách frameworku Next.js umožňuje používať vlastnosti z React Canary. Výčitky smerujú k tomu, že
pokiaľ sú tieto vlastnosti dostatočne overené a stabilné na to, aby ich Vercel zahrnul do svojho frameworku, tak prečo sa rovno nevydá nová stabilná verzia React-u,
kde sa tieto veci sprístupnia všetkým?</p>
<p>Meta a Vercel sú dve firmy, ktoré do vývoja React-u investujú najviac. Dáva tak síce zmysel, pokiaľ nové vlastnosti používajú vo svojich projektoch, ale keďže sa ich Vercel
rozhodol použiť nielen v interných nástrojoch, ale priamo v Next.js, tak mu to dáva výhodu oproti iným frameworkom. Vercel má totiž rozhodne lepší vhľad do toho, čo v Canary verzii
je vhodné do produkcie, než ostatní. Takže tieto informácie môže použiť a získať tak konkurenčnú výhodu.</p>
<p>Toto správanie od nich nie je pekné, ale kým bude vývoj React-u v rukách veľkých firiem, tak sa to v nejakej miere bude diať stále. Nakoľko je však komunita pobúrená už teraz, tak
nie je vylúčené, že sa časom nájde nejaký iný model vývoja a vydávania nových verzií.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="zhrnutie">Zhrnutie<a href="https://hrad.perunhq.org/2024/03/09-tazke-casy-pre-react/#zhrnutie" class="hash-link" aria-label="Priama linka na Zhrnutie" title="Priama linka na Zhrnutie" translate="no">​</a></h2>
<p>Stav okolo React-u a jeho vývoja aktuálne nie je ideálny. Podľa mňa je to však prirodzené, prechádzame veľa zmenami,
začíname sa viac sústrediť na server a nejaký čas potrvá, kým sa všetko utrasie. Áno, niektorí používatelia a aj známi ľudia z komunity
sa začnú obzerať po alternatívach a viacerí ich aj začnú používať. To je normálne, pretože prebiehajúce zmeny
nemusia vyhovovať každému a každého zasiahnu v inej miere.</p>
<p>Myslím si, že aj my by sme sa mali rozhodovať podľa toho, nakoľko nás zmeny ovplyvňujú, koľko problémov riešia a koľko vecí skomplikujú.
A nie podľa toho, aké emócie sa aktuálne zdajú byť dominantné na internete.</p>]]></content>
        <category label="React" term="React"/>
        <category label="Qwik" term="Qwik"/>
        <category label="Next.js" term="Next.js"/>
        <category label="signály" term="signály"/>
        <category label="resumability" term="resumability"/>
        <category label="RSC" term="RSC"/>
        <category label="Vercel" term="Vercel"/>
        <category label="Meta" term="Meta"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Frontendové zvesti]]></title>
        <id>https://hrad.perunhq.org/2024/02/23-frontendove-zvesti/</id>
        <link href="https://hrad.perunhq.org/2024/02/23-frontendove-zvesti/"/>
        <updated>2024-02-23T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Pôvodne som tento článok (a snáď ním začínam celú sériu) chcel nazvať "Frontendové novinky".]]></summary>
        <content type="html"><![CDATA[<p>Pôvodne som tento článok (a snáď ním začínam celú sériu) chcel nazvať "Frontendové novinky".
Potom som si uvedomil, že niektoré z tých "noviniek" nie sú tak úplne nové. Mal som totiž
posledné mesiace menej času na sledovanie diania. To viete, človek občas musí riešiť aj
také bežné veci, ako život mimo programovania, prácu, oddych alebo najnovšie aj chodiť
hájiť demokraciu na námestia. Teraz som si však nejaký čas našiel, čo-to si prečítal a pozrel
a povedal som si, že by nemusel byť zlý nápad to spísať. Tak som spísal a tu to máte.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="react-from-another-dimension">React from Another Dimension<a href="https://hrad.perunhq.org/2024/02/23-frontendove-zvesti/#react-from-another-dimension" class="hash-link" aria-label="Priama linka na React from Another Dimension" title="Priama linka na React from Another Dimension" translate="no">​</a></h2>
<p>Ešte na minuloročnej konferencii RemixConf (<a href="https://remix.run/" target="_blank" rel="noopener noreferrer" class="">Remix</a> je veľmi populárny Reactový framework)
mal Dan Abramov, jeden z hlavných vývojárov React-u, <a href="https://www.youtube.com/watch?v=zMf_xeGPn6s" target="_blank" rel="noopener noreferrer" class="">veľmi zaujímavú prednášku.</a>
Ja som sa k nej dostal len teraz, ale vysoko ju odporúčam. Dan rozpráva veľmi pútavo, odľahčene a dostal tam
niekoľko vtípkov. Fakt som sa pri pozeraní bavil a 40 minút ušlo ako voda.</p>
<p>V prednáške sa zamyslel nad tým, ako by vyzeral React, keby sa začal vyvíjať v skorých nultých rokoch (2000-niečo) a
keby sme namiesto PHP vtedy na backende používali JavaScript. Vo výsledku nám takto úplne z opačného konca vysvetlil
princíp React Server Components (RSC) a ich napojenie na klientskú stranu.</p>
<p>Bola to naozaj dobre pripravená prednáška, z ktorej ide pocit, že RSC sú krok správnym smerom.</p>
<p>Dan v prednáške robí live-coding a všetci vieme, ako to dopadne, keď na prednáške programujete. Preto by som video
špeciálne odporúčil každému, kto má impostor syndróm. Uvidíte core vývojára React-u, ako sa trápi s chybami,
o ktorých nevie, ako vznikli a čo s nimi. Vidíte, stáva sa aj najlepším.</p>
<p>Video z prednášky je tu <a href="https://www.youtube.com/watch?v=zMf_xeGPn6s" target="_blank" rel="noopener noreferrer" class="">https://www.youtube.com/watch?v=zMf_xeGPn6s</a></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="čoskoro-vyjde-react-19">Čoskoro vyjde React 19<a href="https://hrad.perunhq.org/2024/02/23-frontendove-zvesti/#%C4%8Doskoro-vyjde-react-19" class="hash-link" aria-label="Priama linka na Čoskoro vyjde React 19" title="Priama linka na Čoskoro vyjde React 19" translate="no">​</a></h2>
<p>Po desiatich mesiacoch(!) vyšiel <a href="https://react.dev/blog/2024/02/15/react-labs-what-we-have-been-working-on-february-2024" target="_blank" rel="noopener noreferrer" class="">nový článok na React blogu.</a>
Možno je to reakcia na kritiku z komunity o nedostatočnej komunikácii plánov, možno nie. Ktovie. Každopádne sme sa dozvedeli,
že čoskoro vyjde nová major verzia React-u. Dátum prezradený nebol, ale keďže v máji bude <a href="https://conf.react.dev/" target="_blank" rel="noopener noreferrer" class="">React Conf,</a>
tak to zrejme načasujú takým spôsobom, aby na konferencii s veľkou slávou oznámili nové vydanie.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="čo-bude-nové">Čo bude nové?<a href="https://hrad.perunhq.org/2024/02/23-frontendove-zvesti/#%C4%8Do-bude-nov%C3%A9" class="hash-link" aria-label="Priama linka na Čo bude nové?" title="Priama linka na Čo bude nové?" translate="no">​</a></h3>
<p><strong>React Compiler</strong> (Forget), od ktorého si všetci sľubujeme, že nebudeme musieť robiť ručnú memoizáciu a React sám zabezpečí elimináciu
zbytočných re-rendrov.</p>
<p><strong>Direktívy <code>"use server"</code> a <code>"use client"</code></strong>, ktorými budeme označovať klientské komponenty a serverové funkcie.</p>
<p><strong>Akcie a hooky pre server</strong>, ktoré boli doteraz súčasťou Canary releasu, sa presúvajú do stabilnej verzie a tak ich môže používať každý.
Ide najmä o hooky <a href="https://react.dev/reference/react-dom/hooks/useFormStatus" target="_blank" rel="noopener noreferrer" class=""><code>useFormStatus</code></a>, <a href="https://react.dev/reference/react-dom/hooks/useFormState" target="_blank" rel="noopener noreferrer" class=""><code>useFormState</code></a> a <a href="https://react.dev/blog/2024/02/15/react-labs-what-we-have-been-working-on-february-2024#actions" target="_blank" rel="noopener noreferrer" class="">Actions</a>.
Komunita sa tiež už dlhšie sťažovala, že pokiaľ sú tieto veci dosť stabilné na to, aby ich používala Meta v produkcii a Vercel ich dokonca zahrnul
do nových verzií Next.js, tak prečo nie sú v stabilnej verzii React-u? Tak sa teraz konečne dostaneme všetci na rovnakú úroveň a môžeme
s novou funkcionalitou pracovať bez toho, aby sme boli nútení použiť Canary release.</p>
<p>Mimochodom, pokiaľ neviete, čo Canary znamená, tak je to verzia, ktorá je síce dostatočne stabilná na to, aby ste ju mohli používať,
ale zároveň nie je garantované, že veci v nej sa nezmenia. Prečo sa to volá Canary? Baníci kedysi nosili so sebou do bane klietky s kanárikmi.
Pokiaľ v bani začali unikať nebezpečné plyny (napr. CO), ktoré nie je cítiť, tak typicky najskôr umrel kanárik a baníci mali šancu si to všimnúť
a ujsť.</p>
<p>Komponenty <strong><code>&lt;title&gt;</code>, <code>&lt;meta&gt;</code> a <code>&lt;link&gt;</code> môžeme použiť hocikde</strong> a React sám zabezpečí ich vloženie do hlavičky HTML dokumentu. Zjednoduší
sa nám tak tvorba hlavičky.</p>
<p>Koponenty <strong><code>&lt;style&gt;</code>, <code>&lt;link&gt;</code> a <code>&lt;script&gt;</code> budeme môcť prepojiť so Suspense</strong>, pretože React bude sledovať, či sa už načítali assety v nich
uvedené (fonty, štýly, JS) a do DOM-u sa elementy vložia až po ich načítaní.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="two-reacts">Two Reacts<a href="https://hrad.perunhq.org/2024/02/23-frontendove-zvesti/#two-reacts" class="hash-link" aria-label="Priama linka na Two Reacts" title="Priama linka na Two Reacts" translate="no">​</a></h2>
<p>Aj tretia správa je zo sveta React-u. Dan Abramov uverejnil začiatkom januára
článok nazvaný <a href="https://overreacted.io/the-two-reacts/" target="_blank" rel="noopener noreferrer" class="">Two Reacts</a>. Ide ďalší pohľad na React zo serverovej strany (alebo aj statického renderovania).
Dôležité je, že Dan hovorí o tom, ako príchod RSC zmenil známu rovnicu <code>UI = f(state)</code> (používateľské rozhranie je funkciou stavu) na <code>UI = f(data, state)</code>,
kde <code>data</code> sú stavom dát na serveri a <code>state</code> je stav v prehliadači. Na konci článku sa Dan pýta, ako teraz pristupovať k funkcii <code>f</code>, keďže musí fungovať
v dvoch veľmi rozličných prostrediach? Odpoveď nám zatiaľ nedáva, vyzýva nás na premýšľanie a v nejakom budúcom článku predstaví svoj prístup.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="ink">Ink<a href="https://hrad.perunhq.org/2024/02/23-frontendove-zvesti/#ink" class="hash-link" aria-label="Priama linka na Ink" title="Priama linka na Ink" translate="no">​</a></h2>
<p>Objavil som <a href="https://github.com/vadimdemedes/ink" target="_blank" rel="noopener noreferrer" class="">Ink</a>, čo je projekt prinášajúci React do terminálu. Je to blbosť, ale hrozne sa z toho teším, lebo si budem
môcť písať interaktívne CLI programy a skripty v JavaScript-e a React-e. Samozrejme, neodporúčam to na nič, čo by potrebovalo lepší výkon, ale
na nejaké jednoduché veci by to mohlo byť super.</p>
<p>Niekto s tým urobili aj hru Hľadanie mín: <a href="https://github.com/mordv/mnswpr" target="_blank" rel="noopener noreferrer" class="">https://github.com/mordv/mnswpr</a></p>
<p>Ale nie je to len hračka, na ich Github stránke nájdete v <a href="https://github.com/vadimdemedes/ink?tab=readme-ov-file#whos-using-ink" target="_blank" rel="noopener noreferrer" class="">zozname použití</a> aj nejaké seriózne projekty.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="záver">Záver<a href="https://hrad.perunhq.org/2024/02/23-frontendove-zvesti/#z%C3%A1ver" class="hash-link" aria-label="Priama linka na Záver" title="Priama linka na Záver" translate="no">​</a></h2>
<p>Vidím, že všetky vybrané správy sa nakoniec týkali React-u. Nebudeme si klamať, keďže je React pre mňa knižnica prvej voľby, keď potrebujem robiť frontend,
tak aj veľa budúcich noviniek bude o ňom. Keď však narazím na niečo zaujímavé z iných frontendových oblastí, tak určite napíšem aj o tom.</p>]]></content>
        <category label="React" term="React"/>
        <category label="RSC" term="RSC"/>
        <category label="Ink" term="Ink"/>
        <category label="CLI" term="CLI"/>
        <category label="hry" term="hry"/>
        <category label="Minesweeper" term="Minesweeper"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[SOLID v JavaScripte: Liskov Substitution Principle]]></title>
        <id>https://hrad.perunhq.org/2024/02/11-liskov-substitution-principle/</id>
        <link href="https://hrad.perunhq.org/2024/02/11-liskov-substitution-principle/"/>
        <updated>2024-02-11T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Liskovej princíp zameniteľnosti je jediný zo SOLID princípov, ktorý je pomenovaný po nejakej osobe.]]></summary>
        <content type="html"><![CDATA[<p>Liskovej princíp zameniteľnosti je jediný zo SOLID princípov, ktorý je pomenovaný po nejakej osobe.
Princíp formalizovala a prvýkrát o ňom hovorila americká vedkyňa <a href="https://en.wikipedia.org/wiki/Barbara_Liskov" target="_blank" rel="noopener noreferrer" class="">Barbara Liskov</a> a to ešte v roku 1987.
Hoci sa všeobecne verí, že tento princíp popisuje dedičnosť v objektovo orientovanom programovaní,
nie je to tak a venuje sa skôr podtypom všeobecne. Preto je platný aj pre iné, než len OOP jazyky,
takže z jeho dodržiavania čerpáme benefity aj v JavaScripte a TypeScripte.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="liskov-substitution-principle">Liskov Substitution Principle<a href="https://hrad.perunhq.org/2024/02/11-liskov-substitution-principle/#liskov-substitution-principle" class="hash-link" aria-label="Priama linka na Liskov Substitution Principle" title="Priama linka na Liskov Substitution Principle" translate="no">​</a></h2>
<p>Definícia <em>LSP</em> je najpresnejšie vyjadrená <a href="https://en.wikipedia.org/wiki/Liskov_substitution_principle" target="_blank" rel="noopener noreferrer" class="">matematicky,</a>
ale dala by sa prerozprávať zhruba takto:</p>
<blockquote>
<p>Podtyp musí byť náhradou svojho rodičovského typu.</p>
</blockquote>
<p>Keď si to rozmeníme na situácie, ktorých sa to môže týkať v JavaScripte a TypeScripte,
tak dostaneme zhruba takúto množinu:</p>
<ul>
<li class="">odvodená trieda musí byť náhradou svojej základnej triedy</li>
<li class="">odvodená trieda musí byť náhradou svojho interface-u</li>
<li class="">objekt musí byť náhradou svojho interface-u</li>
<li class="">implementácia typu musí byť náhradou svojho typového predpisu</li>
</ul>
<p>Cieľom princípu je zabezpečiť, aby ste mohli vymeniť implementáciu nejakého rodičovského
typu za implementáciu potomka a kód vám bude ďalej bez problémov fungovať.</p>
<p>Aby nejaký potomok alebo implementácia mohli o sebe povedať, že sú dobrými náhradami svojich rodičov,
tak to pre nich znamená, že:</p>
<ul>
<li class="">musia poskytovať implementáciu pre všetky metódy, ktoré predpisuje rodič, interface alebo typ</li>
<li class="">musia mať rovnaké typy návratových hodnôt z funkcií a metód</li>
<li class="">nesmú zvoľňovať typ návratovej hodnoty funkcií a metód</li>
<li class="">nesmú sprísňovať požiadavky na argumenty funkcií a metód</li>
<li class="">nesmú sprísňovať kontrakt (formálny aj neformálny)</li>
<li class="">nesmú obchádzať kontrakt v kóde</li>
</ul>
<p>Pokiaľ neviete, čo je to kontrakt, tak sú to všetky "dohody" o tom, čo daný kus kódu má robiť.
Časť kontraktu sa dá vynútiť prostriedkami programovacieho jazyka (typy parametrov a návratovej hodnoty),
ale časť nie a tá je zapísaná len vo forme komentáru, názvov premenných alebo sa dokonca jedná
len o predpoklady (napríklad o funkcii <code>getUserId</code> predpokladáme, že vracia ID používateľa).</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="ako-refaktorovať">Ako refaktorovať<a href="https://hrad.perunhq.org/2024/02/11-liskov-substitution-principle/#ako-refaktorova%C5%A5" class="hash-link" aria-label="Priama linka na Ako refaktorovať" title="Priama linka na Ako refaktorovať" translate="no">​</a></h2>
<p>Výhodou <em>LSP</em> oproti ostatným SOLID princípom je to, že veľkú časť jeho porušení vieme odchytiť
statickou analýzou kódu a to dokonca už v čase písania. Samozrejme, závisí to od vami používaného
jazyka a v čistom JavaScripte sú možnosti značne horšie, ako v TypeScripte.</p>
<p>Statická analýza v TypeScripte nám vie pomôcť najmä s chýbajúcimi metódami, sprísnenými typmi pre parametre funkcií
a metódy alebo nesprávnymi návratovými hodnotami.</p>
<p>V JavaScripte si sprísnené požiadavky na argumenty musíme postrážiť sami. V podstate si potrebujeme sledovať,
či funkcia, ktorú chceme použiť na mieste nejakej jej nadradenej, nemá striktnejšie požiadavky.
Ak sme mali napríklad funkciu, ktorá očakáva v nejakom parametri číslo, tak na jej miesto nemôžeme dať funkciu,
ktorá čaká iba číslo z nejakého intervalu. A už vôbec nemôžeme vyhodiť výnimku, ak dané číslo nie je z očakávaného intervalu.</p>
<p>Podobne je to s návratovými hodnotami. Akurát, že tam nemôžeme návratovú hodnotu zvoľniť.
Ak nám teda napríklad nejaký predpis, komentár alebo predpoklad hovoria, že funkcia
vracia číslo z intervalu, tak nemôžeme vrátiť číslo mimo neho alebo úplne iný typ (napr. string).</p>
<p>Nevýhodou <em>LSP</em> oproti ostatným SOLID princípom je to, že ku každej situácii musíme pristupovať
individuálne a nie je možné spísať nejaký algoritmus s konkrétnejšími krokmi refaktoringu. Je však
veľmi nápomocné si uvedomiť, že problémy často pramenia z nesprávne zadefinovanej základnej triedy
alebo typu. Vtedy je potrebné typy a predpisy upraviť.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="príklad">Príklad<a href="https://hrad.perunhq.org/2024/02/11-liskov-substitution-principle/#pr%C3%ADklad" class="hash-link" aria-label="Priama linka na Príklad" title="Priama linka na Príklad" translate="no">​</a></h2>
<p>Ako príklad si môžeme uviesť situáciu, ktorú vídam pomerne často. Väčšina webstránok má dva typy prihlásených
používateľov: bežných návštevníkov a potom administrátorov. Administrátori majú často pridelené rôzne práva,
podľa toho, ktorú časť funkcionality môžu obsluhovať.</p>
<p>Definícia typu pre používateľa takéhoto webu by mohla vyzerať aj takto:</p>
<div class="language-typescript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-typescript codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token keyword" style="color:#00009f">interface</span><span class="token plain"> </span><span class="token class-name">User</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token function-variable function" style="color:#d73a49">getId</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token builtin">number</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token function-variable function" style="color:#d73a49">getName</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token builtin">string</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token function-variable function" style="color:#d73a49">getType</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=&gt;</span><span class="token plain"> UserType</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token function-variable function" style="color:#d73a49">getFavouriteTvShowId</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token builtin">number</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token function-variable function" style="color:#d73a49">getAdminRights</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=&gt;</span><span class="token plain"> AdminRight</span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span></span><br></div></code></pre></div></div>
<p>V takomto nastavení máme problém minimálne na dvoch miestach našej webovej aplikácie. Na prvom z nich vytvárame inštanciu
reprezentujúcu návštevníka:</p>
<div class="language-typescript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-typescript codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> user</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> User </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token function-variable function" style="color:#d73a49">getId</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">11</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token function-variable function" style="color:#d73a49">getName</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Ferko Mrkvička"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token function-variable function" style="color:#d73a49">getType</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"visitor"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token function-variable function" style="color:#d73a49">getFavouriteTvShowId</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">42</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">//getAdminRights: () =&gt; ??? // čo máme vrátiť tu?</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span></span><br></div></code></pre></div></div>
<p>Na riadku 6 sa musíme rozhodnúť, aké administrátorské práva má mať bežný návštevník. Z technického hľadiska
to nie je problém, lebo môžeme vrátiť prázdne pole. Ale už len to, že je možné takúto otázku
("aké admin práva má mať návštevník?") položiť, je vidieť, že niečo nie je v poriadku.</p>
<p>Druhé problémové miesto je vytváranie inštancie pre administrátora.</p>
<div class="language-typescript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-typescript codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> admin</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> User </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token function-variable function" style="color:#d73a49">getId</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">101</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token function-variable function" style="color:#d73a49">getName</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Neo"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token function-variable function" style="color:#d73a49">getType</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"admin"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">//getFavouriteTvShowId: () =&gt; ???,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token function-variable function" style="color:#d73a49">getAdminRights</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"ban-user"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"edit-user"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"view-user"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span></span><br></div></code></pre></div></div>
<p>Tu sa na piatom riadku dostávame do ešte komplikovanejšej situácie. Administrátor nášho webu
nie je bežný návštevník a z hľadiska aplikácie nás jeho obľúbený seriál vôbec nezaujíma.
Typ <code>User</code> nám však predpisuje, že ako ID obľúbeného televízneho seriálu musíme vrátiť číslo.
My tak nemôžeme vrátiť ani <code>null</code>, ani <code>undefined</code>, ale musí to byť číslo. Môžeme sa dohodnúť, že niektoré čísla (napríklad 0, alebo záporné) budú brané
ako špeciálne a ich hodnoty sa nebudú používať na prácu so seriálmi. To by však vyžadovalo zmeny
na každom mieste, kde sa pracuje s ID televízneho seriálu. A takýchto miest môže byť veľa
a ak zabudneme čo i len na jedno, tak kód môže byť nestabilný.
Navyše je to len záplata na problém, ktorý bude naďalej existovať a jedného dňa nevyhnutne prebuble na povrch.</p>
<p>Tým problémom je v skutočnosti to, že potomkovia (inštancia <code>user</code> a <code>admin</code>) nie sú dobrými potomkami svojho
rodiča (typový predpis <code>User</code>). A ani nemôžu nikdy byť, pretože samotný rodič je zadefinovaný tak,
že to neumožňuje.</p>
<p>Úprava kódu tak, aby mohol spĺňať <em>LSP</em> znamená, že musíme zmeniť typový predpis rodiča takým spôsobom, aby
obsahoval iba tie položky, ktoré sú spoločné pre každého používateľa webstránky.
Zároveň potrebujeme zadefinovať nové typy pre návštevníka a pre administrátora a tam, kde je potrebné medzi
nimi rozlišovať, musíme nastaviť typehinty podľa toho, akého typu inštanciu očakávame.</p>
<div class="language-typescript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-typescript codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token keyword" style="color:#00009f">interface</span><span class="token plain"> </span><span class="token class-name">User</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token function-variable function" style="color:#d73a49">getId</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token builtin">number</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token function-variable function" style="color:#d73a49">getName</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token builtin">string</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token function-variable function" style="color:#d73a49">getType</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=&gt;</span><span class="token plain"> UserType</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token keyword" style="color:#00009f">interface</span><span class="token plain"> </span><span class="token class-name">Visitor</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">extends</span><span class="token plain"> </span><span class="token class-name">User</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token function-variable function" style="color:#d73a49">getFavouriteTvShowId</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token builtin">number</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token function-variable function" style="color:#d73a49">getType</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"visitor"</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token keyword" style="color:#00009f">interface</span><span class="token plain"> </span><span class="token class-name">AdminUser</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">extends</span><span class="token plain"> </span><span class="token class-name">User</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token function-variable function" style="color:#d73a49">getAdminRights</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=&gt;</span><span class="token plain"> AdminRight</span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token function-variable function" style="color:#d73a49">getType</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"admin"</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span></span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="zhrnutie">Zhrnutie<a href="https://hrad.perunhq.org/2024/02/11-liskov-substitution-principle/#zhrnutie" class="hash-link" aria-label="Priama linka na Zhrnutie" title="Priama linka na Zhrnutie" translate="no">​</a></h2>
<p><em>LSP</em> vraví, že pokiaľ máme v kóde nejakú hierarchiu (objektov, typov), tak ju treba stavať tak,
aby sme inštancie rodičov mohli vymieňať za inštancie potomkov bez hrozby spadnutia kódu. Hoci sa táto požiadavka môže
javiť triviálna, tak to tak nemusí vždy byť a to najmä v situáciách, kde si nevieme pomôcť
statickou analýzou kódu.</p>
<p>Aby mohli byť potomkovia dobrými náhradami svojich rodičov, tak musia poskytovať implementáciu
pre všetky predpísané metódy, nemôžu zvoľňovať typ návratových hodnôt, nesmú sprísňovať kontrakt
a požiadavky na argumenty a ani obchádzať kontrakt.</p>
<p>Pokiaľ sa tohto držíme, tak zistíme, že časti nášho kódu sú navzájom bezpečne vymeniteľné a úplne
sme eliminovali chyby spôsobené nedodržiavaním kontraktov.</p>]]></content>
        <category label="SOLID" term="SOLID"/>
        <category label="LSP" term="LSP"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[SOLID v JavaScripte: Open-Closed Principle]]></title>
        <id>https://hrad.perunhq.org/2023/10/01-open-closed-principle/</id>
        <link href="https://hrad.perunhq.org/2023/10/01-open-closed-principle/"/>
        <updated>2023-10-01T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Open-Closed Principle je druhým zo SOLID princípov a ako taký je druhým najdôležitejším,]]></summary>
        <content type="html"><![CDATA[<p>Open-Closed Principle je druhým zo SOLID princípov a ako taký je druhým najdôležitejším,
ktorého by sme sa mali pri programovaní držať. V tomto článku sa dozvieme, o čom tento princíp hovorí
a akým postupom krokov vieme dosiahnuť, že bude v našom kóde splnený.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="open-closed-principle">Open-Closed Principle<a href="https://hrad.perunhq.org/2023/10/01-open-closed-principle/#open-closed-principle" class="hash-link" aria-label="Priama linka na Open-Closed Principle" title="Priama linka na Open-Closed Principle" translate="no">​</a></h2>
<p>V literatúre a článkoch sa s týmto princípom môžeme stretnúť aj pod skratkou <em>OCP</em>.
Jeho definícia znie:</p>
<blockquote>
<p>Jednotka kódu by mala byť otvorená pre rozširovanie, ale uzatvorená pre zmeny.</p>
</blockquote>
<p>Už <a class="" href="https://hrad.perunhq.org/2023/03/27-single-responsibility-principle-v-javascripte/">z predchádzajúceho článku</a> vieme,
že za slovné spojenie <em>jednotka kódu</em> si môžeme dosadiť čokoľvek z množiny trieda, modul, objekt
a funkcia. Ale aj keď to urobíme, tak nám definícia na prvé počutie nemusí vôbec dávať zmysel.</p>
<p>Trochu zmysluplnejšie nám môže znieť, že Open-Closed Principle hovorí, nech kód píšeme tak,
aby sme vedeli rozšíriť jeho funkcionalitu aj bez toho, aby sme ho museli upraviť.</p>
<p>Znie to síce trochu magicky, ale čoskoro si ukážeme, že to nie je nič zložité.</p>
<p>Ak sa nám v našom kóde podarí spĺňanie tohto princípu dosiahnuť, tak odmenou nám budú bezpečnejšie
a rýchlejšie úpravy funkcionality, pretože budeme robiť minimálne alebo žiadne zásahy do kódu.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="symptómy-porušenia-princípu">Symptómy porušenia princípu<a href="https://hrad.perunhq.org/2023/10/01-open-closed-principle/#sympt%C3%B3my-poru%C5%A1enia-princ%C3%ADpu" class="hash-link" aria-label="Priama linka na Symptómy porušenia princípu" title="Priama linka na Symptómy porušenia princípu" translate="no">​</a></h2>
<p>Pokiaľ uvažujeme, či nejaká jednotka nášho kódu spĺňa OCP, tak si môžeme pomôcť príznakmi toho,
kedy to tak nie je. Platí však to isté, čo aj pri Single Responsibility Principle: tieto príznaky
hovoria len o tom, že je vyššia pravdepodobnosť nesplnenia princípu. Nehovoria, že to tak určite je.</p>
<p>Príznaky porušenia OCP princípu v nejakej jednotke sú:</p>
<ul>
<li class="">v kóde sú podmienky pre určenie stratégie (typicky napríklad <code>switch</code>)</li>
<li class="">podobné podmienky sa opakujú na viacerých miestach v kóde</li>
<li class="">kód obsahuje natvrdo zapísaný názov súboru, emailovú adresu alebo inú skalárnu hodnotu</li>
<li class="">trieda v sebe obsahuje natvrdo zapísané názvy iných tried (v poliach, stringoch, podmienkach)</li>
<li class="">vo vnútri triedy sa vytvárajú iné objekty pomocou <code>new</code> (výnimkou sú továrničky)</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="ako-refaktorovať">Ako refaktorovať<a href="https://hrad.perunhq.org/2023/10/01-open-closed-principle/#ako-refaktorova%C5%A5" class="hash-link" aria-label="Priama linka na Ako refaktorovať" title="Priama linka na Ako refaktorovať" translate="no">​</a></h2>
<p>V prípade, že máme hotový kód nejakej jednotky (povedzme funkcie) a tento nespĺňa OCP, tak ho
vieme refaktorovať v piatich krokoch. Časom sa tento postup pre nás stane takým automatickým,
že ho budeme vediet aplikovať na jeden prepis. Ale kým v tom nie sme zbehlí, tak je lepšie sa
držať postupu krok za krokom.</p>
<ol>
<li class="">zabezpečíme, že jednotka spĺňa Single Responsibility Principle</li>
<li class="">skúsime identifikovať všeobecné a špecifické časti úlohy, ktorú jednotka rieši</li>
<li class="">oddelíme všeobecné a špecifické časti od seba (vo vnútri jednotky)</li>
<li class="">špecifické časti prenesieme von mimo jednotku</li>
<li class="">všeobecnú a špecifickú časť prepojíme pomocou "konfigurácie"</li>
</ol>
<p>Pokiaľ nám zoznam týchto krokov znie rovnako magicky, ako samotná definícia princípu, tak sa
netreba báť, v nasledovnom príklade uvidíme, že to nie je také strašidelné.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="príklad">Príklad<a href="https://hrad.perunhq.org/2023/10/01-open-closed-principle/#pr%C3%ADklad" class="hash-link" aria-label="Priama linka na Príklad" title="Priama linka na Príklad" translate="no">​</a></h2>
<p>Riadky kódu, ktoré sú podobné ukážke nižšie, môžeme vidieť pomerne často. Na prvý pohľad vyzerajú
celkom v poriadku. Ale pri bližšom pohľade uvidíme problémy.</p>
<div class="language-typescript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-typescript codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">type</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> Character </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"@local/types"</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> sortCharactersByRole </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"./sortCharactersByRole"</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token keyword" style="color:#00009f">export</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">async</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">function</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">getSortedCharacters</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> characters </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">await</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">loadCharacters</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">sortCharactersByRole</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">characters</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token keyword" style="color:#00009f">async</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">function</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">loadCharacters</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> result </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">await</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">fetch</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"/api/list.json"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">await</span><span class="token plain"> result</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">json</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">as</span><span class="token plain"> </span><span class="token builtin">Promise</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain">Character</span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span></span><br></div></code></pre></div></div>
<p>Zamerajme sa na funkciu <code>loadCharacters</code>. Čo keby sme chceli, aby zoznam postáv načítavala z inej
URL? Museli by sme siahnuť do jej vnútra a zmeniť jej kód. A toto je znak toho, že nespĺňa OCP.
Chceme ju <strong>rozšíriť</strong>, ale musíme ju zmeniť. Keby spĺňala OCP, tak by sme ju vedeli rozšíriť aj bez toho,
aby sme ju museli meniť.</p>
<p>Ako na to? Aplikujeme náš refaktorovací algoritmus.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="krok-1-zabezpečíme-že-jednotka-spĺňa-single-responsibility-principle">Krok 1: Zabezpečíme, že jednotka spĺňa Single Responsibility Principle<a href="https://hrad.perunhq.org/2023/10/01-open-closed-principle/#krok-1-zabezpe%C4%8D%C3%ADme-%C5%BEe-jednotka-sp%C4%BA%C5%88a-single-responsibility-principle" class="hash-link" aria-label="Priama linka na Krok 1: Zabezpečíme, že jednotka spĺňa Single Responsibility Principle" title="Priama linka na Krok 1: Zabezpečíme, že jednotka spĺňa Single Responsibility Principle" translate="no">​</a></h3>
<p>Tu našťastie nemusíme nič robiť, funkcia už spĺňa SRP. Keby to tak nebolo, tak tento krok je nutným.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="krok-2-skúsime-identifikovať-všeobecné-a-špecifické-časti-úlohy-ktorú-jednotka-rieši">Krok 2: Skúsime identifikovať všeobecné a špecifické časti úlohy, ktorú jednotka rieši<a href="https://hrad.perunhq.org/2023/10/01-open-closed-principle/#krok-2-sk%C3%BAsime-identifikova%C5%A5-v%C5%A1eobecn%C3%A9-a-%C5%A1pecifick%C3%A9-%C4%8Dasti-%C3%BAlohy-ktor%C3%BA-jednotka-rie%C5%A1i" class="hash-link" aria-label="Priama linka na Krok 2: Skúsime identifikovať všeobecné a špecifické časti úlohy, ktorú jednotka rieši" title="Priama linka na Krok 2: Skúsime identifikovať všeobecné a špecifické časti úlohy, ktorú jednotka rieši" translate="no">​</a></h3>
<p>Toto v tejto funkcii opäť nie je žiaden veľký problém. Špecifickou časťou je natvrdo zapísaná URL.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="krok-3-oddelíme-všeobecné-a-špecifické-časti-od-seba-vo-vnútri-jednotky">Krok 3: Oddelíme všeobecné a špecifické časti od seba (vo vnútri jednotky)<a href="https://hrad.perunhq.org/2023/10/01-open-closed-principle/#krok-3-oddel%C3%ADme-v%C5%A1eobecn%C3%A9-a-%C5%A1pecifick%C3%A9-%C4%8Dasti-od-seba-vo-vn%C3%BAtri-jednotky" class="hash-link" aria-label="Priama linka na Krok 3: Oddelíme všeobecné a špecifické časti od seba (vo vnútri jednotky)" title="Priama linka na Krok 3: Oddelíme všeobecné a špecifické časti od seba (vo vnútri jednotky)" translate="no">​</a></h3>
<p>Oddelenie všeobecných a špecifických častí je lepšie najskôr robiť priamo vo vnútri funkcie.
Vizuálne tak uvidíme rozdiel, ktorý sme v predchádzajúcom kroku vytušili a pomenovali. A takéto
zvýraznenie nám môže pomôcť v neskoršom rozhodovaní, čo s tým.</p>
<p>V tejto situácii toho nemáme na práci veľa, potrebujeme len špecifickú URL nejako oddeliť a zvýrazniť.
Najjednoduchšie, čo môžeme urobiť, je vytiahnuť ju do samostatnej premennej.</p>
<div class="language-typescript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-typescript codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token keyword" style="color:#00009f">async</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">function</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">loadCharacters</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> url </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"/api/list.json"</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> result </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">await</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">fetch</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">url</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">await</span><span class="token plain"> result</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">json</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">as</span><span class="token plain"> </span><span class="token builtin">Promise</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain">Character</span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span></span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="krok-4-špecifické-časti-prenesieme-von-mimo-jednotku">Krok 4: Špecifické časti prenesieme von mimo jednotku<a href="https://hrad.perunhq.org/2023/10/01-open-closed-principle/#krok-4-%C5%A1pecifick%C3%A9-%C4%8Dasti-prenesieme-von-mimo-jednotku" class="hash-link" aria-label="Priama linka na Krok 4: Špecifické časti prenesieme von mimo jednotku" title="Priama linka na Krok 4: Špecifické časti prenesieme von mimo jednotku" translate="no">​</a></h3>
<p>V tomto kroku potrebujeme URL dostať von z funkcie. Je niekoľko spôsobov, ako to urobiť. Najpriamočiarejší
je urobiť z nej globálnu premennú, čo však nie je vôbec dobrý nápad. Globálne premenné sú vo všeobecnosti
prvok, ktorý prináša do kódu veľa neprehľadných rizík a tak sa im snažíme vyhýbať.</p>
<p>Druhou jednoduchou možnosťou by bolo urobiť z premennej parameter funkcie. A presne to je riešenie,
ktoré je v tejto situácii správne.</p>
<div class="language-typescript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-typescript codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token keyword" style="color:#00009f">async</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">function</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">loadCharacters</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">url</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> result </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">await</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">fetch</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">url</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">await</span><span class="token plain"> result</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">json</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">as</span><span class="token plain"> </span><span class="token builtin">Promise</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain">Character</span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span></span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="krok-5-všeobecnú-a-špecifickú-časť-prepojíme-pomocou-konfigurácie">Krok 5: Všeobecnú a špecifickú časť prepojíme pomocou "konfigurácie"<a href="https://hrad.perunhq.org/2023/10/01-open-closed-principle/#krok-5-v%C5%A1eobecn%C3%BA-a-%C5%A1pecifick%C3%BA-%C4%8Das%C5%A5-prepoj%C3%ADme-pomocou-konfigur%C3%A1cie" class="hash-link" aria-label="Priama linka na Krok 5: Všeobecnú a špecifickú časť prepojíme pomocou &quot;konfigurácie&quot;" title="Priama linka na Krok 5: Všeobecnú a špecifickú časť prepojíme pomocou &quot;konfigurácie&quot;" translate="no">​</a></h3>
<p>Zmenou v kroku 4 sme dosiahli, že funkcia <code>loadCharacters</code> je teraz konfigurovateľná. Zároveň
už funkcia spĺňa aj OCP, pretože ju vieme rozšíriť o možnosť načítavať údaje z inej URL a pritom
nemusíme modifikovať jej telo. Je teda otvorená pre rozširovanie, ale uzatvorená pre zmeny.</p>
<p>Aby nám však kód naďalej fungoval, tak teraz musíme nájsť všetky miesta, kde sa funkcia volá a dodať
tam želanú URL.</p>
<div class="language-typescript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-typescript codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token keyword" style="color:#00009f">export</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">async</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">function</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">getSortedCharacters</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> characters </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">await</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">loadCharacters</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"/api/list.json"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">sortCharactersByRole</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">characters</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token keyword" style="color:#00009f">async</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">function</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">loadCharacters</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">url</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> result </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">await</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">fetch</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">url</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">await</span><span class="token plain"> result</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">json</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">as</span><span class="token plain"> </span><span class="token builtin">Promise</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain">Character</span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span></span><br></div></code></pre></div></div>
<p>Tento krok by sme však nemali robiť bezhlavo. Treba sa zamyslieť jednak nad viacerými spôsobmi
prepojenia a nad ich dôsledkami a vybrať si ten, ktorý nám vyhovuje najviac.</p>
<p>Zmena urobená vyššie je možno pre túto situáciu jednoduchá, lebo funkcia je volaná iba na jednom
mieste, takže to vieme urobiť ľahko a rýchlo. Ale tým, že sme robili zmenu v inej funkcii (<code>getSortedCharacters</code>),
tak sa teraz musíme pýtať, či táto druhá funkcia po zmene stále spĺňa Single Responsibility Principle
a zároveň aj Open-Closed Principle.</p>
<p>Už asi tušíme, že OCP nespĺňa. Pretože sme v nej vytvorili rovnakú situáciu, akú sme mali na začiatku
vo funkcii <code>loadCharacters</code>. Zároveň nespĺňame ani SRP, pretože okrem triedenia postáv má
funkcia v zodpovednosti aj znalosť o URL na načítanie dát.</p>
<p>Veľmi dôležitou je aj otázka, či <code>getSortedCharacters</code> má vôbec niečo vedieť o nejakej URL. Je to funkcia,
ktorá podľa názvu robí triedenie a dáta si len pýta od druhej funkcie. Pre svoju činnosť by nemala
potrebovať poznať žiadnu URL a dokonca by jej malo byť jedno, akým spôsobom funkcia <code>loadCharacters</code>
dáta získava.</p>
<p>Čo teraz s tým? Môžeme skúsiť aplikovať refaktorovacie kroky odznova na funkciu <code>getSortedCharacters</code>, čo nás
zrejme privedie k poznaniu, že musíme nanovo premyslieť architektúru. Tento spôsob nemusí byť zlý, ale ukážeme
si, že pre spĺňanie OCP princípu nám častokrát stačí dosiahnuť potenciál a nemusíme ho hneď využiť.</p>
<p>Ten potenciál je v tom, že chceme, aby sme funkcii <code>loadCharacters</code> <em>mohli</em> zvonka povedať URL, z ktorej
má načítať údaje. Dôlezité je slovíčko <em>mohli</em>. Na dosiahnutie tohto nám úplne postačí dať parametru <code>url</code> defaultnú
hodnotu. Výsledný kód vyzerá takto:</p>
<div class="language-typescript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-typescript codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token keyword" style="color:#00009f">export</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">async</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">function</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">getSortedCharacters</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> characters </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">await</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">loadCharacters</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">sortCharactersByRole</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">characters</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token keyword" style="color:#00009f">async</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">function</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">loadCharacters</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">url </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"/api/list.json"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> result </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">await</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">fetch</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">url</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">await</span><span class="token plain"> result</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">json</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">as</span><span class="token plain"> </span><span class="token builtin">Promise</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain">Character</span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span></span><br></div></code></pre></div></div>
<p>A toto je dostatočne dobré. Funkcia <code>loadCharacters</code> spĺňa OCP a keďže sme do <code>getSortedCharacters</code> nezasahovali, tak
sa nad ňou nemusíme zamýšľať.</p>
<p>Defaultný parameter je celkom pekné riešenie pre túto situáciu, v iných však nemusí byť dostatočné. Pokiaľ
by vás zaujímali iné spôsoby, tak by ste mohli skúsiť:</p>
<ul>
<li class="">uložiť URL do enumu, konštanty alebo zoznamu URL v nejakom konfiguračnom súbore</li>
<li class="">modul (súbor) bude mať privátnu premennú držiacu URL a bude exportovať funkciu na jej nastavenie z vonka</li>
<li class=""><code>loadCharacters</code> si URL vypýta z nejakého "registra"</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="zhrnutie">Zhrnutie<a href="https://hrad.perunhq.org/2023/10/01-open-closed-principle/#zhrnutie" class="hash-link" aria-label="Priama linka na Zhrnutie" title="Priama linka na Zhrnutie" translate="no">​</a></h2>
<p>Open-Closed Principle nám vraví, že je dobré písať kód tak, aby bol otvorený pre rozširovanie funkcionality,
ale uzatvorený pre zmeny kódu.</p>
<p>Na jednom príklade sme si ukázali jednu z najčastejších situácií, kedy je princíp porušený a postupným
refaktoringom sme dosiahli spĺňanie princípu.</p>
<p>Je dôležité si uvedomiť, že nie je možné dosiahnuť taký stav kódu, kde nemusíme robiť žiadne zmeny a všetko bude
možné urobiť len úpravou konfiguračných hodnôt. OCP teda nie je možné aplikovať absolútne. Limitom je pre nás
zodpovednosť upravovanej jednotky. Pokiaľ sa táto zodpovednosť nemení, tak by dosiahnutie OCP nemalo byť zložité.
Preto je zároveň dôležité, aby sme spĺňali princíp jedinej zodpovednosti.</p>]]></content>
        <category label="SOLID" term="SOLID"/>
        <category label="OCP" term="OCP"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[SOLID v JavaScripte: Single Responsibility Principle]]></title>
        <id>https://hrad.perunhq.org/2023/03/27-single-responsibility-principle-v-javascripte/</id>
        <link href="https://hrad.perunhq.org/2023/03/27-single-responsibility-principle-v-javascripte/"/>
        <updated>2023-03-27T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[SOLID princípy nám hovoria, ako by sme mali písať náš kód, aby bol ľahko rozširovateľný, čitateľný]]></summary>
        <content type="html"><![CDATA[<p>SOLID princípy nám hovoria, ako by sme mali písať náš kód, aby bol ľahko rozširovateľný, čitateľný
a udržiavateľný. Hoci tieto princípy boli definované pre podmienky OOP jazykov, tak v skutočnosti
stoja na hlbších základoch a sú tak aplikovateľné aj v jazykoch, ktoré nie sú z rodiny OOP. Pokúsim
sa tu v piatich článkoch ukázať, ako dodržiavať SOLID princípy v React aplikácii písanej
v TypeScripte bez použitia tried.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="single-responsibility-principle">Single Responsibility Principle<a href="https://hrad.perunhq.org/2023/03/27-single-responsibility-principle-v-javascripte/#single-responsibility-principle" class="hash-link" aria-label="Priama linka na Single Responsibility Principle" title="Priama linka na Single Responsibility Principle" translate="no">​</a></h2>
<p>V každom článku sa budem venovať jednému zo SOLID princípov. Prvým na rade je <em>Single Responsibility Principle</em>.
Tento princíp má skratku <em>SRP</em>, do slovenčiny sa prekladá ako "Princíp jedinej zodpovednosti" a jeho
definícia znie nasledovne:</p>
<blockquote>
<p>Trieda by mala mať iba jeden dôvod pre svoju zmenu.</p>
</blockquote>
<p>Pristavme sa chvíľu pri tom, že kým názov hovorí o zodpovednostiach, tak definícia o dôvodoch pre
zmenu. Prečo zrazu ten rozdiel? Porozmýšľajte.</p>
<p>Keď si skúsite vymenovať dôvody, pre ktoré by ste mohli chcieť upraviť kód nejakej triedy, tak
zistíte, že to sú všetko veci, ktoré daná trieda rieši. A keď ich rieši, tak je za ne zodpovedná.
Sú to jej zodpovednosti. Takže vlastne medzi zodpovednosťou a dôvodom pre zmenu nie je rozdiel.</p>
<p>Trieda by teda mala mať jednu jedinú zodpovenosť a tým pádom jeden jediný dôvod pre svoju zmenu.</p>
<p>Ako som ale spomínal. Princípy sú všobecné a neplatia len pre OOP jazyky a pre triedy. Ako by teda
mala znieť definícia <em>SRP</em> pre JavaScript?</p>
<blockquote>
<p>Jednotka kódu by mala mať iba jeden dôvod pre svoju zmenu.</p>
</blockquote>
<p>Pod pojmom "jednotka kódu" si môžete predstaviť čokoľvek z množiny: trieda, modul (súbor), objekt
a funkcia. Princíp sa totiž aplikuje na všetko.</p>
<p>Dôležité je uvedomiť si, že pri pomenovávaní tej jedinej zodpovednosti nejakej jednotky by ste
nemali použiť spojku "a"</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="výhody-dodržiavania-single-responsibility-principle">Výhody dodržiavania Single Responsibility Principle<a href="https://hrad.perunhq.org/2023/03/27-single-responsibility-principle-v-javascripte/#v%C3%BDhody-dodr%C5%BEiavania-single-responsibility-principle" class="hash-link" aria-label="Priama linka na Výhody dodržiavania Single Responsibility Principle" title="Priama linka na Výhody dodržiavania Single Responsibility Principle" translate="no">​</a></h2>
<p>Pokiaľ píšeme kód tak, že dodržiavame <em>SRP,</em> tak dosiahneme:</p>
<ul>
<li class="">jednoduchšie úpravy miernym prepisom alebo výmenou jednotky</li>
<li class="">bezpečnejšie neskoršie úpravy, lebo v kóde nie sú nesúvisiace veci</li>
<li class="">jednoduchšie pochopenie toho, čo jednotka robí</li>
<li class="">ľahkú testovateľnosť jednotky vyplývajúcu zo skôr vymenovaných bodov</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="symptómy-porušenia-princípu">Symptómy porušenia princípu<a href="https://hrad.perunhq.org/2023/03/27-single-responsibility-principle-v-javascripte/#sympt%C3%B3my-poru%C5%A1enia-princ%C3%ADpu" class="hash-link" aria-label="Priama linka na Symptómy porušenia princípu" title="Priama linka na Symptómy porušenia princípu" translate="no">​</a></h2>
<p>Ak chcete zistiť, či jednotka, na ktorú sa práve pozeráte, spĺňa tento princíp alebo nie, tak si
môžete skúsiť vymenovať dôvody zmien, pre ktoré by ste ju museli niekedy prepísať. Našli ste iba
jeden? Gratulujem, jednotka pravdepodobne spĺňa <em>SRP.</em> Problém je trochu v tom, že ak zodpovednosť
(dôvod pre zmenu) pomenujeme všeobecnejšie, tak sa v nej ľahko schovajú zodpovenosti dve (alebo
aj viac). Bohužiaľ, na rozpoznanie tohto rizika pomôže len prax.</p>
<p>Našťastie existuje niekoľko vzorov, ktoré je pri porušení princípu zvyčajne dobre vidieť. Ak ich
v kóde vami skúmanej jednotky vidíte, tak je vysoká pravdepodobnosť, že <em>SRP</em> porušuje. Nie je to
zaručené, ale šanca je vysoká.</p>
<p>Nuž a aké tieto vzory sú?</p>
<p>Pre triedy a objekty:</p>
<ul>
<li class="">trieda/objekt má priveľa properties</li>
<li class="">každá metóda používa iné properties</li>
<li class="">špecifické úlohy sú delegované na privátne metódy</li>
</ul>
<p>Pre moduly:</p>
<ul>
<li class="">modul má priveľa premenných</li>
<li class="">každá funkcia modulu používa iné premenné modulu</li>
<li class="">špecifické úlohy sú delegované na skryté (privátne, neexportované) funkcie</li>
</ul>
<p>Pre funkcie:</p>
<ul>
<li class="">funkcia má priveľa riadkov (50 je veľa, pri 30 by nám mala blikať kontrolka)</li>
<li class="">funkcia obsahuje komentáre, ktoré pomenovávajú jej časti</li>
<li class="">je možné funkciu rozdeliť na viacero menších podľa logických celkov</li>
<li class="">funkcia má priveľa úrovní vnorenia vytvorených pomocou podmienok a cyklov (2 úrovne vnorenia
sú rozumné maximum)</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="ako-refaktorovať">Ako refaktorovať<a href="https://hrad.perunhq.org/2023/03/27-single-responsibility-principle-v-javascripte/#ako-refaktorova%C5%A5" class="hash-link" aria-label="Priama linka na Ako refaktorovať" title="Priama linka na Ako refaktorovať" translate="no">​</a></h2>
<p>Keď už viete, že nejaký kód porušuje <em>SRP,</em> tak refaktoring spočíva z troch krokov:</p>
<ol>
<li class="">extrahujete špecifické úlohy do pomocných funkcií (prípadne metód)</li>
<li class="">identifikujete skrytých kolaborantov</li>
<li class="">prenesiete skrytých kolaborantov do samostatných modulov</li>
</ol>
<p>Skrytý kolaborant je funkcia, ktorá dokáže existovať sama o sebe a v skutočnosti nemá žiadne silné
previazanie na logiku skúmanej jednotky.</p>
<p>Ja pri uvažovaní o tom, či je nejaká pomocná funkcia skrytým kolaborantom, ktorého treba preniesť,
alebo len pomocnou funkciou, ktorá má ostať v aktuálnom module, zvažujem to, či mi dáva zmysel, aby
funkciu volala aj nejaká iná časť aplikácie. Ak je na to teoretická šanca, tak ju presúvam do
samostatného (alebo iného už existujúceho) modulu.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="príklad">Príklad<a href="https://hrad.perunhq.org/2023/03/27-single-responsibility-principle-v-javascripte/#pr%C3%ADklad" class="hash-link" aria-label="Priama linka na Príklad" title="Priama linka na Príklad" translate="no">​</a></h2>
<p>Dobre sa pozrite na tento kód. Je to kód, ktorý sa podobá tomu, čo často vidieť v úvodných skriptoch
React aplikácií, kde sa deje ich inicializácia. Ja som príklad značne zjednodušil a máme tu len
načítanie úvodných dát a namontovanie React aplikácie. Kvôli jednoduchosti som neriešil žiadne
skeletony, routovanie, preklady, lazy loading a React hlúpo čaká na to, kým dobehne ajaxový request.
Ale pre účely učenia sa <em>Single Responsibility Principle</em> je to dostatočné.</p>
<div class="language-typescript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">src/index.tsx</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-typescript codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> React </span><span class="token keyword" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'react'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> ReactDOM </span><span class="token keyword" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'react-dom/client'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> App </span><span class="token keyword" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'./App'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> Character</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> RoleName </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'./types'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> commanders</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> Character</span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> ambassadors</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> Character</span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> result </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">await</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">fetch</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'/api/list.json'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> data </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">await</span><span class="token plain"> result</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">json</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">data</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">forEach</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">character</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> Character</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">character</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">role </span><span class="token operator" style="color:#393A34">===</span><span class="token plain"> RoleName</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Commander</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        commanders</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">push</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">character</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">else</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">character</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">role </span><span class="token operator" style="color:#393A34">===</span><span class="token plain"> RoleName</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Ambassador</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        ambassadors</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">push</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">character</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">ReactDOM</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">createRoot</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">document</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">getElementById</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'root'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">as</span><span class="token plain"> HTMLElement</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">render</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain">React</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">StrictMode</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain">App commanders</span><span class="token operator" style="color:#393A34">=</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">commanders</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> ambassadors</span><span class="token operator" style="color:#393A34">=</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">ambassadors</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">/</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token operator" style="color:#393A34">/</span><span class="token plain">React</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">StrictMode</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span></span><br></div></code></pre></div></div>
<p>Zamyslite sa nad tým, koľko zodpovedností má tento kus kódu? Pri akých dôvodoch by ste do neho
museli siahnuť a niečo zmeniť?</p>
<p>Ja som narátal dve hlavné zodpovednosti:</p>
<ul>
<li class="">získanie inicializačných dát</li>
<li class="">namontovanie React aplikácie</li>
</ul>
<p>Keďže sú zodpovednosti dve, tak už vieme, že kód nespĺňa <em>SRP</em> a mali by sme ho refaktorovať. Prvým
krokom je extrahovanie špecifických úloh do pomocných funkcií.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="krok-1-extrahovanie-špecifických-úloh-do-pomocných-funkcií">Krok 1: Extrahovanie špecifických úloh do pomocných funkcií<a href="https://hrad.perunhq.org/2023/03/27-single-responsibility-principle-v-javascripte/#krok-1-extrahovanie-%C5%A1pecifick%C3%BDch-%C3%BAloh-do-pomocn%C3%BDch-funkci%C3%AD" class="hash-link" aria-label="Priama linka na Krok 1: Extrahovanie špecifických úloh do pomocných funkcií" title="Priama linka na Krok 1: Extrahovanie špecifických úloh do pomocných funkcií" translate="no">​</a></h3>
<p>V programovaní je mimoriadne dôležité používať dobré pomenovania. Funkcia by mala byť pomenovávaná
tak, aby nám už z názvu bolo jasné, čo je jej úlohou. Pri dodržiavaní <em>SRP</em> je tento názov zároveň
veľmi často aj pomenovaním jej hlavnej zodpovednosti. Ja ich preto nazvem: <code>getInitialData</code> a <code>mountApp</code>.</p>
<div class="language-typescript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">src/index.tsx</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-typescript codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> React </span><span class="token keyword" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'react'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> ReactDOM </span><span class="token keyword" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'react-dom/client'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> App </span><span class="token keyword" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'./App'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> Character</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> RoleName </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'./types'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token keyword" style="color:#00009f">async</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">function</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">getInitialData</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> commanders</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> Character</span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> ambassadors</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> Character</span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> result </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">await</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">fetch</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'/api/list.json'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> data </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">await</span><span class="token plain"> result</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">json</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    data</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">forEach</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">character</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> Character</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">character</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">role </span><span class="token operator" style="color:#393A34">===</span><span class="token plain"> RoleName</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Commander</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            commanders</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">push</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">character</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">else</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">character</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">role </span><span class="token operator" style="color:#393A34">===</span><span class="token plain"> RoleName</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Ambassador</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            ambassadors</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">push</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">character</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        commanders</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        ambassadors</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token keyword" style="color:#00009f">function</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">mountApp</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">initialData</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> commanders</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> Character</span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> ambassadors</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> Character</span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    ReactDOM</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">createRoot</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">document</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">getElementById</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'root'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">as</span><span class="token plain"> HTMLElement</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">render</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain">React</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">StrictMode</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain">App commanders</span><span class="token operator" style="color:#393A34">=</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">initialData</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">commanders</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> ambassadors</span><span class="token operator" style="color:#393A34">=</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">initialData</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">ambassadors</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">/</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token operator" style="color:#393A34">/</span><span class="token plain">React</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">StrictMode</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token function" style="color:#d73a49">mountApp</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">await</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">getInitialData</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span></span><br></div></code></pre></div></div>
<p>Trochu sa nám síce zvýšil počet riadkov v kóde, ale to nevadí. Počet riadkov nemá absolútne žiaden
vzťah ku kvalite kódu. Našich riadkov je viac, ale čitateľnosť je vyššia.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="krok-2-identifikovať-skrytých-kolaborantov">Krok 2: Identifikovať skrytých kolaborantov<a href="https://hrad.perunhq.org/2023/03/27-single-responsibility-principle-v-javascripte/#krok-2-identifikova%C5%A5-skryt%C3%BDch-kolaborantov" class="hash-link" aria-label="Priama linka na Krok 2: Identifikovať skrytých kolaborantov" title="Priama linka na Krok 2: Identifikovať skrytých kolaborantov" translate="no">​</a></h3>
<p>Máme teda kód v module rozdelený do dvoch funkcií, z ktorých každá je zodpovedná za niečo iné.
Teraz sa musíme rozhodnúť, ktoré z týchto funkcií sú prirodzené pre tento modul a je vhodné, aby
v ňom ostali. A na druhej strane nájsť také, ktoré nie sú špecifické pre modul a sú teoreticky
všeobecne použiteľné.</p>
<p>Najskôr si však musíme povedať, čo je primárnou zodpovednosťou modulu (súboru <code>src/index.tsx</code>).
Podľa mňa to je <strong>spustenie aplikácie</strong>.</p>
<p>Mne sa potom ako jednoznačný kandidát na skrytého kolaboranta javí funkcia <code>getInitialData</code>. Zdá sa,
že ona poskytuje dáta z nejakého endpointu a kľudne by si rovnaké dáta mohla vypýtať aj iná časť
našej aplikácie. Presunul by som ju preto do samostatného modulu.</p>
<p>Trochu ťažšie je to s funkciou <code>mountApp</code>. Tú na prvý pohľad už zrejme v inej časti aplikácie nepoužijeme.
Ale naozaj je to tak? Čo keby sme ju chceli otestovať automatizovanými testami? Navyše si viem predstaviť,
že pre <em>spustenie aplikácie</em> (primárna zodpovednost modulu) nemusíme zavolať práve túto <code>mountApp</code>.
Možno budeme chcieť iný spôsob montovania pre produkčné alebo nejaké špeciálne prostredie. Takže
osamostatníme aj <code>mountApp</code>.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="krok-3-presun-skrytých-kolaborantov-do-samostatných-modulov">Krok 3: Presun skrytých kolaborantov do samostatných modulov<a href="https://hrad.perunhq.org/2023/03/27-single-responsibility-principle-v-javascripte/#krok-3-presun-skryt%C3%BDch-kolaborantov-do-samostatn%C3%BDch-modulov" class="hash-link" aria-label="Priama linka na Krok 3: Presun skrytých kolaborantov do samostatných modulov" title="Priama linka na Krok 3: Presun skrytých kolaborantov do samostatných modulov" translate="no">​</a></h3>
<p>Funkcia <code>getInitialData</code> rieši získavanie dát o nejakých postavách. Presuniem ju preto do súboru
<code>src/services/character/characterRepository.ts</code>.</p>
<div class="language-typescript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">src/services/character/characterRepository.ts</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-typescript codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> Character</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> RoleName </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"./types"</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token keyword" style="color:#00009f">export</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">async</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">function</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">getInitialData</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> commanders</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> Character</span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> ambassadors</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> Character</span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> result </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">await</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">fetch</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"/api/list.json"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> data </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">await</span><span class="token plain"> result</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">json</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    data</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">forEach</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">character</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> Character</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">character</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">role </span><span class="token operator" style="color:#393A34">===</span><span class="token plain"> RoleName</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Commander</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            commanders</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">push</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">character</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">else</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">character</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">role </span><span class="token operator" style="color:#393A34">===</span><span class="token plain"> RoleName</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Ambassador</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            ambassadors</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">push</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">character</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        commanders</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        ambassadors</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span></span><br></div></code></pre></div></div>
<p>Funkcia <code>mountApp</code> je služba používateľského rozhrania. Tú dám do súboru
<code>src/services/ui/mountApp.tsx</code>.</p>
<div class="language-typescript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">src/services/ui/mountApp.tsx</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-typescript codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> React </span><span class="token keyword" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'react'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> ReactDOM </span><span class="token keyword" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'react-dom/client'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> Character </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'@local/services/character/characterRepository'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> App </span><span class="token keyword" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'@local/App'</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token keyword" style="color:#00009f">function</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">mountApp</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">initialData</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> commanders</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> Character</span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> ambassadors</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> Character</span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    ReactDOM</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">createRoot</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">document</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">getElementById</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'root'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">as</span><span class="token plain"> HTMLElement</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">render</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain">React</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">StrictMode</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain">App commanders</span><span class="token operator" style="color:#393A34">=</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">initialData</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">commanders</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> ambassadors</span><span class="token operator" style="color:#393A34">=</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">initialData</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">ambassadors</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">/</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token operator" style="color:#393A34">/</span><span class="token plain">React</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">StrictMode</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token keyword" style="color:#00009f">export</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">default</span><span class="token plain"> mountApp</span><span class="token punctuation" style="color:#393A34">;</span></span><br></div></code></pre></div></div>
<p>Po týchto presunoch vyzerá <code>src/index.tsx</code> takto:</p>
<div class="language-typescript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">src/index.tsx</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-typescript codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> getInitialData </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"@local/services/character/characterRepository"</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> mountApp </span><span class="token keyword" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"@local/services/ui/mountApp"</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token function" style="color:#d73a49">mountApp</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">await</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">getInitialData</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span></span><br></div></code></pre></div></div>
<p>Oveľa čitateľnejšie. Už z názvov funkcií je jasné, čo sa kde rieši.</p>
<p>Hoci sme si prešli všetkými troma bodmi, ktoré nám hovoria, ako refaktorovať jednotku, ktorá nespĺňa
<em>SRP</em>, tak ešte nemáme hotové všetko. Dosiahli sme, že modul <code>index.tsx</code> už spĺňa <em>Single Responsibility Principle</em>.
Ale aby sme mohli povedať, že s refaktoringom sme skončili, tak by sme sa mali pozrieť aj na všetky
novo vytvorené funkcie. Spĺňajú oni tiež tento princíp?</p>
<p><code>mountApp</code> je z tohto pohľadu celkom v poriadku. Sú tam síce nejaké problémy, ale tie už patria pod
<em>Open-Closed Principle</em>, o ktorom si povieme nabudúce.</p>
<p>Horšie to je s funkciou <code>getInitialData</code>. Skúste pomenovať jej zodpovednosti. Pri akých dôvodoch
by ste potrebovali siahnuť na jej kóde a zmeniť ho?</p>
<p>Ja vidím dva dôvody:</p>
<ul>
<li class="">získavanie dát z backendu</li>
<li class="">filtrovanie dát</li>
</ul>
<p>Čo s tým budeme robiť? Presne to isté, čo aj s modulom <code>index.tsx</code> a aplikujeme rovnaký algoritmus.
Extrahujeme kód do pomocných funkcií. Potom sa zamyslíme, či niektoré z funkcií sú skrytými
kolaborantami a pokiaľ áno, tak ich presunieme do iných modulov.</p>
<p>Urobme prvý krok:</p>
<div class="language-typescript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">src/services/character/characterRepository.ts</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-typescript codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> Character</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> RoleName </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"./types"</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token keyword" style="color:#00009f">export</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">async</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">function</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">getInitialData</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> characters </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">await</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">loadCharacters</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">filterCharactersByRole</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">characters</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token keyword" style="color:#00009f">async</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">function</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">loadCharacters</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> result </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">await</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">fetch</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"/api/list.json"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">await</span><span class="token plain"> result</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">json</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">as</span><span class="token plain"> </span><span class="token builtin">Promise</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain">Character</span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token keyword" style="color:#00009f">function</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">filterCharactersByRole</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">characters</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> Character</span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> commanders</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> Character</span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> ambassadors</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> Character</span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    characters</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">forEach</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">character</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> Character</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">character</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">role </span><span class="token operator" style="color:#393A34">===</span><span class="token plain"> RoleName</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Commander</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            commanders</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">push</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">character</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">else</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">character</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">role </span><span class="token operator" style="color:#393A34">===</span><span class="token plain"> RoleName</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Ambassador</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            ambassadors</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">push</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">character</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> commanders</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> ambassadors </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span></span><br></div></code></pre></div></div>
<p>Druhým krokom je premýšľanie o tom, či niektorá z funkcií je skrytým kolaborantom. <code>loadCharacters</code>
je pomerne úzko spätá s primárnou zodpovednosťou modulu <code>characterRepository</code>, ktorým je
poskytovanie prístupu k zoznamu postáv. Tým pádom si myslím, že funkcia je len pomocnou pre tento
modul a ako taká môže ostať jeho súčasťou.</p>
<p>Avšak, silné podozrenie na skrytého kolaboranta mám pri funkcii <code>filterCharactersByRole</code>. Ide len
o filtrovanie zoznamu postáv, ktoré dostane v argumente. Nie je žiaden špeciálny dôvod na to, aby
táto funkcia bola silno prepojená na modul poskytujúci prístup k zoznamu postáv. Vytiahneme ju teda
von. Ja som zvolil súbor <code>src/services/character/filterCharacters.ts</code>. Výsledok by
mohol vyzerať takto:</p>
<div class="language-typescript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">src/services/character/characterRepository.ts</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-typescript codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> Character </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"./types"</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> filterCharactersByRole </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"./filterCharacters"</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token keyword" style="color:#00009f">export</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">async</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">function</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">getInitialData</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> characters </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">await</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">loadCharacters</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">filterCharactersByRole</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">characters</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token keyword" style="color:#00009f">async</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">function</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">loadCharacters</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> result </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">await</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">fetch</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"/api/list.json"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">await</span><span class="token plain"> result</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">json</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">as</span><span class="token plain"> </span><span class="token builtin">Promise</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain">Character</span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span></span><br></div></code></pre></div></div>
<div class="language-typescript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">src/services/character/filterCharacters.ts</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-typescript codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> Character</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> RoleName </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"./types"</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token keyword" style="color:#00009f">export</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">function</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">filterCharactersByRole</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">characters</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> Character</span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> commanders</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> Character</span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> ambassadors</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> Character</span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    characters</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">forEach</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">character</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> Character</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">character</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">role </span><span class="token operator" style="color:#393A34">===</span><span class="token plain"> RoleName</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Commander</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            commanders</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">push</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">character</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">else</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">character</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">role </span><span class="token operator" style="color:#393A34">===</span><span class="token plain"> RoleName</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Ambassador</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            ambassadors</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">push</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">character</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> commanders</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> ambassadors </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span></span><br></div></code></pre></div></div>
<p>V tejto chvíli by sme refaktoring pre potreby spĺňania <em>SRP</em> mohli vyhlásiť za skončený. Ostala nám
však jedna drobnosť, ktorá nie je úplne v poriadku. Názov funkcie <code>getInitialData</code> dáva zmysel iba
v kontexte modulu <code>index.tsx</code>. Avšak my sme z nej pred chvíľkou zistili, že to je všeobecne
použiteľná funkcia. Pokiaľ ju bude volať niečo iné v našej aplikácii, tak názov <code>getInitialData</code>
bude celkom mätúci. Vhodnejšie pomenovanie by mohlo byť <code>getFilteredCharacters</code>.</p>
<p>Urobme patričné úpravy a už sme naozaj skončili.</p>
<div class="language-typescript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">src/services/character/characterRepository.ts</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-typescript codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> Character </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"./types"</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> filterCharactersByRole </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"./filterCharacters"</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token keyword" style="color:#00009f">export</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">async</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">function</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">getFilteredCharacters</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> characters </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">await</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">loadCharacters</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">filterCharactersByRole</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">characters</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token keyword" style="color:#00009f">async</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">function</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">loadCharacters</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> result </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">await</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">fetch</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"/api/list.json"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">await</span><span class="token plain"> result</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">json</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">as</span><span class="token plain"> </span><span class="token builtin">Promise</span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain">Character</span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">]</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span></span><br></div></code></pre></div></div>
<div class="language-typescript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">src/index.tsx</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-typescript codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> getFilteredCharacters </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"@local/services/character/characterRepository"</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> mountApp </span><span class="token keyword" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"@local/services/ui/mountApp"</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token function" style="color:#d73a49">mountApp</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">await</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">getFilteredCharacters</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span></span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="zhrnutie">Zhrnutie<a href="https://hrad.perunhq.org/2023/03/27-single-responsibility-principle-v-javascripte/#zhrnutie" class="hash-link" aria-label="Priama linka na Zhrnutie" title="Priama linka na Zhrnutie" translate="no">​</a></h2>
<p>Ukázal som vám, ako v JavaScripte a TypeScripte rozpoznáte porušenie <em>Single Responsibility Principle</em>
a akým postupom viete kód upraviť, aby tento princíp spĺňal.</p>
<p>Možno vás niektorých napadlo, že kým na začiatku sme mali jeden súbor s 24 riadkami kódu, tak na
konci už máme súbory štyri a dokopy okolo 50 riadkov kódu. Opticky to teda vyzerá tak, že sme zvýšili
komplexnosť a tým stratili prehľadnosť. Takže kde je ten benefit?</p>
<p>Hoci nám vzniklo viac súborov a funkcií, tak všetky tieto sú krátke.</p>
<p>Nové funkcie a aj moduly vieme použiť v iných častiach našej aplikácie a možno ich aj vytiahnuť
do inej aplikácie.</p>
<p>Funkcie aj súbory sú dobre pomenované a pokiaľ do nich nepotrebujeme siahať, tak nemusíme študovať
ich kód. Ak by sme potrebovali urobiť zmenu, tak podľa názvu vieme nájsť správny modul a funkciu,
kde túto zmenu bude potrebné urobiť.</p>
<p>Potrebnú zmenu urobíme jednoduchšie, lebo v kóde funkcie sa nám nepletú pod ruky nesúvisiace veci.</p>
<p>A v neposlednom rade vieme funkcie otestovať samostatne a izolovane.</p>]]></content>
        <category label="SOLID" term="SOLID"/>
        <category label="SRP" term="SRP"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tmux - štartovacie skripty pre projekty]]></title>
        <id>https://hrad.perunhq.org/2021/05/28-startovacie-skripty-pre-projekty/</id>
        <link href="https://hrad.perunhq.org/2021/05/28-startovacie-skripty-pre-projekty/"/>
        <updated>2021-05-28T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Keď programujem, tak programujem v konzole. Okrem editora mám v jednej]]></summary>
        <content type="html"><![CDATA[<p>Keď programujem, tak programujem v konzole. Okrem <a href="https://neovim.io/" target="_blank" rel="noopener noreferrer" class="">editora</a> mám v jednej
tmux session otvorených niekoľko ďalších tabov/okien pre projekt a v nich mám veci ako bežiaci dev
server, pripojenie do databázy, shell v docker kontajneroch a pod. Skrátka, môže byť toho celkom dosť.
Ale aj keby nebolo, tak by bola celkom otrava, keby som si túto session a jej rozloženie do tabov
zakaždým spúšťal ručne. Tak som si namiesto toho napísal skripty.</p>
<!-- -->
<!-- -->
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>K článku si viete pozrieť aj:</div><div class="admonitionContent_BuS1"><ul><li><svg data-prefix="fab" data-icon="youtube" class="svg-inline--fa fa-youtube" role="img" viewBox="0 0 576 512" aria-hidden="true" color="red"><path fill="currentColor" d="M549.7 124.1C543.5 100.4 524.9 81.8 501.4 75.5 458.9 64 288.1 64 288.1 64S117.3 64 74.7 75.5C51.2 81.8 32.7 100.4 26.4 124.1 15 167 15 256.4 15 256.4s0 89.4 11.4 132.3c6.3 23.6 24.8 41.5 48.3 47.8 42.6 11.5 213.4 11.5 213.4 11.5s170.8 0 213.4-11.5c23.5-6.3 42-24.2 48.3-47.8 11.4-42.9 11.4-132.3 11.4-132.3s0-89.4-11.4-132.3zM232.2 337.6l0-162.4 142.7 81.2-142.7 81.2z"></path></svg> <span>Video<!-- -->:<!-- --> <a href="https://www.youtube.com/watch?v=lBCMtvQ99Ao" target="_blank" rel="noreferrer">https://www.youtube.com/watch?v=lBCMtvQ99Ao</a></span></li><li><svg data-prefix="fas" data-icon="code-branch" class="svg-inline--fa fa-code-branch" role="img" viewBox="0 0 448 512" aria-hidden="true" color="grey"><path fill="currentColor" d="M80 104a24 24 0 1 0 0-48 24 24 0 1 0 0 48zm80-24c0 32.8-19.7 61-48 73.3l0 70.7 176 0c26.5 0 48-21.5 48-48l0-22.7c-28.3-12.3-48-40.5-48-73.3 0-44.2 35.8-80 80-80s80 35.8 80 80c0 32.8-19.7 61-48 73.3l0 22.7c0 61.9-50.1 112-112 112l-176 0 0 70.7c28.3 12.3 48 40.5 48 73.3 0 44.2-35.8 80-80 80S0 476.2 0 432c0-32.8 19.7-61 48-73.3l0-205.3C19.7 141 0 112.8 0 80 0 35.8 35.8 0 80 0s80 35.8 80 80zm232 0a24 24 0 1 0 -48 0 24 24 0 1 0 48 0zM80 456a24 24 0 1 0 0-48 24 24 0 1 0 0 48z"></path></svg> <span>Git repozitár<!-- -->:<!-- --> <a href="https://bitbucket.org/perungrad/tmux-functions/" target="_blank" rel="noreferrer">https://bitbucket.org/perungrad/tmux-functions/</a></span></li></ul></div></div>
<p>S použitím tmux-u to bolo ľahké. Proste som si napísal shellovský skript, kde som najskôr vytvoril
session (<code>tmux new-session</code>), pootváral taby (<code>tmux new-window</code>) a v každom tabe spustil to,
čo som potreboval (<code>tmux send-keys</code>).</p>
<p>Pre každý projekt mám takto urobený samostatný spúšťací skript. Niektoré sú zložitejšie, iné jednoduchšie.
Napríklad skript spúštaný vtedy, keď idem napísať článok pre tento blog je pomerne jednoduchý.</p>
<p>Blog je robený v <a href="https://www.gatsbyjs.com/" target="_blank" rel="noopener noreferrer" class="">Gatsby</a> a keď s ním idem pracovať, tak
môj setup spočíva v tom, že otvorím tmux session s tromi oknami. V jednom je neovim, v druhom
spustím server pre gatsby a tretí tab je len terminál v adresári, odkiaľ
spúštam deploy.</p>
<p>Skript vyzerá takto:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">~/bin/hrad.sh</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token shebang important">#!/bin/bash</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># ako sa má volať tmux session</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token assign-left variable" style="color:#36acaa">SESSION_NAME</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">hrad</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># ak už session bola spustená, tak sa len pripojím</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> tmux has-session </span><span class="token parameter variable" style="color:#36acaa">-t</span><span class="token operator" style="color:#393A34">=</span><span class="token variable" style="color:#36acaa">$SESSION_NAME</span><span class="token plain"> </span><span class="token operator file-descriptor important" style="color:#393A34">2</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain">/dev/null</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">then</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    tmux attach </span><span class="token parameter variable" style="color:#36acaa">-t</span><span class="token plain"> </span><span class="token variable" style="color:#36acaa">$SESSION_NAME</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token builtin class-name">exit</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token keyword" style="color:#00009f">fi</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># prepnem sa do adresáru s projektom</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token builtin class-name">cd</span><span class="token plain"> ~/projects/perunhq.org/hrad.perunhq.org</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># spustím session s prvým tabom, ale detachnem sa</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">tmux new-session </span><span class="token parameter variable" style="color:#36acaa">-d</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-s</span><span class="token plain"> </span><span class="token variable" style="color:#36acaa">$SESSION_NAME</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-n</span><span class="token plain"> src</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># otvorím ďalšie taby</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">tmux new-window </span><span class="token parameter variable" style="color:#36acaa">-n</span><span class="token plain"> gatsby</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">tmux new-window </span><span class="token parameter variable" style="color:#36acaa">-n</span><span class="token plain"> deploy</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># v tabe `src` spustím nvim</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">tmux send-keys </span><span class="token parameter variable" style="color:#36acaa">-t</span><span class="token plain"> </span><span class="token variable" style="color:#36acaa">$SESSION_NAME</span><span class="token plain">:src </span><span class="token string" style="color:#e3116c">"cd web"</span><span class="token plain"> Enter </span><span class="token string" style="color:#e3116c">"nvim"</span><span class="token plain"> Enter</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># v tabe `gatsby` spustím dev server</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">tmux send-keys </span><span class="token parameter variable" style="color:#36acaa">-t</span><span class="token plain"> </span><span class="token variable" style="color:#36acaa">$SESSION_NAME</span><span class="token plain">:gatsby </span><span class="token string" style="color:#e3116c">"cd web"</span><span class="token plain"> Enter </span><span class="token string" style="color:#e3116c">"gatsby develop"</span><span class="token plain"> Enter</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># v tabe `deploy` nerobím nič, len sa prepnem do adresáru, odkiaľ neskôr spustím deploy</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">tmux send-keys </span><span class="token parameter variable" style="color:#36acaa">-t</span><span class="token plain"> </span><span class="token variable" style="color:#36acaa">$SESSION_NAME</span><span class="token plain">:deploy </span><span class="token string" style="color:#e3116c">"cd deploy"</span><span class="token plain"> Enter</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># keď je hotovo, tak sa pripojím do session a môžem písať</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">tmux attach </span><span class="token parameter variable" style="color:#36acaa">-t</span><span class="token plain"> </span><span class="token variable" style="color:#36acaa">$SESSION_NAME</span><span class="token plain">:src</span></span><br></div></code></pre></div></div>
<p>Bez komentárov je to 21 riadkov kódu, čo je celkom fajn. Skript som si uložil pod názvom
<code>hrad.sh</code> a s právami na spúšťanie (<code>chmod 755 hrad.sh</code>) do adresára <code>~/bin</code>,
ktorý je v mojej <code>$PATH</code>. Tým pádom ho viem odkiaľkovek spustiť zadaním príkazu:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">hrad.sh</span><br></div></code></pre></div></div>
<p>No a takto to vyzerá hneď po spustení:</p>
<p><img decoding="async" loading="lazy" alt="tmux session pre tento blog" src="https://hrad.perunhq.org/assets/images/2021-05-28-tmux-hrad-4d746b95cc42d83a6519370963794c4d.png" width="943" height="481" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="ukončenie-session">Ukončenie session<a href="https://hrad.perunhq.org/2021/05/28-startovacie-skripty-pre-projekty/#ukon%C4%8Denie-session" class="hash-link" aria-label="Priama linka na Ukončenie session" title="Priama linka na Ukončenie session" translate="no">​</a></h2>
<p>Ukončenie je jednoduché, ak nemáte v žiadnom okne spustené niečo, čo sa netriviálne ukončuje.
Stačí spustiť príkaz:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">tmux kill-session -t nazov-session</span><br></div></code></pre></div></div>
<p>Ak je v niektorom okne niečo netriviálne, tak sa to dá najskôr pomocou <code>tmux send-keys</code> ukončiť
a upratať a potom môže nastúpiť <code>tmux kill-session</code>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="znovupoužiteľná-funkcia-na-otváranie-session">Znovupoužiteľná funkcia na otváranie session<a href="https://hrad.perunhq.org/2021/05/28-startovacie-skripty-pre-projekty/#znovupou%C5%BEite%C4%BEn%C3%A1-funkcia-na-otv%C3%A1ranie-session" class="hash-link" aria-label="Priama linka na Znovupoužiteľná funkcia na otváranie session" title="Priama linka na Znovupoužiteľná funkcia na otváranie session" translate="no">​</a></h2>
<p>Keďže vo veľa štartovacích skriptoch sa mi objavoval stále rovnaký kód pre vytvorenie session
a toto je pre programátora signál, že niečo je možné abstrahovať a vytiahnuť do samostatnej
funkcie, tak som urobil funkciu pre naštartovanie session.</p>
<p>Jej aktuálny kód je v <a href="https://bitbucket.org/perungrad/tmux-functions/" target="_blank" rel="noopener noreferrer" class="">repozitári tmux-functions</a>
na Bitbuckete, v čase písania tohto textu vyzerá nasledovne:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">~/.local/share/tmux-functions/tmux-functions.sh</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token function-name function" style="color:#d73a49">start_session_and_open_windows</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token builtin class-name">local</span><span class="token plain"> </span><span class="token assign-left variable" style="color:#36acaa">SESSION_NAME</span><span class="token operator" style="color:#393A34">=</span><span class="token variable" style="color:#36acaa">$1</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token builtin class-name">shift</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token builtin class-name">local</span><span class="token plain"> </span><span class="token assign-left variable" style="color:#36acaa">WINDOW_NAMES</span><span class="token operator" style="color:#393A34">=</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"</span><span class="token string variable" style="color:#36acaa">$@</span><span class="token string" style="color:#e3116c">"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-n</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"</span><span class="token string variable" style="color:#36acaa">$TMUX</span><span class="token string" style="color:#e3116c">"</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">then</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token builtin class-name">echo</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Can not run inside another tmux session"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token builtin class-name">exit</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">fi</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> tmux has-session </span><span class="token parameter variable" style="color:#36acaa">-t</span><span class="token operator" style="color:#393A34">=</span><span class="token variable" style="color:#36acaa">$SESSION_NAME</span><span class="token plain"> </span><span class="token operator file-descriptor important" style="color:#393A34">2</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain">/dev/null</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">then</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        tmux attach </span><span class="token parameter variable" style="color:#36acaa">-t</span><span class="token plain"> </span><span class="token variable" style="color:#36acaa">$SESSION_NAME</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token builtin class-name">exit</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">fi</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    tmux new-session </span><span class="token parameter variable" style="color:#36acaa">-d</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-s</span><span class="token plain"> </span><span class="token variable" style="color:#36acaa">$SESSION_NAME</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-n</span><span class="token plain"> </span><span class="token variable" style="color:#36acaa">${WINDOW_NAMES</span><span class="token variable punctuation" style="color:#393A34">[</span><span class="token variable" style="color:#36acaa">0</span><span class="token variable punctuation" style="color:#393A34">]</span><span class="token variable" style="color:#36acaa">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">for</span><span class="token plain"> </span><span class="token for-or-select variable" style="color:#36acaa">i</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">in</span><span class="token plain"> </span><span class="token variable" style="color:#36acaa">${</span><span class="token variable operator" style="color:#393A34">!</span><span class="token variable" style="color:#36acaa">WINDOW_NAMES</span><span class="token variable punctuation" style="color:#393A34">[</span><span class="token variable" style="color:#36acaa">@</span><span class="token variable punctuation" style="color:#393A34">]</span><span class="token variable" style="color:#36acaa">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">do</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"> </span><span class="token variable" style="color:#36acaa">$i</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-eq</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">then</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            </span><span class="token builtin class-name">continue</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">fi</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token builtin class-name">local</span><span class="token plain"> </span><span class="token assign-left variable" style="color:#36acaa">WINDOW_NAME</span><span class="token operator" style="color:#393A34">=</span><span class="token variable" style="color:#36acaa">${WINDOW_NAMES</span><span class="token variable punctuation" style="color:#393A34">[</span><span class="token variable" style="color:#36acaa">$i</span><span class="token variable punctuation" style="color:#393A34">]</span><span class="token variable" style="color:#36acaa">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        tmux new-window </span><span class="token parameter variable" style="color:#36acaa">-n</span><span class="token plain"> </span><span class="token variable" style="color:#36acaa">$WINDOW_NAME</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">done</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div></code></pre></div></div>
<p>Stačí si ju naimportovať do skriptu, pri zavolaní jej odovzdať názov pre session a pre okná.
V repozitári je aj ukážka použitia, ale keď s jej pomocou upravím svoj skript pre gatsby blog,
tak sa dostanem k takémuto kódu:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">~/bin/hrad.sh</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token shebang important">#!/bin/bash</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token assign-left variable" style="color:#36acaa">SESSION_NAME</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">hrad</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token builtin class-name">source</span><span class="token plain"> ~/.local/share/tmux-functions/tmux-functions.sh</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token builtin class-name">cd</span><span class="token plain"> ~/projects/perunhq.org/hrad.perunhq.org</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">start_session_and_open_windows </span><span class="token variable" style="color:#36acaa">$SESSION_NAME</span><span class="token plain"> src gatsby deploy</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">tmux send-keys </span><span class="token parameter variable" style="color:#36acaa">-t</span><span class="token plain"> </span><span class="token variable" style="color:#36acaa">$SESSION_NAME</span><span class="token plain">:src </span><span class="token string" style="color:#e3116c">"cd web"</span><span class="token plain"> Enter </span><span class="token string" style="color:#e3116c">"nvim"</span><span class="token plain"> Enter</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">tmux send-keys </span><span class="token parameter variable" style="color:#36acaa">-t</span><span class="token plain"> </span><span class="token variable" style="color:#36acaa">$SESSION_NAME</span><span class="token plain">:gatsby </span><span class="token string" style="color:#e3116c">"cd web"</span><span class="token plain"> Enter </span><span class="token string" style="color:#e3116c">"gatsby develop"</span><span class="token plain"> Enter</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">tmux send-keys </span><span class="token parameter variable" style="color:#36acaa">-t</span><span class="token plain"> </span><span class="token variable" style="color:#36acaa">$SESSION_NAME</span><span class="token plain">:deploy </span><span class="token string" style="color:#e3116c">"cd deploy"</span><span class="token plain"> Enter</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">tmux attach </span><span class="token parameter variable" style="color:#36acaa">-t</span><span class="token plain"> </span><span class="token variable" style="color:#36acaa">$SESSION_NAME</span><span class="token plain">:src</span></span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="jeden-skript-na-naštartovanie-aj-ukončenie">Jeden skript na naštartovanie aj ukončenie<a href="https://hrad.perunhq.org/2021/05/28-startovacie-skripty-pre-projekty/#jeden-skript-na-na%C5%A1tartovanie-aj-ukon%C4%8Denie" class="hash-link" aria-label="Priama linka na Jeden skript na naštartovanie aj ukončenie" title="Priama linka na Jeden skript na naštartovanie aj ukončenie" translate="no">​</a></h2>
<p>Najnovšia iterácia mojich štartovacích skriptov v sebe obsahuje aj variantu pre ukončenie
celej session. Stačí, ak skript zavolám s argumentom <code>stop</code>.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># keď idem písat blogpost alebo meniť kód pre môj blog</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">hrad.sh</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># keď som dopísal a chcem všetko zavrieť</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">hrad.sh stop</span><br></div></code></pre></div></div>
<p>Docielil som to veľmi jednoducho. Proste som si prečítal prípadný argument pre skript a cez
<code>case</code> v bash-i sa rozhodol, či sa session vytvorí alebo ukončí.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">~/bin/hrad.sh</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token shebang important">#!/bin/bash</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token assign-left variable" style="color:#36acaa">COMMAND</span><span class="token operator" style="color:#393A34">=</span><span class="token variable" style="color:#36acaa">$1</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token assign-left variable" style="color:#36acaa">SESSION_NAME</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">hrad</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token assign-left variable" style="color:#36acaa">WINDOW_NAMES</span><span class="token operator" style="color:#393A34">=</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">src gatsby deploy</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token builtin class-name">source</span><span class="token plain"> ~/.local/share/tmux-functions/tmux-functions.sh</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token function-name function" style="color:#d73a49">start_project</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token builtin class-name">cd</span><span class="token plain"> ~/projects/perunhq.org/hrad.perunhq.org</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    start_session_and_open_windows </span><span class="token variable" style="color:#36acaa">$SESSION_NAME</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"</span><span class="token string variable" style="color:#36acaa">${WINDOW_NAMES</span><span class="token string variable punctuation" style="color:#393A34">[</span><span class="token string variable" style="color:#36acaa">@</span><span class="token string variable punctuation" style="color:#393A34">]</span><span class="token string variable" style="color:#36acaa">}</span><span class="token string" style="color:#e3116c">"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    tmux send-keys </span><span class="token parameter variable" style="color:#36acaa">-t</span><span class="token plain"> </span><span class="token variable" style="color:#36acaa">$SESSION_NAME</span><span class="token plain">:src </span><span class="token string" style="color:#e3116c">"cd web"</span><span class="token plain"> Enter </span><span class="token string" style="color:#e3116c">"nvim"</span><span class="token plain"> Enter</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    tmux send-keys </span><span class="token parameter variable" style="color:#36acaa">-t</span><span class="token plain"> </span><span class="token variable" style="color:#36acaa">$SESSION_NAME</span><span class="token plain">:gatsby </span><span class="token string" style="color:#e3116c">"cd web"</span><span class="token plain"> Enter </span><span class="token string" style="color:#e3116c">"gatsby develop"</span><span class="token plain"> Enter</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    tmux send-keys </span><span class="token parameter variable" style="color:#36acaa">-t</span><span class="token plain"> </span><span class="token variable" style="color:#36acaa">$SESSION_NAME</span><span class="token plain">:deploy </span><span class="token string" style="color:#e3116c">"cd deploy"</span><span class="token plain"> Enter</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    tmux attach </span><span class="token parameter variable" style="color:#36acaa">-t</span><span class="token plain"> </span><span class="token variable" style="color:#36acaa">$SESSION_NAME</span><span class="token plain">:src</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token keyword" style="color:#00009f">case</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"</span><span class="token string variable" style="color:#36acaa">$COMMAND</span><span class="token string" style="color:#e3116c">"</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">in</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token string" style="color:#e3116c">"stop"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        tmux kill-session </span><span class="token parameter variable" style="color:#36acaa">-t</span><span class="token plain"> </span><span class="token variable" style="color:#36acaa">$SESSION_NAME</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">;</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    *</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        start_project</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">;</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token keyword" style="color:#00009f">esac</span></span><br></div></code></pre></div></div>
<p>A to je všetko. 🎉</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="-bonus-skript-pre-zložitejší-projekt">🎁 Bonus: Skript pre zložitejší projekt<a href="https://hrad.perunhq.org/2021/05/28-startovacie-skripty-pre-projekty/#-bonus-skript-pre-zlo%C5%BEitej%C5%A1%C3%AD-projekt" class="hash-link" aria-label="Priama linka na 🎁 Bonus: Skript pre zložitejší projekt" title="Priama linka na 🎁 Bonus: Skript pre zložitejší projekt" translate="no">​</a></h2>
<p>Jeden z mojich projektov je webová hra, ktorá má frontend v Reacte, backend v PHP, komunikuje aj
cez websockety a na vývoj sa používa docker.</p>
<p>Keď na nej idem pracovať, tak musím najskôr spustiť docker kontajnery pre projekt a následne chcemvšetko toto:</p>
<ul>
<li class="">jeden tab v tmux-e s editorom</li>
<li class="">jeden rezervný tab pre rôzne príkazy</li>
<li class="">jeden shell do webserver kontajneru na spúšťanie <code>composer install</code> a pod.</li>
<li class="">jeden shell do node kontajneru na spustenie dev serveru pre frontend</li>
<li class="">jeden shell do webserver kontajneru na spúšťanie testov v PHPUnit-e</li>
<li class="">jedno pripojenie do DB</li>
<li class="">jedno pripojenie do fixtúrovej DB (to je DB pre autoamtizované testy)</li>
<li class="">prihlásiť sa do webserver kontajneru a spustiť websocket server</li>
</ul>
<p>Všetko mi to zabezpečuje skript nazvaný podľa projektu (<code>wareena.sh</code>), ktorý prijíma aj prípadný
argument <code>stop</code> pre ukončenie session. Jeho kód je tu:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">~/bin/wareena.sh</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token shebang important">#!/bin/bash</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token assign-left variable" style="color:#36acaa">SESSION_NAME</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">wareena</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token assign-left variable" style="color:#36acaa">COMMAND</span><span class="token operator" style="color:#393A34">=</span><span class="token variable" style="color:#36acaa">$1</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token assign-left variable" style="color:#36acaa">TARGET_DIR</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"/home/perun/projects/wareena/src/web"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token assign-left variable" style="color:#36acaa">DOCKER_DIR</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"/home/perun/projects/wareena"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token assign-left variable" style="color:#36acaa">WINDOW_NAMES</span><span class="token operator" style="color:#393A34">=</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">src misc </span><span class="token function" style="color:#d73a49">node</span><span class="token plain"> webserver </span><span class="token builtin class-name">test</span><span class="token plain"> db fixture_db ws</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># https://bitbucket.org/perungrad/tmux-functions</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token builtin class-name">source</span><span class="token plain"> ~/.local/share/tmux-functions/tmux-functions.sh</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token function-name function" style="color:#d73a49">start_project</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> tmux has-session </span><span class="token parameter variable" style="color:#36acaa">-t</span><span class="token operator" style="color:#393A34">=</span><span class="token variable" style="color:#36acaa">$SESSION_NAME</span><span class="token plain"> </span><span class="token operator file-descriptor important" style="color:#393A34">2</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain">/dev/null</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">then</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        tmux attach </span><span class="token parameter variable" style="color:#36acaa">-t</span><span class="token plain"> </span><span class="token variable" style="color:#36acaa">$SESSION_NAME</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token builtin class-name">exit</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">fi</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token assign-left variable" style="color:#36acaa">USER_ID</span><span class="token operator" style="color:#393A34">=</span><span class="token variable" style="color:#36acaa">`</span><span class="token variable function" style="color:#d73a49">id</span><span class="token variable" style="color:#36acaa"> </span><span class="token variable parameter variable" style="color:#36acaa">-u</span><span class="token variable" style="color:#36acaa"> </span><span class="token variable environment constant" style="color:#36acaa">$USER</span><span class="token variable" style="color:#36acaa">`</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token assign-left variable" style="color:#36acaa">COLS</span><span class="token operator" style="color:#393A34">=</span><span class="token variable" style="color:#36acaa">`</span><span class="token variable" style="color:#36acaa">tput cols</span><span class="token variable" style="color:#36acaa">`</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token assign-left variable" style="color:#36acaa">ROWS</span><span class="token operator" style="color:#393A34">=</span><span class="token variable" style="color:#36acaa">`</span><span class="token variable" style="color:#36acaa">tput lines</span><span class="token variable" style="color:#36acaa">`</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token assign-left variable" style="color:#36acaa">WEB_LOGIN_CMD</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"cd </span><span class="token string variable" style="color:#36acaa">$DOCKER_DIR</span><span class="token string" style="color:#e3116c">; docker exec --user </span><span class="token string variable" style="color:#36acaa">$USER_ID</span><span class="token string" style="color:#e3116c"> -it -e COLUMNS=</span><span class="token string variable" style="color:#36acaa">$COLS</span><span class="token string" style="color:#e3116c"> -e LINES=</span><span class="token string variable" style="color:#36acaa">$ROWS</span><span class="token string" style="color:#e3116c"> wareena_php_1 bash"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token assign-left variable" style="color:#36acaa">DB_LOGIN_CMD</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"cd </span><span class="token string variable" style="color:#36acaa">$DOCKER_DIR</span><span class="token string" style="color:#e3116c">; docker exec -it -e COLUMNS=</span><span class="token string variable" style="color:#36acaa">$COLS</span><span class="token string" style="color:#e3116c"> -e LINES=</span><span class="token string variable" style="color:#36acaa">$ROWS</span><span class="token string" style="color:#e3116c"> wareena_db_1 bash"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token assign-left variable" style="color:#36acaa">FIXTURE_DB_LOGIN_CMD</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"cd </span><span class="token string variable" style="color:#36acaa">$DOCKER_DIR</span><span class="token string" style="color:#e3116c">; docker exec -it -e COLUMNS=</span><span class="token string variable" style="color:#36acaa">$COLS</span><span class="token string" style="color:#e3116c"> -e LINES=</span><span class="token string variable" style="color:#36acaa">$ROWS</span><span class="token string" style="color:#e3116c"> wareena_fixture_db_1 bash"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token builtin class-name">cd</span><span class="token plain"> </span><span class="token variable" style="color:#36acaa">$DOCKER_DIR</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token function" style="color:#d73a49">docker-compose</span><span class="token plain"> up </span><span class="token parameter variable" style="color:#36acaa">-d</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token builtin class-name">read</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-p</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Continue with a new tmux session [Y/n]?"</span><span class="token plain"> yn</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">case</span><span class="token plain"> </span><span class="token variable" style="color:#36acaa">$yn</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">in</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">Nn</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain">* </span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token builtin class-name">exit</span><span class="token punctuation" style="color:#393A34">;</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        * </span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token builtin class-name">echo</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"OK"</span><span class="token punctuation" style="color:#393A34">;</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">esac</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    start_session_and_open_windows </span><span class="token variable" style="color:#36acaa">$SESSION_NAME</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"</span><span class="token string variable" style="color:#36acaa">${WINDOW_NAMES</span><span class="token string variable punctuation" style="color:#393A34">[</span><span class="token string variable" style="color:#36acaa">@</span><span class="token string variable punctuation" style="color:#393A34">]</span><span class="token string variable" style="color:#36acaa">}</span><span class="token string" style="color:#e3116c">"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    tmux send-keys </span><span class="token parameter variable" style="color:#36acaa">-t</span><span class="token plain"> </span><span class="token variable" style="color:#36acaa">$SESSION_NAME</span><span class="token plain">:webserver </span><span class="token string" style="color:#e3116c">"</span><span class="token string variable" style="color:#36acaa">$WEB_LOGIN_CMD</span><span class="token string" style="color:#e3116c">"</span><span class="token plain"> Enter</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    tmux send-keys </span><span class="token parameter variable" style="color:#36acaa">-t</span><span class="token plain"> </span><span class="token variable" style="color:#36acaa">$SESSION_NAME</span><span class="token plain">:node </span><span class="token string" style="color:#e3116c">"</span><span class="token string variable" style="color:#36acaa">$WEB_LOGIN_CMD</span><span class="token string" style="color:#e3116c">"</span><span class="token plain"> Enter</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    tmux send-keys </span><span class="token parameter variable" style="color:#36acaa">-t</span><span class="token plain"> </span><span class="token variable" style="color:#36acaa">$SESSION_NAME</span><span class="token plain">:node </span><span class="token string" style="color:#e3116c">"yarn dev"</span><span class="token plain"> Enter</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    tmux send-keys </span><span class="token parameter variable" style="color:#36acaa">-t</span><span class="token plain"> </span><span class="token variable" style="color:#36acaa">$SESSION_NAME</span><span class="token plain">:misc </span><span class="token string" style="color:#e3116c">"cd </span><span class="token string variable" style="color:#36acaa">$TARGET_DIR</span><span class="token string" style="color:#e3116c">"</span><span class="token plain"> Enter</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    tmux send-keys </span><span class="token parameter variable" style="color:#36acaa">-t</span><span class="token plain"> </span><span class="token variable" style="color:#36acaa">$SESSION_NAME</span><span class="token plain">:test </span><span class="token string" style="color:#e3116c">"</span><span class="token string variable" style="color:#36acaa">$WEB_LOGIN_CMD</span><span class="token string" style="color:#e3116c">"</span><span class="token plain"> Enter</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    tmux send-keys </span><span class="token parameter variable" style="color:#36acaa">-t</span><span class="token plain"> </span><span class="token variable" style="color:#36acaa">$SESSION_NAME</span><span class="token plain">:test </span><span class="token string" style="color:#e3116c">"export SYMFONY_DEPRECATIONS_HELPER=disabled=1"</span><span class="token plain"> Enter</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    tmux send-keys </span><span class="token parameter variable" style="color:#36acaa">-t</span><span class="token plain"> </span><span class="token variable" style="color:#36acaa">$SESSION_NAME</span><span class="token plain">:test </span><span class="token string" style="color:#e3116c">"bin/phpunit"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    tmux send-keys </span><span class="token parameter variable" style="color:#36acaa">-t</span><span class="token plain"> </span><span class="token variable" style="color:#36acaa">$SESSION_NAME</span><span class="token plain">:db </span><span class="token string" style="color:#e3116c">"</span><span class="token string variable" style="color:#36acaa">$DB_LOGIN_CMD</span><span class="token string" style="color:#e3116c">"</span><span class="token plain"> Enter</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    tmux send-keys </span><span class="token parameter variable" style="color:#36acaa">-t</span><span class="token plain"> </span><span class="token variable" style="color:#36acaa">$SESSION_NAME</span><span class="token plain">:db </span><span class="token string" style="color:#e3116c">"sleep 5; mysql -u root wareena"</span><span class="token plain"> Enter</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    tmux send-keys </span><span class="token parameter variable" style="color:#36acaa">-t</span><span class="token plain"> </span><span class="token variable" style="color:#36acaa">$SESSION_NAME</span><span class="token plain">:fixture_db </span><span class="token string" style="color:#e3116c">"</span><span class="token string variable" style="color:#36acaa">$FIXTURE_DB_LOGIN_CMD</span><span class="token string" style="color:#e3116c">"</span><span class="token plain"> Enter</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    tmux send-keys </span><span class="token parameter variable" style="color:#36acaa">-t</span><span class="token plain"> </span><span class="token variable" style="color:#36acaa">$SESSION_NAME</span><span class="token plain">:fixture_db </span><span class="token string" style="color:#e3116c">"sleep 5; mysql -u root wareena"</span><span class="token plain"> Enter</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    tmux send-keys </span><span class="token parameter variable" style="color:#36acaa">-t</span><span class="token plain"> </span><span class="token variable" style="color:#36acaa">$SESSION_NAME</span><span class="token plain">:ws </span><span class="token string" style="color:#e3116c">"</span><span class="token string variable" style="color:#36acaa">$WEB_LOGIN_CMD</span><span class="token string" style="color:#e3116c">"</span><span class="token plain"> Enter</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    tmux send-keys </span><span class="token parameter variable" style="color:#36acaa">-t</span><span class="token plain"> </span><span class="token variable" style="color:#36acaa">$SESSION_NAME</span><span class="token plain">:ws </span><span class="token string" style="color:#e3116c">"node bin/ws-server.js"</span><span class="token plain"> Enter</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    tmux send-keys </span><span class="token parameter variable" style="color:#36acaa">-t</span><span class="token plain"> </span><span class="token variable" style="color:#36acaa">$SESSION_NAME</span><span class="token plain">:src </span><span class="token string" style="color:#e3116c">"cd </span><span class="token string variable" style="color:#36acaa">$TARGET_DIR</span><span class="token string" style="color:#e3116c">"</span><span class="token plain"> Enter</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    tmux send-keys </span><span class="token parameter variable" style="color:#36acaa">-t</span><span class="token plain"> </span><span class="token variable" style="color:#36acaa">$SESSION_NAME</span><span class="token plain">:src </span><span class="token string" style="color:#e3116c">"nvim"</span><span class="token plain"> Enter</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    tmux attach </span><span class="token parameter variable" style="color:#36acaa">-t</span><span class="token plain"> </span><span class="token variable" style="color:#36acaa">$SESSION_NAME</span><span class="token plain">:src</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token function-name function" style="color:#d73a49">stop_project</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token builtin class-name">cd</span><span class="token plain"> </span><span class="token variable" style="color:#36acaa">$DOCKER_DIR</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token function" style="color:#d73a49">docker-compose</span><span class="token plain"> down</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    tmux kill-session </span><span class="token parameter variable" style="color:#36acaa">-t</span><span class="token plain"> </span><span class="token variable" style="color:#36acaa">$SESSION_NAME</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token keyword" style="color:#00009f">case</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"</span><span class="token string variable" style="color:#36acaa">$COMMAND</span><span class="token string" style="color:#e3116c">"</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">in</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token string" style="color:#e3116c">"stop"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        stop_project</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">;</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    *</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        start_project</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">;</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token keyword" style="color:#00009f">esac</span></span><br></div></code></pre></div></div>]]></content>
        <category label="tmux" term="tmux"/>
        <category label="Gatsby" term="Gatsby"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Dve medzery na odsadzovanie v JS]]></title>
        <id>https://hrad.perunhq.org/2021/04/23-dve-medzery-v-js/</id>
        <link href="https://hrad.perunhq.org/2021/04/23-dve-medzery-v-js/"/>
        <updated>2021-04-23T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Keď som bol mladý a sprostý, tak som svoj kód odsadzoval o dve medzery a nepoužíval prázdne riadky]]></summary>
        <content type="html"><![CDATA[<p>Keď som bol mladý a sprostý, tak som svoj kód odsadzoval o dve medzery a nepoužíval prázdne riadky
v tele funkcií, lebo sa mi páčilo ako je kód na husto. Mal som pocit, že produkovaním veľkých
stien textu môj kód vyzerá veľmi hackersky. Zdalo sa mi, že to musí robiť dojem, lebo na prvý
pohľad to vyzerá nezrozumiteľne, ale pritom ja(!) sa v tom dokážem vyznať.</p>
<!-- -->
<p>Veľmi skoro som zistil, že v programovaní sa skôr cení prehľadnosť a udržateľnosť kódu. Je veľmi
dôležité správne pomenovanie, jednotná a prehľadná formálna úprava kódu. Všetky tieto veci znižujú
kognitívny load na náš mozog v čase, keď kód potrebujeme čítať.</p>
<p>V odsadzovaní som preto prešiel na používanie štyroch medzier, ktoré sa nakoniec stali v PHP svete
štandardom. Kým sme v PHP viedli sväté vojny za 4 medzery namiesto tabov, tak z môjho pohľadu sa v
JavaScripte viedla tichá vojna dvoch proti štyrom medzerám. A k môjmu prekvapeniu sa zdá, že
vyhrali dve medzery.</p>
<p>Nerozumiem tomu, lebo mne sa zdá, že dve medzery prinášajú neprehľadnosť a veľmi ťažko sa
odhaduje, o koľko úrovní je vlastne riadok odsadený, špeciálne, ak ho porovnávam s nejakým iným.
V JavaScripte sa mi to zdá o to dôležitejšie, lebo je to jazyk, kde sa veľmi používajú callbacky
a kód sa tak celkom rád ťahá doprava.</p>
<p>Akurát, že zástancovia dvoch medzier používajú presne tento argument na obhájenie svojej pozície.
"JavaScriptový kód sa zvykne ťahať doprava, tak potrebujeme dve medzery, aby sme to kompenzovali".
🙃</p>
<p>Ja si naopak myslím, že ak sa mi kód ťahá doprava, tak ho mám asi zle naprogramovaný a
príliš veci vnáram. Zrejme niekde porušujem aj Single Responsibility princíp a mal by som ten kód
upratať.</p>
<p>Dve medzery mi tak maskujú problémy v kóde. Avšak ja nechcem, aby mi vizuálna úprava zakrývala
chyby návrhu. Ja chcem, aby na mňa kód vizuálne kričal: "haló, haló, tu je niečo zle, som veľmi
napravo, treba ma prepísať".</p>
<p>Preto ja ostanem pri používaní štyroch medzier aj v JavaScripte a vo svojich projektoch som si
upravil aj konfiguráciu pre ESlint a Prettier.</p>
<p>Takto som si to zapísal do <code>.prettierrc</code></p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token property" style="color:#36acaa">"tabWidth"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">4</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<p>A takto do <code>.eslintrc.js</code></p>
<div class="language-javascript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-javascript codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">module</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">exports</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic">// ...</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token literal-property property" style="color:#36acaa">rules</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token literal-property property" style="color:#36acaa">indent</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"error"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">4</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>]]></content>
        <category label="Taby alebo medzery" term="Taby alebo medzery"/>
        <category label="Prettier" term="Prettier"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tmux - moja konfigurácia]]></title>
        <id>https://hrad.perunhq.org/2021/04/22-tmux-konfiguracia/</id>
        <link href="https://hrad.perunhq.org/2021/04/22-tmux-konfiguracia/"/>
        <updated>2021-04-22T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Keď som pred dvoma týždňami točil video, kde som predstavoval tmux, tak som sľuboval, že urobím]]></summary>
        <content type="html"><![CDATA[<p>Keď som pred dvoma týždňami točil video, kde som predstavoval tmux, tak som sľuboval, že urobím
aj ďalšie video o jeho základnej konfigurácii. Vtedy som plánoval ukázať iba pár možností
a nakoniec celý dizajn prenechať na Powerline. Medzičasom mi však Powerline začal prekážať,
takže som si dizajn nakonfiguroval sám. V tomto článku vidíte výsledok.</p>
<!-- -->
<p>Môj hlavný problém s powerline dizajnom v tmux-e je jeho rozvláčnosť. Ak mám otvorených 8 a viac
tabov (ehm... okien), tak ich častokrát nevidím na stavovom riadku všetky.</p>
<!-- -->
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>K článku si viete pozrieť aj:</div><div class="admonitionContent_BuS1"><ul><li><svg data-prefix="fab" data-icon="youtube" class="svg-inline--fa fa-youtube" role="img" viewBox="0 0 576 512" aria-hidden="true" color="red"><path fill="currentColor" d="M549.7 124.1C543.5 100.4 524.9 81.8 501.4 75.5 458.9 64 288.1 64 288.1 64S117.3 64 74.7 75.5C51.2 81.8 32.7 100.4 26.4 124.1 15 167 15 256.4 15 256.4s0 89.4 11.4 132.3c6.3 23.6 24.8 41.5 48.3 47.8 42.6 11.5 213.4 11.5 213.4 11.5s170.8 0 213.4-11.5c23.5-6.3 42-24.2 48.3-47.8 11.4-42.9 11.4-132.3 11.4-132.3s0-89.4-11.4-132.3zM232.2 337.6l0-162.4 142.7 81.2-142.7 81.2z"></path></svg> <span>Video<!-- -->:<!-- --> <a href="https://www.youtube.com/watch?v=fYt3iigzfeA" target="_blank" rel="noreferrer">https://www.youtube.com/watch?v=fYt3iigzfeA</a></span></li><li><svg data-prefix="fas" data-icon="code-branch" class="svg-inline--fa fa-code-branch" role="img" viewBox="0 0 448 512" aria-hidden="true" color="grey"><path fill="currentColor" d="M80 104a24 24 0 1 0 0-48 24 24 0 1 0 0 48zm80-24c0 32.8-19.7 61-48 73.3l0 70.7 176 0c26.5 0 48-21.5 48-48l0-22.7c-28.3-12.3-48-40.5-48-73.3 0-44.2 35.8-80 80-80s80 35.8 80 80c0 32.8-19.7 61-48 73.3l0 22.7c0 61.9-50.1 112-112 112l-176 0 0 70.7c28.3 12.3 48 40.5 48 73.3 0 44.2-35.8 80-80 80S0 476.2 0 432c0-32.8 19.7-61 48-73.3l0-205.3C19.7 141 0 112.8 0 80 0 35.8 35.8 0 80 0s80 35.8 80 80zm232 0a24 24 0 1 0 -48 0 24 24 0 1 0 48 0zM80 456a24 24 0 1 0 0-48 24 24 0 1 0 0 48z"></path></svg> <span>Git repozitár<!-- -->:<!-- --> <a href="https://bitbucket.org/perungrad/dotfiles-tmux/" target="_blank" rel="noreferrer">https://bitbucket.org/perungrad/dotfiles-tmux/</a></span></li></ul></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="tmux-kde-sa-o-dizajn-stará-powerline">Tmux, kde sa o dizajn stará Powerline<a href="https://hrad.perunhq.org/2021/04/22-tmux-konfiguracia/#tmux-kde-sa-o-dizajn-star%C3%A1-powerline" class="hash-link" aria-label="Priama linka na Tmux, kde sa o dizajn stará Powerline" title="Priama linka na Tmux, kde sa o dizajn stará Powerline" translate="no">​</a></h2>
<p>Ako vidieť z obrázku, ľavá časť stavového riadku sa celkom naťahuje a je tam veľa prázdneho miesta.</p>
<p><img decoding="async" loading="lazy" alt="Tmux + Powerline" src="https://hrad.perunhq.org/assets/images/2021-04-22-tmux-wareena-powerline-afea165cf2cd0a187f05084c625e10d1.png" width="1919" height="254" class="img_ev3q"></p>
<p>Toto je moja pôvodná konfigurácia, súbor <code>~/.tmux.conf</code>:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">~/.tmux.conf</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token builtin class-name">set</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-g</span><span class="token plain"> prefix C-a</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token builtin class-name">set</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-g</span><span class="token plain"> escape-time </span><span class="token number" style="color:#36acaa">10</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token builtin class-name">set</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-g</span><span class="token plain"> default-terminal </span><span class="token string" style="color:#e3116c">"tmux-256color"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token builtin class-name">set</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-ga</span><span class="token plain"> terminal-overrides </span><span class="token string" style="color:#e3116c">",*256col*:Tc"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">run-shell </span><span class="token string" style="color:#e3116c">"powerline-daemon -q"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token builtin class-name">source</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"/usr/share/powerline/bindings/tmux/powerline.conf"</span></span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="môj-vlastný-dizajn-pre-tmux">Môj vlastný dizajn pre tmux<a href="https://hrad.perunhq.org/2021/04/22-tmux-konfiguracia/#m%C3%B4j-vlastn%C3%BD-dizajn-pre-tmux" class="hash-link" aria-label="Priama linka na Môj vlastný dizajn pre tmux" title="Priama linka na Môj vlastný dizajn pre tmux" translate="no">​</a></h2>
<p>V novej konfigurácii som vyhodil Powerline a nakonfiguroval som si dizajn, ktorý nezaberá toľko
miesta. Výsledok je vidieť na obrázku.</p>
<p><img decoding="async" loading="lazy" alt="Tmux v custom dizajne" src="https://hrad.perunhq.org/assets/images/2021-04-22-tmux-wareena-custom-95c2bc1a5dd1f35dd0e76640f18448dc.png" width="1874" height="344" class="img_ev3q"></p>
<p>Keď som už bol pri tom, tak som k svojej konfigurácii rovno vytvoril aj git repozitár a tak si
môžete výsledný kód rovno stiahnuť. Repozitár je tu: <a href="https://bitbucket.org/perungrad/dotfiles-tmux/" target="_blank" rel="noopener noreferrer" class="">https://bitbucket.org/perungrad/dotfiles-tmux/</a></p>
<p>Tu je teda moja nová konfigurácia:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">~/.tmux.conf</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token builtin class-name">set</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-g</span><span class="token plain"> prefix C-a</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token builtin class-name">set</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-g</span><span class="token plain"> escape-time </span><span class="token number" style="color:#36acaa">10</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># pekné farby pre vim a pod.</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token builtin class-name">set</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-g</span><span class="token plain"> default-terminal </span><span class="token string" style="color:#e3116c">"tmux-256color"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token builtin class-name">set</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-ga</span><span class="token plain"> terminal-overrides </span><span class="token string" style="color:#e3116c">",*256*:Tc"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># stavový riadok chcem dole</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token builtin class-name">set</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-g</span><span class="token plain"> status-position bottom</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># C-a C-r reloadne konfiguráciu a aplikuje zmeny pre bežiacu session</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token builtin class-name">bind</span><span class="token plain"> C-r source-file ~/.tmux.conf</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># definície farieb</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token assign-left variable" style="color:#36acaa">color_dark</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"colour232"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token assign-left variable" style="color:#36acaa">color_light</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"white"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token assign-left variable" style="color:#36acaa">color_status_text</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"colour245"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token assign-left variable" style="color:#36acaa">color_main</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"colour10"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token assign-left variable" style="color:#36acaa">color_session_bg</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"colour229"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token assign-left variable" style="color:#36acaa">color_session_fg</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"colour16"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token assign-left variable" style="color:#36acaa">color_icon_load</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"colour190"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># farbičky pre zobrazenie okna, správ a základný štýl pre stavový riadok</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token builtin class-name">set</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-g</span><span class="token plain"> mode-style </span><span class="token string" style="color:#e3116c">"fg=default,bg=</span><span class="token string variable" style="color:#36acaa">$color_main</span><span class="token string" style="color:#e3116c">"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token builtin class-name">set</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-g</span><span class="token plain"> message-style </span><span class="token string" style="color:#e3116c">"fg=</span><span class="token string variable" style="color:#36acaa">$color_main</span><span class="token string" style="color:#e3116c">,bg=</span><span class="token string variable" style="color:#36acaa">$color_dark</span><span class="token string" style="color:#e3116c">"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token builtin class-name">set</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-g</span><span class="token plain"> status-style </span><span class="token string" style="color:#e3116c">"fg=</span><span class="token string variable" style="color:#36acaa">$color_status_text</span><span class="token string" style="color:#e3116c">,bg=</span><span class="token string variable" style="color:#36acaa">$color_dark</span><span class="token string" style="color:#e3116c">"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># max. dĺžka pre pravú časť</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token builtin class-name">set</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-g</span><span class="token plain"> status-right-length </span><span class="token number" style="color:#36acaa">100</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># ako často obnovovať statový riadok (v sekundách)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token builtin class-name">set</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-g</span><span class="token plain"> status-interval </span><span class="token number" style="color:#36acaa">5</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># oddeľovač okien</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token builtin class-name">set</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-g</span><span class="token plain"> window-status-separator </span><span class="token string" style="color:#e3116c">""</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># pomocné premenné</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token assign-left variable" style="color:#36acaa">separator_left</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"]"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token assign-left variable" style="color:#36acaa">separator_right</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"["</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># vlastné príkazy, ktoré sa použijú ako "widgety" v pravej časti</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token assign-left variable" style="color:#36acaa">widget_date</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"#(date +'%d.%m.%Y')"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token assign-left variable" style="color:#36acaa">widget_time</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"#(date +'%H:%M')"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token assign-left variable" style="color:#36acaa">widget_load</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"#(node ~/.config/tmux/widget-load.js)"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># ikonky, potrebuješ Nerd Fonty: https://www.nerdfonts.com/</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token assign-left variable" style="color:#36acaa">icon_flame</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"</span><span class="token string entity" style="color:#36acaa">\uf490</span><span class="token string" style="color:#e3116c">"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token assign-left variable" style="color:#36acaa">icon_clock</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"</span><span class="token string entity" style="color:#36acaa">\uf43a</span><span class="token string" style="color:#e3116c">"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># na tabe pre okno je číslo a názov</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">setw </span><span class="token parameter variable" style="color:#36acaa">-g</span><span class="token plain"> window-status-format </span><span class="token string" style="color:#e3116c">" #I:#W "</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># farby pre tab aktuálneho okna</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">setw </span><span class="token parameter variable" style="color:#36acaa">-g</span><span class="token plain"> window-status-current-style </span><span class="token string" style="color:#e3116c">"fg=</span><span class="token string variable" style="color:#36acaa">$color_light</span><span class="token string" style="color:#e3116c">,bold,bg=</span><span class="token string variable" style="color:#36acaa">$color_main</span><span class="token string" style="color:#e3116c">"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># formát aktuálneho okna</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">setw </span><span class="token parameter variable" style="color:#36acaa">-g</span><span class="token plain"> window-status-current-format </span><span class="token string" style="color:#e3116c">"#[fg=</span><span class="token string variable" style="color:#36acaa">$color_dark</span><span class="token string" style="color:#e3116c">,bg=</span><span class="token string variable" style="color:#36acaa">$color_main</span><span class="token string" style="color:#e3116c">]</span><span class="token string variable" style="color:#36acaa">$separator_right</span><span class="token string" style="color:#e3116c">#[fg=</span><span class="token string variable" style="color:#36acaa">$color_dark</span><span class="token string" style="color:#e3116c">,bg=</span><span class="token string variable" style="color:#36acaa">$color_main</span><span class="token string" style="color:#e3116c">] #I:#W #[fg=</span><span class="token string variable" style="color:#36acaa">$color_dark</span><span class="token string" style="color:#e3116c">,bg=</span><span class="token string variable" style="color:#36acaa">$color_main</span><span class="token string" style="color:#e3116c">]</span><span class="token string variable" style="color:#36acaa">$separator_left</span><span class="token string" style="color:#e3116c">#[default]"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># štýl pre okna, kde je upozornenie na aktivitu</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">setw </span><span class="token parameter variable" style="color:#36acaa">-g</span><span class="token plain"> window-status-activity-style </span><span class="token string" style="color:#e3116c">"fg=</span><span class="token string variable" style="color:#36acaa">$color_main</span><span class="token string" style="color:#e3116c">"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># ako vyzerá blok s názvom session</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token builtin class-name">set</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-g</span><span class="token plain"> status-left </span><span class="token string" style="color:#e3116c">"#[bg=</span><span class="token string variable" style="color:#36acaa">$color_session_bg</span><span class="token string" style="color:#e3116c">,fg=</span><span class="token string variable" style="color:#36acaa">$color_session_fg</span><span class="token string" style="color:#e3116c">,bold] #{session_name} #[default]"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># ako vyzerá pravá časť</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token builtin class-name">set</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-g</span><span class="token plain"> status-right </span><span class="token string" style="color:#e3116c">" #[fg=</span><span class="token string variable" style="color:#36acaa">$color_icon_load</span><span class="token string" style="color:#e3116c">]</span><span class="token string variable" style="color:#36acaa">$icon_flame</span><span class="token string" style="color:#e3116c">#[default] </span><span class="token string variable" style="color:#36acaa">$widget_load</span><span class="token string" style="color:#e3116c"> | </span><span class="token string variable" style="color:#36acaa">$widget_date</span><span class="token string" style="color:#e3116c"> </span><span class="token string variable" style="color:#36acaa">$icon_clock</span><span class="token string" style="color:#e3116c"> </span><span class="token string variable" style="color:#36acaa">$widget_time</span><span class="token string" style="color:#e3116c"> "</span></span><br></div></code></pre></div></div>
<p>Na zobrazovanie aktuálneho vyťaženia systému (aka load) som si napísal vlastný kód v JavaScripte,
na ktorý sa odkazuje príkaz pre <code>widget_load</code>.</p>
<div class="language-javascript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">~/.config/tmux/widget-load.js</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-javascript codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> exec </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">require</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"child_process"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> process </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">require</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"process"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> colors </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token string" style="color:#e3116c">"colour10"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token string" style="color:#e3116c">"colour11"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token string" style="color:#e3116c">"colour166"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token string" style="color:#e3116c">"colour168"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token string" style="color:#e3116c">"colour9"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token string" style="color:#e3116c">"colour196"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> </span><span class="token function-variable function" style="color:#d73a49">getColor</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">load</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> n </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token known-class-name class-name">Math</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">min</span><span class="token punctuation" style="color:#393A34">(</span><span class="token known-class-name class-name">Math</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">floor</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">load </span><span class="token operator" style="color:#393A34">/</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> colors</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">length</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword control-flow" style="color:#00009f">return</span><span class="token plain"> colors</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">n</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">exec</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"cat /proc/loadavg"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token parameter">error</span><span class="token parameter punctuation" style="color:#393A34">,</span><span class="token parameter"> stdout</span><span class="token parameter punctuation" style="color:#393A34">,</span><span class="token parameter"> stderr</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:#393A34">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> result </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> stdout</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">match</span><span class="token punctuation" style="color:#393A34">(</span><span class="token regex regex-delimiter" style="color:#36acaa">/</span><span class="token regex regex-source language-regex anchor function" style="color:#d73a49">^</span><span class="token regex regex-source language-regex group punctuation" style="color:#393A34">(</span><span class="token regex regex-source language-regex char-class char-class-punctuation punctuation" style="color:#393A34">[</span><span class="token regex regex-source language-regex char-class char-class-negation operator" style="color:#393A34">^</span><span class="token regex regex-source language-regex char-class char-set class-name" style="color:#36acaa">\s</span><span class="token regex regex-source language-regex char-class char-class-punctuation punctuation" style="color:#393A34">]</span><span class="token regex regex-source language-regex quantifier number" style="color:#36acaa">+</span><span class="token regex regex-source language-regex group punctuation" style="color:#393A34">)</span><span class="token regex regex-source language-regex escape" style="color:#36acaa">\ </span><span class="token regex regex-source language-regex group punctuation" style="color:#393A34">(</span><span class="token regex regex-source language-regex char-class char-class-punctuation punctuation" style="color:#393A34">[</span><span class="token regex regex-source language-regex char-class char-class-negation operator" style="color:#393A34">^</span><span class="token regex regex-source language-regex char-class char-set class-name" style="color:#36acaa">\s</span><span class="token regex regex-source language-regex char-class char-class-punctuation punctuation" style="color:#393A34">]</span><span class="token regex regex-source language-regex quantifier number" style="color:#36acaa">+</span><span class="token regex regex-source language-regex group punctuation" style="color:#393A34">)</span><span class="token regex regex-source language-regex escape" style="color:#36acaa">\ </span><span class="token regex regex-source language-regex group punctuation" style="color:#393A34">(</span><span class="token regex regex-source language-regex char-class char-class-punctuation punctuation" style="color:#393A34">[</span><span class="token regex regex-source language-regex char-class char-class-negation operator" style="color:#393A34">^</span><span class="token regex regex-source language-regex char-class char-set class-name" style="color:#36acaa">\s</span><span class="token regex regex-source language-regex char-class char-class-punctuation punctuation" style="color:#393A34">]</span><span class="token regex regex-source language-regex quantifier number" style="color:#36acaa">+</span><span class="token regex regex-source language-regex group punctuation" style="color:#393A34">)</span><span class="token regex regex-delimiter" style="color:#36acaa">/</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword control-flow" style="color:#00009f">if</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">!</span><span class="token plain">result</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword control-flow" style="color:#00009f">return</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> load1 </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">parseFloat</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">result</span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> load5 </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">parseFloat</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">result</span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">2</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> load15 </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">parseFloat</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">result</span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">3</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    process</span><span class="token punctuation" style="color:#393A34">.</span><span class="token property-access">stdout</span><span class="token punctuation" style="color:#393A34">.</span><span class="token method function property-access" style="color:#d73a49">write</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token template-string string" style="color:#e3116c">#[fg=</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">${</span><span class="token template-string interpolation function" style="color:#d73a49">getColor</span><span class="token template-string interpolation punctuation" style="color:#393A34">(</span><span class="token template-string interpolation">load1</span><span class="token template-string interpolation punctuation" style="color:#393A34">)</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">}</span><span class="token template-string string" style="color:#e3116c">]</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">${</span><span class="token template-string interpolation">result</span><span class="token template-string interpolation punctuation" style="color:#393A34">[</span><span class="token template-string interpolation number" style="color:#36acaa">1</span><span class="token template-string interpolation punctuation" style="color:#393A34">]</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">}</span><span class="token template-string string" style="color:#e3116c">#[default] </span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">+</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token template-string string" style="color:#e3116c">#[fg=</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">${</span><span class="token template-string interpolation function" style="color:#d73a49">getColor</span><span class="token template-string interpolation punctuation" style="color:#393A34">(</span><span class="token template-string interpolation">load5</span><span class="token template-string interpolation punctuation" style="color:#393A34">)</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">}</span><span class="token template-string string" style="color:#e3116c">]</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">${</span><span class="token template-string interpolation">result</span><span class="token template-string interpolation punctuation" style="color:#393A34">[</span><span class="token template-string interpolation number" style="color:#36acaa">2</span><span class="token template-string interpolation punctuation" style="color:#393A34">]</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">}</span><span class="token template-string string" style="color:#e3116c">#[default] </span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">+</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token template-string string" style="color:#e3116c">#[fg=</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">${</span><span class="token template-string interpolation function" style="color:#d73a49">getColor</span><span class="token template-string interpolation punctuation" style="color:#393A34">(</span><span class="token template-string interpolation">load15</span><span class="token template-string interpolation punctuation" style="color:#393A34">)</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">}</span><span class="token template-string string" style="color:#e3116c">]</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">${</span><span class="token template-string interpolation">result</span><span class="token template-string interpolation punctuation" style="color:#393A34">[</span><span class="token template-string interpolation number" style="color:#36acaa">3</span><span class="token template-string interpolation punctuation" style="color:#393A34">]</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:#393A34">}</span><span class="token template-string string" style="color:#e3116c">#[default]</span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>]]></content>
        <category label="tmux" term="tmux"/>
        <category label="Powerline" term="Powerline"/>
        <category label="dotfiles" term="dotfiles"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Tmux - čo to je a ako ho používam]]></title>
        <id>https://hrad.perunhq.org/2021/03/27-tmux-co-to-je/</id>
        <link href="https://hrad.perunhq.org/2021/03/27-tmux-co-to-je/"/>
        <updated>2021-03-27T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Tmux je skratkou terminal-multiplexer a nikto nevie, čo to znamená. Je to nástroj pre terminál,]]></summary>
        <content type="html"><![CDATA[<p>Tmux je skratkou terminal-multiplexer a nikto nevie, čo to znamená. Je to nástroj pre terminál,
ktorý nám umožňuje v ňom mať "taby" a panely a okrem toho nás zachráni v prípade, keď niečo robíme
na serveri a spadne nám internet. Mne pomáha aj veľmi rýchlo si jedným príkazom spustiť všetko,
čo potrebujem k práci. Tmux sa pre mňa stal úplne základným nástrojom a bol som celkom prekvapený,
keď som zistil, že kolegovia ho nepoznajú.</p>
<!-- -->
<!-- -->
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>K článku si viete pozrieť aj:</div><div class="admonitionContent_BuS1"><ul><li><svg data-prefix="fab" data-icon="youtube" class="svg-inline--fa fa-youtube" role="img" viewBox="0 0 576 512" aria-hidden="true" color="red"><path fill="currentColor" d="M549.7 124.1C543.5 100.4 524.9 81.8 501.4 75.5 458.9 64 288.1 64 288.1 64S117.3 64 74.7 75.5C51.2 81.8 32.7 100.4 26.4 124.1 15 167 15 256.4 15 256.4s0 89.4 11.4 132.3c6.3 23.6 24.8 41.5 48.3 47.8 42.6 11.5 213.4 11.5 213.4 11.5s170.8 0 213.4-11.5c23.5-6.3 42-24.2 48.3-47.8 11.4-42.9 11.4-132.3 11.4-132.3s0-89.4-11.4-132.3zM232.2 337.6l0-162.4 142.7 81.2-142.7 81.2z"></path></svg> <span>Video<!-- -->:<!-- --> <a href="https://www.youtube.com/watch?v=WWwEiLFwpkI" target="_blank" rel="noreferrer">https://www.youtube.com/watch?v=WWwEiLFwpkI</a></span></li><li><svg data-prefix="far" data-icon="chart-bar" class="svg-inline--fa fa-chart-bar" role="img" viewBox="0 0 512 512" aria-hidden="true" color="#4cb3d4"><path fill="currentColor" d="M48 56c0-13.3-10.7-24-24-24S0 42.7 0 56L0 400c0 44.2 35.8 80 80 80l408 0c13.3 0 24-10.7 24-24s-10.7-24-24-24L80 432c-17.7 0-32-14.3-32-32L48 56zm104 72l208 0c13.3 0 24-10.7 24-24s-10.7-24-24-24L152 80c-13.3 0-24 10.7-24 24s10.7 24 24 24zm0 64c-13.3 0-24 10.7-24 24s10.7 24 24 24l144 0c13.3 0 24-10.7 24-24s-10.7-24-24-24l-144 0zm0 112c-13.3 0-24 10.7-24 24s10.7 24 24 24l272 0c13.3 0 24-10.7 24-24s-10.7-24-24-24l-272 0z"></path></svg> <span>Slajdy<!-- -->:<!-- --> <a href="https://slides.com/milanherda/tmux" target="_blank" rel="noreferrer">https://slides.com/milanherda/tmux</a></span></li></ul></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="nudné-predstavenie">Nudné predstavenie<a href="https://hrad.perunhq.org/2021/03/27-tmux-co-to-je/#nudn%C3%A9-predstavenie" class="hash-link" aria-label="Priama linka na Nudné predstavenie" title="Priama linka na Nudné predstavenie" translate="no">​</a></h2>
<p>Tmux je modernejším a myšlienkovým nástupcom programu, ktorý sa volá <em>screen</em>. Oboje sú aplikácie,
ktoré umožňujú mať taby (v ich terminológii sú to "okná") v termináloch a okrem toho je možné sa
od nich odpojiť, pričom oni a programy v nich spustené bežia ďalej. Keď sa dokážete odpojiť, tak
sa viete aj naspäť pripojiť.</p>
<p>Toto je užitočné napríklad aj pre administráciu serveru. Pripojím sa na server, spustím tmux
(alebo screen), v ňom naštartujem nejaký dlhotrvajúci skript. Odpojím sa z tmux-u, odpojím sa zo
serveru a idem domov. Doma sa opäť pripojím a pozriem, ako môj dlhotrvajúci skript napreduje.</p>
<p>Tmux má oproti screen-u aj panely, čo vlastne znamená, že viete okno rozdeliť na viacero častí
a v každej mať samostatný shell.</p>
<p><strong><em>Killer feature tmux-u je však podľa mňa to, že umožňuje programovo zasielať príkazy a simulovať
písanie do hociktorej svojej session a hociktorého okna 🤯.</em></strong></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="k-čomu-je-to-dobré">K čomu je to dobré?<a href="https://hrad.perunhq.org/2021/03/27-tmux-co-to-je/#k-%C4%8Domu-je-to-dobr%C3%A9" class="hash-link" aria-label="Priama linka na K čomu je to dobré?" title="Priama linka na K čomu je to dobré?" translate="no">​</a></h2>
<p>Ja mám tmux rád, pretože jeho taby sú nezávislé na termináli a zaberajú menej miesta na výšku. Ale
najmä tmux používam na rýchle naštartovanie projektov a setup pracovných nástrojov.</p>
<p>Keď chcem ísť programovať Wareenu, čo je jeden z mojich projektov s PHP backendom a React-om na
frontende, tak potrebujem urobiť kopec vecí na to, aby som mohol pohodlne vyvíjať a všetko mal
na dosah ruky. Konkrétne:</p>
<ul>
<li class="">spustiť docker kontajnery</li>
<li class="">prihlásiť sa do kontajneru s PHP, aby som mohol spúšťať napr. <em>composer</em></li>
<li class="">prihlásiť sa do kontajneru s node, aby som tam hneď spustil HMR</li>
<li class="">prihlásiť sa do kontajneru s PHP a pripraviť si tam príkaz na spustenie PHPUnit-u</li>
<li class="">prihlásiť sa do kontajneru s databázou a otvoriť pripojenie</li>
<li class="">prihlásiť sa do kontajneru s fixtúrovou databázou a otvoriť pripojenie</li>
<li class="">prihlásiť sa do kontajneru s node a spustiť websocket server</li>
<li class="">nastaviť sa do adresáru s projektom, aby som odtiaľ ľahko spúšťal príkazy (napr. git)</li>
<li class="">nastaviť sa do adresáru s projektom, aby som odtiaľ spustil editor</li>
</ul>
<p>Keby som nemal tmux, tak by som pri týchto požiadavkách skončil s tým, že sa mi otvorí 8
samostatných terminálových okien. Trochu lepšia situácia by bola v prípade, keby som používal
terminál umožňujúci programovo otvárať nové taby a spustiť v nich príkaz, ale taký nepoznám.</p>
<p>S pomocou tmux-u si však viem k tomuto napísať skript a potom to <strong>spúšťať jediným príkazom</strong> (alebo
aj klávesovou skratkou).</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="základy-práce-v-tmux-e">Základy práce v tmux-e<a href="https://hrad.perunhq.org/2021/03/27-tmux-co-to-je/#z%C3%A1klady-pr%C3%A1ce-v-tmux-e" class="hash-link" aria-label="Priama linka na Základy práce v tmux-e" title="Priama linka na Základy práce v tmux-e" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="inštalácia">Inštalácia<a href="https://hrad.perunhq.org/2021/03/27-tmux-co-to-je/#in%C5%A1tal%C3%A1cia" class="hash-link" aria-label="Priama linka na Inštalácia" title="Priama linka na Inštalácia" translate="no">​</a></h3>
<p>Tmux sa na Linuxe inštaluje klasicky cez balíčkovací manažér (napr. <code>apt install tmux</code>), na Mac-u
cez Homebrew (<code>brew install tmux</code>) alebo MacPorts (<code>port install tmux</code>).
Na Windowse ho nepotrebujeme, lebo Windows je predsa pre programátora hernou konzolou a nie
pracovným nástrojom 😃. (Ak ale máte na Windowse WSL, tak inštalujte cez balíčkovací systém
distribúcie.)</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="spustenie-a-okná">Spustenie a okná<a href="https://hrad.perunhq.org/2021/03/27-tmux-co-to-je/#spustenie-a-okn%C3%A1" class="hash-link" aria-label="Priama linka na Spustenie a okná" title="Priama linka na Spustenie a okná" translate="no">​</a></h3>
<p>Tmux spustíme v konzole príkazom <code>tmux</code>. (Kto by to bol povedal.)</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">tmux</span><br></div></code></pre></div></div>
<p>Týmto príkazom sa spustí nová tmux session. Session môžete mať viac a každá je samostatná so
svojimi oknami. Ak však chceme, tak sa vieme z jednej session pozrieť do druhej.</p>
<p>Pre konfigurovanie je dôležité vedieť, že prvá session na pozadí spustí aj tmux server, s ktorým
komunikujú všetky session a ktorý zaniká s poslednou ukončenou. Tento server si drží konfiguráciu.
Ak sa teda budeme hrať s konfiguračným súborom pre tmux, tak zmeny sa nám neprejavia, kým bude
bežať aspoň jedna session. Musíme ich najskôr všetky vypnúť a naštartovať tmux odznova.</p>
<p>V spustenom tmux-e máme rovno otvorené prvé okno (má číslo 0). Ak chceme otvoriť ďalšie, tak sa
to robí klávesovou skratkou <kbd>CTRL+B C</kbd>, čo znamená, že najskôr stlačíme <kbd>CTRL+B</kbd>,
potom uvoľníme oba klávesy a stlačíme <kbd>C</kbd>.</p>
<p>Všetky klávesové skratky v tmux-e začínajú prefixom, ktorý je defaultne nastavený na
<kbd>CTRL+B</kbd>. Je však možné ho zmeniť buď pre aktuálnu session alebo rovno v konfiguračnom
súbore na stálo. Ja osobne som si prefix zmenil na <kbd>CTRL+A</kbd>, pretože tak to bolo
v screen-e a zvykol som si a zároveň mi to je príjemnejšie.</p>
<p>Ďalej budem namiesto <code>CTRL-B</code> alebo <code>CTRL-A</code> uvádzať <code>{prefix}</code> a vy tam budete stláčať to,
čo ste si nakonfigurovali.</p>
<p>Medzi oknami sa prepíname skratkou <kbd>{prefix} číslo-okna</kbd>. Ak je okien viac, ako desať,
tak ich zoznam si zobrazíme skratkou <kbd>{prefix} W</kbd></p>
<p>Zoznam základných skratiek, vyskúšajte si:</p>
<table><thead><tr><th>Skratka</th><th>Čo robí</th></tr></thead><tbody><tr><td><kbd>{prefix} C</kbd></td><td>vytvorenie ďalšieho okna</td></tr><tr><td><kbd>{prefix} číslo</kbd></td><td>prepnutie do okna s danýmn číslom</td></tr><tr><td><kbd>{prefix} W</kbd></td><td>zobrazenie zoznamu okien (pohyb šípkami, potvrdenie <kbd>Enter</kbd>)</td></tr><tr><td><kbd>{prefix} ,</kbd></td><td>premenovanie aktuálneho okna</td></tr><tr><td><kbd>{prefix} "</kbd></td><td>vertikálne rozdelenie aktuálneho panelu na dve časti</td></tr><tr><td><kbd>{prefix} %</kbd></td><td>horizontálne rozdelenie aktuálneho panelu na dve časti</td></tr><tr><td><kbd>{prefix} !</kbd></td><td>vytvorenie nového okna z aktuálneho panelu</td></tr><tr><td><kbd>{prefix} šípka</kbd></td><td>pohyb medzi panelmi</td></tr><tr><td><kbd>{prefix} :</kbd></td><td>zadanie konfiguračného príkazu</td></tr><tr><td><kbd>{prefix} d</kbd></td><td>odpojenie sa od session</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="príkazy">Príkazy<a href="https://hrad.perunhq.org/2021/03/27-tmux-co-to-je/#pr%C3%ADkazy" class="hash-link" aria-label="Priama linka na Príkazy" title="Priama linka na Príkazy" translate="no">​</a></h3>
<p>Tmux má hrozne veľa príkazov. Viete ich zadávať ako parametre príkazu <code>tmux</code> alebo priamo v
bežiacom tmux-e do príkazového riadku zobrazenom po stlačení <kbd>{prefix} :</kbd>. A tie isté
príkazy zapisujete aj do konfiguračného súboru (defaultne <code>~/.tmux.conf</code>).</p>
<p>Ak je možné príkaz jednoznačne identifikovať aj z časti jeho názvu, tak ho nemusíme písat celý. Napríklad nemusíme písať <code>list-sessions</code> a úplne postačí <code>list-s</code>.</p>
<p>Zoznam niektorých užitočných príkazov:</p>
<table><thead><tr><th>Príkaz</th><th>Čo robí</th></tr></thead><tbody><tr><td><code>set {premenná} {hodnota}</code></td><td>nastaví konfiguračnú premennú, napr. <code>set prefix C-a</code> zmení prefix na <kbd>CTRL+A</kbd></td></tr><tr><td><code>set -g {premenná} {hodnota}</code></td><td>nastaví premennú globálne pre session a okná (takto to píšte v konfiguračnom súbore)</td></tr><tr><td><code>new-session</code></td><td>vytvorí novú session</td></tr><tr><td><code>list-sessions</code></td><td>vypíše zoznam všetkých bežiacich session a ich názvov</td></tr><tr><td><code>new-window</code></td><td>vytvorí nové okno</td></tr><tr><td><code>send-keys -t {názov-session}:{názov-okna}</code></td><td>odošle "klávesy" do okna v danej session</td></tr><tr><td><code>attach-session -t {názov-session}</code></td><td>pripojí sa do session s daným názvom</td></tr><tr><td><code>rename-session {názov}</code></td><td>premenuje session</td></tr><tr><td><code>source "cesta"</code></td><td>načíta konfiguráciu z iného súboru</td></tr><tr><td><code>run-shell "príkaz"</code></td><td>spustí konzolový príkaz</td></tr></tbody></table>
<p>Príkazy môžu mať vlastné prepínače (klasicky unixovské písmenkové flagy začínajúce pomlčkou).
Pre detaily je dobré si pozrieť dokumentáciu (príkaz <code>man tmux</code> v konzole).</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="moja-konfigurácia">Moja konfigurácia<a href="https://hrad.perunhq.org/2021/03/27-tmux-co-to-je/#moja-konfigur%C3%A1cia" class="hash-link" aria-label="Priama linka na Moja konfigurácia" title="Priama linka na Moja konfigurácia" translate="no">​</a></h3>
<p>Tmux sa konfiguruje v súbore <code>~/.tmux.conf</code>.</p>
<p>U mňa tmux vyzerá takto:</p>
<p><img decoding="async" loading="lazy" alt="Môj tmux" src="https://hrad.perunhq.org/assets/images/2021-03-26-tmux-57d2517ebf414a8e2ffe511f33ce5179.png" width="1091" height="488" class="img_ev3q"></p>
<p>Spodný riadok je "tabbar". Úplne naľavo je názov session, potom nasleduje zoznam okien, uptime,
systémový load, dátum a čas a názov počítača.</p>
<p>Dosiahol som to touto konfiguráciou:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">~/.tmux.conf</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token comment" style="color:#999988;font-style:italic"># prefix bude CTRL+A</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token builtin class-name">set</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-g</span><span class="token plain"> prefix C-a</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Chvíľku čakáme na escape sekvencie.</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Vysvetlenie viď https://unix.stackexchange.com/questions/608142/whats-the-effect-of-escape-time-in-tmux</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token builtin class-name">set</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-g</span><span class="token plain"> escape-time </span><span class="token number" style="color:#36acaa">10</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Chceme pekné farby</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token builtin class-name">set</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-g</span><span class="token plain"> default-terminal </span><span class="token string" style="color:#e3116c">"tmux-256color"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token builtin class-name">set</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-ga</span><span class="token plain"> terminal-overrides </span><span class="token string" style="color:#e3116c">",*256col*:Tc"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># O vizuál tmux-u sa mi stará powerline</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">run-shell </span><span class="token string" style="color:#e3116c">"powerline-daemon -q"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token builtin class-name">source</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"/usr/share/powerline/bindings/tmux/powerline.conf"</span></span><br></div></code></pre></div></div>
<p>Ak sa vám nepáči defaultný vzhľad tmux-u, tak existuje veľa možností na to, aby ste si to nastavili
podľa svojho gusta (pozrite <code>man tmux</code>). Ak to chcete mať rovnaké ako ja, tak si potrebujete
nainštalovať <em>powerline</em> a k tomu ešte fonty (na Ubuntu <code>apt install powerline fonts-powerline</code>).</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="zázračný-skript-pre-spustenie-projektu">Zázračný skript pre spustenie projektu<a href="https://hrad.perunhq.org/2021/03/27-tmux-co-to-je/#z%C3%A1zra%C4%8Dn%C3%BD-skript-pre-spustenie-projektu" class="hash-link" aria-label="Priama linka na Zázračný skript pre spustenie projektu" title="Priama linka na Zázračný skript pre spustenie projektu" translate="no">​</a></h3>
<p>Spomínal som, že mám vytvorené skripty pre jednoduché spúšťanie projektov. Jeden taký mám pre
projekt Wareenu a po spustení skriptu sa mi naštartujú docker kontajnery, rovno ma do niektorých
prihlási a všetko je pripravené tak, aby som len otvoril neovim a mohol programovať.</p>
<p>Takto to vyzerá po spustení skriptu:</p>
<p><img decoding="async" loading="lazy" alt="Takto to vyzerá po spustení skriptu" src="https://hrad.perunhq.org/assets/images/2021-03-27-tmux-wareena-afea165cf2cd0a187f05084c625e10d1.png" width="1919" height="254" class="img_ev3q"></p>
<p>Do konzoly iba napíšem <code>start-wareena.sh</code>, pár sekúnd počkám (lebo docker kontajnery chvíľku
štartujú) a môžem pracovať.</p>
<p>Skript samotný vyzerá takto, kľudne sa inšpirujte a upravte pre svoje potreby. Nezabudnite mu dať
práva na spúšťanie.</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockTitle_OeMC">~/bin/start-wareena.sh</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token shebang important">#!/bin/bash</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># názov tmux-ovej session</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token assign-left variable" style="color:#36acaa">SESSION_NAME</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">wareena</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># ak už session s týmto názvom existuje, tak sa do nej len pripojíme</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> tmux has-session </span><span class="token parameter variable" style="color:#36acaa">-t</span><span class="token operator" style="color:#393A34">=</span><span class="token variable" style="color:#36acaa">$SESSION_NAME</span><span class="token plain"> </span><span class="token operator file-descriptor important" style="color:#393A34">2</span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain">/dev/null</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">then</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    tmux attach </span><span class="token parameter variable" style="color:#36acaa">-t</span><span class="token plain"> </span><span class="token variable" style="color:#36acaa">$SESSION_NAME</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token builtin class-name">exit</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token keyword" style="color:#00009f">fi</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># adresár, kde sú zdrojáky projektu</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token assign-left variable" style="color:#36acaa">TARGET_DIR</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"/home/perun/projects/wareena/src/web"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># adresár, kde je umiestnený docker-compose.yml k projektu</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token assign-left variable" style="color:#36acaa">DOCKER_DIR</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"/home/perun/projects/wareena"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># id aktuálneho používateľa (aby som sa do docker neprihlásil ako root)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token assign-left variable" style="color:#36acaa">USER_ID</span><span class="token operator" style="color:#393A34">=</span><span class="token variable" style="color:#36acaa">`</span><span class="token variable function" style="color:#d73a49">id</span><span class="token variable" style="color:#36acaa"> </span><span class="token variable parameter variable" style="color:#36acaa">-u</span><span class="token variable" style="color:#36acaa"> </span><span class="token variable environment constant" style="color:#36acaa">$USER</span><span class="token variable" style="color:#36acaa">`</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># aktuálny počet riadkov a stĺpcov v termináli (docker občas hnevá a nevie to správne detekovať)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token assign-left variable environment constant" style="color:#36acaa">LINES</span><span class="token operator" style="color:#393A34">=</span><span class="token variable" style="color:#36acaa">`</span><span class="token variable" style="color:#36acaa">tput lines</span><span class="token variable" style="color:#36acaa">`</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token assign-left variable environment constant" style="color:#36acaa">COLUMNS</span><span class="token operator" style="color:#393A34">=</span><span class="token variable" style="color:#36acaa">`</span><span class="token variable" style="color:#36acaa">tput cols</span><span class="token variable" style="color:#36acaa">`</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Príkaz na prihlásenie sa do web kontajneru.</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># V tomto projekte mám ten istý kontajner pre PHP&nbsp;aj pre node</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token assign-left variable" style="color:#36acaa">WEB_LOGIN_CMD</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"cd </span><span class="token string variable" style="color:#36acaa">$DOCKER_DIR</span><span class="token string" style="color:#e3116c">; docker exec --user </span><span class="token string variable" style="color:#36acaa">$USER_ID</span><span class="token string" style="color:#e3116c"> -it -e COLUMNS=</span><span class="token string environment constant" style="color:#36acaa">$COLUMNS</span><span class="token string" style="color:#e3116c"> -e LINES=</span><span class="token string environment constant" style="color:#36acaa">$LINES</span><span class="token string" style="color:#e3116c"> wareena_php_1 bash"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Príkaz pre prihlásenie do databázového kontajneru</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token assign-left variable" style="color:#36acaa">DB_LOGIN_CMD</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"cd </span><span class="token string variable" style="color:#36acaa">$DOCKER_DIR</span><span class="token string" style="color:#e3116c">; docker exec -it -e COLUMNS=</span><span class="token string environment constant" style="color:#36acaa">$COLUMNS</span><span class="token string" style="color:#e3116c"> -e LINES=</span><span class="token string environment constant" style="color:#36acaa">$LINES</span><span class="token string" style="color:#e3116c"> wareena_db_1 bash"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Príkaz pre prihlásenie do kontajneru s fixtúrovou databázou</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token assign-left variable" style="color:#36acaa">FIXTURE_DB_LOGIN_CMD</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">"cd </span><span class="token string variable" style="color:#36acaa">$DOCKER_DIR</span><span class="token string" style="color:#e3116c">; docker exec -it -e COLUMNS=</span><span class="token string environment constant" style="color:#36acaa">$COLUMNS</span><span class="token string" style="color:#e3116c"> -e LINES=</span><span class="token string environment constant" style="color:#36acaa">$LINES</span><span class="token string" style="color:#e3116c"> wareena_fixture_db_1 bash"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Naštartovanie kontajnerov</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token builtin class-name">cd</span><span class="token plain"> </span><span class="token variable" style="color:#36acaa">$DOCKER_DIR</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token function" style="color:#d73a49">docker-compose</span><span class="token plain"> up </span><span class="token parameter variable" style="color:#36acaa">-d</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Občas nejaký kontajner nenaštartuje, vtedy nechcem pokračovať</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token builtin class-name">read</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-p</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Continue with a new tmux session [Y/n]?"</span><span class="token plain"> yn</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token keyword" style="color:#00009f">case</span><span class="token plain"> </span><span class="token variable" style="color:#36acaa">$yn</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">in</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">Nn</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain">* </span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token builtin class-name">exit</span><span class="token punctuation" style="color:#393A34">;</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    * </span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token builtin class-name">echo</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"OK"</span><span class="token punctuation" style="color:#393A34">;</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token keyword" style="color:#00009f">esac</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Vytvorím novú tmux session:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># - nechcem sa do nej hneď pripnúť (-d parameter), inak by sa zvyšné príkazy spustili az po jej ukončení :)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># - so zvoleným názov (-s parameter)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># - vytvorím aj nový tab/okno a rovno ho pomenujem (-n parameter)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">tmux new-session </span><span class="token parameter variable" style="color:#36acaa">-d</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-s</span><span class="token plain"> </span><span class="token variable" style="color:#36acaa">$SESSION_NAME</span><span class="token plain"> </span><span class="token parameter variable" style="color:#36acaa">-n</span><span class="token plain"> webserver</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Povytváram zvyšné taby</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">tmux new-window </span><span class="token parameter variable" style="color:#36acaa">-n</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">node</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">tmux new-window </span><span class="token parameter variable" style="color:#36acaa">-n</span><span class="token plain"> src</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">tmux new-window </span><span class="token parameter variable" style="color:#36acaa">-n</span><span class="token plain"> misc</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">tmux new-window </span><span class="token parameter variable" style="color:#36acaa">-n</span><span class="token plain"> </span><span class="token builtin class-name">test</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">tmux new-window </span><span class="token parameter variable" style="color:#36acaa">-n</span><span class="token plain"> db</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">tmux new-window </span><span class="token parameter variable" style="color:#36acaa">-n</span><span class="token plain"> fixture_db</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">tmux new-window </span><span class="token parameter variable" style="color:#36acaa">-n</span><span class="token plain"> ws</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># V tabe webserver sa prihlásim do web kontajneru.</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Parameter -t určuje cieľovú session a okno</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">tmux send-keys </span><span class="token parameter variable" style="color:#36acaa">-t</span><span class="token plain"> </span><span class="token variable" style="color:#36acaa">$SESSION_NAME</span><span class="token plain">:webserver </span><span class="token string" style="color:#e3116c">"</span><span class="token string variable" style="color:#36acaa">$WEB_LOGIN_CMD</span><span class="token string" style="color:#e3116c">"</span><span class="token plain"> Enter</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># V tabe pre node sa prihlásim do kontajneru a spustím HMR</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">tmux send-keys </span><span class="token parameter variable" style="color:#36acaa">-t</span><span class="token plain"> </span><span class="token variable" style="color:#36acaa">$SESSION_NAME</span><span class="token plain">:node </span><span class="token string" style="color:#e3116c">"</span><span class="token string variable" style="color:#36acaa">$WEB_LOGIN_CMD</span><span class="token string" style="color:#e3116c">"</span><span class="token plain"> Enter</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">tmux send-keys </span><span class="token parameter variable" style="color:#36acaa">-t</span><span class="token plain"> </span><span class="token variable" style="color:#36acaa">$SESSION_NAME</span><span class="token plain">:node </span><span class="token string" style="color:#e3116c">"yarn dev"</span><span class="token plain"> Enter</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># V tomto tabe spúšťam neovim, len sa prepnem do adresáru so zdrojákmi</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">tmux send-keys </span><span class="token parameter variable" style="color:#36acaa">-t</span><span class="token plain"> </span><span class="token variable" style="color:#36acaa">$SESSION_NAME</span><span class="token plain">:src </span><span class="token string" style="color:#e3116c">"cd </span><span class="token string variable" style="color:#36acaa">$TARGET_DIR</span><span class="token string" style="color:#e3116c">"</span><span class="token plain"> Enter</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Tu spúšťam kadejaké príkazy (napr. git), len sa prepnem do adresáru so zdrojákmi</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">tmux send-keys </span><span class="token parameter variable" style="color:#36acaa">-t</span><span class="token plain"> </span><span class="token variable" style="color:#36acaa">$SESSION_NAME</span><span class="token plain">:misc </span><span class="token string" style="color:#e3116c">"cd </span><span class="token string variable" style="color:#36acaa">$TARGET_DIR</span><span class="token string" style="color:#e3116c">"</span><span class="token plain"> Enter</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Pripravím si tab pre spúšťanie testov pre PHPUnit</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">tmux send-keys </span><span class="token parameter variable" style="color:#36acaa">-t</span><span class="token plain"> </span><span class="token variable" style="color:#36acaa">$SESSION_NAME</span><span class="token plain">:test </span><span class="token string" style="color:#e3116c">"</span><span class="token string variable" style="color:#36acaa">$WEB_LOGIN_CMD</span><span class="token string" style="color:#e3116c">"</span><span class="token plain"> Enter</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">tmux send-keys </span><span class="token parameter variable" style="color:#36acaa">-t</span><span class="token plain"> </span><span class="token variable" style="color:#36acaa">$SESSION_NAME</span><span class="token plain">:test </span><span class="token string" style="color:#e3116c">"export SYMFONY_DEPRECATIONS_HELPER=disabled=1"</span><span class="token plain"> Enter</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">tmux send-keys </span><span class="token parameter variable" style="color:#36acaa">-t</span><span class="token plain"> </span><span class="token variable" style="color:#36acaa">$SESSION_NAME</span><span class="token plain">:test </span><span class="token string" style="color:#e3116c">"bin/phpunit"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Prihlásim sa do databázy</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">tmux send-keys </span><span class="token parameter variable" style="color:#36acaa">-t</span><span class="token plain"> </span><span class="token variable" style="color:#36acaa">$SESSION_NAME</span><span class="token plain">:db </span><span class="token string" style="color:#e3116c">"</span><span class="token string variable" style="color:#36acaa">$DB_LOGIN_CMD</span><span class="token string" style="color:#e3116c">"</span><span class="token plain"> Enter</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">tmux send-keys </span><span class="token parameter variable" style="color:#36acaa">-t</span><span class="token plain"> </span><span class="token variable" style="color:#36acaa">$SESSION_NAME</span><span class="token plain">:db </span><span class="token string" style="color:#e3116c">"sleep 5; mysql -u root wareena"</span><span class="token plain"> Enter</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Prihlásim sa do fixtúrovej databázy</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">tmux send-keys </span><span class="token parameter variable" style="color:#36acaa">-t</span><span class="token plain"> </span><span class="token variable" style="color:#36acaa">$SESSION_NAME</span><span class="token plain">:fixture_db </span><span class="token string" style="color:#e3116c">"</span><span class="token string variable" style="color:#36acaa">$FIXTURE_DB_LOGIN_CMD</span><span class="token string" style="color:#e3116c">"</span><span class="token plain"> Enter</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">tmux send-keys </span><span class="token parameter variable" style="color:#36acaa">-t</span><span class="token plain"> </span><span class="token variable" style="color:#36acaa">$SESSION_NAME</span><span class="token plain">:fixture_db </span><span class="token string" style="color:#e3116c">"sleep 5; mysql -u root wareena"</span><span class="token plain"> Enter</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># V poslednom tabe spustím websocket server</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">tmux send-keys </span><span class="token parameter variable" style="color:#36acaa">-t</span><span class="token plain"> </span><span class="token variable" style="color:#36acaa">$SESSION_NAME</span><span class="token plain">:ws </span><span class="token string" style="color:#e3116c">"</span><span class="token string variable" style="color:#36acaa">$WEB_LOGIN_CMD</span><span class="token string" style="color:#e3116c">"</span><span class="token plain"> Enter</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">tmux send-keys </span><span class="token parameter variable" style="color:#36acaa">-t</span><span class="token plain"> </span><span class="token variable" style="color:#36acaa">$SESSION_NAME</span><span class="token plain">:ws </span><span class="token string" style="color:#e3116c">"node bin/ws-server.js"</span><span class="token plain"> Enter</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Pripojím sa do vytvorenej session a do tabu, kde chcem spustiť neovim</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#393A34"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">tmux attach </span><span class="token parameter variable" style="color:#36acaa">-t</span><span class="token plain"> </span><span class="token variable" style="color:#36acaa">$SESSION_NAME</span><span class="token plain">:src</span></span><br></div></code></pre></div></div>]]></content>
        <category label="tmux" term="tmux"/>
        <category label="dotfiles" term="dotfiles"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Nový blog! Opäť! 🎉]]></title>
        <id>https://hrad.perunhq.org/2021/03/26-novy-blog/</id>
        <link href="https://hrad.perunhq.org/2021/03/26-novy-blog/"/>
        <updated>2021-03-26T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[Po niekoľkých rokoch som si povedal, že je opäť čas vzkriesiť svoj starý blog, podeliť sa o nejaké vedomosti, názory a podobne. Tak je to tu a uvidíme, ako to dopadne 😄.]]></summary>
        <content type="html"><![CDATA[<p>Po niekoľkých rokoch som si povedal, že je opäť čas vzkriesiť svoj starý blog, podeliť sa o nejaké vedomosti, názory a podobne. Tak je to tu a uvidíme, ako to dopadne 😄.
Každý môj doterajší pokus o blog skončil tak, že po niekoľkých mesiacoch som začal písať stále menej a menej, až nakoniec vôbec. Tento blog preto rovno začínam s tým,
že nemám vôbec ambíciu písať pravidelne a dokonca mám pripravený menší zoznam tém na prvých niekoľko príspevkov.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="o-čom-to-bude">O čom to bude?<a href="https://hrad.perunhq.org/2021/03/26-novy-blog/#o-%C4%8Dom-to-bude" class="hash-link" aria-label="Priama linka na O čom to bude?" title="Priama linka na O čom to bude?" translate="no">​</a></h2>
<p>Plánujem písať hlavne o vývojárskych témach, ale občas sa môže stať, že vznikne aj článok o nejakom mojom inom hobby. Uvidíme.</p>
<p>Na niektorých článkoch by som si chce vyskúšať niečo nové, čo som doteraz nerobil a to je nakrútenie videa k článku. Mám totiž
v hlave niekoľko nápadov na také malé tutoriály a myslím, že by bolo super, keby som veci vedel ukázať vo videu a zároveň k tomu poskytnúť
plnohodnotný návod vo forme článku.</p>
<p>Zatiaľ sa môžete tešiť na sériu videí a návodov k vývojárskym nástrojom, ktoré bežne používam. Prvý na rade bude <a href="https://github.com/tmux/tmux/wiki" target="_blank" rel="noopener noreferrer" class="">tmux</a>.</p>
<p>Držte palce 🤞</p>]]></content>
    </entry>
</feed>