Blokování obsahu 2.0

Není to tak dávno, co jsem psal, že používám ad-block. A že se za to nestydím. Nebyl to tedy úplně přesný titulek, neb nepoužívám ad-block, ale prostě block, a že se tím blokují i reklamy je jen takový vedlejší účinek. Primární cíl je blokování toho, co se mi nelíbí. Tedy JavaScripty, kterým nedůvěřuji. JavaScripty a requesty, které se snaží o mne něco zjistit a něco udělat na mém počítači.

Bohužel častým kanálem takových věcí jsou reklamní sítě. Přeci jen to je lákavé – stačí do reklamní sítě dostat nepěknou věc a mám jistotu, že se dostane přes velkou množinu špatně zabezpečených webů ke spoustě uživatelům. Dalšími kanály mohou být nově udělátka pro notifikace o cookie nařízené Evropskou Unií. Další už je velice málo pravděpodobné, ale co se asi stane, když se někomu povede hacknout like tlačítko či FB komentáře? I kdyby jen na chviličku. Ale i když pravděpodobnost je malá, stále tyhle prvky mne sledují, což se mi nelíbí.

Proto používám uBlock. Nikoliv ad-block, už rozhodně ne populární Adblock Plus, který sice skrývá (pouze!) reklamy, ale nově má v plánu některé zobrazovat či nahrazovat svými. Názor si udělejte sami.

Jenže stále jsem měl menší problém. Sice mne uBlock chrání před spoustou nebezpečného balastu na internetu, ale kdo mne chrání před uBlockem? Jak si mohu být jist, že samotný uBlock publikuje kód, který je dostupný na GitHubu, bez modifikace a ověřený komunitou? A co když se někomu povede převzít účet a nahrát zákeřnou verzi? Přeci jen má přístup ke všemu, co si prohlížím…

Proto jsem si kód forkl a udělal si review. Snažil jsem se dostat moji ověřenou kopii privátně do store, abych měl synchronizované přes všechny prohlížeče, a případně mohl nabídnout i lidem, kteří mi věří. Ale Google mi to bohužel nedovolil. Takže mám pouze ubalenou verzi, kterou si přes developer mode ručně nahrávám.

Nyní jsem zase o něco klidnější. Nenainstaluje se mi žádná úprava, dokud se na ni sám nepodívám a neschválím. A taky vím, že v pluginu škodlivý kód velice pravděpodobně momentálně není. :-)

Moje cesta k salse

Nebo možná lépe: moje cesta k tancování.

Někdy před deseti lety jsem, jako téměř každý, měl jít do tanečních. A vůbec se mi tam nechtělo. Však co to po mne chtějí? Oblek ještě budiž, ale zastrčenou košili, škrtit se kravatou a navíc nosit rukavičky?! V té době pro mne něco nepředstavitelného. Kdo mne zná se teď určitě směje. :-)

Stejně jsem neměl na vybranou a tak jsem se snažil aspoň předstírat, že se mi tam líbí. Naštěstí jsem nemusel předstírat dlouho. V době vzdoru jsem byl ještě na základní škole a nevěděl jsem, že na střední budou dvě holky. Na celé škole. A většinou si je spletu s klukem.

Samozřejmě na druhou hodinu jsem se těšil jak malý kluk. Naopak jsem se snažil to nedávat tak najevo. Přeci nemohu nechat dopustit, aby mi někdo mohl říct „tak vidíš, jak se ti tam nakonec líbí!“ A taky mi v té době záleželo, co si lidé myslí, a tancování na průmyslovce nebylo zrovna in. Tím jsem se s tancem na dlouhou dobu beze slova rozloučil…

…dokud jsem nevyrostl z puberty… ehm, z puberty zřejmě nevyrostu. Co třeba: do doby, kdy mi už bylo tak nějak jedno, co si kdo myslí, a měl jsem spolubydlící, která taky chtěla tancovat. Takže se vyrazilo do pokračovaček klasiky. A speciálek. A ještě jednou. Až se sebrala a odjela do Polska. Nevím, jestli mi tím chtěla říct, že mi to moc nešlo či co?

Tak či onak, nevzdával jsem se a našel si kroužek, kde jsem pokračoval především se standardy. Problém však je, když člověk chce jít a užít si tancování. Standardy jsou dřina, i když krásná, s vážným obličejem bez možnosti přijít na párty a čapnout jakoukoliv sedící holku k tanci. Těžká situace pro chlapa bez taneční partnerky.

Naštěstí mezitím jsem dostal pracovní volňásky na matfyzácky ples 2014, kde byla miniškolička salsy. Moc se mi salsa zalíbila a chtěl jsem hned umět víc! Zadal jsem tedy do googlu (pardon!) kurzy salsy a konkurz vyhrál Marián. Takový český misionář salsy linei, konkrétněji New Yorku, taky zvané mambo.

Začal jsem však s LA stylem. Což mi teda bylo úplně jedno, neb na první salsa párty mi taneční partnerka řekla „slyšíš to? To je bachata, to se musíme taky naučit“, zatímco jsem si dál jel první naučené kroky salsy a neslyšel rozdíl v hudbě. Však osm dob tam bylo!

Postupem času jsem se naučil rozpoznat rozdíl mezi bachatou a salsou. Narazil jsem však na další problém – neexistuje jen jedna salsa, ale dva základní styly. Salsa linea a salsa cubana. To jsem pochopil po tom, co mne jedna slečna pochválila slovy „to nebyla úplně špatná linea na to, že hráli kubánu.“ No kdo se v tom má vyznat?! :-)

Tak jsem se rozhodl vyrazit do zahraničí a zlepšit se. Dostal jsem doporučení na Šibenik. Velký festival s báječnými tanečníky po celý týden na pláži. Vyrazil jsem a neskutečně si festival užil. Zatancoval jsem si i s nejednou hvězdou salsa světa! Tam také proběhl můj switch z LA na pokročilejší NY styl. Byl to sice můj plán, ale stejně jsem srabsky u první slečny chtěl začít s LA, jenže to tancovat nechtěla a bylo vymalováno.

Festivalová atmosféra mi natolik chyběla, že den po návratu jsem se přifařil k české chlapské reprezentaci na ruském festivalu v Rostově. Zaslechl jsem něco o krásných šikovných holkách sedících kolem parketu, protože nemají s kým tancovat. Což je pravda a nedá se popsat. Snad jen – jakmile jsem se dozvěděl o jejich výletě na Varšavský festival, ihned jsem koupil vše potřebné, abych nechyběl!

No a takhle jsem se dostal k tancování, především lineové salsy. Až mi nyní salsa diktuje, kam poletím. :-)

Jedno mne však trápí – nemáme u nás doma dostatek míst a lidí, kde a s kým lze lineu tancovat. Aneb jakmile se člověk jednou namlsá v zahraničí, nesnadno se dokáže smířit se situací doma. Proto pokud máte zájem salsu zkusit, najít si v tancování zálibu a rozšířit českou komunitu, usnadním vám hledání dobrých lektorů. Po internetu je totiž spoustu kurzů, ale následující lektoři jsou kvalitní!

Jak jsem zápasil s Reactem

Před rokem jsem potřeboval napsat pro svoji aplikaci klientskou stranu jako SPA. Hodně se mluvilo (a stále mluví) o Reactu, tak jsem ho použil. Po roce, na rozdíl od Ruby, ho stále používám a jsem spokojen. Ale proběhlo několik velkých předělávek. Není vše tak růžové, jak se zdá.

React je totiž pouze V ze zkratky MVC. I když se zdá, že dělá víc, opravdu se jedná jen o view. A tuhle část zvládá naprosto perfektně! Jenže je potřeba taky M a C. Což je problém, protože jsme ve světe JavaScriptu a teď si vyberte mezi Fluxem, Refluxem, Reduxem, … prostě nějakým -uxem.

Podle vybraného uxu se vám při šťastném výběru zodpoví pár dalších otázek, jako například props vs. state či one store vs. many stores. Spíš očekávám, že to je něco, na co stejně narazíte. Sám jsem se držel Fluxu, neb je také od Facebooku. Ze zkušeností s JS světem jsem se raději držel toho, aby byla co největší šance kompatibility a zdrojů na internetu. Což znamená, že zmíněné otázky nejsou vyřešeny.

Krása Reactu či Fluxu spočívá zejména ve volnosti. Ono je to vlastně velice jednoduchý koncept a můžete ho použít kdekoliv. Buď jen koncept nebo celou knihovnu. Například Angular je skutečně plnohodnotný framework a můžete React využívat jen pro šablony. Tak lze teoreticky spojit výhody z obou světů. Prakticky nemám ozkoušené.

Nastupovat do vlaku Angular vs. Angular 2 se mi nechtělo, takže jsem stále zůstal u Reactu s Fluxem a snažil se otázky sám vyřešit. Vyzkoušel jsem mít spoustu malých storů a vše předávat statem. Vyzkoušel jsem mít jeden store a vše předávat propsy. Každý způsob má něco do sebe, ale popravdě čím větší aplikace byla, tím mi největší smysl dávalo najít se někde uprostřed.

Což tak nějak přirozeně sedí i s použitím React Routeru. Vždy jedna stránka má hlavní komponentu, které se předávají data ze storu statem a všem svým podkomponentám se dál data dostávají přes propsy. Funguje krásně, ale je hodně těžké najít tu správnou střední cestu. Každopádně pokud použití není přirozené, našel jsem chybu v architektuře komponent.

Abych však cestu neměl tak jednoduchou, prošel jsem si ještě jedním refaktorem – naverbováním Immutable.js, další knihovna od Facebooku. Bez ní totiž React postrádá jakýchkoliv výhod. To myslím vážně, jakýkoliv. Pomalé odezvy jsou nemyslitelné a zabijí jakoukoliv jinou výhodu. Reactí systém přerenderování pouze v případě potřeby funguje totiž pouze s Immutable.js a napsanými funkcemi shouldComponentUpdate. Bez toho nešlo aplikaci používat.

Což ale lehce komplikuje psaní kódu už tak komplikovanější prostředí. Například className či encType mne neskutečně irituje a těžce se debuguje, kde je chyba. Například chyba při renderování se v některých případech nenareportuje a když ano, traceback není úplně jasný.

Takovou čtvrtou velkou otázkou je, jak vlastně poskládat store? Co dovolit číst z venku, jak si udělat přehledné poslouchání na eventy a další. Opět jsem zkusil mít zveřejněné vše a nic. Jestli mít spíš kód ve storu či dispatcheru. Opět mi vyšla nejlépe střední cesta, od každého trochu dle potřeb.

Ale hej, React je fajn. Prototyp jsem měl hotov za den, pak už jsem jen zápasil s tím, jakým stylem napsat, aby bylo připravené pro mé potřeby. Navíc spoustu věcí jsem dostal zadarmo, například routing (react-router), klávesové zkratky (react-hotkeys) či Bootstrapcké komponenty (i když ty se vyžívají v neustálém předělávání a za čas strávený upgrady jsem mohl mít svoji vymazlenou stabilní verzi).

Závěrem: v práci jsem si vyzkoušel i Angular a díval se detailněji na Redux. Pokud bych psal další SPA, znovu bych sáhl po Reactu s Fluxem, Immutable.js a Routerem a šel cestou střední cesty, co se hlavních otázek týče. Nakonec je to jednoduché na použití a přehledný flow aplikace. Každopádně to neznamená React použít. Weby renderované na serveru mají stále své kouzlo. Vlastně je to, řekl bych, pro většinu webových aplikací ta lepší varianta.

setup.py nebo requirements.txt?

Pár dní zpět Armin Ronacher (tvůrce Flasku, Werkzeugu, Jinjy a dalších) tweetnul, ať se přestane používat requirements.txt a použije se setup.py s přepínačem --editable. Což rozpoutalo menší diskuzi na Twitteru i u nás v práci. U obou diskuzí se odkazovalo také na starší článek popisující rozdíl mezi těmito možnostnostmi.

A v čem je tedy ten setup.py lepší, resp. proč ho Armin doporučuje oproti requirements.txt?

Jak už je zmíněno v článku, setup.py má na starost seznam abstraktních závislostí. Dá se to přirovnat jako název tagu bez konkrétního Git repozitáře. Prostě chci requests ve verzi 2.10, ale neřeším, odkud se závislost stáhne. Může to být oficiální pypi.org, ale taky odkudkoliv jinud. Jenže to nestačí, pokud se v requests objeví chyba, kterou si opravím ve vlastním forku a nemohu čekat, než se dostane do upstreamu. Pak tu je requirements.txt, kam lze napsat odkud se má závislost stáhnout, klidně na konkrétní commit.

Jak tedy řešit takové případy bez requirements.txt?

Než odpovím, je potřeba si uvědomit složitější závislosti. Mám aplikaci a ta využívá například requests a knihovnu na stahování a parsování XML, která taky využívá requests. V případě vlastní verze requests bych pak musel nejen upravit závislost v mé aplikaci, ale také v knihovně, která vyžaduje requests. Což by vedlo k dalšímu forku jen kvůli jiné závislosti. Samozřejmě čím zanořenější závislosti budou, tím se stane komplikovanější něco takového udržovat.

Proto je lepší zůstat u abstraktních závislostí a při instalaci jen říkat, odkud se mají závislosti stahovat. Mohu buď využívat oficiální pypi nebo si udělat klidně i vlastní server. Při problému pak dám do svého registru balíků verzi, kterou potřebuji, a nemusím měnit všude závislosti na konkrétní.

Dobře, to mi dává smysl. Ale je to vhodné pro všechny?

Není. Pro střední a větší firmy určitě, pro malý soukromý projekt spíš ne. Navíc osobně mi přijde nejlepší aplikaci balit do prostředí, kde má běžet. Pokud je to Debian, pak nejlepší cesta je debianí balíček. S ním mohu řešit nejen Pythoní závislosti, ale také Céčkové a jiné závislosti a spoustu dalších věcí jako konfigurační soubory, logrotate, cron, … Vše hezky v jednom.

Ale princip zůstává stejný. Pořád je potřeba řešit vlastní verze, ať už z důvodu, že jsem opravil chybu, která ještě není mergnutá a publikovaná v upstreamu, či daná knihovna není ubalena jako deb balík. Opět nejlehčí mít vlastní debianí strom balíků.

No a co ten přepínač --editable?

Znáte takovou situaci, kdy upravíte knihovnu, nainstalujete lokálně, jdete vyzkoušet, zda aplikace si s ní rozumí, nerozumí, a tak proces opakujete? Tak právě --editable zařídí, že se nainstaluje jednou a změny jsou ihned dostupné. Soubory se nezkopírují, ale nalinkují se do pracovního adresáře. Tedy lehčí debugging.

Abych to shrnul, se setup.py je jednodušší správa závislostí, lehčí debugování a mimochodem to také zařídí, že vaše aplikace je importovatelná. Což je o čem Armin tweetoval. No a třeba své důvody brzy sám ještě upřesní. :-)

Nenechte se rušit

Přijde mi, že v dnešní době moderní technologie = neustálé rušení. Že vlastně počítače nepracují pro nás, ale naopak nás neustále ruší. Každá aplikace má v sobě spoustu notifikací, aby náhodou něco neuteklo. A nejde pouze o aplikace, ale taky o staré dobré smsky a telefonáty.

V době chytrých telefonů si téměř každý myslí, že když napíše, dostane hned odpověď. A úplně každý si myslí, že je vždy dostupný pro telefonát. Není a nedostane. Doporučil bych všem si přečíst osm rad, jak učinit telefonii radostnější. Osm, ne deset. Body „#5 neposílat idiotskou sms“ a „#6 neposlat sms s otázkou“ mi nepřijdou idiotské. Naopak mi přijdou správné z pohledu rušení a etikety (viz Mobilní etiketa ve Velké knize etikety od Špačka). Optat se smskou či se zeptat, kdy bude člověk dostupný pro telefonát, mi přijde mnohem lepší, než druhou stranu rušit.

Ještě vetší problém jsou však zmíněné aplikace. Otravují nás tak často, až si můžete všímat u lidí, jak automaticky, aniž by telefon pípnul, jdou zkontrolovat stavy na sociálních sítích. Perfektně o tom mluví jeden bloger ve svém blogpostu, proč zrušil jeho účty na sociálních sítích. Příběh o tom, jak dospělá(!) žena střední třídy(!!) 24× shlédla Facebook v osmi minutách, je děsivý.

Děsivý hned ze dvou důvodů: první, že si dokážeme vybudovat takovou závislost. Za druhé, že to dělá hodně lidí a dáváme tak Facebooku velkou moc. Doporučování obsahu je dobrá věc, sám si dělám vlastní systém doporučování obsahu z internetu pro vlastní potřeby. Ale takhle se oddávat jedné službě a vybudovat si navíc závislost opravdu není zdravé.

Navíc tím, že máme v našem telefonu kdekoliv na světě naše přátelé na dosah, jim můžeme kdykoliv napsat. Vlastně si píšeme hodně, ale paradoxně se tím cítíme víc samotní. Protože ve výsledku nemluvíme s lidmi kolem nás. Podívejte se na video Changing the world starts with you (Jay Shetty), ve kterém mluví nejen o tomto paradoxu:

Tedy jsem všechny notifikace vypnul, krom příchozího hovoru. Na Facebooku jsem si zrušil celý feed, abych nic neviděl, i když se podívám. Mám to tak měsíc a vůbec mi nic nechybí. Pociťuji úlevu. Mohu se volněji bavit s lidmi. Je taky aspoň důvod se sejít osobně a nesedět doma (což někdy ani nevím, co to je být doma).

Časem mám v plánu některé sociální sítě úplně zrušit. Ale určitě zůstanu u blogování. Mnoho lidí to neví, ale sociální sítě nejsou jen Facebook a Twitter. Doporučuji vám taky vše povypínat a přesunout se zpět do internetu a reality.

Kdy je programátor nejefektivnější?

Všiml jsem si na sobě jedné věci, která výrazně ovlivňuje mou efektivitu práce. V menší míře také chuť k práci. Bohužel ji neumím přesně pojmenovat, je to spíš mix různých věcí, ale věřím, že se mi jednou povede přijít s přesným pojmenováním. Nebo třeba někoho z vás. :-)

Nejpřesněji bych řekl zodpovědnost. Čím větší zodpovědnost mám, tím jsem efektivnější. Zkusím vysvětlit na několika případech.

Pracuji ve volném čase na vlastním projektu, kde řeším vše. Produkťáka, scrummastera, UXáka, front-endového i back-endového programátora, databázového specialistu, systémového administrátora, testera i uživatele. O projektu vím naprosto vše ze všech stran a svůj čas dělím mezi všechny role. Jaký to má dopad na výkon? Za jeden den dokážu naprogramovat tolik věcí, kolik by mi v práci, kde jsem pouze programátor, trvalo několik dní.

Jak je to možné? Jednoduše, při programování na svém projektu mám úplně vše v hlavě. Vše v jedné paměti, žádná latence synchronizace dat, žádné nedorozumění, jednoduše mám všechny možné informace postupovat mílovými kroky kupředu přes všechny překážky. Když v práci narazím na něco, co mi není jasné, potřebji se někoho zeptat. Takové záseky stojí spoustu času, nemluvě o tom, že ta správná osoba s odpovědí nemusí být po ruce. Ještě problemovější je, pokud programátor není seznámen s doménou projektu. Například u obchodní aplikace neznalost fungování obchodního či fakturačního oddělení má velký vliv na efektivitu.

Další příklad: v práci jsem vedl dlouho tým a dokázal jsem udělat neskutečné množství práce. Odmanažerovat, chodit na schůzky, vše sledovat a ještě vyřešit rekordní počet bugů či posunout projekt hodně kupředu. Pár lidí se mne ptalo, jak to dokážu, a já nikdy neměl odpověď. Už zřejmě mám – po pěti letech jsem znal aplikaci téměř celou, naučil jsem se řešenou doménu (obchod a fakturace) a byl jsem team leader, tedy také jsem věděl, co se děje a chystá na celé službě. To mi dalo téměř stejné možnosti jako doma na svém projektu. Při překážce jsem si dokázal odpovědět sám a věděl jsem, kdy si co mohu dovolit.

Vychází mi z toho, že abych byl efektivní, musím splnit následující body:

  • Naučit se doménu. Velmi dobře pochopit proč, jak a co dělám. To mi odstraní záseky, jak mám dané featury naprogramovat.
  • Sledovat co se děje na celé službě/projektu. To mi odstraní záseky při rozhodování, co je efektivní udělat dřív a co později.
  • Být full-stack developer. To mi odstraní záseky pří rozhraní dvou jazyků, typicky server a prohlížeč.
  • Získat důvěru. To mi odstraní záseky při rozhodování, jaké řešení zvolit.

Proto při přechodu do nového týmu nejprve pročtu všechny dostupné dokumentace, jak týmu, tak použitých technologií a knihoven. Prolezu poslední zápisy z retra a plánování. Naučím se zběžně, co se může hodit. Dokončit první úkol na dvě hodiny mi sice trvá třeba týden, ale naboostí mne to na všechny další.

A jak to máte vy, co vám pomáhá programovat efektivněji?

Ruby po vystřízlivění

Ruby mne hodně lákalo. Má několik zajímavých programátorských konceptů a syntaktických vychytávek, které se mi moc líbily a chtěl si je vyzkoušet. Vyzkoušel jsem si tedy Ruby pro jedno webové API a vyhnul se RoR, abych si vyzkoušel skutečné Ruby. Dopadlo to tak, že jsem si API po pár měsících přepsal do oblíbeného Pythonu.

Ruby má totiž opravdu spoustu vychytávek. Problém je, že jich má tolik, až není jasné, kdy bych měl kterou použít. Například se mi líbilo, že lze volat funkci různými způsoby, buď jako normální funkci, nebo jakoby kód funkce byl na místě volání. To pak otevírá možnosti zavolat třeba i předčasné ukončení „rodičovské“ funkce. Jenže pak je každé volání jiné a nikdy nevím, které použít. Je i několik způsobů na dědičnost, vyhazování výjimek, přístupu k atributům, podmínkování, vytváření polí, … a v různých knihovnách se využívají různé způsoby.

Což je problém. Sám jsem nevěděl, jaký přístup zvolit. Víc a víc jsem řešil, jak je která knihovna napsaná a jak bych si měl kód strukturovat. Navíc Ruby má podobný problém jako dřív JavaScript: Ruby on Rails je odpovědí na téměř jakoukoliv otázku. Což mne pak ještě více mátlo, protože jsem těžko rozpoznával, co je vlastně čisté Ruby, co built-in moduly, co third-party moduly a co RoR.

Na Ruby je vlastně krásně vidět problém, který je popisován v knize Coders at Work: Programátoři při psaní kódu chtějí přidat něco svého. Jenže je více věcí, které lze přidat, než věcí, které by se pouze měli přidat.

Zároveň s Ruby jsem na svém projektu použil i Haskell a ten jsem si naopak zamiloval. Je totiž Ruby přesným opakem, základ je velice jednoduchý. Začal jsem si tak více vážit věty z Pythoního modulu this: There should be one– and preferably only one –obvious way to do it.

Takže jsem si Ruby zkusil a tuto kapitolu uzavřel smazáním kódu. Jediné, co mi bude skutečně chybět, jsou vestavěné regulární výrazy.

Komentáře jsou nejdůležitější částí kódu

Už je tomu šest let, co jsem psal o hezkém kódu na Zdrojáku. Sice bych to dnes po zkušenostech na několika velkých projektech napsal lehce jinak, ale stejně je skvělé, jak jsem se sám tenkrát k něčemu takovému dostal a dokázal sdílet s ostatními. Každopádně – popisoval jsem, že komentáře je lepší nepsat. Pokud je nutkání napsat komentář, mnohem lepší varianta je upravit kód, aby byl samopopisný.

S tím stále souhlasím. Dostal jsem se však do bodu, kdy i když je kód popisný a hezký, komentář napíšu. To hned z několika důvodů. Ukážu na příkladech. První příklad budiž snippet z Flasku:

@app.before_request
def require_login():
    if is_user_logged_in():
        return

    if flask.request.endpoint == 'static':
        return

    view = get_current_view()
    if not view:
        return

    if is_view_public():
        return

    flask.abort(403)

Když přečtu za sebou, jak je, hned je zřejmé, co se děje. Volně přeloženo do češtiny: ověř přihlášení před zpracováním jakéhokoliv požadavku. Ale proč se to netýká statických souborů? Statické soubory nejsou chráněné? A vlastně – proč statické soubory řeší Flask a ne něco rychlejšího? Komentáře hned objasní…

@app.before_request
def require_login():
    if is_user_logged_in():
        return

    # Static files are not protected. Only in development without nginx.
    if flask.request.endpoint == 'static':
        return

    # Not found page is not protected.
    view = get_current_view()
    if not view:
        return

    if is_view_public(view):
        return

    flask.abort(403)

Pojďme na další ukázku z jednoho malého scriptu, který jsem nedávno psal:

def load_config_variable(key):
    variable = connection.configserver.variable.getAttributes(key)
    utc = dateutil.tz.tzoffset(None, 0)
    local = dateutil.tz.tzlocal()
    variable['since'] = variable['since'].replace(tzinfo=utc).astimezone(local)
    return variable

Opět je jasné, co se děje. Načítám proměnnou z konfiguračního serveru. Jenže, proč se tu přepočítává datum do jiné časové zóny? A proč zrovna do lokální a ne do jiné? Co se stane, když se změní čas z letního na zimní a obráceně?

#FIXME: Konexe ma spanou implementaci casovych zon. Z aware RPC datetimu prevadi
#       na naive Pythoni datetime (se ztratou informace o zone se zapocitanim
#       offsetu). Takze tu mame naive datum v UTC. Musime ho obohatit tedy o
#       zonu, aby slo do configserveru zpet zapsat.
#       Smazat jakmile se opravi prace se zonou v RPC.

Nyní už není pochyb, proč to tu je. Dokonce i co je potřeba udělat, aby bylo zase v pořádku.

Další ukázka z Reactu:

let EntryActions = {
    (...)
    reportProblem: function(id) {
        AppDispatcher.handleAction({
            actionType: RSSConstants.ENTRY_REPORT_PROBLEM,
            id: id,
        });
        EntryService.reportProblem(id);
    }
    (...)
};

Z úryvku je patrné, že se při odpálení akce z UI vyšle, že je s nějakým záznamem problém. To se pomocí service odešle na server. Ale co když se komunikace se serverem nezdaří? Na to tu nikde není žádný kód, to vypadá na chybu. S komentářem opět dodá informaci o úmyslu:

// Dve moznosti:
//  1) Jen na par tydnu, nez se vyladi zaznamy. Jelikoz se brzy smaze,
//     nema tedy smysl resit rollback v UI.
//  2) Nebo se bude ladit donekonecna, pak ale bude potreba i vyzadovat komentar,
//     aby se dobre zpracovavalo, a tudiz udelat jinak, tedy nema smysl resit rollback v UI.

Další příklad mohou být Jasmínové testy. Kolega napsal vše v pořádku, ale u jednoho describe měl pouze jeden it s prázdným popisem. Zdálo se mi to jako chyba. Přitom to měl promyšlené – struktura testů byla dle logických celků, ale jedna malá drobnost do toho ne úplně zapadala. Ale zachoval to, což bych při návštěvě kódu pravděpodobně změnil. Poprosil jsem ho tedy o komentář, jak zamýšlel strukturu testů, aby další kolemjdoucí dodržel.

Jinými slovy se snažím říct, že vy možná právě teď komentáře u čitelného kódu nepotřebujete. Komentáře s úmyslem jsou ale pro ostatní, včetně vás za pár měsíců či týdnů. Záleží jak dobře paměť slouží. Protože s takovými komentáři se lze vyhnout zbytečným chybám. Líbil se mi na toto téma tweet s následujícím gifem a popiskem „Why is this code here? We don't need this.“. :-)

Dokonce jsem zjistil, že mi pomáhá psát komentáře průběžně při vývoji všeho možného. Často sahám na spoustu míst a měním několik věcí najednou. Prototypuji. Rychle kód prasím. Až pak ho uhlazuji. Přijde mi to rychlejší než sáhodlouze přemýšlet, jak to udělat hezky na první dobrou. Proto si píšu komentáře, co se mi honí hlavou, a při uhlazování je postupně zpracovávám. Ve výsledku commitnu minimum napsaných komentářů, neb je proměnním v samopopisný kód a zůstanou jen ty komentáře vysvětlující úmysl.

A jelikož nejlepší komentář vysvětluje úmysl, přijde mi, že je častokrát důležitější, než kód samotný. Udělal jsem si takový malý průzkum a zjistil, že neexistuje žádný skin, kde by komentář nebyl téměř neviditelný. Proto jsem si sám ve všech používaných editorech nastavil komentáře tučně a křiklavě červené. Mám to tak přes měsíc a naprostá spokojenost.

Už jen škoda míst, kde nelze psát komentáře. Například v debianích souborech bych rád napsal, proč se například do deb balíku dávají i nějaké soubory a jiné naopak ne. Když to pak nejde, musí se napsat do dokumentace bokem. Jenže já mám tak rád, když se dokumentace generuje z kódu a nemusím na to myslet…

Na závěr taková perlička. Před dvěma lety jsem napsal takový ne zrovna hezký (asi tak jako samotný úkol), ale funkční, algoritmus na automatické generování práv v aplikaci. Napsal jsem k pár řádkům následující komentář (na který jsem úspěšně zapomněl) a kluci před pár dny našli:

# So you found a bug here. It's probably 2016. You know, it can't be
# fixed. You have to rewrite it completely. And what about your trip to
# Australia, was it good?

:-)

Nejlevnější letenka neznamená levnější dovolená

Nedávno jsem narazil na článek, jak hledat nejlevnější letenku. Já bych chtěl poukázat na to, že se honit za nejlepší letenkou nemá smysl. Ano, stále letenka bývá nejdražší položkou, ale…

…zaměnit destinace se ne vždy vyplatí. Například brzy vyrazím na dva týdny do Dominikánské republiky. Nedávno jsem viděl akci na letenky v mých termínech a mohl ušetřit až polovinu. To zní dobře, jenže to mělo drobný háček: musel bych se dopravit do Německa. Což by šlo zařídit, letenkou či autobusem. Stále bych ušetřil. Jenže pokud mne potká zpoždění, letadlo na mne nepočká a letecká společnost mi automaticky nezařídí první nejbližší možný let a odškodnění.

…znova opakuji, změnit destinace se ne vždy vyplatí. Akce popsaná výše nejenže byla z Německa, ale na jiné letiště v Dominikánské republice. Mám v plánu si Dominikánu projet, takže mám let do hlavního města, kde pobudu pár nocí, a teprve pak si půjčím auto. Alternativní letenka v akci by mě dopravila do malého města, kde bych si musel auto půjčit hned a v Santo Domingo by zbytečně draze stálo.

…čas je dražší. Levnější lety mívají často velký rozestup mezi lety, třeba osm hodin. Což pak znamená méně času na místě, kam se těším, neb počet dní na dovolenou je omezený. Přitom let s lepším přestupem není o tolik dražší. Spousta lidí říká, že se dá čas využít pro prozkoumání dalšího města. Jenže to mi zase nepřijde tak dlouho, aby se člověk řádně pokochal. Raději si to město projdu někdy jindy v klidu.

…znova opakuji, čas je dražší. Popravdě nemám moc čas hledat ty nejlepší letenky. Samozřejmě sleduji různé weby a čekám na (tu správnou) akci, ale když už jdu kupovat, většinou mám brzy hotovo. Řešit letenky několik dní a zkoušet různé kombinace mne nebaví. Mám spoustu jiných aktivit a těch pár stovek, které by šlo ještě víc ušetřit, se mi nevyplatí.

Tedy ano, dát si nějakou práci, používat anonymní okno, vyhýbat se víkendům, nakupovat v noci, ale jinak nepřehánět. Má to svou daň, která si to vybere v jiné podobě. :-)

Zápisky z cest: Španělsko

Olá amigos mučačos! Gr​á​cias. Adiós!

To je asi tak vše, co jsem se naučil při mém putování severním Španělskem. Ještě jsem se naučil například servéza, jenže já jsem spíš přes ty whisky. Uměl jsem chvíli taky frázi „jsme zemědělci“, aneb co průvodce nenaučí. Kolega uměl užitečnější „jsme softwaroví inženýři“, jenže v němčině. Naštěstí mají dvojjazyčné cedule. Španělsky a baskitsky.

Cestu po Španělsku jsem začal v Bilbau s kolegy na konferenci EuroPython. Bilbao je hezké město. Spousta zeleně. Spousta prapodivných budov. Spousta prapodivného čehosi. Skvělé místo na dělání abstraktních fotek.

Ale taky adrenalinové místo. Tedy pokud jste ve skupince programátorů, která se nechce škrábat do kopce na cestu a na druhou pláž jde raději, no, řekněmě „jinou cestou“. V žabkách.

Špinaví v rozbitých žabkách s modřinami jsme poté zašli do restaurace Extanobe s michelinskou hvězdou. Naprosto parádní zážitek! Rád bych vám sem dal fotky, ale nechtěli jsme udělat foajé (= nový alias pro faux pas jedné kamarádky) focením si jídla. Aby si nás nespletli s Instagram závisláky, kteří se do takové restaurace podívají jednou za uherský rok. Každopádně měl jsem zde zatím nejlepší steak a chobotničky. Zjistil jsem, že jídlo stále skrývá spoustu zajímavých chutí. Jen bych jim vynadal za nechání dobrého lokálního vína (Fefinanes 1583) na teple a že si jednou zkrátili cestu z levé strany. Což oboje napravili a věřím, že druhou hvězdu jednou získají.

Ono vůbec v baskitské oblasti vaří hodně dobře. Například v San Sebastianu je prý největší hustota michelinských restaurací na počet obyvatel. Samozřejmě ty nejlepší jsou vybookované hodně dopředu, takže doporučuji plánovat tak měsíc předem. Týden mi na žádnou z těch nejlepších nestačil.

Všudepřítomné pinchos a tapas se naštěstí bookovat nemusí a jsou skvělé. Dokud nejíte to samé celý týden, protože za boha nemůžete přijít na to, jak se tu jí. To bylo neustále „ještě nevaříme“ a vedle naopak „už nevaříme“. Nevěděli jsme, zda vědí, co říkají, či zda my víme, co říkají. Po několika dnech jsme se poradili s papírovým průvodcem (nojo, programátoři, návody se otevírají až v případě nouze) a zjistili, že všude měli pravdu. Jen na jejich dobu obědů a večeří jsme nebyli úplně zvyklí a měli hlad v jejich siestě.

Sem tam se dá narazit na turistickou restauraci, která respektuje čas hladu turisty. Ale věřte mi, ve Španělsku chcete jíst v jejich čas v restauracích pro Španěly. Tam je to dobré jídlo. Nikde jinde. Blivajzy můžete jíst doma. Mimochodem dávejte si zmrzlinu. Kdekoliv. Všude je skvělá. V Praze se musí chodit na pár správných míst (neprozradím!), ve Španělsku k nejbližšímu okénku se zmrzlinou. A v těch teplotách se hodí vždycky.

Ufff, to jsem se rozkecal o jídle, až jsem dostal hlad. Tak se podívejte zatím na fotky a zbytek dopíšu za chvíli.

To byla procházka San Sebastianem. Všimli jste si té pláže na poslední fotce? Prý je to jedna z nejlepších pláží v Evropě. Na to jsem měl pouze jednu reakci – chudák Evropa. Ale když jsem dojel k východnímu pobřeží, měl jsem jinou reakci – který, ehm, osel psal toho průvodce? V Sebastianu se jen pořádně najezte a vyrazte do Pyrenejí. Za prvé tam je děsně kýčovité městečko Torla, které se vám prostě zalíbí.

A hlavně hezké túry. Vypadá to jak z jižní Ameriky. Nebo odjinud, prostě ne z Evropy. Například jsem s kamarádkou šel jednu z těch nejvíce profláknutých cest, viz mapa. Jen jsme ji šli v opačném pořadí. Nejprve brzy ráno ten krpál a zbytek dne jsme se ploužili celým údolím nakonec k vodopádu a zpět z kopce. A je to tak lepší. Aspoň jsme stihli být nahoře brzy a užívat si pomalé osvětlování hor. A za parného dne se už nemuseli namáhat.

Pokud si chcete cestu přes Pyreneje prodloužit, stát v koloně, nedomluvit se, nenajíst se, nedělat vůbec nic, pak doporučuji navštívit Andorru. Měli jsme bezvadný nápad se tam jet podívat. Sice se nás autopůjčovna ptala, zda máme v plánu jet za hranice do Francie a my odpověděli ne. Ale za jiné hranice snad můžeme, to se nezmiňovalo a to drobné písmo ve Španělštině, kdo to má číst, že? Prostě jsme si udělali výlet. Můžeme si sice škrtnout další zemi, ale díky karmě jsem poznal hlavně jejich kolony a vše zavřené. Aspoň uprostřed (více méně) Andorry můžete vyjít na kopeček a podívat se kolem dokola… 

Ono obecně ve Španělsku jsou ty jejich otevírací hodiny nevyzpytatelné. Po příjezdu do Torly jsme viděli krámek. Chtěli jsme nakoupit jídlo, ale nejdřív hodit kufry na hotel. Než jsme se otočili, odbyla pátá a zůstalo zavřeno do konce dne. Druhý den naopak otevírali až v sedm večer. Nikde ani zmínka o otevíracích dobách. Poučen z dřívějška jsem tedy otevřel průvodce a tam… nic. Typické Španělsko!

Udělám si vlastního průvodce: koupat se chcete na východním pobřeží. Například v Tossa de Mar. Ale běžte se koupat pozdě večer, přes den tam je zbytečně moc lidí. V noci je voda stejně dobrá, navíc s výhledem na osvětlenou pevnost. Nebo brzy ráno, což bude krásně s východem. Před hotelem Rovira je pódium a když budete mít štěstí, bude tam nějaké vystoupení. Při mé návštěvě tam hrál živý orchestr super hity. Třeba skladby z muzikálu Bídníci, ale taky znělku ze Zorra, nedávný hit Happy od Pharella a spoustu dalšího.

Bodový Michalův průvodce po Barceloně:

  • Jak mi doporučil kolega, držte se v Barceloně Španělů, nikoliv turistů. Pokud nedokážete poznat Španěla, poznáte ho podle toho, že chodí ve stínu. Turista většinou ne.
  • Pokud není zrovna dostupný stín budov, jsou tu pro tyto odpolední případy všude možně stromy. Využijte je.
  • Metro není doporučená doprava po Barceloně. Možná ani nikde jinde ve Španělsku. Nemají ho dostatečně hluboko, takže tam je hůř, než venku. Přesný opak toho, co u nás.
  • Vedro je pouze ve stanicích, ve vagonech jede klimo o sto šest.
  • Pokud se rozhodnete jít pěšky, nemusíte se bát, že budete muset šlapat do kopce. Parky tu mají eskalátory. Něco takového jsem ještě nikde neviděl… ale tak proč ne, když už jsem je viděl do posilky, tohle mne nerozhází.
  • Ještě se tu jezdí hodně na skútrech. Jakože opravdu hodně. Takže je to možnost a půjčují je zde za cca 35 éček na den. Což teda není málo, ale lepší než tu drandit autem, s kterým se tu nezaparkuje.
  • Jíst je potřeba a o tom jsem už psal. Jen doplním možnost fastfood, který jsem prubnul až v Barceloně: ne. Prostě si zvykněte na místní režim. Turisti to nedělají a tak vlezou do fastfoodu, který jede jak jsme zvyklí. Zdejší fastfoody mají třeba tři patra na sezení a neskutečné fronty. A vůbec to jídlo za to nestojí.
  • Ale mají tam internet, to jo. Sice je po Barceloně Wi-Fi zdarma, ale ne vždy funguje. Takže když je potřeba se na něco podívat, je to jedna z možností. Každopádně s jídlem bych to nespojoval.

A zase u toho jídla. Jídlo mají skvělé, ale nemohl jsem si zvyknout na jejich hodiny ani po dvou týdnech. Měl jsem hlad stále ve svůj čas. A jak je chlap hladový… Navíc projet Barcelonu a najít místo, kde odevzdat auto, není vůbec snadné. Takže jsem byl dost vynervován. Chtěl jsem jít tedy relaxovat do parku Montjuïc. Napočítat si do pěti. Set. Ale bohužel, nejedná se o park jako park. Vedou v něm rušné silnice a je v něm spoustu hřišť a muzeí a tak.

Tak jsem zkusil centrum, aka rušnější a větší Václavák. Taky se spoustou kravin a komediantů, které se Španělskem nemají nic společného. Vzdálený Gaudího park Güell s výhledem na město je hezký, ale samotný výhled nikoliv. Praha se mi líbí víc. Začal jsem si říkat, že Barcelona za návštěvu nestojí. Ale pak jsem šel okouknout Picasovy obrazy a Gaudího budovy. Sám na umění moc nejsem, ale tyhle dva kluky doporučuji. 

Picasovi obrazy jsem si užil, především začátek muzea, neb mi přišlo, že v pozdějším věku už malování flákal. Jeho tvorba za mlada se mi líbila mnohem víc. Aneb jak začne být někdo slavný, změní ho to.

Gaudího jsem měl zaškatulkovaného jako „bláznivého architekta“ a popravdě se mi nechtělo moc jeho budovy prozkoumávat. Naštěstí jsem poctivý turista a jednu budovu si důkladně prošel, budovu Casa Batló. Pro mne bylo milé zjištění, že Gaudi nebyl vůbec bláznivý, ba naopak. Nejsou to pouze dizajnovky, ale vše má i prakticky promyšlené. Spoustu drobných detailů, které nejsou vlastně ani nijak sami o sobě zajímavé, ale že je vlastně použil a zkombinoval. A že to může celé vypadat zajímavě a hezky. Má ode mne palec hore.

Kdo mne zná, asi ví, že tancuji. Momentálně především salsu a bachatu. Samozřejmě když jsem, sakra, ve Španělsku, musím si užít i nějakou párty. Nevím co jsem komu udělal. Už jsem pochopil, že mi v šest večer nedají najíst. Ale že o půlnoci není na parketě ani noha, to už bylo na mne moc. V jednu sice zaplnili parket, jenže lidmi lákané na welcome drink. Navíc to tu brali spíš jako diskotéku a výzva k tanci nebyla přijata pěti ženami z pěti!

Tím jsem ukončil své putování a vrátil se ke svým oblíbeným kočkám do Prahy. Brzy zkusím přejít znovu na podobný režim stravování, ale tentokrát v Dominikáně. Tam by mohly mít ženy větší slabost pro Evropana a zatancují si se mnou. Případně to jistí můj záložní plán – rumová tour.

Adiós!