-
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:
-
b\u011b\u017e\u00ed na serveru,
-
komunikuje s klienty p\u0159es s\u00ed\u0165,
-
a funguje jako program\u00e1torsk\u00e1 alternativa ke Kahootu.
C\u00edlem ale nen\u00ed jen napsat k\u00f3d. Hlavn\u011b si chceme:
-
vyzkou\u0161et pr\u00e1ci na re\u00e1ln\u00e9m projektu v t\u00fdmu,
-
nau\u010dit se pou\u017e\u00edvat n\u00e1stroje jako GitHub, issues a pull requesty,
-
pochopit architekturu aplikace (server, klient, komunikace),
-
a neb\u00e1t se slo\u017eit\u011bj\u0161\u00edch t\u00e9mat jako asynchronn\u00ed programov\u00e1n\u00ed.
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:
-
z\u00e1pis z jednotliv\u00fdch setk\u00e1n\u00ed,
-
technick\u00e1 dokumentace projektu,
-
den\u00edk na\u0161eho u\u010den\u00ed (v\u010detn\u011b chyb a slep\u00fdch uli\u010dek),
-
a hlavn\u011b inspirace pro dal\u0161\u00ed generace PyLadies.
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:
-
odpov\u00edd\u00e1 jednomu setk\u00e1n\u00ed,
-
je napsan\u00fd v Markdownu,
-
a je verzovan\u00fd na GitHubu jako norm\u00e1ln\u00ed soubor.
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:
- vytvo\u0159en\u00ed vlastn\u00ed branche pro zm\u011bny,
- vytvo\u0159en\u00ed Pull Requestu,
- squashnut\u00ed commit\u016f pro \u010dist\u0161\u00ed historii,
- merge zm\u011bn do hlavn\u00ed v\u011btve,
- a n\u00e1sledn\u00e9 smaz\u00e1n\u00ed ji\u017e nepot\u0159ebn\u00e9 branche (jak na GitHubu, tak lok\u00e1ln\u011b).
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:
- jak YAML reprezentuje data jako slovn\u00edk,
- pro\u010d je d\u016fle\u017eit\u00e9 dodr\u017eovat spr\u00e1vnou strukturu,
- a jak\u00e9 chyby mohou vzniknout nap\u0159\u00edklad p\u0159i nespr\u00e1vn\u00e9m pou\u017eit\u00ed dvojte\u010dky.
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:
- zkontroluje spr\u00e1vnost dat,
- p\u0159evede je do objektu,
- a zajist\u00ed, \u017ee maj\u00ed spr\u00e1vnou strukturu.
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:
- vytvo\u0159it issue
- vytvo\u0159it si branch
- ud\u011blat zm\u011bny
- 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:
- Ideas \u2013 m\u00edsto pro n\u00e1pady, kter\u00e9 je\u0161t\u011b nejsou p\u0159ipraven\u00e9 na realizaci
- In review \u2013 mezistav mezi \u201ehotovo\u201c a \u201emerge do main\u201c
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
- Pou\u017e\u00edv\u00e1 se, kdy\u017e commity pat\u0159\u00ed k sob\u011b. Slou\u010d\u00ed je do jednoho. Nap\u0159\u00edklad: fix blog formatting + fix typo in blog \u2192 vznikne jeden commit.
Rebase and merge
- Pou\u017e\u00edv\u00e1 se, kdy\u017e commity maj\u00ed vlastn\u00ed v\u00fdznam. Zachovaj\u00ed se oba. Tohle je d\u016fle\u017eit\u00e9 pro \u010ditelnost historie projektu.
"},{"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:
- smazat branch na GitHubu
- smazat branch lok\u00e1ln\u011b
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:
- \u010d\u00edst ciz\u00ed k\u00f3d
- p\u0159ij\u00edmat zp\u011btnou vazbu
- pt\u00e1t se
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.
- NE: \u201eUd\u011blala jsem tis\u00edc v\u011bc\u00ed najednou.\u201c
- ANO: jedna zm\u011bna = jeden commit
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:
- ID ot\u00e1zky
- bodov\u00e1n\u00ed
- timer
- typ ot\u00e1zky
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":" - Admin ode\u0161le ot\u00e1zku na server pomoc\u00ed y
- Server po\u0161le ot\u00e1zku ke klient\u016fm
- Klienti odpov\u00eddaj\u00ed
- Server registruje odpov\u011bdi, ale zat\u00edm je nevyhodnocuje!
- Admin znovu po\u0161le ot\u00e1zku y, pos\u00edl\u00e1 se p\u0159es server klient\u016fm dal\u0161\u00ed ot\u00e1zka.
- Klienti odpov\u00eddaj\u00ed.
- 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.
- Pak se v\u00fdsledky v JSON po\u0161lou adminovi.
- 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":" - M\u00e1me jen 2 ot\u00e1zky, dopln\u00edme dal\u0161\u00ed.
- M\u00e1me variantu ot\u00e1zky jen na a-b-c
- Klienti mohou odpov\u00eddat i mimo aktivn\u00ed ot\u00e1zku, ale odpov\u011b\u010f se nezaznamen\u00e1.
- Admin nevid\u00ed po\u010det hr\u00e1\u010d\u016f, kte\u0159\u00ed u\u017e odpov\u011bd\u011bli (nap\u0159. 4 ze 7).
- Nem\u00e1me hodnocen\u00ed odpov\u011bd\u00ed - padl n\u00e1vrh ud\u011blat kontrolu odpov\u011bd\u00ed tzn. kdyby zadan\u00e1 odpov\u011b\u010f nebyla v nab\u00eddce, m\u011bli bychom hr\u00e1\u010de upozornit.
Kone\u010dn\u00e9 pozn\u00e1mky:
- Mus\u00edme se starat o logiku hry.
- Mo\u017en\u00e1 funkci def print_question p\u0159id\u00e1me do quiz-common, aby to bylo mo\u017en\u00e9 pro v\u00edce komponent\u016f.
- Pak jsme se p\u0159esunuli na Pyvo, kde m\u011bla p\u0159edn\u00e1\u0161ku Veronika Kab\u00e1tov\u00e1 z RedHat o tom, jak\u00e9 to je v IT a jak se posunovat na \u017eeb\u0159\u00ed\u010dku v\u00fd\u0161.
"}]}
+{"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:
-
b\u011b\u017e\u00ed na serveru,
-
komunikuje s klienty p\u0159es s\u00ed\u0165,
-
a funguje jako program\u00e1torsk\u00e1 alternativa ke Kahootu.
C\u00edlem ale nen\u00ed jen napsat k\u00f3d. Hlavn\u011b si chceme:
-
vyzkou\u0161et pr\u00e1ci na re\u00e1ln\u00e9m projektu v t\u00fdmu,
-
nau\u010dit se pou\u017e\u00edvat n\u00e1stroje jako GitHub, issues a pull requesty,
-
pochopit architekturu aplikace (server, klient, komunikace),
-
a neb\u00e1t se slo\u017eit\u011bj\u0161\u00edch t\u00e9mat jako asynchronn\u00ed programov\u00e1n\u00ed.
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:
-
z\u00e1pis z jednotliv\u00fdch setk\u00e1n\u00ed,
-
technick\u00e1 dokumentace projektu,
-
den\u00edk na\u0161eho u\u010den\u00ed (v\u010detn\u011b chyb a slep\u00fdch uli\u010dek),
-
a hlavn\u011b inspirace pro dal\u0161\u00ed generace PyLadies.
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:
-
odpov\u00edd\u00e1 jednomu setk\u00e1n\u00ed,
-
je napsan\u00fd v Markdownu,
-
a je verzovan\u00fd na GitHubu jako norm\u00e1ln\u00ed soubor.
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:
- vytvo\u0159en\u00ed vlastn\u00ed branche pro zm\u011bny,
- vytvo\u0159en\u00ed Pull Requestu,
- squashnut\u00ed commit\u016f pro \u010dist\u0161\u00ed historii,
- merge zm\u011bn do hlavn\u00ed v\u011btve,
- a n\u00e1sledn\u00e9 smaz\u00e1n\u00ed ji\u017e nepot\u0159ebn\u00e9 branche (jak na GitHubu, tak lok\u00e1ln\u011b).
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:
- jak YAML reprezentuje data jako slovn\u00edk,
- pro\u010d je d\u016fle\u017eit\u00e9 dodr\u017eovat spr\u00e1vnou strukturu,
- a jak\u00e9 chyby mohou vzniknout nap\u0159\u00edklad p\u0159i nespr\u00e1vn\u00e9m pou\u017eit\u00ed dvojte\u010dky.
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:
- zkontroluje spr\u00e1vnost dat,
- p\u0159evede je do objektu,
- a zajist\u00ed, \u017ee maj\u00ed spr\u00e1vnou strukturu.
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:
- vytvo\u0159it issue
- vytvo\u0159it si branch
- ud\u011blat zm\u011bny
- 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:
- Ideas \u2013 m\u00edsto pro n\u00e1pady, kter\u00e9 je\u0161t\u011b nejsou p\u0159ipraven\u00e9 na realizaci
- In review \u2013 mezistav mezi \u201ehotovo\u201c a \u201emerge do main\u201c
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
- Pou\u017e\u00edv\u00e1 se, kdy\u017e commity pat\u0159\u00ed k sob\u011b. Slou\u010d\u00ed je do jednoho. Nap\u0159\u00edklad: fix blog formatting + fix typo in blog \u2192 vznikne jeden commit.
Rebase and merge
- Pou\u017e\u00edv\u00e1 se, kdy\u017e commity maj\u00ed vlastn\u00ed v\u00fdznam. Zachovaj\u00ed se oba. Tohle je d\u016fle\u017eit\u00e9 pro \u010ditelnost historie projektu.
"},{"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:
- smazat branch na GitHubu
- smazat branch lok\u00e1ln\u011b
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:
- \u010d\u00edst ciz\u00ed k\u00f3d
- p\u0159ij\u00edmat zp\u011btnou vazbu
- pt\u00e1t se
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.
- NE: \u201eUd\u011blala jsem tis\u00edc v\u011bc\u00ed najednou.\u201c
- ANO: jedna zm\u011bna = jeden commit
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:
- ID ot\u00e1zky
- bodov\u00e1n\u00ed
- timer
- typ ot\u00e1zky
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":" - Admin ode\u0161le ot\u00e1zku na server pomoc\u00ed y
- Server po\u0161le ot\u00e1zku ke klient\u016fm
- Klienti odpov\u00eddaj\u00ed
- Server registruje odpov\u011bdi, ale zat\u00edm je nevyhodnocuje!
- Admin znovu po\u0161le ot\u00e1zku y, pos\u00edl\u00e1 se p\u0159es server klient\u016fm dal\u0161\u00ed ot\u00e1zka.
- Klienti odpov\u00eddaj\u00ed.
- 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.
- Pak se v\u00fdsledky v JSON po\u0161lou adminovi.
- 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":" - M\u00e1me jen 2 ot\u00e1zky, dopln\u00edme dal\u0161\u00ed.
- M\u00e1me variantu ot\u00e1zky jen na a-b-c
- Klienti mohou odpov\u00eddat i mimo aktivn\u00ed ot\u00e1zku, ale odpov\u011b\u010f se nezaznamen\u00e1.
- Admin nevid\u00ed po\u010det hr\u00e1\u010d\u016f, kte\u0159\u00ed u\u017e odpov\u011bd\u011bli (nap\u0159. 4 ze 7).
- Nem\u00e1me hodnocen\u00ed odpov\u011bd\u00ed - padl n\u00e1vrh ud\u011blat kontrolu odpov\u011bd\u00ed tzn. kdyby zadan\u00e1 odpov\u011b\u010f nebyla v nab\u00eddce, m\u011bli bychom hr\u00e1\u010de upozornit.
Kone\u010dn\u00e9 pozn\u00e1mky:
- Mus\u00edme se starat o logiku hry.
- Mo\u017en\u00e1 funkci def print_question p\u0159id\u00e1me do quiz-common, aby to bylo mo\u017en\u00e9 pro v\u00edce komponent\u016f.
- Pak jsme se p\u0159esunuli na Pyvo, kde m\u011bla p\u0159edn\u00e1\u0161ku Veronika Kab\u00e1tov\u00e1 z RedHat o tom, jak\u00e9 to je v IT a jak se posunovat na \u017eeb\u0159\u00ed\u010dku v\u00fd\u0161.
"},{"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:
- jm\u00e9no hr\u00e1\u010de
- informaci, zda m\u00e1 aktu\u00e1ln\u011b povoleno odpov\u00eddat (
is_allowed_answer, v\u00fdchoz\u00ed hodnota False)
T\u0159\u00edda obsahuje asynchronn\u00ed metody:
"},{"location":"2026-03-05-paty-sraz/#class-players","title":"class Players","text":"T\u0159\u00edda Players:
- uchov\u00e1v\u00e1 seznam hr\u00e1\u010d\u016f
- umo\u017e\u0148uje p\u0159id\u00e1vat a odeb\u00edrat hr\u00e1\u010de
- umo\u017e\u0148uje povolit odpov\u00edd\u00e1n\u00ed v\u0161em hr\u00e1\u010d\u016fm
- odes\u00edl\u00e1 data v\u0161em hr\u00e1\u010d\u016fm
- uzav\u00edr\u00e1 spojen\u00ed se v\u0161emi hr\u00e1\u010di
"},{"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:
- zkontroluje, zda existuje aktivn\u00ed kv\u00edz
- pokud kv\u00edz neexistuje, spojen\u00ed se uzav\u0159e a hr\u00e1\u010d je informov\u00e1n, \u017ee kv\u00edz je\u0161t\u011b neza\u010dal
- pokud kv\u00edz existuje:
- ode\u0161le jeho n\u00e1zev
- vytvo\u0159\u00ed objekt
Player
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:
- admin ode\u0161le JSON s definic\u00ed kv\u00edzu
- kv\u00edz je ulo\u017een jako objekt
Quiz
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":" %s \u2013 pou\u017e\u00edv\u00e1 se v loggerech pro vkl\u00e1d\u00e1n\u00ed prom\u011bnn\u00fdch do textu zpr\u00e1vy @property \u2013 umo\u017e\u0148uje zp\u0159\u00edstupnit metodu jako atribut pouze pro \u010dten\u00ed - podtr\u017e\u00edtko p\u0159ed n\u00e1zvem metody nebo atributu (
_metoda) zna\u010d\u00ed intern\u00ed / soukromou \u010d\u00e1st (konvence) my_instance \u2013 pokud se p\u0159ep\u00ed\u0161e atribut v hlavn\u00ed t\u0159\u00edd\u011b, zm\u011bn\u00ed se atributy ve v\u0161ech instanc\u00edch, kter\u00e9 ho samy nep\u0159episuj\u00ed - rozbalen\u00ed slovn\u00edku (
**) \u2013 umo\u017e\u0148uje rozbalit obsah jednoho slovn\u00edku do jin\u00e9ho, nap\u0159.:
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:
- pr\u00e1ce se rozd\u011bl\u00ed na men\u0161\u00ed \u010d\u00e1sti
- jednotliv\u00e9 \u010d\u00e1sti se postupn\u011b realizuj\u00ed
- pr\u016fb\u011b\u017en\u011b se vyhodnocuj\u00ed v\u00fdsledky
- ov\u011b\u0159uje se, zda se nezm\u011bnil po\u017eadovan\u00fd c\u00edl
- podle pot\u0159eby se \u0159e\u0161en\u00ed upravuje
"},{"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:
- kliknout na
+ u \u010d\u00edsla \u0159\u00e1dku - zvolit Add a comment on line
"},{"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:
- do projektu byla p\u0159id\u00e1na knihovna
string (konkr\u00e9tn\u011b ascii_letters) \u2013 tato \u00faprava byla p\u0159evzata a upravena z klienta - funkce je spole\u010dn\u00e1 pro klienta i admina, logicky by tedy pat\u0159ila do repozit\u00e1\u0159e commons
- commons ale zat\u00edm obsahuje pouze modely \u2013 David navrhuje p\u0159idat slo\u017eku
Functions (mo\u017en\u00e1 jen do\u010dasn\u011b), aby se pull request d\u00e1l neprotahoval
"},{"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:
- Issue \u2013 v\u00e1\u017en\u00fd probl\u00e9m, kter\u00fd je nutn\u00e9 vy\u0159e\u0161it
- Suggestion \u2013 pouze n\u00e1vrh, nen\u00ed povinn\u00fd
- Nitpick \u2013 drobn\u00fd detail, kter\u00fd stoj\u00ed za zm\u00ednku, ale nen\u00ed d\u016fle\u017eit\u00fd
"},{"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.
- proch\u00e1z\u00edme issues spole\u010dn\u011b, kone\u010dn\u00e9 rozhodnut\u00ed je na Martinovi jako spr\u00e1vci projektu
- issue ve stavu Todo si m\u016f\u017ee \"p\u0159ivlastnit\" kdokoli a za\u010d\u00edt na n\u011bm pracovat
"},{"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:
- jak\u00fdm zp\u016fsobem se budou po\u010d\u00edtat body p\u0159i v\u00edce spr\u00e1vn\u00fdch odpov\u011bd\u00edch
- jak se budou zaznamen\u00e1vat ot\u00e1zky s v\u00edce mo\u017en\u00fdmi odpov\u011b\u010fmi
Zazn\u011bla tak\u00e9 z\u00e1kladn\u00ed ot\u00e1zka k povaze aplikace:
Je to hra, nebo test?
- Hra \u2013 zaznamen\u00e1v\u00e1 po\u010det bod\u016f a podle toho po\u0159ad\u00ed hr\u00e1\u010d\u016f (srovn\u00e1n\u00ed: Kahoot)
- Test \u2013 zaznamen\u00e1v\u00e1, kdo na co odpov\u011bd\u011bl spr\u00e1vn\u011b nebo \u0161patn\u011b, a poskytuje zp\u011btnou vazbu u\u010diteli i student\u016fm
"}]}
\ No newline at end of file
diff --git a/docs/sitemap.xml.gz b/docs/sitemap.xml.gz
index 00c1877..dcf25d2 100644
Binary files a/docs/sitemap.xml.gz and b/docs/sitemap.xml.gz differ
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