Týdenní poznámky #72: Heroine, cally a řešení tajemné chyby

Utekl zase nějaký ten týden (25.10. — 2.11.) a tak stejně jako minule sepisuji, co jsem dělal a co zajímavého jsem se naučil. Především se snažím rozvíjet junior.guru. Nemám šéfa, kterému bych reportoval každý svůj krok, ale mám klub, a členy by mohlo zajímat, jestli se neflákám. Taky je to způsob, jak se sám doma nezbláznit a nepropadat pocitu, že je zase konec týdne a já jsem přitom nestihl nic udělat.

Poznámky
Fotka od Honzy Kahánka

Poznámky píšu v úterý, protože jsme byli mimo domov a nějak jsem je dřív napsat nestíhal. Teď je píšu až ve vlaku zpátky, kde je času naopak dost, stav železnic mi dal na psaní dokonce krásných 30 minut navíc. (Update: Hodinu navíc, něco mimořádného u Kolína, ale aspoň jsme viděli stovky nových škodovek ve dvou patrech odstavených na vagonech… že by takhle čekaly na čipy?).

Když už jsem u vlaku, jak jsem psal už dřív, máme mimino, nemáme auto. Teď jsme konečně mohli odzkoušet dálkovou cestu vlakem, 3-4 hodiny. Druhou cestu nemáme ještě za sebou, ale zatím to vypadá na velkou pohodu, s nosítkem a pár hračkami se to dá a dítě to prospí. Jsem zvědav, jak se to bude časem měnit, ale i tak mi přijde, že ve vlaku se zabavíme pořád lépe než držením volantu a sezením v autosedačce. Díky mojí flexibilitě můžeme navíc jet v dobu, kdy moc jiných lidí nejede, takže teď máme třeba celé kupé pro sebe.

Spouštění Heroine: Ženy v IT

Tento týden se spouští nový projekt časopisu Heroine, ženy v IT. Minulý týden se tedy vše finišovalo. Můj mega dlouhý článek nakonec zkrátila sama šéfredaktorka. Byť jsem občas za nějaká písmenka bojoval, nakonec to dopadlo dobře a s výsledkem jsme spokojení snad oba. Díky tomu, že to seřezávala přímo v Google Docs, hned jsem viděl, jaká výplňová slova používám a co bych mohl příště i seřezat sám. Každopádně mi přišlo, jako by za mě někdo dělal domácí úkoly, protože doteď se mi nikdy nestalo, že by existoval člověk, který za mě bude číst moje články a zkracovat je a i jinak editovat :D Luxus!

Myslím, že to bylo v knize On Writing Well, že editor klasicky začínajícímu autorovi text zkrátí o celý první odstavec bez toho, aby to mělo jakýkoliv vliv na zbytek textu. Tak třeba přesně to se mi stalo.

Doplnil jsem do textu ještě odkazy. Dále jsem musel dodat medailonek a ještě text „reklamy“ na JG, kterou jsme si domluvili barterem za to, že nechci za články finanční odměnu. Pak jsem ještě objevil rozcestník projektu a něco se mi tam nelíbilo, tak jsme během státních svátků brzo ráno nebo brzo večer ještě s autorkou této stránky řešili určité formulace a zpracování a ladili slovíčka.

Fakturace do USA

Domluvil jsem se s amíky a opravdu u mě nakonec inzerují. Jejich klientem je AT&T v Brně. Ptal jsem se, jak mě našli. Prý mě našlo přímo AT&T googlem, když hledali pracovní nabídky. Not bad!

S daňařem jsem ověřil, že to neovlivňuje můj status neplátce DPH, ani žádnou byrokracii. Mělo by stačit dát jim formulář W-8BEN, pokud je člověk fyzická osoba, nebo má firmu, kterou vlastní sám a nemá limit ručení. Tzn. aspoň co se mi povedlo zjistit, USA na mě pohlíží tak, že když jsem OSVČ, neodděluje mou osobu od mého podnikání. Ten formulář je celkem jednoduchý a protože se vyplňuje často k různým službám z USA (např. Patreon na dobrovolné příspěvky, Apple AppStore kdybych tam prodával aplikace, ale i pro banku při nákupu ETF v USA apod.), i český internet je plný návodů jak jej vyplnit, stačí vygooglit „jak vyplnit W-8BEN“. Ten formulář je vlastně jen takové „čestné prohlášení“, že mám daňovou rezidenci v ČR a nemají mě v USA danit (USA a ČR mají na tohle smlouvu proti dvojímu zdanění).

Pak existuje podobný formulář W-8BEN-E, kde to E je jako entity a ten slouží pro opravdové firmy a má víc políček, ale ten se mě tedy naštěstí netýká. I na ten však lze najít návody na vyplnění, byť méně. Jeho účel je stejný, čestné prohlášení proti dvojímu zdanění.

Simple Analytics

Od Simple Analytics přišel mail, že mi končí zkušební doba. Ověřil jsem zase s daňařem, zda a jak za ně platit. Je to služba z EU, takže bych musel při jejím nákupu řešit DPH. To by byla kvůli pár stovkám korun zbytečná byrokracie, navíc SA nechci používat pouze pro JG, ale i pro všechny své ostatní weby, třeba tento, jež ani s mým podnikáním nijak nesouvisí. Platím si ji tedy ze svého jako běžný smrtelník, s DPH, ale bez byrokracie. Asi stejně jako si platím telefon ze svého, i když přes něj určitě dělám i pracovní hovory. Hned jsem si SA předplatil na rok dopředu a začal na to převádět všechno z Google Analytics.

Při tom jsem si uvědomil, že je tam i několik webů Python komunity, takže jsem nabídl, že je přesunu na SA. Závislost na mé osobě se tím nezmění, ale statistiky budou přístupnější (nastaveny jako veřejné) a sbírání čísel bude podle GDPR a všech ostatních pravidel, i pravidel slušného internetového chování, takže nebude potřeba ani žádná cookie lišta. Tím asi můžeme vše zmigrovat a zavřít nějaká issues na GitHubu. V době psaní poznámek je už přesunuté pyvo.cz, statistiky zde.

Nějtěžší bylo vyrobit Pull Request na web PyCon CZ, kde jsou archivované staré weby proběhlých PyCon CZ v podobě statického HTML a GA v nich byly zapečené, někdy i zamotané do dalšího JS. Naštěstí nic, s čím by si neporadilo search & replace ve VS Code.

Simple Analytics

Srazíky v klubu

Pracovní název je srazíky, což je tedy kandidát na kredeneček, ale podle mě to zatím nejlépe vystihuje, co se děje.

Lidi v klubu se chtěli scházet a co neudělali? Začali se sami scházet! Ono to vypadá banálně, ale vůbec to banální není. Je to naprostý milník v existenci klubu, protože já bych to tam prostě sám všechno neutáhl. Potřeboval jsem, aby i další lidi vystoupili trochu z davu a začali třeba něco organizovat a jinak využívat připravené podhoubí k věcem, o nichž bych já mohl jen snít.

No a to se přesně stalo. Jeden aktivní člen založil občasné srazíky kolem frontendu, kde se lidi sejdou v hlasové místnosti a pokecají si o tom, na čem dělali, dají si zpětnou vazbu a tak. Ke slovu se dostane každý, je to dvakrát týdně a připojí se ten, kdo má chuť. A když už existoval vzor, nedlouho na to vzniklo něco podobného i pro backend.

Okamžitě jsem to podpořil speciální organizátorskou rolí, která funguje jednak jako malé poděkování, jednak umožňuje psát do místnosti s oznámeními, kam jsem mohl dřív psát pouze já. Taky to v klubu vytváří middle class, jak ji popisuje Alex Zhu v tomto rozhovoru.

Jsem zvědav, jestli se někdo chopí těch srazíků na procvičování angličtiny, které jsem sám stále nedokázal rozjet, ale členové by to podle mě klidně mohli zvládnout takhle sami.

Drobná vylepšení příručky

Do příručky jsem během jednoho večera jen tak pro radost přidal JavaScript, který pozná, kde na stránce jsem a podle toho aktuální nadpis zobrazí v liště navrchu (na mobilu) nebo vybarví sekci v menu vlevo (na desktopu). Myslím, že to zlepší orientaci a je to něco, co na staré příručce bylo a teď zmizelo. Kód to nebyl moc složitý, dost z toho jsem převzal z minula, ale dokázal jsem to silně zjednodušit.

Díky tomuto jsem pak mohl všechny staré JS soubory související s příručkou konečně vzít a smazat. Zase dobrý pocit z čištění. Tím jsem se dostal na 4 soubory JS, z nichž teda některé bych uměl ještě zkrátit a pročistit, nicméně na ten React to pořád nevidím, no.

Jeden pěkný trik, který jsem použil, je čtení CSS properties z JS, abych zjistil, jaký je scroll-margin-top a mohl jej připočítat k pozici nadipisu na stránce. Pomohl mi článek How to get CSS values in JavaScript.

Tajemná chyba

Zničeho nic začal build JG na CircleCI trvat nekonečně dlouho a CI jej vždy zařízlo. Začalo to v pátek, kdy měly být už vyvěšené nabídky pro AT&T, tak jsem trochu stresoval, že pokud to do pondělí neopravím, bude průšvih. Když nedoběhne build, neaktualizuje se web, neběží robot na nabídky práce, atd.

Myslel jsem, že sosání dat o nabídkách práce z předešlých buildů a vytváření tabulky s historickými daty, což jsem nedávno přidal i kvůli spolupráci s Czechitas, začalo zase trvat nějak moc dlouho. Tak jsem se to pokusil dočasně vypnout nebo oddělit do samostatného buildu, ale nepomohlo to. Byla to slepá stopa vedená pouze intuicí, ne informacemi.

Nejvtipnější bylo, že poslední výpis před tím, než se to zaseklo a čekalo donekonečna, byl řádek

[juniorguru.sync.jobs.pipelines.locations] DEBUG: Geocoding 'Brno'

Úplně vždycky. Říkal jsem si ach jo, zatracené Brno, co mi to tam zase tenhle vtip, ve kterém se dá bydlet, způsobuje… No ale byla to nějaká stopa. Napadlo mě, jestli mám správně nastavené timeouty requestů. HTTP request totiž většinou nemá v základu žádný timeout a tudíž může trvat nekonečně dlouho. Málo se to ví. Dobré je vždy nějaký timeout nastavit a dokonce se dá nastavit i více timeoutů pro jednotlivé fáze připojování a čekání na odpověď.

Zvýšil jsem tedy logování v oblasti, kde se provádí geocoding adresy. Chtěl jsem zjistit, proč se vůbec posílá nějaký request při geokódování slova „Brno“, když na největší města mám zkratku, jež vůbec nesahá na API. Ze zvýšeného logování jsem zjistil, že o geokódování nejde a i když jsem tam přidal timeout (což je rozhodně dobře), nic to v tomto případě neovlivní. Nakonec jsem povolil logovat úplně všemu a díky tomu, že logovalo i urllib3 jsem zjistil, čím to je.

[juniorguru.sync.jobs.pipelines.locations] DEBUG: Geocoding 'Brno'
[urllib3.connectionpool] DEBUG: Starting new HTTPS connection (1): www.att.jobs:443

Ano, je to tak. Přidané nabídky od AT&T to celé rozbily! Robot se snaží podívat na faviconu firemních stránek a udělat z ní logo nabídky práce. To ovšem trvá nekonečně dlouho. AT&T má zjevně na webu nějakou ochranu scrapování. Ještě aby ne, když to jsou takoví síťaři, asi to mají všechno pošéfované, nejvíc overkill.

Knihovna favicon, která toto za mě dělá, není mou úplně oblíbenou, protože má synchronní request.get() natvrdo v sobě (takže se blbě testuje nebo zakomponovává do míst, kde je kód asynchronní), ale naštěstí jsem z dokumentace vyčetl, že mu lze aspoň předat nějaké parametry. Tak jsem nastavil timeout a tím se to celé opravilo.

Přišlo mi však škoda, aby AT&T neměly logo, tak jsem se ještě pokusil přidat nějaké hlavičky. Otevřel jsem jejich firemní stránku ve Firefoxu a vykopíroval z dev tools raw HTTP hlavičky tak, jak je posílá prohlížeč. Tyto jsem dal do kódu jako hlavičky, se kterými se má knihovna favicon ptát na favicon. To myslím pomohlo a requesty začaly procházet a vracet 200.

Ale teda když se teď dívám na web, tak tam to logo nevidím. Možná je tam ještě nějaký zádrhel. Každopádně je ale aspoň opravené JG a normálně teď funguje.

Dnes večer při nightly buildu mě akorát překvapilo AT&T ještě jednou, a to když mi rozbilo kontrolu odkazů. Tam jsem se s tím už moc nepáral a prostě jejich web přidal do seznamu adres, které má kontrola odkazů přeskočit. Byť mě tedy zaráží, že zrovna broken-link-checker nemá timeout. Ale třeba to jde nějak nastavit, nezkoumal jsem.

Cally

  • Se Smitio, něco spolu podnikneme.
  • S brňáky, kteří vytvářejí zajímavou C# platformu. Možná nakouknou do klubu.
  • S Czechitas, ohledně toho jak se nám daří přehazovat si data o pracovních nabídkách.
  • Včera v pondělí jsem dělal odpolední několikahodinové Q&A pro core team Česko.Digital o všem možném na téma komunity, ať už šlo o JG nebo lekce, které jsem si odnesl z dlouhých let v Python komunitě.

Sluchátka

Mám vítěze. Sluchátka Jabra 75t jsem si okamžitě zamiloval a zatím jsem na nich nenašel jedinou nevýhodu. Používám je teď při uspávání, ježdění s kočárem, při práci, je to paráda na všechny činnosti, na které jsem je chtěl.

Oproti dražším AirPodům Pro neměly mít ANC, ale přišel mi nějaký SW update a napsalo mi to, že ANC to odteď podporuje a mohu si ho nastavit. Akorát že jsem to zatím nějak nastavit nestihl a sluchátka tlumí zvuky pasivně i bez ANC, takže tuto funkci mám ještě dokonce nevyzkoušenou. Každopádně mě to překvapilo :)

Nejvíc jsem se bál, jak bude řešené přecházení mezi zařízeními. Díky BT multipointu se sluchátka připojí zároveň na mobil i na macOS a je to. Žádné přecházení není. Takže v tomto směru je to dokonce o tisíc procent pohodlnější, než co má Apple, aspoň pro mě.

Taky se mi líbí, že mají opravdová tlačítka, u kterých vím, jestli jsem je zmáčkl, nebo ne. Gesta dost používám, měním prostupnost zvuku, pauzuju si co hraje a pak zase pouštím, dokonce mohu zesilovat a ztišovat. Také dost používám jen jedno sluchátko, na nějaký podcast při uspávání dítěte to stačí. Tady teda Jabra umí jen pravé sluchátko, ale vůbec mě to neomezuje, stejně bych si asi dával vždycky pravé.

Další poznámky

  • Probíral jsem se záplavou nahromaděných mailů, to mi sebralo snad jedno celé odpoledne. Taky se v jednu chvíli neskutečně rozjel klub a měl jsem dojem, že se tam za dva tři dny napsalo zpráv jak předtím za měsíc. Takže jsem všechno četl, odpovídal jsem, apod.
  • Připravovali jsme s Liborem jeho dnešní přednášku o novém webu Davida Klimeše a oznamoval jsem ji do světa.
  • Libor je tak úžasný, že dokonce s CDN77.com rovnou domluvil i sponzorství JG, a to ve větší palbě, která zahrnuje i logo na příručce. Paráda! Logo už tam visí, faktura poslaná, ještě to všude oznámím, každopádně velká radost.
  • Že tohle bude můj příští „trending“ tweet se spoustou lajků, to bych si asi netipnul.
  • Stále mě zlobí validace s CAPTCHA, která se dostává do odkazů a ty pak robot uloží k nabídkám práce. Opět jsem se snažil to všude podchytit, ale stále se to tam dostává a já nevím už vůbec kudy. A to jsem se fakt snažil. Taková blbost, ale člověk musí rozebrat celý traktor.
  • Během 9 dní od 25.10. do 2.11. jsem při procházkách nachodil 20 km. Celkem jsem se hýbal 6 hodin a zdolal při tom 20 kilometrů.

Co plánuji

Tři čtyři věci, které bych chtěl zvládnout udělat příště:

  1. Napsat další článek pro Heroine.
  2. Připravit si přednášku pro OpenAlt.
  3. Nasázet statusy na sociální sítě.
  4. Zvládnout úterní přednášku v klubu.

A co vy?

Pokud byste čistě náhodou měli dojem, že jste oproti mě za uplynulý týden vůbec nic nestihli, tak mám pro vás skvělou zprávu! V klidu se na ten dojem můžete vykašlat. Není zač!

Co mě zaujalo

Když si něco přečtu nebo poslechnu a líbí se mi to, sdílím to na Pocketu. Od posledních poznámek jsem sdílel toto:

Upozorňuji, že to není vše, co jsem přečetl, slyšel nebo viděl, ale jen zlomek, který mě zaujal. K vygenerování tohoto seznamu jsem použil vlastní knihovnu pocket-recommendations. Věci, které jsem sdílel v den psaní minulých poznámek, se opakují i v těch dalších a je to záměr, ne chyba.