<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:media="http://search.yahoo.com/mrss/"><channel><title><![CDATA[wtSVK]]></title><description><![CDATA[Myšlienky, príbehy a nápady.]]></description><link>https://www.web-tech.sk/</link><image><url>https://www.web-tech.sk/favicon.png</url><title>wtSVK</title><link>https://www.web-tech.sk/</link></image><generator>Ghost 5.23</generator><lastBuildDate>Mon, 20 Apr 2026 08:09:12 GMT</lastBuildDate><atom:link href="https://www.web-tech.sk/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[Vektorové vyhľadávanie v PHP a MariaDB: AI bez cloudu, priamo na hostingu]]></title><description><![CDATA[Vektorové vyhľadávanie aj bez cloudu? Ukážeme si, ako na to v PHP a MariaDB 11.8 – priamo na bežnom hostingu.]]></description><link>https://www.web-tech.sk/php/php-mariadb-vektorove-vyhladavanie-bez-cloudu/</link><guid isPermaLink="false">694c5ea11cb4340001204556</guid><category><![CDATA[php]]></category><category><![CDATA[mariadb]]></category><category><![CDATA[ai]]></category><category><![CDATA[hosting]]></category><category><![CDATA[hostcreators]]></category><dc:creator><![CDATA[Michal Forbak]]></dc:creator><pubDate>Wed, 24 Dec 2025 09:00:00 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1677442136019-21780ecad995?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1677442136019-21780ecad995?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;q=80&amp;w=2000" alt="Vektorov&#xE9; vyh&#x13E;ad&#xE1;vanie v PHP a MariaDB: AI bez cloudu, priamo na hostingu"><p>Umel&#xE1; inteligencia a modern&#xE9; vyh&#x13E;ad&#xE1;vanie dnes nie s&#xFA; len v&#xFD;sadou ve&#x13E;k&#xFD;ch cloudov&#xFD;ch platforiem. V&#x10F;aka pokrokom v datab&#xE1;zach, ako je MariaDB 11.8, si m&#xF4;&#x17E;ete vybudova&#x165; vlastn&#xE9; <strong>vektorov&#xE9; vyh&#x13E;ad&#xE1;vanie</strong> &#x2013; priamo na zdie&#x13E;anom hostingu, bez nutnosti vyu&#x17E;&#xED;va&#x165; slu&#x17E;by ako Pinecone alebo Weaviate.</p><h2 id="%F0%9F%A7%A0-%C4%8Do-je-vektorov%C3%A9-vyh%C4%BEad%C3%A1vanie">&#x1F9E0; &#x10C;o je vektorov&#xE9; vyh&#x13E;ad&#xE1;vanie?</h2><p>Tradi&#x10D;n&#xE9; vyh&#x13E;ad&#xE1;vanie funguje tak, &#x17E;e h&#x13E;ad&#xE1; presn&#xE9; zhody v texte &#x2013; napr&#xED;klad slovo <em>pes</em> n&#xE1;jde len tam, kde sa presne vyskytuje. Vektorov&#xE9; vyh&#x13E;ad&#xE1;vanie v&#x161;ak ide &#x10F;alej. Porovn&#xE1;va <strong>v&#xFD;znam textov</strong>, nie len ich slov&#xE1;. V&#x10F;aka tomu rozumie, &#x17E;e &#x201E;pes&#x201C; a &#x201E;zviera&#x201C; spolu &#xFA;zko s&#xFA;visia, aj ke&#x10F; to nie s&#xFA; rovnak&#xE9; slov&#xE1;.</p><p>Technicky ide o to, &#x17E;e ka&#x17E;d&#xFD; text (napr. veta, odsek alebo dokument) sa prevedie na <strong>vektor</strong> &#x2013; pole &#x10D;&#xED;sel, ktor&#xE9; popisuje jeho v&#xFD;znam. Tento proces sa naz&#xFD;va <em>embedding</em>.</p><h2 id="%E2%9A%99%EF%B8%8F-mariadb-a-podpora-vektorov%C3%BDch-indexov">&#x2699;&#xFE0F; MariaDB a podpora vektorov&#xFD;ch indexov</h2><p>Najnov&#x161;ie verzie MariaDB (od 11.4 vy&#x161;&#x161;ie) prin&#xE1;&#x161;aj&#xFA; experiment&#xE1;lnu, ale ve&#x13E;mi u&#x17E;ito&#x10D;n&#xFA; funkciu &#x2013; <strong>vektorov&#xE9; st&#x13A;pce a indexy</strong>. To znamen&#xE1;, &#x17E;e m&#xF4;&#x17E;ete uklada&#x165; a porovn&#xE1;va&#x165; vektory priamo v datab&#xE1;ze, bez potreby &#x161;peci&#xE1;lnych AI slu&#x17E;ieb.</p><p>Hosting, ako napr&#xED;klad <a href="https://www.hostcreators.sk?affil=xoJR4sIP">HostCreators.sk</a>, u&#x17E; be&#x17E;ne poskytuje MariaDB 11.8 &#x2013; tak&#x17E;e t&#xFA;to technol&#xF3;giu si m&#xF4;&#x17E;ete vysk&#xFA;&#x161;a&#x165; aj v r&#xE1;mci be&#x17E;n&#xE9;ho PHP hostingu.</p><h2 id="%F0%9F%93%A6-pr%C3%ADklad-vytvorenie-tabu%C4%BEky-s-vektorov%C3%BDm-st%C4%BApcom">&#x1F4E6; Pr&#xED;klad: vytvorenie tabu&#x13E;ky s vektorov&#xFD;m st&#x13A;pcom</h2><pre><code class="language-sql">CREATE TABLE documents (
  id INT AUTO_INCREMENT PRIMARY KEY,
  title VARCHAR(255),
  embedding VECTOR(1536),
  VECTOR INDEX (embedding) M=32 DISTANCE=cosine
);</code></pre><p>V tomto pr&#xED;klade vytv&#xE1;rame tabu&#x13E;ku, ktor&#xE1; bude obsahova&#x165; n&#xE1;zov dokumentu a jeho embedding. Index <code>DISTANCE=cosine</code> ur&#x10D;uje, &#x17E;e sa bud&#xFA; porovn&#xE1;va&#x165; podobnosti medzi vektormi pomocou kos&#xED;novej vzdialenosti &#x2013; ide o naj&#x10D;astej&#x161;ie pou&#x17E;&#xED;van&#xFD; sp&#xF4;sob merania podobnosti.</p><h2 id="%F0%9F%A7%A9-vkladanie-d%C3%A1t-pomocou-vecfromtext">&#x1F9E9; Vkladanie d&#xE1;t pomocou <code>VEC_FromText()</code></h2><p>MariaDB poskytuje praktick&#xFA; funkciu <code>VEC_FromText()</code>, ktor&#xE1; umo&#x17E;&#x148;uje previes&#x165; textov&#xFA; reprezent&#xE1;ciu po&#x13E;a na vektor. V&#x10F;aka tomu viete embedding jednoducho ulo&#x17E;i&#x165; priamo z PHP skriptu.</p><pre><code class="language-php">$pdo = new PDO(&quot;mysql:host=localhost;dbname=mojadb&quot;, &quot;user&quot;, &quot;heslo&quot;);
$text = &quot;Ako nasadi&#x165; WordPress na server?&quot;;
$embedding = &quot;[0.0123, 0.0034, -0.0234, ...]&quot;; // z OpenAI API

$stmt = $pdo-&gt;prepare(&quot;INSERT INTO documents (title, embedding) VALUES (?, VEC_FromText(?))&quot;);
$stmt-&gt;execute([$text, $embedding]);</code></pre><p>Takto ulo&#x17E;&#xED;te vektorov&#xFD; embedding priamo do datab&#xE1;zy. Embedding m&#xF4;&#x17E;ete z&#xED;ska&#x165; napr&#xED;klad z API modelu <code>text-embedding-3-small</code> od OpenAI.</p><h2 id="%F0%9F%94%8D-vyh%C4%BEad%C3%A1vanie-pod%C4%BEa-podobnosti-%E2%80%93-vecdistancecosine">&#x1F50D; Vyh&#x13E;ad&#xE1;vanie pod&#x13E;a podobnosti &#x2013; <code>VEC_DISTANCE_COSINE()</code></h2><p>Ke&#x10F; u&#x17E; m&#xE1;te d&#xE1;ta ulo&#x17E;en&#xE9;, m&#xF4;&#x17E;ete jednoducho h&#x13E;ada&#x165; najpodobnej&#x161;ie z&#xE1;znamy na z&#xE1;klade v&#xFD;znamu:</p><pre><code class="language-php">$queryEmbedding = &quot;[0.0102, 0.0044, -0.0187, ...]&quot;; // embedding z novej ot&#xE1;zky

$sql = &quot;SELECT title,
       VEC_DISTANCE_COSINE(embedding, VEC_FromText(?)) AS distance
FROM documents
ORDER BY distance ASC
LIMIT 5;&quot;;

$stmt = $pdo-&gt;prepare($sql);
$stmt-&gt;execute([$queryEmbedding]);

foreach ($stmt as $row) {
    echo $row[&apos;title&apos;] . &quot; (similarity: &quot; . round(1 - $row[&apos;distance&apos;], 3) . &quot;)\n&quot;;
}</code></pre><p>V&#xFD;sledky s najni&#x17E;&#x161;ou hodnotou <code>distance</code> s&#xFA; najpodobnej&#x161;ie h&#x13E;adan&#xE9;mu textu. V praxi sa takto daj&#xFA; implementova&#x165; funkcie ako:</p><ul><li>vyh&#x13E;ad&#xE1;vanie podobn&#xFD;ch &#x10D;l&#xE1;nkov,</li><li>inteligentn&#xE9; odpor&#xFA;&#x10D;ania produktov,</li><li>preh&#x13E;ad&#xE1;vanie znalostn&#xFD;ch b&#xE1;z.</li></ul><h2 id="%F0%9F%92%A1-pre%C4%8Do-to-cel%C3%A9-funguje-aj-bez-cloudu">&#x1F4A1; Pre&#x10D;o to cel&#xE9; funguje aj bez cloudu</h2><p>V&#x10F;aka nat&#xED;vnej podpore vektorov v MariaDB nepotrebujete &#x17E;iadne extern&#xE9; slu&#x17E;by. Sta&#x10D;&#xED; be&#x17E;n&#xFD; PHP hosting s nov&#x161;ou verziou MariaDB &#x2013; &#x17E;iadne Python servery, &#x17E;iadne API n&#xE1;klady. V&#x161;etko be&#x17E;&#xED; priamo v datab&#xE1;ze, &#x10D;o znamen&#xE1; jednoduch&#xE9; nasadenie a ni&#x17E;&#x161;ie n&#xE1;klady.</p><h2 id="%F0%9F%AA%84-z%C3%A1ver">&#x1FA84; Z&#xE1;ver</h2><p>Ak chcete svojmu webu doda&#x165; &#x161;tipku umelej inteligencie, nemus&#xED;te hne&#x10F; siaha&#x165; po cloudov&#xFD;ch rie&#x161;eniach. Vektorov&#xE9; vyh&#x13E;ad&#xE1;vanie m&#xF4;&#x17E;ete ma&#x165; aj na klasickom hostingu &#x2013; priamo v MariaDB a PHP. Modern&#xE9; hostingy, ako <a href="https://www.hostcreators.sk?affil=xoJR4sIP">HostCreators.sk</a>, v&#xE1;m k tomu pon&#xFA;kaj&#xFA; v&#x161;etko potrebn&#xE9; prostredie.</p><p>V &#x10F;al&#x161;om &#x10D;l&#xE1;nku sa pozrieme na to, ako vyu&#x17E;i&#x165; <strong>Redis</strong> pre vektorov&#xE9; vyh&#x13E;ad&#xE1;vanie priamo v pam&#xE4;ti &#x2013; pre e&#x161;te r&#xFD;chlej&#x161;ie odpovede &#x26A1;</p>]]></content:encoded></item><item><title><![CDATA[Ansible: Štruktúra projektu a správa inventára]]></title><description><![CDATA[Udrž si poriadok v Ansible projektoch – rozdelenie inventára, štruktúra adresárov a organizácia premenných.]]></description><link>https://www.web-tech.sk/infra/infra-ansible-inventar-a-struktura/</link><guid isPermaLink="false">67f1afe0a702a60001e7217b</guid><category><![CDATA[infra]]></category><category><![CDATA[ansible]]></category><dc:creator><![CDATA[Michal Forbak]]></dc:creator><pubDate>Sun, 06 Apr 2025 10:00:00 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1551269901-5c5e14c25df7?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDIyfHxtYWdpY3xlbnwwfHx8fDE3NjczOTA1MDJ8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<h2 id="pre%C4%8Do-rie%C5%A1i%C5%A5-%C5%A1trukt%C3%BAru-a-invent%C3%A1r">Pre&#x10D;o rie&#x161;i&#x165; &#x161;trukt&#xFA;ru a invent&#xE1;r?</h2><img src="https://images.unsplash.com/photo-1551269901-5c5e14c25df7?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDIyfHxtYWdpY3xlbnwwfHx8fDE3NjczOTA1MDJ8MA&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=2000" alt="Ansible: &#x160;trukt&#xFA;ra projektu a spr&#xE1;va invent&#xE1;ra"><p>Ak sa tvoj Ansible projekt rozrast&#xE1;, ve&#x13E;mi r&#xFD;chlo zist&#xED;&#x161;, &#x17E;e jeden <code>inventory.ini</code> a p&#xE1;r playbookov nesta&#x10D;&#xED;. Dobr&#xE1; &#x161;trukt&#xFA;ra ti pom&#xF4;&#x17E;e udr&#x17E;a&#x165; preh&#x13E;ad, opakovate&#x13E;nos&#x165; a jednoduch&#xFA; spr&#xE1;vu viacer&#xFD;ch prostred&#xED; &#x2013; napr&#xED;klad staging, produkcia alebo edge zariadenia.</p><h2 id="%C5%A1tandardn%C3%A1-%C5%A1trukt%C3%BAra-ansible-projektu">&#x160;tandardn&#xE1; &#x161;trukt&#xFA;ra Ansible projektu</h2><pre><code>ansible/
&#x251C;&#x2500;&#x2500; inventories/
&#x2502;   &#x251C;&#x2500;&#x2500; production/
&#x2502;   &#x2502;   &#x251C;&#x2500;&#x2500; hosts.ini
&#x2502;   &#x2502;   &#x2514;&#x2500;&#x2500; group_vars/
&#x2502;   &#x2502;       &#x2514;&#x2500;&#x2500; all.yml
&#x2502;   &#x2514;&#x2500;&#x2500; staging/
&#x2502;       &#x251C;&#x2500;&#x2500; hosts.ini
&#x2502;       &#x2514;&#x2500;&#x2500; group_vars/
&#x251C;&#x2500;&#x2500; playbooks/
&#x2502;   &#x251C;&#x2500;&#x2500; setup.yml
&#x2502;   &#x2514;&#x2500;&#x2500; webserver.yml
&#x2514;&#x2500;&#x2500; roles/
    &#x2514;&#x2500;&#x2500; nginx/
        &#x251C;&#x2500;&#x2500; tasks/
        &#x251C;&#x2500;&#x2500; templates/
        &#x2514;&#x2500;&#x2500; defaults/</code></pre><p>Takto vie&#x161; oddeli&#x165; konfigur&#xE1;cie pre r&#xF4;zne prostredia a z&#xE1;rove&#x148; udr&#x17E;a&#x165; jednotn&#xFD; z&#xE1;klad.</p><h2 id="%C4%8Do-je-inventory">&#x10C;o je inventory?</h2><p><strong>Inventory</strong> s&#xFA;bor ur&#x10D;uje, na ak&#xE9; servery sa m&#xE1; playbook aplikova&#x165;. M&#xF4;&#x17E;e by&#x165; vo form&#xE1;te <code>.ini</code> alebo <code>.yaml</code>.</p><h3 id="pr%C3%ADklad-hostsini">Pr&#xED;klad <code>hosts.ini</code></h3><pre><code>[web]
192.168.1.10
192.168.1.11

[db]
192.168.1.12</code></pre><h3 id="pr%C3%ADklad-s-premenliv%C3%BDmi-adresami-a-skupinami">Pr&#xED;klad s premenliv&#xFD;mi adresami a skupinami</h3><pre><code>[edge]
server1 ansible_host=10.0.0.2
server2 ansible_host=10.0.0.3

[edge:vars]
timezone=Europe/Bratislava</code></pre><h2 id="premenn%C3%A9-pod%C4%BEa-skup%C3%ADn-a-hostov">Premenn&#xE9; pod&#x13E;a skup&#xED;n a hostov</h2><p>Do <code>group_vars/</code> a <code>host_vars/</code> m&#xF4;&#x17E;e&#x161; ulo&#x17E;i&#x165; YAML s&#xFA;bory so &#x161;pecifick&#xFD;mi hodnotami pre jednotliv&#xE9; skupiny alebo hostov. Ansible ich automaticky na&#x10D;&#xED;ta.</p><h3 id="pr%C3%ADklad-groupvarsallyml">Pr&#xED;klad <code>group_vars/all.yml</code>:</h3><pre><code>ansible_user: ansible
ntp_server: pool.ntp.org
</code></pre><h2 id="tipy-pre-organiz%C3%A1ciu">Tipy pre organiz&#xE1;ciu:</h2><ul><li>Nepou&#x17E;&#xED;vaj len jeden inventory pre v&#x161;etko &#x2013; rozde&#x13E; si staging, prod, lab</li><li>Pou&#x17E;&#xED;vaj <code>group_vars</code> na zdie&#x13E;an&#xE9; nastavenia</li><li>Udr&#x17E;uj v&#x161;etko pod Git verziou</li><li>Pomen&#xFA;vaj servery logicky (napr. <code>web01</code>, <code>db02</code>)</li></ul><h2 id="%C4%8Do-%C4%8Falej">&#x10C;o &#x10F;alej?</h2><p>V &#x10F;al&#x161;om &#x10D;l&#xE1;nku si uk&#xE1;&#x17E;eme, ako pou&#x17E;&#xED;va&#x165; premenn&#xE9;, &#x161;abl&#xF3;ny a ako zamedzi&#x165; tomu, aby sa slu&#x17E;ba re&#x161;tartovala zbyto&#x10D;ne po ka&#x17E;dej zmene konfigur&#xE1;cie.</p><p>Ak m&#xE1;&#x161; &#x161;pecifick&#xFA; &#x161;trukt&#xFA;ru alebo ot&#xE1;zku, nap&#xED;&#x161; n&#xE1;m &#x2013; m&#xF4;&#x17E;eme doplni&#x165; konkr&#xE9;tny pr&#xED;klad na mieru.</p>]]></content:encoded></item><item><title><![CDATA[Testovanie CSRF zraniteľnosti: Webové formuláre aj REST API]]></title><description><![CDATA[CSRF môže ovplyvniť aj moderné REST API aplikácie. V tomto článku ti ukážem, ako zraniteľnosť otestovať, aj ako sa jej brániť.]]></description><link>https://www.web-tech.sk/security/security-csrf-testovanie-web-rest-api/</link><guid isPermaLink="false">67eeac08a702a60001e7215f</guid><category><![CDATA[Security]]></category><category><![CDATA[Pentest]]></category><category><![CDATA[CSRF]]></category><category><![CDATA[REST API]]></category><dc:creator><![CDATA[Michal Forbak]]></dc:creator><pubDate>Thu, 03 Apr 2025 15:43:00 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1561883088-039e53143d73?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDF8fGhhY2tlZHxlbnwwfHx8fDE3NDM2OTQ5NjF8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<h2 id="%C3%BAvod">&#xDA;vod</h2><img src="https://images.unsplash.com/photo-1561883088-039e53143d73?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDF8fGhhY2tlZHxlbnwwfHx8fDE3NDM2OTQ5NjF8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" alt="Testovanie CSRF zranite&#x13E;nosti: Webov&#xE9; formul&#xE1;re aj REST API"><p><strong>CSRF (Cross-Site Request Forgery)</strong> je zranite&#x13E;nos&#x165;, ktor&#xE1; umo&#x17E;&#x148;uje &#xFA;to&#x10D;n&#xED;kovi vykona&#x165; akciu v mene prihl&#xE1;sen&#xE9;ho pou&#x17E;&#xED;vate&#x13E;a &#x2013; bez jeho vedomia. Typicky sa to deje cez &#x161;kodliv&#xFD; odkaz alebo iframe, ktor&#xFD; spust&#xED; po&#x17E;iadavku na server, kde je pou&#x17E;&#xED;vate&#x13E; prihl&#xE1;sen&#xFD;.</p><h2 id="princ%C3%ADp-%C3%BAtoku">Princ&#xED;p &#xFA;toku</h2><p>&#xDA;to&#x10D;n&#xED;k odo&#x161;le po&#x17E;iadavku cez HTML prvok (napr. <code>&lt;img&gt;</code> alebo <code>&lt;form&gt;</code>), prehliada&#x10D; prilo&#x17E;&#xED; <strong>session cookie</strong> &#x2013; a server si mysl&#xED;, &#x17E;e po&#x17E;iadavka je legit&#xED;mna.</p><h2 id="krok-za-krokom-testovanie-cez-burp-suite-alebo-caido">Krok za krokom: Testovanie cez Burp Suite alebo Caido</h2><ol><li>Presmeruj prehliada&#x10D; cez proxy (Burp alebo Caido)</li><li>Sprav akciu v aplik&#xE1;cii (napr. zme&#x148; heslo)</li><li>Odo&#x161;li po&#x17E;iadavku do Repeateru</li><li>Sleduj, &#x10D;i obsahuje CSRF token &#x2013; v tele alebo hlavi&#x10D;ke</li><li>Odstr&#xE1;&#x148; token, po&#x161;li po&#x17E;iadavku znova &#x2013; ak prejde, appka je n&#xE1;chyln&#xE1;</li></ol><h2 id="vytvorenie-exploit-str%C3%A1nky">Vytvorenie exploit str&#xE1;nky</h2><pre><code>&lt;form action=&quot;https://example.com/zmena-hesla&quot; method=&quot;POST&quot;&gt;
  &lt;input type=&quot;hidden&quot; name=&quot;heslo&quot; value=&quot;hacked123&quot;&gt;
  &lt;input type=&quot;submit&quot;&gt;
&lt;/form&gt;
&lt;script&gt;document.forms[0].submit();&lt;/script&gt;
</code></pre><p>Ak str&#xE1;nka spracuje po&#x17E;iadavku aj bez overenia tokenu &#x2013; si zranite&#x13E;n&#xFD;.</p><h2 id="testovanie-rest-api-csrf-st%C3%A1le-hroz%C3%AD">Testovanie REST API: CSRF st&#xE1;le hroz&#xED;</h2><p>Mnoh&#xE9; REST API aplik&#xE1;cie (napr. SPA v Reacte) pou&#x17E;&#xED;vaj&#xFA; <strong>cookie-based autentifik&#xE1;ciu</strong>. Prehliada&#x10D; automaticky prilo&#x17E;&#xED; cookie aj pri &#xFA;toku z inej dom&#xE9;ny, &#x10D;o znamen&#xE1;: <strong>CSRF je st&#xE1;le re&#xE1;lne riziko</strong>.</p><h3 id="ako-testova%C5%A5">Ako testova&#x165;:</h3><ul><li>Skontroluj, &#x10D;i sa API autentifikuje cez <code>sessionid</code> cookie</li><li>Sk&#xFA;s odosla&#x165; po&#x17E;iadavku z cudz&#xED;ch str&#xE1;nok cez formul&#xE1;r</li><li>Sleduj, &#x10D;i API kontroluje <code>Origin</code> alebo <code>Referer</code>, alebo vy&#x17E;aduje CSRF token</li></ul><h2 id="ochrana-pred-csrf">Ochrana pred CSRF</h2><ul><li>Overuj <code>Origin</code> a <code>Referer</code> hlavi&#x10D;ku</li><li>Pou&#x17E;&#xED;vaj CSRF tokeny (generovan&#xE9; a overovan&#xE9; serverom)</li><li>V REST API pou&#x17E;&#xED;vaj <strong>JWT v hlavi&#x10D;ke</strong>, nie cookie</li><li>Pridaj hlavi&#x10D;ku <code>X-Requested-With</code> na strane klienta</li><li>Nastav <code>SameSite</code> atrib&#xFA;t pri cookies</li></ul><h2 id="samesite-cookie-atrib%C3%BAt-a-ux">SameSite cookie atrib&#xFA;t a UX</h2><p><code>SameSite=Strict</code> znamen&#xE1;, &#x17E;e cookie sa <strong>nepo&#x161;le</strong> pri &#x17E;iadnej po&#x17E;iadavke mimo aktu&#xE1;lnej dom&#xE9;ny. Znie to skvele &#x2013; ale m&#xE1; h&#xE1;&#x10D;ik.</p><h3 id="pr%C3%ADklad">Pr&#xED;klad:</h3><p>Pou&#x17E;&#xED;vate&#x13E; je prihl&#xE1;sen&#xFD; v appke. Klikne na odkaz z e-mailu a dostane sa sp&#xE4;&#x165; na appku. Ak m&#xE1;&#x161; cookie s <code>SameSite=Strict</code>, prehliada&#x10D; ju <strong>nepo&#x161;le</strong>. Pou&#x17E;&#xED;vate&#x13E; bude odhl&#xE1;sen&#xFD; alebo uvid&#xED; chybu.</p><h3 id="preh%C4%BEad">Preh&#x13E;ad:</h3><!--kg-card-begin: html--><table>
  <thead>
    <tr><th>SameSite</th><th>UX</th><th>Bezpe&#x10D;nos&#x165;</th></tr>
  </thead>
  <tbody>
    <tr><td>Strict</td><td>&#x274C; Slab&#x161;ie UX (odhlasovanie pri n&#xE1;vrate)</td><td>&#x2705; Najvy&#x161;&#x161;ia</td></tr>
    <tr><td>Lax</td><td>&#x2705; Dobr&#xE9;</td><td>&#x26A0;&#xFE0F; Nechr&#xE1;ni POST po&#x17E;iadavky</td></tr>
    <tr><td>None + Secure</td><td>&#x2705; &#xDA;pln&#xE9;</td><td>&#x26A0;&#xFE0F; Nutn&#xE1; ochrana tokenmi</td></tr>
  </tbody>
</table><!--kg-card-end: html--><h2 id="z%C3%A1ver">Z&#xE1;ver</h2><p>CSRF nie je minulos&#x165; &#x2013; st&#xE1;le sa vyskytuje v slab&#x161;&#xED;ch implement&#xE1;ci&#xE1;ch REST API, v aplik&#xE1;ci&#xE1;ch bez tokenov &#x10D;i v microservisn&#xFD;ch syst&#xE9;moch, ktor&#xE9; pou&#x17E;&#xED;vaj&#xFA; cookies. Ochrana je pritom relat&#xED;vne jednoduch&#xE1; a existuje nieko&#x13E;ko overen&#xFD;ch pr&#xED;stupov.</p><p>V &#x10F;al&#x161;om &#x10D;l&#xE1;nku sa pozrieme na CSRF ochranu v konkr&#xE9;tnych frameworkoch (Express.js, Django, Laravel).</p>]]></content:encoded></item><item><title><![CDATA[Pentest krok za krokom: Ako otestovať web aplikáciu cez Caido alebo Burp Suite]]></title><description><![CDATA[Chceš otestovať bezpečnosť svojho webu? Tento návod ti krok za krokom ukáže, ako na to pomocou Caido alebo Burp Suite.]]></description><link>https://www.web-tech.sk/pentest/security-web-pentest-caido-burp-navod/</link><guid isPermaLink="false">67eea84ba702a60001e7214b</guid><category><![CDATA[Pentest]]></category><category><![CDATA[Security]]></category><category><![CDATA[Burp Suite]]></category><category><![CDATA[Caido]]></category><dc:creator><![CDATA[Michal Forbak]]></dc:creator><pubDate>Thu, 03 Apr 2025 15:00:00 GMT</pubDate><media:content url="https://res-2.cloudinary.com/wtsvk/image/upload/q_auto/v1/www.web-tech.sk/2025/04/hacker_whiskey_910.jpg" medium="image"/><content:encoded><![CDATA[<h2 id="%C3%BAvod">&#xDA;vod</h2><img src="https://res-2.cloudinary.com/wtsvk/image/upload/q_auto/v1/www.web-tech.sk/2025/04/hacker_whiskey_910.jpg" alt="Pentest krok za krokom: Ako otestova&#x165; web aplik&#xE1;ciu cez Caido alebo Burp Suite"><p>Chce&#x161; si vysk&#xFA;&#x161;a&#x165;, ako funguje penetra&#x10D;n&#xE9; testovanie webovej aplik&#xE1;cie? Tento n&#xE1;vod ti krok za krokom uk&#xE1;&#x17E;e, ako na to pomocou <strong>Burp Suite</strong> alebo <strong>Caido</strong> &#x2013; modern&#xFD;ch n&#xE1;strojov pre testovanie zranite&#x13E;nost&#xED; typu XSS, IDOR, CSRF a in&#xFD;ch.</p><h2 id="%C4%8Do-bude%C5%A1-potrebova%C5%A5">&#x10C;o bude&#x161; potrebova&#x165;</h2><ul><li>Z&#xE1;kladn&#xE9; znalosti HTTP po&#x17E;iadaviek (GET, POST, cookies, headers)</li><li>Nain&#x161;talovan&#xFD; prehliada&#x10D; (ide&#xE1;lne Firefox)</li><li><strong>Burp Suite Community</strong> alebo <strong>Caido</strong> (free)</li><li>Testovaciu aplik&#xE1;ciu (napr. <a href="https://portswigger.net/web-security">PortSwigger Web Academy</a>, <a href="https://owasp.org/www-project-webgoat/">WebGoat</a> alebo jednoduch&#xFD; web od teba)</li></ul><h2 id="krok-1-priprav-si-prostredie">Krok 1: Priprav si prostredie</h2><ol><li>Stiahni a nain&#x161;taluj <strong>Burp Suite</strong> z <a href="https://portswigger.net/burp">portswigger.net/burp</a> alebo <strong>Caido</strong> z <a href="https://caido.io">caido.io</a></li><li>Spusti aplik&#xE1;ciu a nastav <strong>proxy</strong> na <code>localhost:8080</code> (&#x161;tandardne)</li><li>Vo Firefoxe (alebo Brave) nastav manu&#xE1;lnu proxy:</li></ol><ul><li>Menu &gt; Nastavenia &gt; Sie&#x165; &gt; Nastavi&#x165; proxy</li><li>HTTP proxy: 127.0.0.1, port: 8080</li></ul><ol><li>Nav&#x161;t&#xED;v testovaciu web aplik&#xE1;ciu</li></ol><h2 id="krok-2-zachyt%C3%A1vanie-po%C5%BEiadaviek-intercept">Krok 2: Zachyt&#xE1;vanie po&#x17E;iadaviek (intercept)</h2><ul><li>V Burpe: otvor &quot;Proxy&quot; &gt; zapni &quot;Intercept&quot;</li><li>V Caido: prehliadaj web, po&#x17E;iadavky sa loguj&#xFA; automaticky</li><li>Vyh&#x13E;adaj po&#x17E;iadavky typu POST alebo GET, kde sa posielaj&#xFA; &#xFA;daje od pou&#x17E;&#xED;vate&#x13E;a (napr. koment&#xE1;re, login...)</li></ul><h2 id="krok-3-h%C4%BEadanie-xss-cross-site-scripting">Krok 3: H&#x13E;adanie XSS (Cross-site scripting)</h2><ol><li>N&#xE1;jdi miesto, kde aplik&#xE1;cia zobrazuje tvoje vstupy (napr. koment&#xE1;r)</li><li>V requeste zme&#x148; hodnotu napr. na <code>&lt;script&gt;alert(1)&lt;/script&gt;</code></li><li>Odo&#x161;li po&#x17E;iadavku a sleduj, &#x10D;i sa alert zobraz&#xED; na str&#xE1;nke</li><li>Ak &#xE1;no &#x2013; aplik&#xE1;cia nefiltruje vstupy = potenci&#xE1;lne XSS</li></ol><h2 id="krok-4-h%C4%BEadanie-idor-insecure-direct-object-reference">Krok 4: H&#x13E;adanie IDOR (Insecure Direct Object Reference)</h2><ol><li>N&#xE1;jdi URL alebo parametre ako <code>/profile?id=123</code> alebo <code>user_id=123</code> v requeste</li><li>Zme&#x148; hodnotu ID na in&#xFA; (napr. 124, 1, 2&#x2026;)</li><li>Sleduj, &#x10D;i sa ti zobraz&#xED; cudz&#xED; profil alebo d&#xE1;ta in&#xE9;ho pou&#x17E;&#xED;vate&#x13E;a</li><li>Ak &#xE1;no &#x2013; chyba pr&#xED;stupovej kontroly</li></ol><h2 id="krok-5-automatick%C3%A9-testy-scanner">Krok 5: Automatick&#xE9; testy (scanner)</h2><ul><li>V Burp Community m&#xF4;&#x17E;e&#x161; pou&#x17E;i&#x165; &quot;Logger&quot; a ru&#x10D;ne analyzova&#x165; odpovede</li><li>V Caido klikni na po&#x17E;iadavku a vyber &#x201E;Scan&#x201C; &#x2013; automaticky prebehne XSS/SQLi/IDOR kontrola</li></ul><h2 id="bonus-api-testovanie">Bonus: API testovanie</h2><ul><li>Po&#x161;li po&#x17E;iadavku cez Postman (alebo si ju na&#x10D;&#xED;taj z Caido)</li><li>Sk&#xFA;s upravi&#x165; JSON payloady &#x2013; injekcie do parametrov</li><li>Vysk&#xFA;&#x161;aj napr. hodnoty ako <code>{&quot;role&quot;: &quot;admin&quot;}</code> alebo <code>&apos; OR 1=1 --</code></li></ul><h2 id="bezpe%C4%8Dnos%C5%A5-a-etika">Bezpe&#x10D;nos&#x165; a etika</h2><p>Testuj <strong>iba svoje aplik&#xE1;cie alebo ofici&#xE1;lne cvi&#x10D;isk&#xE1;</strong>. Neopr&#xE1;vnen&#xFD; pentest na cudz&#xED;ch syst&#xE9;moch je <strong>nez&#xE1;konn&#xFD;</strong>. V&#x17E;dy dodr&#x17E;uj etick&#xFD; hacking!</p><h2 id="z%C3%A1ver">Z&#xE1;ver</h2><p>T&#xFD;mto si si vysk&#xFA;&#x161;al z&#xE1;kladn&#xE9; techniky pentestovania webu. N&#xE1;stroje ako Burp Suite &#x10D;i Caido ti otv&#xE1;raj&#xFA; cestu k hlb&#x161;ej anal&#xFD;ze a aj automatiz&#xE1;cii.</p><p>V &#x10F;al&#x161;om &#x10D;l&#xE1;nku si uk&#xE1;&#x17E;eme testovanie CSRF zranite&#x13E;nosti a nastavenie notifik&#xE1;ci&#xED;/automatick&#xE9;ho reportingu.</p>]]></content:encoded></item><item><title><![CDATA[GitHub Actions (2. diel): Nasadenie projektu na server cez SSH]]></title><description><![CDATA[Nasadenie projektu na vlastný server pomocou GitHub Actions? V tomto článku si ukážeme, ako na to cez SSH a scp/rsync.]]></description><link>https://www.web-tech.sk/github/github-github-actions-ssh-deploy-2/</link><guid isPermaLink="false">67ee8910a702a60001e7213e</guid><category><![CDATA[GitHub]]></category><category><![CDATA[CI/CD]]></category><category><![CDATA[DevOps]]></category><dc:creator><![CDATA[Michal Forbak]]></dc:creator><pubDate>Thu, 03 Apr 2025 13:00:00 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1650295751050-b184e54e177c?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDIxfHxnaXRodWJ8ZW58MHx8fHwxNzQzNjg2MTgxfDA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<h2 id="%C3%BAvod">&#xDA;vod</h2><img src="https://images.unsplash.com/photo-1650295751050-b184e54e177c?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDIxfHxnaXRodWJ8ZW58MHx8fHwxNzQzNjg2MTgxfDA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" alt="GitHub Actions (2. diel): Nasadenie projektu na server cez SSH"><p>V predch&#xE1;dzaj&#xFA;com &#x10D;l&#xE1;nku sme si uk&#xE1;zali, ako vytvori&#x165; z&#xE1;kladn&#xFD; GitHub Actions workflow pre buildovanie a testovanie projektu. V tomto pokra&#x10D;ovan&#xED; sa zameriame na <strong>automatizovan&#xE9; nasadenie (deploy)</strong> projektu na tvoj vlastn&#xFD; alebo firemn&#xFD; server pomocou <strong>SSH a rsync/scp</strong>.</p><h2 id="scen%C3%A1r">Scen&#xE1;r</h2><p>Predstavme si jednoduch&#xFD; pr&#xED;pad: M&#xE1;&#x161; statick&#xFD; web alebo Node.js aplik&#xE1;ciu, ktor&#xFA; chce&#x161; po commite do vetvy <code>main</code> automaticky nahr&#xE1;va&#x165; na server (napr. VPS alebo hosting s SSH pr&#xED;stupom).</p><h2 id="po%C5%BEiadavky">Po&#x17E;iadavky</h2><ul><li>SSH pr&#xED;stup k serveru</li><li>Vytvoren&#xFD; verejn&#xFD; a s&#xFA;kromn&#xFD; SSH k&#x13E;&#xFA;&#x10D;</li><li>Nastaven&#xFD; GitHub repozit&#xE1;r</li></ul><h2 id="1-generovanie-ssh-k%C4%BE%C3%BA%C4%8Da">1. Generovanie SSH k&#x13E;&#xFA;&#x10D;a</h2><pre><code>ssh-keygen -t ed25519 -C &quot;github-actions@deploy&quot;
</code></pre><p>Ulo&#x17E; si <code>id_ed25519</code> (priv&#xE1;tny k&#x13E;&#xFA;&#x10D;) a <code>id_ed25519.pub</code> (verejn&#xFD; k&#x13E;&#xFA;&#x10D;). Verejn&#xFD; k&#x13E;&#xFA;&#x10D; nahraj na server do <code>~/.ssh/authorized_keys</code>.</p><h2 id="2-nastavenie-github-secrets">2. Nastavenie GitHub Secrets</h2><p>V tvojom repozit&#xE1;ri na GitHube cho&#x10F; do <strong>Settings &gt; Secrets and variables &gt; Actions</strong> a pridaj tieto premenn&#xE9;:</p><ul><li><code>SSH_HOST</code> &#x2013; IP alebo dom&#xE9;na servera</li><li><code>SSH_USER</code> &#x2013; meno pou&#x17E;&#xED;vate&#x13E;a (napr. <code>ubuntu</code>)</li><li><code>SSH_KEY</code> &#x2013; obsah s&#xFA;kromn&#xE9;ho k&#x13E;&#xFA;&#x10D;a <code>id_ed25519</code></li><li><code>DEPLOY_PATH</code> &#x2013; cie&#x13E;ov&#xE1; cesta na serveri (napr. <code>/var/www/mysite</code>)</li></ul><h2 id="3-workflow-pre-nasadenie">3. Workflow pre nasadenie</h2><p>Vytvor s&#xFA;bor <code>.github/workflows/deploy.yml</code>:</p><pre><code>name: Deploy to Server

on:
  push:
    branches:
      - main

jobs:
  deploy:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout
        uses: actions/checkout@v3

      - name: Build (ak treba)
        run: |
          npm ci
          npm run build

      - name: Deploy via SSH
        uses: appleboy/scp-action@v0.1.4
        with:
          host: ${{ secrets.SSH_HOST }}
          username: ${{ secrets.SSH_USER }}
          key: ${{ secrets.SSH_KEY }}
          source: &quot;./build&quot;
          target: ${{ secrets.DEPLOY_PATH }}
</code></pre><p>Tento workflow:</p><ul><li>Spust&#xED; sa pri ka&#x17E;dom pushnut&#xED; do <code>main</code></li><li>Projekt builduje (volite&#x13E;n&#xE9;)</li><li>Nahr&#xE1; s&#xFA;bory na server cez <code>scp</code></li></ul><h2 id="alternat%C3%ADva-rsync-cez-ssh">Alternat&#xED;va: rsync cez SSH</h2><p>Pre efekt&#xED;vnej&#x161;&#xED; deploy (iba zmenen&#xE9; s&#xFA;bory) pou&#x17E;i <code>rsync</code> cez <code>appleboy/ssh-action</code>:</p><pre><code>- name: Deploy with rsync
  uses: appleboy/ssh-action@v1.0.0
  with:
    host: ${{ secrets.SSH_HOST }}
    username: ${{ secrets.SSH_USER }}
    key: ${{ secrets.SSH_KEY }}
    script: |
      rsync -avz --delete ./build/ ${{ secrets.SSH_USER }}@${{ secrets.SSH_HOST }}:${{ secrets.DEPLOY_PATH }}
</code></pre><h2 id="bezpe%C4%8Dnos%C5%A5">Bezpe&#x10D;nos&#x165;</h2><ul><li>Priv&#xE1;tny k&#x13E;&#xFA;&#x10D; uchov&#xE1;vaj <strong>iba v GitHub Secrets</strong>.</li><li>Pou&#x17E;&#xED;vaj vyhraden&#xE9;ho pou&#x17E;&#xED;vate&#x13E;a s obmedzen&#xFD;mi pr&#xE1;vami.</li><li>M&#xF4;&#x17E;e&#x161; pou&#x17E;i&#x165; <code>chroot</code> alebo <code>rsync --bwlimit</code> na obmedzenie prenosu.</li></ul><h2 id="z%C3%A1ver">Z&#xE1;ver</h2><p>GitHub Actions umo&#x17E;&#x148;uj&#xFA; bezpe&#x10D;n&#xE9; a automatizovan&#xE9; nasadzovanie tvojich projektov &#x2013; bez nutnosti manu&#xE1;lnych pr&#xED;stupov. V &#x10F;al&#x161;om diely si uk&#xE1;&#x17E;eme, ako workflow roz&#x161;&#xED;ri&#x165; o rollback alebo notifik&#xE1;cie cez Discord alebo Slack.</p>]]></content:encoded></item><item><title><![CDATA[Úvod do Ansible: Automatizácia správy serverov jednoducho]]></title><description><![CDATA[Začni s automatizáciou správy serverov pomocou Ansible. Základy, prvé playbooky a praktické tipy pre začiatočníkov.]]></description><link>https://www.web-tech.sk/infra/infra-ansible-uvod/</link><guid isPermaLink="false">67f1ae1ba702a60001e72170</guid><category><![CDATA[infra]]></category><category><![CDATA[ansible]]></category><dc:creator><![CDATA[Michal Forbak]]></dc:creator><pubDate>Wed, 02 Apr 2025 09:00:00 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1589152144820-692b189e0b34?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<h2 id="pre%C4%8Do-ansible">Pre&#x10D;o Ansible?</h2><img src="https://images.unsplash.com/photo-1589152144820-692b189e0b34?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;q=80&amp;w=2000" alt="&#xDA;vod do Ansible: Automatiz&#xE1;cia spr&#xE1;vy serverov jednoducho"><p>Spravova&#x165; viacero serverov manu&#xE1;lne cez SSH je udr&#x17E;ate&#x13E;n&#xE9; len chv&#xED;&#x13E;u. Sk&#xF4;r &#x10D;i nesk&#xF4;r nastane chyba, nie&#x10D;o zabudnete, a konfigur&#xE1;cie sa za&#x10D;n&#xFA; rozch&#xE1;dza&#x165;. Tu nastupuje <strong>Ansible</strong> &#x2013; jednoduch&#xFD;, v&#xFD;konn&#xFD; n&#xE1;stroj na automatiz&#xE1;ciu infra&#x161;trukt&#xFA;ry, ktor&#xFD; funguje bez agentov a vyu&#x17E;&#xED;va len SSH a Python.</p><h2 id="%C4%8Do-je-ansible">&#x10C;o je Ansible?</h2><p>Ansible je n&#xE1;stroj na spr&#xE1;vu konfigur&#xE1;cie a automatiz&#xE1;ciu procesov. Pou&#x17E;&#xED;va jednoduch&#xFD; YAML form&#xE1;t na definovanie toho, &#x10D;o sa m&#xE1; na serveri sta&#x165; &#x2013; &#x10D;i u&#x17E; ide o in&#x161;tal&#xE1;ciu bal&#xED;&#x10D;kov, kop&#xED;rovanie s&#xFA;borov, sp&#xFA;&#x161;&#x165;anie pr&#xED;kazov alebo nasadzovanie aplik&#xE1;ci&#xED;.</p><h2 id="hlavn%C3%A9-v%C3%BDhody">Hlavn&#xE9; v&#xFD;hody</h2><ul><li>Bez agentov &#x2013; sta&#x10D;&#xED; SSH pr&#xED;stup a Python na serveri</li><li>Jednoduch&#xE1; syntax (YAML)</li><li>Opakovate&#x13E;n&#xE9;, versionovate&#x13E;n&#xE9; konfigur&#xE1;cie</li><li>Ve&#x13E;k&#xE1; komunita a mno&#x17E;stvo hotov&#xFD;ch modulov</li></ul><h2 id="prv%C3%A9-kroky-s-ansible">Prv&#xE9; kroky s Ansible</h2><ol><li>&#x1F6E0;&#xFE0F; <strong>In&#x161;tal&#xE1;cia:</strong><br>Linux <code>sudo apt install ansible</code> alebo <code>pip install ansible</code><br>MacOS <code>brew install ansible</code></li><li>&#x1F4C2; <strong>Inventory s&#xFA;bor:</strong> definujte svoje servery</li></ol><figure class="kg-card kg-code-card"><pre><code class="language-ini">[servers]
192.168.1.10
192.168.1.11
</code></pre><figcaption>inventory.ini</figcaption></figure><p>Odpor&#xFA;&#x10D;an&#xE1; &#x161;trukt&#xFA;ra projektu:</p><pre><code>ansible-demo/
&#x251C;&#x2500;&#x2500; inventory.ini
&#x2514;&#x2500;&#x2500; install-nginx.yml
</code></pre><ol><li>&#x25B6;&#xFE0F; <strong>Spustenie:</strong><br> <code>ansible -i inventory.ini web -m ping</code><br>Ak pou&#x17E;&#xED;va&#x161; SSH k&#x13E;&#xFA;&#x10D;: <code>ansible -i inventory.ini all -m ping --private-key ~/.ssh/id_rsa</code></li></ol><p>&#x1F4A1; <strong>Tip:</strong> Ak sa pripojenie nepodar&#xED;, sk&#xFA;s <code>ssh-copy-id user@server</code> alebo pridaj server do <code>~/.ssh/known_hosts</code>.</p><h2 id="uk%C3%A1%C5%BEka-jednoduch%C3%A9ho-playbooku">Uk&#xE1;&#x17E;ka jednoduch&#xE9;ho playbooku</h2><pre><code>---
- name: In&#x161;tal&#xE1;cia Nginx
  hosts: web
  become: yes
  tasks:
    - name: Nain&#x161;taluj nginx
      apt:
        name: nginx
        state: present
</code></pre><p>&#x1F50D; <strong>Vysvetlenie:</strong> Parameter <code>become: yes</code> znamen&#xE1;, &#x17E;e Ansible pou&#x17E;ije <code>sudo</code> na vykonanie &#xFA;loh s administr&#xE1;torsk&#xFD;mi pr&#xE1;vami.</p><h2 id="kedy-sa-oplat%C3%AD-pou%C5%BEi%C5%A5-ansible">Kedy sa oplat&#xED; pou&#x17E;i&#x165; Ansible?</h2><ul><li>Ak spravujete viac ako 1 server</li><li>Chcete ma&#x165; istotu, &#x17E;e v&#x161;etky maj&#xFA; rovnak&#xE9; nastavenie</li><li>Nasadzujete aplik&#xE1;cie, aktualiz&#xE1;cie alebo konfigur&#xE1;cie pravidelne</li><li>Chcete zn&#xED;&#x17E;i&#x165; po&#x10D;et &#x13E;udsk&#xFD;ch ch&#xFD;b</li></ul><h2 id="%C4%8Do-%C4%8Falej">&#x10C;o &#x10F;alej?</h2><p>Teraz, ke&#x10F; u&#x17E; vie&#x161; spusti&#x165; svoj prv&#xFD; playbook, m&#xF4;&#x17E;e&#x161; sk&#xFA;si&#x165; vytvori&#x165; jednoduch&#xFA; &#x161;trukt&#xFA;ru projektu:</p><pre><code>ansible/
&#x251C;&#x2500;&#x2500; inventory.ini
&#x251C;&#x2500;&#x2500; playbooks/
&#x2502;   &#x2514;&#x2500;&#x2500; web.yml
&#x2514;&#x2500;&#x2500; roles/
    &#x2514;&#x2500;&#x2500; nginx/
        &#x251C;&#x2500;&#x2500; tasks/main.yml
        &#x2514;&#x2500;&#x2500; templates/
</code></pre><p>V &#x10F;al&#x161;om &#x10D;l&#xE1;nku si uk&#xE1;&#x17E;eme, ako funguj&#xFA; <strong>premenn&#xE9;</strong>, <strong>&#x161;abl&#xF3;ny (Jinja2)</strong> a <strong>roles</strong> &#x2013; z&#xE1;kladn&#xE9; stavebn&#xE9; prvky v&#xE4;&#x10D;&#x161;&#xED;ch Ansible projektov.</p><p>Ak m&#xE1;&#x161; ot&#xE1;zky alebo chce&#x161; konkr&#xE9;tny pr&#xED;klad z tvojej infra&#x161;trukt&#xFA;ry, nap&#xED;&#x161; n&#xE1;m!</p>]]></content:encoded></item><item><title><![CDATA[Porovnanie AI IDE: Ktorý nástroj ti najviac zrýchli vývoj?]]></title><description><![CDATA[Prehľadné porovnanie AI IDE nástrojov (Copilot, Cursor, Codeium, Replit, CodeWhisperer) – výhody, nevýhody, bezpečnosť, modely a kedy ich použiť.]]></description><link>https://www.web-tech.sk/ai/ai-ai-ide-porovnanie-2025/</link><guid isPermaLink="false">67ecfc4ea702a60001e7212b</guid><category><![CDATA[ai]]></category><category><![CDATA[IDE]]></category><category><![CDATA[Produktivita]]></category><dc:creator><![CDATA[Michal Forbak]]></dc:creator><pubDate>Wed, 02 Apr 2025 09:00:00 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1591439657848-9f4b9ce436b9?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDV8fEFpJTIwaWRlfGVufDB8fHx8MTc0MzU4NDU1M3ww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<h2 id="%C3%BAvod">&#xDA;vod</h2><img src="https://images.unsplash.com/photo-1591439657848-9f4b9ce436b9?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDV8fEFpJTIwaWRlfGVufDB8fHx8MTc0MzU4NDU1M3ww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" alt="Porovnanie AI IDE: Ktor&#xFD; n&#xE1;stroj ti najviac zr&#xFD;chli v&#xFD;voj?"><p>AI n&#xE1;stroje na pomoc pri v&#xFD;voji sa stali be&#x17E;nou s&#xFA;&#x10D;as&#x165;ou pracovn&#xE9;ho prostredia program&#xE1;tora. Od automatick&#xE9;ho dop&#x13A;&#x148;ania k&#xF3;du cez refaktoring a&#x17E; po generovanie testov &#x2013; AI vie u&#x161;etri&#x165; desiatky hod&#xED;n pr&#xE1;ce. Pozreli sme sa na p&#xE4;&#x165; najpopul&#xE1;rnej&#x161;&#xED;ch n&#xE1;strojov, ktor&#xE9; s&#xFA; integrovan&#xE9; priamo do IDE alebo funguj&#xFA; ako samostatn&#xE9; prostredie:</p><ul><li>GitHub Copilot</li><li>Cursor</li><li>Codeium</li><li>Replit Ghostwriter</li><li>Amazon CodeWhisperer</li></ul><h2 id="github-copilot">GitHub Copilot</h2><p><strong>Pou&#x17E;itie:</strong> R&#xFD;chle dop&#x13A;&#x148;anie k&#xF3;du, generovanie funkci&#xED;, testov a dokument&#xE1;cie. Odpor&#xFA;&#x10D;ame pre v&#xFD;voj&#xE1;rov, ktor&#xED; pracuj&#xFA; s GitHub a chc&#xFA; univerz&#xE1;lne AI IDE.</p><p><strong>Model:</strong> Pou&#x17E;&#xED;va modely Codex (na b&#xE1;ze GPT-3 a nov&#x161;ie verzie zalo&#x17E;en&#xE9; na GPT-4 Turbo). Kontextov&#xE9; okno: a&#x17E; 8k tokenov. R&#xFD;chle, dobre tr&#xE9;novan&#xE9; na open-source repozit&#xE1;roch.</p><p><strong>V&#xFD;hody:</strong></p><ul><li>Skvel&#xE9; v&#xFD;sledky v re&#xE1;lnych projektoch.</li><li>V&#xFD;borne funguje v r&#xE1;mci GitHub ekosyst&#xE9;mu.</li><li>Dop&#x13A;&#x148;a aj koment&#xE1;re a dokument&#xE1;ciu.</li></ul><p><strong>Nev&#xFD;hody:</strong></p><ul><li>Ob&#x10D;asn&#xE9; halucin&#xE1;cie k&#xF3;du.</li><li>Vy&#x17E;aduje valid&#xE1;ciu v&#xFD;stupu.</li><li>Nedostato&#x10D;n&#xE9; pre &#x161;pecializovan&#xE9; frameworky.</li></ul><p><strong>Cena:</strong><br>$10/mesiac (individu&#xE1;lny pl&#xE1;n), $19/mesiac (enterprise). &#x160;tudenti a open-source v&#xFD;voj&#xE1;ri maj&#xFA; zdarma.</p><p><strong>Ochrana d&#xE1;t:</strong> K&#xF3;d je analyzovan&#xFD; iba ak je zapnut&#xE1; telemetria. Enterprise verzia pon&#xFA;ka izolovan&#xE9; prostredie.</p><p><strong>Nepou&#x17E;&#xED;vaj ak:</strong> Tvoj k&#xF3;d je vysoko citliv&#xFD; alebo propriet&#xE1;rny a nem&#xE1;&#x161; firemn&#xFD; pl&#xE1;n.</p><h2 id="cursor">Cursor</h2><p><strong>Pou&#x17E;itie:</strong> AI-enhanced IDE s prirodzen&#xFD;m pr&#xED;stupom ku k&#xF3;du. Umo&#x17E;&#x148;uje d&#xE1;va&#x165; pr&#xED;kazy ako &#x201E;vytiahni t&#xFA;to &#x10D;as&#x165; do funkcie&#x201C;.</p><p><strong>Model:</strong> Pou&#x17E;&#xED;va GPT-4 Turbo (OpenAI) alebo Claude 2 (Anthropic). Kontextov&#xE9; okno a&#x17E; 100k tokenov. V&#xFD;born&#xE9; na anal&#xFD;zu rozsiahlych projektov.</p><p><strong>V&#xFD;hody:</strong></p><ul><li>Vie pracova&#x165; s viacer&#xFD;mi s&#xFA;bormi naraz.</li><li>Pr&#xED;kazy v prirodzenom jazyku (napr. &#x201E;urob z tohto hook&#x201C;).</li><li>V&#xFD;born&#xFD; na refaktoring.</li></ul><p><strong>Nev&#xFD;hody:</strong></p><ul><li>Niektor&#xE9; funkcie dostupn&#xE9; len s vlastn&#xFD;m API k&#x13E;&#xFA;&#x10D;om.</li><li>Vy&#x17E;aduje viac u&#x10D;enia a zvykania.</li></ul><p><strong>Cena:</strong><br>Zadarmo s obmedzen&#xED;m, alebo vlastn&#xFD; OpenAI/Anthropic k&#x13E;&#xFA;&#x10D;. Premium verzia (10 &#x2013; 20 &#x20AC;/mesa&#x10D;ne).</p><p><strong>Ochrana d&#xE1;t:</strong> Nezdie&#x13E;a d&#xE1;ta bez tvojho s&#xFA;hlasu. Lok&#xE1;lne ukladanie a volanie modelov cez tvoj k&#x13E;&#xFA;&#x10D;.</p><p><strong>Nepou&#x17E;&#xED;vaj ak:</strong> H&#x13E;ad&#xE1;&#x161; jednoduch&#xE9; rie&#x161;enie bez nutnosti nastavovania.</p><h2 id="codeium">Codeium</h2><p><strong>Pou&#x17E;itie:</strong> Bezplatn&#xE1; alternat&#xED;va k Copilot pre automatick&#xE9; dop&#x13A;&#x148;anie k&#xF3;du.</p><p><strong>Model:</strong> Vlastn&#xFD; LLM model, tr&#xE9;novan&#xFD; na open-source k&#xF3;de. Kontextov&#xE9; okno: pribli&#x17E;ne 4&#x2013;8k tokenov.</p><p><strong>V&#xFD;hody:</strong></p><ul><li>Zadarmo.</li><li>Podpora &#x161;irok&#xE9;ho spektra jazykov.</li><li>Funguje vo v&#xE4;&#x10D;&#x161;ine IDE.</li></ul><p><strong>Nev&#xFD;hody:</strong></p><ul><li>Menej presn&#xFD; pri komplexnom k&#xF3;de.</li><li>Slab&#x161;ia podpora frameworkov a testovania.</li></ul><p><strong>Cena:</strong><br>&#xDA;plne zadarmo (aj pre t&#xED;my).</p><p><strong>Ochrana d&#xE1;t:</strong> D&#xE1; sa pou&#x17E;i&#x165; lok&#xE1;lne bez posielania d&#xE1;t. Bez telemetrie v bezpe&#x10D;nostnom re&#x17E;ime.</p><p><strong>Nepou&#x17E;&#xED;vaj ak:</strong> Potrebuje&#x161; pokro&#x10D;il&#xE9; generovanie testov alebo AI diskusiu nad k&#xF3;dom.</p><h2 id="replit-ghostwriter">Replit Ghostwriter</h2><p><strong>Pou&#x17E;itie:</strong> R&#xFD;chle prototypovanie a u&#x10D;enie sa k&#xF3;du v prehliada&#x10D;i.</p><p><strong>Model:</strong> Pou&#x17E;&#xED;va modely od OpenAI (star&#x161;ie Codex/GPT-3.5). Kontextov&#xE9; okno: 4&#x2013;8k tokenov.</p><p><strong>V&#xFD;hody:</strong></p><ul><li>Funguje hne&#x10F; v browseri.</li><li>Automatick&#xE9; nastavenie prostredia.</li><li>Ide&#xE1;lne na r&#xFD;chle experimenty.</li></ul><p><strong>Nev&#xFD;hody:</strong></p><ul><li>Obmedzen&#xE9; mo&#x17E;nosti pri zlo&#x17E;itej&#x161;&#xED;ch projektoch.</li><li>V&#xFD;kon z&#xE1;vis&#xED; od predplatn&#xE9;ho.</li></ul><p><strong>Cena:</strong><br>$10/mesiac (Pro pl&#xE1;n s Ghostwriterom).</p><p><strong>Ochrana d&#xE1;t:</strong> K&#xF3;d be&#x17E;&#xED; na cloud serveroch Replit. Nevhodn&#xE9; pre uzavret&#xE9; projekty bez firemn&#xFD;ch zml&#xFA;v.</p><p><strong>Nepou&#x17E;&#xED;vaj ak:</strong> Pracuje&#x161; s citliv&#xFD;m k&#xF3;dom alebo v korpor&#xE1;tnom prostred&#xED;.</p><h2 id="amazon-codewhisperer">Amazon CodeWhisperer</h2><p><strong>Pou&#x17E;itie:</strong> V&#xFD;voj v AWS ekosyst&#xE9;me, napr. Lambda, API Gateway, DynamoDB.</p><p><strong>Model:</strong> Fine-tuned LLM tr&#xE9;novan&#xFD; Amazonom. Kontextov&#xE9; okno: pribli&#x17E;ne 8k tokenov. Optimalizovan&#xE9; na AWS SDK a CLI.</p><p><strong>V&#xFD;hody:</strong></p><ul><li>Generuje k&#xF3;d &#x161;pecifick&#xFD; pre AWS slu&#x17E;by.</li><li>Podporuje bezpe&#x10D;nostn&#xE9; skenovanie.</li></ul><p><strong>Nev&#xFD;hody:</strong></p><ul><li>Slab&#xE1; podpora mimo AWS.</li><li>Men&#x161;ia komunita a menej zdrojov.</li></ul><p><strong>Cena:</strong><br>Zadarmo pre jednotlivcov. $19/mesa&#x10D;ne pre profesion&#xE1;lne pou&#x17E;itie.</p><p><strong>Ochrana d&#xE1;t:</strong> K&#xF3;d sa analyzuje lok&#xE1;lne. Enterprise verzia umo&#x17E;&#x148;uje kontrolu a audit.</p><p><strong>Nepou&#x17E;&#xED;vaj ak:</strong> Nepou&#x17E;&#xED;va&#x161; AWS alebo potrebuje&#x161; univerz&#xE1;lne rie&#x161;enie.</p><h2 id="z%C3%A1ver-ktor%C3%A9-ai-ide-si-vybra%C5%A5">Z&#xE1;ver: Ktor&#xE9; AI IDE si vybra&#x165;?</h2><!--kg-card-begin: html--><table>
<thead><tr><th>Potreba</th><th>Odpor&#xFA;&#x10D;an&#xFD; n&#xE1;stroj</th></tr></thead>
<tbody>
<tr><td>Univerz&#xE1;lne dop&#x13A;&#x148;anie + GitHub</td><td>GitHub Copilot</td></tr>
<tr><td>Refaktoring, komplexn&#xE9; &#xFA;pravy</td><td>Cursor</td></tr>
<tr><td>Bezplatn&#xE9; dop&#x13A;&#x148;anie</td><td>Codeium</td></tr>
<tr><td>Prototypovanie bez in&#x161;tal&#xE1;cie</td><td>Replit Ghostwriter</td></tr>
<tr><td>AWS v&#xFD;voj</td><td>Amazon CodeWhisperer</td></tr>
</tbody>
</table><!--kg-card-end: html--><p><strong>AI nie je len pomocn&#xED;k &#x2013; je to re&#xE1;lny katalyz&#xE1;tor produktivity.</strong> Ale ako pri ka&#x17E;dej technol&#xF3;gii, d&#xF4;le&#x17E;it&#xE9; je vedie&#x165;, kde jej hranice s&#xFA; &#x2013; a ako s nimi pracova&#x165; bezpe&#x10D;ne a efekt&#xED;vne.</p>]]></content:encoded></item><item><title><![CDATA[GitHub Actions: Automatizuj svoj workflow jednoducho a zadarmo]]></title><description><![CDATA[GitHub Actions ti umožní automatizovať testy, buildy a deploye priamo v GitHube – bez nutnosti ďalších nástrojov. Začni jednoducho!]]></description><link>https://www.web-tech.sk/github/github-github-actions-workflow-zaklady/</link><guid isPermaLink="false">67ecf143a702a60001e7211d</guid><category><![CDATA[GitHub]]></category><category><![CDATA[DevOps]]></category><category><![CDATA[CI/CD]]></category><dc:creator><![CDATA[Michal Forbak]]></dc:creator><pubDate>Wed, 02 Apr 2025 08:00:00 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1618401479427-c8ef9465fbe1?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDF8fGdpdGh1YnxlbnwwfHx8fDE3NDM1ODE2NDB8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<h2 id="%C4%8Do-je-github-actions">&#x10C;o je GitHub Actions?</h2><img src="https://images.unsplash.com/photo-1618401479427-c8ef9465fbe1?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDF8fGdpdGh1YnxlbnwwfHx8fDE3NDM1ODE2NDB8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" alt="GitHub Actions: Automatizuj svoj workflow jednoducho a zadarmo"><p>GitHub Actions je vstavan&#xFD; n&#xE1;stroj v GitHube, ktor&#xFD; ti umo&#x17E;n&#xED; automatizova&#x165; r&#xF4;zne &#x10D;innosti priamo v repozit&#xE1;ri. M&#xF4;&#x17E;e&#x161; napr&#xED;klad automaticky:</p><ul><li>spusti&#x165; testy pri ka&#x17E;dom pushe,</li><li>buildn&#xFA;&#x165; aplik&#xE1;ciu pri pull requeste,</li><li>deployn&#xFA;&#x165; web na server alebo GitHub Pages,</li><li>skontrolova&#x165; &#x161;tylistiku k&#xF3;du (lintovanie).</li></ul><h2 id="strukt%C3%BAra-github-actions">Strukt&#xFA;ra GitHub Actions</h2><p>V&#x161;etko sa nastavuje v adres&#xE1;ri <code>.github/workflows</code>, kde ka&#x17E;d&#xFD; YAML s&#xFA;bor definuje jeden &#x201E;workflow&#x201C; &#x2013; teda automatizovan&#xFD; proces.</p><h3 id="prv%C3%BD-workflow-hello-world">Prv&#xFD; workflow: Hello world</h3><p>Vytvor s&#xFA;bor <code>.github/workflows/hello.yml</code> s t&#xFD;mto obsahom:</p><pre><code>name: Hello workflow

on: [push]

jobs:
  say-hello:
    runs-on: ubuntu-latest
    steps:
      - name: Pozdrav
        run: echo &quot;Ahoj svet z GitHub Actions!&quot;
</code></pre><p>Tento workflow sa spust&#xED; pri ka&#x17E;dom <strong>pushnut&#xED;</strong> do repozit&#xE1;ra a vyp&#xED;&#x161;e spr&#xE1;vu do logu.</p><h2 id="testovanie-nodejs-projektu">Testovanie Node.js projektu</h2><pre><code>name: Node CI

on:
  push:
    branches: [ main ]

jobs:
  test:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v3
      - name: Nastavenie Node.js
        uses: actions/setup-node@v3
        with:
          node-version: &apos;18&apos;
      - run: npm ci
      - run: npm test
</code></pre><p>Tento workflow:</p><ul><li>na&#x10D;&#xED;ta repozit&#xE1;r,</li><li>nain&#x161;taluje Node.js,</li><li>spust&#xED; testy cez <code>npm test</code>.</li></ul><h2 id="deploy-na-github-pages">Deploy na GitHub Pages</h2><p>Pou&#x17E;i napr&#xED;klad tento ofici&#xE1;lny action pre nasadenie statick&#xE9;ho webu:</p><pre><code>name: Deploy to GitHub Pages

on:
  push:
    branches:
      - main

permissions:
  contents: read
  pages: write
  id-token: write

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - uses: actions/configure-pages@v3
      - uses: actions/upload-pages-artifact@v2
        with:
          path: ./build
      - uses: actions/deploy-pages@v2
</code></pre><p>Nezabudni ma&#x165; v repozit&#xE1;ri zapnut&#xFD; GitHub Pages a buildnut&#xFD; obsah v <code>./build</code>.</p><h2 id="tipy-a-odladenie-workflowov">Tipy a odladenie workflowov</h2><ul><li>Sleduj logy v sekcii &#x201E;Actions&#x201C; &#x2013; ka&#x17E;d&#xE1; chyba je tam pekne pop&#xED;san&#xE1;.</li><li>M&#xF4;&#x17E;e&#x161; si workflow spusti&#x165; aj ru&#x10D;ne pomocou <code>workflow_dispatch</code>.</li><li>Workflow vie&#x161; obmedzi&#x165; na konkr&#xE9;tny prie&#x10D;inok alebo s&#xFA;bory.</li></ul><h2 id="z%C3%A1ver">Z&#xE1;ver</h2><p>GitHub Actions ti v&#xFD;razne u&#x13E;ah&#x10D;&#xED; &#x17E;ivot. Nemus&#xED;&#x161; ma&#x165; extern&#xFD; CI n&#xE1;stroj &#x2013; v&#x161;etko be&#x17E;&#xED; priamo v tvojom GitHub repozit&#xE1;ri. U&#x17E; aj s free &#xFA;&#x10D;tom dostane&#x161; 2 000 min&#xFA;t mesa&#x10D;ne.</p><p>V &#x10F;al&#x161;om &#x10D;l&#xE1;nku si uk&#xE1;&#x17E;eme napr&#xED;klad <strong>ako nasadi&#x165; WordPress plugin alebo Node.js appku na server cez SSH.</strong></p>]]></content:encoded></item><item><title><![CDATA[Optimalizácia CI/CD pipeline v GitLabe: Cache, paralelizácia a build artefakty]]></title><description><![CDATA[Zrýchli svoju GitLab pipeline pomocou cache, paralelných jobov a efektívneho delenia krokov.]]></description><link>https://www.web-tech.sk/gitlab/gitlab-pipelines-optimalizacia/</link><guid isPermaLink="false">67e3056ce1fdbe0001fda3ad</guid><category><![CDATA[GitLab]]></category><category><![CDATA[DevOps]]></category><category><![CDATA[CI/CD]]></category><dc:creator><![CDATA[Michal Forbak]]></dc:creator><pubDate>Tue, 25 Mar 2025 19:51:00 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1435575653489-b0873ec954e2?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDh8fGJ1aWxkfGVufDB8fHx8MTc0MjkzMjM3MHww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1435575653489-b0873ec954e2?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDh8fGJ1aWxkfGVufDB8fHx8MTc0MjkzMjM3MHww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" alt="Optimaliz&#xE1;cia CI/CD pipeline v GitLabe: Cache, paraleliz&#xE1;cia a build artefakty"><p>V predch&#xE1;dzaj&#xFA;com &#x10D;l&#xE1;nku sme si uk&#xE1;zali, ako postavi&#x165; z&#xE1;kladn&#xFA; GitLab CI/CD pipeline s E2E testami. Teraz sa pozrieme na to, ako ju <strong>zr&#xFD;chli&#x165; a zefekt&#xED;vni&#x165;</strong> pomocou cache, artefaktov a paraleln&#xE9;ho sp&#xFA;&#x161;&#x165;ania jobov.</p><h2 id="%F0%9F%9A%80-pre%C4%8Do-optimalizova%C5%A5-pipeline">&#x1F680; Pre&#x10D;o optimalizova&#x165; pipeline?</h2><ul><li>&#x23F1; Menej &#x10D;akania = r&#xFD;chlej&#x161;ia sp&#xE4;tn&#xE1; v&#xE4;zba pre v&#xFD;voj&#xE1;rov</li><li>&#x1F504; Men&#x161;&#xED; v&#xFD;po&#x10D;tov&#xFD; &#x10D;as = &#xFA;spora CI min&#xFA;t a zdrojov</li><li>&#x1F50D; Menej &#x201E;zbyto&#x10D;n&#xFD;ch&#x201C; krokov = lep&#x161;ia &#x10D;itate&#x13E;nos&#x165; a udr&#x17E;iavate&#x13E;nos&#x165; pipeline</li></ul><h2 id="%F0%9F%93%A6-pou%C5%BEitie-cache-v-gitlabe">&#x1F4E6; Pou&#x17E;itie cache v GitLabe</h2><p>Cache umo&#x17E;&#x148;uje uchova&#x165; si s&#xFA;bory medzi r&#xF4;znymi spusteniami pipeline &#x2013; typicky <code>node_modules</code> alebo buildy.</p><pre><code>cache:
  key: ${CI_COMMIT_REF_SLUG}
  paths:
    - node_modules/</code></pre><p>&#x1F4A1; <strong>Pozor:</strong> Cache sa spr&#xE1;va inak ako artifacts &#x2013; je zdie&#x13E;an&#xE1; medzi jobmi a behmi.</p><h2 id="%F0%9F%93%81-artifacts-%E2%80%93-prenos-s%C3%BAborov-medzi-jobmi">&#x1F4C1; Artifacts &#x2013; prenos s&#xFA;borov medzi jobmi</h2><p>Ak chce&#x161;, aby v&#xFD;stup z jedn&#xE9;ho jobu (napr. build) bol dostupn&#xFD; v &#x10F;al&#x161;om (napr. testy), pou&#x17E;i <code>artifacts</code>:</p><pre><code>build:
  stage: build
  script:
    - npm run build
  artifacts:
    paths:
      - dist/</code></pre><p>Potom sa <code>dist/</code> automaticky prenesie do &#x10F;al&#x161;ieho jobu, ak je v &#x10F;al&#x161;om stage.</p><h2 id="%F0%9F%A7%B5-paraleliz%C3%A1cia-jobov">&#x1F9F5; Paraleliz&#xE1;cia jobov</h2><p>GitLab pipeline be&#x17E;&#xED; po stage-och. V r&#xE1;mci ka&#x17E;d&#xE9;ho stage m&#xF4;&#x17E;e&#x161; spusti&#x165; viacero jobov naraz:</p><pre><code>stages:
  - test

test:unit:
  stage: test
  script:
    - npm run test:unit

test:lint:
  stage: test
  script:
    - npm run lint</code></pre><p>Tieto dva joby sa spustia s&#xFA;be&#x17E;ne &#x2013; ak m&#xE1;&#x161; runner s dostato&#x10D;nou kapacitou.</p><h2 id="%F0%9F%A7%A0-tipy-pre-optimaliz%C3%A1ciu">&#x1F9E0; Tipy pre optimaliz&#xE1;ciu</h2><ul><li>Rozde&#x13E; testy do viacer&#xFD;ch jobov (unit, e2e, lint...)</li><li>Nepou&#x17E;&#xED;vaj <code>npm install</code> zbyto&#x10D;ne v ka&#x17E;dom kroku &#x2013; kombinuj cache a artifacts</li><li>Pre dlh&#xE9; buildy pou&#x17E;i <code>only: changes</code> &#x2013; napr. buildova&#x165; iba pri zmene frontendu</li></ul><h2 id="%F0%9F%A7%A9-bonus-merge-request-pipelines">&#x1F9E9; Bonus: merge request pipelines</h2><p>M&#xF4;&#x17E;e&#x161; sp&#xFA;&#x161;&#x165;a&#x165; pipeline len pre MR a PR:</p><pre><code>only:
  - merge_requests</code></pre><p>Pom&#xE1;ha to odl&#xED;&#x161;i&#x165; v&#xFD;vojov&#xE9; a produk&#x10D;n&#xE9; nasadenia.</p><h2 id="%F0%9F%A7%BE-z%C3%A1ver">&#x1F9FE; Z&#xE1;ver</h2><p>Ak CI pipeline trv&#xE1; 15+ min&#xFA;t, v&#xFD;voj&#xE1;ri za&#x10D;n&#xFA; str&#xE1;ca&#x165; pozornos&#x165;. Optimaliz&#xE1;cia pomocou cache, artefaktov a paraleliz&#xE1;cie ti m&#xF4;&#x17E;e u&#x161;etri&#x165; min&#xFA;ty pri ka&#x17E;dom commite &#x2013; &#x10D;o sa pri akt&#xED;vnom t&#xED;me n&#xE1;sob&#xED; ka&#x17E;d&#xFD; de&#x148;.</p><p>V &#x10F;al&#x161;om &#x10D;l&#xE1;nku si uk&#xE1;&#x17E;eme, ako vytvori&#x165; samostatn&#xFD; stage pre nasadenie (napr. na Vercel, Firebase alebo VPS) a ako pou&#x17E;i&#x165; schva&#x13E;ovanie deployov.</p>]]></content:encoded></item><item><title><![CDATA[CI/CD v GitLabe a end-to-end testy: Ako ich zaviesť vo vlastnom projekte]]></title><description><![CDATA[GitLab CI/CD a Cypress: Príklad pipeline, integrácia, tipy a vysvetlenie E2E testovania.]]></description><link>https://www.web-tech.sk/devops/gitlab-pipelines-e2e-testy/</link><guid isPermaLink="false">67e303a1e1fdbe0001fda39d</guid><category><![CDATA[DevOps]]></category><category><![CDATA[GitLab]]></category><category><![CDATA[Testovanie]]></category><dc:creator><![CDATA[Michal Forbak]]></dc:creator><pubDate>Tue, 25 Mar 2025 18:45:00 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1441802763029-b621005a04a5?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDZ8fHBpcGV8ZW58MHx8fHwxNzQyODQyMzY1fDA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1441802763029-b621005a04a5?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDZ8fHBpcGV8ZW58MHx8fHwxNzQyODQyMzY1fDA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" alt="CI/CD v GitLabe a end-to-end testy: Ako ich zavies&#x165; vo vlastnom projekte"><p>Automatiz&#xE1;cia je dnes nevyhnutnou s&#xFA;&#x10D;as&#x165;ou ka&#x17E;d&#xE9;ho modern&#xE9;ho v&#xFD;vojov&#xE9;ho procesu. V tomto &#x10D;l&#xE1;nku si uk&#xE1;&#x17E;eme, ako nastavi&#x165; CI/CD pipelines v <strong>GitLabe</strong> a ako do nich integrova&#x165; <strong>end-to-end (E2E) testy</strong> napr&#xED;klad pomocou Cypressu.</p><h2 id="%E2%9A%99%EF%B8%8F-%C4%8Do-je-cicd-pipeline">&#x2699;&#xFE0F; &#x10C;o je CI/CD pipeline?</h2><p><strong>CI (Continuous Integration)</strong> = ka&#x17E;d&#xE1; zmena k&#xF3;du sa automaticky otestuje a priprav&#xED; na nasadenie.<br><strong>CD (Continuous Delivery / Deployment)</strong> = po schv&#xE1;len&#xED; (alebo automaticky) sa nov&#xFD; k&#xF3;d nasad&#xED; do produkcie alebo stagingu.</p><p>GitLab umo&#x17E;&#x148;uje vytv&#xE1;ra&#x165; pipelines pomocou s&#xFA;boru <code>.gitlab-ci.yml</code>, ktor&#xFD; definuje jednotliv&#xE9; kroky (joby).</p><h2 id="%F0%9F%93%84-pr%C3%ADklad-gitlab-ciyml-pre-javascript-projekt">&#x1F4C4; Pr&#xED;klad .gitlab-ci.yml pre JavaScript projekt</h2><pre><code>stages:
  - install
  - test
  - e2e

install:
  stage: install
  image: node:18
  script:
    - npm install
  artifacts:
    paths:
      - node_modules/

test:
  stage: test
  image: node:18
  script:
    - npm run test

e2e:
  stage: e2e
  image: cypress/browsers:node18.12.0-chrome107-ff107
  script:
    - npm run start &amp;
    - npx wait-on http://localhost:3000
    - npx cypress run
</code></pre><p>V tomto pr&#xED;klade prebiehaj&#xFA; 3 f&#xE1;zy:</p><ul><li><strong>install</strong> &#x2013; nain&#x161;taluje z&#xE1;vislosti</li><li><strong>test</strong> &#x2013; spust&#xED; unit testy</li><li><strong>e2e</strong> &#x2013; spust&#xED; lok&#xE1;lny dev server a n&#xE1;sledne Cypress testy</li></ul><h2 id="%F0%9F%94%8D-%C4%8Do-s%C3%BA-e2e-testy-a-pre%C4%8Do-s%C3%BA-d%C3%B4le%C5%BEit%C3%A9">&#x1F50D; &#x10C;o s&#xFA; E2E testy a pre&#x10D;o s&#xFA; d&#xF4;le&#x17E;it&#xE9;?</h2><p><strong>End-to-end testy</strong> simuluj&#xFA; spr&#xE1;vanie re&#xE1;lneho pou&#x17E;&#xED;vate&#x13E;a &#x2013; klikaj&#xFA;, vyp&#x13A;&#x148;aj&#xFA; formul&#xE1;re, sleduj&#xFA; reakcie UI.</p><p>Pom&#xE1;haj&#xFA; zachyti&#x165; chyby, ktor&#xE9; by unit testy nikdy neodhalili &#x2013; napr&#xED;klad zl&#xE9; prepojenie komponentov alebo nefunk&#x10D;n&#xFD; JavaScript po refaktoringu.</p><h2 id="%F0%9F%9A%80-integr%C3%A1cia-cypressu-do-projektu">&#x1F680; Integr&#xE1;cia Cypressu do projektu</h2><ol><li><code>npm install cypress --save-dev</code></li><li>Prida&#x165; do <code>package.json</code>:</li></ol><pre><code>&quot;scripts&quot;: {
  &quot;e2e&quot;: &quot;cypress open&quot;,
  &quot;test&quot;: &quot;cypress run&quot;
}</code></pre><ol><li>Vytvori&#x165; prie&#x10D;inok <code>cypress/e2e/</code> a prv&#xFD; test:</li></ol><pre><code>describe(&apos;Hlavn&#xE1; str&#xE1;nka&apos;, () =&gt; {
  it(&apos;obsahuje nadpis&apos;, () =&gt; {
    cy.visit(&apos;/&apos;)
    cy.contains(&apos;Vitajte&apos;)
  })
})</code></pre><h2 id="%F0%9F%93%A6-tipy-pre-r%C3%BDchlej%C5%A1ie-a-stabilnej%C5%A1ie-pipelines">&#x1F4E6; Tipy pre r&#xFD;chlej&#x161;ie a stabilnej&#x161;ie pipelines</h2><ul><li>Pou&#x17E;&#xED;vaj <code>artifacts</code> &#x2013; zachov&#xE1;&#x161; buildy medzi krokmi</li><li>Vy&#x10D;le&#x148;uj E2E testy do samostatnej f&#xE1;zy &#x2013; r&#xFD;chlej&#x161;&#xED; feedback</li><li>Pridaj cache pre <code>node_modules</code> &#x2013; v&#xFD;razne zr&#xFD;chli CI</li><li>Monitoruj flakiness testov &#x2013; Cypress m&#xE1; dashboard aj retry mechanizmy</li></ul><h2 id="%F0%9F%A7%A0-z%C3%A1ver">&#x1F9E0; Z&#xE1;ver</h2><p>CI/CD pipelines v GitLabe ti umo&#x17E;nia automaticky testova&#x165; a nasadzova&#x165; projekt. E2E testy s&#xFA; d&#xF4;le&#x17E;it&#xFD;m krokom na zachytenie ch&#xFD;b z poh&#x13E;adu pou&#x17E;&#xED;vate&#x13E;a. Aj ke&#x10F; spo&#x10D;iatku p&#xF4;sobia zlo&#x17E;ito, ich pr&#xED;nos pri udr&#x17E;iavan&#xED; kvality projektu je obrovsk&#xFD;.</p><p>V &#x10F;al&#x161;om &#x10D;l&#xE1;nku si uk&#xE1;&#x17E;eme, ako rozdeli&#x165; pipeline na paraleln&#xE9; joby a ako pou&#x17E;i&#x165; GitLab cache na zr&#xFD;chlenie buildov.</p>]]></content:encoded></item><item><title><![CDATA[Ako si vytvoriť vlastný web vo WordPresse (krok za krokom pre úplného začiatočníka)]]></title><description><![CDATA[Kompletný návod pre úplného začiatočníka: doména, hosting, databáza a WordPress krok za krokom.]]></description><link>https://www.web-tech.sk/wordpress/wordpress-instalacia-od-zaciatku/</link><guid isPermaLink="false">67e2e4b2e1fdbe0001fda24a</guid><category><![CDATA[WordPress]]></category><category><![CDATA[Začiatočníci]]></category><category><![CDATA[Inštalácia]]></category><category><![CDATA[hosting]]></category><dc:creator><![CDATA[Michal Forbak]]></dc:creator><pubDate>Tue, 25 Mar 2025 18:41:00 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1432888498266-38ffec3eaf0a?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDM4fHx3ZWIlMjBqdW5pb3J8ZW58MHx8fHwxNzQyOTI1MzA4fDA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1432888498266-38ffec3eaf0a?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDM4fHx3ZWIlMjBqdW5pb3J8ZW58MHx8fHwxNzQyOTI1MzA4fDA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" alt="Ako si vytvori&#x165; vlastn&#xFD; web vo WordPresse (krok za krokom pre &#xFA;pln&#xE9;ho za&#x10D;iato&#x10D;n&#xED;ka)"><p>M&#xE1;&#x161; n&#xE1;pad na blog, podnikanie alebo projekt, ale nevie&#x161;, kde za&#x10D;a&#x165;? Tento n&#xE1;vod je pre teba. Vysvetl&#xED;me si &#xFA;plne od nuly, &#x10D;o je to web, &#x10D;o potrebuje&#x161;, ako si k&#xFA;pi&#x165; dom&#xE9;nu, hosting a nain&#x161;talova&#x165; WordPress &#x2013; najpopul&#xE1;rnej&#x161;&#xED; syst&#xE9;m na tvorbu webov na svete.</p><p><strong>Nepo&#x10D;&#xED;ta sa so &#x17E;iadnymi predch&#xE1;dzaj&#xFA;cimi znalos&#x165;ami.</strong></p><h2 id="1-%C4%8Do-je-dom%C3%A9na-%C4%8Do-je-hosting-a-pre%C4%8Do-ich-potrebuje%C5%A1">1. &#x10C;o je dom&#xE9;na, &#x10D;o je hosting a pre&#x10D;o ich potrebuje&#x161;</h2><h3 id="dom%C3%A9na">Dom&#xE9;na:</h3><ul><li>je adresa tvojho webu &#x2013; napr. <code>fashion-partner.eu</code></li><li>&#x13E;udia ju zad&#xE1;vaj&#xFA; do prehliada&#x10D;a, aby sa dostali na tvoju str&#xE1;nku</li><li>dom&#xE9;nu si &#x201E;prenaj&#xED;ma&#x161;&#x201C; &#x2013; napr. na 1 rok</li></ul><h3 id="hosting">Hosting:</h3><ul><li>je miesto, kde bude ulo&#x17E;en&#xFD; tvoj web</li><li>funguje ako po&#x10D;&#xED;ta&#x10D;, ktor&#xFD; je nonstop pripojen&#xFD; k internetu</li><li>zobraz&#xED; tvoj web ka&#x17E;d&#xE9;mu, kto pr&#xED;de na tvoju dom&#xE9;nu</li></ul><p><strong>Pre&#x10D;o potrebuje&#x161; oboje?</strong><br>Dom&#xE9;na = adresa. Hosting = obsah. Jedno bez druh&#xE9;ho nefunguje.</p><h2 id="2-odpor%C3%BA%C4%8Dan%C3%BD-hosting-pre-za%C4%8Diato%C4%8Dn%C3%ADkov-hostcreators">2. Odpor&#xFA;&#x10D;an&#xFD; hosting pre za&#x10D;iato&#x10D;n&#xED;kov: HostCreators</h2><p><a href="https://www.hostcreators.sk?affil=xoJR4sIP">HostCreators.sk</a> je slovensk&#xFD; poskytovate&#x13E;, ktor&#xE9;ho m&#xF4;&#x17E;em odporu&#x10D;i&#x165; pre:</p><ul><li>jednoduch&#xFA; spr&#xE1;vu</li><li>spo&#x13E;ahlivos&#x165; a r&#xFD;chlos&#x165;</li><li>lok&#xE1;lnu podporu</li><li>WordPress optimaliz&#xE1;ciu</li><li>SSL v cene hostingu</li><li>technol&#xF3;gie, ktor&#xE9; inde nen&#xE1;jde&#x161; (SSH, REDIS, automatick&#xFD; deploy z GitHub repozit&#xE1;rov)</li></ul><blockquote class="kg-blockquote-alt">&#x1F4B0; Z&#x13E;ava: Ak pri objedn&#xE1;vke zad&#xE1;&#x161; k&#xF3;d <strong>xoJR4sIP</strong>, z&#xED;ska&#x161; 10 % z&#x13E;avu na prv&#xFD; rok.</blockquote><h2 id="3-objednanie-dom%C3%A9ny-a-hostingu">3. Objednanie dom&#xE9;ny a hostingu</h2><ol><li>Nav&#x161;t&#xED;v web <a href="https://www.hostcreators.sk?affil=xoJR4sIP">hostcreators.sk</a></li><li>Vyber si n&#xE1;zov dom&#xE9;ny (napr. <code>fashion-partner.eu</code>)</li><li>Pridaj ju do ko&#x161;&#xED;ka spolu s hostingov&#xFD;m bal&#xED;kom</li><li>Zadaj z&#x13E;avov&#xFD; k&#xF3;d <code>xoJR4sIP</code></li><li>Dokon&#x10D;i objedn&#xE1;vku a zapla&#x165;</li></ol><figure class="kg-card kg-image-card"><img src="https://res-2.cloudinary.com/wtsvk/image/upload/q_auto/v1/www.web-tech.sk/2025/03/image.png" class="kg-image" alt="Ako si vytvori&#x165; vlastn&#xFD; web vo WordPresse (krok za krokom pre &#xFA;pln&#xE9;ho za&#x10D;iato&#x10D;n&#xED;ka)" loading="lazy" width="1676" height="1148"></figure><h2 id="4-zapnutie-ssl">4. Zapnutie SSL</h2><p><strong>SSL</strong> (Secure Sockets Layer) je bezpe&#x10D;nostn&#xE1; technol&#xF3;gia, ktor&#xE1; zabezpe&#x10D;uje <strong>&#x161;ifrovan&#xE9; spojenie</strong> medzi n&#xE1;v&#x161;tevn&#xED;kom a tvojou webstr&#xE1;nkou.</p><p>&#x1F9E0; <strong>Pre&#x10D;o by si mal SSL aktivova&#x165;?</strong></p><ol><li><strong>Bezpe&#x10D;nos&#x165; d&#xE1;t. </strong>SSL &#x161;ifruje v&#x161;etky d&#xE1;ta, ktor&#xE9; n&#xE1;v&#x161;tevn&#xED;k zad&#xE1;va (napr. kontaktn&#xFD; formul&#xE1;r, prihlasovanie, hesl&#xE1;), chr&#xE1;ni pred &#xFA;tokmi typu &#x201E;man-in-the-middle&#x201C;, kde by &#xFA;to&#x10D;n&#xED;k mohol odchyt&#xE1;va&#x165; &#xFA;daje</li><li><strong>D&#xF4;veryhodnos&#x165; pre n&#xE1;v&#x161;tevn&#xED;kov. </strong>Prehliada&#x10D;e bez SSL ozna&#x10D;uj&#xFA; str&#xE1;nky ako <strong>&#x201E;nebezpe&#x10D;n&#xE9;&#x201C;. </strong>Zelen&#xFD; z&#xE1;mok v prehliada&#x10D;i zvy&#x161;uje <strong>d&#xF4;veru</strong>, hlavne ak zbiera&#x161; &#xFA;daje alebo pred&#xE1;va&#x161; produkty</li><li><strong>Lep&#x161;ie SEO. </strong>Google zv&#xFD;hod&#x148;uje HTTPS str&#xE1;nky vo v&#xFD;sledkoch vyh&#x13E;ad&#xE1;vania (je to ofici&#xE1;lny ranking faktor)</li><li><strong>Kompatibilita s modern&#xFD;mi webov&#xFD;mi funkciami. </strong>Niektor&#xE9; funkcie prehliada&#x10D;ov (napr. geolok&#xE1;cia, notifik&#xE1;cie, Web Push) funguj&#xFA; len na HTTPS str&#xE1;nkach</li><li><strong>GDPR a ochrana s&#xFA;kromia. </strong>&#x160;ifrovan&#xE1; komunik&#xE1;cia pom&#xE1;ha naplni&#x165; z&#xE1;konn&#xE9; po&#x17E;iadavky na ochranu osobn&#xFD;ch &#xFA;dajov</li></ol><p>&#x1F6E0; <strong>Ako SSL aktivova&#x165;?</strong></p><ol><li>Prejde&#x161; na web <a href="https://www.hostcreators.sk?affil=xoJR4sIP">hostcreators.sk</a></li><li>Vpravo hore n&#xE1;jde&#x161; odkaz &quot;WebAdmin&quot;</li><li>Po prihl&#xE1;sen&#xED; klikne&#x161; svoju novo-zaregistrovan&#xFA; dom&#xE9;nu</li><li>V nastaveniach vyberie&#x161; <strong>&#x201E;SSL&#x201C;</strong> a nastav&#xED;&#x161; pod&#x13E;a &#xFA;k&#xE1;&#x17E;ky ni&#x17E;&#x161;ie</li><li>N&#xE1;sledne je e&#x161;te potrebne vojs&#x165; do <strong>&#x201E;nastavenia webu&#x201C;</strong> a zapnu&#x165; mo&#x17E;nost <strong>&#x201E;Presmerova&#x165; na HTTPS&#x201C;</strong></li><li>Po zmene nastaven&#xED; nezabudni trochu dole zoscrollova&#x165; a kliknu&#x165; na tla&#x10D;itko <strong>&#x201E;ULO&#x17D;I&#x164;&#x201C;</strong></li><li>Od tohto momentu je komunik&#xE1;cia medzi webovou str&#xE1;nkou a n&#xE1;v&#x161;tevn&#xED;kom plne zabezpe&#x10D;en&#xE1; &#x1F973;</li></ol><figure class="kg-card kg-image-card"><img src="https://res-2.cloudinary.com/wtsvk/image/upload/q_auto/v1/www.web-tech.sk/2025/03/Sni-mek-obrazovky-2025-03-25-v-19.09.46.png" class="kg-image" alt="Ako si vytvori&#x165; vlastn&#xFD; web vo WordPresse (krok za krokom pre &#xFA;pln&#xE9;ho za&#x10D;iato&#x10D;n&#xED;ka)" loading="lazy" width="3024" height="814"></figure><figure class="kg-card kg-image-card"><img src="https://res-3.cloudinary.com/wtsvk/image/upload/q_auto/v1/www.web-tech.sk/2025/03/Sni-mek-obrazovky-2025-03-25-v-19.15.27.png" class="kg-image" alt="Ako si vytvori&#x165; vlastn&#xFD; web vo WordPresse (krok za krokom pre &#xFA;pln&#xE9;ho za&#x10D;iato&#x10D;n&#xED;ka)" loading="lazy" width="2388" height="1654"></figure><figure class="kg-card kg-image-card"><img src="https://res-1.cloudinary.com/wtsvk/image/upload/q_auto/v1/www.web-tech.sk/2025/03/Sni-mek-obrazovky-2025-03-25-v-19.22.13.png" class="kg-image" alt="Ako si vytvori&#x165; vlastn&#xFD; web vo WordPresse (krok za krokom pre &#xFA;pln&#xE9;ho za&#x10D;iato&#x10D;n&#xED;ka)" loading="lazy" width="2418" height="1268"></figure><h2 id="5-nahranie-wordpressu-na-hosting">5. Nahranie WordPressu na hosting</h2><p>Ke&#x10F;&#x17E;e <a href="https://www.hostcreators.sk?affil=xoJR4sIP">hostcreators.sk</a> ma tot&#xE1;lne vymakan&#xFA; podporu WordPressu, pre samotn&#xFA; in&#x161;tal&#xE1;ciu nie s&#xFA; potrebn&#xE9; &#x17E;iadne technick&#xE9; znalosti.</p><p>Pomocou <strong>&#x201E;</strong>Expresn&#xE1; in&#x161;tal&#xE1;cia WordPress<strong>&#x201C;</strong> sa d&#xE1; WordPress nain&#x161;talova&#x165; na nieko&#x13E;ko kliknut&#xED;. Po&#x10D;as tohto procesu si zvoli&#x161; heslo do administr&#xE1;cie, vhodn&#xFA; t&#xE9;mu (vzh&#x13E;ad webovej str&#xE1;nky) a pr&#xED;padne aj pluginy (funk&#x10D;nos&#x165; webovej str&#xE1;nky).</p><blockquote class="kg-blockquote-alt">&#x26A0;&#xFE0F;&#xFE0F; Ak si nech&#xE1;&#x161; heslo vygenerova&#x165;, nezabudni si ho pozna&#x10D;i&#x165;</blockquote><figure class="kg-card kg-image-card"><img src="https://res-1.cloudinary.com/wtsvk/image/upload/q_auto/v1/www.web-tech.sk/2025/03/Sni-mek-obrazovky-2025-03-25-v-19.34.57.png" class="kg-image" alt="Ako si vytvori&#x165; vlastn&#xFD; web vo WordPresse (krok za krokom pre &#xFA;pln&#xE9;ho za&#x10D;iato&#x10D;n&#xED;ka)" loading="lazy" width="1356" height="898"></figure><figure class="kg-card kg-image-card"><img src="https://res-4.cloudinary.com/wtsvk/image/upload/q_auto/v1/www.web-tech.sk/2025/03/Sni-mek-obrazovky-2025-03-25-v-19.35.23.png" class="kg-image" alt="Ako si vytvori&#x165; vlastn&#xFD; web vo WordPresse (krok za krokom pre &#xFA;pln&#xE9;ho za&#x10D;iato&#x10D;n&#xED;ka)" loading="lazy" width="1396" height="956"></figure><figure class="kg-card kg-image-card"><img src="https://res-4.cloudinary.com/wtsvk/image/upload/q_auto/v1/www.web-tech.sk/2025/03/Sni-mek-obrazovky-2025-03-25-v-19.35.38.png" class="kg-image" alt="Ako si vytvori&#x165; vlastn&#xFD; web vo WordPresse (krok za krokom pre &#xFA;pln&#xE9;ho za&#x10D;iato&#x10D;n&#xED;ka)" loading="lazy" width="1336" height="1370"></figure><h2 id="8-z%C3%A1ver-a-%C4%8Do-%C4%8Falej">8. Z&#xE1;ver a &#x10D;o &#x10F;alej</h2><p>M&#xE1;&#x161; spusten&#xFD; WordPress web. Teraz m&#xF4;&#x17E;e&#x161; pr&#xE9;js&#x165; do administr&#xE1;cie:</p><ul><li>nain&#x161;talova&#x165; si nov&#xFA; t&#xE9;mu, prisp&#xF4;sobi&#x165; dizajn</li><li>prida&#x165; prv&#xFA; str&#xE1;nku alebo blogov&#xFD; pr&#xED;spevok</li><li>nain&#x161;talova&#x165; kontaktn&#xFD; formul&#xE1;r alebo gal&#xE9;riu</li></ul><p>&#x1F4DD; Administr&#xE1;ciu n&#xE1;jdes na svojej dom&#xE9;ne. Sta&#x10D;i do webovej adresy doplni&#x165; /<strong>wp-admin</strong>. V na&#x161;om pr&#xED;pade by to teda bolo: <code>https://www.fashion-partner.eu/wp-admin</code></p><p>WordPress je skvel&#xFD; n&#xE1;stroj, ktor&#xFD; rastie spolu s tvojimi n&#xE1;padmi. V &#x10F;al&#x161;&#xED;ch &#x10D;l&#xE1;nkoch si uk&#xE1;&#x17E;eme, ako nastavi&#x165; t&#xE9;mu, pracova&#x165; s pluginmi a zabezpe&#x10D;i&#x165; svoj web.</p>]]></content:encoded></item><item><title><![CDATA[Vlastný Gutenberg blok pre shortcode: Ako ho vytvoriť a integrovať]]></title><description><![CDATA[Vytvor si Gutenberg blok, ktorý umožní redaktorom vybrať a vložiť shortcode bez písania kódu.]]></description><link>https://www.web-tech.sk/wordpress/wordpress-gutenberg-shortcode-blok/</link><guid isPermaLink="false">67e2d465e1fdbe0001fda23c</guid><category><![CDATA[WordPress]]></category><category><![CDATA[Shortcodes]]></category><category><![CDATA[Gutenberg]]></category><category><![CDATA[Návody]]></category><dc:creator><![CDATA[Michal Forbak]]></dc:creator><pubDate>Tue, 25 Mar 2025 16:09:00 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1566207462754-97c86c31db3d?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDF8fGd1dGVuYmVyZ3xlbnwwfHx8fDE3NDI5MjMyMDN8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1566207462754-97c86c31db3d?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDF8fGd1dGVuYmVyZ3xlbnwwfHx8fDE3NDI5MjMyMDN8MA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" alt="Vlastn&#xFD; Gutenberg blok pre shortcode: Ako ho vytvori&#x165; a integrova&#x165;"><p>Ak si u&#x17E; vytvoril vlastn&#xFD; <strong>shortcode</strong> vo WordPresse, mo&#x17E;no chce&#x161;, aby bol dostupn&#xFD; aj ako <strong>Gutenberg blok</strong>. V tomto &#x10D;l&#xE1;nku si uk&#xE1;&#x17E;eme, ako vytvori&#x165; jednoduch&#xFD; blok, ktor&#xFD; umo&#x17E;n&#xED; pou&#x17E;&#xED;vate&#x13E;ovi vybra&#x165; shortcode z ponuky a vlo&#x17E;i&#x165; ho do obsahu.</p><h2 id="%F0%9F%A7%B1-%C4%8Do-budeme-vytv%C3%A1ra%C5%A5">&#x1F9F1; &#x10C;o budeme vytv&#xE1;ra&#x165;?</h2><p>&#x27A1;&#xFE0F; Blok s dropdown menu, ktor&#xFD; vygeneruje vybran&#xFD; shortcode do obsahu &#x2013; napr. <code>[pozdrav]</code> alebo <code>[citat]</code>.</p><h2 id="%F0%9F%93%81-krok-1-%C5%A1trukt%C3%BAra-pluginu">&#x1F4C1; Krok 1: &#x160;trukt&#xFA;ra pluginu</h2><p>Vytvor adres&#xE1;r <code>shortcode-block</code> v <code>wp-content/plugins/</code> a vlo&#x17E; do&#x148; s&#xFA;bory:</p><ul><li><code>shortcode-block.php</code></li><li><code>block.js</code></li><li><code>style.css</code> (volite&#x13E;n&#xE9;)</li></ul><h2 id="%F0%9F%93%84-shortcode-blockphp">&#x1F4C4; shortcode-block.php</h2><pre><code>&lt;?php
/*
Plugin Name: Shortcode Block
*/

function shortcode_block_assets() {
  wp_register_script(
    &apos;shortcode-block-editor&apos;,
    plugins_url( &apos;block.js&apos;, __FILE__ ),
    [ &apos;wp-blocks&apos;, &apos;wp-element&apos;, &apos;wp-editor&apos;, &apos;wp-components&apos; ],
    filemtime( plugin_dir_path( __FILE__ ) . &apos;block.js&apos; )
  );

  register_block_type( &apos;moj/shortcode-block&apos;, [
    &apos;editor_script&apos; =&gt; &apos;shortcode-block-editor&apos;,
  ]);
}
add_action( &apos;init&apos;, &apos;shortcode_block_assets&apos; );</code></pre><h2 id="%F0%9F%93%84-blockjs-gutenberg-blok">&#x1F4C4; block.js (Gutenberg blok)</h2><pre><code>( function( blocks, element, components ) {
  const { registerBlockType } = blocks;
  const { createElement: el } = element;
  const { SelectControl } = components;

  registerBlockType( &apos;moj/shortcode-block&apos;, {
    title: &apos;Shortcode v&#xFD;ber&apos;,
    icon: &apos;shortcode&apos;,
    category: &apos;widgets&apos;,

    attributes: {
      selected: { type: &apos;string&apos;, default: &apos;[pozdrav]&apos; }
    },

    edit: ( props ) =&gt; {
      return el( &apos;div&apos;, {},
        el( SelectControl, {
          label: &apos;Vyber shortcode:&apos;,
          value: props.attributes.selected,
          options: [
            { label: &apos;[pozdrav]&apos;, value: &apos;[pozdrav]&apos; },
            { label: &apos;[citat]&apos;, value: &apos;[citat autor=&quot;Einstein&quot; text=&quot;Predstavivos&#x165; je d&#xF4;le&#x17E;itej&#x161;ia ako vedomosti.&quot;]&apos; },
          ],
          onChange: ( val ) =&gt; props.setAttributes({ selected: val })
        }),
        el( &apos;code&apos;, {}, props.attributes.selected )
      );
    },

    save: ( props ) =&gt; {
      return el( &apos;p&apos;, {}, props.attributes.selected );
    }
  });
} )(
  window.wp.blocks,
  window.wp.element,
  window.wp.components
);</code></pre><h2 id="%E2%9C%85-v%C3%BDsledok">&#x2705; V&#xFD;sledok</h2><p>Po aktiv&#xE1;cii pluginu bude&#x161; ma&#x165; nov&#xFD; blok &#x201E;Shortcode v&#xFD;ber&#x201C; v editore, ktor&#xFD; umo&#x17E;n&#xED; vybra&#x165; a vlo&#x17E;i&#x165; shortcode priamo do obsahu.</p><p>Po publikovan&#xED; str&#xE1;nky sa WordPress postar&#xE1; o vykreslenie shortcodu ako zvy&#x10D;ajne.</p><h2 id="%F0%9F%A7%A0-tipy-na-roz%C5%A1%C3%ADrenie">&#x1F9E0; Tipy na roz&#x161;&#xED;renie</h2><ul><li>podpora viacer&#xFD;ch pol&#xED; (vlastn&#xE9; parametre),</li><li>vizu&#xE1;lna uk&#xE1;&#x17E;ka v&#xFD;stupu (preview),</li><li>vlastn&#xE1; ikona alebo kateg&#xF3;ria bloku,</li><li>prepojenie s vlastn&#xFD;mi CPT alebo ACF &#xFA;dajmi.</li></ul><h2 id="%F0%9F%93%A6-z%C3%A1ver">&#x1F4E6; Z&#xE1;ver</h2><p>Prepojenie shortcodov s Gutenberg blokmi je v&#xFD;born&#xFD; sp&#xF4;sob, ako spravi&#x165; obsah redaktorsky pr&#xED;stupnej&#x161;&#xED; a menej &#x201E;technick&#xFD;&#x201C;. V &#x10F;al&#x161;om kroku m&#xF4;&#x17E;e&#x161; vytvori&#x165; &#xFA;plne vlastn&#xFD; blok, ktor&#xFD; shortcode ani nepotrebuje &#x2013; ale v&#xFD;stup generuje priamo cez JS alebo REST API.</p>]]></content:encoded></item><item><title><![CDATA[Shortcodes vo WordPresse: Ako fungujú a ako si vytvoriť vlastné]]></title><description><![CDATA[Ako fungujú shortcody vo WordPresse a ako si vytvoriť vlastné – praktické príklady a bezpečnosť.]]></description><link>https://www.web-tech.sk/wordpress/wordpress-shortcodes-navod/</link><guid isPermaLink="false">67e2d07fe1fdbe0001fda22e</guid><category><![CDATA[WordPress]]></category><category><![CDATA[Shortcodes]]></category><category><![CDATA[Návody]]></category><dc:creator><![CDATA[Michal Forbak]]></dc:creator><pubDate>Tue, 25 Mar 2025 15:50:00 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1569396116180-210c182bedb8?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDM4fHxjb2RlfGVufDB8fHx8MTc0MjgyNTQ0Nnww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1569396116180-210c182bedb8?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDM4fHxjb2RlfGVufDB8fHx8MTc0MjgyNTQ0Nnww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" alt="Shortcodes vo WordPresse: Ako funguj&#xFA; a ako si vytvori&#x165; vlastn&#xE9;"><p><strong>Shortcode</strong> je jednoduch&#xFD; sp&#xF4;sob, ako do WordPress obsahu vlo&#x17E;i&#x165; dynamick&#xFD; prvok &#x2013; bez toho, aby si p&#xED;sal HTML alebo PHP. V tomto &#x10D;l&#xE1;nku si uk&#xE1;&#x17E;eme, &#x10D;o shortcody s&#xFA;, ako ich pou&#x17E;&#xED;va&#x165; a ako si vytvori&#x165; vlastn&#xE9; &#x2013; jednoduch&#xE9; aj pokro&#x10D;ilej&#x161;ie.</p><h2 id="%F0%9F%92%A1-%C4%8Do-je-to-shortcode">&#x1F4A1; &#x10C;o je to shortcode?</h2><p>Shortcode vyzer&#xE1; ako <code>[nazov]</code> a m&#xF4;&#x17E;e ma&#x165; aj parametre: <code>[galeria id=&quot;123&quot;]</code>.</p><p>Po zobrazen&#xED; str&#xE1;nky sa shortcode nahrad&#xED; v&#xFD;stupom funkcie, ktor&#xFA; definuje&#x161; v k&#xF3;de (napr. HTML, tabu&#x13E;ka, formul&#xE1;r, v&#xFD;pis d&#xE1;t at&#x10F;.).</p><h2 id="%F0%9F%A7%AA-z%C3%A1kladn%C3%BD-pr%C3%ADklad-vlastn%C3%BD-pozdrav">&#x1F9EA; Z&#xE1;kladn&#xFD; pr&#xED;klad: Vlastn&#xFD; pozdrav</h2><h3 id="%F0%9F%93%84-k%C3%B3d-do-functionsphp">&#x1F4C4; K&#xF3;d do <code>functions.php</code>:</h3><pre><code>function moj_pozdrav_shortcode() {
  return &apos;&lt;p&gt;Ahoj! Vitaj na mojej str&#xE1;nke.&lt;/p&gt;&apos;;
}
add_shortcode(&apos;pozdrav&apos;, &apos;moj_pozdrav_shortcode&apos;);</code></pre><h3 id="%F0%9F%93%8C-pou%C5%BEitie-v-obsahu">&#x1F4CC; Pou&#x17E;itie v obsahu:</h3><pre><code>[pozdrav]</code></pre><p>&#x1F449; V&#xFD;stup: <em>Ahoj! Vitaj na mojej str&#xE1;nke.</em></p><h2 id="%F0%9F%A7%A9-shortcode-s-parametrami">&#x1F9E9; Shortcode s parametrami</h2><h3 id="%F0%9F%93%84-funkcia-s-atrib%C3%BAtmi">&#x1F4C4; Funkcia s atrib&#xFA;tmi:</h3><pre><code>function citat_shortcode($atts) {
  $a = shortcode_atts([
    &apos;autor&apos; =&gt; &apos;Nezn&#xE1;my&apos;,
    &apos;text&apos; =&gt; &apos;Cit&#xE1;t ch&#xFD;ba.&apos;
  ], $atts);

  return &apos;&lt;blockquote&gt;&apos; . esc_html($a[&apos;text&apos;]) . &apos;&lt;br&gt;&lt;cite&gt;&apos; . esc_html($a[&apos;autor&apos;]) . &apos;&lt;/cite&gt;&lt;/blockquote&gt;&apos;;
}
add_shortcode(&apos;citat&apos;, &apos;citat_shortcode&apos;);</code></pre><h3 id="%F0%9F%93%8C-pou%C5%BEitie">&#x1F4CC; Pou&#x17E;itie:</h3><pre><code>[citat autor=&quot;Einstein&quot; text=&quot;Predstavivos&#x165; je d&#xF4;le&#x17E;itej&#x161;ia ako vedomosti.&quot;]</code></pre><h2 id="%F0%9F%94%81-shortcode-s-obsahom-medzi-tagmi">&#x1F501; Shortcode s obsahom medzi tagmi</h2><p>Niekedy chce&#x161; spracova&#x165; aj text medzi <code>[tag]...[/tag]</code>. Pr&#xED;klad s vlastn&#xFD;m zv&#xFD;raz&#x148;ova&#x10D;om:</p><pre><code>function highlight_shortcode($atts, $content = null) {
  return &apos;&lt;span style=&quot;background:yellow;&quot;&gt;&apos; . do_shortcode($content) . &apos;&lt;/span&gt;&apos;;
}
add_shortcode(&apos;highlight&apos;, &apos;highlight_shortcode&apos;);</code></pre><pre><code>[highlight]D&#xF4;le&#x17E;it&#xFD; text[/highlight]</code></pre><h2 id="%F0%9F%93%83-shortcode-s-dynamick%C3%BDmi-d%C3%A1tami-napr-v%C3%BDpis-%C4%8Dl%C3%A1nkov">&#x1F4C3; Shortcode s dynamick&#xFD;mi d&#xE1;tami (napr. v&#xFD;pis &#x10D;l&#xE1;nkov)</h2><pre><code>function vypis_blog_shortcode($atts) {
  $query = new WP_Query([
    &apos;posts_per_page&apos; =&gt; 3
  ]);

  $output = &apos;&lt;ul&gt;&apos;;
  while($query-&gt;have_posts()) : $query-&gt;the_post();
    $output .= &apos;&lt;li&gt;&lt;a href=&quot;&apos; . get_permalink() . &apos;&quot;&gt;&apos; . get_the_title() . &apos;&lt;/a&gt;&lt;/li&gt;&apos;;
  endwhile;
  wp_reset_postdata();

  $output .= &apos;&lt;/ul&gt;&apos;;
  return $output;
}
add_shortcode(&apos;blog_novinky&apos;, &apos;vypis_blog_shortcode&apos;);</code></pre><p>Pou&#x17E;ije&#x161; jednoducho ako:</p><pre><code>[blog_novinky]</code></pre><p>&#x1F449; Zobraz&#xED; posledn&#xE9; 3 pr&#xED;spevky ako zoznam odkazov.</p><h2 id="%F0%9F%93%A6-shortcode-v-%C5%A1abl%C3%B3ne-php-nie-len-v-editore">&#x1F4E6; Shortcode v &#x161;abl&#xF3;ne PHP (nie len v editore)</h2><p>Shortcode m&#xF4;&#x17E;e&#x161; pou&#x17E;i&#x165; aj priamo v PHP &#x161;abl&#xF3;nach:</p><pre><code>&lt;?php echo do_shortcode(&apos;[pozdrav]&apos;); ?&gt;</code></pre><p>To sa hod&#xED;, ak chce&#x161; shortcode pou&#x17E;i&#x165; napr. v sidebare, p&#xE4;ti&#x10D;ke, alebo vlastnej sekcii mimo obsahu.</p><h2 id="%F0%9F%94%90-bezpe%C4%8Dnostn%C3%A9-tipy">&#x1F510; Bezpe&#x10D;nostn&#xE9; tipy</h2><ul><li>Pri v&#xFD;stupe pou&#x17E;&#xED;vaj <code>esc_html()</code>, <code>esc_attr()</code>, aby si ochr&#xE1;nil v&#xFD;stup pred XSS &#xFA;tokmi.</li><li>Shortcody p&#xED;&#x161; tak, aby nemohli spusti&#x165; &#x13E;ubovo&#x13E;n&#xFD; k&#xF3;d od pou&#x17E;&#xED;vate&#x13E;a.</li><li>Do shortcodov nikdy nevkladaj neoveren&#xE9; &#xFA;daje priamo do datab&#xE1;zy bez valid&#xE1;cie.</li></ul><h2 id="%F0%9F%A7%A0-z%C3%A1ver">&#x1F9E0; Z&#xE1;ver</h2><p>Shortcody s&#xFA; v&#xFD;born&#xFD; n&#xE1;stroj, ak chce&#x161; prida&#x165; dynamiku do obsahu &#x2013; od jednoduch&#xFD;ch textov po v&#xFD;pisy z datab&#xE1;zy. V &#x10F;al&#x161;om &#x10D;l&#xE1;nku si uk&#xE1;&#x17E;eme, ako vytvori&#x165; &#x201E;shortcode builder&#x201C; vo forme Gutenberg bloku alebo ako prepoji&#x165; shortcody s vlastn&#xFD;m typom obsahu.</p>]]></content:encoded></item><item><title><![CDATA[Ako sa pripraviť na pohovor v IT: Praktické tipy a checklist]]></title><description><![CDATA[Ako sa pripraviť na IT pohovor – technické otázky, soft-skills, live coding a čo očakávať.]]></description><link>https://www.web-tech.sk/kariera/ako-sa-pripravit-na-it-pohovor/</link><guid isPermaLink="false">67e3009fe1fdbe0001fda38c</guid><category><![CDATA[Kariéra]]></category><category><![CDATA[Pohovor]]></category><category><![CDATA[IT]]></category><dc:creator><![CDATA[Michal Forbak]]></dc:creator><pubDate>Mon, 24 Mar 2025 22:30:00 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1522202176988-66273c2fd55f?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDMwfHxpbnRlcnZpZXd8ZW58MHx8fHwxNzQyODQxOTAyfDA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1522202176988-66273c2fd55f?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDMwfHxpbnRlcnZpZXd8ZW58MHx8fHwxNzQyODQxOTAyfDA&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" alt="Ako sa pripravi&#x165; na pohovor v IT: Praktick&#xE9; tipy a checklist"><p>Pohovor v IT nie je len o vedomostiach &#x2013; je to kombin&#xE1;cia technick&#xFD;ch zru&#x10D;nost&#xED;, komunik&#xE1;cie a spr&#xE1;vneho pr&#xED;stupu. Tento &#x10D;l&#xE1;nok ti pom&#xF4;&#x17E;e pripravi&#x165; sa na IT pohovor krok za krokom &#x2013; &#x10D;i u&#x17E; si junior, alebo m&#xE1;&#x161; roky praxe.</p><h2 id="%F0%9F%94%8D-1-zisti-si-o-firme-%C4%8Do-najviac">&#x1F50D; 1. Zisti si o firme &#x10D;o najviac</h2><ul><li>Ak&#xE9; technol&#xF3;gie pou&#x17E;&#xED;vaj&#xFA;? Pozri si ich GitHub, blog alebo job listingy.</li><li>Ak&#xFD; je ich produkt alebo slu&#x17E;ba? Vie&#x161; si predstavi&#x165;, &#x17E;e by si na tom pracoval?</li><li>P&#xF4;sobia form&#xE1;lne, alebo sk&#xF4;r startupovo? Pod&#x13E;a toho m&#xF4;&#x17E;e&#x161; prisp&#xF4;sobi&#x165; komunik&#xE1;ciu.</li></ul><h2 id="%F0%9F%A7%A0-2-technick%C3%A1-pr%C3%ADprava-%E2%80%93-pod%C4%BEa-poz%C3%ADcie">&#x1F9E0; 2. Technick&#xE1; pr&#xED;prava &#x2013; pod&#x13E;a poz&#xED;cie</h2><h3 id="frontend-web-v%C3%BDvoj">Frontend / Web v&#xFD;voj:</h3><ul><li>HTML/CSS &#x2013; vedie&#x165; vysvetli&#x165; semantiku, responzivitu</li><li>JavaScript &#x2013; rozdiel medzi <code>let</code>/<code>var</code>, closure, hoisting</li><li>React/Vue &#x2013; cyklus komponentov, stav, props</li></ul><h3 id="backend">Backend:</h3><ul><li>REST API, autentifik&#xE1;cia, middleware</li><li>Datab&#xE1;zy (SQL aj NoSQL)</li><li>Z&#xE1;klady bezpe&#x10D;nosti (hashovanie hesiel, rate limiting)</li></ul><h3 id="devops-cloud">DevOps / Cloud:</h3><ul><li>Z&#xE1;kladn&#xE9; pr&#xED;kazy Linuxu</li><li>CI/CD &#x2013; GitHub Actions, GitLab CI</li><li>Docker, Kubernetes &#x2013; &#x10D;o robia a kedy ich pou&#x17E;i&#x165;</li></ul><h3 id="junior-poz%C3%ADcie">Junior poz&#xED;cie:</h3><ul><li>Netreba vedie&#x165; v&#x161;etko &#x2013; sk&#xF4;r sa zamera&#x165; na z&#xE1;klady a chu&#x165; u&#x10D;i&#x165; sa</li><li>Vedie&#x165; vysvetli&#x165;, &#x10D;o si sa nau&#x10D;il, &#x10D;o ti robilo probl&#xE9;m a ako si to vyrie&#x161;il</li></ul><h2 id="%F0%9F%A7%91%E2%80%8D%F0%9F%92%BB-3-praktick%C3%A1-%C4%8Das%C5%A5-%E2%80%93-test-alebo-live-coding">&#x1F9D1;&#x200D;&#x1F4BB; 3. Praktick&#xE1; &#x10D;as&#x165; &#x2013; test alebo live coding</h2><ul><li>Ve&#x13E;a firiem posiela dom&#xE1;ce zadanie (napr. API endpoint, mal&#xE1; aplik&#xE1;cia)</li><li>Pri live codingu bu&#x10F; pokojn&#xFD; &#x2013; rozpr&#xE1;vaj nahlas, &#x10D;o rob&#xED;&#x161; a pre&#x10D;o</li><li>Nez&#x13E;akni sa, ke&#x10F; nie&#x10D;o nevie&#x161; &#x2013; k&#x13E;&#xFA;&#x10D;ov&#xE9; je uk&#xE1;za&#x165; logiku a pr&#xED;stup k rie&#x161;eniu</li></ul><h2 id="%F0%9F%97%A3%EF%B8%8F-4-pr%C3%ADprava-na-netechnick%C3%A9-ot%C3%A1zky">&#x1F5E3;&#xFE0F; 4. Pr&#xED;prava na netechnick&#xE9; ot&#xE1;zky</h2><ul><li>Pre&#x10D;o chce&#x161; pr&#xE1;cu v tejto firme?</li><li>Ak&#xFD; bol tvoj najv&#xE4;&#x10D;&#x161;&#xED; probl&#xE9;m pri programovan&#xED; a ako si ho vyrie&#x161;il?</li><li>Vie&#x161; pracova&#x165; v t&#xED;me? Ako rie&#x161;i&#x161; konflikty?</li></ul><h2 id="%F0%9F%A7%BE-5-cv-github-a-portf%C3%B3lio">&#x1F9FE; 5. CV, GitHub a portf&#xF3;lio</h2><ul><li>CV stru&#x10D;n&#xE9;, ale preh&#x13E;adn&#xE9; &#x2013; zameraj sa na technol&#xF3;gie a re&#xE1;lne projekty</li><li>GitHub s projektami (aj mal&#xE9; s&#xFA; lep&#x161;ie ako ni&#x10D;)</li><li>Portf&#xF3;lio web &#x2013; ak rob&#xED;&#x161; frontend alebo freelance, ve&#x13E;k&#xE9; plus</li></ul><h2 id="%F0%9F%A7%98-6-v-de%C5%88-pohovoru">&#x1F9D8; 6. V de&#x148; pohovoru</h2><ul><li>Bu&#x10F; pripraven&#xFD; s technikou (notebook, mikrof&#xF3;n, pokojn&#xE9; prostredie)</li><li>Skontroluj si spojenie a kameru (ak ide o remote pohovor)</li><li>Maj poruke pozn&#xE1;mky, ale ne&#x10D;&#xED;taj ich &#x2013; bu&#x10F; prirodzen&#xFD;</li></ul><h2 id="%E2%9C%85-checklist-na-z%C3%A1ver">&#x2705; Checklist na z&#xE1;ver</h2><ul><li>[ ] M&#xE1;m pripraven&#xE9; CV a GitHub</li><li>[ ] Viem pop&#xED;sa&#x165; svoje projekty a &#x10D;o som sa nau&#x10D;il</li><li>[ ] Skontroloval som si, &#x10D;o firma rob&#xED;</li><li>[ ] M&#xE1;m zopakovan&#xE9; technick&#xE9; z&#xE1;klady</li><li>[ ] Viem odpoveda&#x165; na naj&#x10D;astej&#x161;ie ot&#xE1;zky</li></ul><p>Dr&#x17E;&#xED;me palce! Nezabudni &#x2013; pohovor nie je sk&#xFA;&#x161;ka, ale rozhovor. &#x10C;asto nejde o to vedie&#x165; v&#x161;etko, ale uk&#xE1;za&#x165;, &#x17E;e vie&#x161; rozm&#xFD;&#x161;&#x13E;a&#x165;, u&#x10D;i&#x165; sa a komunikova&#x165;. &#x270C;&#xFE0F;</p>]]></content:encoded></item><item><title><![CDATA[Kompletný sprievodca: Ako vytvoriť vlastný typ obsahu vo WordPresse]]></title><description><![CDATA[Ako vytvoriť vlastný typ obsahu vo WordPresse – kurzy, polia cez ACF a šablóny. Komplexný návod.]]></description><link>https://www.web-tech.sk/wordpress/wordpress-vlastny-obsah-komplet/</link><guid isPermaLink="false">67e1c6dee1fdbe0001fda21f</guid><category><![CDATA[WordPress]]></category><category><![CDATA[Custom Post Types]]></category><category><![CDATA[ACF]]></category><category><![CDATA[Návody]]></category><dc:creator><![CDATA[Michal Forbak]]></dc:creator><pubDate>Mon, 24 Mar 2025 20:55:00 GMT</pubDate><media:content url="https://images.unsplash.com/photo-1573867639040-6dd25fa5f597?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDEzfHx3ZWJzaXRlfGVufDB8fHx8MTc0MjgwMDE4MXww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" medium="image"/><content:encoded><![CDATA[<img src="https://images.unsplash.com/photo-1573867639040-6dd25fa5f597?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDEzfHx3ZWJzaXRlfGVufDB8fHx8MTc0MjgwMDE4MXww&amp;ixlib=rb-4.0.3&amp;q=80&amp;w=2000" alt="Kompletn&#xFD; sprievodca: Ako vytvori&#x165; vlastn&#xFD; typ obsahu vo WordPresse"><p>WordPress nie je len blog. Je to v&#xFD;konn&#xFD; CMS, ktor&#xFD; dok&#xE1;&#x17E;e spracova&#x165; ak&#xFD;ko&#x13E;vek typ obsahu &#x2013; ak vie&#x161;, ako na to. V tomto rozsiahlej&#x161;om n&#xE1;vode ti uk&#xE1;&#x17E;em krok za krokom, ako si vytvori&#x165; <strong>vlastn&#xFD; typ obsahu (Custom Post Type)</strong>, prida&#x165; k nemu <strong>vlastn&#xE9; polia (Advanced Custom Fields)</strong> a zobrazi&#x165; v&#x161;etko vo <strong>vlastnej &#x161;abl&#xF3;ne</strong>.</p><h2 id="%F0%9F%93%A6-%C4%8Do-je-vlastn%C3%BD-typ-obsahu-custom-post-type">&#x1F4E6; &#x10C;o je vlastn&#xFD; typ obsahu (Custom Post Type)?</h2><p>WordPress m&#xE1; predvolene <code>posts</code> (pr&#xED;spevky) a <code>pages</code> (str&#xE1;nky). Vlastn&#xFD; typ obsahu &#x2013; tzv. CPT &#x2013; ti umo&#x17E;n&#xED; vytvori&#x165; nie&#x10D;o nov&#xE9;, &#x161;pecifick&#xE9;. Napr.:</p><ul><li><strong>Kurzy</strong> &#x2013; pre vzdel&#xE1;vac&#xED; port&#xE1;l</li><li><strong>Recepty</strong> &#x2013; pre blog o varen&#xED;</li><li><strong>Projekty</strong> &#x2013; pre portf&#xF3;lio agent&#xFA;ry</li><li><strong>Produkty</strong> &#x2013; pre e-commerce rie&#x161;enie mimo WooCommerce</li></ul><p>Ka&#x17E;d&#xFD; typ m&#xF4;&#x17E;e ma&#x165; svoje vlastn&#xE9; &#xFA;daje, kateg&#xF3;rie, &#x161;abl&#xF3;ny a zobrazenie.</p><h2 id="%F0%9F%94%A8-vytvorenie-vlastn%C3%A9ho-post-typu-%E2%80%9Ekurz%E2%80%9C">&#x1F528; Vytvorenie vlastn&#xE9;ho post typu &#x201E;kurz&#x201C;</h2><p>Do <code>functions.php</code> (alebo pluginu) vlo&#x17E;:</p><pre><code>function vytvor_cpt_kurzy() {
  register_post_type(&apos;kurz&apos;, [
    &apos;labels&apos; =&gt; [
      &apos;name&apos; =&gt; &apos;Kurzy&apos;,
      &apos;singular_name&apos; =&gt; &apos;Kurz&apos;
    ],
    &apos;public&apos; =&gt; true,
    &apos;has_archive&apos; =&gt; true,
    &apos;rewrite&apos; =&gt; [&apos;slug&apos; =&gt; &apos;kurzy&apos;],
    &apos;menu_icon&apos; =&gt; &apos;dashicons-welcome-learn-more&apos;,
    &apos;supports&apos; =&gt; [&apos;title&apos;, &apos;editor&apos;, &apos;thumbnail&apos;, &apos;excerpt&apos;]
  ]);
}
add_action(&apos;init&apos;, &apos;vytvor_cpt_kurzy&apos;);</code></pre><p>Po ulo&#x17E;en&#xED; sa v admin rozhran&#xED; zobraz&#xED; nov&#xE1; sekcia &#x201E;Kurzy&#x201C;.</p><h2 id="%F0%9F%A7%A9-pridanie-vlastn%C3%BDch-pol%C3%AD-pomocou-acf">&#x1F9E9; Pridanie vlastn&#xFD;ch pol&#xED; pomocou ACF</h2><p>Nain&#x161;taluj a aktivuj plugin <strong>Advanced Custom Fields</strong>. Potom:</p><ol><li>V admin rozhran&#xED; &#x2192; ACF &#x2192; Field Groups &#x2192; Prida&#x165; nov&#xFA;</li><li>Nazvi ju napr. &#x201E;Detaily kurzu&#x201C;</li><li>Pridaj polia: napr. &#x201E;Lektor&#x201C; (text), &#x201E;Trvanie&#x201C; (text), &#x201E;Cena&#x201C; (number)</li><li>Nastav Location: <code>Post Type is equal to kurz</code></li><li>Ulo&#x17E;</li></ol><p>Teraz, ke&#x10F; prid&#xE1;&#x161; nov&#xFD; kurz, zobrazia sa aj tieto vlastn&#xE9; polia.</p><h2 id="%F0%9F%8E%A8-%C5%A1abl%C3%B3ny-pre-vlastn%C3%BD-typ-obsahu">&#x1F3A8; &#x160;abl&#xF3;ny pre vlastn&#xFD; typ obsahu</h2><h3 id="single-kurzphp"><code>single-kurz.php</code></h3><pre><code>&lt;?php get_header(); ?&gt;
&lt;main&gt;
  &lt;h1&gt;&lt;?php the_title(); ?&gt;&lt;/h1&gt;
  &lt;div&gt;&lt;?php the_content(); ?&gt;&lt;/div&gt;
  &lt;ul&gt;
    &lt;li&gt;&lt;strong&gt;Lektor:&lt;/strong&gt; &lt;?php the_field(&apos;lektor&apos;); ?&gt;&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;Trvanie:&lt;/strong&gt; &lt;?php the_field(&apos;trvanie&apos;); ?&gt;&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;Cena:&lt;/strong&gt; &lt;?php the_field(&apos;cena&apos;); ?&gt; &#x20AC;&lt;/li&gt;
  &lt;/ul&gt;
&lt;/main&gt;
&lt;?php get_footer(); ?&gt;</code></pre><h3 id="archive-kurzphp"><code>archive-kurz.php</code></h3><pre><code>&lt;?php get_header(); ?&gt;
&lt;main&gt;
  &lt;h1&gt;V&#x161;etky kurzy&lt;/h1&gt;
  &lt;?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?&gt;
    &lt;article&gt;
      &lt;h2&gt;&lt;a href=&quot;&lt;?php the_permalink(); ?&gt;&quot;&gt;&lt;?php the_title(); ?&gt;&lt;/a&gt;&lt;/h2&gt;
      &lt;p&gt;Lektor: &lt;?php the_field(&apos;lektor&apos;); ?&gt;&lt;/p&gt;
      &lt;p&gt;Cena: &lt;?php the_field(&apos;cena&apos;); ?&gt; &#x20AC;&lt;/p&gt;
    &lt;/article&gt;
  &lt;?php endwhile; endif; ?&gt;
&lt;/main&gt;
&lt;?php get_footer(); ?&gt;</code></pre><h2 id="%F0%9F%93%9A-bonus-vlastn%C3%A9-kateg%C3%B3rie-taxon%C3%B3mie">&#x1F4DA; Bonus: vlastn&#xE9; kateg&#xF3;rie (taxon&#xF3;mie)</h2><p>Chce&#x161; napr. filtrova&#x165; kurzy pod&#x13E;a oblasti? Pridaj vlastn&#xFA; taxon&#xF3;miu:</p><pre><code>function registruj_taxonomiu_oblast() {
  register_taxonomy(&apos;oblast&apos;, &apos;kurz&apos;, [
    &apos;label&apos; =&gt; &apos;Oblas&#x165;&apos;,
    &apos;hierarchical&apos; =&gt; true,
    &apos;rewrite&apos; =&gt; [&apos;slug&apos; =&gt; &apos;oblast&apos;]
  ]);
}
add_action(&apos;init&apos;, &apos;registruj_taxonomiu_oblast&apos;);</code></pre><h2 id="%F0%9F%A7%A0-z%C3%A1ver">&#x1F9E0; Z&#xE1;ver</h2><p>V&#x10F;aka Custom Post Types, ACF a vlastn&#xFD;m &#x161;abl&#xF3;nam si vie&#x161; vo WordPresse vytvori&#x165; plnohodnotn&#xFA; CMS &#x161;trukt&#xFA;ru &#x2013; nie&#x10D;o ako vlastn&#xFD; mini syst&#xE9;m na mieru. U&#x17E; &#x17E;iadne &#x201E;hacken&#xE9;&#x201C; pr&#xED;spevky &#x2013; tvoje kurzy, projekty &#x10D;i produkty m&#xF4;&#x17E;u ma&#x165; vlastn&#xFA; logiku, vlastn&#xFD; dizajn a spr&#xE1;vanie.</p><p>V &#x10F;al&#x161;om &#x10D;l&#xE1;nku si m&#xF4;&#x17E;eme uk&#xE1;za&#x165;, ako tieto d&#xE1;ta zobrazi&#x165; cez vlastn&#xFD; shortcode alebo REST API.</p>]]></content:encoded></item></channel></rss>