<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Banter bloguje</title>
    <description>Blog o softwarovém inženýrství, programování v jazycích Java či Groovy, ale i o mimopracovních věcech, které mi přeletí přes nos.
</description>
    <link>https://blog.zvestov.cz/</link>
    <atom:link href="https://blog.zvestov.cz/feed.xml" rel="self" type="application/rss+xml"/>
    <pubDate>Tue, 23 Jun 2026 17:51:01 +0000</pubDate>
    <lastBuildDate>Tue, 23 Jun 2026 17:51:01 +0000</lastBuildDate>
    <generator>Jekyll v4.3.1</generator>
    
      <item>
        <title>Brännball</title>
        <description>&lt;div style=&quot;float: left; margin: 0 1em 1em 0; text-align: center;&quot;&gt;&lt;img src=&quot;/assets/2026-06-23/Brannboll.png&quot; /&gt;&lt;/div&gt;

&lt;p&gt;Chtěl bych vám představit hru Brännball.
Máte-li rádi baseball nebo softball, jsem si jistý, že se vám bude líbit.
Tvrdím, že tomu propadnou i lidé těmito sporty nepolíbení.
Pokud už jste někdy zkoušeli, tak jste jistě narazili na to, že počítání bodů je trochu komplikovanější, tak jsem si spíchl jednoduchou pomůcku pro rozhodčí.&lt;/p&gt;

&lt;div style=&quot;clear:both&quot;&gt;&lt;/div&gt;
&lt;!--more--&gt;

&lt;h2 id=&quot;úvod&quot;&gt;Úvod&lt;/h2&gt;

&lt;p&gt;Jsem malý a slabý.
Snažím se držet v kondici, ale jako dítě jsem byl oproti vrstevníkům v nevýhodě.
Na vesnici lze hrát fotbal a ten mi nikdy nešel, navíc mi to prostředí nesedí.
Později jsem se našel v rekreačním softballu (oddílů tenkrát nebylo mnoho a když, tak daleko ve městě, hromadnou dopravou obtížně až nemožně dostupné).
Ernest Hemingway měl údajně prohlásit, že baseball jsou nejrychlejší šachy na světě.
To bylo něco pro mě, mrštnost a chytrost, kde tělesná výška nehrála takovou roli.
S oblibou dávám k dobru už otřepanou historku, že pořádně jsem se naučil házet až na vysoké škole (technického zaměření), kde jsem si softball zapsal na tělocvik.
Na základce jsem házel krikeťákem naprosto příšerně, neměl jsem sílu a techniku nikdo neučil.&lt;/p&gt;

&lt;p&gt;Srdce mě pořád táhne k softballu.
Na čtrnáctidenních táborech lze děti naučit základům hry, ale jedná se o složitá pravidla a motoricky náročné pohyby.
Nehledě na množství potřebného vybavení i hráčů.&lt;/p&gt;

&lt;p&gt;Až mi někdo doporučil hru &lt;a href=&quot;https://cs.wikipedia.org/wiki/Br%C3%A4nnball&quot;&gt;Brännball&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;brännball&quot;&gt;Brännball&lt;/h2&gt;

&lt;p&gt;Nejdříve jsem to trochu nafoukaně přehlížel, protože se hraje s tenisákem, a že to nemůže být zdaleka tak dobré.
Jenže děti, se kterými jsem chtěl hrát softball, byly na plnohodnotnou hru ještě příliš malé a navíc jsem ani neměl vybavení pro všechny.
Začal jsem tedy Brännball trochu studovat.&lt;/p&gt;

&lt;p&gt;Zásadní je, že si to ze softballu bere strategický pohyb po hřišti a celkovou zábavnost, na druhou stranu odebírá složité a otravné záležitosti.
Směny ohraničuje časový limit, žádné &lt;em&gt;outy&lt;/em&gt;, na odpal je v podstatě nekonečně pokusů, na metu se dostane každý, i nezkušený hráč.
Vůbec se neřeší nadhoz (softball taky samozřejmě podporuje variantu odpalu ze stativu).
Tenisák je levnější a bezpečnější než tvrdý softballový míč.
Pálka je prkno (skoro zadarmo, minimální práce s úpravou), navíc odpal něčím placatým je snažší než něčím kulatým&lt;/p&gt;

&lt;p&gt;Pravidla mi na první pohled nedávala úplně smysl (asi zejména protože jsem se příliš upínal na svoje znalosti softballu), ale nakonec jsem si vystačil s těmito třemi instruktážními nahrávkami:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=FSL6JwGtIiw&quot;&gt;Brännball na školskom ihrisku&lt;/a&gt;&lt;/p&gt;

&lt;iframe class=&quot;center&quot; width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/FSL6JwGtIiw?si=fyTtcRnWfOjfdHe8&quot; title=&quot;YouTube video player&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot; referrerpolicy=&quot;strict-origin-when-cross-origin&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;

&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=Y8tnwk4iih0&quot;&gt;Netradiční sportovní hry - BRÄNNBALL - Pravidla&lt;/a&gt;&lt;/p&gt;

&lt;iframe class=&quot;center&quot; width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/Y8tnwk4iih0?si=Spg9ScSuW3-BhX5h&quot; title=&quot;YouTube video player&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot; referrerpolicy=&quot;strict-origin-when-cross-origin&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;

&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=lClzfDPyoZs&quot;&gt;Netradiční sportovní hry - BRÄNNBALL - Potřebné vybavení&lt;/a&gt;&lt;/p&gt;

&lt;iframe class=&quot;center&quot; width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/lClzfDPyoZs?si=70NKT1gYIfpNX2TK&quot; title=&quot;YouTube video player&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot; referrerpolicy=&quot;strict-origin-when-cross-origin&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;

&lt;p&gt;Pak jsme si to jednou zahráli a všechno mi docvaklo.&lt;/p&gt;

&lt;p&gt;Mám opakovaně vyzkoušené, že i s úplnými nováčky lze během 90 minutovém bloku natrénovat techniku házení, chytání i odpalu, vysvětlit pravidla a stihnout sehrát dvě směny.
Jedinou nevýhodou mi přijde víc práce s počítám bodů.
Nově na to mám aplikaci, viz níže.
Po metách se typicky pohybuje víc hráčů než v softballu, takže bez rozlišováků si to nedokážu představit.
I tak se hodí, abyste na hru nebyli jediným rozhodčím.&lt;/p&gt;

&lt;h2 id=&quot;označení-hřiště&quot;&gt;Označení hřiště&lt;/h2&gt;

&lt;p&gt;Nejpracnější na přípravě je vytyčení hřiště.
Osvědčily se mi kužely a paracordy v signálních barvách.
O provázky občas někdo zavadí a posune je.
Chci si proto na 3D tiskárně vyrobit několik &lt;a href=&quot;https://www.printables.com/model/620570-archery-target-pin&quot;&gt;připínáčků, které se používají k přichycení lukostřeleckých terčů&lt;/a&gt;, snadno se zabodnou do země a nebude nic nebezpečně vyčuhovat.
V plánu mám dokoupit obruč k přesnějšímu vytyčení stanoviště brännera.&lt;/p&gt;

&lt;h2 id=&quot;aplikace-pro-rozhodčí&quot;&gt;Aplikace pro rozhodčí&lt;/h2&gt;

&lt;p&gt;Jak jsem již zmiňoval, počítání bodů je komplikované.
Bod můžete získat za oběh, za přešlap brännera, za chycení míčku i za spálení hráče, který není bezpečně na metě (tím není výčet kompletní).
Po každé spáleném míči jsem si dřív čárkoval na papíru do připravených chlívečků, ale mnohdy to pomotal.&lt;/p&gt;

&lt;p&gt;Až jsem se hecnul a vyrobil jednoduchou &lt;a href=&quot;https://blog.zvestov.cz/assets/brannball/&quot;&gt;aplikaci pro rozhodčí Brännballu&lt;/a&gt;.
Respektive je to prostá webová stránka, takže nemusíte nic instalovat, jen otevřete na telefonu.
Ovládání by mělo být intuitivní.&lt;/p&gt;

&lt;p&gt;Zdrojový kód jsem dal dohromady s pomocí AI, k dispozici na &lt;a href=&quot;https://github.com/banterCZ/brannball/blob/main/index.html&quot;&gt;GitHubu&lt;/a&gt;.
Zatím jsem testoval jen na iPhone.
Dejte vědět jak a jestli vám funguje i na Androidu.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/2026-06-23/IMG_0267.jpeg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
</description>
        <pubDate>Tue, 23 Jun 2026 00:00:00 +0000</pubDate>
        <link>https://blog.zvestov.cz/sport/2026/06/23/brannball.html</link>
        <guid isPermaLink="true">https://blog.zvestov.cz/sport/2026/06/23/brannball.html</guid>
        
        
        <category>sport</category>
        
      </item>
    
      <item>
        <title>Přidání not-null sloupce v JPA</title>
        <description>&lt;div style=&quot;float: left; margin: 0 1em 1em 0; text-align: center;&quot;&gt;&lt;img src=&quot;/assets/2026-05-14/db.png&quot; /&gt;&lt;/div&gt;

&lt;p&gt;Ani v dnešním světě AI nerezignuju na architekturu nebo právě proto na ní lpím o to víc.
Stroje vám možná dokážou odpovídat, ale zatím ještě se musíte umět správně ptát.
Tentokrát se chci zaměřit na situaci, jak za použití JPA rozvíjet existující datový model a přitom nerezignovat na integritní omezení.&lt;/p&gt;

&lt;div style=&quot;clear:both&quot;&gt;&lt;/div&gt;
&lt;!--more--&gt;

&lt;h2 id=&quot;úvod&quot;&gt;Úvod&lt;/h2&gt;

&lt;p&gt;Mějme situaci, kdy potřebujeme přidat databázový sloupec.
Dává smysl, aby byl &lt;em&gt;not-null&lt;/em&gt;, ale co s existujícími záznamy?
Někdy lze vložit rozumnou výchozí hodnotu, někdy hodnotu s přiměřeným úsilím dopočítat, jindy zase vložit záslepku.
Co když mi ale vyhovuje &lt;em&gt;null&lt;/em&gt; pro existující záznamy, ale nové řádky už chci striktně validovat?&lt;/p&gt;

&lt;h2 id=&quot;řešení&quot;&gt;Řešení&lt;/h2&gt;

&lt;p&gt;V databázi přidáme nový sloupec, ale ponecháme ho jako &lt;em&gt;nullable&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Na databázové úrovni tedy integritní omezení neudržíme, ale pojďme to vyřešit na aplikační vrstvě, kde používám JPA se Spring Boot.
Využijme &lt;em&gt;bean validation&lt;/em&gt; a označíme field jako &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;jakarta.validation.constraints.NotNull&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Začnou se nám kupit problémy, ale ty zvládneme vyřešit.
Vytváříte-li databázové schéma z java tříd (zejména pro testovací H2), promítají se validační pravidla přímo do databáze.
To vypneme následující property.&lt;/p&gt;

&lt;div class=&quot;language-properties highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;py&quot;&gt;spring.jpa.properties.hibernate.validator.apply_to_ddl&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;false&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Nyní můžeme načíst existující řádky, kde je sloupec &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;null&lt;/code&gt; a zároveň nebudeme moci vložit nové řádky, které by porušovaly validační pravidlo.
Nicméně narazíme na další problém, že validace se spouští i při updatu záznamu, ať už explicitního či &lt;em&gt;dirty checku&lt;/em&gt;.
Nevzádáme to a využíváme ještě validační skupiny.&lt;/p&gt;

&lt;div class=&quot;language-properties highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;py&quot;&gt;spring.jpa.properties.jakarta.persistence.validation.group.pre-persist&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;cz.zvestov.blog.jpa.NotNullOnCreate&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;A filed onznačíme jako&lt;/p&gt;

&lt;div class=&quot;language-java highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nd&quot;&gt;@NotNull&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;groups&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;NotNullOnCreate&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Celý projekt naleznete na &lt;a href=&quot;https://github.com/banterCZ/blog-example-jpa-not-null&quot;&gt;GitHubu&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;závěr&quot;&gt;Závěr&lt;/h2&gt;

&lt;p&gt;Zvládneme načíst existující záznam, upravit jiný sloupec a uložit.
Zároveň nám to zabrání vložit nový záznam s &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;null&lt;/code&gt; hodnotou tohoto sloupce.&lt;/p&gt;

&lt;p&gt;Pozorný čtenář si všimne, že nám vypadla validace pro případ, kdybychom chtěli aktualizovat &lt;em&gt;not-null&lt;/em&gt; hodnotu na &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;null&lt;/code&gt;, to by nám teď prošlo.
Za domácí úkol se můžete zamyslet, jak by se mohl upravit &lt;em&gt;setter&lt;/em&gt;, abychom této situaci zabránili.&lt;/p&gt;
</description>
        <pubDate>Thu, 14 May 2026 00:00:00 +0000</pubDate>
        <link>https://blog.zvestov.cz/software%20development/2026/05/14/pridani-not-null-sloupce-v-jpa.html</link>
        <guid isPermaLink="true">https://blog.zvestov.cz/software%20development/2026/05/14/pridani-not-null-sloupce-v-jpa.html</guid>
        
        <category>JPA</category>
        
        
        <category>software development</category>
        
      </item>
    
      <item>
        <title>Silné stránky programátorů</title>
        <description>&lt;div style=&quot;float: left; margin: 0 1em 1em 0; text-align: center;&quot;&gt;&lt;img src=&quot;/assets/2026-03-18/329815.png&quot; /&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href=&quot;https://www.jednoprocento.cz/p/a-co-vy-uz-jste-prozili-svuj-tah&quot;&gt;Miloš Čermák přišel s trefným shrnutím&lt;/a&gt;: „AI je dnes v podstatě tři věci najednou: obtěžující, znepokojující a fascinující.“
I bez toho jsem již dřívě uvažoval, čím bych se živil, kdybych zrovna nebyl programátorem.
Pokusím se co nejméně plivat síru na AI a najít důvody, jak bych mohl obstát.&lt;/p&gt;

&lt;p&gt;Kdysi jsem napsal pro Heroine &lt;a href=&quot;https://www.heroine.cz/zeny-it/7677-u-budoucich-ajtaku-je-nejdulezitejsi-touha-nespokojit-se-s-prvnim-resenim-rika-lektor-programovani-pro-deti&quot;&gt;článek o kroužku programování&lt;/a&gt;, jako titulek si vybrali: „U budoucích ajťáků je nejdůležitější touha nespokojit se s prvním řešením.“&lt;br /&gt;
Ano, mimo jiné, ale kdybych měl jmenovat superschopnosti programátorů, co by to asi bylo?&lt;/p&gt;

&lt;div style=&quot;clear:both&quot;&gt;&lt;/div&gt;
&lt;!--more--&gt;

&lt;h2 id=&quot;psaní-kódu-versus-řešení-problémů&quot;&gt;Psaní kódu versus řešení problémů&lt;/h2&gt;

&lt;p&gt;Nejsme placení za psaní kódu (i když nás to baví), ale za řešení problémů.
Hned mi vytane &lt;a href=&quot;https://www.youtube.com/watch?v=aLK_sHpbWCc&quot;&gt;scéna z Pulp Fiction&lt;/a&gt;: „Jsem pan Wolf, řeším problémy.“&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://andrewmurphy.io/blog/if-you-thought-the-speed-of-writing-code-was-your-problem-you-have-bigger-problems&quot;&gt;Pokud jste si mysleli, že vaším problémem je rychlost psaní kódu, máte mnohem větší starosti.&lt;/a&gt;&lt;/p&gt;

&lt;iframe class=&quot;center&quot; width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/aLK_sHpbWCc?si=OyEhkG3qyRI65env&quot; title=&quot;YouTube video player&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot; referrerpolicy=&quot;strict-origin-when-cross-origin&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;

&lt;h2 id=&quot;analytická-mysl&quot;&gt;Analytická mysl&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;https://terriblesoftware.org/2025/11/25/what-actually-makes-you-senior/&quot;&gt;Klademe otázky, na které nikoho jiného nenapadlo se zeptat&lt;/a&gt;, a rozbíjíme špatná zadání.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://www.commitstrip.com/en/2016/08/25/a-very-comprehensive-and-precise-spec/&quot;&gt;Aby bylo možné nahradit programátory roboty, budou muset zákazníci přesně popsat, co chtějí.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/2026-03-18/Strip-Les-specs-cest-du-code-650-finalenglish.jpg&quot; alt=&quot;&quot; class=&quot;center&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://martinfowler.com/fragments/2026-03-10.html&quot;&gt;Martin Fowler a jeho kolegové se zamýšleli nad strojovou migrací COBOLu&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Přímý překlad by v nejlepším případě věrně zachytil stávající architektonická omezení, nahromaděné technické dluhy a zastaralá projektová rozhodnutí.
Neřešil by slabá místa; pouze by je převedl do jiného jazyka.&lt;/p&gt;

  &lt;p&gt;…&lt;/p&gt;

  &lt;p&gt;V praxi modernizace málokdy spočívá v zachování minulosti v nové syntaxi.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id=&quot;hravost-a-odvaha&quot;&gt;Hravost a odvaha&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;https://stallman.org/articles/on-hacking.html&quot;&gt;Richard Stallman se zamýšlí nad původním významem slova Hacking.&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Je obtížné napsat jednoduchou definici něčeho tak rozmanitého jako je hacking, ale myslím si, že společným znakem těchto aktivit je hravost, chytrost a objevování.
Hacking tedy znamená zkoumání hranic možného v duchu hravé chytrosti.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Programátoři jsou podle mě troufalí až drzí, ve stylu Pipi Dlouhá punčocha: „To jsem ještě nikdy nedělala, to mi určitě půjde!“
Naučit se nový framework, &lt;a href=&quot;https://www.youtube.com/watch?v=s3n55CpS3CE&quot;&gt;opravit myčku&lt;/a&gt;, &lt;a href=&quot;/bydlen%C3%AD/2024/07/29/jak-jsem-debuggoval-kotel.html&quot;&gt;debuggovat kotel&lt;/a&gt; či &lt;a href=&quot;/bydlení/2013/09/23/jak-se-stavi-dum-svepomoci.html&quot;&gt;postavit dům svépomocí&lt;/a&gt;?
Pusťte mě k tomu!&lt;/p&gt;

&lt;iframe class=&quot;center&quot; width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/s3n55CpS3CE?si=nyrIY2Iu8dedr3Ed&quot; title=&quot;YouTube video player&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot; referrerpolicy=&quot;strict-origin-when-cross-origin&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;

&lt;h2 id=&quot;myšlení&quot;&gt;Myšlení&lt;/h2&gt;

&lt;p&gt;Budu &lt;a href=&quot;https://witter.cz/@calavera/116123006791829816&quot;&gt;citovat Frantu Řezáče&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Umět programovat znamená ve své podstatě umět myslet. Kdo to neumí sám, toho LLM nezachrání.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote class=&quot;mastodon-embed&quot; data-embed-url=&quot;https://witter.cz/@calavera/116123006791829816/embed&quot; style=&quot;background: #FCF8FF; border-radius: 8px; border: 1px solid #C9C4DA; margin: 0; max-width: 540px; min-width: 270px; overflow: hidden; padding: 0;&quot;&gt; &lt;a href=&quot;https://witter.cz/@calavera/116123006791829816&quot; target=&quot;_blank&quot; style=&quot;align-items: center; color: #1C1A25; display: flex; flex-direction: column; font-family: system-ui, -apple-system, BlinkMacSystemFont, &apos;Segoe UI&apos;, Oxygen, Ubuntu, Cantarell, &apos;Fira Sans&apos;, &apos;Droid Sans&apos;, &apos;Helvetica Neue&apos;, Roboto, sans-serif; font-size: 14px; justify-content: center; letter-spacing: 0.25px; line-height: 20px; padding: 24px; text-decoration: none;&quot;&gt; &lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; xmlns:xlink=&quot;http://www.w3.org/1999/xlink&quot; width=&quot;32&quot; height=&quot;32&quot; viewBox=&quot;0 0 79 75&quot;&gt;&lt;path d=&quot;M63 45.3v-20c0-4.1-1-7.3-3.2-9.7-2.1-2.4-5-3.7-8.5-3.7-4.1 0-7.2 1.6-9.3 4.7l-2 3.3-2-3.3c-2-3.1-5.1-4.7-9.2-4.7-3.5 0-6.4 1.3-8.6 3.7-2.1 2.4-3.1 5.6-3.1 9.7v20h8V25.9c0-4.1 1.7-6.2 5.2-6.2 3.8 0 5.8 2.5 5.8 7.4V37.7H44V27.1c0-4.9 1.9-7.4 5.8-7.4 3.5 0 5.2 2.1 5.2 6.2V45.3h8ZM74.7 16.6c.6 6 .1 15.7.1 17.3 0 .5-.1 4.8-.1 5.3-.7 11.5-8 16-15.6 17.5-.1 0-.2 0-.3 0-4.9 1-10 1.2-14.9 1.4-1.2 0-2.4 0-3.6 0-4.8 0-9.7-.6-14.4-1.7-.1 0-.1 0-.1 0s-.1 0-.1 0 0 .1 0 .1 0 0 0 0c.1 1.6.4 3.1 1 4.5.6 1.7 2.9 5.7 11.4 5.7 5 0 9.9-.6 14.8-1.7 0 0 0 0 0 0 .1 0 .1 0 .1 0 0 .1 0 .1 0 .1.1 0 .1 0 .1.1v5.6s0 .1-.1.1c0 0 0 0 0 .1-1.6 1.1-3.7 1.7-5.6 2.3-.8.3-1.6.5-2.4.7-7.5 1.7-15.4 1.3-22.7-1.2-6.8-2.4-13.8-8.2-15.5-15.2-.9-3.8-1.6-7.6-1.9-11.5-.6-5.8-.6-11.7-.8-17.5C3.9 24.5 4 20 4.9 16 6.7 7.9 14.1 2.2 22.3 1c1.4-.2 4.1-1 16.5-1h.1C51.4 0 56.7.8 58.1 1c8.4 1.2 15.5 7.5 16.6 15.6Z&quot; fill=&quot;currentColor&quot; /&gt;&lt;/svg&gt; &lt;div style=&quot;color: #787588; margin-top: 16px;&quot;&gt;Post by @calavera@witter.cz&lt;/div&gt; &lt;div style=&quot;font-weight: 500;&quot;&gt;View on Mastodon&lt;/div&gt; &lt;/a&gt; &lt;/blockquote&gt;
&lt;script data-allowed-prefixes=&quot;https://witter.cz/&quot; async=&quot;&quot; src=&quot;https://witter.cz/embed.js&quot;&gt;&lt;/script&gt;

&lt;p&gt;&lt;br /&gt;
A mě baví myslet.&lt;/p&gt;

&lt;h2 id=&quot;zodpovědnost&quot;&gt;Zodpovědnost&lt;/h2&gt;

&lt;p&gt;Programátoři jsou za svoji práci zodpovědní.
&lt;a href=&quot;https://fazy.medium.com/agentic-coding-ais-adolescence-b0d13452f981&quot;&gt;AI agenti zlevňují výstupy. Nezlevňují však odpovědnost.&lt;/a&gt;&lt;/p&gt;

&lt;h2 id=&quot;závěr&quot;&gt;Závěr&lt;/h2&gt;

&lt;p&gt;Tento výčet superschopností programátorů jistě nebude kompletní. 
Věřím, že bychom je uplatnili i jinde, kdyby nás náhodou nahradily stroje.&lt;/p&gt;

&lt;h2 id=&quot;související&quot;&gt;Související&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.heroine.cz/zeny-it/7677-u-budoucich-ajtaku-je-nejdulezitejsi-touha-nespokojit-se-s-prvnim-resenim-rika-lektor-programovani-pro-deti&quot;&gt;U budoucích ajťáků je nejdůležitější touha nespokojit se s prvním řešením (Heroine)&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://terriblesoftware.org/2025/11/25/what-actually-makes-you-senior/&quot;&gt;What Actually Makes You Senior&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://andrewmurphy.io/blog/if-you-thought-the-speed-of-writing-code-was-your-problem-you-have-bigger-problems&quot;&gt;If you thought the speed of writing code was your problem - you have bigger problems&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://fazy.medium.com/agentic-coding-ais-adolescence-b0d13452f981&quot;&gt;Verification debt: the hidden cost of AI-generated code&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://stallman.org/articles/on-hacking.html&quot;&gt;On Hacking&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://naildrivin5.com/blog/2026/02/23/the-death-of-the-software-craftsman.html&quot;&gt;The Death of the Software Craftsman&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        <pubDate>Wed, 18 Mar 2026 00:00:00 +0000</pubDate>
        <link>https://blog.zvestov.cz/software%20development/2026/03/18/silne-stranky-programatoru.html</link>
        <guid isPermaLink="true">https://blog.zvestov.cz/software%20development/2026/03/18/silne-stranky-programatoru.html</guid>
        
        
        <category>software development</category>
        
      </item>
    
      <item>
        <title>Zastav Lego Pybricks na čáře</title>
        <description>&lt;div style=&quot;float: left; margin: 0 1em 1em 0; text-align: center;&quot;&gt;&lt;img src=&quot;/assets/2026-01-24/pybricks-logo.png&quot; /&gt;&lt;/div&gt;

&lt;p&gt;Stejně jako minulý rok se i letos zúčastníme soutěže &lt;a href=&quot;/software%20development/2025/03/23/first-lego-league-challenge.html&quot;&gt;FIRST Lego League Challenge&lt;/a&gt;.
Tentokrát už jsme si vyzkoušeli &lt;a href=&quot;https://pybricks.com/&quot;&gt;Pybricks&lt;/a&gt;.
Nečekejte ode mě shrnutí nebo nějakou recenzi, ale děti se mě zeptaly na jednu úlohu, kterou jsem v tom mumraji neodbavil okamžitou radou na místě.
Takže si plním za domácí úkol.
Jak zastavit Lego robota na černé čáře pomocí Pybricks?&lt;/p&gt;

&lt;div style=&quot;clear:both&quot;&gt;&lt;/div&gt;
&lt;!--more--&gt;

&lt;p&gt;&lt;img src=&quot;/assets/2026-01-24/IMG_9414.jpeg&quot; alt=&quot;&quot; class=&quot;center&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;pybricks&quot;&gt;Pybricks&lt;/h2&gt;

&lt;p&gt;Již loni se nám Pybricks dostal do hledáčku, že bychom tím nahradili prostředí &lt;a href=&quot;https://spike.legoeducation.com/&quot;&gt;Lego Spike&lt;/a&gt;.
Má nějaké zajímavé API jako například udržení rovného směru pomocí gyroskopu.
Varianta s Python kódem je zdarma, ale tím děti zatím trápit nechci.
Umožňuje používat i grafické bloky, na které jsou zvyklé, bohužel mi &lt;a href=&quot;https://pybricks.onfastspring.com/&quot;&gt;licence nepřijde zrovna levná&lt;/a&gt;.
I když použijete bloky, projekt si vyexportujete do Pythonu, což může v učení pomoci.&lt;/p&gt;

&lt;h2 id=&quot;zastavení&quot;&gt;Zastavení&lt;/h2&gt;

&lt;p&gt;Úloha „zastav se na čáře“ je velmi praktická.
Ostatně na herní plánu je několik čar, které můžete (ale nemusíte) k orientaci využít.
Lego má barevný senzor a k němu existuje &lt;a href=&quot;https://docs.pybricks.com/en/latest/pupdevices/colorsensor.html&quot;&gt;Pybricks API&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Neuvědomil jsem si, že přesnost měření barvy bude záviset na okolním osvětlení a při použití hodnoty odrazivosti nebude černá nikdy nula (přece jen něco odrazí).
Chvilku jsem debugoval, jaké hodnoty naměřím na různých površích.
Nakonec jsem pro sebe použil hodnotu 20 (20 % odrazivosti).&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/2026-01-24/pybricks_debug.png&quot; alt=&quot;&quot; class=&quot;center&quot; /&gt;&lt;/p&gt;

&lt;p&gt;A pak už se k výslednému programu dostaneme poměrně přímočaře.
V blocích to může vypadat takto.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/2026-01-24/pybricks_program.png&quot; alt=&quot;&quot; class=&quot;center&quot; /&gt;&lt;/p&gt;

&lt;p&gt;V Pythonu takto.&lt;/p&gt;

&lt;noscript&gt;&lt;pre&gt;# pybricks blocks file:{&amp;quot;blocks&amp;quot;:{&amp;quot;languageVersion&amp;quot;:0,&amp;quot;blocks&amp;quot;:[{&amp;quot;type&amp;quot;:&amp;quot;blockGlobalSetup&amp;quot;,&amp;quot;id&amp;quot;:&amp;quot;bjK,wS1MYO7aiYkFSwd{&amp;quot;,&amp;quot;x&amp;quot;:4,&amp;quot;y&amp;quot;:51,&amp;quot;deletable&amp;quot;:false,&amp;quot;next&amp;quot;:{&amp;quot;block&amp;quot;:{&amp;quot;type&amp;quot;:&amp;quot;variables_set_prime_hub&amp;quot;,&amp;quot;id&amp;quot;:&amp;quot;{)WuTTGMSJwLS.H*~PKI&amp;quot;,&amp;quot;extraState&amp;quot;:{&amp;quot;optionLevel&amp;quot;:1},&amp;quot;fields&amp;quot;:{&amp;quot;VAR&amp;quot;:{&amp;quot;id&amp;quot;:&amp;quot;0ac8)M*M0@okqL6j*T]k&amp;quot;}},&amp;quot;inputs&amp;quot;:{&amp;quot;AXIS_TOP&amp;quot;:{&amp;quot;shadow&amp;quot;:{&amp;quot;type&amp;quot;:&amp;quot;blockParametersAxis&amp;quot;,&amp;quot;id&amp;quot;:&amp;quot;G~~=qPiIM)z4Qy;ugq.J&amp;quot;,&amp;quot;fields&amp;quot;:{&amp;quot;VALUE&amp;quot;:&amp;quot;z&amp;quot;}}},&amp;quot;AXIS_FRONT&amp;quot;:{&amp;quot;shadow&amp;quot;:{&amp;quot;type&amp;quot;:&amp;quot;blockParametersAxis&amp;quot;,&amp;quot;id&amp;quot;:&amp;quot;=O,F=r_j:y!5C6~`*A2D&amp;quot;,&amp;quot;fields&amp;quot;:{&amp;quot;VALUE&amp;quot;:&amp;quot;y&amp;quot;}}}},&amp;quot;next&amp;quot;:{&amp;quot;block&amp;quot;:{&amp;quot;type&amp;quot;:&amp;quot;variables_set_motor&amp;quot;,&amp;quot;id&amp;quot;:&amp;quot;S?(a.C=~LVoJ~3YRo;}.&amp;quot;,&amp;quot;fields&amp;quot;:{&amp;quot;VAR&amp;quot;:{&amp;quot;id&amp;quot;:&amp;quot;9-KY1{EjNJxUixuEoYJ?&amp;quot;}},&amp;quot;inputs&amp;quot;:{&amp;quot;PORT&amp;quot;:{&amp;quot;shadow&amp;quot;:{&amp;quot;type&amp;quot;:&amp;quot;blockParametersPort&amp;quot;,&amp;quot;id&amp;quot;:&amp;quot;pE~{$Zwzpz`i_VDqm^ab&amp;quot;,&amp;quot;fields&amp;quot;:{&amp;quot;NAME&amp;quot;:&amp;quot;A&amp;quot;}}},&amp;quot;POSITIVE_DIRECTION&amp;quot;:{&amp;quot;shadow&amp;quot;:{&amp;quot;type&amp;quot;:&amp;quot;blockParametersDirection&amp;quot;,&amp;quot;id&amp;quot;:&amp;quot;VrW-zLpmx[j,+8v+,L[1&amp;quot;,&amp;quot;fields&amp;quot;:{&amp;quot;SELECTION&amp;quot;:&amp;quot;Direction.COUNTERCLOCKWISE&amp;quot;}}}},&amp;quot;next&amp;quot;:{&amp;quot;block&amp;quot;:{&amp;quot;type&amp;quot;:&amp;quot;variables_set_motor&amp;quot;,&amp;quot;id&amp;quot;:&amp;quot;3,Y?*Mn1@v9fJ`yYW6Sf&amp;quot;,&amp;quot;fields&amp;quot;:{&amp;quot;VAR&amp;quot;:{&amp;quot;id&amp;quot;:&amp;quot;@(Mc?VKF9P+IVA!,)0R;&amp;quot;}},&amp;quot;inputs&amp;quot;:{&amp;quot;PORT&amp;quot;:{&amp;quot;shadow&amp;quot;:{&amp;quot;type&amp;quot;:&amp;quot;blockParametersPort&amp;quot;,&amp;quot;id&amp;quot;:&amp;quot;r`9bbROX1dwatV7O$.:`&amp;quot;,&amp;quot;fields&amp;quot;:{&amp;quot;NAME&amp;quot;:&amp;quot;E&amp;quot;}}},&amp;quot;POSITIVE_DIRECTION&amp;quot;:{&amp;quot;shadow&amp;quot;:{&amp;quot;type&amp;quot;:&amp;quot;blockParametersDirection&amp;quot;,&amp;quot;id&amp;quot;:&amp;quot;Fk;M%s,~BY}0ww1j30bP&amp;quot;,&amp;quot;fields&amp;quot;:{&amp;quot;SELECTION&amp;quot;:&amp;quot;Direction.CLOCKWISE&amp;quot;}}}},&amp;quot;next&amp;quot;:{&amp;quot;block&amp;quot;:{&amp;quot;type&amp;quot;:&amp;quot;variables_set_motor&amp;quot;,&amp;quot;id&amp;quot;:&amp;quot;^b]cQj|TmdV%cZJhl0gI&amp;quot;,&amp;quot;fields&amp;quot;:{&amp;quot;VAR&amp;quot;:{&amp;quot;id&amp;quot;:&amp;quot;#~*U;Y3)}OaA),GbQ/cW&amp;quot;}},&amp;quot;inputs&amp;quot;:{&amp;quot;PORT&amp;quot;:{&amp;quot;shadow&amp;quot;:{&amp;quot;type&amp;quot;:&amp;quot;blockParametersPort&amp;quot;,&amp;quot;id&amp;quot;:&amp;quot;?.^x_gX%wU.Xv.#3wRPP&amp;quot;,&amp;quot;fields&amp;quot;:{&amp;quot;NAME&amp;quot;:&amp;quot;D&amp;quot;}}},&amp;quot;POSITIVE_DIRECTION&amp;quot;:{&amp;quot;shadow&amp;quot;:{&amp;quot;type&amp;quot;:&amp;quot;blockParametersDirection&amp;quot;,&amp;quot;id&amp;quot;:&amp;quot;0Np/F+n#MjwgBk{6MrPK&amp;quot;,&amp;quot;fields&amp;quot;:{&amp;quot;SELECTION&amp;quot;:&amp;quot;Direction.CLOCKWISE&amp;quot;}}}},&amp;quot;next&amp;quot;:{&amp;quot;block&amp;quot;:{&amp;quot;type&amp;quot;:&amp;quot;variables_set_motor&amp;quot;,&amp;quot;id&amp;quot;:&amp;quot;I#`Wxj%/1]|h{X+ZQ;3Y&amp;quot;,&amp;quot;fields&amp;quot;:{&amp;quot;VAR&amp;quot;:{&amp;quot;id&amp;quot;:&amp;quot;xE_y9@2/n%+##W#h*hFj&amp;quot;}},&amp;quot;inputs&amp;quot;:{&amp;quot;PORT&amp;quot;:{&amp;quot;shadow&amp;quot;:{&amp;quot;type&amp;quot;:&amp;quot;blockParametersPort&amp;quot;,&amp;quot;id&amp;quot;:&amp;quot;j1eKhU`bdoHdh)~]Hl2b&amp;quot;,&amp;quot;fields&amp;quot;:{&amp;quot;NAME&amp;quot;:&amp;quot;C&amp;quot;}}},&amp;quot;POSITIVE_DIRECTION&amp;quot;:{&amp;quot;shadow&amp;quot;:{&amp;quot;type&amp;quot;:&amp;quot;blockParametersDirection&amp;quot;,&amp;quot;id&amp;quot;:&amp;quot;|$c/*_TuT!~8{cQFN{[f&amp;quot;,&amp;quot;fields&amp;quot;:{&amp;quot;SELECTION&amp;quot;:&amp;quot;Direction.CLOCKWISE&amp;quot;}}}},&amp;quot;next&amp;quot;:{&amp;quot;block&amp;quot;:{&amp;quot;type&amp;quot;:&amp;quot;variables_set_drive_base&amp;quot;,&amp;quot;id&amp;quot;:&amp;quot;B@6q{(N{H$OlQN@o(=#7&amp;quot;,&amp;quot;fields&amp;quot;:{&amp;quot;VAR&amp;quot;:{&amp;quot;id&amp;quot;:&amp;quot;/@.Q%T4BjtqKCq7$UAbr&amp;quot;}},&amp;quot;inputs&amp;quot;:{&amp;quot;VAR&amp;quot;:{&amp;quot;shadow&amp;quot;:{&amp;quot;type&amp;quot;:&amp;quot;variables_get_motor_device&amp;quot;,&amp;quot;id&amp;quot;:&amp;quot;h-`^(Zu#NTvZ*mW#2vcD&amp;quot;,&amp;quot;fields&amp;quot;:{&amp;quot;VAR&amp;quot;:{&amp;quot;id&amp;quot;:&amp;quot;9-KY1{EjNJxUixuEoYJ?&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;kolo leve&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;Motor&amp;quot;}}}},&amp;quot;VAR2&amp;quot;:{&amp;quot;shadow&amp;quot;:{&amp;quot;type&amp;quot;:&amp;quot;variables_get_motor_device&amp;quot;,&amp;quot;id&amp;quot;:&amp;quot;CD5,af-R[yO,bE]-?Uf_&amp;quot;,&amp;quot;fields&amp;quot;:{&amp;quot;VAR&amp;quot;:{&amp;quot;id&amp;quot;:&amp;quot;@(Mc?VKF9P+IVA!,)0R;&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;kolo prave&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;Motor&amp;quot;}}}},&amp;quot;VALUE0&amp;quot;:{&amp;quot;shadow&amp;quot;:{&amp;quot;type&amp;quot;:&amp;quot;unit_distance&amp;quot;,&amp;quot;id&amp;quot;:&amp;quot;GNgo@U(M|24Obsy~%4x{&amp;quot;,&amp;quot;fields&amp;quot;:{&amp;quot;VALUE0&amp;quot;:88}}},&amp;quot;VALUE1&amp;quot;:{&amp;quot;shadow&amp;quot;:{&amp;quot;type&amp;quot;:&amp;quot;unit_distance&amp;quot;,&amp;quot;id&amp;quot;:&amp;quot;cIT+~l^nylC1%}(,bsKB&amp;quot;,&amp;quot;fields&amp;quot;:{&amp;quot;VALUE0&amp;quot;:144}}}},&amp;quot;next&amp;quot;:{&amp;quot;block&amp;quot;:{&amp;quot;type&amp;quot;:&amp;quot;variables_set_color_sensor&amp;quot;,&amp;quot;id&amp;quot;:&amp;quot;0]Gny{r@pu-me0u.qL+H&amp;quot;,&amp;quot;extraState&amp;quot;:{&amp;quot;optionLevel&amp;quot;:0},&amp;quot;fields&amp;quot;:{&amp;quot;VAR&amp;quot;:{&amp;quot;id&amp;quot;:&amp;quot;4q7cl%:FR{.%!.~b;=4j&amp;quot;}},&amp;quot;inputs&amp;quot;:{&amp;quot;PORT&amp;quot;:{&amp;quot;shadow&amp;quot;:{&amp;quot;type&amp;quot;:&amp;quot;blockParametersPort&amp;quot;,&amp;quot;id&amp;quot;:&amp;quot;HrOt9)|o*,]VPV8SDZ9E&amp;quot;,&amp;quot;fields&amp;quot;:{&amp;quot;NAME&amp;quot;:&amp;quot;B&amp;quot;}}}},&amp;quot;next&amp;quot;:{&amp;quot;block&amp;quot;:{&amp;quot;type&amp;quot;:&amp;quot;variables_set_color_sensor&amp;quot;,&amp;quot;id&amp;quot;:&amp;quot;x.AGwFp0|}^R*%F(%TcG&amp;quot;,&amp;quot;extraState&amp;quot;:{&amp;quot;optionLevel&amp;quot;:0},&amp;quot;fields&amp;quot;:{&amp;quot;VAR&amp;quot;:{&amp;quot;id&amp;quot;:&amp;quot;^z-R_D5t#~Oky5)7@fjS&amp;quot;}},&amp;quot;inputs&amp;quot;:{&amp;quot;PORT&amp;quot;:{&amp;quot;shadow&amp;quot;:{&amp;quot;type&amp;quot;:&amp;quot;blockParametersPort&amp;quot;,&amp;quot;id&amp;quot;:&amp;quot;I!+TlWLqzTDYY6^$uKdf&amp;quot;,&amp;quot;fields&amp;quot;:{&amp;quot;NAME&amp;quot;:&amp;quot;F&amp;quot;}}}}}}}}}}}}}}}}}}}}},{&amp;quot;type&amp;quot;:&amp;quot;blockGlobalStart&amp;quot;,&amp;quot;id&amp;quot;:&amp;quot;3tJe|AWl0baN(wH9a$@.&amp;quot;,&amp;quot;x&amp;quot;:990,&amp;quot;y&amp;quot;:44,&amp;quot;deletable&amp;quot;:false,&amp;quot;next&amp;quot;:{&amp;quot;block&amp;quot;:{&amp;quot;type&amp;quot;:&amp;quot;blockDriveBaseUseGyro&amp;quot;,&amp;quot;id&amp;quot;:&amp;quot;W=Lm:RpeA}v?nKUf*^6.&amp;quot;,&amp;quot;fields&amp;quot;:{&amp;quot;METHOD&amp;quot;:&amp;quot;DRIVEBASE_USE_GYRO_TRUE&amp;quot;},&amp;quot;inputs&amp;quot;:{&amp;quot;VAR&amp;quot;:{&amp;quot;shadow&amp;quot;:{&amp;quot;type&amp;quot;:&amp;quot;variables_get_drive_base_device&amp;quot;,&amp;quot;id&amp;quot;:&amp;quot;i{6(E*p~D3tY|M-^UtvG&amp;quot;,&amp;quot;fields&amp;quot;:{&amp;quot;VAR&amp;quot;:{&amp;quot;id&amp;quot;:&amp;quot;/@.Q%T4BjtqKCq7$UAbr&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;drive base&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;DriveBase&amp;quot;}}}}},&amp;quot;next&amp;quot;:{&amp;quot;block&amp;quot;:{&amp;quot;type&amp;quot;:&amp;quot;blockDriveBaseConfigure&amp;quot;,&amp;quot;id&amp;quot;:&amp;quot;g3I/xPp1/oeRSee5-LA^&amp;quot;,&amp;quot;extraState&amp;quot;:{&amp;quot;optionLevel&amp;quot;:1},&amp;quot;fields&amp;quot;:{&amp;quot;METHOD&amp;quot;:&amp;quot;DRIVEBASE_STRAIGHT_SPEED&amp;quot;},&amp;quot;inputs&amp;quot;:{&amp;quot;VAR&amp;quot;:{&amp;quot;shadow&amp;quot;:{&amp;quot;type&amp;quot;:&amp;quot;variables_get_drive_base_device&amp;quot;,&amp;quot;id&amp;quot;:&amp;quot;Z+6V|uC*Z3_Z4Pd$0di/&amp;quot;,&amp;quot;fields&amp;quot;:{&amp;quot;VAR&amp;quot;:{&amp;quot;id&amp;quot;:&amp;quot;/@.Q%T4BjtqKCq7$UAbr&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;drive base&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;DriveBase&amp;quot;}}}},&amp;quot;ARG0&amp;quot;:{&amp;quot;shadow&amp;quot;:{&amp;quot;type&amp;quot;:&amp;quot;unit_speed&amp;quot;,&amp;quot;id&amp;quot;:&amp;quot;oc%m!QtUlj%nS}0wUkdH&amp;quot;,&amp;quot;fields&amp;quot;:{&amp;quot;VALUE0&amp;quot;:500}}}},&amp;quot;next&amp;quot;:{&amp;quot;block&amp;quot;:{&amp;quot;type&amp;quot;:&amp;quot;blockFlowWhile&amp;quot;,&amp;quot;id&amp;quot;:&amp;quot;^w![3wsmge-,nl%)9)_2&amp;quot;,&amp;quot;fields&amp;quot;:{&amp;quot;MODE&amp;quot;:&amp;quot;WHILE&amp;quot;},&amp;quot;inputs&amp;quot;:{&amp;quot;BOOL&amp;quot;:{&amp;quot;shadow&amp;quot;:{&amp;quot;type&amp;quot;:&amp;quot;blockLogicTrue&amp;quot;,&amp;quot;id&amp;quot;:&amp;quot;|%RuaCQaVxPi_*BB*Hea&amp;quot;},&amp;quot;block&amp;quot;:{&amp;quot;type&amp;quot;:&amp;quot;blockLogicCompare&amp;quot;,&amp;quot;id&amp;quot;:&amp;quot;0-l;i-(OX+f@B$[%Nv?7&amp;quot;,&amp;quot;fields&amp;quot;:{&amp;quot;OP1&amp;quot;:&amp;quot;GT&amp;quot;},&amp;quot;inputs&amp;quot;:{&amp;quot;A&amp;quot;:{&amp;quot;shadow&amp;quot;:{&amp;quot;type&amp;quot;:&amp;quot;blockMathNumber&amp;quot;,&amp;quot;id&amp;quot;:&amp;quot;0R9k4vfG#^mUZ#xuV!Yy&amp;quot;,&amp;quot;fields&amp;quot;:{&amp;quot;NUM&amp;quot;:3}},&amp;quot;block&amp;quot;:{&amp;quot;type&amp;quot;:&amp;quot;blockLightReflection&amp;quot;,&amp;quot;id&amp;quot;:&amp;quot;xPaTrirocgrfw:z($hfN&amp;quot;,&amp;quot;inputs&amp;quot;:{&amp;quot;VAR&amp;quot;:{&amp;quot;shadow&amp;quot;:{&amp;quot;type&amp;quot;:&amp;quot;variables_get_light_intensity_device&amp;quot;,&amp;quot;id&amp;quot;:&amp;quot;DOR_9uhk=S}7mpH~6ny:&amp;quot;,&amp;quot;fields&amp;quot;:{&amp;quot;VAR&amp;quot;:{&amp;quot;id&amp;quot;:&amp;quot;4q7cl%:FR{.%!.~b;=4j&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;senzor levy&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;ColorSensor&amp;quot;}}}}}}},&amp;quot;B&amp;quot;:{&amp;quot;shadow&amp;quot;:{&amp;quot;type&amp;quot;:&amp;quot;blockMathNumber&amp;quot;,&amp;quot;id&amp;quot;:&amp;quot;=Fis}(OW{eVsQ%GL+Xv?&amp;quot;,&amp;quot;fields&amp;quot;:{&amp;quot;NUM&amp;quot;:20}}}}}},&amp;quot;DO&amp;quot;:{&amp;quot;block&amp;quot;:{&amp;quot;type&amp;quot;:&amp;quot;blockDriveBaseDrive2&amp;quot;,&amp;quot;id&amp;quot;:&amp;quot;e!qh#u{yRC]5T}d88!wD&amp;quot;,&amp;quot;extraState&amp;quot;:{&amp;quot;optionLevel&amp;quot;:2},&amp;quot;fields&amp;quot;:{&amp;quot;METHOD&amp;quot;:&amp;quot;DRIVEBASE_DRIVE_STRAIGHT&amp;quot;},&amp;quot;inputs&amp;quot;:{&amp;quot;VAR&amp;quot;:{&amp;quot;shadow&amp;quot;:{&amp;quot;type&amp;quot;:&amp;quot;variables_get_drive_base_device&amp;quot;,&amp;quot;id&amp;quot;:&amp;quot;Fn3J0txHNG:z99+vK!pI&amp;quot;,&amp;quot;fields&amp;quot;:{&amp;quot;VAR&amp;quot;:{&amp;quot;id&amp;quot;:&amp;quot;/@.Q%T4BjtqKCq7$UAbr&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;drive base&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;DriveBase&amp;quot;}}}},&amp;quot;ARG0&amp;quot;:{&amp;quot;shadow&amp;quot;:{&amp;quot;type&amp;quot;:&amp;quot;unit_distance&amp;quot;,&amp;quot;id&amp;quot;:&amp;quot;Zf;zZ*m@T_Mm5%_U]r.u&amp;quot;,&amp;quot;fields&amp;quot;:{&amp;quot;VALUE0&amp;quot;:50}}},&amp;quot;ARG1&amp;quot;:{&amp;quot;shadow&amp;quot;:{&amp;quot;type&amp;quot;:&amp;quot;parameters_stop_4&amp;quot;,&amp;quot;id&amp;quot;:&amp;quot;m4%XtpLADnb=l]x@*bmt&amp;quot;,&amp;quot;fields&amp;quot;:{&amp;quot;VALUE&amp;quot;:&amp;quot;Stop.NONE&amp;quot;}}}}}}},&amp;quot;next&amp;quot;:{&amp;quot;block&amp;quot;:{&amp;quot;type&amp;quot;:&amp;quot;blockDriveBaseStop&amp;quot;,&amp;quot;id&amp;quot;:&amp;quot;FQcgVD9TN#4W;ib{Q}Dj&amp;quot;,&amp;quot;inputs&amp;quot;:{&amp;quot;VAR&amp;quot;:{&amp;quot;shadow&amp;quot;:{&amp;quot;type&amp;quot;:&amp;quot;variables_get_drive_base_device&amp;quot;,&amp;quot;id&amp;quot;:&amp;quot;sJ%~bnFg:!9s?/VX*/M(&amp;quot;,&amp;quot;fields&amp;quot;:{&amp;quot;VAR&amp;quot;:{&amp;quot;id&amp;quot;:&amp;quot;/@.Q%T4BjtqKCq7$UAbr&amp;quot;,&amp;quot;name&amp;quot;:&amp;quot;drive base&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;DriveBase&amp;quot;}}}},&amp;quot;VALUE0&amp;quot;:{&amp;quot;shadow&amp;quot;:{&amp;quot;type&amp;quot;:&amp;quot;parameters_stop_3&amp;quot;,&amp;quot;id&amp;quot;:&amp;quot;ELOu@BWpK(Ie4(+d)AL_&amp;quot;,&amp;quot;fields&amp;quot;:{&amp;quot;VALUE&amp;quot;:&amp;quot;Stop.HOLD&amp;quot;}}}}}}}}}}}}}]},&amp;quot;variables&amp;quot;:[{&amp;quot;name&amp;quot;:&amp;quot;red&amp;quot;,&amp;quot;id&amp;quot;:&amp;quot;^TRnlnrf1|b]54?=RSAE&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;ColorDef&amp;quot;},{&amp;quot;name&amp;quot;:&amp;quot;orange&amp;quot;,&amp;quot;id&amp;quot;:&amp;quot;T/Ga=6s={mOa/4,vyj]{&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;ColorDef&amp;quot;},{&amp;quot;name&amp;quot;:&amp;quot;yellow&amp;quot;,&amp;quot;id&amp;quot;:&amp;quot;z6p)=?w#+g|y@lU:VFt*&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;ColorDef&amp;quot;},{&amp;quot;name&amp;quot;:&amp;quot;green&amp;quot;,&amp;quot;id&amp;quot;:&amp;quot;PQR$ys-f%#*T_4`Rx0fH&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;ColorDef&amp;quot;},{&amp;quot;name&amp;quot;:&amp;quot;cyan&amp;quot;,&amp;quot;id&amp;quot;:&amp;quot;n3GEOv6@N!|xg_x}=GL+&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;ColorDef&amp;quot;},{&amp;quot;name&amp;quot;:&amp;quot;blue&amp;quot;,&amp;quot;id&amp;quot;:&amp;quot;G_|mnBi;ov8st$C/z;$W&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;ColorDef&amp;quot;},{&amp;quot;name&amp;quot;:&amp;quot;violet&amp;quot;,&amp;quot;id&amp;quot;:&amp;quot;MMX}YsyH/D)kVHpH2a/t&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;ColorDef&amp;quot;},{&amp;quot;name&amp;quot;:&amp;quot;magenta&amp;quot;,&amp;quot;id&amp;quot;:&amp;quot;@4TT%Ad^Qyn!IQ9HhF{H&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;ColorDef&amp;quot;},{&amp;quot;name&amp;quot;:&amp;quot;white&amp;quot;,&amp;quot;id&amp;quot;:&amp;quot;Yknl*y[~$s;/3RGi{ju1&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;ColorDef&amp;quot;},{&amp;quot;name&amp;quot;:&amp;quot;none&amp;quot;,&amp;quot;id&amp;quot;:&amp;quot;e|_}L8nQoa5[!)|??9+L&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;ColorDef&amp;quot;},{&amp;quot;name&amp;quot;:&amp;quot;prime hub&amp;quot;,&amp;quot;id&amp;quot;:&amp;quot;0ac8)M*M0@okqL6j*T]k&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;PrimeHub&amp;quot;},{&amp;quot;name&amp;quot;:&amp;quot;drive base&amp;quot;,&amp;quot;id&amp;quot;:&amp;quot;/@.Q%T4BjtqKCq7$UAbr&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;DriveBase&amp;quot;},{&amp;quot;name&amp;quot;:&amp;quot;kolo leve&amp;quot;,&amp;quot;id&amp;quot;:&amp;quot;9-KY1{EjNJxUixuEoYJ?&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;Motor&amp;quot;},{&amp;quot;name&amp;quot;:&amp;quot;kolo prave&amp;quot;,&amp;quot;id&amp;quot;:&amp;quot;@(Mc?VKF9P+IVA!,)0R;&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;Motor&amp;quot;},{&amp;quot;name&amp;quot;:&amp;quot;motor predni&amp;quot;,&amp;quot;id&amp;quot;:&amp;quot;#~*U;Y3)}OaA),GbQ/cW&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;Motor&amp;quot;},{&amp;quot;name&amp;quot;:&amp;quot;motor zadni&amp;quot;,&amp;quot;id&amp;quot;:&amp;quot;xE_y9@2/n%+##W#h*hFj&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;Motor&amp;quot;},{&amp;quot;name&amp;quot;:&amp;quot;motor&amp;quot;,&amp;quot;id&amp;quot;:&amp;quot;4f^oLh]vR?;f9cEyqLvm&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;Motor&amp;quot;},{&amp;quot;name&amp;quot;:&amp;quot;senzor levy&amp;quot;,&amp;quot;id&amp;quot;:&amp;quot;4q7cl%:FR{.%!.~b;=4j&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;ColorSensor&amp;quot;},{&amp;quot;name&amp;quot;:&amp;quot;senzor pravy&amp;quot;,&amp;quot;id&amp;quot;:&amp;quot;^z-R_D5t#~Oky5)7@fjS&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;ColorSensor&amp;quot;},{&amp;quot;name&amp;quot;:&amp;quot;sensor&amp;quot;,&amp;quot;id&amp;quot;:&amp;quot;-BWH)YE(r`_KzM)7#.kx&amp;quot;,&amp;quot;type&amp;quot;:&amp;quot;ColorSensor&amp;quot;}],&amp;quot;info&amp;quot;:{&amp;quot;type&amp;quot;:&amp;quot;pybricks&amp;quot;,&amp;quot;version&amp;quot;:&amp;quot;1.3.2&amp;quot;}}
from pybricks.hubs import PrimeHub
from pybricks.parameters import Axis, Direction, Port, Stop
from pybricks.pupdevices import ColorSensor, Motor
from pybricks.robotics import DriveBase

# Set up all devices.
prime_hub = PrimeHub(top_side=Axis.Z, front_side=Axis.Y)
senzor_levy = ColorSensor(Port.B)
senzor_pravy = ColorSensor(Port.F)
kolo_leve = Motor(Port.A, Direction.COUNTERCLOCKWISE)
kolo_prave = Motor(Port.E, Direction.CLOCKWISE)
motor_predni = Motor(Port.D, Direction.CLOCKWISE)
motor_zadni = Motor(Port.C, Direction.CLOCKWISE)
drive_base = DriveBase(kolo_leve, kolo_prave, 88, 144)


# The main program starts here.
drive_base.use_gyro(True)
drive_base.settings(straight_speed=500)
while senzor_levy.reflection() &amp;gt; 20:
    drive_base.straight(50, then=Stop.NONE)
drive_base.straight(0)
&lt;/pre&gt;&lt;/noscript&gt;
&lt;script src=&quot;https://gist.github.com/banterCZ/c17931e17c3f1b34120e89869bf5e5bc.js&quot;&gt; &lt;/script&gt;

&lt;p&gt;Všimněte si, že bloku pohybu lze v &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;then&lt;/code&gt; nastavit, co dělat na konci bloku, což ovlivní, jak (ne)plynule pojede.
Stejně tak na konci nastavuji &lt;a href=&quot;https://docs.pybricks.com/en/latest/parameters/stop.html#Stop&quot;&gt;způsob zastavení&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;závěr&quot;&gt;Závěr&lt;/h2&gt;

&lt;p&gt;Pybricks nabízí pokročilejší funkce oproti Lego Spike prostředí.
Varianta psaní v Pythonu je zdarma, za grafické bloky si připlatíte.
Spouštění programů ve fyzickém světě dokáže vždycky něčím překvapit, třeba zjištěním, že i černá barva odrazí nějaké světlo.&lt;/p&gt;

&lt;h2 id=&quot;související&quot;&gt;Související&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;/software%20development/2025/03/23/first-lego-league-challenge.html&quot;&gt;FIRST Lego League Challenge&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        <pubDate>Sat, 24 Jan 2026 00:00:00 +0000</pubDate>
        <link>https://blog.zvestov.cz/software%20development/2026/01/24/zastav-lego-pybricks-na-care.html</link>
        <guid isPermaLink="true">https://blog.zvestov.cz/software%20development/2026/01/24/zastav-lego-pybricks-na-care.html</guid>
        
        <category>kroužek programování</category>
        
        <category>lego</category>
        
        
        <category>software development</category>
        
      </item>
    
      <item>
        <title>Jak zkoušíme bicí</title>
        <description>&lt;div style=&quot;float: left; margin: 0 1em 1em 0; text-align: center;&quot;&gt;&lt;img src=&quot;/assets/2025-12-27/263162.png&quot; /&gt;&lt;/div&gt;

&lt;p&gt;Na skautský tábor s námi jezdí jeden rodič, povoláním profesionální muzikant.
Už druhým rokem jsme tedy založili táborovou kapelu i z naprostých začátečníků, bylo to skvělé.
Dcera se vrátila s přáním, že chce začít hrát na kytaru.
Syn se přidal, že by taky rád něco zkusil, ale neví co.
Nakonec jsme vybrali bicí.
Máme už je doma od léta, tak sepisuji několik postřehů.&lt;/p&gt;

&lt;!--more--&gt;
&lt;div style=&quot;clear: both&quot;&gt;&lt;/div&gt;

&lt;h2 id=&quot;proč-zrovna-bicí&quot;&gt;Proč zrovna bicí&lt;/h2&gt;

&lt;p&gt;Při výběru nástroje jsem bral v potaz, že syn na tom není nejlépe s motorikou.
Zároveň jsem si nebyl jistý, jak pečlivě a pravidelně bude cvičit.&lt;/p&gt;

&lt;p&gt;První volbou bývá zobcová flétna a jelikož jsem na ni sám začínal, tak říkám, že to není volba ideální.
Vyloudit čistý tón dá práci.&lt;/p&gt;

&lt;p&gt;Navrhoval jsem piano, tam máte tón vždy čistý.
Případně foukací harmoniku, kde máte jistotu, že cokoliv zahrajete, je v tónice.&lt;/p&gt;

&lt;p&gt;Mám dojem, že bicí neprávem stojí trochu stranou.
Tak schválně.
Jak se jmenuje zpěvák a kytarista vaší oblíbené kapely?
A jak jejich bubeník?&lt;/p&gt;

&lt;p&gt;Přitom &lt;a href=&quot;https://www.cernejpudink.cz/2016/08/01/iggy-pop-chtel-bych-byt-tvuj-coklik/&quot;&gt;Iggy Pop začínal na bicí&lt;/a&gt;.
Nebo koukněte, jak válí &lt;a href=&quot;https://www.youtube.com/watch?v=l5wkTdVjE1s&quot;&gt;Mag White&lt;/a&gt;.&lt;/p&gt;

&lt;iframe class=&quot;center&quot; width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/l5wkTdVjE1s?si=HER3iwdc6rJk32NP&quot; title=&quot;YouTube video player&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot; referrerpolicy=&quot;strict-origin-when-cross-origin&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;

&lt;h2 id=&quot;pohled-hráče-na-baskytaru&quot;&gt;Pohled hráče na baskytaru&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;/jak-zacit-hrat-na-hudebni-nastroj.html&quot;&gt;Začal jsem hrát baskytaru&lt;/a&gt; a od té doby si víc všímám bicích.
Koukněte třeba na super lekci &lt;a href=&quot;https://www.youtube.com/watch?v=PSw5uqkTPzs&quot;&gt;How to Play Bass with a Drummer (Foolproof Beginner Blueprint)&lt;/a&gt;.&lt;/p&gt;

&lt;iframe class=&quot;center&quot; width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/PSw5uqkTPzs?si=GMgg7Szx6cIvjscK&quot; title=&quot;YouTube video player&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot; referrerpolicy=&quot;strict-origin-when-cross-origin&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;

&lt;p&gt;Zlý jazykové o mně tvrdí, že dělím věci na dvě kategorie: co jsem dělal a co teprve budu dělat.
Jo, chtěl jsem si bicí taky zkusit.
I proto, aby mě to posunulo jako basáka.&lt;/p&gt;

&lt;p&gt;Bavil jsem se s jedním bubeníkem, který mi opakoval mantru, že baskytarista klidně může zahrát špatnou notu, ale musí to být ve správný čas.
Jasně, ale kontroval jsem, že je to přece nástroj na pomezí rytmické a melodické sekce.
Načež se mi dostalo odpovědi: „Jsem byl na jednom jazzovém workshopu a pro ně je rytmické všechno od piana dál.“&lt;/p&gt;

&lt;h2 id=&quot;výběr-nástroje&quot;&gt;Výběr nástroje&lt;/h2&gt;

&lt;p&gt;Předně jsem chtěl elektronické bicí.
Nezabírají tolik místa.
Nadělají méně hluku, ale nenechte se zmást, že vás nebudou rušit vůbec.&lt;/p&gt;

&lt;p&gt;Už jsme kdysi jeden neúspěšný pokus učinili.
Jednak byly děti ještě příliš malé, jednak jsme měli „jen“ &lt;a href=&quot;https://www.lidl.cz/p/elektronicka-bici-souprava/p100367782&quot;&gt;nástroj z Lidlu&lt;/a&gt;, u kterého jsem narazil na limit, že jsem nedokázal pro výukový program správně namapovat MIDI signály pro tom bubny.&lt;/p&gt;

&lt;p&gt;Tentokrát jsem sáhl po serióznějším kousku, &lt;a href=&quot;https://www.thomann.de/cz/yamaha_dd_75.htm&quot;&gt;Yamaha DD-75&lt;/a&gt;.
Tahle firma dělá dobře všechno od motorek po kytary.&lt;/p&gt;

&lt;p&gt;Pedály, které k tomu dostane, jsou spíš tlačítka.
Na pár první hodin to stačí, ale pak vám to začne lézt na nervy.
U &lt;em&gt;hi-hat&lt;/em&gt; necítíte, zda vám nesjela noha a najednou hrajete &lt;em&gt;open hi-hat&lt;/em&gt;.
U kopáku chybí pořádná odezva.&lt;/p&gt;

&lt;p&gt;Za dobré pedály dáte víc než za samotné bicí.
&lt;a href=&quot;https://www.thomann.de/cz/yamaha_hh60.htm&quot;&gt;Yamaha HH-65 Hi-Hat Controller&lt;/a&gt; je super.
Bez pořádné přípravy jsem koupil &lt;a href=&quot;https://www.thomann.de/cz/yamaha_ku100_silent_kick_pedal.htm&quot;&gt;Yamaha KU100 Silent Kick Pedal&lt;/a&gt;, který je sice tichý a lepší než pouhé tlačítko, ale odezva taky příliš lehká.
Trochu kraválu snesu, takže pro mě je vítěz &lt;a href=&quot;https://www.thomann.de/cz/roland_kt_10_kick_trigger_pedal.htm&quot;&gt;Roland KT-10 Kick Trigger Pedal&lt;/a&gt;. Býval jsem se měl podívat na &lt;a href=&quot;https://www.youtube.com/watch?v=dPr82Tpbz1w&quot;&gt;recenzi od 65 Drums&lt;/a&gt;.&lt;/p&gt;

&lt;iframe class=&quot;center&quot; width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/dPr82Tpbz1w?si=nq9Ssc2JWuJbStHD&quot; title=&quot;YouTube video player&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot; referrerpolicy=&quot;strict-origin-when-cross-origin&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;

&lt;h2 id=&quot;výukový-program&quot;&gt;Výukový program&lt;/h2&gt;

&lt;p&gt;Vybíral jsem elektronický nástroj i z důvodu připojení na výukové nástroje přes MIDI.
Můžu doporučit &lt;a href=&quot;https://melodics.com/&quot;&gt;Melodics&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Několik večerů jsem byl úplně marný.
Je to samá ruka, samá noha, a všechno zkoordinovat je fakt fuška.
Vzpomněl jsem si na jeden článek od &lt;a href=&quot;https://blog.duolingo.com/what-makes-arabic-hard-and-why-that-shouldnt-stop-you-from-learning-it/&quot;&gt;Duolingo: What makes Arabic hard (and why that shouldn’t stop you from learning it)&lt;/a&gt;.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Když dospějeme, mluvíme svým jazykem (nebo jazyky) jako mistr kytarista hraje na svůj nástroj: plynule, automaticky a velmi krásně. Proces učení se novému jazyku je jako když se mistr kytarista učí hrát na nový nástroj. Pokud dáte kytaristovi mandolínu, mnoho z dovedností, které již má, mu pomůže: ladění nástroje, brnkání atd. Flétna však vyžaduje zcela nové dovednosti. A bicí? Náš kytarista prakticky začíná od nuly, když se učí hrát na bicí.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Jakmile se z prvního šoku vzpamatujete, tak jejich program oceníte.
Dnešní didaktický standard je &lt;em&gt;gamifikace&lt;/em&gt;, oslavování několikadenních řad a gratulace k dosaženému pokroku.
Dostáváte zpětnou vazbu, zda jste udeřili brzy, pozdě čí víckrát, než bylo třeba.
Lekce jsem zábavné a už od začátku hrajete muziku.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=69z_pK3b1po&quot;&gt;Ukázka jedné lekce&lt;/a&gt;.&lt;/p&gt;

&lt;iframe class=&quot;center&quot; width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/69z_pK3b1po&quot; title=&quot;YouTube video player&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;

&lt;h2 id=&quot;závěr&quot;&gt;Závěr&lt;/h2&gt;

&lt;p&gt;Určitě doporučuji vyzkoušet si bicí.
Samo o sobě je to zábava a velká výzva pro motoriku.
I když hrajete na jiný nástroj, tak vás to hudebně posune.
Elektronické bicí jsou méně hlučné, ale ne úplně tiché.
Bez pořádných pedálů to není ono, ale nejsou úplně levné.&lt;/p&gt;

&lt;h2 id=&quot;související&quot;&gt;Související&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;/obecn%C3%A9/2025/02/23/operne-pisne-pro-intervaly.html&quot;&gt;Opěrné písně pro intervaly&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;/jak-zacit-hrat-na-hudebni-nastroj.html&quot;&gt;Jak začít hrát na hudební nástroj&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        <pubDate>Sat, 27 Dec 2025 00:00:00 +0000</pubDate>
        <link>https://blog.zvestov.cz/obecn%C3%A9/2025/12/27/jak-zkousime-bici.html</link>
        <guid isPermaLink="true">https://blog.zvestov.cz/obecn%C3%A9/2025/12/27/jak-zkousime-bici.html</guid>
        
        <category>hudba</category>
        
        
        <category>obecné</category>
        
      </item>
    
      <item>
        <title>Ať žijí timeouty</title>
        <description>&lt;div style=&quot;float: left; margin: 0 1em 1em 0; text-align: center;&quot;&gt;&lt;img src=&quot;/assets/2025-11-27/26203.png&quot; /&gt;&lt;/div&gt;

&lt;p&gt;Žil byl, nebo tedy právě spíš nebyl, jednou jeden timeout (ono jich vlastně nakonec chybělo dokonce víc).
Stalo se to už před nějakou dobou, tak snad je to částečně odžité.
Na testovacím prostředí všechno vyzkoušené a krásně funguje.
Z produkce jsou hlášené divné chyby, které postupně vedly až ke zhroucení komponenty.
Dlouho se mi nedařilo bug reprodukovat natož odhalit příčinu.
Nakonec jsme na to samozřejmě přišli, proto si zapisuju poučení.
Stejně jako v případě leteckých havárií, se sešlo víc věcí najednou.&lt;/p&gt;

&lt;!--more--&gt;
&lt;div style=&quot;clear: both&quot;&gt;&lt;/div&gt;

&lt;h2 id=&quot;expozice&quot;&gt;Expozice&lt;/h2&gt;

&lt;p&gt;Java backend provolával službu třetí strany přes REST API.
Daná servisní metoda běžela úmyslně v databázové transakci i s vědomím, že REST volání může trvání neúměrně prodloužit.
Nicméně konzistence dat byla v tomto případě naprosto klíčová.
Tak klíčová, že bylo dokonce nezbytné použít pesimistické zamykání databáze.&lt;/p&gt;

&lt;h2 id=&quot;co-by-se-asi-tak-mohlo-pokazit&quot;&gt;Co by se asi tak mohlo pokazit&lt;/h2&gt;

&lt;p&gt;Tak já vám povím, co by se asi tak mohlo pokazit.&lt;/p&gt;

&lt;p&gt;Upřímně, vůbec nemám rád aplikační servery, ale jednu věc jim nemůžu upřít.
Mívaly výchozí nastavení timeoutu databázové transakce.
&lt;a href=&quot;https://docs.spring.io/spring-framework/reference/6.2/data-access/transaction/declarative/txadvice-settings.html&quot;&gt;Spring má výchozí timeout -1&lt;/a&gt;, tedy nekonečno.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://stackoverflow.com/a/76520564/204950&quot;&gt;PostgreSQL nepodporuje lock na úrovni statementu a tudíž nefunguje Hibernate JPA hint&lt;/a&gt; &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;spring.jpa.properties.jakarta.persistence.lock.timeout&lt;/code&gt;.
Můžete to nastavit globálně pro celou databázi pomocí &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;ALTER DATABASE powerauth SET lock_timeout=10000;&lt;/code&gt;, ale jednak to musíte vědět a jednak na to nesmíte zapomenout.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://www.baeldung.com/spring-webflux-timeout&quot;&gt;Spring WebClient postavený na Reactoru nenastavuje response timeout&lt;/a&gt;, výchozí hodnota je nekonečno.&lt;/p&gt;

&lt;h2 id=&quot;takže-se-to-pokazilo&quot;&gt;Takže se to pokazilo&lt;/h2&gt;

&lt;p&gt;Nepřekvapivě tedy zásek na volání REST API vyžral celý db connection pool.
Když se něco může pokazit, tak se to zaručeně pokazí, a je naší zodpovědností to ošetřit.
Byla to tedy naše chyba, že jsme správně nastavili všechny timeouty.
To přišlo opravit.
Ale proč situace nastávala opakovaně?&lt;/p&gt;

&lt;h2 id=&quot;co-se-vlastně-pokazilo&quot;&gt;Co se vlastně pokazilo&lt;/h2&gt;

&lt;p&gt;Služba třetí strany běžela za &lt;a href=&quot;https://learn.microsoft.com/en-us/azure/load-balancer/load-balancer-tcp-reset#configurable-tcp-idle-timeout&quot;&gt;Azure Load Balancerem, který ukončoval idle TCP connection po čtyřech minutách&lt;/a&gt;.
K čemu tedy došlo na produkci jinému než při testu?&lt;/p&gt;

&lt;p&gt;Provolá se REST API, naváže se nové TCP spojení, odbaví se request, a spojení se vrátí do poolu.
Má se znovu provolat REST API, vyzvedne se spojení z poolu, které nikdo víc jak čtyři minut nepoužil.
Spojení je vadné, ale pool se mylně domnívá, že je stále živé.
K naší smůle není nastavený timeout.
Tady se dostávám na tenký led síťování, kterému nerozumím.
Spojení pravděpodobně nevypadlo z poolu, protože nebyl zapnutý &lt;em&gt;TCP reset&lt;/em&gt;, ale i kdyby byl, tak na něj stejně nemůžeme spoléhat.
Nabízí se ladit &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;keepAlive&lt;/code&gt;, ale to nechávám zvídavému čtenáři k &lt;a href=&quot;https://www.baeldung.com/spring-webflux-timeout&quot;&gt;nastudování&lt;/a&gt;,&lt;/p&gt;

&lt;h2 id=&quot;závěr&quot;&gt;Závěr&lt;/h2&gt;

&lt;p&gt;Spring Boot není jediný a nebyl ani první, kdo razí přístup &lt;em&gt;convention over configuration&lt;/em&gt; a kdo přináší smysluplné výchozí hodnoty.
Tedy neměň, co nepotřebuješ.
Když není důvod něco specificky nastavovat, tak spoléhám na výchozí hodnoty.
Ale některé výchozí hodnoty jsou méně či více nebezpečné a je bezpodmínečně nutné vědět, co člověk dělá.&lt;/p&gt;

&lt;h2 id=&quot;související&quot;&gt;Související&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.baeldung.com/spring-webflux-timeout&quot;&gt;Baeldung - Set a Timeout in Spring WebClient&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://stackoverflow.com/a/76520564/204950&quot;&gt;Stack Overflow - How to set lock timeout in postgres - Hibernate&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://hibernate.atlassian.net/browse/HHH-16071&quot;&gt;javax.persistence.lock.timeout does not fully work with PostgreSQL&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://learn.microsoft.com/en-us/azure/load-balancer/load-balancer-tcp-reset#configurable-tcp-idle-timeout&quot;&gt;Azure - Load Balancer TCP Reset and Idle Timeout&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        <pubDate>Thu, 27 Nov 2025 00:00:00 +0000</pubDate>
        <link>https://blog.zvestov.cz/software%20development/2025/11/27/at-ziji-timeouty.html</link>
        <guid isPermaLink="true">https://blog.zvestov.cz/software%20development/2025/11/27/at-ziji-timeouty.html</guid>
        
        <category>Java</category>
        
        
        <category>software development</category>
        
      </item>
    
      <item>
        <title>IDDQD</title>
        <description>&lt;div style=&quot;float: left; margin: 0 1em 1em 0; text-align: center;&quot;&gt;&lt;img src=&quot;/assets/2025-10-17/doom_face.png&quot; /&gt;&lt;/div&gt;
&lt;p&gt;Jedná se o textový přepis přednášky, kterou jsem měl na nekonferenci &lt;a href=&quot;https://www.jopenspace.cz/&quot;&gt;jOpenSpace&lt;/a&gt; 2025, &lt;a href=&quot;https://www.youtube.com/watch?v=nFd82No3C7Q&quot;&gt;video záznam ke shlédnutí&lt;/a&gt;.
Je mi ctí, že jsem mohl dělat předskokana &lt;a href=&quot;https://www.youtube.com/watch?v=1-KYK7pvyUg&quot;&gt;Tomuchovi a jeho povídání o shaderech&lt;/a&gt; (náhodička, vůbec jsme se nedomlouvali předem, jako fakt).
Nepřináším žádné závratné novinky, nýbrž tichou, ale naléhavou, touhu po úniku z drsné přítomnosti do idylického bezpečí minulosti.
Ostatně už jsem vzpomínal na počítač &lt;a href=&quot;/software%20development/2023/10/23/pocta-c64.html&quot;&gt;Commodore 64&lt;/a&gt;.&lt;/p&gt;

&lt;!--more--&gt;
&lt;div style=&quot;clear: both&quot;&gt;&lt;/div&gt;

&lt;h2 id=&quot;videozáznam&quot;&gt;Videozáznam&lt;/h2&gt;

&lt;iframe class=&quot;center&quot; width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/nFd82No3C7Q?si=prbEiGjW6W5Tcnlk&quot; title=&quot;YouTube video player&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot; referrerpolicy=&quot;strict-origin-when-cross-origin&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;

&lt;h2 id=&quot;knihy&quot;&gt;Knihy&lt;/h2&gt;

&lt;p&gt;&lt;img src=&quot;/assets/2025-10-17/50_let_videoher.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Z nostalgie jsem si koupil si knihu &lt;a href=&quot;https://www.xzone.cz/kniha-level-50-let-videoher&quot;&gt;50 let videoher&lt;/a&gt;.
Ideální dárek pro starý fotry.
Sbírka článků z časopisu Level.
Úžasné provedení na křídovém papíře.
Kromě samotného úniku do dětství mě fascinují technologie, která stojí za skvělými produkty, stejně tak mě fascinují podmínky, které k tomu vedly.&lt;/p&gt;

&lt;p&gt;Mezi hrami samozřejmě nesměl chybět &lt;a href=&quot;https://en.wikipedia.org/wiki/Doom_(1993_video_game)&quot;&gt;Doom&lt;/a&gt;.
A když jsem hledal téma svůj letošní příspěvek, tak jsem si konečně přečetl knihu &lt;a href=&quot;https://fabiensanglard.net/gebbdoom/index.html&quot;&gt;The Game Engine Black Book: DOOM, Fabien Sanglard&lt;/a&gt; (k dispozici legálně zdarma).&lt;/p&gt;

&lt;p&gt;A ohledně názvu přednášky se nakonec ukázalo, že znalost &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;IDDQD&lt;/code&gt; není úplně stoprocentně sdílená.
Tak vězte, že se jednalo o &lt;em&gt;cheat&lt;/em&gt; nesmrtelnosti.&lt;/p&gt;

&lt;p&gt;Hře Doom předcházela hra &lt;a href=&quot;https://en.wikipedia.org/wiki/Wolfenstein_3D&quot;&gt;Wolfenstein 3D&lt;/a&gt;, které se tu nehodlám podrobněji věnovat.
Ostatně Fabien Sanglard o ní vydal samostatnou knihu.
Nicméně ve zkratce, zlí jazykové tvrdí, že šlo o 2,5D hru.
Stěny jsou pravoúhlé, podlahy a stropy bez textur.
Pohybujete se po jediné výškové úrovni, chybí výtahy.
Sprity jsou vykresleny 2D.&lt;/p&gt;

&lt;h2 id=&quot;rok-1993&quot;&gt;Rok 1993&lt;/h2&gt;

&lt;p&gt;&lt;img src=&quot;/assets/2025-10-17/ct_archiv.jpg&quot; alt=&quot;&quot; /&gt;
&lt;a href=&quot;https://www.ceskatelevize.cz/porady/10116288585-archiv-ct24/213411058210041/&quot;&gt;archiv ČT24&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Píše se rok 1993.
Zeman už je v politice.
Rozděluje se Československo.
Já chodím do třetí třídy.&lt;/p&gt;

&lt;p&gt;Mezitím tvůrčí duo John Romero (25 let) a John Carmack (22 let) vydávají ambiciózní tiskovou zprávu, že za 11 měsíců máme čekat převratnou novinku.
Romero Doomem dodnes žije a vyjadřuje se k němu, takže nemohl chybět ani v dokumentární seriálu &lt;a href=&quot;https://www.csfd.cz/film/894583-nejvyssi-skore/prehled/&quot;&gt;High Score&lt;/a&gt;, kde mimo jiné tvrdí, že na konzolích funguje plynulý scroll, to tehdejší PC hry neuměly.
Konzole tou dobou znamenalo například &lt;a href=&quot;https://en.wikipedia.org/wiki/Super_Nintendo_Entertainment_System&quot;&gt;Super Nintendo&lt;/a&gt; v ceně 199 USD (přepočteno na dnešní inflaci 446 USD).&lt;/p&gt;

&lt;p&gt;Když jsem slyšel scrollování, tak jsem si vzpomněl na hru &lt;a href=&quot;https://en.wikipedia.org/wiki/Duke_Nukem_II&quot;&gt;Duke Nukem 2D&lt;/a&gt;, známou svým &lt;a href=&quot;https://lethalguitar.wordpress.com/2022/07/14/how-duke-nukem-iis-parallax-scrolling-worked/&quot;&gt;dual-parallax scrollingem&lt;/a&gt;, ale vyšel až v prosinci 1993.
Ta doba byla těhotná pokrokem.&lt;/p&gt;

&lt;p&gt;O hry s 3D grafikou se snažili i na konzolích, první slavná je &lt;a href=&quot;https://en.wikipedia.org/wiki/Star_Fox_(1993_video_game)&quot;&gt;Star Fox&lt;/a&gt;.
Nedostatek výkonu mohli dohánět čipem v cartridge.&lt;/p&gt;

&lt;h2 id=&quot;pc&quot;&gt;PC&lt;/h2&gt;

&lt;p&gt;Platforma PC byla zamýšlená pro textové editory, tabulkové procesory, sem tam zobrazit graf a ne animaci se 70 snímky za vteřinu.
4MB RAM, 14” CRT monitor 320 x 200, bratru za 3000 USD (přepočteno na dnešní inflaci 6726 USD).&lt;/p&gt;

&lt;p&gt;Tou dobou máme procesor Intel a ne Pentium, ale 486.
Když jsem viděl digramy pipelingu, otevřely se mi staré rány z ČVUT.
Na škole mě to deptalo.
S příběhem mi to přišlo srozumitelné a bavilo mě to.
Jako děti jsme porovnávali jen taktovací frekvence, čím víc herzů, tím víc adidas.
Ale je potřeba koukat na změny v architektuře.
Procesor 386 například potřeboval dva takty na dekódování instrukce.
A přestože procesor 486 s matematickým koprocesorem (takže spíš 487, ale to už nechci zabíhat do detailů) zrychlil operace v plovoucí desetinné čárce až na třetinu, stále to bylo zoufale pomalé oproti celočíselným operacím.
Proto Doom zůstává u integerů.&lt;/p&gt;

&lt;p&gt;Procesory se vyvíjely rychlejším tempem než paměti.
Paměť DRAM byla levná, buňka obsahovala kapacitor a jeden tranzistor.
Po přečtení bylo nutné znovu zapsat.
Zápis bylo potřeba opakovat i bez čtení, protože kapacitor se vybíjel.&lt;/p&gt;

&lt;p&gt;SRAM byla výrazně rychlejší, ale dražší, jelikož konstrukce vyžadovala minimálně šest tranzistorů.
Využívala se pro cache.
Cache má další rychlostní výhodu, protože procesor s ní komunikuje přímo a nemusí přes sběrnici.&lt;/p&gt;

&lt;p&gt;I sběrnice se dočkaly vylepšení.
VESA byla asi desetkrát rychlejší než ISA.
Zvýšila se přenosová šířka na 32 bitů i frekvence.&lt;/p&gt;

&lt;p&gt;Sound Blaster přináší zvukovou kartu s CD kvalitou.&lt;/p&gt;

&lt;p&gt;A aby to nebyly jen nostalgické kecy, tak nějaké architektonické poučení.
Trh se zvukovými kartami byl značně fragmentovaný.
Tehdy sáhli po knihovně DMX, o které se dnes Romero vyjadřuje, že nebyla dobrá, že by si to býval napsal sám.
Ale už nepřipouští, že by to nejspíš za 11 měsíců vůbec nestihli.&lt;/p&gt;

&lt;p&gt;Můžete si připomenout loňskou přednášku &lt;a href=&quot;https://www.youtube.com/watch?v=k8WL-joze3I&quot;&gt;Zákony SW architektury (Lukáš Křečan)&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
  &lt;p&gt;Všechna rozhodnutí v architektuře jsou kompromisy a žádné řešení není dokonalé&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Paralelní programování se realizovalo pomocí IRQ (Interrupt Request, signál požadavku na přerušení) a DMA (Direct Memory Access, přímý přístup do paměti).&lt;/p&gt;

&lt;h2 id=&quot;nextstep&quot;&gt;NeXTSTEP&lt;/h2&gt;

&lt;p&gt;Ač byll Doom cílený na platformu PC, tak samotný vývoj probíhal na superpočítačích NeXTSTEP.
Slavný příběh by vydal na samostatnou přednášku, Steve Jobs byl odejit z Applu, ten pak NeXTSTEP později kupuje atd.&lt;/p&gt;

&lt;p&gt;8MB RAM, 17” displej 1120 x 832, volitelně CD ROM bratru za 6 500 USD (přepočteno na dnešní inflaci 14 573 USD)&lt;/p&gt;

&lt;h2 id=&quot;programování&quot;&gt;Programování&lt;/h2&gt;

&lt;p&gt;Spojenectví mezi Sunem a Nextem symbolizují &lt;a href=&quot;https://developer.apple.com/documentation/foundation/nsarray&quot;&gt;písmena NS, které dodnes vidíte v API&lt;/a&gt;.
Je velmi pravděpodobné, že kód, který kdysi běžel na NeXTSTEP a přispěl ke stvoření Dooma, nyní běží na mnoha milionech Apple počítačích nebo telefonech.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/2025-10-17/c_meme.jpg&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Doom byl napsaný v C++.
Kolem toho jsem se mihnul.
C/C++ pro mě znamená pointery.
Když slyším pointery, vybavím si tento vtípek a můj mozek vypíná.
Musíte se starat o pamět.
Funkce &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Malloc&lt;/code&gt; způsobovala fragmentaci paměti, tak si museli vyvinout vlastní &lt;em&gt;Zone memory manager&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Na PC měli v DOS Borland C++ editor, který měl sice zvýrazňování syntaxe, ale na obrazovku se nevešlo moc řádek a údajně neustále padal.
TextEdit na NeXTSTEP neuměl zvýrazňovat, ale zobrazil víc řádek, uměl je zabalovat a hlavně byl stabilní.&lt;/p&gt;

&lt;p&gt;Zatímco C++ dával na první místo výkon, tak Objective-C, ve kterém se programovalo na NeXTSTEP, upřednostňoval programátorskou produktivitu.
Nikdy jsem v něm nepsal, ale Objective-C pro mě znamená &lt;a href=&quot;https://en.wikipedia.org/wiki/Message_passing&quot;&gt;message passing&lt;/a&gt;, pro nás Java programátory dodnes něco převratného.
Přitom když budete děti učit &lt;a href=&quot;https://en.scratch-wiki.info/wiki/Broadcast&quot;&gt;Scratch, tak je to něco přirozeného&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/2025-10-17/doom_screenshot.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Doom to jsou brokovnice, démoni a dynamické světelné podmínky.
A jak toho dosáhli bez 24 bitové barevné podpory?
Připravili si 32 palet o 256 barvách.&lt;/p&gt;

&lt;p&gt;Doom přináší multiplayer, hru více hráčů proti sobě, tehdy ještě bez centrálního serveru.
My jsme se propojovali přes sériové a paralelní kabely.&lt;/p&gt;

&lt;h2 id=&quot;distribuce&quot;&gt;Distribuce&lt;/h2&gt;

&lt;p&gt;Doom distribuovali na dvou disketách jako &lt;em&gt;shareware&lt;/em&gt;.
Tedy první epizoda zdarma, pokračování k zakoupení.&lt;/p&gt;

&lt;p&gt;Plná verze byla menší než 12 MB.
Samotný engine něco málo přes 700 KB a data ve WAD souboru (&lt;strong&gt;W&lt;/strong&gt;here’s &lt;strong&gt;A&lt;/strong&gt;ll the &lt;strong&gt;D&lt;/strong&gt;ata?) něco málo přes 11 MB.
Toto rozdělení usnadnilo hráčům pozdější vlastní úpravy.
Stejně tak umožnilo naportovat engine na současné architektury, viz &lt;a href=&quot;https://zdoom.org/downloads&quot;&gt;GZDoom&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Jak jsem již zmiňoval, Romero Doomem dodnes žije.
K 25. a 30. výročí vydal &lt;a href=&quot;https://romero.com/sigil&quot;&gt;Sigil I a Sigil II&lt;/a&gt;.
Chtěl, aby úrovně působily, jako by patřily k původní hře, jako by to byla skutečná pátá epizoda.
Osobně mi přijdou obtížnější než tehdejší úrovně.&lt;/p&gt;

&lt;p&gt;Dodnes se &lt;a href=&quot;https://canitrundoom.org&quot;&gt;hračičkové trumfují, na čem Dooma rozeběhnou&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;závěr&quot;&gt;Závěr&lt;/h2&gt;

&lt;p&gt;Doom znamenal naše mládí.
Ve srovnání s tříáčkovými hrami za nimi stálo několik málo, pravda geniálních, lidí, kteří z tehdejšího hardware vyždímali naprosté maximum.
Magie, která za tím stála, je v dnešní Unity/Unreal engine době nepředstavitelná.
A proto je dobré si ji připomenout.&lt;/p&gt;

&lt;p&gt;Měli jsme vlastně štěstí, že jsme zrod takových legend zažili.
Dnes už se nepovažuji za hráče, tak nevím. 
Vznikají podobně přelomové tituly definující nový žánr?&lt;/p&gt;

&lt;h2 id=&quot;související&quot;&gt;Související&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;/software%20development/2023/10/23/pocta-c64.html&quot;&gt;Pocta C64&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        <pubDate>Fri, 17 Oct 2025 00:00:00 +0000</pubDate>
        <link>https://blog.zvestov.cz/software%20development/2025/10/17/IDDQD.html</link>
        <guid isPermaLink="true">https://blog.zvestov.cz/software%20development/2025/10/17/IDDQD.html</guid>
        
        <category>hry</category>
        
        
        <category>software development</category>
        
      </item>
    
      <item>
        <title>Kniha Real-World Cryptography</title>
        <description>&lt;div style=&quot;float: left; margin: 0 1em 1em 0; text-align: center;&quot;&gt;&lt;img src=&quot;/assets/2025-09-16/50090498.jpg&quot; /&gt;&lt;/div&gt;
&lt;p&gt;Kniha &lt;a href=&quot;https://www.goodreads.com/book/show/50090498-real-world-cryptography&quot;&gt;Real-World Cryptography&lt;/a&gt; od David Wong je to nejpřístupnější, co si můžete o kryptografii přečíst, alespoň co je mi známo.
Dostatečně jednoduchá, abych ji pochopil.
Dostatečně složitá, abych se k ní musel vrátit.
Dál byste v podstatě nemuseli číst tento příspěvek a mohli si jít knihu rovnou koupit.
Nicméně uvádím, jak jsem ke svému závěru došel.&lt;/p&gt;

&lt;!--more--&gt;
&lt;div style=&quot;clear: both&quot;&gt;&lt;/div&gt;

&lt;h2 id=&quot;úvod&quot;&gt;Úvod&lt;/h2&gt;

&lt;p&gt;Posledních dvanáct let se motám kolem software, který se více či méně týká počítačové bezpečnosti.
Aby bylo jasno, nejsem kryptolog a nikdy jím nebudu, ale podílel jsem se například na &lt;a href=&quot;/software%20development/2015/12/15/jak-funguje-biometricky-pas.html&quot;&gt;vydávání biometrických pasů&lt;/a&gt;.
Každopádně se snažím v oboru celou dobu vzdělávat.
No a není to snadné.
Obor je to komplexní.
Že jste udělali chybu, se může projevit až později jako obrovský průšvih.
Když věci ladíte, někdy stačí jediný bit jinak a celé je to špatně, ale nevíte proč.&lt;/p&gt;

&lt;h2 id=&quot;co-jsem-zatím-četl&quot;&gt;Co jsem zatím četl&lt;/h2&gt;

&lt;p&gt;Naprostá nutnost je &lt;a href=&quot;https://www.goodreads.com/review/show/712097358&quot;&gt;Kniha kódů a šifer&lt;/a&gt; od Simon Singh (překlad Petr Koubský).
V roce 2022 vyšel dotisk (již 4. české vydání), tak by měla být k mání.
Je to populárně naučné, velmi čtivé.
Pracovně si s tím však nevystačíte.&lt;/p&gt;

&lt;p&gt;Kdysi jsem četl &lt;a href=&quot;https://goodreads.com/book/show/634845.Java_Cryptography__Java_Series_&quot;&gt;Java Cryptography&lt;/a&gt; (Jonathan Knudsen).
Dnes už prehistorie z roku 1998, popisující &lt;em&gt;Java Cryptography Architecture&lt;/em&gt; (JCA) v Java 1.2
Dlouho jsem to neměl v ruce.
API asi ještě bude platit.
Ale úplně chybí knihovna &lt;a href=&quot;https://www.bouncycastle.org/&quot;&gt;Bouncy Castle&lt;/a&gt; a píše se tam ještě o SHA-1.&lt;/p&gt;

&lt;p&gt;Sáhl jsem tedy po &lt;a href=&quot;https://goodreads.com/book/show/42372440.Java_Cryptography_Tools_and_Techniques&quot;&gt;Java Cryptography: Tools and Techniques&lt;/a&gt;.
To je extrém z druhé strany, já bych to pojmenoval &lt;em&gt;Bouncy Castle Recipes&lt;/em&gt;, tedy ukázky kódu, jak používat Bouncy Castle.
Chybí vysvětlení konceptů.
Pro mě těžko přístupné.
Zkrátka moc velký znalostní skok.&lt;/p&gt;

&lt;h2 id=&quot;kurzy&quot;&gt;Kurzy&lt;/h2&gt;

&lt;p&gt;Na Coursera jsem před lety absolvoval kurz &lt;a href=&quot;https://www.coursera.org/course/crypto&quot;&gt;Cryptography I&lt;/a&gt;.
Očekávaná zátěž sedm hodin týdně.
Zvládal jsem jen teorii, praktické úlohy už ne.
Dan Boneh je skvělý lektor, kurz je kvalitní, ale dost zaměřený na formální matematiku, což možná není to, co právě hledáte.&lt;/p&gt;

&lt;h2 id=&quot;real-world-cryptography&quot;&gt;Real-World Cryptography&lt;/h2&gt;

&lt;p&gt;Konečně se dostávám ke knize Real-World Cryptography, kterou považuji za poklad.
Vyšla v nakladatelství Manning, což už je záruka samo o sobě.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Většina zdrojů je poměrně náročná na matematiku a většina vývojářů, kteří se zabývají kryptografií, se nechce zabývat matematikou.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Didakticky mě velmi oslovila.
Staví znalosti od základních kamenů po složitější.
Přijde mi, že vysvětluje principy a vykládá jen tu nejnezbytnější matematiku.
Nezahlcuje, ale nechává prostor k dalšímu samostudiu.&lt;/p&gt;

&lt;p&gt;Věnuje se dokonce kryptoměnám i FIDO2.
Vysvětluje protokol Signal (který používá i WhatsApp).
Popisuje i &lt;em&gt;post-quantum cryptography&lt;/em&gt;, tedy kryptografii odolné vůči útoku za pomoci výpočetního výkonu kvantových počítačů.
Ač kniha vyšla v roce 2021, kdy tyto algoritmy ještě nebyly standardizované, nijak vás nesvede na scestí.&lt;/p&gt;

&lt;p&gt;Dál obsah pitvat nebudu, můžete &lt;a href=&quot;https://www.manning.com/books/real-world-cryptography&quot;&gt;si udělat představu sami&lt;/a&gt;.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Chci, abyste si uvědomili, že jste v privilegované pozici.
Kryptografie začala jako obor za zavřenými dveřmi, omezený pouze na členy vlády nebo akademiky udržované v tajnosti, a pomalu se stala tím, čím je dnes: vědou otevřeně studovanou po celém světě.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id=&quot;závěr&quot;&gt;Závěr&lt;/h2&gt;

&lt;p&gt;Doporučuji všem (nejen programátorům), kteří potřebují kryptografii nějak používat (což jsou stejně všichni).
Dostatečně jednoduchá, abych ji pochopil.
Dostatečně složitá, abych se k ní musel vrátit a pak pokračoval ve studiu jinde.&lt;/p&gt;

&lt;h2 id=&quot;související&quot;&gt;Související&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;/software%20development/2015/12/15/jak-funguje-biometricky-pas.html&quot;&gt;Jak funguje biometrický pas&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;/software%20development/2014/11/02/on-line-studium-na-coursera.html&quot;&gt;On-line studium na Coursera&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        <pubDate>Tue, 16 Sep 2025 00:00:00 +0000</pubDate>
        <link>https://blog.zvestov.cz/software%20development/2025/09/16/kniha-real-world-cryptography.html</link>
        <guid isPermaLink="true">https://blog.zvestov.cz/software%20development/2025/09/16/kniha-real-world-cryptography.html</guid>
        
        <category>kniha</category>
        
        <category>security</category>
        
        
        <category>software development</category>
        
      </item>
    
      <item>
        <title>Maven Daemon</title>
        <description>&lt;div style=&quot;float: left; margin: 0 1em 1em 0; text-align: center;&quot;&gt;&lt;img src=&quot;/assets/2025-08-23/maven-logo-black-on-white.png&quot; /&gt;&lt;/div&gt;

&lt;p&gt;Abych udržel tempo publikací na blogu, tak každý článek nemůže přinášet zásadní téma.
Zůstaňme tedy při zemi, u něčeho staršího.
Ač jsem někdy &lt;a href=&quot;/software%20development/2015/04/29/konflikt-tranzitivnich-zavislosti.html&quot;&gt;Maven haněl&lt;/a&gt;, tak tentokrát bych se ho rád zastal.
Doporučuji paralelní build a použití &lt;a href=&quot;https://cs.wikipedia.org/wiki/D%C3%A9mon_(software)&quot;&gt;démona&lt;/a&gt;, který (dle mého pozorování) není tak rozšířený, jak by býval mohl být.&lt;/p&gt;

&lt;!--more--&gt;
&lt;div style=&quot;clear: both&quot;&gt;&lt;/div&gt;

&lt;h2 id=&quot;přehled-buildovacích-nástrojů&quot;&gt;Přehled buildovacích nástrojů&lt;/h2&gt;

&lt;p&gt;Doporučuji k přečtení článek &lt;a href=&quot;https://blog.frankel.ch/final-take-gradle/&quot;&gt;My final take on Gradle (vs. Maven)&lt;/a&gt;.
Nechci papouškovat celý, ale stručné shrnutí.&lt;/p&gt;

&lt;h3 id=&quot;ant&quot;&gt;Ant&lt;/h3&gt;

&lt;p&gt;Ant taky pamatuju, takže můžu potvrdit, že neřešil závislosti a chyběla konzistence mezi projekty.&lt;/p&gt;

&lt;h3 id=&quot;maven&quot;&gt;Maven&lt;/h3&gt;

&lt;p&gt;Maven přináší závislosti a konvence.
Dnes už se jedná o běžný přístup konvence před konfigurací (&lt;em&gt;convention over configuration&lt;/em&gt;, není nutné explicitně konfigurovat, máte implicitní smysluplné nastavení).
Pro specifické úpravy si můžete napsat vlastní plugin, což není zase tak snadné.
Nemá podporu paralelního build a i &lt;a href=&quot;https://cwiki.apache.org/confluence/display/maven/parallel+builds+in+maven+3&quot;&gt;ve verzi 3 stále označen jako experimentální&lt;/a&gt;.
Očekávané zrychlení paralelního buildu je 20 až 50 %.&lt;/p&gt;

&lt;p&gt;Nicolas Fränkel v odkazovaném článku tvrdí, a já s ním souhlasím, že málo flexibility není bug ale žádoucí vlastnost.&lt;/p&gt;

&lt;h3 id=&quot;gradle&quot;&gt;Gradle&lt;/h3&gt;

&lt;p&gt;Gradle využívá Maven závislosti a přidává flexibilitu, které se až vymyká z rukou.
Od začátku myslí na rychlost buildu a systém cachování.
Prsí se, že oproti Mavenu jsou &lt;a href=&quot;https://gradle.org/gradle-and-maven-performance/&quot;&gt;v některých případech až 100 krát rychlejší&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;maven-daemon&quot;&gt;Maven Daemon&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/apache/maven-mvnd&quot;&gt;Maven Daemon&lt;/a&gt; je dlouhodobý proces běžící na pozadí.
Start JVM není úplně zanedbatelná operace.
S démonem tedy ušetříte start JVM při každém buildu a hlavně nepřijdete o JIT (Just-In-Time) optimalizace.
V neposlední řadě dostaneme vylepšený výstup paralelního build na konzoli.&lt;/p&gt;

&lt;h3 id=&quot;vlastní-pozorování&quot;&gt;Vlastní pozorování&lt;/h3&gt;

&lt;p&gt;V současné době mimo jiné přispívám do open source projektu &lt;a href=&quot;https://github.com/wultra/powerauth-server&quot;&gt;PowerAuth&lt;/a&gt;.
Níže naleznete dobu buildu na MacBook Pro s M1 procesorem.
&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;mvnd&lt;/code&gt; je příkaz pro build pomocí Maven Daemon.&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;Příkaz&lt;/th&gt;
      &lt;th&gt;Čas buildu&lt;/th&gt;
      &lt;th&gt;Poznámka&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;mvn clean package&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;46,6 s&lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;mvn package&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;30,6 s&lt;/td&gt;
      &lt;td&gt; &lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;mvn clean package -T 1C&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;40 s&lt;/td&gt;
      &lt;td&gt;Paralelní běh, 1 thread na dostupný core.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;mvn package -T 1C&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;28,6&lt;/td&gt;
      &lt;td&gt;Paralelní běh, 1 thread na dostupný core.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;mvnd clean package&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;37,9 s&lt;/td&gt;
      &lt;td&gt;Démon, paralelně spouští &lt;em&gt;by default&lt;/em&gt;.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;mvnd package&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;26,4 s&lt;/td&gt;
      &lt;td&gt;Démon, paralelně spouští &lt;em&gt;by default&lt;/em&gt;, &lt;strong&gt;první běh&lt;/strong&gt;.&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;mvnd package&lt;/code&gt;&lt;/td&gt;
      &lt;td&gt;22,8 s&lt;/td&gt;
      &lt;td&gt;Démon, paralelně spouští &lt;em&gt;by default&lt;/em&gt;, &lt;strong&gt;po zahřátí&lt;/strong&gt;.&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h3 id=&quot;úskalí-paralelního-buildu&quot;&gt;Úskalí paralelního buildu&lt;/h3&gt;

&lt;p&gt;Jak jsme si již řekli, paralelní build v Mavenu stále není plně podporován.
Kromě problémových pluginů můžete narazit i na problémy ve svém kód, který třeba nezvládne paralelní běh integrační testů, takže si budete muset zamést i před svým prahem.&lt;/p&gt;

&lt;h2 id=&quot;závěr&quot;&gt;Závěr&lt;/h2&gt;

&lt;p&gt;Ač zrychlení paralelního buildu v Mavenu nedosahuje hodnot, jaké reklamuje Gradle, tak přesto by byla škoda toho nevyužít.
Když už se dáte cestu paralelního buildu v Mavenu, doporučuji využít Maven Daemon.
Při práci ve větších týmech a v situaci, kdy programátoři přechází mezi projekty, dávám přednost předvídatelnosti před rychlostí.&lt;/p&gt;

&lt;h2 id=&quot;související&quot;&gt;Související&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;/software%20development/2015/04/29/konflikt-tranzitivnich-zavislosti.html&quot;&gt;Konflikt tranzitivních závislostí&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        <pubDate>Sat, 23 Aug 2025 00:00:00 +0000</pubDate>
        <link>https://blog.zvestov.cz/software%20development/2025/08/23/maven-daemon.html</link>
        <guid isPermaLink="true">https://blog.zvestov.cz/software%20development/2025/08/23/maven-daemon.html</guid>
        
        <category>Maven</category>
        
        
        <category>software development</category>
        
      </item>
    
      <item>
        <title>Úskalí GHA runneru</title>
        <description>&lt;div style=&quot;float: left; margin: 0 1em 1em 0; text-align: center;&quot;&gt;&lt;img src=&quot;/assets/2025-07-30/275576.png&quot; /&gt;&lt;/div&gt;

&lt;p&gt;Měl jsem takovou tvůrčí krizi.
Můžu to alespoň svádět na dobu LLM.
Má dneska vůbec smysl něco tvořit?
Jenže stroje vám, zatím, odpoví jen na to, co jste se zeptali.
Proto čtu online články i časopisy, které mi rozšiřují obzor, protože mi podsouvají informace, na které bych se býval nezeptal.
Jednak mám puzení něco psát, jednak je blog z velké části deník pro mě samotného, jako si psal &lt;a href=&quot;https://cs.wikipedia.org/wiki/Z_den%C3%ADku_kocoura_Modroo%C4%8Dka&quot;&gt;Kocour Modroočko&lt;/a&gt;, co všechno zažil (kdo neznáte zhudebněnou verzi s Dejdarem, pusťte si, je to poklad pro děti i dospělé).&lt;/p&gt;

&lt;p&gt;Pojďme se rozehřát něčím jednoduchým až banálním.&lt;/p&gt;

&lt;p&gt;Jeden z nejznámějších build nástrojů Jenkins se dříve konfiguroval jen klikáním v GUI.
Bylo to nepohodlné, špatně se to verzovalo, zálohovalo a možném code review ani nemluvě.
Naštěstí tu je s námi už nějakou dobu &lt;a href=&quot;https://www.jenkins.io/doc/book/pipeline/jenkinsfile/&quot;&gt;Jenkinsfile&lt;/a&gt;, který leží v repozitáři vedle zdrojového kódu.&lt;/p&gt;

&lt;p&gt;Vedle toho existuje lákavá alternativa &lt;a href=&quot;https://docs.github.com/en/actions/get-started/quickstart&quot;&gt;GitHub Actions&lt;/a&gt; (dále jen GHA).
Představte si, že byste se nemuseli starat o vlastní build server, jaká pohoda.
Do jaké pasti byste se asi tak mohli dostat?&lt;/p&gt;

&lt;!--more--&gt;

&lt;div style=&quot;clear: both&quot;&gt;&lt;/div&gt;

&lt;h2 id=&quot;problém-s-gha&quot;&gt;Problém s GHA&lt;/h2&gt;

&lt;p&gt;Jenkins buildy jsme dávno přenesli na GHA.
Jeden z nich pouštěl baterii integračních testů vůči &lt;em&gt;dev&lt;/em&gt; prostředí.
Neříkám, že je to vzor hodný následování, ale v Jenkins to fungovalo a nějakou dobu i v GHA.&lt;/p&gt;

&lt;p&gt;Pak začaly testy padat na &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;Connection timed out&lt;/code&gt;.
Nějakou chvíli to ignorujete, prostě síť je nespolehlivá, ale testy musí být přeci zelené.&lt;/p&gt;

&lt;p&gt;Z výše popsaného je patrné, že testy a server běží nezávisle na sobě.
I když je server v Azure a GHA je od Microsoftu, nic nezaručuje, že poběží ve stejném regionu.&lt;/p&gt;

&lt;p&gt;Hypotézu je potřeba ověřit.&lt;/p&gt;

&lt;h2 id=&quot;ověření-hypotézy&quot;&gt;Ověření hypotézy&lt;/h2&gt;

&lt;p&gt;Do konfigurace GHA přidáme&lt;/p&gt;

&lt;div class=&quot;language-yaml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;na&quot;&gt;steps&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;pi&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;Log runner IP and region&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;run&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;pi&quot;&gt;|&lt;/span&gt;
      &lt;span class=&quot;s&quot;&gt;echo &quot;Public IP:&quot;&lt;/span&gt;
      &lt;span class=&quot;s&quot;&gt;curl -s https://ifconfig.me&lt;/span&gt;
      &lt;span class=&quot;s&quot;&gt;echo -e &quot;\nRegion info (GeoIP):&quot;&lt;/span&gt;
      &lt;span class=&quot;s&quot;&gt;curl -s https://ipinfo.io&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Výsledek&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-log&quot;&gt;Public IP:
135.232.177.160
Region info (GeoIP):
{
  &quot;ip&quot;: &quot;135.232.177.160&quot;,
  &quot;city&quot;: &quot;Chicago&quot;,
  &quot;region&quot;: &quot;Illinois&quot;,
  &quot;country&quot;: &quot;US&quot;,
  &quot;loc&quot;: &quot;41.8500,-87.6500&quot;,
  &quot;org&quot;: &quot;AS8075 Microsoft Corporation&quot;,
  &quot;postal&quot;: &quot;60666&quot;,
  &quot;timezone&quot;: &quot;America/Chicago&quot;,
  &quot;readme&quot;: &quot;https://ipinfo.io/missingauth&quot;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;A sakra, dev server běží ve West Europe.
&lt;a href=&quot;https://github.com/orgs/community/discussions/11727&quot;&gt;Dle této diskuse region u GHA nastavit bohužel nelze&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Nikdy se nedozvím, proč se to rozbilo až po čase. Možná Trump uvalil clo i na TCP spojení, nebo GitHub prostě jen čaroval s regiony runnerů.&lt;/p&gt;

&lt;h2 id=&quot;řešení&quot;&gt;Řešení&lt;/h2&gt;

&lt;p&gt;Jak z toho ven?&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Připravit si &lt;a href=&quot;https://docs.github.com/en/actions/concepts/runners/self-hosted-runners&quot;&gt;self-hosted runner&lt;/a&gt;, s tím ale padá ona výhoda, že se nechcete o nic starat.&lt;/li&gt;
  &lt;li&gt;Přesunout server do jiného regionu (což se zase nemusí hodit pro jiné scénáře, kdy tam přistupujete z Evropy).&lt;/li&gt;
  &lt;li&gt;Vytvořit další instanci jen pro testy (v regionu, kde dle logu runner s testy běží).&lt;/li&gt;
  &lt;li&gt;Ideální, zato nejsložitější cesta, vytvořit image, který bude obsahovat jak server, tak testy, což zaručí, že všechno bude na jediném místě.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;závěr&quot;&gt;Závěr&lt;/h2&gt;

&lt;p&gt;I když jste nečetli knihu &lt;a href=&quot;/software%20development/2012/07/24/povestny-clovekomesic.html&quot;&gt;The Mythical Man-Month (Frederick P. Brooks)&lt;/a&gt;, jistě vám bude znám koncept &lt;a href=&quot;https://en.wikipedia.org/wiki/No_Silver_Bullet&quot;&gt;No Silver Bullet&lt;/a&gt;.
Je lákavé, že se nemusíte o nic starat, ale když už se o něco postarat potřebujete, tak je to pak komplikované až nemožné.&lt;/p&gt;
</description>
        <pubDate>Wed, 30 Jul 2025 00:00:00 +0000</pubDate>
        <link>https://blog.zvestov.cz/software%20development/2025/07/30/uskali-gha-runneru.html</link>
        <guid isPermaLink="true">https://blog.zvestov.cz/software%20development/2025/07/30/uskali-gha-runneru.html</guid>
        
        <category>CI</category>
        
        
        <category>software development</category>
        
      </item>
    
  </channel>
</rss>
