Pri budovaní môjho online kurzu som musel sledovať počet slidov. Môj kouč mi dal cieľ, ktorý vyzeral naozaj ťažko dosiahnuteľný, ale zdal sa realizovateľný. Chcel som, aby to bola výzva. Na základe čísel z predchádzajúceho mesiaca som dospel k záveru, že môžem vytvoriť priemerne asi tri slidy denne. S týmto číslom som bol celkom spokojný, ale kouč mal iný názor.
Make it four.
To boli jeho slová. Sám prešiel podobnou cestou predo mnou a vedel, ako sa tlačiť. Ako kouč tiež vie, ako tlačiť ostatných, ktorí potrebujú pomoc. Skočiť zo troch na štyri slidy denne sa nezdá veľa, ale znamenalo to nárast z 90 na 120 slidov. Robiť 4 slidy denne by som skončil asi za 23 dní, čo by mi zanechalo presne 7 dní na iné projekty a relax. Teraz bol celý mesiac v mojom kalendári obsadený.
Usporiadanie prezentácie #
Slidy budújem pomocou pandoc. Pandoc je skvelý softvér, ktorý mi umožňuje transformovať markdown text do revealJS prezentácie. Čo je tiež skvelý nástroj a ak o nich neviete, len sa pozrite. Oba obsahujú viac funkcií, ako by som vedel spočítať.
Jedným z konceptov, ktorý RevealJS poskytuje a ktorý nie je bežný medzi inými prezentačnými nástrojmi, ktoré som skúšal (PowerPoint, LibreOffice Impress alebo LaTeX Beamer), je dvojrozmerné usporiadanie slidov. Vytvára mriežku s vertikálnymi a horizontálnymi slidmi. Všetky predchádzajúce majú len jeden rozmer, alebo aspoň to platilo, keď som ich skúšal bez špeciálnej konfigurácie.
Nadpis prvej úrovne v markdowne (označený jednoduchým mriežkou #) sa
konvertuje na horizontálny slide. Horizontálny slide môžete chápať ako
názov kapitoly. Označuje časť prezentácie, ale sám o sebe nenesie obsah.
Všetky nadpisy druhej úrovne (označené dvojitou mriežkou ##) sa
konvertujú na vertikálny slide pod aktuálnym horizontálnym, až po ďalší
vertikálny. Iba vertikálne slidy zobrazujú obsah (text, zoznamy s
odrážkami, obrázky, …). Pripadá mi to naozaj logické a pekné. Ako bonus,
keď stlačíte klávesu o, zobrazí sa celý 2D prehľad vašej prezentácie,
ktorý vyzerá ako mriežka.
Počítanie slidov #
Keďže celý kurz je jeden obrovský .md súbor, ktorý je samozrejme uložený
v textovom formáte, môžeme jednoducho spočítať všetky nadpisy druhej úrovne
v tom súbore a programaticky získať počet slidov. Syntax pre grep:
grep "##" presentation.md | wc -l
A the_silver_searcher je rovnaký:
ag "##" presentation.md | wc -l
Ak nepoužívate
the_silver_searcher, je to
tiež jeden z nástrojov, ktorý stojí za pozornosť. Tvrdí, že je oveľa
rýchlejší ako grep. Môže vám ušetriť
niekoľko milisekúnd tu a tam. Na poznámku, ag sú len dva znaky, čo je
polovica oproti grep. Pokiaľ nemáte alias ako alias gr='grep', ušetrí
vám aj stlačenia kláves.
Výsledok zobrazuje jedno číslo, ktoré ukazuje počet riadkov obsahujúcich nadpis druhej úrovne markdownu, čo predstavuje počet horizontálnych slidov v prezentácii. Keďže iba horizontálne slidy majú obsah, to je presne všetko, čo potrebujeme.
Google Calendar API #
Spočiatku som si myslel, že aktualizácia udalosti v gCal bude naozaj rýchla, ale bol som ďaleko od pravdy. HTTP API dokumentácia pre metódu PATCH zobrazuje pekné URL. PATCH je metóda, ktorá sa zvyčajne používa v REST API na aktualizáciu časti entity.
PATCH https://www.googleapis.com/calendar/v3/calendars/calendarId/events/eventId
Super! Stačí spustiť curl alebo jeho novšieho bratranca,
httpie, a aktualizovať informácie v udalosti Google
kalendára a som hotový. No, vyžaduje to tri dodatočné kusy informácií:
- calendarId
- eventId
- autorizácia
Skúšal som pozerať na URL pri prehliadaní webového rozhrania gCal, ale
nenašiel som tam žiadne ID, ani nikde v nastaveniach. Časť s autorizáciou
bola ešte komplikovanejšia. Ak ste nikdy nepovolili Calendar API, je to
veľa krokov. Nebudem ich tu vysvetľovať, pretože sú zdokumentované samotným
Googlom a ako všetko Google, podliehajú (častým) zmenám. Skončil som pri
tom, že som ho povolil a nepoužil som curl ani žiadny iný priamy
nástroj na požiadavky, pretože spracovanie OAuth2 access a refresh
tokenov v bash by bolo trápenie. Existuje aj starší spôsob s API kľúčom,
ktorý by mohol ľahko fungovať, ale má určité obmedzenia a nebolo mi
úplne jasné,
či je to stále realizovateľná možnosť, takže som zvolil OAuth2.
Skript na aktualizáciu #
Google Calendar API tiež podporuje viacero jazykov (ďalšie pribúdajú):
- Go
- Java
- JavaScript
- node.js
- PHP
- Python
- Ruby
Môj kurz je urobený ako node.js projekt, takže som prirodzene sledoval
poskytnutý quickstart [príklad](https://developers.google.com/calenda
r/quickstart/nodejs). Bohužiaľ ukazuje len to, ako vytvoriť udalosť, nie
ako aktualizovať existujúcu. Skúšal som sa dozvedieť viac o node API pre
metódu patch kalendára
tu,
ale nejako som tam nerozumel ani slovu. Opäť pomohol StackOverflow.
Príspevok
tu ukazuje pokyny na aktualizáciu udalosti. Kombináciou týchto troch
zdrojov som bol schopný získať funkčný skript, môžete sa pozrieť na
zdrojový kód.
Bash v node #
Ak sa pozriete do skriptu, možno nájdete ešte jednu zvláštnosť: funkciu
lineCount. Volá bash príkaz, ktorý sme našli skôr, v node skripte. Mohol
som to urobiť priamo v node, takže by to nebolo také zapletené, ale hej,
mal som to už vymyslené a život je krátky.
Nasledovaním Medium
článku
som dostal nielen jednu, ale viacero už funkčných možností, ako to urobiť.
Vybral som tú, ktorá používa promises. Aj keď quickstart článok používal
callbacky, chcel som skript postupne rozvinúť tak, aby na konci používal
iba arrow functions a syntax async/await, ak je to možné.
Git hooky #
Git hook je technika na volanie určitých skriptov počas životného cyklu
gitu. Je ich veľa. Viac sa môžete dozvedieť štúdiom vzorových súborov
ls .git/hooks/*.sample vo vašom repozitári alebo cez man githooks.
Keďže je ich veľa, výber správneho môže byť ťažký. Spočiatku som si myslel,
že použijem post-push, ale ako som sa neskôr dozvedel, taký hook v gite
neexistuje! StackOverflow
príspevok
bol prvá vec, ktorá sa objavila vo výsledkoch vyhľadávania, vysvetľujúca,
že tento hook by vyžadoval vzdialený repozitár na spustenie kódu, čo nie je
implementované.
Ďalšia vec v poradí bol pre-push hook. Zvyčajne sa pre-hooky používajú na
vykonanie kontrol pred spustením akcie (napríklad kontrola formulácie v
commit správe). Nepotreboval som vykonávať žiadne kontroly, chcel som len
zavolať skript spolu s git push. Tentoraz nezáležalo, či sa spustí pred
alebo po pushu, takže som ho použil.
Ďalšia otázka bola, kam umiestniť hooky, aby ich git sledoval. Umiestnenie
hookov do adresára .git/hooks/ ich spustí, ale git ich nevypíše ako
nesledované súbory. Ak je hook súčasťou celkového projektu, musíte ich
umiestniť inde. Tento Medium
článok
načrtáva koncept umiestniť ich do adresára hooks/ a symlinkovať ich do
.git repozitára.
mkdir hooks
cd hooks
touch pre-push
cd ..
# POZOR: parameter -f prepíše cieľ!
ln -s -f ../../hooks/pre-push ./git/hooks/pre-push
Záver #
Nastavením tohto funkčného skriptu ako pre-push git hook som bol schopný
automaticky aktualizovať udalosť v Google Kalendári spolu s git push.
Teraz sú výhody trojnásobné:
- Môžem okamžite vidieť počet slidov
- Môj kouč môže sledovať môj pokrok
- Moja priateľka môže vidieť, či plním svoje ciele alebo potrebujem viac pomoci
Tretia výhoda je obzvlášť užitočná, ak máte oddanú, nápomocnú priateľku, ako mám ja. Pomáha nám to oveľa lepšie plánovať čas na oddych.
Dúfam, že vám tento návod bol nejakým spôsobom užitočný, či už ide o všeobecné znalosti, automatizáciu úloh, git koncepty alebo ste len zvedaví. Ak máte nejaké otázky, kontaktujte ma.