<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>AI on ondra42.cz</title><link>https://ondra42.cz/tags/ai/</link><description>Zápisník jednoho člověka: hry, názory, hlášky.</description><generator>Hugo -- gohugo.io</generator><language>cs</language><lastBuildDate>Mon, 19 Oct 2026 19:00:00 +0200</lastBuildDate><atom:link href="https://ondra42.cz/tags/ai/index.xml" rel="self" type="application/rss+xml"/><item><title>Knihovna v databázi: 294 knih ze 39 fotek</title><link>https://ondra42.cz/2026/10/19/knihovna-katalog/</link><pubDate>Mon, 19 Oct 2026 19:00:00 +0200</pubDate><guid>https://ondra42.cz/2026/10/19/knihovna-katalog/</guid><description>Nafotil jsem skříň s knihami, z fotek vznikl katalog, k němu dohledané série a seznam chybějících dílů. Skončilo to objednávkou sedmnácti knih.</description><content:encoded><![CDATA[<p>Doma mám jednu vysokou skříň s prosklenými dveřmi. Osm polic a na každé
dvě řady knih, přední a zadní. Co stojí vzadu, jsem roky pořádně neviděl.
Dnes jsem to s Claude Code dal dohromady.</p>
<figure><img
      class="my-0 rounded-md"
      loading="lazy"
      decoding="async"
      alt="Skříň s prosklenými dveřmi, osm polic s knihami: Zelazny, Sapkowski, Tolkien, Eddings, Gor, Gemmell."
      width="369"
      height="1600"
      src="https://ondra42.cz/2026/10/19/knihovna-katalog/cover.jpg"
     
     
      data-zoom-src="https://ondra42.cz/2026/10/19/knihovna-katalog/cover.jpg"></figure>

<h2 class="relative group">Z fotek katalog
    <div id="z-fotek-katalog" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#z-fotek-katalog" aria-label="Kotva">#</a>
    </span>
    
</h2>
<p>Nafotil jsem každou polici, nejdřív přední řadu, pak zadní. Aby šlo poznat,
která zadní řada patří ke které polici, nechal jsem vpředu vždycky jednu
knihu jako značku. Dohromady 39 fotek.</p>
<p>Z nich AI přečetla hřbety a sestavila seznam: <strong>294 knih</strong>. U pěti si
názvem jistá nebyla, tak mi ukázala výřez fotky a já potvrdil nebo opravil.
Kde je ISBN přímo na hřbetu, zapsalo se taky; to je 61 knih a 55 z nich
potvrdil katalog Národní knihovny.</p>
<p>Vedlejší objev: pár knih mám dvakrát, třeba Předehru k Nadaci nebo Věčný
oheň.</p>

<h2 class="relative group">Které díly chybí
    <div id="které-díly-chybí" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#kter%c3%a9-d%c3%adly-chyb%c3%ad" aria-label="Kotva">#</a>
    </span>
    
</h2>
<p>Pak přišly série. Ke každé knize AI dohledala na Databázi knih, do které
série patří a kolikátý je to díl. Zajímaly mě série, ze kterých mám aspoň
polovinu dílů vydaných česky. Takových je 27, dalších 28 sérií mám
kompletních.</p>
<p>Párovat se muselo podle pořadí dílu, ne podle názvu. Vládci stínu jsou
například první díl Amberu, jen pod jiným českým titulem.</p>
<p>Seznam jsem pak prošel. Pár sérií jsem škrtl, protože si je vůbec
nepamatuju. Naopak jsem přidal Stasheffa, sérii Čarodějem sobě navzdory:
četl jsem ji, ale nemám ani jeden díl.</p>

<h2 class="relative group">Nákup
    <div id="nákup" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#n%c3%a1kup" aria-label="Kotva">#</a>
    </span>
    
</h2>
<p>Knihobot má zrovna akci 10 knih za 250 Kč. AI prošla celou nabídku akce,
přes 43 tisíc knih, a porovnala ji se seznamem chybějících dílů. Shoda
vyšla u 14 knih. Objednal jsem 17, z toho pět dílů Stasheffa.</p>
<p>Dvě knihy porovnání minulo: jedna vyšla pod pseudonymem autora, druhá má
na Databázi knih jiný název než v obchodě. Příště se musí párovat i přes
pseudonymy.</p>
]]></content:encoded></item><item><title>Krabice knih za 2000 Kč: od nápadu po aplikaci za jeden den</title><link>https://ondra42.cz/2026/10/10/krabice-knih-za-2000/</link><pubDate>Sat, 10 Oct 2026 15:00:00 +0200</pubDate><guid>https://ondra42.cz/2026/10/10/krabice-knih-za-2000/</guid><description>Ráno nápad, v poledne zkouška v knihkupectví na Zličíně, odpoledne aplikace, kterou sdílí lidi. Jak vznikl pomocník ke krabici knih od Dobrovského.</description><content:encoded><![CDATA[<p>Knihy Dobrovský mají tenhle týden akci: dostanete krabici a za 2000 Kč si
odnesete všechno, co se do ní vejde. Podmínka je jediná: víko musí jít
zavřít. Akce běží jen v kamenných prodejnách a končí v neděli 11. 10. ve
21:00.</p>
<p>V sobotu ráno mě napadlo, že tohle je úloha pro počítač. Které knihy se do
krabice vejdou a kterými se vyplatí ji naplnit? Celý den jsem to dělal
s Claude Code. Tohle je, jak to šlo za sebou.</p>
<p>Výsledek běží na <strong><a href="https://ondra42.cz/dobrovsky/"  target="_blank" rel="noreferrer">ondra42.cz/dobrovsky</a></strong>.</p>

<h2 class="relative group">8:10 Jde to vůbec?
    <div id="810-jde-to-vůbec" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#810-jde-to-v%c5%afbec" aria-label="Kotva">#</a>
    </span>
    
</h2>
<p>První otázka byla, jestli e-shop u knih uvádí rozměry. Uvádí, u každé knihy
v milimetrech. Pořadí rozměrů ale není jednotné, jednou je první šířka,
jindy výška, takže je aplikace musí sama seřadit.</p>
<p>Krabice měří podle Dobrovského zhruba 28 × 21 × 15 cm. Do akce patří jen
české knihy z jejich vlastních nakladatelství: Gate, 1400, Red, Talk,
Kontrast, Kontrast Vintage, King Cool, Drobek, Vendeta, Via, Pangea
a Fobos.</p>

<h2 class="relative group">8:16 Stahování a první demo
    <div id="816-stahování-a-první-demo" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#816-stahov%c3%a1n%c3%ad-a-prvn%c3%ad-demo" aria-label="Kotva">#</a>
    </span>
    
</h2>
<p>Na pozadí se začal stahovat katalog všech dvanácti značek. Tři z nich (Red,
Talk a Kontrast Vintage) na e-shopu nebyly k nalezení pod svým jménem,
takže je AI dohledávala podle čísel stránek. Mezitím vznikalo demo nad
padesáti knihami.</p>
<p>První verze byla velká: záložky Krabice, Katalog, Preference a Návod,
tlačítko „Navrhni nejvýhodnější krabici“ a návod ke skládání s 3D náhledem
a vrstvami. Z padesáti knih navrhla krabici s jedenácti knihami za 3 917 Kč.</p>
<figure><img
      class="my-0 rounded-md"
      loading="lazy"
      decoding="async"
      alt="První verze aplikace: záložky Krabice, Katalog, Preference a Návod, nahoře nula knih a nula korun, pod tím červené tlačítko Navrhni nejvýhodnější krabici"
      width="520"
      height="667"
      src="https://ondra42.cz/2026/10/10/krabice-knih-za-2000/01-prvni-verze.jpg"
     
     
      data-zoom-src="https://ondra42.cz/2026/10/10/krabice-knih-za-2000/01-prvni-verze.jpg"></figure>

<h2 class="relative group">9:34 Na telefon a co nejjednodušeji
    <div id="934-na-telefon-a-co-nejjednodušeji" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#934-na-telefon-a-co-nejjednodu%c5%a1eji" aria-label="Kotva">#</a>
    </span>
    
</h2>
<p>Hned jsem viděl, že tohle v obchodě nikdo ovládat nebude. Aplikaci budou
lidi používat na telefonu u regálu. Chtěl jsem jen hledání, tlačítko „Do
krabice“ a odpočet, kolik knih se tam ještě vejde. Klidně nepřesný, hlavně
aby tam nějaké číslo bylo.</p>
<p>O dvě minuty později byla hotová jednoduchá verze s velkým číslem nahoře:
„≈ 8 knih se ještě vejde (odhad)“. Odhad počítal s průměrnou knihou
z nabídky, která měří 14 × 20,7 × 2,9 cm.</p>
<figure><img
      class="my-0 rounded-md"
      loading="lazy"
      decoding="async"
      alt="Jednoduchá verze: velké číslo ≈ 8 knih se ještě vejde, pod ním hledání a výsledky s tlačítky Do krabice a Chci určitě"
      width="390"
      height="844"
      src="https://ondra42.cz/2026/10/10/krabice-knih-za-2000/02-odpocet.jpg"
     
     
      data-zoom-src="https://ondra42.cz/2026/10/10/krabice-knih-za-2000/02-odpocet.jpg"></figure>
<p>V 9:44 běžela stránka na ondra42.cz/dobrovsky. Katalog měl tou dobou
všech 2 375 knih.</p>

<h2 class="relative group">9:48 Dvě čísla místo odhadu
    <div id="948-dvě-čísla-místo-odhadu" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#948-dv%c4%9b-%c4%8d%c3%adsla-m%c3%adsto-odhadu" aria-label="Kotva">#</a>
    </span>
    
</h2>
<p>Odhad podle průměrné knihy mi nestačil. Chtěl jsem dvě skutečná čísla:
kolik knih se do krabice vejde nejvíc a kolik jich je nejméně potřeba, aby
dohromady stály 2000 Kč.</p>
<ul>
<li><strong>Nejvíc 37 knih.</strong> Leporela, kapesní horoskopy a tenké paperbacky.</li>
<li><strong>Nejméně 3 knihy.</strong> Dvě nejdražší (749 + 749 Kč) na 2000 Kč nestačí,
tři ano.</li>
</ul>
<p>Po každé přidané knize aplikace krabici znovu poskládá a obě čísla
přepočítá. Jakmile je v krabici aspoň jedna kniha, nabídne návod, jak ji
složit.</p>
<figure><img
      class="my-0 rounded-md"
      loading="lazy"
      decoding="async"
      alt="Dvě čísla nahoře: &#43;18 knih se ještě vejde nejvíc a zelená fajfka 2000 Kč máš, každá další kniha je zdarma"
      width="520"
      height="667"
      src="https://ondra42.cz/2026/10/10/krabice-knih-za-2000/03-dve-cisla.jpg"
     
     
      data-zoom-src="https://ondra42.cz/2026/10/10/krabice-knih-za-2000/03-dve-cisla.jpg"></figure>

<h2 class="relative group">Dopoledne: úpravy za pochodu
    <div id="dopoledne-úpravy-za-pochodu" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#dopoledne-%c3%bapravy-za-pochodu" aria-label="Kotva">#</a>
    </span>
    
</h2>
<p>Pak už to šlo rychle, jedna věta, jedna úprava:</p>
<ul>
<li><strong>Preference</strong> schované pod malým tlačítkem ☰, aby nezabíraly místo:
žánry, nakladatelství, jen pevná vazba, „už mám“.</li>
<li>U knihy štítek <strong>„už se nevejde“</strong>, a takovou knihu ani nejde přidat.</li>
<li>Nové číslo <strong>cena/objem</strong>: kolik korun dostanete za místo v krabici.
Podle něj jde řadit. Nahoře jsou kapesní horoskopy.</li>
<li>Odkaz na obsah krabice nahoru, ať se kvůli vyndání knihy nemusí
rolovat na konec.</li>
<li>Pryč s duplicitami („Zloděj chleba“ a „Zlodějka chleba“) a s knihami,
které ještě nevyšly. Zbylo 2 254 knih.</li>
</ul>
<p>Aplikaci průběžně zkoušela žena. Všimla si, že oblíbený žánr spolu
s oblíbeným nakladatelstvím nefungují jako „nebo“, ale jako „a zároveň“.
Měla pravdu napůl: dva žánry fungovaly správně, žánr s nakladatelstvím
ne. Opraveno.</p>
<p>Mezitím jsem si nechal spočítat nejvýhodnější krabici z knih, které má
e-shop skladem. Jen z vázaných knih vyšlo 16 knih za 4 454 Kč. Ze všech
vazeb 32 knih za 6 529 Kč, protože hodnotu táhnou malé drahé knihy.</p>

<h2 class="relative group">10:49 Tři vzhledy
    <div id="1049-tři-vzhledy" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#1049-t%c5%99i-vzhledy" aria-label="Kotva">#</a>
    </span>
    
</h2>
<p>Ve druhé session vznikly tři barevné varianty nad živou aplikací:
Knihkupectví, Krabice a Kalkulačka. Vybral jsem A, Knihkupectví: krémový
papír, patkové písmo, lahvově zelená a mosaz.</p>
<figure><img
      class="my-0 rounded-md"
      loading="lazy"
      decoding="async"
      alt="Čtyři telefony vedle sebe: dosavadní vzhled a varianty A Knihkupectví, B Krabice a C Kalkulačka"
      width="1200"
      height="1025"
      src="https://ondra42.cz/2026/10/10/krabice-knih-za-2000/04-varianty.jpg"
     
     
      data-zoom-src="https://ondra42.cz/2026/10/10/krabice-knih-za-2000/04-varianty.jpg"></figure>
<p>Nasazená verze ale vypadala úplně jinak než návrh, protože můj prohlížeč
má tmavý režim a k motivu se automaticky dopsala tmavá verze. Výchozí je
teď vždy světlý vzhled, tmavý se dá zapnout v menu.</p>
<figure><img
      class="my-0 rounded-md"
      loading="lazy"
      decoding="async"
      alt="Aplikace ve vzhledu Knihkupectví: krémový podklad, mosazná čísla, zelené tlačítko Jak krabici poskládat"
      width="520"
      height="667"
      src="https://ondra42.cz/2026/10/10/krabice-knih-za-2000/05-knihkupectvi.jpg"
     
     
      data-zoom-src="https://ondra42.cz/2026/10/10/krabice-knih-za-2000/05-knihkupectvi.jpg"></figure>

<h2 class="relative group">Poledne: Metropole Zličín
    <div id="poledne-metropole-zličín" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#poledne-metropole-zli%c4%8d%c3%adn" aria-label="Kotva">#</a>
    </span>
    
</h2>
<p>Mezi Andělem a Zličínem vyšla lépe NC Metropole Zličín. Dobrovský o ní
na webu píše, že má nejvíc titulů na metr čtvereční.
Zajel jsem tam, vzal krabici a pár knih a zkoušel, jestli aplikace
odpovídá skutečnosti.</p>
<p>Neodpovídala. Aplikace tvrdila, že se těchhle sedm knih nevejde. Vešly se
a ještě zbylo místo.</p>
<figure><img
      class="my-0 rounded-md"
      loading="lazy"
      decoding="async"
      alt="Krabice od Dobrovského se sedmi knihami: šest stojí na hřbetu vedle sebe, oranžový Poslední svatební host leží napříč vepředu"
      width="1200"
      height="1328"
      src="https://ondra42.cz/2026/10/10/krabice-knih-za-2000/cover.jpg"
     
     
      data-zoom-src="https://ondra42.cz/2026/10/10/krabice-knih-za-2000/cover.jpg"></figure>
<p>Problém nebyl ve výpočtu, ale v krabici. Nocticadia je podle e-shopu
široká 15,5 cm. Postavená na hranu je tedy vyšší než 15 cm, se kterými
aplikace počítala. Rozměry krabice jde teď zadat v menu. S krabicí vyšší
o sedm milimetrů složí aplikace těch sedm knih stejně jako na fotce: šest
na hraně vedle sebe, jednu napříč.</p>
<figure><img
      class="my-0 rounded-md"
      loading="lazy"
      decoding="async"
      alt="Návod ke skládání v aplikaci pro stejných sedm knih: 3D náhled krabice, pohled shora s očíslovanými knihami a první kroky"
      width="520"
      height="1000"
      src="https://ondra42.cz/2026/10/10/krabice-knih-za-2000/07-navod-sedm.jpg"
     
     
      data-zoom-src="https://ondra42.cz/2026/10/10/krabice-knih-za-2000/07-navod-sedm.jpg"></figure>
<p>Do krabice se pak vešla i osmá kniha. Vypadalo to, že je krabice větší, než
Dobrovský uvádí. Tak jsem do prázdné krabice položil knihu se známým
rozměrem jako měřítko a vyfotil ji. Krabice měří opravdu zhruba
28 × 21 × 15 cm. Karton má jen trochu vůle a rozměry z e-shopu nejsou na
milimetr.</p>
<figure><img
      class="my-0 rounded-md"
      loading="lazy"
      decoding="async"
      alt="Prázdná krabice shora, na dně leží kniha 1991 od Francka Thillieze jako měřítko"
      width="1200"
      height="1546"
      src="https://ondra42.cz/2026/10/10/krabice-knih-za-2000/09-prazdna-krabice.jpg"
     
     
      data-zoom-src="https://ondra42.cz/2026/10/10/krabice-knih-za-2000/09-prazdna-krabice.jpg"></figure>
<p>V prodejně jsem občas požádal někoho z lidí u regálů, ať aplikaci zkusí.
Na telefonu u regálu bylo hned vidět, že velká čísla nahoře překážejí při
hledání. Teď při rolování odjedou a nahoře zůstane jen hledání s tenkým
řádkem shrnutí.</p>

<h2 class="relative group">12:17 QR kód
    <div id="1217-qr-kód" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#1217-qr-k%c3%b3d" aria-label="Kotva">#</a>
    </span>
    
</h2>
<p>Abych mohl stránku předávat dál, přibyl dole QR kód s tlačítkem „Sdílet
odkaz“. První verze se na telefonu četla jako číslo místo adresy. Kód byl
v pořádku, ale telefon kreslil mezi čtverečky tenké spáry. Teď je to obrázek
s přesnými pixely a funguje.</p>
<figure><img
      class="my-0 rounded-md"
      loading="lazy"
      decoding="async"
      alt="Blok Pošli dál: QR kód s adresou ondra42.cz/dobrovsky a tlačítko Sdílet odkaz"
      width="716"
      height="390"
      src="https://ondra42.cz/2026/10/10/krabice-knih-za-2000/10-qr.jpg"
     
     
      data-zoom-src="https://ondra42.cz/2026/10/10/krabice-knih-za-2000/10-qr.jpg"></figure>

<h2 class="relative group">13:20 Knihy bez rozměru
    <div id="1320-knihy-bez-rozměru" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#1320-knihy-bez-rozm%c4%9bru" aria-label="Kotva">#</a>
    </span>
    
</h2>
<p>58 knih nemá v e-shopu použitelný rozměr, takže je aplikace vyřadila.
Mezi nimi byl i nejdražší kus z akce, <strong>box Edgara Allana Poea</strong> za
1 499 Kč. Vyfotil jsem ho v prodejně vedle knihy se známým rozměrem a podle
fotky sedí rozměr z e-shopu: 14,3 × 14,3 × 21,8 cm. Aplikace ho dřív
zahodila, protože tloušťku přes 9 cm brala jako chybu dat. Teď je zpátky
a nejmenší počet knih na 2000 Kč klesl ze tří na dvě.</p>
<figure><img
      class="my-0 rounded-md"
      loading="lazy"
      decoding="async"
      alt="Box Edgara Allana Poea se čtyřmi svazky v regálu, před ním kniha 1991 jako měřítko"
      width="1200"
      height="1600"
      src="https://ondra42.cz/2026/10/10/krabice-knih-za-2000/08-poe-box.jpg"
     
     
      data-zoom-src="https://ondra42.cz/2026/10/10/krabice-knih-za-2000/08-poe-box.jpg"></figure>

<h2 class="relative group">14:30 Z dema je produkce
    <div id="1430-z-dema-je-produkce" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#1430-z-dema-je-produkce" aria-label="Kotva">#</a>
    </span>
    
</h2>
<p>Žena mezitím odkaz sdílela
<a href="https://www.facebook.com/jitka.prochazkova/posts/pfbid032kkzVyTAdQVgbzfBWxoW3jjDrurmM9zr4LuLEsR1L89jF5qBBbK8iYjpbD4ZgPFel"  target="_blank" rel="noreferrer">na Facebooku</a>.
Z dema se tím stala produkce a adresa musí vydržet.</p>
<p>Aplikace do té doby ležela mimo repozitář webu a další nasazení webu by
ji smazalo. Teď je součástí webu a každé nasazení ji nahraje znovu. Po
konci akce v neděli ve 21:00 se nahoře objeví pruh „Akce skončila“
a stránka zůstane pro inspiraci.</p>
<figure><img
      class="my-0 rounded-md"
      loading="lazy"
      decoding="async"
      alt="Pruh nahoře: Akce krabice za 2000 Kč skončila v neděli 11. 10. 2026 ve 21:00, pod ním čísla 37 knih se vejde nejvíc a 2 knihy stačí na 2000 Kč"
      width="390"
      height="220"
      src="https://ondra42.cz/2026/10/10/krabice-knih-za-2000/11-akce-skoncila.jpg"
     
     
      data-zoom-src="https://ondra42.cz/2026/10/10/krabice-knih-za-2000/11-akce-skoncila.jpg"></figure>

<h2 class="relative group">Co zůstává otevřené
    <div id="co-zůstává-otevřené" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#co-z%c5%afst%c3%a1v%c3%a1-otev%c5%99en%c3%a9" aria-label="Kotva">#</a>
    </span>
    
</h2>
<ul>
<li>Tlačítko „Chci určitě“ dnes skoro nic navíc nedělá. Buď zmizí, nebo
dostane funkci „doplň krabici za mě“.</li>
<li>Dostupnost knih v konkrétní prodejně aplikace nezná. Co je skladem, se
pořád zjišťuje u regálu.</li>
</ul>
<p>Od nápadu po stránku, kterou lidi sdílí, uběhlo asi šest a půl hodiny.
Kód jsem nepsal ani řádek. Já jsem rozhodoval, co aplikace má umět, a
v knihkupectví ověřoval, jestli to, co tvrdí, platí pro skutečnou krabici.</p>
]]></content:encoded></item><item><title>Rodokmen jako noční obloha: matkarodu.cz</title><link>https://ondra42.cz/2026/10/01/matkarodu-cz/</link><pubDate>Thu, 01 Oct 2026 17:00:00 +0200</pubDate><guid>https://ondra42.cz/2026/10/01/matkarodu-cz/</guid><description>Od nápadu po vlastní doménu za jeden večer a noc: rodokmen, který si rodina vyplní sama, hvězdy místo tabulek, GDPR, doména za 160 Kč a jedenáct pull requestů.</description><content:encoded><![CDATA[<p>Se ženou jsme se bavili o rodokmenu a při představě mých znalostí jsem
si říkal, že bych rád věděl, jaký příbuzenský vztah je mezi těmi, co jim
říkám strýčku a teto. Již dříve jsem koukal po řešeních, ale vše mi
přišlo složité, nudné a škaredé.</p>
<p>Chtěl jsem, aby mi širší rodina pomohla vyplnit rodokmen. Formulář nikdo
vyplňovat nebude, takže to musí být hra. Ve středu 30. 9. po práci jsem
napsal zadání a ve čtvrtek ve tři ráno běží
<a href="https://matkarodu.cz/"  target="_blank" rel="noreferrer">matkarodu.cz</a> na vlastní doméně, s jedenácti
zmergovanými pull requesty za sebou. Psal jsem já s Claude Code, oponenturu
dělal Fable.</p>
<figure><img
      class="my-0 rounded-md"
      loading="lazy"
      decoding="async"
      alt="Noční obloha rodokmenu: vybraná osoba uprostřed s prstencem, kolem ní příbuzní spojení modrými, zlatými a růžovými čarami. Ukázka s vymyšlenými jmény."
      width="1600"
      height="898"
      src="https://ondra42.cz/2026/10/01/matkarodu-cz/cover.jpg"
     
     
      data-zoom-src="https://ondra42.cz/2026/10/01/matkarodu-cz/cover.jpg"></figure>

<h2 class="relative group">Středa odpoledne: zadání
    <div id="středa-odpoledne-zadání" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#st%c5%99eda-odpoledne-zad%c3%a1n%c3%ad" aria-label="Kotva">#</a>
    </span>
    
</h2>
<p>Představa byla jednoduchá. Přihlásím se jménem, bez hesla. Když je jméno
v rodokmenu víckrát, web se zeptá na rok narození, a když nesedí, dál
nepustí. Žádný výběr z možností. Pak uvidím své příbuzné jako hvězdy na
obloze: kdo je vybraný, je uprostřed, ostatní se kolem něj rozestaví. Po
kliknutí na souseda se celá obloha plynule přesune na nový střed, žádné
skoky.</p>
<p>Než se začalo psát, AI se doptala na podrobnosti. Pohyb „jako na gumě“ jen
při přesunu, jinak nic zbytečně nehýbe. Žádný GEDCOM, export někdy
později. Adresa zatím tajná a odkaz rozešlu přes WhatsApp. Na Cloudflare
smí odejít jméno, vztah a rok narození, celé datum ne.</p>
<p>Krátce po „zadání hotovo“ byla první verze. Hned za ní
oponentura v samostatném agentovi. Našla dvě vážné věci: kontrola roku
narození platila jen v prohlížeči, takže server šlo ptát pořád dokola, až
by rok prozradil, a statické soubory šly stáhnout i bez přístupového kódu.
Opraveno dřív, než jsem to vůbec viděl.</p>

<h2 class="relative group">Odpoledne: ladění očima
    <div id="odpoledne-ladění-očima" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#odpoledne-lad%c4%9bn%c3%ad-o%c4%8dima" aria-label="Kotva">#</a>
    </span>
    
</h2>
<p>Pak přišlo to, co za mě nikdo neudělá: dívat se a říkat, co je špatně.</p>
<ul>
<li><strong>Pohyb.</strong> „Mění se to hodně rychle, zpomal.“ „Ještě zpomal.“ Napotřetí
sedí. Rozložení se teď spočítá předem a hvězdy na místo jen doplují.</li>
<li><strong>Vztahy.</strong> Na první pohled nebylo poznat, kdo je rodič, dítě nebo
sourozenec. Popisky jsem nechtěl, rozšíření a zúžení čáry stačí. Pak
sourozenci: první návrh byl čárkovaně. Jenže sourozenci by se urazili,
vypadá to, jako by jejich vztah byl méněcenný. Skončilo to takhle:
rodiče a děti modrou čarou, která se zužuje, sourozenci zlatou
a partneři růžovou, obojí stejně výrazné jako modrá.</li>
<li><strong>Úpravy.</strong> Vztah šel vytvořit dvěma cestami, přidáním nového člověka
a spojením dvou existujících. Jedna z nich neuměla vybrat typ vztahu. Teď
je cesta jedna.</li>
<li><strong>Drobnosti.</strong> Při přidávání se hledá jen v okolí osoby, ne v celé
databázi. Návrh jde vybrat šipkou a Enterem. Přibyl světlý režim. Můj
první nápad byla sněhová pokrývka s vločkami, nakonec je to obyčejný
světlý vzhled a přepínač je běžná ikona. Vrátila se možnost označit
někoho „už nežije“ bez data úmrtí, protože to tak u předků často je.
Otázka „není to tatáž osoba?“ se ptá jen tam, kde opravdu může jít
o duplicitu, ne u syna, který se jmenuje stejně jako otec.</li>
</ul>
<figure><img
      class="my-0 rounded-md"
      loading="lazy"
      decoding="async"
      alt="Po kliknutí na jinou hvězdu se obloha přesune na nový střed. Modrá čára vede k rodičům a dětem, zlatá k sourozencům, růžová k partnerovi."
      width="1600"
      height="898"
      src="https://ondra42.cz/2026/10/01/matkarodu-cz/stred-misa.jpg"
     
     
      data-zoom-src="https://ondra42.cz/2026/10/01/matkarodu-cz/stred-misa.jpg"></figure>
<p>Pak šla první verze ven na dočasnou adresu Cloudflare Workers.
Nasazovací skript se ladil za běhu. Potom jsem dal merge, aby byla
první funkční verze v <code>main</code>. Všechno další už šlo přes samostatné větve
a PR.</p>

<h2 class="relative group">Večer: GDPR
    <div id="večer-gdpr" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#ve%c4%8der-gdpr" aria-label="Kotva">#</a>
    </span>
    
</h2>
<p>Rodokmen jsou osobní údaje živých lidí. Otázka tedy byla, co musím
omezit, aby se z rodinného koníčka nestala služba s povinnostmi.</p>
<p>Odpověď, kterou si nechám ověřit, kdyby to někdy šlo dál: rodokmen, který
si vedu pro sebe a rodinu v uzavřeném okruhu, spadá pod výjimku pro
osobní a rodinné účely (čl. 2 odst. 2 písm. c GDPR). Výjimka padá ve
chvíli, kdy data vidí neomezený okruh lidí. Kdybych web nabízel cizím
lidem pro jejich rodokmeny, byl bych provozovatel a GDPR by se mě týkalo.
Na zemřelé se GDPR nevztahuje. Kdo klikne na „pozvat“, nerozhoduje,
rozhoduje to, jestli okruh zůstane rodinný.</p>
<p>Z toho vyšla pravidla:</p>
<ul>
<li><strong>Veřejná je jen vstupní stránka</strong> s názvem, všechno ostatní je
<code>noindex</code> a za pozvánkou.</li>
<li><strong>Pozvat jde příbuzného nejvýš tři kroky od sebe.</strong> Dva kroky mi
přišly moc omezující a tři kroky jsou pořád rodina. Zákon žádný počet
kroků neurčuje.</li>
<li><strong>Viditelnost podle vzdálenosti.</strong> Jméno žijícího člověka uvidíš do
šesti kroků, rok narození do pěti, dál jen „žijící osoba“ se vztahy.
Zemřelí jsou vidět vždycky.</li>
<li><strong>Ochrana, kterou si nastaví každý sám.</strong> Jmenuje se Mustang podle
karty z karetní hry BANG!. Kdo má před sebou vyloženého Mustanga, toho
ostatní hráči vidí o jedno místo dál, takže hůř dostřelí. Tady je to
stupeň 0 až 5, který se přičítá ke vzdálenosti, takže se jméno ukáže
jen bližším příbuzným. U dítěte ochranu nastavuje rodič.</li>
<li><strong>Výmaz je právo</strong> a beru ho jako fakt. Smaže se jméno a údaje, vztahy
zůstanou, protože okolí ten vztah má, i když dotyčný být znám nechce.</li>
</ul>

<h2 class="relative group">Večer: doména
    <div id="večer-doména" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#ve%c4%8der-dom%c3%a9na" aria-label="Kotva">#</a>
    </span>
    
</h2>
<p>Rodokmen chtěl vlastní adresu. AI měla každý návrh rovnou ověřit ve
WHOIS, ať nepálíme čas nad obsazenými doménami. Zkratky jako <code>rdk.cz</code>
jsem zavrhl, protože jsou divné, a varianty s „předky“ mi neseděly. Pak
mě napadla „matka rodu“. Vyšla volná, nikdo ji nepoužívá a nezní
urážlivě. Pomlčka se v doménách nedoporučuje, protože se špatně
diktuje, takže <code>matkarodu.cz</code>.</p>
<p>Zbytek večera byl provoz:</p>
<ul>
<li><strong>Registrátor.</strong> Moje dosavadní řešení bylo zbytečně drahé.
Vedos stojí 160 Kč ročně, stejně za registraci i prodloužení, a má API.
Forpsi měl akci za 99 Kč, která ten den končila, prodloužení je
potom dražší. Web i DNS zůstávají na Cloudflare Free.</li>
<li><strong>Kontakt a NSSET.</strong> Chvíli jsem řešil, jestli přes kontakt ve WHOIS
nejde dohledat, které domény patří jednomu člověku. Nakonec jsem to
zjednodušil na jeden kontakt a jeden NSSET pro všechno.</li>
<li><strong>Zóna v Cloudflare</strong> přes Terraform s importem, protože jsem ji
v dashboardu založil dřív. AI plán připravila, <code>apply</code> jsem pouštěl já.</li>
<li><strong>DNSSEC</strong> s klíči od Cloudflare, ne s KEYSETem od starého registrátora.</li>
<li><strong>Přepnutí.</strong> Před zveřejněním ještě jedna kontrola zabezpečení. Hlavní
adresa je doména bez <code>www</code>, <code>www</code> přesměrovává a HSTS je zapnuté.
Kontrola po nasazení hlásila chybu, ale nebyla to chyba webu. DNS na
serveru se na doménu zeptalo před nasazením a odpověď „nic tu není“ si
půl hodiny pamatovalo. Pozvánky jsem rozeslal znovu na novou adresu
a dočasnou adresu na workers.dev jsme vypnuli.</li>
</ul>
<p>Večer jsem napsal „nasazeno“.</p>

<h2 class="relative group">Kolem půlnoci: rodina testuje
    <div id="kolem-půlnoci-rodina-testuje" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#kolem-p%c5%aflnoci-rodina-testuje" aria-label="Kotva">#</a>
    </span>
    
</h2>
<p>Netrvalo dlouho a přišla zpětná vazba od první skutečné
uživatelky, mé ženy. Chtěla propojit dvě zemřelé příbuzné, které
spojuje jen jeden člověk mezi nimi, a nešlo to. Původní pravidlo
počítalo vzdálenost od toho, kdo vazbu přidává. Nové počítá vzdálenost
mezi oběma spojovanými: nejvýš dva kroky, mezi dvěma zemřelými až deset.
Aby AI mohla pravidla posuzovat nad skutečnými daty, dostala ke
Cloudflare D1 přístup jen pro čtení.</p>
<p>Do půlnoci vznikly ještě dvě věci:</p>
<ul>
<li><strong>Správa</strong> pro mě. Pod mou osobou je odkaz na přehled změn a statistiky,
abych viděl, co se v rodokmenu děje.</li>
<li><strong>Ikona.</strong> Claude Design připravil pět návrhů. AI doporučovala srpek,
protože je nejčitelnější v 16 pixelech. Vybral jsem „Souhvězdí rodu“:
matka rodu jako zlatá hvězda a rodina, která se pod ní větví.</li>
</ul>
<figure><img
      class="my-0 rounded-md"
      loading="lazy"
      decoding="async"
      alt="Ikona Souhvězdí rodu: zlatá čtyřcípá hvězda nahoře, pod ní se větví modré čáry ke dvěma a pak ke třem menším hvězdám, na tmavomodrém podkladu."
      width="512"
      height="512"
      src="https://ondra42.cz/2026/10/01/matkarodu-cz/ikona.png"
     
     
      data-zoom-src="https://ondra42.cz/2026/10/01/matkarodu-cz/ikona.png"></figure>

<h2 class="relative group">Čtvrtek mezi jednou a třetí ráno: velká obrazovka
    <div id="čtvrtek-mezi-jednou-a-třetí-ráno-velká-obrazovka" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%c4%8dtvrtek-mezi-jednou-a-t%c5%99et%c3%ad-r%c3%a1no-velk%c3%a1-obrazovka" aria-label="Kotva">#</a>
    </span>
    
</h2>
<p>Rodokmen budou číst hlavně lidé v mém věku a starší a ti sedí spíš
u počítače nebo tabletu než u telefonu. Na velké obrazovce je tedy místo
na víc detailu. Ukázku jsem viděl ještě před nasazením nad aktuální
databází:</p>
<ul>
<li><strong>Prstenec kolem jména uprostřed.</strong> Při přesunu jede po čarách přes
příbuzné ze starého středu na nový. Tohle byl můj nápad a AI ho
dotáhla.</li>
<li>Větší písmo, celé roky místo <code>’29</code>, víc lidí naráz, oběžné dráhy
a v tmavém režimu Mléčná dráha. Všechno statické, nic se zbytečně
nehýbe.</li>
<li>Panel osoby vpravo, legenda dole.</li>
</ul>

<h2 class="relative group">Ukázka pro každého
    <div id="ukázka-pro-každého" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#uk%c3%a1zka-pro-ka%c5%bed%c3%a9ho" aria-label="Kotva">#</a>
    </span>
    
</h2>
<p>Kdo přišel na matkarodu.cz bez pozvánky, viděl jen název. Teď vidí živou
ukázku. Je to kopie skutečného rodokmenu, ve které má každé jméno
a příjmení náhradu a roky jsou posunuté o pár let. Vazby zůstaly
skutečné, takže ukázka vypadá jako opravdová rodina. Generátor spadne,
kdyby ve výsledku zůstalo jakékoli skutečné jméno. V ukázce jde
přidávat i mazat, ale změny zůstanou jen v prohlížeči a na server nic
nejde. Obrázky v tomhle článku jsou z ní.</p>

<h2 class="relative group">Co dál
    <div id="co-dál" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#co-d%c3%a1l" aria-label="Kotva">#</a>
    </span>
    
</h2>
<p>Web už je veřejný na vlastní doméně, takže končí fáze „rychle změnit
a zkusit“. Poslední otázka byla, jak dělat code review, když
aplikaci píšu jen já s AI. Za druhého člověka může sloužit Fable nebo
jinak nastavený model. Plán je, aby oponenturu spouštěl cron na serveru
v samostatné session, ne autor PR. Zatím je to jen plán.</p>
<p>Počet kroků, Mustang i pravidla pro vazby jsem určoval já a rodina, ne AI. Za jeden večer
a noc se změnily několikrát a změní se znovu, až rodokmen začnou vyplňovat
další příbuzní.</p>
]]></content:encoded></item><item><title>Pondělí s AI: poradce, který mě zná</title><link>https://ondra42.cz/2026/09/28/pondeli-s-ai/</link><pubDate>Mon, 28 Sep 2026 19:35:00 +0200</pubDate><guid>https://ondra42.cz/2026/09/28/pondeli-s-ai/</guid><description>Od sobotního výpisu: web bez hesla, jedna paměť pro všechny poradce, knihovna her napříč obchody a hlídač, který si všimne, že něco mlčí.</description><content:encoded><![CDATA[<p>Navazuju na <a href="https://ondra42.cz/2026/09/26/sobota-s-ai/" >sobotní výpis</a>. Od té doby
28 zmergovaných pull requestů, skoro všechny dnes.</p>
<figure><img
      class="my-0 rounded-md"
      loading="lazy"
      decoding="async"
      alt="Dřív pět poradců, každý s vlastní pamětí. Teď vrstvy server, pravidla, uživatel a repozitář nad hlavním asistentem, pět poradců jako skill a subagent a jedna společná paměť."
      width="1600"
      height="1030"
      src="https://ondra42.cz/2026/09/28/pondeli-s-ai/cover.jpg"
     
     
      data-zoom-src="https://ondra42.cz/2026/09/28/pondeli-s-ai/cover.jpg"></figure>

<h2 class="relative group">Sobota v noci: web bez hesla
    <div id="sobota-v-noci-web-bez-hesla" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#sobota-v-noci-web-bez-hesla" aria-label="Kotva">#</a>
    </span>
    
</h2>
<p>Po sobotním zápisu padlo heslo z ondra42.cz, takže web je veřejný. Hned
za tím přišel technický audit, opravený v jednom PR: feed a sitemapa
se už necachují jako neměnné, obrázky jdou jako WebP v rozumných šířkách,
RSS nese celý text, přibyl <code>security.txt</code> a lepší kontrast a čtečky
obrazovky už nečtou titulek dvakrát.</p>
<p>Tu samou noc se sto pamětí hlavního asistenta přepsalo do skillů. Postup,
který se opravoval v pěti pamětech naráz, je teď jeden skill a načte se
ve chvíli, kdy je potřeba: návod pro mě, nasazení po merge, pošta k datu
a zápis na tenhle web.</p>

<h2 class="relative group">Pondělí: co vlastně chci
    <div id="pondělí-co-vlastně-chci" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#pond%c4%9bl%c3%ad-co-vlastn%c4%9b-chci" aria-label="Kotva">#</a>
    </span>
    
</h2>
<p>Dnešek začal nepříjemnou otázkou. Poradce (finance, zdraví, úřady, práce,
rodina) jsem si postavil a pak je přestal používat. Automaty na sběr dat
běží a dodávají, protože mě nepotřebují. Všechno ostatní čeká, až
odpovím, a brzdou jsem já.</p>
<p>Ze tří cílů (hlídač povinností, poradce s mým kontextem, kontinuita pro
rodinu) jsem jako ultimátní vybral poradce. AI doporučovala hlídače. Ty
další dva cíle platí dál, jen nejsou na prvním místě.</p>
<p>Proč poradci neběželi: každý měl vlastní paměť, takže se každý choval
trochu jinak a já pořád opakoval totéž. Finanční poradce nevěděl, jak
pracovat s gitem, zdravotní se pouštěl do stavění věcí, které patří hlavní
session. Myšlenka „každý má svůj čistý kontext“ byla zároveň ta vada.</p>
<p>Oprava šla ve třech PR:</p>
<ul>
<li><strong>Vrstvy kontextu.</strong> Pravidla, která platí všude, jsou teď v systémovém
<code>CLAUDE.md</code> pro celý server a v <code>rules/</code>. Načte je každá session
i subagent a žádné nastavení je nevypne.</li>
<li><strong>Poradce jako skill a subagent.</strong> Řemeslo každé domény je skill (tvar
odpovědi, kde jsou data, na čem se už chybovalo). Hlavní asistent ho
načte sám podle dotazu, nebo mu dotaz předá jako subagentovi. Místo
dlouhých sessions krátký dotaz s jasným koncem.</li>
<li><strong>Jedna paměť pro všechny.</strong> Persona se pozná štítkem, ne vlastní
složkou.</li>
</ul>
<p>Studie z loňského roku mimochodem ukazuje, že persona v promptu přesnost
nezlepšuje. Rozdíl dělá řemeslo v textu a čistý kontext.</p>

<h2 class="relative group">Knihovna her napříč obchody
    <div id="knihovna-her-napříč-obchody" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#knihovna-her-nap%c5%99%c3%ad%c4%8d-obchody" aria-label="Kotva">#</a>
    </span>
    
</h2>
<p>Katalog her uměl jen Steam a hry z EA a Ubisoftu se k němu připojovaly
podle názvu. Teď je to jedna knihovna, každý obchod má svou tabulku
a nad nimi je jedna tabulka her. Z 313 záznamů je 296 her a pár si jich
žije ve dvou obchodech naráz (Battlefield 6, Far Cry Primal, This War of
Mine). Ubisoft vede čtrnáct her dvakrát, „FOR HONOR“ a „FOR HONOR PC“,
tak se spojují. A názvy z EA a Ubisoftu už nekřičí verzálkami.</p>
<p>Katalog na webu se staví nad touhle knihovnou a každé pondělí ráno si
sám otevře PR s aktualizací. První dorazil dnes. Nástroje se u toho
přejmenovaly podle nového pravidla, že název říká, čeho se týká a co
udělá: <code>game-catalog-build</code>, ne <code>catalog-build</code>, a už vůbec ne
<code>catalog-weekly</code>.</p>

<h2 class="relative group">Hlídač, který si všimne ticha
    <div id="hlídač-který-si-všimne-ticha" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#hl%c3%adda%c4%8d-kter%c3%bd-si-v%c5%a1imne-ticha" aria-label="Kotva">#</a>
    </span>
    
</h2>
<p>Dnes se ukázalo, že jedna datová trubka stojí od srpna a jiná nikdy
neběžela. Nic to nehlásilo, protože trubka, která neběží, mlčí úplně
stejně jako ta, která je v pořádku.</p>
<p>Proto <code>aiop-doctor</code>. Každý naplánovaný nástroj na konci úspěšného běhu
zanechá otisk a v hlavičce nese, jak často má běžet. Doctor každý den
porovná otisky s plánem, zkontroluje fronty a to, že nasazená pravidla
odpovídají repozitáři. Když něco nesedí, založí jednu otázku, ne deset.</p>
<p>Na tomhle PR se poprvé naplno projevila oponentura: druhá session
přečetla plán a diff, ověřila tvrzení naostro a našla v první verzi
mimo jiné čísla účtů v kódu. Větev se přepsala. Chci to i příště, ale
ne u každého PR, takže AI má sama poznat, kdy to stojí za to.</p>

<h2 class="relative group">Drobnosti
    <div id="drobnosti" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#drobnosti" aria-label="Kotva">#</a>
    </span>
    
</h2>
<ul>
<li>Konzole AI je rovnou na kořeni domény, rozcestník zmizel.</li>
<li>Štítky a archiv roku vypadají jako deník a obrázky se neořezávají.</li>
<li>AWS profily se jmenují stejně na obou strojích a repozitáře
infrastruktury popisují nginx tak, jak skutečně běží.</li>
<li>Na web mezitím přibyl <a href="https://ondra42.cz/2026/09/28/t29-prezil-deset-zasahu/" >T29</a>,
<a href="https://ondra42.cz/2026/09/28/vsechno-do-vaultu/" >expediční vault</a> a
<a href="https://ondra42.cz/2026/09/28/prvni-samecek/" >první sameček</a> neteřina štíra.</li>
</ul>

<h2 class="relative group">Co z toho plyne
    <div id="co-z-toho-plyne" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#co-z-toho-plyne" aria-label="Kotva">#</a>
    </span>
    
</h2>
<p>V sobotu jsem psal, že nejvíc oprav nebylo v kódu, ale v pravidlech.
Dnes se ukázalo, kde ta pravidla mají žít: ne v paměti, kterou si každý
nese po svém, ale v jedné vrstvě, kterou dostane každý.</p>
]]></content:encoded></item><item><title>Sobota s AI: osmnáct sessions, osmnáct PR</title><link>https://ondra42.cz/2026/09/26/sobota-s-ai/</link><pubDate>Sat, 26 Sep 2026 22:10:00 +0200</pubDate><guid>https://ondra42.cz/2026/09/26/sobota-s-ai/</guid><description>Co všechno se dnes na serveru změnilo, když jsem celý den pracoval s Claude Code. Od studené trubky u kotle po nový vzhled tohohle webu.</description><content:encoded><![CDATA[<p>Dnes jsem s Claude Code strávil skoro celý den. Osmnáct sessions, osmnáct
zmergovaných pull requestů ve třech repozitářích.
Tohle je výpis toho, co se změnilo, v pořadí, v jakém to přicházelo.</p>

<h2 class="relative group">Ráno: kotel
    <div id="ráno-kotel" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#r%c3%a1no-kotel" aria-label="Kotva">#</a>
    </span>
    
</h2>
<p>Začalo to studenou trubkou. Kotel topí, čerpadlo běží, ale přívod do
radiátorů je studený už u kotle. Dvě fotky rozvodů, pár otázek, a k tomu
jedna nová věc: AI se od rána umí zeptat Home Assistanta, a ten vidí
na kotel. Takže místo „přečti mi displej&quot; jsem dostal stav kotle z dat.</p>
<p>Výsledek je diagnóza (do topné větve neproudí voda, podezřelý filtr na
zpátečce nebo trojcestný ventil) a koncept e-mailu servisu.</p>

<h2 class="relative group">Dopoledne: otázky a úklid
    <div id="dopoledne-otázky-a-úklid" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#dopoledne-ot%c3%a1zky-a-%c3%baklid" aria-label="Kotva">#</a>
    </span>
    
</h2>
<p>Fronta otázek, kterou si AI vede, mi připomněla dálniční známku. Ukázalo
se, že letos jsem ji nejspíš nezaplatil: potvrzení z předchozích let
v poště jsou, letošní chybí. Známku kupuju sám, AI peníze nehýbe. Umí ale
připravit odkaz tak, že zbývá jen zaplatit.</p>
<p>Vedle toho pár drobností: smazat omylem
uložený snímek Steamu a uklidit stará rozhodnutí, která už neplatí.</p>

<h2 class="relative group">Hlídač zdravotních dat
    <div id="hlídač-zdravotních-dat" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#hl%c3%adda%c4%8d-zdravotn%c3%adch-dat" aria-label="Kotva">#</a>
    </span>
    
</h2>
<p>Hodinky posílají data na server přes automatizaci v telefonu. Čtyřikrát
to vypadlo a pokaždé se to poznalo až tím, že jsem se zeptal. Od dneška
běží ráno <code>health-watch</code>: když data mlčí, založí otázku do fronty a ta se
mi ozve v chatu nebo na Discordu. Když data znovu přijdou, otázku sám
zruší.</p>

<h2 class="relative group">Bezpečnostní audit konzole
    <div id="bezpečnostní-audit-konzole" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#bezpe%c4%8dnostn%c3%ad-audit-konzole" aria-label="Kotva">#</a>
    </span>
    
</h2>
<p>Na tajném URL mám přehled o AI na serveru. Požádal jsem o
bezpečnostní kontrolu a vyšly tři věci:</p>
<ul>
<li><strong>Služba poslouchala na lokálním portu bez hesla.</strong> Heslo bylo jen
v nginx, takže každý lokální účet na serveru četl transkripty a paměť
napřímo. Teď běží přes unixový socket, ke kterému se dostane jen nginx.</li>
<li><strong>Prohlížeč souborů ukazoval i to, co git ignoruje.</strong> Přesně tam se
ukládají tajemství. Pod <code>~/git</code> teď vidí jen soubory, které git sleduje.</li>
<li><strong>Hádání hesla nikdo nebrzdil.</strong> Přibyl fail2ban: pět špatných hesel za
deset minut a hodina banu. Jail čte vlastní error log konzole, aby
omylem nezabanoval adresy Cloudflare, přes které jde tenhle web.</li>
</ul>

<h2 class="relative group">Pauza
    <div id="pauza" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#pauza" aria-label="Kotva">#</a>
    </span>
    
</h2>
<p>Poobědová cesta vlakem tři zastávky a zpět pěšky, cca 4 km příjemné
procházky se ženou a psem.</p>

<h2 class="relative group">Revize štítků v Gmailu
    <div id="revize-štítků-v-gmailu" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#revize-%c5%a1t%c3%adtk%c5%af-v-gmailu" aria-label="Kotva">#</a>
    </span>
    
</h2>
<p>Měsíc přijaté pošty proti pravidlům filtrů. Několik pravidel se rozšířilo,
jedno vzniklo nové. To je to, o kterém jsem psal <a href="https://ondra42.cz/2026/09/26/konkurence-do-sumu/" >dnes odpoledne</a>.</p>
<p>Při té práci padla otázka, jestli máme nějaký kalendář na věci, které se
mají udělat později. Neměli jsme. Do večera byl.</p>

<h2 class="relative group">Kalendář odložené práce
    <div id="kalendář-odložené-práce" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#kalend%c3%a1%c5%99-odlo%c5%been%c3%a9-pr%c3%a1ce" aria-label="Kotva">#</a>
    </span>
    
</h2>
<p>Práce, kterou AI dluží k určitému dni (za týden zkontroluj, jestli
štítky sedí), žila jen v próze poznámek a sama se neozvala. Teď je to
položka v kalendáři. Ráno v sedm ji AI připraví v bezobslužném běhu
a pošle mi na Discord jednu otázku. Zkušební položka proběhla dnes
v pět odpoledne, zpráva dorazila. Původně měl běh startovat v půl
čtvrté ráno, ale to by mě budil, tak se posunul na sedmou.</p>

<h2 class="relative group">Web dostal vzhled
    <div id="web-dostal-vzhled" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#web-dostal-vzhled" aria-label="Kotva">#</a>
    </span>
    
</h2>
<p>Tenhle web byl za heslem, protože byl škaredý. Návrh vznikl v Claude
Designu, vybral jsem variantu „Deník výpravy&quot; a AI ji převedla do Huga:
titulka jako deník po dnech, vlastní stránka zápisu, stránka hry jako
deník zúžený na jednu hru, nové barvy a písma Alegreya přímo ze serveru.</p>
<p>Pak přišlo kolo připomínek, každá jako samostatný PR: rámy obrázků podle
hry (první verze byla hodně dětská, druhá se kreslila v Claude Designu
a teprve pak nasadila), stránka <a href="https://ondra42.cz/now/" >Teď</a>, čas a hra a titulek na
jednom řádku, a řádek „podle tématu&quot; počítaný z posledních deseti zápisů.</p>
<p>K tomu dvě hlášky, obě o AI. A na závěr samostatný redakční worker jen
pro tenhle web, aby nemusel tahat celou paměť hlavního asistenta.</p>

<h2 class="relative group">Nástroje po kategoriích
    <div id="nástroje-po-kategoriích" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#n%c3%a1stroje-po-kategori%c3%adch" aria-label="Kotva">#</a>
    </span>
    
</h2>
<p>Stránka Nástroje v konzoli vypisovala jeden plochý seznam a nešlo z něj
poznat, co všechno setup má. Teď je šest sekcí podle toku dat: sběr,
zpracování, hledání a přehledy, otázky a hlídání, výstup ven, provoz.
Zařazení nese každý nástroj sám v hlavičce, takže dělení nezastará
s příštím nástrojem. Test hlídá, že žádný nástroj nezůstal bez kategorie.</p>

<h2 class="relative group">Hodiny pro model
    <div id="hodiny-pro-model" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#hodiny-pro-model" aria-label="Kotva">#</a>
    </span>
    
</h2>
<p>Tohle mě dnes bavilo nejvíc. Model nemá hodiny. Po denní pauze vidí
tentýž transkript jako po pěti minutách a klidně mi znovu řekne „zmerguj
tu větev&quot;, i když jsem ji zmergoval včera. V literatuře se tomu říká
<em>temporal blindness</em> a časová značka v promptu to sama o sobě moc
nespraví.</p>
<p>Změny jsou dvě. Hook, který ke každé mé zprávě přidá aktuální čas a dobu
od poslední odpovědi. A pravidlo ve smlouvě: když minulý obrat skončil
žádostí na mě, nejdřív si ověř příkazem, jestli se to nestalo, a teprve
pak žádost opakuj. Nezávisle na tom, kolik času uplynulo.</p>

<h2 class="relative group">Co z toho plyne
    <div id="co-z-toho-plyne" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#co-z-toho-plyne" aria-label="Kotva">#</a>
    </span>
    
</h2>
<p>Nejvíc oprav dnes nebylo v kódu, ale v pravidlech. „Návod je checklist
a jeden krok, ne odkaz do README.&quot; „Než se zeptáš, ověř, jestli to už
není hotové.&quot; „Zadáno znamená udělej.&quot;</p>
]]></content:encoded></item><item><title>Bitva mezi odpověďmi</title><link>https://ondra42.cz/2026/09/26/bitva-mezi-odpovedmi/</link><pubDate>Sat, 26 Sep 2026 20:00:00 +0200</pubDate><guid>https://ondra42.cz/2026/09/26/bitva-mezi-odpovedmi/</guid><description>Při čekání na odpověď AI se mi osvědčilo zahrát si jednu bitvu War Thunderu. A i když prohrávám, tak ne zadarmo.</description><content:encoded><![CDATA[<p>Osvědčilo se mi zahrát si jednu bitvu War Thunderu, zatímco čekám na
odpovědi AI. A i když prohrávám, tak ne zadarmo.</p>
<figure><img
      class="my-0 rounded-md"
      loading="lazy"
      decoding="async"
      alt="Výsledek bitvy ve War Thunderu: mise prohraná, ale první místo v týmu, 5 pozemních cílů, 1 letadlo a 53 074 stříbrných lvů"
      width="1539"
      height="1088"
      src="https://ondra42.cz/2026/09/26/bitva-mezi-odpovedmi/cover.jpg"
     
     
      data-zoom-src="https://ondra42.cz/2026/09/26/bitva-mezi-odpovedmi/cover.jpg"></figure>
]]></content:encoded></item><item><title>Konkurence do šumu</title><link>https://ondra42.cz/2026/09/26/konkurence-do-sumu/</link><pubDate>Sat, 26 Sep 2026 17:30:00 +0200</pubDate><guid>https://ondra42.cz/2026/09/26/konkurence-do-sumu/</guid><description>Když vám Claude doporučí nastavení filtrů a mezi ně schová přeskakování konkurence a uložení pod Šum. 🙂</description><content:encoded><![CDATA[<p>Když vám Claude doporučí nastavení filtrů a mezi ně schová přeskakování
konkurence a uložení pod Šum. 🙂</p>
<figure><img
      class="my-0 rounded-md"
      loading="lazy"
      decoding="async"
      alt="Gmailový filtr: zprávy od email.openai.com přeskočí doručenou poštu, dostanou štítek „9 Šum/Účty“ a nikdy se neoznačí jako důležité"
      width="503"
      height="44"
      src="https://ondra42.cz/2026/09/26/konkurence-do-sumu/cover.jpg"
     
     
      data-zoom-src="https://ondra42.cz/2026/09/26/konkurence-do-sumu/cover.jpg"></figure>

<h2 class="relative group">Jak to tedy je
    <div id="jak-to-tedy-je" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#jak-to-tedy-je" aria-label="Kotva">#</a>
    </span>
    
</h2>
<p>Filtr jsem opravdu napsal já, při dnešní revizi štítků. Důvod je ale nudný.
Newslettery OpenAI chodily na hlavní adresu, ne na alias openai@, takže je
pravidlo podle adresy nechytalo. Dostaly proto vlastní pravidlo podle
odesílatele.</p>
]]></content:encoded></item><item><title>Nejdřív registrace, vysvětlení nikdy</title><link>https://ondra42.cz/2026/09/25/registrace-napred/</link><pubDate>Fri, 25 Sep 2026 09:00:00 +0200</pubDate><guid>https://ondra42.cz/2026/09/25/registrace-napred/</guid><description>Slyšel jsem v podcastu o Groku, našel jejich web a hledal jakékoli informace. Žádný help, žádný pricing, ani náznak dokumentace — zato hned žádost o registraci.</description><content:encoded><![CDATA[<p>Slyšel jsem v nějakém podcastu o službě Grok, víc jsem nevěděl. Našel jsem
web a hledám jakékoli informace: žádný help, žádný pricing, ani náznak
dokumentace. Říkám si OK, tak využiju tu AI, co tu je, a zeptám se jí přímo.</p>
<p>Ovšem ani ta nepomohla — a navíc chtěla, abych se registroval. První, co
vyskočilo, byla žádost o registraci, a na stránce žádný odkaz na hlavní
stránku s popisem nebo čímkoli dalším. Prostě nic.</p>
<figure><img
      class="my-0 rounded-md"
      loading="lazy"
      decoding="async"
      alt="Stránka grok.com s výzvou „Sign up to continue seamlessly with Grok&rsquo;s full power“ místo odpovědi na položenou otázku"
      width="739"
      height="349"
      src="https://ondra42.cz/2026/09/25/registrace-napred/cover.jpg"
     
     
      data-zoom-src="https://ondra42.cz/2026/09/25/registrace-napred/cover.jpg"></figure>
<p>Takže jdu dál. Registrovat se někde, kde nevím, co nabízejí, je o ničem.
To vážně není dobrý návrh hlavní stránky a dost špatný přístup k UX webu.</p>

<h2 class="relative group">Jak to tedy je
    <div id="jak-to-tedy-je" class="anchor"></div>
    
    <span
        class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none">
        <a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#jak-to-tedy-je" aria-label="Kotva">#</a>
    </span>
    
</h2>
<p><strong>Popis produktu existuje, jen není tam, kde jsem ho hledal.</strong> <code>grok.com</code>
je samotná aplikace a od února 2026 na ní bez přihlášení neodešlete zprávu.
Stránka, která vysvětluje, co Grok umí a co stojí, žije na úplně jiné
doméně — <code>x.ai</code>. Z aplikace tam ale nevede žádný odkaz, takže kdo začne
u chatu, popis nenajde. To není moje chyba v hledání, to je rozpojený web.</p>
<p>Co se dalo zjistit bez účtu:</p>
<ul>
<li><strong>Grok dělá xAI</strong>, firma Elona Muska. Tu v únoru 2026 pohltil SpaceX a od
6. července 2026 vystupuje jako <strong>SpaceXAI</strong>. Chatbot i aplikace si jméno
Grok nechaly, změnila se jen firma nad nimi.</li>
<li><strong>Účet zdarma jde založit</strong> e-mailem nebo propojením s účtem na X. Zdarma
ale neznamená všechno: nejnovější model a generování obrázků a videa jsou
za placeným tarifem.</li>
<li><strong>Poslední verze je Grok 4.7</strong>, vydaná 21. září 2026 — čtyři dny před tím,
než jsem se na to díval.</li>
<li><strong>Kromě webu</strong> je Grok v mobilních aplikacích, v síti X pro předplatitele
Premium a v autech Tesla. Pro vývojáře je API za přibližně 2 dolary za
milion vstupních a 6 dolarů za milion výstupních tokenů.</li>
</ul>
<p>Jinými slovy: nabízejí zhruba totéž co konkurence a účet zdarma opravdu
existuje. Jenom to nikde neřeknou tomu, kdo přijde na <code>grok.com</code> a chce
vědět, do čeho jde — a to je přesně ten okamžik, kdy se rozhoduje.</p>
]]></content:encoded></item></channel></rss>