Šest věcí, které se s časem samy nezlepší. Každá jako samostatný commit, dají se číst po částech.
Zamknout závislosti
requirements.txt byla čtyři jména bez jediné verze, takže si každá stavba stáhla to, co bylo zrovna nejnovější — binárka z dneška a binárka z příštího jara obsahovaly něco jiného a nebylo jak zjistit co. Volné seznamy jsou nově v .in, zamčené v .txt, rozdělené na běh / testy / stavbu. PyInstaller má konečně taky zamčenou verzi; ta na podobu výsledku sahá ze všech nejvíc.
Verze se píšou ještě jednou v hlavičce PEP 723, jinak by přestalo fungovat uv run web.py. Že se ta dvě místa neshodují, odhalí tests/test_zavislosti.py.
Verzovat schéma databáze
Dokud to běželo jen doma, šlo dice.db v nejhorším smazat. Teď jsou venku binárky, které si zakládají databázi v %LOCALAPPDATA% a v Library, a ta data patří cizím lidem — první sloupec, který přibude, na nich prostě nebude.
Verze se drží v PRAGMA user_version. Existující databáze mají nulu a plné schéma zároveň, což vychází: SCHEMA je samé IF NOT EXISTS, takže se na nich jen orazítkuje. Databázi z novější verze aplikace radši odmítneme otevřít, než abychom ji tiše rozbili.
Binárka má vědět, která je
kostky --version, verze v úvodní hlášce a v patičce každé stránky. build.sh ji vezme z git describe (nebo z VERSION=…), zapíše do verze.txt a kostky.spec ji přibalí. Zkouška v obou workflow ověří, že se do binárky opravdu dostala.
Waitress místo vývojového serveru Flasku
Flask pod pěkně naformátovanou úvodní hlášku sypal červené varování, že tohle není produkční server.
Cestou se ukázala chyba, která tu byla už dřív: hláška se nikdy nedostala do přesměrovaného výstupu. Mimo konzoli drží Python výstup v bloku a pouští ho, až program skončí — jenže server neskončí. Zkouška binárky u Gitey si logovala do souboru a pak ho vypisovala, takže celou dobu tiskla prázdno. Řeší to řádkové bufferování v console.utf8().
Linuxová binárka pro ARM64
GitHub dává veřejným repozitářům běhouny ubuntu-24.04-arm zadarmo — jeden řádek do matice. Pro Raspberry Pi nebo jinou malou pořád zapnutou krabičku. x86-64 zůstává doma, kde jde stavět proti staré glibc.
Stažení databáze ze síně slávy
Z binárky se dice.db schovává do systémového datového adresáře, který na Windows běžný člověk nenajde. /export ho pošle přes prohlížeč; kopie se dělá přes VACUUM INTO, takže je použitelná i uprostřed rozehrané hry.
A ještě jedna oprava
uv venv nad existujícím prostředím skončí chybou a chce --clear. Domácí runner si pracovní adresář mezi běhy drží a git clean -fd na .build nesáhne, protože je v .gitignore — druhá stavba ve stejném adresáři tedy spadla dřív, než se stihlo cokoli postavit. Narazil jsem na to při zkoušce.
Ověřeno
Postaveno lokálně (VERSION=v1.2.0-zkouska ./build.sh) a na hotové binárce projeto:
--version hlásí vypálenou verzi
úvodní hláška je v přesměrovaném logu hned, ne až po skončení
/, /static, /board, /stats, /export odpovídají
stažená záloha je platná SQLite se všemi tabulkami
PRAGMA user_version = 1
glibc floor zůstal nízko (nejvýš GLIBC_2.14)
skriptovaná partie v terminálové verzi beze změny
118 testů zeleně (+16).
Šest věcí, které se s časem samy nezlepší. Každá jako samostatný commit, dají se číst po částech.
## Zamknout závislosti
`requirements.txt` byla čtyři jména bez jediné verze, takže si každá stavba stáhla to, co bylo zrovna nejnovější — binárka z dneška a binárka z příštího jara obsahovaly něco jiného a nebylo jak zjistit co. Volné seznamy jsou nově v `.in`, zamčené v `.txt`, rozdělené na běh / testy / stavbu. PyInstaller má konečně taky zamčenou verzi; ta na podobu výsledku sahá ze všech nejvíc.
Verze se píšou ještě jednou v hlavičce PEP 723, jinak by přestalo fungovat `uv run web.py`. Že se ta dvě místa neshodují, odhalí `tests/test_zavislosti.py`.
## Verzovat schéma databáze
Dokud to běželo jen doma, šlo `dice.db` v nejhorším smazat. Teď jsou venku binárky, které si zakládají databázi v `%LOCALAPPDATA%` a v `Library`, a ta data patří cizím lidem — první sloupec, který přibude, na nich prostě nebude.
Verze se drží v `PRAGMA user_version`. Existující databáze mají nulu a plné schéma zároveň, což vychází: `SCHEMA` je samé `IF NOT EXISTS`, takže se na nich jen orazítkuje. Databázi z novější verze aplikace radši odmítneme otevřít, než abychom ji tiše rozbili.
## Binárka má vědět, která je
`kostky --version`, verze v úvodní hlášce a v patičce každé stránky. `build.sh` ji vezme z `git describe` (nebo z `VERSION=…`), zapíše do `verze.txt` a `kostky.spec` ji přibalí. Zkouška v obou workflow ověří, že se do binárky opravdu dostala.
## Waitress místo vývojového serveru Flasku
Flask pod pěkně naformátovanou úvodní hlášku sypal červené varování, že tohle není produkční server.
**Cestou se ukázala chyba, která tu byla už dřív:** hláška se nikdy nedostala do přesměrovaného výstupu. Mimo konzoli drží Python výstup v bloku a pouští ho, až program skončí — jenže server neskončí. Zkouška binárky u Gitey si logovala do souboru a pak ho vypisovala, takže celou dobu tiskla prázdno. Řeší to řádkové bufferování v `console.utf8()`.
## Linuxová binárka pro ARM64
GitHub dává veřejným repozitářům běhouny `ubuntu-24.04-arm` zadarmo — jeden řádek do matice. Pro Raspberry Pi nebo jinou malou pořád zapnutou krabičku. x86-64 zůstává doma, kde jde stavět proti staré glibc.
## Stažení databáze ze síně slávy
Z binárky se `dice.db` schovává do systémového datového adresáře, který na Windows běžný člověk nenajde. `/export` ho pošle přes prohlížeč; kopie se dělá přes `VACUUM INTO`, takže je použitelná i uprostřed rozehrané hry.
## A ještě jedna oprava
`uv venv` nad existujícím prostředím skončí chybou a chce `--clear`. Domácí runner si pracovní adresář mezi běhy drží a `git clean -fd` na `.build` nesáhne, protože je v `.gitignore` — druhá stavba ve stejném adresáři tedy spadla dřív, než se stihlo cokoli postavit. Narazil jsem na to při zkoušce.
---
## Ověřeno
Postaveno lokálně (`VERSION=v1.2.0-zkouska ./build.sh`) a na hotové binárce projeto:
- `--version` hlásí vypálenou verzi
- úvodní hláška je v přesměrovaném logu **hned**, ne až po skončení
- `/`, `/static`, `/board`, `/stats`, `/export` odpovídají
- stažená záloha je platná SQLite se všemi tabulkami
- `PRAGMA user_version` = 1
- glibc floor zůstal nízko (nejvýš `GLIBC_2.14`)
- skriptovaná partie v terminálové verzi beze změny
118 testů zeleně (+16).
Bez zamčených verzí si každá stavba stáhne to, co je zrovna nejnovější:
binárka z dneška a binárka z příštího jara obsahují něco jiného a není jak
zjistit co. Zároveň může vydání kterékoli knihovny rozbít build, aniž by se
sáhlo na řádku kódu — a nejspíš zrovna ve chvíli, kdy se tagne release.
Volné seznamy jsou nově v `.in`, zamčené v `.txt`. Rozděleno na tři: běh,
testy a stavba. Pytest se tak přestane instalovat do prostředí, kde se
staví binárka, a PyInstaller má konečně taky zamčenou verzi — ta na podobu
výsledku sahá ze všech nejvíc.
Zůstává, že se verze píšou i v hlavičce PEP 723, jinak by přestalo fungovat
`uv run web.py`. Aby se ta dvě místa nerozešla, hlídá je test.
Dokud to běželo jen doma, šlo dice.db v nejhorším smazat. Teď jsou venku
binárky, které si zakládají databázi v %LOCALAPPDATA% a v Library, a ta data
patří cizím lidem — první sloupec, který přibude, na nich prostě nebude.
Verze se drží v PRAGMA user_version. Existující databáze mají nulu a plné
schéma zároveň, což vychází: SCHEMA je samé IF NOT EXISTS, takže se na nich
jen orazítkuje a nic se neztratí.
Databázi z novější verze aplikace radši odmítneme otevřít. Srozumitelná
hláška je lepší než tiše rozbitá data, ke kterým neexistuje záloha.
Venku jsou čtyři soubory na release, tři systémy a k tomu zdrojáky. Když
někdo napíše, že mu něco nefunguje, není jak zjistit, co vlastně pustil.
Verzi zapisuje build.sh do verze.txt, kostky.spec ji přibalí a version.py ji
z rozbalené binárky přečte. Ze zdrojáků má přednost git describe, který ví
i o commitech nad tagem a o rozdělané práci. V CI se na tagu vnucuje
proměnnou, protože runner klonuje jeden commit bez značek.
Hlásí se přes --version, v úvodní hlášce serveru a v patičce každé stránky.
Zkouška v obou workflow ověří, že se do binárky opravdu dostala.
Flask pod pěkně naformátovanou úvodní hlášku vysypal červené varování, že
tohle není produkční server. Waitress je čistě pythonní, takže ho PyInstaller
zabalí bez řečí, a osm vláken pobere telefony u stolu i tabuli, která se
doptává každé dvě vteřiny.
Cestou se ukázalo, že hláška se nikdy nedostala do přesměrovaného výstupu:
mimo konzoli drží Python výstup v bloku a pouští ho, až program skončí —
jenže server neskončí. Zkouška binárky u Gitey si logovala do souboru a pak
ho vypisovala, takže celou dobu tiskla prázdno. Řeší to řádkové bufferování
v console.utf8(), kam to patří vedle té kódové stránky.
GitHub dává veřejným repozitářům běhouny ubuntu-24.04-arm zadarmo, takže je
to jeden řádek do matice. Hodí se pro Raspberry Pi nebo jinou malou pořád
zapnutou krabičku, což je rozumnější místo, kde tohle nechat běžet, než
notebook, který se každý večer zapíná.
x86-64 zůstává doma. Tam jde stavět proti staré glibc a když GitHub vypadne,
release má pořád tu platformu, na které to reálně poběží. ARM je výjimka
prostě proto, že doma na něm není na čem postavit.
Dokud se hrálo ze zdrojáků, ležel dice.db v pracovním adresáři a záloha byla
otázka zkopírování. Z binárky se schovává do systémového datového adresáře,
který na Windows běžný člověk nenajde — takže se teď dá stáhnout přes
prohlížeč.
VACUUM INTO udělá konzistentní kopii i uprostřed zápisu, na rozdíl od
prostého přečtení souboru. Kopie se přečte do paměti a hned zahodí, ať
nezůstane ležet v dočasném adresáři, když si ji někdo nestáhne celou.
uv nad existujícím prostředím skončí chybou a chce --clear. Domácí runner si
pracovní adresář mezi běhy drží a git clean -fd na .build nesáhne, protože je
v .gitignore — takže druhá stavba ve stejném adresáři spadla dřív, než se
stihlo cokoli postavit.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Šest věcí, které se s časem samy nezlepší. Každá jako samostatný commit, dají se číst po částech.
Zamknout závislosti
requirements.txtbyla čtyři jména bez jediné verze, takže si každá stavba stáhla to, co bylo zrovna nejnovější — binárka z dneška a binárka z příštího jara obsahovaly něco jiného a nebylo jak zjistit co. Volné seznamy jsou nově v.in, zamčené v.txt, rozdělené na běh / testy / stavbu. PyInstaller má konečně taky zamčenou verzi; ta na podobu výsledku sahá ze všech nejvíc.Verze se píšou ještě jednou v hlavičce PEP 723, jinak by přestalo fungovat
uv run web.py. Že se ta dvě místa neshodují, odhalítests/test_zavislosti.py.Verzovat schéma databáze
Dokud to běželo jen doma, šlo
dice.dbv nejhorším smazat. Teď jsou venku binárky, které si zakládají databázi v%LOCALAPPDATA%a vLibrary, a ta data patří cizím lidem — první sloupec, který přibude, na nich prostě nebude.Verze se drží v
PRAGMA user_version. Existující databáze mají nulu a plné schéma zároveň, což vychází:SCHEMAje saméIF NOT EXISTS, takže se na nich jen orazítkuje. Databázi z novější verze aplikace radši odmítneme otevřít, než abychom ji tiše rozbili.Binárka má vědět, která je
kostky --version, verze v úvodní hlášce a v patičce každé stránky.build.shji vezme zgit describe(nebo zVERSION=…), zapíše doverze.txtakostky.specji přibalí. Zkouška v obou workflow ověří, že se do binárky opravdu dostala.Waitress místo vývojového serveru Flasku
Flask pod pěkně naformátovanou úvodní hlášku sypal červené varování, že tohle není produkční server.
Cestou se ukázala chyba, která tu byla už dřív: hláška se nikdy nedostala do přesměrovaného výstupu. Mimo konzoli drží Python výstup v bloku a pouští ho, až program skončí — jenže server neskončí. Zkouška binárky u Gitey si logovala do souboru a pak ho vypisovala, takže celou dobu tiskla prázdno. Řeší to řádkové bufferování v
console.utf8().Linuxová binárka pro ARM64
GitHub dává veřejným repozitářům běhouny
ubuntu-24.04-armzadarmo — jeden řádek do matice. Pro Raspberry Pi nebo jinou malou pořád zapnutou krabičku. x86-64 zůstává doma, kde jde stavět proti staré glibc.Stažení databáze ze síně slávy
Z binárky se
dice.dbschovává do systémového datového adresáře, který na Windows běžný člověk nenajde./exportho pošle přes prohlížeč; kopie se dělá přesVACUUM INTO, takže je použitelná i uprostřed rozehrané hry.A ještě jedna oprava
uv venvnad existujícím prostředím skončí chybou a chce--clear. Domácí runner si pracovní adresář mezi běhy drží agit clean -fdna.buildnesáhne, protože je v.gitignore— druhá stavba ve stejném adresáři tedy spadla dřív, než se stihlo cokoli postavit. Narazil jsem na to při zkoušce.Ověřeno
Postaveno lokálně (
VERSION=v1.2.0-zkouska ./build.sh) a na hotové binárce projeto:--versionhlásí vypálenou verzi/,/static,/board,/stats,/exportodpovídajíPRAGMA user_version= 1GLIBC_2.14)118 testů zeleně (+16).