From 360f117e4e91adbb471d8b36adc083e938541bae Mon Sep 17 00:00:00 2001 From: Pavlina Vanova Date: Thu, 19 Mar 2026 11:48:01 +0100 Subject: [PATCH] Update blog content: sesty-sraz-2026-03-12 --- docs/2026-02-05-prvni-sraz/index.html | 49 +- docs/2026-02-12-druhy-sraz/index.html | 49 +- docs/2026-02-19-treti-sraz/index.html | 47 +- docs/2026-02-26-ctvrty-sraz/index.html | 58 +- docs/2026-03-05-paty-sraz/index.html | 60 +- docs/2026-03-12-sesty-sraz/index.html | 743 +++++++++++++++++++++++++ docs/404.html | 53 +- docs/index.html | 51 +- docs/search/search_index.json | 2 +- docs/sitemap.xml.gz | Bin 127 -> 127 bytes docs_src/2026-03-12-sesty-sraz.md | 77 +++ mkdocs.yml | 3 +- 12 files changed, 1140 insertions(+), 52 deletions(-) create mode 100644 docs/2026-03-12-sesty-sraz/index.html create mode 100644 docs_src/2026-03-12-sesty-sraz.md diff --git a/docs/2026-02-05-prvni-sraz/index.html b/docs/2026-02-05-prvni-sraz/index.html index 094471c..ca72be3 100644 --- a/docs/2026-02-05-prvni-sraz/index.html +++ b/docs/2026-02-05-prvni-sraz/index.html @@ -19,7 +19,7 @@ - + @@ -424,16 +424,14 @@ -
  • +
  • - - Čtvrtý sraz @@ -443,18 +441,24 @@ - -
  • - -
  • +
  • + + + + + + + + +
  • + - Pátý sraz @@ -468,6 +472,33 @@ + + + + + + +
  • + + + + + + + + Šestý sraz + + + + + + + + +
  • + + + diff --git a/docs/2026-02-12-druhy-sraz/index.html b/docs/2026-02-12-druhy-sraz/index.html index 23bac66..7108800 100644 --- a/docs/2026-02-12-druhy-sraz/index.html +++ b/docs/2026-02-12-druhy-sraz/index.html @@ -19,7 +19,7 @@ - + @@ -440,16 +440,14 @@ -
  • +
  • - - Čtvrtý sraz @@ -459,18 +457,24 @@ - -
  • - -
  • +
  • + + + + + + + + +
  • + - Pátý sraz @@ -484,6 +488,33 @@ + + + + + + +
  • + + + + + + + + Šestý sraz + + + + + + + + +
  • + + + diff --git a/docs/2026-02-19-treti-sraz/index.html b/docs/2026-02-19-treti-sraz/index.html index 1e9992e..3159d38 100644 --- a/docs/2026-02-19-treti-sraz/index.html +++ b/docs/2026-02-19-treti-sraz/index.html @@ -19,7 +19,7 @@ - + @@ -442,14 +442,12 @@
  • - - Čtvrtý sraz @@ -459,18 +457,24 @@ - -
  • - -
  • +
  • + + + + + + + + +
  • + - Pátý sraz @@ -484,6 +488,33 @@ + + + + + + +
  • + + + + + + + + Šestý sraz + + + + + + + + +
  • + + + diff --git a/docs/2026-02-26-ctvrty-sraz/index.html b/docs/2026-02-26-ctvrty-sraz/index.html index 23d9a72..cb3f9c8 100644 --- a/docs/2026-02-26-ctvrty-sraz/index.html +++ b/docs/2026-02-26-ctvrty-sraz/index.html @@ -12,12 +12,14 @@ + + - + @@ -415,6 +417,60 @@ + + + + + + +
  • + + + + + + + + Pátý sraz + + + + + + + + +
  • + + + + + + + + + +
  • + + + + + + + + Šestý sraz + + + + + + + + +
  • + + + diff --git a/docs/2026-03-05-paty-sraz/index.html b/docs/2026-03-05-paty-sraz/index.html index cfabb7d..e0e7f46 100644 --- a/docs/2026-03-05-paty-sraz/index.html +++ b/docs/2026-03-05-paty-sraz/index.html @@ -9,15 +9,17 @@ - + + + - + @@ -305,6 +307,33 @@ + + +
  • + + + + + + + + Čtvrtý sraz + + + + + + + + +
  • + + + + + + + @@ -497,6 +526,33 @@ + + + + + + +
  • + + + + + + + + Šestý sraz + + + + + + + + +
  • + + + diff --git a/docs/2026-03-12-sesty-sraz/index.html b/docs/2026-03-12-sesty-sraz/index.html new file mode 100644 index 0000000..8ef12be --- /dev/null +++ b/docs/2026-03-12-sesty-sraz/index.html @@ -0,0 +1,743 @@ + + + + + + + + + + + + + + + + + + + + + + + + Šestý sraz - Quiz CLI projekt blog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + + + Přeskočit obsah + + +
    +
    + +
    + + + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + + + + + + + + + +
    + +
    + + + + + +

    Otázky, issues a týmová spolupráce

    +

    Datum: 2026-03-12
    +Lektor: David Slavíček
    +Zápis: Pavlína Váňová

    +
    +

    Dnešní sraz byl kratší než obvykle. Zaměřili jsme se hlavně na otázky a odpovědi k aktuálním issues a celkovému fungování týmové spolupráce na projektu. Na závěr jsme se přesunuli na NePyvo, kde měl Luděk Reif velmi zajímavou přednášku o vibecodingu.

    +
    +

    Pull requesty a navrhování změn v kódu

    +

    Prošli jsme si, jak se navrhují změny v kódu přímo na GitHubu:

    +
      +
    • kliknout na + u čísla řádku
    • +
    • zvolit Add a comment on line
    • +
    +
    +

    Issue #4 – Admin receives a question

    +

    Dále jsme si prošli issue, kde admin přijímá otázku:

    +
      +
    • do projektu byla přidána knihovna string (konkrétně ascii_letters) – tato úprava byla převzata a upravena z klienta
    • +
    • funkce je společná pro klienta i admina, logicky by tedy patřila do repozitáře commons
    • +
    • commons ale zatím obsahuje pouze modely – David navrhuje přidat složku Functions (možná jen dočasně), aby se pull request dál neprotahoval
    • +
    +
    +

    Repozitář Commons

    +

    Krátce jsme rozebrali repozitář commons.

    +

    V souboru models.py na řádku 54 (parametr question) byla nalezena chybná specifikace typu dict. David navrhuje opravu typu – lze ji zadat přímo jako commit suggestion v rámci code review.

    +
    +

    Kategorizace návrhů při code review

    +

    David představil systém, který používá v práci při posuzování návrhů podle závažnosti:

    +
      +
    • Issue – vážný problém, který je nutné vyřešit
    • +
    • Suggestion – pouze návrh, není povinný
    • +
    • Nitpick – drobný detail, který stojí za zmínku, ale není důležitý
    • +
    +
    +

    app.state ve FastAPI

    +

    Padl dotaz, co vlastně je app.state ve FastAPI. Téma by mělo být dovysvětleno příště.

    +
    +

    Jak se vyhnout merge konfliktům

    +

    Prošli jsme si projektovou tabulku (Quiz CLI issues table) a zamýšleli se nad tím, kdy by mělo issue přejít ze stavu New/Idea do stavu Todo.

    +
      +
    • procházíme issues společně, konečné rozhodnutí je na Martinovi jako správci projektu
    • +
    • issue ve stavu Todo si může "přivlastnit" kdokoli a začít na něm pracovat
    • +
    +
    +

    Víceodpověďové otázky a bodování

    +

    Tým se shodl, že je nejprve potřeba rozhodnout o pravidlech, a teprve poté implementovat:

    +
      +
    • jakým způsobem se budou počítat body při více správných odpovědích
    • +
    • jak se budou zaznamenávat otázky s více možnými odpověďmi
    • +
    +

    Zazněla také základní otázka k povaze aplikace:

    +
    +

    Je to hra, nebo test?

    +
    +
      +
    • Hra – zaznamenává počet bodů a podle toho pořadí hráčů (srovnání: Kahoot)
    • +
    • Test – zaznamenává, kdo na co odpověděl správně nebo špatně, a poskytuje zpětnou vazbu učiteli i studentům
    • +
    + + + + + + + + + + + + + +
    +
    + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/404.html b/docs/404.html index ad63e1e..8061677 100644 --- a/docs/404.html +++ b/docs/404.html @@ -15,7 +15,7 @@ - + @@ -300,16 +300,14 @@ -
  • - - +
  • + - Čtvrtý sraz @@ -319,18 +317,24 @@ - -
  • - -
  • +
  • + - + + + + + + + +
  • + + - Pátý sraz @@ -344,6 +348,33 @@ + + + + + + +
  • + + + + + + + + Šestý sraz + + + + + + + + +
  • + + + diff --git a/docs/index.html b/docs/index.html index 54fbd22..cb226f1 100644 --- a/docs/index.html +++ b/docs/index.html @@ -17,7 +17,7 @@ - + @@ -384,15 +384,13 @@
  • - - + - Čtvrtý sraz @@ -402,18 +400,24 @@ - -
  • - -
  • +
  • + - + + + + + + + +
  • + + - Pátý sraz @@ -427,6 +431,33 @@ + + + + + + +
  • + + + + + + + + Šestý sraz + + + + + + + + +
  • + + + diff --git a/docs/search/search_index.json b/docs/search/search_index.json index 82ed44f..c7a06d5 100644 --- a/docs/search/search_index.json +++ b/docs/search/search_index.json @@ -1 +1 @@ -{"config":{"lang":["en"],"separator":"[\\s\\-]+","pipeline":["stopWordFilter"],"fields":{"title":{"boost":1000.0},"text":{"boost":1.0},"tags":{"boost":1000000.0}}},"docs":[{"location":"","title":"\u00davod","text":""},{"location":"#ahoj","title":"Ahoj \ud83d\udc4b","text":"

    V\u00edtej na blogu projektu Quiz CLI, kter\u00fd vznik\u00e1 v r\u00e1mci komunity PyLadies.

    B\u011bhem n\u011bkolika m\u011bs\u00edc\u016f tu spole\u010dn\u011b vyv\u00edj\u00edme kv\u00edzovou aplikaci, kter\u00e1:

    C\u00edlem ale nen\u00ed jen napsat k\u00f3d. Hlavn\u011b si chceme:

    Jestli se chcete pod\u00edvat, jak n\u00e1m to jde, mrkn\u011bte na n\u00e1\u0161 GitHub.

    "},{"location":"#proc-tenhle-blog-vznikl","title":"Pro\u010d tenhle blog vznikl?","text":"

    Tenhle blog slou\u017e\u00ed jako:

    Chceme tu zachovat nejen co jsme d\u011blaly, ale i jak jsme o tom p\u0159em\u00fd\u0161lely.

    "},{"location":"#jak-s-blogem-pracovat","title":"Jak s blogem pracovat?","text":"

    Ka\u017ed\u00fd \u010dl\u00e1nek:

    Pokud jsi \u00fa\u010dastnice projektu, n\u00e1vod jak p\u0159id\u00e1vat nov\u00e9 \u010dl\u00e1nky najde\u0161 v souboru README.md v repozit\u00e1\u0159i.

    "},{"location":"2026-02-05-prvni-sraz/","title":"Prvn\u00ed sraz","text":"

    2026-02-05

    Lektor: Martin Zelen\u00fd

    Z\u00e1pis: Patricie Hermanov\u00e1

    V PyLadies se letos rozjel nov\u00fd projekt s pracovn\u00edm n\u00e1zvem Quiz CLI. N\u00e1sleduj\u00edc\u00edho p\u016fl roku budeme v t\u00fdmu vyv\u00edjet kv\u00edzovou aplikaci, kter\u00e1 pob\u011b\u017e\u00ed na serveru a bude fungovat p\u0159es s\u00ed\u0165 \u2013 n\u011bco jako vlastn\u00ed, program\u00e1torsk\u00e1 alternativa ke Kahootu. C\u00edlem nen\u00ed jen napsat k\u00f3d, ale hlavn\u011b si vyzkou\u0161et, jak vypad\u00e1 pr\u00e1ce na re\u00e1ln\u00e9m projektu v t\u00fdmu.

    Hned na za\u010d\u00e1tku jsme dostaly pozv\u00e1nky do GitHub repozit\u00e1\u0159\u016f a \u0159e\u0161ily klasick\u00fd onboarding: zalo\u017een\u00ed \u00fa\u010dt\u016f, instalace Gitu, SSH kl\u00ed\u010de a kontrolu, \u017ee v\u0161ichni zvl\u00e1dneme projekt naklonovat a pushnout zm\u011bny. U\u017e tohle samo o sob\u011b byla takov\u00e1 mal\u00e1 simulace n\u00e1stupu do firmy.

    Martin na \u00favod vysv\u011btlil, o co vlastn\u011b p\u016fjde. Projekt m\u00e1 u\u017e del\u0161\u00ed dobu v hlav\u011b \u2013 cht\u011bl si vyzkou\u0161et pokro\u010dilej\u0161\u00ed v\u011bci v Pythonu, hlavn\u011b FastAPI, asynchronn\u00ed programov\u00e1n\u00ed a s\u00ed\u0165ovou komunikaci. Z\u00e1rove\u0148 by z toho mohl vzniknout n\u00e1stroj, kter\u00fd se jednou re\u00e1ln\u011b pou\u017eije t\u0159eba na v\u00fduku, proto\u017ee Kahoot je pr\u00fd pro lektory sp\u00ed\u0161 utrpen\u00ed ne\u017e radost.

    "},{"location":"2026-02-05-prvni-sraz/#zakladni-myslenka-kvizu","title":"Z\u00e1kladn\u00ed my\u0161lenka kv\u00edzu","text":"

    Z\u00e1kladn\u00ed my\u0161lenka kv\u00edzu je vlastn\u011b jednoduch\u00e1:

    prezentace = hierarchick\u00fd text, seznam ot\u00e1zek a odpov\u011bd\u00ed, \u0159et\u011bzce a slovn\u00edky

    To se hezky nab\u00edz\u00ed ukl\u00e1dat t\u0159eba ve form\u00e1tu YAML. Jen\u017ee aby mohlo hr\u00e1t v\u00edc lid\u00ed najednou, pot\u0159ebujeme server, kter\u00fd pob\u011b\u017e\u00ed po\u0159\u00e1d, a klienty, kte\u0159\u00ed se k n\u011bmu p\u0159ipoj\u00ed. Komunikace mezi nimi m\u00e1 prob\u00edhat p\u0159es websockety \u2013 n\u011bco jako chat, kde spojen\u00ed z\u016fst\u00e1v\u00e1 otev\u0159en\u00e9 a zpr\u00e1vy te\u010dou ob\u011bma sm\u011bry v re\u00e1ln\u00e9m \u010dase.

    Projekt u\u017e nen\u00ed \u00fapln\u011b od nuly. Martin m\u00e1 p\u0159ipraven\u00fd z\u00e1klad a my ho budeme postupn\u011b rozv\u00edjet. Role si rozd\u011bl\u00edme tak, aby to p\u0159ipom\u00ednalo \u201enastoupen\u00ed do rozjet\u00e9ho projektu\u201c.

    "},{"location":"2026-02-05-prvni-sraz/#architektura-projektu","title":"Architektura projektu","text":"

    Cel\u00e9 je to rozd\u011blen\u00e9 do n\u011bkolika repozit\u00e1\u0159\u016f:

    "},{"location":"2026-02-05-prvni-sraz/#quiz-admin","title":"Quiz Admin","text":"

    Na\u010d\u00edt\u00e1 kv\u00edz z YAMLu, kontroluje ho, pos\u00edl\u00e1 ot\u00e1zky a vyhodnocuje odpov\u011bdi. Pou\u017e\u00edv\u00e1 ho \u201eu\u010ditel\u201c.

    "},{"location":"2026-02-05-prvni-sraz/#quiz-server","title":"Quiz Server","text":"

    Zaji\u0161\u0165uje websocketov\u00e9 spojen\u00ed mezi adminem a klienty.

    "},{"location":"2026-02-05-prvni-sraz/#quiz-client","title":"Quiz Client","text":"

    To, co spou\u0161t\u00ed hr\u00e1\u010di.

    Nejd\u0159\u00edv jsme si v\u0161echno naklonovaly, rozb\u011bhly server pomoc\u00ed n\u00e1stroje uv (takov\u00fd \u0161v\u00fdcarsk\u00fd no\u017e\u00edk ve sv\u011bt\u011b Pythonu) a pak postupn\u011b i admina a klienta. P\u0159ipojovaly jsme se zat\u00edm jen lok\u00e1ln\u011b \u2013 vlastn\u011b samy na sebe.

    A pak p\u0159i\u0161el ten hezk\u00fd moment: na jednom termin\u00e1lu b\u011b\u017e\u00ed server, na druh\u00e9m admin, na t\u0159et\u00edm klient. V adminovi po\u0161lu dal\u0161\u00ed ot\u00e1zku, na klientovi se objev\u00ed, odpov\u00edm\u2026 a na serveru vid\u00edm log, \u017ee to opravdu proteklo s\u00edt\u00ed. Mal\u00fd wow efekt, kdy\u017e si \u010dlov\u011bk uv\u011bdom\u00ed, \u017ee se tam asynchronn\u011b d\u011bje v\u00edc v\u011bc\u00ed najednou.

    "},{"location":"2026-02-05-prvni-sraz/#ukazka-z-praxe","title":"Uk\u00e1zka z praxe","text":"

    Admin Send 'y' for the next question

    Client Question: This question has two correct answers: C and D Answer: C

    Server Client papricie sent: {'answer': 'C'}

    Fungovalo to skoro v\u0161em, jen jedn\u00e9 \u00fa\u010dastnici se komunikaci nepoda\u0159ilo rozb\u011bhnout, tak\u017ee celkov\u011b velk\u00fd \u00fasp\u011bch.

    Do budoucna budeme pracovat i s dal\u0161\u00edm repozit\u00e1\u0159em common, kde jsou sd\u00edlen\u00e9 \u010d\u00e1sti k\u00f3du, a s knihovnami jako Pydantic na modely a validaci dat. Cel\u00fd projekt je z\u00e1m\u011brn\u011b postaven\u00fd trochu slo\u017eit\u011bji, ne\u017e by bylo nutn\u00e9 \u2013 c\u00edlem je osahat si v\u011bci, kter\u00e9 se v b\u011b\u017en\u00fdch tutori\u00e1lech moc ne\u0159e\u0161\u00ed: OOP, architekturu, verze, issues na GitHubu, t\u00fdmovou spolupr\u00e1ci.

    Na GitHubu u\u017e m\u00e1me i projektovou tabulku s \u00fakoly (TODO / In progress / Done), tak\u017ee si opravdu hrajeme na \u201emal\u00fd software t\u00fdm\u201c.

    Zat\u00edm jsme hlavn\u011b rozb\u011bhly infrastrukturu. Te\u010f u\u017e n\u00e1s \u010dek\u00e1 ta z\u00e1bavn\u011bj\u0161\u00ed \u010d\u00e1st: pochopit, jak to cel\u00e9 funguje uvnit\u0159, a postupn\u011b z toho ud\u011blat skute\u010dn\u00fd kv\u00edz.

    "},{"location":"2026-02-12-druhy-sraz/","title":"Druh\u00fd sraz","text":"

    2026-02-12

    Lektor: Martin Zelen\u00fd

    Z\u00e1pis: Patricie Hermanov\u00e1

    Na druh\u00e9m srazu jsme plynule nav\u00e1zali tam, kde jsme minule skon\u010dili. Zat\u00edmco prvn\u00ed setk\u00e1n\u00ed bylo hlavn\u011b o sezn\u00e1men\u00ed s projektem a jeho strukturou, tentokr\u00e1t jsme se za\u010dali v\u00edce no\u0159it do re\u00e1ln\u00e9ho workflow, pr\u00e1ce s repozit\u00e1\u0159em a samotn\u00e9ho k\u00f3du.

    Postupn\u011b se za\u010dal odkr\u00fdvat cel\u00fd mechanismus fungov\u00e1n\u00ed projektu \u2013 od GitHub issues, p\u0159es YAML strukturu kv\u00edzu, a\u017e po prvn\u00ed kontakt s knihovnou Pydantic a asynchronn\u00ed komunikac\u00ed.

    "},{"location":"2026-02-12-druhy-sraz/#ohlednuti-za-domaci-pripravou-a-plan-do-budoucna","title":"Ohl\u00e9dnut\u00ed za dom\u00e1c\u00ed p\u0159\u00edpravou a pl\u00e1n do budoucna","text":"

    Na za\u010d\u00e1tku jsme si shrnuli dom\u00e1c\u00ed p\u0159\u00edpravu, kterou Martin sd\u00edlel. T\u00e9matem bylo p\u0159edev\u0161\u00edm objektov\u011b orientovan\u00e9 programov\u00e1n\u00ed (OOP), kter\u00e9 tvo\u0159\u00ed z\u00e1klad struktury na\u0161eho projektu.

    Z\u00e1rove\u0148 jsme dostali n\u00e1stin toho, co n\u00e1s \u010dek\u00e1 d\u00e1l. Kl\u00ed\u010dovou roli bude hr\u00e1t knihovna Pydantic, kter\u00e1 slou\u017e\u00ed k validaci dat a jejich p\u0159evodu do objektov\u00e9 struktury. Pr\u00e1v\u011b d\u00edky n\u00ed bude mo\u017en\u00e9 bezpe\u010dn\u011b na\u010d\u00edtat a kontrolovat data kv\u00edzu.

    "},{"location":"2026-02-12-druhy-sraz/#github-projects-a-prace-s-issues","title":"GitHub Projects a pr\u00e1ce s issues","text":"

    Dal\u0161\u00ed \u010d\u00e1st setk\u00e1n\u00ed byla v\u011bnov\u00e1na organizaci pr\u00e1ce na GitHubu. Pro\u0161li jsme projektovou tabulku s \u00fakoly, kde se uk\u00e1zalo, \u017ee p\u0159ehled ve form\u011b tabulky je v\u00fdrazn\u011b prakti\u010dt\u011bj\u0161\u00ed ne\u017e z\u00e1kladn\u00ed seznam.

    Byly ud\u011blena pochvala za n\u00e1vrh Issue od \u00fa\u010dastnice \u2013 p\u0159id\u00e1n\u00ed sloupce \u201eIdeas\u201c, kter\u00fd slou\u017e\u00ed jako vstupn\u00ed bod pro nov\u00e9 n\u00e1pady je\u0161t\u011b p\u0159ed jejich zpracov\u00e1n\u00edm do konkr\u00e9tn\u00edho \u00fakolu.

    Uk\u00e1zalo se tak\u00e9, \u017ee mezi stavy \u201eIn progress\u201c a \u201eDone\u201c d\u00e1v\u00e1 smysl m\u00edt je\u0161t\u011b mezistav. Dokon\u010den\u00fd \u00fakol toti\u017e nemus\u00ed b\u00fdt automaticky schv\u00e1len\u00fd a mergnut\u00fd. Tento krok je d\u016fle\u017eit\u00fd pro zachov\u00e1n\u00ed kvality a kontroly nad zm\u011bnami.

    Postupn\u011b jsme pro\u0161li jednotliv\u00e9 \u00fakoly, zkontrolovali jejich p\u0159i\u0159azen\u00ed a pojmenov\u00e1n\u00ed, a ujistili se, \u017ee m\u00e1 ka\u017ed\u00fd jasno, na \u010dem pracuje nebo by pracovat mohl.

    "},{"location":"2026-02-12-druhy-sraz/#git-v-praxi-branche-merge-squash-a-rebase","title":"Git v praxi: branche, merge, squash a rebase","text":"

    Velmi cenn\u00e1 byla praktick\u00e1 uk\u00e1zka pr\u00e1ce s Git workflow na konkr\u00e9tn\u00edch p\u0159\u00edkladech.

    Uk\u00e1zali jsme si, co znamen\u00e1:

    D\u016fraz byl kladen tak\u00e9 na spr\u00e1vn\u00e9 pojmenov\u00e1n\u00ed v\u011btv\u00ed, ide\u00e1ln\u011b v\u010detn\u011b vlastn\u00edch inici\u00e1l, aby bylo v\u017edy jasn\u00e9, kdo je autorem zm\u011bny.

    Narazili jsme i na situaci, kdy bylo pot\u0159eba pou\u017e\u00edt rebase, proto\u017ee zm\u011bny spolu logicky nesouvisely. I to je sou\u010d\u00e1st re\u00e1ln\u00e9 pr\u00e1ce na projektu.

    "},{"location":"2026-02-12-druhy-sraz/#yaml-jako-format-pro-definici-kvizu","title":"YAML jako form\u00e1t pro definici kv\u00edzu","text":"

    Poprv\u00e9 jsme se detailn\u011b pod\u00edvali na strukturu samotn\u00e9ho kv\u00edzu, kter\u00fd je ulo\u017een ve form\u00e1tu YAML.

    YAML je jednoduch\u00fd textov\u00fd form\u00e1t zalo\u017een\u00fd na dvojic\u00edch kl\u00ed\u010d\u2013hodnota. D\u00edky sv\u00e9 \u010ditelnosti je ide\u00e1ln\u00ed pro definici strukturovan\u00fdch dat, jako jsou ot\u00e1zky, odpov\u011bdi nebo metadata kv\u00edzu.

    Uk\u00e1zali jsme si nap\u0159\u00edklad:

    Do budoucna se po\u010d\u00edt\u00e1 s roz\u0161\u00ed\u0159en\u00edm o r\u016fzn\u00e9 typy ot\u00e1zek, nap\u0159\u00edklad single choice nebo multiple choice.

    "},{"location":"2026-02-12-druhy-sraz/#jak-se-kviz-nacita-od-souboru-k-objektu","title":"Jak se kv\u00edz na\u010d\u00edt\u00e1: od souboru k objektu","text":"

    Velmi zaj\u00edmav\u00fd byl pohled na to, jak se data ze souboru skute\u010dn\u011b dostanou do aplikace.

    Nejprve se YAML soubor na\u010dte a p\u0159evede na Python slovn\u00edk. Ten se n\u00e1sledn\u011b p\u0159ed\u00e1 do Pydantic modelu:

    Quiz(**quiz_data)\n

    Oper\u00e1tor ** zde rozbal\u00ed slovn\u00edk na jednotliv\u00e9 argumenty. Pydantic pak:

    V\u00fdsledkem je plnohodnotn\u00fd objekt reprezentuj\u00edc\u00ed cel\u00fd kv\u00edz.

    "},{"location":"2026-02-12-druhy-sraz/#jak-se-aplikace-spousti","title":"Jak se aplikace spou\u0161t\u00ed","text":"

    Uk\u00e1zali jsme si tak\u00e9, jak se projekt spou\u0161t\u00ed pomoc\u00ed skript\u016f definovan\u00fdch v souboru pyproject.toml.

    Tento soubor obsahuje metadata o projektu a mimo jin\u00e9 definuje tzv. entry point:

    [project.scripts]\nquiz-admin = \"quiz_admin.__main__:main\"\n

    D\u00edky tomu lze aplikaci spustit p\u0159\u00edmo z p\u0159\u00edkazov\u00e9 \u0159\u00e1dky bez nutnosti ru\u010dn\u00edho spou\u0161t\u011bn\u00ed jednotliv\u00fdch soubor\u016f.

    D\u016fle\u017eitou roli zde hraje n\u00e1stroj uv, kter\u00fd se star\u00e1 o spr\u00e1vu prost\u0159ed\u00ed a instalaci z\u00e1vislost\u00ed.

    "},{"location":"2026-02-12-druhy-sraz/#prvni-setkani-s-asynchronnim-kodem","title":"Prvn\u00ed setk\u00e1n\u00ed s asynchronn\u00edm k\u00f3dem","text":"

    Na z\u00e1v\u011br jsme se dostali k jedn\u00e9 z nejpokro\u010dilej\u0161\u00edch \u010d\u00e1st\u00ed projektu \u2013 asynchronn\u00ed komunikaci.

    Server a klient spolu komunikuj\u00ed pomoc\u00ed WebSocket\u016f. To umo\u017e\u0148uje obousm\u011brnou komunikaci v re\u00e1ln\u00e9m \u010dase.

    Asynchronn\u00ed funkce jsou definov\u00e1ny pomoc\u00ed:

    async def\n

    a volaj\u00ed se pomoc\u00ed:

    await\n

    To umo\u017e\u0148uje programu obsluhovat v\u00edce \u00faloh sou\u010dasn\u011b, ani\u017e by se navz\u00e1jem blokovaly.

    Nap\u0159\u00edklad odesl\u00e1n\u00ed dat kv\u00edzu serveru m\u016f\u017ee vypadat takto:

    await ws.send(json.dumps(quiz_data))\n
    "},{"location":"2026-02-12-druhy-sraz/#kam-smerujeme-dal","title":"Kam sm\u011b\u0159ujeme d\u00e1l","text":"

    Druh\u00fd sraz byl v\u00fdznamn\u00fdm krokem od teorie k praxi. Za\u010dali jsme ch\u00e1pat nejen strukturu projektu, ale i principy, na kter\u00fdch stoj\u00ed.

    Postupn\u011b se skl\u00e1d\u00e1 obraz cel\u00e9 aplikace \u2013 od YAML souboru p\u0159es validaci dat a\u017e po komunikaci mezi klientem a serverem.

    "},{"location":"2026-02-19-treti-sraz/","title":"T\u0159et\u00ed sraz","text":"

    2026-02-19

    Lektor: Martin Zelen\u00fd

    Z\u00e1pis: Patricie Hermanov\u00e1

    T\u0159et\u00ed sraz za\u010dal kontrolou na\u0161\u00ed n\u00e1st\u011bnky a kr\u00e1tk\u00fdm ohl\u00e9dnut\u00edm za t\u00edm, co se od minule zm\u011bnilo. Super byl moment, kdy jsme si uk\u00e1zali n\u00e1\u0161 Quiz CLI blog \u2014 kone\u010dn\u011b b\u011b\u017e\u00ed. Po v\u0161ech boj\u00edch s MkDocs, v\u011btvemi a GitHub Pages to byl mal\u00fd, ale d\u016fle\u017eit\u00fd miln\u00edk. U\u017e to cel\u00e9 nen\u00ed jen cvi\u010den\u00ed, ale skute\u010dn\u00fd projekt, kter\u00fd za\u010dal ve\u0159ejn\u011b existovat.

    "},{"location":"2026-02-19-treti-sraz/#issue-pr-nastenka-a-proc-na-poradi-zalezi","title":"Issue, PR, n\u00e1st\u011bnka a pro\u010d na po\u0159ad\u00ed z\u00e1le\u017e\u00ed","text":"

    Martin se kr\u00e1tce vr\u00e1til k tomu, jak spr\u00e1vn\u011b vytv\u00e1\u0159et zm\u011bny v projektu.

    Spr\u00e1vn\u00fd postup je:

    1. vytvo\u0159it issue
    2. vytvo\u0159it si branch
    3. ud\u011blat zm\u011bny
    4. otev\u0159\u00edt pull request

    Ne naopak.

    Tohle byla p\u0159esn\u011b chyba, kterou jsem ud\u011blala u sv\u00e9ho \u201esync fix\u201c PR \u2014 \u0161la jsem rovnou na pull request bez issue. Nav\u00edc jsem se pokou\u0161ela zm\u011bnit zdroj pravdy v mainu na GitHubu, velmi dobr\u00e9 pou\u010den\u00ed.

    Mezit\u00edm se na n\u00e1st\u011bnce objevily dv\u011b nov\u00e9 kolonky:

    Tohle d\u00e1v\u00e1 mnohem v\u011bt\u0161\u00ed smysl. Hotovo toti\u017e neznamen\u00e1 automaticky za\u010dlen\u011bno.

    "},{"location":"2026-02-19-treti-sraz/#merge-uz-neni-magie","title":"Merge u\u017e nen\u00ed magie","text":"

    Dote\u010f pro m\u011b byl merge n\u011bco, co d\u011blal Martin, nebo kdokoliv jin\u00fd. Te\u010f jsme si ale vysv\u011btlili, \u017ee merge budeme d\u011blat samy. U blogu to bylo tedy v\u00fdjime\u010dn\u00e9, proto\u017ee bylo pot\u0159eba ho rychle dostat online a ov\u011b\u0159it, \u017ee funguje.

    Martin n\u00e1m uk\u00e1zal dva typy merge:

    Squash and merge

    Rebase and merge

    "},{"location":"2026-02-19-treti-sraz/#conventional-commits-kdyz-commit-neco-rika","title":"Conventional commits: kdy\u017e commit n\u011bco \u0159\u00edk\u00e1","text":"

    Dal\u0161\u00ed v\u011bc, kterou jsme si ukazovali, jsou tzv. conventional commits.

    Nap\u0159\u00edklad: - chore: remove unused library - docs: improve README formatting

    Prefix \u0159\u00edk\u00e1, o jak\u00fd typ zm\u011bny jde. Nejde jen o po\u0159\u00e1dek. Jde o komunikaci. Kdy\u017e se n\u011bkdo pod\u00edv\u00e1 do historie, okam\u017eit\u011b v\u00ed, co se zm\u011bnilo.

    "},{"location":"2026-02-19-treti-sraz/#vetve-se-po-merge-mazou","title":"V\u011btve se po merge ma\u017eou","text":"

    Po \u00fasp\u011b\u0161n\u00e9m merge je dobr\u00e1 praxe:

    Repozit\u00e1\u0159 tak z\u016fst\u00e1v\u00e1 p\u0159ehledn\u00fd.

    Uk\u00e1zali jsme si i u\u017eite\u010dn\u00e9 p\u0159\u00edkazy, n\u011bkter\u00e9 zn\u00e1m\u00e9, jin\u00e9 nov\u00e9:

    git branch\ngit branch -vva\ngit remote -vv\ngit fetch --prune\ngit status\ngit pull\ngit log\n
    "},{"location":"2026-02-19-treti-sraz/#ideas-opravdu-funguji","title":"Ideas opravdu funguj\u00ed","text":"

    Nov\u00fd sloupec Ideas byl hned vyzkou\u0161en v praxi. N\u00e1pad se vytvo\u0159il jako issue, pro\u0161el procesem a nakonec skon\u010dil jako Done. Je zaj\u00edmav\u00e9 sledovat, jak se z pouh\u00e9 my\u0161lenky st\u00e1v\u00e1 konkr\u00e9tn\u00ed zm\u011bna v projektu.

    "},{"location":"2026-02-19-treti-sraz/#host-karolina-a-jeji-povidni-o-roboprojektu","title":"Host: Karol\u00edna a jej\u00ed pov\u00eddn\u00ed o RoboProjektu","text":"

    Karol\u00edna n\u00e1m p\u0159edstavila RoboProjekt, kter\u00fd je inspirac\u00ed pro na\u0161e hran\u00ed si na pr\u00e1ci. Jde p\u016fvodn\u011b o deskovou hrou, tu p\u0159ed p\u00e1r lety s dal\u0161\u00edmi \u00fa\u010dastnicemi Pyladies kurz\u016f p\u0159evedly do programu.

    Jejich projekt, narozd\u00edl od na\u0161eho, m\u011bl grafick\u00e9 rozhran\u00ed vytvo\u0159en\u00e9 v Inkscape a mapy ulo\u017een\u00e9 v JSON souborech. Pracovaly i trochu jinak ne\u017e my \u2014 pou\u017e\u00edvaly forky, ne jeden spole\u010dn\u00fd repozit\u00e1\u0159. Nav\u00edc za\u010d\u00ednaly \u00fapln\u011b od nuly, my pracujeme u\u017e s hrubou kostrou projektu.

    Nejd\u016fle\u017eit\u011bj\u0161\u00ed skill, kter\u00fd si odnesly?

    Git.

    A taky schopnost:

    Karol\u00edna zd\u016fraznila jednu d\u016fle\u017eitou v\u011bc:

    Je norm\u00e1ln\u00ed nerozum\u011bt. D\u016fle\u017eit\u00e9 je um\u011bt se pt\u00e1t.

    Nakonec z\u016fstaly na projektu dv\u011b \u00fa\u010dastnice. Dnes spolu pracuj\u00ed v Red Hatu.

    "},{"location":"2026-02-19-treti-sraz/#gitova-historie-jako-pribeh","title":"Gitov\u00e1 historie jako p\u0159\u00edb\u011bh","text":"

    Dal\u0161\u00ed d\u016fle\u017eit\u00e1 my\u0161lenka \u2013 commity by m\u011bly tvo\u0159it smyslupln\u00fd p\u0159\u00edb\u011bh.

    Projekt by m\u011bl b\u00fdt v ka\u017ed\u00e9m bod\u011b funk\u010dn\u00ed. To je profesion\u00e1ln\u00ed p\u0159\u00edstup.

    "},{"location":"2026-02-19-treti-sraz/#zaverem-ukazky-a-napady","title":"Z\u00e1v\u011brem uk\u00e1zky a n\u00e1pady","text":"

    Ukazovali jsme si zaj\u00edmav\u00e9 issue, kter\u00e9 n\u00e1m vis\u00ed na n\u00e1st\u011bnce. Pydantic automaticky p\u0159ev\u00e1d\u00ed \u010d\u00edsla na integer, ale n\u00e1\u0161 k\u00f3d o\u010dek\u00e1val string. V\u00fdsledkem byla chyba. \u0158e\u0161en\u00edm by mohlo b\u00fdt t\u0159eba p\u0159etypov\u00e1n\u00ed, \u00faprava podm\u00ednky nebo pou\u017eit\u00ed JSON schema.

    D\u016fle\u017eit\u00e1 pozn\u00e1mka \u2013 program by nem\u011bl spol\u00e9hat na to, \u017ee u\u017eivatel ud\u011bl\u00e1 v\u0161e p\u0159esn\u011b spr\u00e1vn\u011b a tak\u00e9 by m\u011bl b\u00fdt otev\u0159en\u00fd budouc\u00edm zm\u011bn\u00e1m.

    Quiz je definovan\u00fd v YAML souboru. Do budoucna tedy m\u016f\u017ee obsahovat dal\u0161\u00ed polo\u017eky, nap\u0159\u00edklad:

    Projekt za\u010d\u00edn\u00e1 b\u00fdt skute\u010dn\u00fd. T\u0159et\u00ed sraz byl zlomov\u00fd. Git p\u0159est\u00e1v\u00e1 b\u00fdt nep\u0159\u00edtel.

    "},{"location":"2026-02-26-ctvrty-sraz/","title":"\u010ctvrt\u00fd sraz","text":"

    2026-02-26

    Lektor: Martin Zelen\u00fd

    Z\u00e1pis: Veronika Vrbkov\u00e1

    Vysv\u011btlovali jsme si logiku kv\u00edzu. Proch\u00e1zeli jsme \u010d\u00e1st admin a klient a \u0159ekli si n\u011bjak\u00e1 kv\u00edzov\u00e1 omezen\u00ed, kter\u00e1 zat\u00edm m\u00e1me. Pak jsme se p\u0159esunuli na Pyvo do Artbaru.

    "},{"location":"2026-02-26-ctvrty-sraz/#spusteni-aneb-jake-repo-pustit-driv","title":"Spu\u0161t\u011bn\u00ed aneb jak\u00e9 repo pustit d\u0159\u00edv","text":"

    Nejd\u0159\u00edv si spou\u0161t\u00edme server. Ke spu\u0161t\u011bn\u00ed serveru pou\u017e\u00edv\u00e1me UV - p\u0159\u00edkaz uv run. - uv = hlavn\u00ed command - run = subcommand (spust\u00ed n\u00e1stroj nebo aplikaci)

    Pak jsme spustili quiz-admin pomoc\u00ed quiz-admin localhost:8000 .\\data\\quiz_example.yaml - pokud p\u0159\u00edkaz nen\u00ed nalezen, sta\u010d\u00ed doplnit uv run: uv run quiz-admin localhost:8000 .\\data\\quiz_example.yaml

    Nakonec jsme si spustili quiz-client.

    Pokud klient nezad\u00e1 jm\u00e9no hned, aplikace se zept\u00e1, p\u0159: quiz-client localhost:8000 Choose your name:

    Kdy\u017e klient vyp\u00ed\u0161e jm\u00e9no, tak se n\u00e1m pak na admin prop\u00ed\u0161ou p\u0159ihl\u00e1\u0161en\u00ed hr\u00e1\u010di. Dozv\u011bd\u011bli jsme se, \u017ee typick\u00e1 jm\u00e9na pro IT verze b\u00fdvaj\u00ed Alice a Bob.

    Testovac\u00ed kv\u00edzov\u00e9 ot\u00e1zky m\u00e1me zat\u00edm jen 2. K jejich tvorb\u011b budeme vyu\u017e\u00edvat YAML.

    "},{"location":"2026-02-26-ctvrty-sraz/#jak-se-deje-kviz","title":"Jak se d\u011bje kv\u00edz","text":"
    1. Admin ode\u0161le ot\u00e1zku na server pomoc\u00ed y
    2. Server po\u0161le ot\u00e1zku ke klient\u016fm
    3. Klienti odpov\u00eddaj\u00ed
    4. Server registruje odpov\u011bdi, ale zat\u00edm je nevyhodnocuje!
    5. Admin znovu po\u0161le ot\u00e1zku y, pos\u00edl\u00e1 se p\u0159es server klient\u016fm dal\u0161\u00ed ot\u00e1zka.
    6. Klienti odpov\u00eddaj\u00ed.
    7. Kv\u00edz se ukon\u010d\u00ed, jakmile se odpov\u00ed na posledn\u00ed ot\u00e1zku (v na\u0161em p\u0159\u00edpad\u011b po zodpov\u011bezen\u00ed druh\u00e9 ot\u00e1zky). Po zodpov\u011bzen\u00ed server odpoj\u00ed klienty.
    8. Pak se v\u00fdsledky v JSON po\u0161lou adminovi.
    9. Admin se n\u00e1sledn\u011b tak\u00e9 odpoj\u00ed. Konec.

    Form\u00e1tov\u00e1n\u00ed v\u00fdsledk\u016f JSON Budeme je form\u00e1tovat pomoc\u00ed jq - Instalace jq na Windows >> winget install jqlang.jq - Samotn\u00e9 form\u00e1tov\u00e1n\u00ed v\u00fdsledk\u016f pak vypad\u00e1 takto: '[{\"player\":\"alice\",\"question_number\":0,\"answer\":\"a\",\"correct\":true},{\"player\":\"bob\",\"question_number\":0,\"answer\":\"b\",\"correct\":true},{\"player\":\"alice\",\"question_number\":1,\"answer\":\"cd\",\"correct\":true},{\"player\":\"bob\",\"question_number\":1,\"answer\":\"blabla\",\"correct\":true}]' | jq

    "},{"location":"2026-02-26-ctvrty-sraz/#vysvetlujeme-si-klienta-client","title":"Vysv\u011btlujeme si klienta (client)","text":"

    Potom jsme si otev\u0159eli soubory k projektu ve VS Code. Otev\u0159eli jsme si samostatn\u00e1 okna pro server - client - admin.

    Klient zavol\u00e1 asynchronn\u011b send and receive messages. T\u00edm se vytvo\u0159\u00ed websocket spojen\u00ed na to url. P\u0159ij\u00edm\u00e1n\u00ed a odpov\u00edd\u00e1n\u00ed na ot\u00e1zky je asynchronn\u00ed a tedy korutinn\u00ed.

    P\u0159i prvn\u00edm spojen\u00ed si tak\u00e9 vytv\u00e1\u0159\u00edme ID klienta p\u0159es jeho odpov\u011b\u010f na ot\u00e1zku na jm\u00e9no.

    Server si d\u00edky tomu pozna\u010d\u00ed, \u017ee je to ID toho dan\u00e9ho klienta a pak budou v\u0161echny odpov\u011bdi sp\u00e1rovan\u00e9 p\u0159es to ID. await ws.send(json.dumps({\"client_id\": client_id, \"answer\": user_input}))

    Klient p\u0159ij\u00edm\u00e1 ot\u00e1zky ze serveru permanentn\u011b. Kdy\u017e admin za\u0161le ot\u00e1zku, tak se zobraz\u00ed u klienta, ten na ot\u00e1zku odpov\u00edd\u00e1. Po zad\u00e1n\u00ed odpov\u011bdi se ode\u0161le JSON.

    "},{"location":"2026-02-26-ctvrty-sraz/#aktualni-omezeni","title":"Aktu\u00e1ln\u00ed omezen\u00ed:","text":"

    Kone\u010dn\u00e9 pozn\u00e1mky:

    "}]} +{"config":{"lang":["en"],"separator":"[\\s\\-]+","pipeline":["stopWordFilter"],"fields":{"title":{"boost":1000.0},"text":{"boost":1.0},"tags":{"boost":1000000.0}}},"docs":[{"location":"","title":"\u00davod","text":""},{"location":"#ahoj","title":"Ahoj \ud83d\udc4b","text":"

    V\u00edtej na blogu projektu Quiz CLI, kter\u00fd vznik\u00e1 v r\u00e1mci komunity PyLadies.

    B\u011bhem n\u011bkolika m\u011bs\u00edc\u016f tu spole\u010dn\u011b vyv\u00edj\u00edme kv\u00edzovou aplikaci, kter\u00e1:

    C\u00edlem ale nen\u00ed jen napsat k\u00f3d. Hlavn\u011b si chceme:

    Jestli se chcete pod\u00edvat, jak n\u00e1m to jde, mrkn\u011bte na n\u00e1\u0161 GitHub.

    "},{"location":"#proc-tenhle-blog-vznikl","title":"Pro\u010d tenhle blog vznikl?","text":"

    Tenhle blog slou\u017e\u00ed jako:

    Chceme tu zachovat nejen co jsme d\u011blaly, ale i jak jsme o tom p\u0159em\u00fd\u0161lely.

    "},{"location":"#jak-s-blogem-pracovat","title":"Jak s blogem pracovat?","text":"

    Ka\u017ed\u00fd \u010dl\u00e1nek:

    Pokud jsi \u00fa\u010dastnice projektu, n\u00e1vod jak p\u0159id\u00e1vat nov\u00e9 \u010dl\u00e1nky najde\u0161 v souboru README.md v repozit\u00e1\u0159i.

    "},{"location":"2026-02-05-prvni-sraz/","title":"Prvn\u00ed sraz","text":"

    2026-02-05

    Lektor: Martin Zelen\u00fd

    Z\u00e1pis: Patricie Hermanov\u00e1

    V PyLadies se letos rozjel nov\u00fd projekt s pracovn\u00edm n\u00e1zvem Quiz CLI. N\u00e1sleduj\u00edc\u00edho p\u016fl roku budeme v t\u00fdmu vyv\u00edjet kv\u00edzovou aplikaci, kter\u00e1 pob\u011b\u017e\u00ed na serveru a bude fungovat p\u0159es s\u00ed\u0165 \u2013 n\u011bco jako vlastn\u00ed, program\u00e1torsk\u00e1 alternativa ke Kahootu. C\u00edlem nen\u00ed jen napsat k\u00f3d, ale hlavn\u011b si vyzkou\u0161et, jak vypad\u00e1 pr\u00e1ce na re\u00e1ln\u00e9m projektu v t\u00fdmu.

    Hned na za\u010d\u00e1tku jsme dostaly pozv\u00e1nky do GitHub repozit\u00e1\u0159\u016f a \u0159e\u0161ily klasick\u00fd onboarding: zalo\u017een\u00ed \u00fa\u010dt\u016f, instalace Gitu, SSH kl\u00ed\u010de a kontrolu, \u017ee v\u0161ichni zvl\u00e1dneme projekt naklonovat a pushnout zm\u011bny. U\u017e tohle samo o sob\u011b byla takov\u00e1 mal\u00e1 simulace n\u00e1stupu do firmy.

    Martin na \u00favod vysv\u011btlil, o co vlastn\u011b p\u016fjde. Projekt m\u00e1 u\u017e del\u0161\u00ed dobu v hlav\u011b \u2013 cht\u011bl si vyzkou\u0161et pokro\u010dilej\u0161\u00ed v\u011bci v Pythonu, hlavn\u011b FastAPI, asynchronn\u00ed programov\u00e1n\u00ed a s\u00ed\u0165ovou komunikaci. Z\u00e1rove\u0148 by z toho mohl vzniknout n\u00e1stroj, kter\u00fd se jednou re\u00e1ln\u011b pou\u017eije t\u0159eba na v\u00fduku, proto\u017ee Kahoot je pr\u00fd pro lektory sp\u00ed\u0161 utrpen\u00ed ne\u017e radost.

    "},{"location":"2026-02-05-prvni-sraz/#zakladni-myslenka-kvizu","title":"Z\u00e1kladn\u00ed my\u0161lenka kv\u00edzu","text":"

    Z\u00e1kladn\u00ed my\u0161lenka kv\u00edzu je vlastn\u011b jednoduch\u00e1:

    prezentace = hierarchick\u00fd text, seznam ot\u00e1zek a odpov\u011bd\u00ed, \u0159et\u011bzce a slovn\u00edky

    To se hezky nab\u00edz\u00ed ukl\u00e1dat t\u0159eba ve form\u00e1tu YAML. Jen\u017ee aby mohlo hr\u00e1t v\u00edc lid\u00ed najednou, pot\u0159ebujeme server, kter\u00fd pob\u011b\u017e\u00ed po\u0159\u00e1d, a klienty, kte\u0159\u00ed se k n\u011bmu p\u0159ipoj\u00ed. Komunikace mezi nimi m\u00e1 prob\u00edhat p\u0159es websockety \u2013 n\u011bco jako chat, kde spojen\u00ed z\u016fst\u00e1v\u00e1 otev\u0159en\u00e9 a zpr\u00e1vy te\u010dou ob\u011bma sm\u011bry v re\u00e1ln\u00e9m \u010dase.

    Projekt u\u017e nen\u00ed \u00fapln\u011b od nuly. Martin m\u00e1 p\u0159ipraven\u00fd z\u00e1klad a my ho budeme postupn\u011b rozv\u00edjet. Role si rozd\u011bl\u00edme tak, aby to p\u0159ipom\u00ednalo \u201enastoupen\u00ed do rozjet\u00e9ho projektu\u201c.

    "},{"location":"2026-02-05-prvni-sraz/#architektura-projektu","title":"Architektura projektu","text":"

    Cel\u00e9 je to rozd\u011blen\u00e9 do n\u011bkolika repozit\u00e1\u0159\u016f:

    "},{"location":"2026-02-05-prvni-sraz/#quiz-admin","title":"Quiz Admin","text":"

    Na\u010d\u00edt\u00e1 kv\u00edz z YAMLu, kontroluje ho, pos\u00edl\u00e1 ot\u00e1zky a vyhodnocuje odpov\u011bdi. Pou\u017e\u00edv\u00e1 ho \u201eu\u010ditel\u201c.

    "},{"location":"2026-02-05-prvni-sraz/#quiz-server","title":"Quiz Server","text":"

    Zaji\u0161\u0165uje websocketov\u00e9 spojen\u00ed mezi adminem a klienty.

    "},{"location":"2026-02-05-prvni-sraz/#quiz-client","title":"Quiz Client","text":"

    To, co spou\u0161t\u00ed hr\u00e1\u010di.

    Nejd\u0159\u00edv jsme si v\u0161echno naklonovaly, rozb\u011bhly server pomoc\u00ed n\u00e1stroje uv (takov\u00fd \u0161v\u00fdcarsk\u00fd no\u017e\u00edk ve sv\u011bt\u011b Pythonu) a pak postupn\u011b i admina a klienta. P\u0159ipojovaly jsme se zat\u00edm jen lok\u00e1ln\u011b \u2013 vlastn\u011b samy na sebe.

    A pak p\u0159i\u0161el ten hezk\u00fd moment: na jednom termin\u00e1lu b\u011b\u017e\u00ed server, na druh\u00e9m admin, na t\u0159et\u00edm klient. V adminovi po\u0161lu dal\u0161\u00ed ot\u00e1zku, na klientovi se objev\u00ed, odpov\u00edm\u2026 a na serveru vid\u00edm log, \u017ee to opravdu proteklo s\u00edt\u00ed. Mal\u00fd wow efekt, kdy\u017e si \u010dlov\u011bk uv\u011bdom\u00ed, \u017ee se tam asynchronn\u011b d\u011bje v\u00edc v\u011bc\u00ed najednou.

    "},{"location":"2026-02-05-prvni-sraz/#ukazka-z-praxe","title":"Uk\u00e1zka z praxe","text":"

    Admin Send 'y' for the next question

    Client Question: This question has two correct answers: C and D Answer: C

    Server Client papricie sent: {'answer': 'C'}

    Fungovalo to skoro v\u0161em, jen jedn\u00e9 \u00fa\u010dastnici se komunikaci nepoda\u0159ilo rozb\u011bhnout, tak\u017ee celkov\u011b velk\u00fd \u00fasp\u011bch.

    Do budoucna budeme pracovat i s dal\u0161\u00edm repozit\u00e1\u0159em common, kde jsou sd\u00edlen\u00e9 \u010d\u00e1sti k\u00f3du, a s knihovnami jako Pydantic na modely a validaci dat. Cel\u00fd projekt je z\u00e1m\u011brn\u011b postaven\u00fd trochu slo\u017eit\u011bji, ne\u017e by bylo nutn\u00e9 \u2013 c\u00edlem je osahat si v\u011bci, kter\u00e9 se v b\u011b\u017en\u00fdch tutori\u00e1lech moc ne\u0159e\u0161\u00ed: OOP, architekturu, verze, issues na GitHubu, t\u00fdmovou spolupr\u00e1ci.

    Na GitHubu u\u017e m\u00e1me i projektovou tabulku s \u00fakoly (TODO / In progress / Done), tak\u017ee si opravdu hrajeme na \u201emal\u00fd software t\u00fdm\u201c.

    Zat\u00edm jsme hlavn\u011b rozb\u011bhly infrastrukturu. Te\u010f u\u017e n\u00e1s \u010dek\u00e1 ta z\u00e1bavn\u011bj\u0161\u00ed \u010d\u00e1st: pochopit, jak to cel\u00e9 funguje uvnit\u0159, a postupn\u011b z toho ud\u011blat skute\u010dn\u00fd kv\u00edz.

    "},{"location":"2026-02-12-druhy-sraz/","title":"Druh\u00fd sraz","text":"

    2026-02-12

    Lektor: Martin Zelen\u00fd

    Z\u00e1pis: Patricie Hermanov\u00e1

    Na druh\u00e9m srazu jsme plynule nav\u00e1zali tam, kde jsme minule skon\u010dili. Zat\u00edmco prvn\u00ed setk\u00e1n\u00ed bylo hlavn\u011b o sezn\u00e1men\u00ed s projektem a jeho strukturou, tentokr\u00e1t jsme se za\u010dali v\u00edce no\u0159it do re\u00e1ln\u00e9ho workflow, pr\u00e1ce s repozit\u00e1\u0159em a samotn\u00e9ho k\u00f3du.

    Postupn\u011b se za\u010dal odkr\u00fdvat cel\u00fd mechanismus fungov\u00e1n\u00ed projektu \u2013 od GitHub issues, p\u0159es YAML strukturu kv\u00edzu, a\u017e po prvn\u00ed kontakt s knihovnou Pydantic a asynchronn\u00ed komunikac\u00ed.

    "},{"location":"2026-02-12-druhy-sraz/#ohlednuti-za-domaci-pripravou-a-plan-do-budoucna","title":"Ohl\u00e9dnut\u00ed za dom\u00e1c\u00ed p\u0159\u00edpravou a pl\u00e1n do budoucna","text":"

    Na za\u010d\u00e1tku jsme si shrnuli dom\u00e1c\u00ed p\u0159\u00edpravu, kterou Martin sd\u00edlel. T\u00e9matem bylo p\u0159edev\u0161\u00edm objektov\u011b orientovan\u00e9 programov\u00e1n\u00ed (OOP), kter\u00e9 tvo\u0159\u00ed z\u00e1klad struktury na\u0161eho projektu.

    Z\u00e1rove\u0148 jsme dostali n\u00e1stin toho, co n\u00e1s \u010dek\u00e1 d\u00e1l. Kl\u00ed\u010dovou roli bude hr\u00e1t knihovna Pydantic, kter\u00e1 slou\u017e\u00ed k validaci dat a jejich p\u0159evodu do objektov\u00e9 struktury. Pr\u00e1v\u011b d\u00edky n\u00ed bude mo\u017en\u00e9 bezpe\u010dn\u011b na\u010d\u00edtat a kontrolovat data kv\u00edzu.

    "},{"location":"2026-02-12-druhy-sraz/#github-projects-a-prace-s-issues","title":"GitHub Projects a pr\u00e1ce s issues","text":"

    Dal\u0161\u00ed \u010d\u00e1st setk\u00e1n\u00ed byla v\u011bnov\u00e1na organizaci pr\u00e1ce na GitHubu. Pro\u0161li jsme projektovou tabulku s \u00fakoly, kde se uk\u00e1zalo, \u017ee p\u0159ehled ve form\u011b tabulky je v\u00fdrazn\u011b prakti\u010dt\u011bj\u0161\u00ed ne\u017e z\u00e1kladn\u00ed seznam.

    Byly ud\u011blena pochvala za n\u00e1vrh Issue od \u00fa\u010dastnice \u2013 p\u0159id\u00e1n\u00ed sloupce \u201eIdeas\u201c, kter\u00fd slou\u017e\u00ed jako vstupn\u00ed bod pro nov\u00e9 n\u00e1pady je\u0161t\u011b p\u0159ed jejich zpracov\u00e1n\u00edm do konkr\u00e9tn\u00edho \u00fakolu.

    Uk\u00e1zalo se tak\u00e9, \u017ee mezi stavy \u201eIn progress\u201c a \u201eDone\u201c d\u00e1v\u00e1 smysl m\u00edt je\u0161t\u011b mezistav. Dokon\u010den\u00fd \u00fakol toti\u017e nemus\u00ed b\u00fdt automaticky schv\u00e1len\u00fd a mergnut\u00fd. Tento krok je d\u016fle\u017eit\u00fd pro zachov\u00e1n\u00ed kvality a kontroly nad zm\u011bnami.

    Postupn\u011b jsme pro\u0161li jednotliv\u00e9 \u00fakoly, zkontrolovali jejich p\u0159i\u0159azen\u00ed a pojmenov\u00e1n\u00ed, a ujistili se, \u017ee m\u00e1 ka\u017ed\u00fd jasno, na \u010dem pracuje nebo by pracovat mohl.

    "},{"location":"2026-02-12-druhy-sraz/#git-v-praxi-branche-merge-squash-a-rebase","title":"Git v praxi: branche, merge, squash a rebase","text":"

    Velmi cenn\u00e1 byla praktick\u00e1 uk\u00e1zka pr\u00e1ce s Git workflow na konkr\u00e9tn\u00edch p\u0159\u00edkladech.

    Uk\u00e1zali jsme si, co znamen\u00e1:

    D\u016fraz byl kladen tak\u00e9 na spr\u00e1vn\u00e9 pojmenov\u00e1n\u00ed v\u011btv\u00ed, ide\u00e1ln\u011b v\u010detn\u011b vlastn\u00edch inici\u00e1l, aby bylo v\u017edy jasn\u00e9, kdo je autorem zm\u011bny.

    Narazili jsme i na situaci, kdy bylo pot\u0159eba pou\u017e\u00edt rebase, proto\u017ee zm\u011bny spolu logicky nesouvisely. I to je sou\u010d\u00e1st re\u00e1ln\u00e9 pr\u00e1ce na projektu.

    "},{"location":"2026-02-12-druhy-sraz/#yaml-jako-format-pro-definici-kvizu","title":"YAML jako form\u00e1t pro definici kv\u00edzu","text":"

    Poprv\u00e9 jsme se detailn\u011b pod\u00edvali na strukturu samotn\u00e9ho kv\u00edzu, kter\u00fd je ulo\u017een ve form\u00e1tu YAML.

    YAML je jednoduch\u00fd textov\u00fd form\u00e1t zalo\u017een\u00fd na dvojic\u00edch kl\u00ed\u010d\u2013hodnota. D\u00edky sv\u00e9 \u010ditelnosti je ide\u00e1ln\u00ed pro definici strukturovan\u00fdch dat, jako jsou ot\u00e1zky, odpov\u011bdi nebo metadata kv\u00edzu.

    Uk\u00e1zali jsme si nap\u0159\u00edklad:

    Do budoucna se po\u010d\u00edt\u00e1 s roz\u0161\u00ed\u0159en\u00edm o r\u016fzn\u00e9 typy ot\u00e1zek, nap\u0159\u00edklad single choice nebo multiple choice.

    "},{"location":"2026-02-12-druhy-sraz/#jak-se-kviz-nacita-od-souboru-k-objektu","title":"Jak se kv\u00edz na\u010d\u00edt\u00e1: od souboru k objektu","text":"

    Velmi zaj\u00edmav\u00fd byl pohled na to, jak se data ze souboru skute\u010dn\u011b dostanou do aplikace.

    Nejprve se YAML soubor na\u010dte a p\u0159evede na Python slovn\u00edk. Ten se n\u00e1sledn\u011b p\u0159ed\u00e1 do Pydantic modelu:

    Quiz(**quiz_data)\n

    Oper\u00e1tor ** zde rozbal\u00ed slovn\u00edk na jednotliv\u00e9 argumenty. Pydantic pak:

    V\u00fdsledkem je plnohodnotn\u00fd objekt reprezentuj\u00edc\u00ed cel\u00fd kv\u00edz.

    "},{"location":"2026-02-12-druhy-sraz/#jak-se-aplikace-spousti","title":"Jak se aplikace spou\u0161t\u00ed","text":"

    Uk\u00e1zali jsme si tak\u00e9, jak se projekt spou\u0161t\u00ed pomoc\u00ed skript\u016f definovan\u00fdch v souboru pyproject.toml.

    Tento soubor obsahuje metadata o projektu a mimo jin\u00e9 definuje tzv. entry point:

    [project.scripts]\nquiz-admin = \"quiz_admin.__main__:main\"\n

    D\u00edky tomu lze aplikaci spustit p\u0159\u00edmo z p\u0159\u00edkazov\u00e9 \u0159\u00e1dky bez nutnosti ru\u010dn\u00edho spou\u0161t\u011bn\u00ed jednotliv\u00fdch soubor\u016f.

    D\u016fle\u017eitou roli zde hraje n\u00e1stroj uv, kter\u00fd se star\u00e1 o spr\u00e1vu prost\u0159ed\u00ed a instalaci z\u00e1vislost\u00ed.

    "},{"location":"2026-02-12-druhy-sraz/#prvni-setkani-s-asynchronnim-kodem","title":"Prvn\u00ed setk\u00e1n\u00ed s asynchronn\u00edm k\u00f3dem","text":"

    Na z\u00e1v\u011br jsme se dostali k jedn\u00e9 z nejpokro\u010dilej\u0161\u00edch \u010d\u00e1st\u00ed projektu \u2013 asynchronn\u00ed komunikaci.

    Server a klient spolu komunikuj\u00ed pomoc\u00ed WebSocket\u016f. To umo\u017e\u0148uje obousm\u011brnou komunikaci v re\u00e1ln\u00e9m \u010dase.

    Asynchronn\u00ed funkce jsou definov\u00e1ny pomoc\u00ed:

    async def\n

    a volaj\u00ed se pomoc\u00ed:

    await\n

    To umo\u017e\u0148uje programu obsluhovat v\u00edce \u00faloh sou\u010dasn\u011b, ani\u017e by se navz\u00e1jem blokovaly.

    Nap\u0159\u00edklad odesl\u00e1n\u00ed dat kv\u00edzu serveru m\u016f\u017ee vypadat takto:

    await ws.send(json.dumps(quiz_data))\n
    "},{"location":"2026-02-12-druhy-sraz/#kam-smerujeme-dal","title":"Kam sm\u011b\u0159ujeme d\u00e1l","text":"

    Druh\u00fd sraz byl v\u00fdznamn\u00fdm krokem od teorie k praxi. Za\u010dali jsme ch\u00e1pat nejen strukturu projektu, ale i principy, na kter\u00fdch stoj\u00ed.

    Postupn\u011b se skl\u00e1d\u00e1 obraz cel\u00e9 aplikace \u2013 od YAML souboru p\u0159es validaci dat a\u017e po komunikaci mezi klientem a serverem.

    "},{"location":"2026-02-19-treti-sraz/","title":"T\u0159et\u00ed sraz","text":"

    2026-02-19

    Lektor: Martin Zelen\u00fd

    Z\u00e1pis: Patricie Hermanov\u00e1

    T\u0159et\u00ed sraz za\u010dal kontrolou na\u0161\u00ed n\u00e1st\u011bnky a kr\u00e1tk\u00fdm ohl\u00e9dnut\u00edm za t\u00edm, co se od minule zm\u011bnilo. Super byl moment, kdy jsme si uk\u00e1zali n\u00e1\u0161 Quiz CLI blog \u2014 kone\u010dn\u011b b\u011b\u017e\u00ed. Po v\u0161ech boj\u00edch s MkDocs, v\u011btvemi a GitHub Pages to byl mal\u00fd, ale d\u016fle\u017eit\u00fd miln\u00edk. U\u017e to cel\u00e9 nen\u00ed jen cvi\u010den\u00ed, ale skute\u010dn\u00fd projekt, kter\u00fd za\u010dal ve\u0159ejn\u011b existovat.

    "},{"location":"2026-02-19-treti-sraz/#issue-pr-nastenka-a-proc-na-poradi-zalezi","title":"Issue, PR, n\u00e1st\u011bnka a pro\u010d na po\u0159ad\u00ed z\u00e1le\u017e\u00ed","text":"

    Martin se kr\u00e1tce vr\u00e1til k tomu, jak spr\u00e1vn\u011b vytv\u00e1\u0159et zm\u011bny v projektu.

    Spr\u00e1vn\u00fd postup je:

    1. vytvo\u0159it issue
    2. vytvo\u0159it si branch
    3. ud\u011blat zm\u011bny
    4. otev\u0159\u00edt pull request

    Ne naopak.

    Tohle byla p\u0159esn\u011b chyba, kterou jsem ud\u011blala u sv\u00e9ho \u201esync fix\u201c PR \u2014 \u0161la jsem rovnou na pull request bez issue. Nav\u00edc jsem se pokou\u0161ela zm\u011bnit zdroj pravdy v mainu na GitHubu, velmi dobr\u00e9 pou\u010den\u00ed.

    Mezit\u00edm se na n\u00e1st\u011bnce objevily dv\u011b nov\u00e9 kolonky:

    Tohle d\u00e1v\u00e1 mnohem v\u011bt\u0161\u00ed smysl. Hotovo toti\u017e neznamen\u00e1 automaticky za\u010dlen\u011bno.

    "},{"location":"2026-02-19-treti-sraz/#merge-uz-neni-magie","title":"Merge u\u017e nen\u00ed magie","text":"

    Dote\u010f pro m\u011b byl merge n\u011bco, co d\u011blal Martin, nebo kdokoliv jin\u00fd. Te\u010f jsme si ale vysv\u011btlili, \u017ee merge budeme d\u011blat samy. U blogu to bylo tedy v\u00fdjime\u010dn\u00e9, proto\u017ee bylo pot\u0159eba ho rychle dostat online a ov\u011b\u0159it, \u017ee funguje.

    Martin n\u00e1m uk\u00e1zal dva typy merge:

    Squash and merge

    Rebase and merge

    "},{"location":"2026-02-19-treti-sraz/#conventional-commits-kdyz-commit-neco-rika","title":"Conventional commits: kdy\u017e commit n\u011bco \u0159\u00edk\u00e1","text":"

    Dal\u0161\u00ed v\u011bc, kterou jsme si ukazovali, jsou tzv. conventional commits.

    Nap\u0159\u00edklad: - chore: remove unused library - docs: improve README formatting

    Prefix \u0159\u00edk\u00e1, o jak\u00fd typ zm\u011bny jde. Nejde jen o po\u0159\u00e1dek. Jde o komunikaci. Kdy\u017e se n\u011bkdo pod\u00edv\u00e1 do historie, okam\u017eit\u011b v\u00ed, co se zm\u011bnilo.

    "},{"location":"2026-02-19-treti-sraz/#vetve-se-po-merge-mazou","title":"V\u011btve se po merge ma\u017eou","text":"

    Po \u00fasp\u011b\u0161n\u00e9m merge je dobr\u00e1 praxe:

    Repozit\u00e1\u0159 tak z\u016fst\u00e1v\u00e1 p\u0159ehledn\u00fd.

    Uk\u00e1zali jsme si i u\u017eite\u010dn\u00e9 p\u0159\u00edkazy, n\u011bkter\u00e9 zn\u00e1m\u00e9, jin\u00e9 nov\u00e9:

    git branch\ngit branch -vva\ngit remote -vv\ngit fetch --prune\ngit status\ngit pull\ngit log\n
    "},{"location":"2026-02-19-treti-sraz/#ideas-opravdu-funguji","title":"Ideas opravdu funguj\u00ed","text":"

    Nov\u00fd sloupec Ideas byl hned vyzkou\u0161en v praxi. N\u00e1pad se vytvo\u0159il jako issue, pro\u0161el procesem a nakonec skon\u010dil jako Done. Je zaj\u00edmav\u00e9 sledovat, jak se z pouh\u00e9 my\u0161lenky st\u00e1v\u00e1 konkr\u00e9tn\u00ed zm\u011bna v projektu.

    "},{"location":"2026-02-19-treti-sraz/#host-karolina-a-jeji-povidni-o-roboprojektu","title":"Host: Karol\u00edna a jej\u00ed pov\u00eddn\u00ed o RoboProjektu","text":"

    Karol\u00edna n\u00e1m p\u0159edstavila RoboProjekt, kter\u00fd je inspirac\u00ed pro na\u0161e hran\u00ed si na pr\u00e1ci. Jde p\u016fvodn\u011b o deskovou hrou, tu p\u0159ed p\u00e1r lety s dal\u0161\u00edmi \u00fa\u010dastnicemi Pyladies kurz\u016f p\u0159evedly do programu.

    Jejich projekt, narozd\u00edl od na\u0161eho, m\u011bl grafick\u00e9 rozhran\u00ed vytvo\u0159en\u00e9 v Inkscape a mapy ulo\u017een\u00e9 v JSON souborech. Pracovaly i trochu jinak ne\u017e my \u2014 pou\u017e\u00edvaly forky, ne jeden spole\u010dn\u00fd repozit\u00e1\u0159. Nav\u00edc za\u010d\u00ednaly \u00fapln\u011b od nuly, my pracujeme u\u017e s hrubou kostrou projektu.

    Nejd\u016fle\u017eit\u011bj\u0161\u00ed skill, kter\u00fd si odnesly?

    Git.

    A taky schopnost:

    Karol\u00edna zd\u016fraznila jednu d\u016fle\u017eitou v\u011bc:

    Je norm\u00e1ln\u00ed nerozum\u011bt. D\u016fle\u017eit\u00e9 je um\u011bt se pt\u00e1t.

    Nakonec z\u016fstaly na projektu dv\u011b \u00fa\u010dastnice. Dnes spolu pracuj\u00ed v Red Hatu.

    "},{"location":"2026-02-19-treti-sraz/#gitova-historie-jako-pribeh","title":"Gitov\u00e1 historie jako p\u0159\u00edb\u011bh","text":"

    Dal\u0161\u00ed d\u016fle\u017eit\u00e1 my\u0161lenka \u2013 commity by m\u011bly tvo\u0159it smyslupln\u00fd p\u0159\u00edb\u011bh.

    Projekt by m\u011bl b\u00fdt v ka\u017ed\u00e9m bod\u011b funk\u010dn\u00ed. To je profesion\u00e1ln\u00ed p\u0159\u00edstup.

    "},{"location":"2026-02-19-treti-sraz/#zaverem-ukazky-a-napady","title":"Z\u00e1v\u011brem uk\u00e1zky a n\u00e1pady","text":"

    Ukazovali jsme si zaj\u00edmav\u00e9 issue, kter\u00e9 n\u00e1m vis\u00ed na n\u00e1st\u011bnce. Pydantic automaticky p\u0159ev\u00e1d\u00ed \u010d\u00edsla na integer, ale n\u00e1\u0161 k\u00f3d o\u010dek\u00e1val string. V\u00fdsledkem byla chyba. \u0158e\u0161en\u00edm by mohlo b\u00fdt t\u0159eba p\u0159etypov\u00e1n\u00ed, \u00faprava podm\u00ednky nebo pou\u017eit\u00ed JSON schema.

    D\u016fle\u017eit\u00e1 pozn\u00e1mka \u2013 program by nem\u011bl spol\u00e9hat na to, \u017ee u\u017eivatel ud\u011bl\u00e1 v\u0161e p\u0159esn\u011b spr\u00e1vn\u011b a tak\u00e9 by m\u011bl b\u00fdt otev\u0159en\u00fd budouc\u00edm zm\u011bn\u00e1m.

    Quiz je definovan\u00fd v YAML souboru. Do budoucna tedy m\u016f\u017ee obsahovat dal\u0161\u00ed polo\u017eky, nap\u0159\u00edklad:

    Projekt za\u010d\u00edn\u00e1 b\u00fdt skute\u010dn\u00fd. T\u0159et\u00ed sraz byl zlomov\u00fd. Git p\u0159est\u00e1v\u00e1 b\u00fdt nep\u0159\u00edtel.

    "},{"location":"2026-02-26-ctvrty-sraz/","title":"\u010ctvrt\u00fd sraz","text":"

    2026-02-26

    Lektor: Martin Zelen\u00fd

    Z\u00e1pis: Veronika Vrbkov\u00e1

    Vysv\u011btlovali jsme si logiku kv\u00edzu. Proch\u00e1zeli jsme \u010d\u00e1st admin a klient a \u0159ekli si n\u011bjak\u00e1 kv\u00edzov\u00e1 omezen\u00ed, kter\u00e1 zat\u00edm m\u00e1me. Pak jsme se p\u0159esunuli na Pyvo do Artbaru.

    "},{"location":"2026-02-26-ctvrty-sraz/#spusteni-aneb-jake-repo-pustit-driv","title":"Spu\u0161t\u011bn\u00ed aneb jak\u00e9 repo pustit d\u0159\u00edv","text":"

    Nejd\u0159\u00edv si spou\u0161t\u00edme server. Ke spu\u0161t\u011bn\u00ed serveru pou\u017e\u00edv\u00e1me UV - p\u0159\u00edkaz uv run. - uv = hlavn\u00ed command - run = subcommand (spust\u00ed n\u00e1stroj nebo aplikaci)

    Pak jsme spustili quiz-admin pomoc\u00ed quiz-admin localhost:8000 .\\data\\quiz_example.yaml - pokud p\u0159\u00edkaz nen\u00ed nalezen, sta\u010d\u00ed doplnit uv run: uv run quiz-admin localhost:8000 .\\data\\quiz_example.yaml

    Nakonec jsme si spustili quiz-client.

    Pokud klient nezad\u00e1 jm\u00e9no hned, aplikace se zept\u00e1, p\u0159: quiz-client localhost:8000 Choose your name:

    Kdy\u017e klient vyp\u00ed\u0161e jm\u00e9no, tak se n\u00e1m pak na admin prop\u00ed\u0161ou p\u0159ihl\u00e1\u0161en\u00ed hr\u00e1\u010di. Dozv\u011bd\u011bli jsme se, \u017ee typick\u00e1 jm\u00e9na pro IT verze b\u00fdvaj\u00ed Alice a Bob.

    Testovac\u00ed kv\u00edzov\u00e9 ot\u00e1zky m\u00e1me zat\u00edm jen 2. K jejich tvorb\u011b budeme vyu\u017e\u00edvat YAML.

    "},{"location":"2026-02-26-ctvrty-sraz/#jak-se-deje-kviz","title":"Jak se d\u011bje kv\u00edz","text":"
    1. Admin ode\u0161le ot\u00e1zku na server pomoc\u00ed y
    2. Server po\u0161le ot\u00e1zku ke klient\u016fm
    3. Klienti odpov\u00eddaj\u00ed
    4. Server registruje odpov\u011bdi, ale zat\u00edm je nevyhodnocuje!
    5. Admin znovu po\u0161le ot\u00e1zku y, pos\u00edl\u00e1 se p\u0159es server klient\u016fm dal\u0161\u00ed ot\u00e1zka.
    6. Klienti odpov\u00eddaj\u00ed.
    7. Kv\u00edz se ukon\u010d\u00ed, jakmile se odpov\u00ed na posledn\u00ed ot\u00e1zku (v na\u0161em p\u0159\u00edpad\u011b po zodpov\u011bezen\u00ed druh\u00e9 ot\u00e1zky). Po zodpov\u011bzen\u00ed server odpoj\u00ed klienty.
    8. Pak se v\u00fdsledky v JSON po\u0161lou adminovi.
    9. Admin se n\u00e1sledn\u011b tak\u00e9 odpoj\u00ed. Konec.

    Form\u00e1tov\u00e1n\u00ed v\u00fdsledk\u016f JSON Budeme je form\u00e1tovat pomoc\u00ed jq - Instalace jq na Windows >> winget install jqlang.jq - Samotn\u00e9 form\u00e1tov\u00e1n\u00ed v\u00fdsledk\u016f pak vypad\u00e1 takto: '[{\"player\":\"alice\",\"question_number\":0,\"answer\":\"a\",\"correct\":true},{\"player\":\"bob\",\"question_number\":0,\"answer\":\"b\",\"correct\":true},{\"player\":\"alice\",\"question_number\":1,\"answer\":\"cd\",\"correct\":true},{\"player\":\"bob\",\"question_number\":1,\"answer\":\"blabla\",\"correct\":true}]' | jq

    "},{"location":"2026-02-26-ctvrty-sraz/#vysvetlujeme-si-klienta-client","title":"Vysv\u011btlujeme si klienta (client)","text":"

    Potom jsme si otev\u0159eli soubory k projektu ve VS Code. Otev\u0159eli jsme si samostatn\u00e1 okna pro server - client - admin.

    Klient zavol\u00e1 asynchronn\u011b send and receive messages. T\u00edm se vytvo\u0159\u00ed websocket spojen\u00ed na to url. P\u0159ij\u00edm\u00e1n\u00ed a odpov\u00edd\u00e1n\u00ed na ot\u00e1zky je asynchronn\u00ed a tedy korutinn\u00ed.

    P\u0159i prvn\u00edm spojen\u00ed si tak\u00e9 vytv\u00e1\u0159\u00edme ID klienta p\u0159es jeho odpov\u011b\u010f na ot\u00e1zku na jm\u00e9no.

    Server si d\u00edky tomu pozna\u010d\u00ed, \u017ee je to ID toho dan\u00e9ho klienta a pak budou v\u0161echny odpov\u011bdi sp\u00e1rovan\u00e9 p\u0159es to ID. await ws.send(json.dumps({\"client_id\": client_id, \"answer\": user_input}))

    Klient p\u0159ij\u00edm\u00e1 ot\u00e1zky ze serveru permanentn\u011b. Kdy\u017e admin za\u0161le ot\u00e1zku, tak se zobraz\u00ed u klienta, ten na ot\u00e1zku odpov\u00edd\u00e1. Po zad\u00e1n\u00ed odpov\u011bdi se ode\u0161le JSON.

    "},{"location":"2026-02-26-ctvrty-sraz/#aktualni-omezeni","title":"Aktu\u00e1ln\u00ed omezen\u00ed:","text":"

    Kone\u010dn\u00e9 pozn\u00e1mky:

    "},{"location":"2026-03-05-paty-sraz/","title":"Quiz server","text":"

    Datum: 2026-03-05 Lektor: David Slav\u00ed\u010dek Z\u00e1pis: Hana \u0160tamberkov\u00e1

    P\u00e1t\u00fd sraz za\u010dal s men\u0161\u00edm zpo\u017ed\u011bn\u00edm kv\u016fli absenci vstupn\u00ed karty, situace se v\u0161ak rychle vy\u0159e\u0161ila.

    Hlavn\u00edm c\u00edlem lekce bylo proj\u00edt repozit\u00e1\u0159 quiz-server a vysv\u011btlit si jeho architekturu a princip fungov\u00e1n\u00ed. Na z\u00e1v\u011br lektor stru\u010dn\u011b zm\u00ednil principy agiln\u00edho v\u00fdvoje a napl\u00e1noval review pull request\u016f od Jan\u010di D.

    Na p\u0159\u00ed\u0161t\u00ed lekci bychom se m\u011bli v\u011bnovat repozit\u00e1\u0159i common.

    "},{"location":"2026-03-05-paty-sraz/#prehled-projektu-quiz-server","title":"P\u0159ehled projektu Quiz server","text":"

    Projekt je postaven jako asynchronn\u00ed WebSocket server pomoc\u00ed frameworku FastAPI.

    Repozit\u00e1\u0159 obsahuje dva hlavn\u00ed Python moduly:

    main.py\nmodels.py\n
    "},{"location":"2026-03-05-paty-sraz/#modul-modelspy","title":"Modul models.py","text":"

    Modul obsahuje dom\u00e9nov\u00e9 modely aplikace \u2013 reprezentaci hr\u00e1\u010d\u016f a v\u00fdsledk\u016f kv\u00edzu.

    "},{"location":"2026-03-05-paty-sraz/#class-player","title":"class Player","text":"

    T\u0159\u00edda Player reprezentuje jednoho hr\u00e1\u010de.

    Server si u hr\u00e1\u010de uchov\u00e1v\u00e1:

    T\u0159\u00edda obsahuje asynchronn\u00ed metody:

    "},{"location":"2026-03-05-paty-sraz/#class-players","title":"class Players","text":"

    T\u0159\u00edda Players:

    "},{"location":"2026-03-05-paty-sraz/#class-results","title":"class Results","text":"

    T\u0159\u00edda Results slou\u017e\u00ed pro pr\u00e1ci s v\u00fdsledky kv\u00edzu.

    Obsahuje metody:

    Pou\u017e\u00edv\u00e1 se tak\u00e9 ClassVar.

    "},{"location":"2026-03-05-paty-sraz/#modul-mainpy","title":"Modul main.py","text":"

    V modulu main.py se inicializuje stav aplikace:

    app.state.players = Players()\napp.state.results = Results()\n
    "},{"location":"2026-03-05-paty-sraz/#websocket-endpoint-connectplayer_name","title":"WebSocket endpoint /connect/{player_name}","text":"

    Tento endpoint slou\u017e\u00ed pro p\u0159ipojen\u00ed hr\u00e1\u010d\u016f ke kv\u00edzu.

    Po p\u0159ipojen\u00ed server:

    Odpojen\u00ed hr\u00e1\u010de je o\u0161et\u0159eno pomoc\u00ed bloku try / except.

    "},{"location":"2026-03-05-paty-sraz/#websocket-endpoint-admin","title":"WebSocket endpoint /admin","text":"

    Endpoint slou\u017e\u00ed pro p\u0159ipojen\u00ed administr\u00e1tora kv\u00edzu.

    Po p\u0159ipojen\u00ed:

    V\u00fdpadek administr\u00e1tora je o\u0161et\u0159en a zaznamen\u00e1n do logu.

    "},{"location":"2026-03-05-paty-sraz/#nove-pojmy","title":"Nov\u00e9 pojmy","text":"
    dict2 = {\"c\": 3, **dict1}\n

    V modulu models.py je pou\u017eito rozbalen\u00ed **result pro rozbalen\u00ed ulo\u017een\u00fdch v\u00fdsledk\u016f.

    "},{"location":"2026-03-05-paty-sraz/#agilni-vyvoj","title":"Agiln\u00ed v\u00fdvoj","text":"

    Na z\u00e1v\u011br lekce byl stru\u010dn\u011b zm\u00edn\u011bn princip agiln\u00edho v\u00fdvoje.

    Oproti d\u0159\u00edv\u011bj\u0161\u00edmu p\u0159\u00edstupu, kdy se v\u0161e pl\u00e1novalo dop\u0159edu a koncept se nem\u011bnil, se dnes pracuje iterativn\u011b:

    "},{"location":"2026-03-12-sesty-sraz/","title":"Ot\u00e1zky, issues a t\u00fdmov\u00e1 spolupr\u00e1ce","text":"

    Datum: 2026-03-12 Lektor: David Slav\u00ed\u010dek Z\u00e1pis: Pavl\u00edna V\u00e1\u0148ov\u00e1

    Dne\u0161n\u00ed sraz byl krat\u0161\u00ed ne\u017e obvykle. Zam\u011b\u0159ili jsme se hlavn\u011b na ot\u00e1zky a odpov\u011bdi k aktu\u00e1ln\u00edm issues a celkov\u00e9mu fungov\u00e1n\u00ed t\u00fdmov\u00e9 spolupr\u00e1ce na projektu. Na z\u00e1v\u011br jsme se p\u0159esunuli na NePyvo, kde m\u011bl Lud\u011bk Reif velmi zaj\u00edmavou p\u0159edn\u00e1\u0161ku o vibecodingu.

    "},{"location":"2026-03-12-sesty-sraz/#pull-requesty-a-navrhovani-zmen-v-kodu","title":"Pull requesty a navrhov\u00e1n\u00ed zm\u011bn v k\u00f3du","text":"

    Pro\u0161li jsme si, jak se navrhuj\u00ed zm\u011bny v k\u00f3du p\u0159\u00edmo na GitHubu:

    "},{"location":"2026-03-12-sesty-sraz/#issue-4-admin-receives-a-question","title":"Issue #4 \u2013 Admin receives a question","text":"

    D\u00e1le jsme si pro\u0161li issue, kde admin p\u0159ij\u00edm\u00e1 ot\u00e1zku:

    "},{"location":"2026-03-12-sesty-sraz/#repozitar-commons","title":"Repozit\u00e1\u0159 Commons","text":"

    Kr\u00e1tce jsme rozebrali repozit\u00e1\u0159 commons.

    V souboru models.py na \u0159\u00e1dku 54 (parametr question) byla nalezena chybn\u00e1 specifikace typu dict. David navrhuje opravu typu \u2013 lze ji zadat p\u0159\u00edmo jako commit suggestion v r\u00e1mci code review.

    "},{"location":"2026-03-12-sesty-sraz/#kategorizace-navrhu-pri-code-review","title":"Kategorizace n\u00e1vrh\u016f p\u0159i code review","text":"

    David p\u0159edstavil syst\u00e9m, kter\u00fd pou\u017e\u00edv\u00e1 v pr\u00e1ci p\u0159i posuzov\u00e1n\u00ed n\u00e1vrh\u016f podle z\u00e1va\u017enosti:

    "},{"location":"2026-03-12-sesty-sraz/#appstate-ve-fastapi","title":"app.state ve FastAPI","text":"

    Padl dotaz, co vlastn\u011b je app.state ve FastAPI. T\u00e9ma by m\u011blo b\u00fdt dovysv\u011btleno p\u0159\u00ed\u0161t\u011b.

    "},{"location":"2026-03-12-sesty-sraz/#jak-se-vyhnout-merge-konfliktum","title":"Jak se vyhnout merge konflikt\u016fm","text":"

    Pro\u0161li jsme si projektovou tabulku (Quiz CLI issues table) a zam\u00fd\u0161leli se nad t\u00edm, kdy by m\u011blo issue p\u0159ej\u00edt ze stavu New/Idea do stavu Todo.

    "},{"location":"2026-03-12-sesty-sraz/#viceodpovedove-otazky-a-bodovani","title":"V\u00edceodpov\u011b\u010fov\u00e9 ot\u00e1zky a bodov\u00e1n\u00ed","text":"

    T\u00fdm se shodl, \u017ee je nejprve pot\u0159eba rozhodnout o pravidlech, a teprve pot\u00e9 implementovat:

    Zazn\u011bla tak\u00e9 z\u00e1kladn\u00ed ot\u00e1zka k povaze aplikace:

    Je to hra, nebo test?

    "}]} \ No newline at end of file diff --git a/docs/sitemap.xml.gz b/docs/sitemap.xml.gz index 00c18779126a8f5e626337aade21ea8e1efc2485..dcf25d234a9855340d8d10f9f510d7b7445a3642 100644 GIT binary patch delta 13 Ucmb=gXP58h;ApVfJ(0Zv034$PM*si- delta 13 Ucmb=gXP58h;9!VfKasrx02(3#-T(jq diff --git a/docs_src/2026-03-12-sesty-sraz.md b/docs_src/2026-03-12-sesty-sraz.md new file mode 100644 index 0000000..ac32e32 --- /dev/null +++ b/docs_src/2026-03-12-sesty-sraz.md @@ -0,0 +1,77 @@ +# Otázky, issues a týmová spolupráce + +**Datum:** 2026-03-12 +**Lektor:** David Slavíček +**Zápis:** Pavlína Váňová + +--- + +Dnešní sraz byl kratší než obvykle. Zaměřili jsme se hlavně na otázky a odpovědi k aktuálním issues a celkovému fungování týmové spolupráce na projektu. Na závěr jsme se přesunuli na NePyvo, kde měl Luděk Reif velmi zajímavou přednášku o vibecodingu. + +--- + +## Pull requesty a navrhování změn v kódu + +Prošli jsme si, jak se navrhují změny v kódu přímo na GitHubu: + +- kliknout na `+` u čísla řádku +- zvolit **Add a comment on line** + +--- + +## Issue #4 – Admin receives a question + +Dále jsme si prošli issue, kde admin přijímá otázku: + +- do projektu byla přidána knihovna `string` (konkrétně `ascii_letters`) – tato úprava byla převzata a upravena z klienta +- funkce je společná pro klienta i admina, logicky by tedy patřila do repozitáře **commons** +- commons ale zatím obsahuje pouze modely – David navrhuje přidat složku `Functions` (možná jen dočasně), aby se pull request dál neprotahoval + +--- + +## Repozitář Commons + +Krátce jsme rozebrali repozitář **commons**. + +V souboru `models.py` na řádku 54 (parametr `question`) byla nalezena chybná specifikace typu `dict`. David navrhuje opravu typu – lze ji zadat přímo jako **commit suggestion** v rámci code review. + +--- + +## Kategorizace návrhů při code review + +David představil systém, který používá v práci při posuzování návrhů podle závažnosti: + +- **Issue** – vážný problém, který je nutné vyřešit +- **Suggestion** – pouze návrh, není povinný +- **Nitpick** – drobný detail, který stojí za zmínku, ale není důležitý + +--- + +## `app.state` ve FastAPI + +Padl dotaz, co vlastně je `app.state` ve FastAPI. Téma by mělo být dovysvětleno příště. + +--- + +## Jak se vyhnout merge konfliktům + +Prošli jsme si projektovou tabulku (Quiz CLI issues table) a zamýšleli se nad tím, kdy by mělo issue přejít ze stavu **New/Idea** do stavu **Todo**. + +- procházíme issues společně, konečné rozhodnutí je na Martinovi jako správci projektu +- issue ve stavu **Todo** si může "přivlastnit" kdokoli a začít na něm pracovat + +--- + +## Víceodpověďové otázky a bodování + +Tým se shodl, že je nejprve potřeba rozhodnout o pravidlech, a teprve poté implementovat: + +- jakým způsobem se budou počítat body při více správných odpovědích +- jak se budou zaznamenávat otázky s více možnými odpověďmi + +Zazněla také základní otázka k povaze aplikace: + +> **Je to hra, nebo test?** + +- **Hra** – zaznamenává počet bodů a podle toho pořadí hráčů (srovnání: Kahoot) +- **Test** – zaznamenává, kdo na co odpověděl správně nebo špatně, a poskytuje zpětnou vazbu učiteli i studentům diff --git a/mkdocs.yml b/mkdocs.yml index 261ea79..d8c40e1 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -19,6 +19,7 @@ nav: - Třetí sraz: 2026-02-19-treti-sraz.md - Čtvrtý sraz: 2026-02-26-ctvrty-sraz.md - Pátý sraz: 2026-03-05-paty-sraz.md - # - Šestý sraz: # tady vlož odkaz na šestý sraz + - Šestý sraz: 2026-03-12-sesty-sraz.md + # - Sedmý sraz: # tady vlož odkaz na sedmý sraz