Pokud posledních pár desítek hodin hltáte americké volby, možná jste už také narazili na stránku Battleground State Changes, která se pokouší sledovat výsledky tak, jak to bohužel ostatní nedělají. V čase.

Jak se vyvíjí sčítání hlasů v klíčových státech na GitHubu
V textovém výstupu tedy uvidíte nejen to, jak si Biden s Trumpem stojí v několika nerozhodných státech po poslední aktualizaci sečtených hlasů, ale jak se tyto počty vyvíjely v průběhu času mnohdy minutu po minutě. S toho lze mnohem lépe předpovědět, jak to nakonec dopadne.
Tady jsme ale na Živě.cz, takže nás spíše zajímá, jak to ta stránka vlastně zjišťuje. Je celá postavená na GitHubu, respektive na jeho publikační části Pages, a sama také průběžně stahuje výsledky z nejrůznějších zdrojů.
Dělá to periodicky pomocí další vestavěné a skvělé funkce Actions. Takovou akcí může být spuštění v podstatě jakéhokoliv skriptu, přičemž ten může být i časově automatizovaný třeba pomocí linuxové služby cron.
Počasí ve formátu METAR na serveru NOAA
Dejme tomu, že by nás namísto voleb zajímalo počasí a chtěli bychom do svého repozitáře třeba každých pět minut stahovat textové soubory ze serverů NOAA s počasím pro Brno ve formátu METAR.


HTTP server NOAA s průběžně aktualizovanými meteozprávami ve formátu METAR a jedna z nich pro stanici LKTB – tuřanské letiště v Brně
Jedná se o systém meteorologických zpráv pro letce ze stanic na vybraných letištích. To brněnské má kód LKTB a najdeme jej i v tomto obrovském adresáři NOAA jako soubor LKTB.TXT.
Formát METAR je složitý, takže nebudeme zkoumat, co ten texťák vlastně obsahuje. Teď nám jde totiž jen o to, jak jej strojově průběžně stahovat a ukládat do kořenového adresáře našeho repozitáře na GitHubu.
Stahujeme počasí do svého GitHubu
Použijeme k tomu právě Actions, jejichž odkaz najdeme v liště repozitáře. V sekci Actions klepneme na tlačítko New workflow a vložíme do něj tento kód:
name: Automaticke stahovani dat z NOAA
on:
push:
workflow_dispatch:
schedule:
- cron: '*/5 * * * *'
jobs:
scheduled:
runs-on: ubuntu-latest
steps:
- name: Propojeni s repozitarem
uses: actions/checkout@v2
- name: Stahni METAR zpravu z NOAA
run: |-
wget -q -O brno.txt https://tgftp.nws.noaa.gov/data/observations/metar/stations/LKTB.TXT
- name: Uloz zpravu do repozitare
run: |-
git config user.name "Automated"
git config user.email "actions@users.noreply.github.com"
git add -A
timestamp=$(date -u)
git commit -m "Posledni data: ${timestamp}" || exit 0
git push
Jedná se o formát strukturovaných dat YAML, ve kterém je uložené, co tato úloha bude dělat. Její součástí nejsou žádné osobní identifikátory, takže je kód opravdu univerzální, zcela přenositelný a bude fungovat i vám.


Sekce Actions v repozitáři na GitHubu a tlačítko New workflow pro vytvoření nové úlohy. Právě ta nám bude stahovat tyto textové soubory.
GitHub bude spouštět skript třeba každých pět minut
Pro nás je podstatná hned úvodní část uvozená výrazy schedule a cron, kde GitHubu sdělujeme, že budeme úlohu časově plánovat pomocí standardní linuxové služby cron. Cron k nastavení periodického opakování používá speciální zápis, který zná každý linuxový správce, pomůže vám ale i webový generátor Cron.guru.

Pokud nerozumíte časovému formátu služby cron, pomůže generátor na webu crontab.guru
V našem případě se jedná o zápis */5 * * * *, kterým cronu sdělujeme, aby úlohu spouštěl každých pět minut. V zápisu totiž po sobě jdou minuty, hodiny, dny v měsíci, měsíce a dny v týdnu. Hvězdička představuje jakoukoliv hodnotu.
Samotný obsah úlohy je v sekci jobs. Spustí se na linuxovém Ubuntu a nebojte se, nemusíte jej mít, použijeme totiž to virtuální přímo od GitHubu, které je v ceně i u bezplatných účtů. Prvně provedeme propojení úlohy s naším repozitářem a potom, protože už jsme v tom Linuxu, můžeme spustit libovolný linuxový příkaz.

Soubor stáhneme třeba pomocí prográmku wget, který je součástí většiny linuxových systémů. Ubuntu od GitHubu není výjimkou.
V našem případě to bude stažení textového souboru se zprávou METAR do souboru brno.txt a pomocí programu wget. V závěru stažený souboru uložíme do našeho repozitáře s komentářem, který bude obsahovat časový údaj.



A je hotovo, úlohu stačí uložit, GitHub ji za chvíli spustí, no a pak ji bude opakovat stále dokola každých pět minut. Samozřejmě se můžeme podívat na detaily zpracovávání úlohy.
A to je celé, soubor by se měl záhy objevit v kořenovém adresáři. Když bychom nyní pomocí GitHub Pages přistupovali k našim souborům, v Javascriptu můžeme soubor načíst a zpracovat. Budeme mít k dispozici pokaždé jeho nejnovější verzi.
Téměř živé výsledky prezidentských voleb skrze GitHub dělají to samé.