← Všechny články

Jeden formát pro intervaly, série i repeatery

Repeater na hangboardu a kolo Tabaty spolu na papíře nemají moc společného. První je sedm sekund visu na liště a tři sekundy pauzy, šestkrát za sebou, pak dlouhý odpočinek a další série. Druhé je dvacet sekund práce naplno a deset sekund odpočinku, osm kol. Trenér, který je sportovci popisuje, u každého použije úplně jiná slova. Sestava obojí odměřuje jedním jádrem časovače, a tak jsme si ještě než jsme napsali první řádek obrazovky tréninku, museli odpovědět na menší otázku: co zbude z tréninku, když z něj odečtete sport?

Naše odpověď je sestava.plan/1, otevřený formát v JSON s variantou CSV pro tabulky. Úplný popis najdete na stránce Formát plánu; tenhle článek je prohlídka.

Části, položky a čtyři způsoby, jak je odcvičit

Plán je buď jednotlivý trénink, nebo vícetýdenní program rozdělený na týdny a dny. Den obsahuje části, každou s vlastním názvem, třeba Rozcvička nebo Hlavní část, a část obsahuje položky. Položka je jednoho ze čtyř druhů a o tom, kterého, rozhodují její klíče:

  • časovaná, s time: odpočítá se a sama přejde dál;
  • silová, se sets a reps: sportovec klepne na Série hotová a pak začne odpočinek (rest);
  • odpočinek, jen s rest;
  • vis, s hang a repeats: intervaly na hangboardu.

Část má také režim a ty jsou přesně čtyři. normal, výchozí, projde položky popořadě, tolikrát, kolik udává rounds. superset střídá silové položky sérii po sérii. amrap vměstná do časového limitu co nejvíc kol seznamu cviků a sportovec kola počítá. fortime projde seznam jednou, co nejrychleji, dokud sportovec neklepne na Hotovo nebo nevyprší limit. Položky části amrap a fortime jsou pátý, jednodušší druh: jeden řádek seznamu cviků, třeba „Běh, 400 m“.

Režim EMOM ani Tabata neexistuje. Nejde o opomenutí: ani jeden vlastní režim nepotřebuje.

Tabata je obyčejná část

Tohle je příklad jednotlivého tréninku přímo ze specifikace formátu, beze změny:

{
  "format": "sestava.plan/1",
  "name": "Tabata Blast",
  "id": "k7Qx2mV9pL4wT8zR",
  "version": 2,
  "category": "hiit",
  "note": "Eight rounds, all out. Scale to squat thrusts if burpees break your form.",
  "blocks": [
    {
      "section": "Tabata",
      "rounds": 8,
      "items": [
        { "exercise": "Burpees", "time": 20, "cue": "Max effort" },
        { "rest": 10 }
      ]
    }
  ]
}

Jedna část, osm kol, časovaná položka a odpočinek. Aplikace z toho udělá 16 kroků a čtyři minuty. Poslední desetisekundový odpočinek proběhne také, protože formát s posledním kolem nezachází jinak. Časovaná položka nemůže mít vlastní rest; odpočinek je samostatná položka, a tak je každá položka jen jednoho druhu.

Položka pro hangboard

Repeatery jsou jediný tvar, který se do časovaných položek nevešel bez stránek opakování, a tak dostaly vlastní druh:

{
  "exercise": "Half Crimp Repeaters",
  "prep": 5,
  "hang": 7,
  "off": 3,
  "repeats": 6,
  "sets": 5,
  "setRest": 180,
  "grip": "Half crimp",
  "edge": "20 mm",
  "load": "+5 kg"
}

Pět sekund na přípravu, pak pět sérií po šesti visech na sedm sekund se třemi sekundami pauzy mezi nimi a tři minuty odpočinku mezi sériemi. Formát přesně říká, kolik kroků z toho vznikne: jedna příprava, 30 visů, 25 pauz a 4 odpočinky mezi sériemi, 60 kroků z jediné položky. Úchop, lištu a zátěž sportovec uvidí tak, jak je trenér napsal.

Jeden plochý seznam

Ať je režim jakýkoli, den nakonec skončí jako plochý seznam kroků a jádro časovače vždycky přehrává jen tenhle seznam. Kroky supersetu dostanou značky A1, A2 a tak dál; z AMRAPu se stane jeden krok „AMRAP 6 min“, který nese svůj seznam cviků. Díky tomu, že v jádru žádný sport není, zvládne jeden časovač všechny.

Z tabulky

Hodně trenérů má plány v tabulce, a tak má formát variantu CSV s jedním řádkem na položku. Povinných je dvanáct sloupců (week,day,day_name,section,rounds,exercise,time,sets,reps,load,rest,cue), ostatní jsou nepovinné a tabulka bez nich se čte, jako by byly prázdné. Oddělovač se pozná z řádku záhlaví: čárka, středník nebo tabulátor, takže tabulka uložená se středníky, jak to tabulkové programy s českým nastavením často dělají, se naimportuje tak, jak je. Hodnoty pro jednotlivé série se píšou přes lomítko, 12/10/8. Aplikace naimportuje soubor .csv jako každý jiný plán.

Přísný tam, kde na tom záleží

Formát, který čte víc programů, musí být u chyb přesný. Klíč, který formát zná, ale daný druh položky ho nepovoluje, třeba rest u časované položky, je chyba, která uvede své místo (blocks[0].items[0].rest), a nikdy se tiše nepřeskočí. Klíč, který formát nezná, se přeskočí, takže plán z novější aplikace se ve starší otevře, jen s upozorněním.

Programy, které plán zapisují, vytvářejí jediný kanonický tvar: stejné pořadí klíčů, stejné odsazení, na konci nový řádek. Stejný plán tak dá vždy stejné bajty a stejné bajty dají stejný odkaz.

Dva čtenáři, stejné odpovědi

Formát dnes čtou dva programy: jádro aplikace ve Swiftu a modul v TypeScriptu v Sestava Studiu, trenérském editoru v prohlížeči. Aby se od sebe nevzdálily, jsou v repozitáři testovací vektory: pro 25 plánů, které se dají otevřít, kanonický tvar, počet kroků, odhad délky a řádky kontroly; pro 75 chybných první chyba, její místo a zpráva. Jádro je zapisuje a testy Studia ověřují každý jednotlivý trénink i každou chybu (Studio upravuje jen jednotlivé tréninky, a tak jediný program mezi nimi záměrně odmítne). Sestavení selže, když je některý vektor zastaralý.

Co do formátu nepatří

Formát říká, co se stane a kdy. Neříká proč: periodizace, progrese a historie sportovce patří trenérovi, ne souboru, který telefonu říká, kdy má pípnout. Nemá ani nastavení zvuku; hlas, pípání a haptickou odezvu si sportovec volí v aplikaci.

Pár omezení, o kterých je dobré vědět:

  • Název je rozhodnutý. Projekt začínal pod jménem Setlist, proto se první návrhy formátu jmenovaly setlist.plan/1; formát vyšel jako sestava.plan/1 a soubory končí na .sestava, bez aliasu pro pracovní název.
  • „Popsat trénink“ zapíše méně, než formát umí. Import přes Apple Intelligence žádá model v zařízení jen o časované, silové položky a odpočinky. O tom, jestli je výsledek platný plán, rozhoduje aplikace, ne model, a vy ho zkontrolujete jako každý jiný import.
  • Jeden formát souboru, ne všechny služby. Aplikace tento formát importuje ze souboru, odkazu nebo QR kódu a k tomu soubory CSV. Z jiných tréninkových služeb dnes neimportuje.
Pro vývojáře: stránka Formát plánu se vykresluje ze složky Format/ v repozitáři, takže se od specifikace, kterou čte aplikace, nemůže rozejít. Najdete na ní schéma JSON, popis sloupců CSV a seznam změn; testovací vektory jsou přímo v té složce.

Úvodní fotografie: Isaac Smith, Unsplash.

Další díl seriálu Jak vzniká Sestava Vaše tréninky nejsou náš obchodní model