<?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>Sun, 11 Oct 2026 07:44:50 +0000</pubDate>
    <lastBuildDate>Sun, 11 Oct 2026 07:44:50 +0000</lastBuildDate>
    <generator>Jekyll v4.4.1</generator>
    
      <item>
        <title>Vezmi mě na Měsíc</title>
        <description>&lt;div style=&quot;float: left; margin: 0 1em 1em 0; text-align: center;&quot;&gt;&lt;img src=&quot;/assets/2026-10-10/57439.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; 2026, &lt;a href=&quot;https://vhsky.cz/w/3LmQt1oVN84vtybW63s99R&quot;&gt;videozáznam ke zhlédnutí&lt;/a&gt;.
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.
Vracím se k programu Apollo a ptám se, jak se lidé dostali na Měsíc a zpět navzdory tehdejším technickým omezením.&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;&lt;a href=&quot;https://en.wikipedia.org/wiki/Fly_Me_to_the_Moon&quot;&gt;Fly Me to the Moon&lt;/a&gt; je jazzová skladba, kterou proslavil Frank Sinatra.
Jedná se i o &lt;a href=&quot;https://www.csfd.cz/en/film/1432860-fly-me-to-the-moon/overview/&quot;&gt;stejnojmennou romantickou komedii&lt;/a&gt;, která roztomile rozvíjí konspirační teorii, že Američané na Měsíci nepřistáli.
A já vás dnes chci vzít na Měsíc.&lt;/p&gt;

&lt;iframe class=&quot;center&quot; title=&quot;jOpenSpace 2026 - Luboš Račanský - Fly Me to the Moon&quot; width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://vhsky.cz/videos/embed/3LmQt1oVN84vtybW63s99R&quot; allow=&quot;fullscreen&quot; sandbox=&quot;allow-same-origin allow-scripts allow-popups allow-forms&quot; style=&quot;border: 0px;&quot;&gt;&lt;/iframe&gt;

&lt;p&gt;Když jsem chodil na základku, v čítance byla zařazená &lt;a href=&quot;https://www.databazeknih.cz/povidky/blbec-z-xeenemunde-1308&quot;&gt;povídka Blbec z Xeenemünde&lt;/a&gt;, kterou napsal Josef Nesvadba.
Byl podle ní &lt;a href=&quot;https://www.csfd.cz/film/430-blbec-z-xeenemunde/recenze/&quot;&gt;natočen i film&lt;/a&gt;.
Tehdy mi nedošlo a nikdo mi nevysvětlil, že jde o narážku na &lt;a href=&quot;https://museum-peenemuende.de/&quot;&gt;základnu Peenemünde&lt;/a&gt;, kde vyvíjeli rakety V1 a V2. Budete-li mít cestu do severovýchodního Německa, muzeum navštivte. Možná vědci romantickou posedlostí jen omlouvali svou účast na válečném tažení, ale je fakt, že vývoj zbraní nás na Měsíc dostal.&lt;/p&gt;

&lt;p&gt;Léta jsem nejapně žertoval, že telefon v kapse má větší výpočetní výkon než raketa, která letěla na Měsíc.
Až jsem jednou na &lt;a href=&quot;https://news.ycombinator.com/&quot;&gt;HackerNews&lt;/a&gt; narazil na myšlenkový experiment, který &lt;a href=&quot;https://forrestheller.com/Apollo-11-Computer-vs-USB-C-chargers.html&quot;&gt;propočítává, že i nabíječka má výkon větší&lt;/a&gt;.
To byla jedna z věcí, která mě přiměla podívat se na vesmírný výzkum trochu systematičtěji.&lt;/p&gt;

&lt;p&gt;Předesílám, že na téma nejsem odborník, přináším jen rozcestník zajímavostí, které mi přišly pod ruku.&lt;/p&gt;

&lt;p&gt;Zarámujme to geopoliticky.
Nacházíme se v šedesátých létech, USA na tom nejsou dobře.
&lt;a href=&quot;https://cs.wikipedia.org/wiki/Invaze_v_z%C3%A1toce_Svin%C3%AD&quot;&gt;Invaze v Zátoce Sviní skončí debaklem&lt;/a&gt; a Sověti dostávají prvního člověka do vesmíru.&lt;/p&gt;

&lt;p&gt;Pak přichází JFK a jeho slavný &lt;a href=&quot;https://www.youtube.com/watch?v=QXqlziZV63k&quot;&gt;Moon Speech&lt;/a&gt;, nejlepší projev, který jsem kdy slyšel.
Pravidelně se k němu vracím a pokaždé se u toho dojmu.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Rozhodli jsme se v tomto desetiletí letět na Měsíc a uskutečnit i další věci, ne proto, že by to bylo snadné, ale právě proto, že je to obtížné…&lt;/p&gt;
&lt;/blockquote&gt;

&lt;iframe class=&quot;center&quot; width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/QXqlziZV63k?si=xg_KLWxca4ONdcIg&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;Následuje program Mercury, který měl dostat Američana na oběžnou dráhu.
Program Gemini otestoval delší pobyt ve vesmíru a spojení dvou těles.
Teprve navazující program Apollo pak zamířil přímo k Měsíci.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://thumb.wikimedia.org/wikipedia/commons/thumb/f/f4/NASA_spacecraft_comparison.jpg/330px-NASA_spacecraft_comparison.jpg?utm_source=en.wikipedia.org&amp;amp;utm_campaign=index&amp;amp;utm_content=thumbnail&quot; alt=&quot;&quot; class=&quot;center&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;em class=&quot;center&quot;&gt;NASA/Davis Paul Meltzer, Public Domain&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Programům Mercury a Gemini se nestihneme věnovat. I přes kritiku za historickou nepřesnost vřele doporučuji film &lt;a href=&quot;https://www.csfd.cz/film/5024-spravna-posadka/recenze/&quot;&gt;Správná posádka&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;navigační-systém&quot;&gt;Navigační systém&lt;/h2&gt;

&lt;p&gt;Navigační systém se skládal z několika částí.
Pojďme si je postupně projít.
Čerpal jsem mimo jiné z &lt;a href=&quot;https://www.youtube.com/watch?v=B1J2RMorJXM&quot;&gt;přednášky Roberta Willse&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/B1J2RMorJXM?si=oDthJ73F9sJDKDW8&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;Ve vesmíru není žádné nahoře, referenčním prvkem byla setrvačnost.
Inerciální navigaci si zjednodušeně můžeme představit jako chůzi se zavázanýma očima, přičemž si průběžně zaznamenáváte každý krok a každý obrat.
Inerciální jednotka Apollo byla založena na fyzických rotujících gyroskopech.
Dnes máme k dispozici i micro-elektro-mechanické systémy nebo optická vlákna.
&lt;a href=&quot;https://www.youtube.com/watch?v=jtQXFaBK-eQ&quot;&gt;Názorné porovnání všech variant najdete v tomto videu.&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/jtQXFaBK-eQ?si=gOsxLVh-IFdixVWX&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;počítač&quot;&gt;Počítač&lt;/h2&gt;

&lt;p&gt;Mozkem byl &lt;a href=&quot;https://en.wikipedia.org/wiki/Apollo_Guidance_Computer&quot;&gt;Apollo Guidance Computer&lt;/a&gt;.
V době sálových počítačů vzniklo zařízení s příkonem 55 wattů a hmotnosti 32 kilogramů.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://thumb.wikimedia.org/wikipedia/commons/thumb/7/79/Agc_view.jpg/330px-Agc_view.jpg?utm_source=commons.wikimedia.org&amp;amp;utm_campaign=index&amp;amp;utm_content=thumbnail&quot; alt=&quot;&quot; class=&quot;center&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;em class=&quot;center&quot;&gt;Apollo Guidance Computer and DSKY, Public Domain&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;V době, kdy kdy vstupem i výstupem byly děrné štítky, tu máme „display and keyboard“, vyslovujeme DISS-kee.
Klávesnici je nutné ovládat i v rukavicích.
Princip zadávání je založen na kombinaci slovesa a podstatného jména.
Na &lt;a href=&quot;https://www.svtsim.com/moonjs/agc.html&quot;&gt;simulátoru&lt;/a&gt; vidíme &lt;em&gt;verb&lt;/em&gt; 16 sleduj, &lt;em&gt;noun&lt;/em&gt; 65 aktuální čas.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/2026-10-10/simulator.png&quot; alt=&quot;&quot; class=&quot;center&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Klíčovou součástí navigačního systému jsou i optické prvky.
Zaměřovač v okně lunárního modulu a sextant ve velitelském modulu, který sloužil ke kalibraci inerciální jednotky vzhledem ke hvězdám.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://www.righto.com/2019/07/software-woven-into-wire-core-rope-and.html&quot;&gt;Paměť byla magnetická&lt;/a&gt;, 4KB RAM a 72KB ROM.
Každým jádrem (nebo kolem něj) prochází 192 snímacích vodičů, takže každé jádro pojalo 12 slov dat.&lt;/p&gt;

&lt;div class=&quot;jekyll-twitter-plugin&quot;&gt;&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;In 1969 Apollo 11, the spaceflight that first landed humans on the Moon, used these 30 lines of code to calculate transcendental functions like sine and cosine essential for navigation.&lt;br /&gt;&lt;br /&gt;Annotated code here: &lt;a href=&quot;https://t.co/5cOQHlATbB&quot;&gt;https://t.co/5cOQHlATbB&lt;/a&gt; &lt;a href=&quot;https://t.co/s4hn2EOmGS&quot;&gt;pic.twitter.com/s4hn2EOmGS&lt;/a&gt;&lt;/p&gt;&amp;mdash; Fermat&amp;#39;s Library (@fermatslibrary) &lt;a href=&quot;https://x.com/fermatslibrary/status/2042197982506828161?ref_src=twsrc%5Etfw&quot;&gt;April 9, 2026&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async=&quot;&quot; src=&quot;https://platform.x.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;

&lt;/div&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/chrislgarry/Apollo-11&quot;&gt;Zdrojový kód Apollo Guidance Computer byl zveřejněn&lt;/a&gt;.
Samozřejmě se jedná o assembler.
Napsali jste v něm alespoň &lt;em&gt;hello world&lt;/em&gt;?
Tady na 30 řádcích počítají cosinus.
Pro aproximace používají &lt;a href=&quot;https://cs.wikipedia.org/wiki/Taylorova_%C5%99ada&quot;&gt;Taylorův polynom&lt;/a&gt; a pro snížení počtu násobení &lt;a href=&quot;https://cs.wikipedia.org/wiki/Hornerovo_sch%C3%A9ma&quot;&gt;Hornerovo schéma&lt;/a&gt;.
Na grafu je vidět rozdíl mezi aproximací a přesným průběhem.&lt;/p&gt;

&lt;h2 id=&quot;přistání&quot;&gt;Přistání&lt;/h2&gt;

&lt;p&gt;&lt;img src=&quot;/assets/2026-10-10/error.png&quot; alt=&quot;&quot; class=&quot;center&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Během přistání Apolla 11 se několikrát objevila neočekávaná chyba.
Procedura přistání zabírala 80% výkonu.
Kvůli přípravě na případné nouzové přerušení sestupu byl zapnutý rendez-vous radar, ten zabíral 15 % výkonu.
Zobrazení a aktualizace údajů k přistání vedly k přetížení.
Systém však byl navržen robustně.
Restartoval se a omezoval úlohy s nízkou prioritou.&lt;/p&gt;

&lt;p&gt;Neil Armstrong kromě řešení chyby musel navíc přejít na ruční ovládání, aby se vyhnul balvanům v místě plánovaného přistání.
Zbývalo mu palivo na několik posledních vteřin, přesto měl tepovku kolem 150.
Já na gauči při sledování scény ve filmu &lt;a href=&quot;https://www.csfd.cz/film/502300-prvni-clovek/&quot;&gt;První člověk&lt;/a&gt; nebo poslechu &lt;a href=&quot;https://apolloinrealtime.org/11/?t=102:38:29&quot;&gt;záznamu radiokomunikace&lt;/a&gt; jsem měl tepovku mnohem větší.&lt;/p&gt;

&lt;h2 id=&quot;margaret-hamilton&quot;&gt;Margaret Hamilton&lt;/h2&gt;

&lt;p&gt;Traduje se historka, že Margaret Hamilton přivedla do práce svou čtyřletou dceru, která způsobila selhání simulátoru a odhalila tak potenciální zranitelnost systému.
Uvědomila si, že astronauti by mohli během skutečné mise udělat stejnou chybu, ale NASA její obavy zpočátku bagatelizovala.
Jenže posádka Apolla 8 si opravdu omylem smazala data potřebná pro zpáteční cestu.
Tato událost podtrhla význam jejího proaktivního přístupu k prevenci chyb.
&lt;a href=&quot;https://news.mit.edu/2026/margaret-hamilton-computing-pioneer-dies-1007&quot;&gt;Řada postupů, které použila, byly později aplikovány v moderních konceptech softwarové architektury&lt;/a&gt;.
(Zemřela 30. září 2026, ve věku 90 let, několik dní před přednáškou.)&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://thumb.wikimedia.org/wikipedia/commons/thumb/d/db/Margaret_Hamilton_-_restoration.jpg/500px-Margaret_Hamilton_-_restoration.jpg?utm_source=en.wikipedia.org&amp;amp;utm_campaign=index&amp;amp;utm_content=thumbnail&quot; alt=&quot;&quot; class=&quot;center&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Hamiltonová v roce 1969, stojící vedle výpisů z naváděcího softwaru pro program Apollo, který vyvinula spolu se svým týmem z MIT, Public Domain&lt;/em&gt;&lt;/p&gt;

&lt;h2 id=&quot;cesta-domů&quot;&gt;Cesta domů&lt;/h2&gt;

&lt;p&gt;Horolezci vědí, že se nemají upínat pouze k výstupu na vrchol, že stejně náročný, ne-li náročnější, je návrat.
Neuvědomil jsem si, jak netriviální je setkání s velitelským modulem na oběžné dráze.
Nebudu tady zabíhat do fyziky, &lt;a href=&quot;https://www.youtube.com/watch?v=KdHI5Fn9Fu8&quot;&gt;odkážu vás na tohle video&lt;/a&gt;.
Snad jen vypíchnu zdánlivě neintuitivní fakt, že nižší oběžná dráha znamená větší rychlost a tedy kratší dobu oběhu.&lt;/p&gt;

&lt;iframe class=&quot;center&quot; width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/KdHI5Fn9Fu8?si=Z16ki9V9xWwTr6kc&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;apollo-12&quot;&gt;Apollo 12&lt;/h2&gt;

&lt;p&gt;Pouhých 36 vteřin po startu zasáhl raketu Apolla 12 blesk a loď ztratila telemetrii.
Od zmaření celé mise a nebezpečného přerušení startu posádku zachránila předchozí zvídavost mladého kontrolora &lt;a href=&quot;https://en.wikipedia.org/wiki/John_Aaron&quot;&gt;Johna Aarona&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Aaron si z dřívějších simulací pamatoval přesný vzorec tohoto selhání a vyslal ikonický pokyn: &lt;em&gt;„SCE to AUX“&lt;/em&gt; (přepnutí napájení jednotky převodníku signálů na záložní větev).
Astronaut Alan Bean přepínač na palubní desce bleskově přepnul, telemetrie ožila a mise pokračovala.
Tato schopnost porozumět systému do nejmenších detailů udělala z Aarona legendu.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://upload.wikimedia.org/wikipedia/commons/4/44/JAaron.jpg?utm_source=commons.wikimedia.org&amp;amp;utm_campaign=index&amp;amp;utm_content=original&quot; alt=&quot;&quot; class=&quot;center&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;em class=&quot;center&quot;&gt;John Aaron, Public Domain&lt;/em&gt;&lt;/p&gt;

&lt;h2 id=&quot;apollo-13&quot;&gt;Apollo 13&lt;/h2&gt;

&lt;p&gt;Apollo 13 není třeba dlouze představovat.
Tato mise přinesla velké poučení nejen o tom, jak zásadní je kompatibilita náhradních dílů.
V &lt;a href=&quot;https://www.youtube.com/watch?v=eeEM_IBUv70&quot;&gt;této scénce vidíme&lt;/a&gt;, že filtr z lunárního modulu nepasuje na velitelský.
Celý workaround držel pohromadě díky stříbrné lepicí pásce, která se naštěstí v kosmické lodi vždy nacházela.&lt;/p&gt;

&lt;iframe class=&quot;center&quot; width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/eeEM_IBUv70?si=pQU23DExvWwEOk4C&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;apollo-14&quot;&gt;Apollo 14&lt;/h2&gt;

&lt;p&gt;Apollo 14 je asi první živý hotfix v historii.
Malý kousek pájky ve stavu beztíže zkratoval kontakt tlačítka &lt;em&gt;abort&lt;/em&gt;.
Don Eyles softwarově opravil hardwarovou chybu.
Přesvědčil počítač, že signál pro přerušení sestupu už byl zpracován, takže systém začal falešný signál ze zkratovaného tlačítka ignorovat a mohl bezpečně pokračovat v přistání.
Astronauti nahráli program pomocí 61 stisků na DSKY.&lt;/p&gt;

&lt;h2 id=&quot;jak-to-bylo-dál&quot;&gt;Jak to bylo dál?&lt;/h2&gt;

&lt;p&gt;Geopoliticky zarámujeme i konec dekády.
&lt;a href=&quot;https://cs.wikipedia.org/wiki/Masakr_student%C5%AF_na_Kentsk%C3%A9_st%C3%A1tn%C3%AD_univerzit%C4%9B_v_Ohiu&quot;&gt;Na univerzitě v Ohiu zastřelí příslušníci Národní gardy několik studentů během protiválečné demonstrace&lt;/a&gt;.
&lt;a href=&quot;https://www.csfd.cz/film/1550116-mnichov-1972&quot;&gt;Na olympiádě v Mnichově je spáchán teroristický útok&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/H-kA3UtBj4M?si=UZ4hiqYOYxK000uN&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;Éra Apolla skončila v prosinci 1972 a trvalo přes půl století, než jsme se k lunárnímu programu vrátili.
Mohlo by se zdát, že s dnešním nepředstavitelným výpočetním výkonem a moderními materiály to bude hračka.
Původně jsem v historických materiálech hledal senzaci, ale zůstal ve mně především obdiv k lidem, kteří to dokázali poprvé.
O to větší respekt si zaslouží současný program Artemis.
&lt;a href=&quot;https://www.nationalgeographic.cz/specialy/artemis-ii-ctyri-astronauti-mesic/&quot;&gt;Mise Artemis II letos úspěšně obletěla Měsíc&lt;/a&gt; a ukázala, že bezpečně dopravit lidskou posádku k Měsíci a zpět zůstává i dnes špičkovou inženýrskou disciplínou.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://thumb.wikimedia.org/wikipedia/commons/thumb/7/76/Artemis_II_Watch_Party_Social_Media_1920x1080_%281954105009817%29.jpg/960px-Artemis_II_Watch_Party_Social_Media_1920x1080_%281954105009817%29.jpg?utm_source=commons.wikimedia.org&amp;amp;utm_campaign=index&amp;amp;utm_content=thumbnail&quot; alt=&quot;&quot; class=&quot;center&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Artemis II Watch Party Social Media, Public Domain&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;Trefně to shrnul &lt;a href=&quot;https://en.wikipedia.org/wiki/Gene_Kranz&quot;&gt;Gene Kranz&lt;/a&gt;, letový ředitel misí programů Mercury, Gemini a Apollo, ve své knize &lt;a href=&quot;https://www.goodreads.com/book/show/141499.Failure_is_Not_an_Option&quot;&gt;Failure is Not an Option&lt;/a&gt;.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Přes všechen technický pokrok byl lidský faktor pro úspěch naprosto klíčový.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Je to motto, které mi v dnešním turbulentním světě dává pevnou půdu pod nohama.
Psaní kódu nás programátory bavilo, ale fakticky jsme za to placení nebyli.
Teď je to jen víc vidět.
Umět programovat znamená ve své podstatě myslet.
Řešíme problémy a jsme v tom fakt dobří.
Jen se s nástupem AI změnily podmínky.
Skutečnou hodnotou inženýra stále zůstává analytické myšlení a návrh robustních systémů.&lt;/p&gt;
</description>
        <pubDate>Sat, 10 Oct 2026 00:00:00 +0000</pubDate>
        <link>https://blog.zvestov.cz/software%20development/2026/10/10/vezmi-me-na-Mesic.html</link>
        <guid isPermaLink="true">https://blog.zvestov.cz/software%20development/2026/10/10/vezmi-me-na-Mesic.html</guid>
        
        <category>historie</category>
        
        <category>konference</category>
        
        <category>jopenspace</category>
        
        
        <category>software development</category>
        
      </item>
    
      <item>
        <title>WebFlux a pastičky reaktivního programování</title>
        <description>&lt;div style=&quot;float: left; margin: 0 1em 1em 0; text-align: center;&quot;&gt;&lt;img src=&quot;/assets/2026-08-22/reactor.png&quot; /&gt;&lt;/div&gt;

&lt;p&gt;Ačkoliv vím, že &lt;a href=&quot;/software%20development/2013/06/12/veci-ktere-byste-nemeli-nikdy-delat.html&quot;&gt;přepisování software je něco, co byste nikdy neměli dělat&lt;/a&gt;, tak jsme se i přesto do jednoho přepisu pustili.
Velmi důležité byly nároky na výkon a propustnost.
&lt;a href=&quot;https://netflixtechblog.com/java-21-virtual-threads-dude-wheres-my-lock-3052540e231d&quot;&gt;Zkušenost Netflixu s virtuálními vlákny na Java 21&lt;/a&gt; nás varovaly, že tuhle cestu zatím ještě zkoušet nechceme.
Situace se od té doby změnila, viz &lt;a href=&quot;https://openjdk.org/jeps/491&quot;&gt;JEP 491: Synchronize Virtual Threads without Pinning&lt;/a&gt;
Tehdy jsme učinili pokus s reaktivním programováním a WebFlux ve Spring Boot.
Udělal jsem si pár poznámek, které bych nerad ztratil někde v archivu, kde už se mi víc jak rok válí (tak snad to ještě nestačilo tolik zastarat).&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;Spring MVC používá &lt;em&gt;thread-per-request model&lt;/em&gt;, kde každý požadavek je zpracováván jedním vláknem od začátku do konce.&lt;/p&gt;

&lt;p&gt;Oproti tomu &lt;a href=&quot;https://docs.spring.io/spring-framework/reference/web/webflux.html&quot;&gt;WebFlux&lt;/a&gt; je založen na reaktivním, neblokujícím modelu zpracování požadavků.
Používá malý počet vláken (event-loop model).
Je-li celý řetězec zpracování neblokující, tak se tato vlákna neblokují čekáním na I/O, ale jsou uvolněna pro zpracování dalších požadavků.
Standardně staví na projektu &lt;a href=&quot;https://projectreactor.io/&quot;&gt;Reactor&lt;/a&gt; a jako výchozí runtime používá Netty.&lt;/p&gt;

&lt;h2 id=&quot;databáze&quot;&gt;Databáze&lt;/h2&gt;

&lt;p&gt;Dřív se člověk mohl vymlouvat, že reaktivní programování stejně nemá cenu, když neexistují reaktivní databázové ovladače.
To už dávno neplatí, máme &lt;a href=&quot;https://r2dbc.io/&quot;&gt;R2DBC&lt;/a&gt; a i odpovídající &lt;a href=&quot;https://docs.spring.io/spring-data/relational/reference/r2dbc.html&quot;&gt;Spring Data&lt;/a&gt;, ale přišlo mi, že jsou pořád trochu nedotažené.
Například &lt;a href=&quot;https://stackoverflow.com/a/79579275/204950&quot;&gt;jsem nebyl schopný dosáhnout &lt;em&gt;Load aggregates with a single select&lt;/em&gt;&lt;/a&gt;, tedy načíst celý agregát (i se všemi vazbami) jedním SQL SELECTem s JOINy, což by v JDBC normálně mělo být možné.&lt;/p&gt;

&lt;h2 id=&quot;pooling&quot;&gt;Pooling&lt;/h2&gt;

&lt;p&gt;Při prvním spuštění výkonnostních testů jsme dostávali žalostné výsledky.
Když celý příběh zkrátím, tak z metrik vyplynulo, že se dlouho čeká na vykonání databázového dotazu, respektive už na samotné získaní spojení z poolu.
To bylo obzvláště divné, jelikož pool měl alokováno víc spojení, ale nikdy nebyla využitá všechna.
Tedy měli jsme alokováno 50 spojení, ale nikdy jich to nepoužilo všech dostupných 50 paralelně.&lt;/p&gt;

&lt;p&gt;Hlavní příčinou bylo, že &lt;em&gt;colocation&lt;/em&gt; je ve výchozím nastavení zapnuté.
V JavaDoc se píše:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;true means that &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;EventLoopGroup&lt;/code&gt; created for clients will reuse current local event loop if already working inside one&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Přeloženo do lidštiny: To způsobí, že se znovu použije aktuální event loop a vede na pozorované nerovnoměrné rozložení zátěže.&lt;/p&gt;

&lt;p&gt;Není to úplně špatně vymyšlené, protože to šetří přepínání kontextu a zlepšuje práci s cache, ale pro vysokou paralelní zátěž je to nevhodné.&lt;/p&gt;

&lt;p&gt;Samozřejmě se to netýká jen poolu databázových spojení ale i HTTP.
Vyřešila to následující Java konfigurace.&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;@Bean&lt;/span&gt;
&lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;ConnectionFactoryOptionsBuilderCustomizer&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;loopResourcesCustomizer&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;logger&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;info&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Configuring Netty Loop Resources for PostgreSQL R2DBC connection pool not using colocated event loop threads.&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;builder&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;builder&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;option&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;
            &lt;span class=&quot;nc&quot;&gt;PostgresqlConnectionFactoryProvider&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;LOOP_RESOURCES&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;nc&quot;&gt;LoopResources&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;create&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;pg-pool&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;LoopResources&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;DEFAULT_IO_SELECT_COUNT&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;LoopResources&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;DEFAULT_IO_WORKER_COUNT&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;nd&quot;&gt;@Bean&lt;/span&gt;
&lt;span class=&quot;kd&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;NettyServerCustomizer&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;nettyServerCustomizer&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;n&quot;&gt;logger&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;info&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Configuring Netty Loop Resources for HTTP connection pool not using colocated event loop threads.&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;httpServer&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;httpServer&lt;/span&gt;
            &lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;runOn&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;LoopResources&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;create&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;reactor-http&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;LoopResources&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;DEFAULT_IO_SELECT_COUNT&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;LoopResources&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;DEFAULT_IO_WORKER_COUNT&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;));&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;Výstup z monitoringu ilustruje moment, kdy aplikace konečně začne využívat plnou kapacitu poolu.
Růžová (acquired) je stabilně na maximu (kolem 50), to je to, čeho jsme potřebovali dosáhnout.
Pool je plně vytížený a aplikace dokonce žádá o více spojení, než má k dispozici, což ukazuje tyrkysová (pending), která vystřeluje až ke 200. Aplikace má tedy velkou frontu čekajících požadavků na databázová spojení, ale to už stačí jen navýšit kapacitu poolu (samozřejmě s ohledem na to, co unese infrastruktura).&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/2026-08-22/monitoring.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

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

&lt;p&gt;Řešení s reaktivním programování zafungovalo a prošlo výkonnostními testy.
Konstrukty mi přišly neintuitivní (reaktivní programování je pro běžného Java programátora změna paradigmatu) a knihovny stále nepodporovaly scénáře, které bych očekával, že už budou dávno hotové.
Pokud nepotřebujete &lt;em&gt;backpressure&lt;/em&gt;, zkusil bych dnes dát virtuálním vláknům šanci.&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://blog.jetbrains.com/idea/2025/12/thread-dumps-and-project-loom-virtual-threads/&quot;&gt;Thread Dumps and Project Loom (Virtual Threads)&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.infoq.com/articles/virtual-threads-after-jdk24/&quot;&gt;Virtual Threads after JDK 24: What Changed for Production Java&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://jvogel.me/posts/2026/java-is-fast-your-code-might-not-be/#8-virtual-thread-pinning-if-youre-on-jdk-2123&quot;&gt;Virtual Thread Pinning (If You’re on JDK 21–23)&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://openjdk.org/jeps/491&quot;&gt;JEP 491: Synchronize Virtual Threads without Pinning&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://gaetanopiazzolla.github.io/java/2025/06/18/virtualthreads-java24.html&quot;&gt;Virtual Threads With Java 24 - Will it Scale?&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://piotrd.hashnode.dev/javas-reactive-connection-pooling-performance-caveat#heading-problem-reproduction&quot;&gt;Java’s reactive connection pooling performance caveat&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        <pubDate>Sat, 22 Aug 2026 00:00:00 +0000</pubDate>
        <link>https://blog.zvestov.cz/software%20development/2026/08/22/WebFlux-a-pasticky-reaktivniho-programovani.html</link>
        <guid isPermaLink="true">https://blog.zvestov.cz/software%20development/2026/08/22/WebFlux-a-pasticky-reaktivniho-programovani.html</guid>
        
        <category>Java</category>
        
        <category>Spring</category>
        
        
        <category>software development</category>
        
      </item>
    
      <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;videozáznam ke zhlé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>historie</category>
        
        <category>konference</category>
        
        <category>jopenspace</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>
    
  </channel>
</rss>
