Krvavý měsíc

Na dnešek mezi třetí a pátou bylo možné sledovat zatmění, jaké se vidí jednou za hodně dlouhou dobu. Jednalo se totiž o úplněk s plným zatměním měsíce. Další takové bude až v roce 2029. Měl jsem bohužel dost oblačno, ale i tak podívaná stála za to. Než mne mraky od show úplně odřízly, zkusil jsem udělat pár fotek…

Zápisky z cest: Londýn

To jsem takhle přemýšlel, kam se jet podívat na krátký výlet. Ve sluchátkách mi zrovna hráli Piano Guys, což bylo dostatečně inspirativní. Podíval jsem se, kde mají koncerty a po vyfiltrování zbyly Paříž a Londýn. Po ověření volných míst pouze Londýn.

Pro ty z vás, kteří neví, co jsou Piano Guys:

Tak jsem koupil vstupenku, letenku a vyrazil. A nelituji. Sice v polovině koncertu jsem si říkal, že hrají sice hezky, ale showmeni to moc nejsou, naštěstí druhá polovina to celé zachránila. Bezvadně prokládali humorem a hudbou.

V několika videích mají, že skladba je poskládána z X zvukových stop. Zajímalo mne tedy, jak vlastně jejich hudba zní, když hrají na pódiu bez postprodukce. Téměř stejně! Čelista má repeater, kterým si ovládal opakování různých částí. Během chvilky tam vykouzlil přes deset zvukových stop, což jsem vůbec nechápal, jak sám zvládá. Dobře on!

Což o to, ještě více mne zajímalo, jak dlouho natáčeli video, kde běhají kolem klavíru (poslední video výše). Spadla mi brada, když začali právě takto obíhat. Živě. Na pódiu. Před mýma očima. Bez chyby.

Jsou prostě skvělí a je dobře, že neskončili u prodávání klavírů. Tak to totiž vzniklo – klavírista chtěl prodávat klavíry. Měl nápad udělat reklamní video, kde něco zahraje. Známý mu doporučil čelistu, ať to nemá tak suché. Natočili jedno video. A bylo tak dobré, že žádný klavír neprodali. Měli spoustu práce s dalšími. Rád se na ně pojedu podívat znovu, jakmile obmění repertoár. :-)


No a když už jsem byl v tom Londýně, pochodil jsem si trochu kolem. Začal jsem v Baker Street, jelikož jsem to měl blízko. Doporučuji si předem načíst pár příběhů, aby návštěva měla fakt smysl. Na detaily paměť opravdu nemám a tak jsem si neužil rekvizity tak, jak bych mohl. Ale i tak bylo zajímavé navštívit místo navržené z knih, které mám rád.

Hned jsem zapátral v paměti, jaké další velké osobnosti v Londýně jsou. Třeba Shakespeare… Šel jsem jak na prohlídku divadla, tak na samotné představení. Nezapomenutelný zážitek, který doporučuji. Sice neoplývám perfektní angličtinou a ještě k tomu se vyznat v tolika postavách hry King John mi dělalo trochu problémy, ale i tak jsem si užil herecké výkony a zpracování. Líbí se mi, jak dříve herci hráli mezi lidmi. O to víc jsem nelitoval lístkem na stání uprostřed davu. Kolem mne totiž herci normálně hráli. Úplně jiný zážitek, než klasické divadlo.

Když jsem u toho úplně jiného zážitku, další podobný pocit jsem měl z katedrály St. Paul. Normálně mne takové budovy nechávají chladné. Přeci jen jsou všechny tak nějak na jedno brdo a jsem takový ateista, že se ani nebojím, že mne Bůh potrestá. Každopádně až tam jsem zažil perfektní zvuk varhan. Jak je katedrála obrovská, zvuk se tam nádherně rozléhá a poslouchá. Jestli někdy skončím v Londýně, zajdu si tam občas odpočinout.

I vnitřek patří k těm lepším. Bohužel focení je zakázané. Aspoň dovolují fotit ze střechy okolí Londýna. A vidět, jak se téměř všude něco staví.

Ale zpět k velkým osobnostem Londýna. Jako třetí se nabízí Bond. James Bond. Toho jsem neměl v plánu navštěvovat (beztak by někde zachraňovat svět), ale beru to jako vyřízené při sledování výměny stráží u Buckinghamského paláce.

Londýn nabízí taky další turistická místa. Například London Eye, což je asi zbytečná ztráta času. Minimálně je potřeba si koupit vstupenku online, aby se nečekalo moc dlouho ve frontě.

Kolem řeky je lepší druhá strana Londýna, kde je právě zmíněný Shakespeare Globe a katedrála. Ale také Tower Bridge a Tower of London. Moc se mi líbila prohlídka provázená královniným gardistou (jestli lze takto přeložit Yeomen Warder). Škoda, že prohlídka není delší. Aspoň dvojnásobná. Vše totiž podával se skvělým britským humorem. Jasně, když jsem šel kolem jiné skupinky, slova byla téměř shodná; mají to nacvičené. Ale to jsou všechna divadelní představení. :-)

Například měl vtipné poznámky na moderní dobu s telefony neustále v ruce. Jakmile někoho viděl s telefonem, hned byl středem posměchu. Nebo se vyptával kdo odkud je. Když se ptal po lidech ze Zélandu, vítal je zpět doma. Či nabádal ženy, až budou stát u krásných drahokamů, aby se podívaly na svou ruku, poté na svou drahou polovičku, napřáhly se a daly takovou facku, jakou v životě ještě nedostal! (Nejsem holt brit a podání je sušší. Jeďte si to poslechnout osobně.)

Ano. Britské klenoty jsou dostupné každý den bez front. Bez žádného bookingu a front jsem měl možnost vidět klenoty jen tak, že jsem šel prostě kolem. Jen fotit jsem nemohl. Naše české jsem ještě neměl příležitost vidět…

Při prohlídce Tower of London jsem se taky dozvěděl, že Británie dostávala spoustu dárků od různých států. Spoustu exotických věcí, ale i zvířat. Sice nevěděli, jak se o taková zvířata starat, ale měli je u sebe a snažili se. Taková menší ZOO. Třeba afričtí sloni nebo čínský drak.

K závěru něco o Londýně všeobecně. Začnu asi dopravou. Říkává se, že motat se v Londýnským metru není žádná sranda. Osobně mi to přišlo velmi dobře zmáklé. V Praze máme možná o něco jednodušší značení, ale taky jsme oproti Londýnu vesnice. Což přináší, že v případě bydlení zde je potřeba mít práci opravdu blízko. Nad zemí se pohybovat je děsně pomalé. I když jako vyhlídková cesta dvoupatrovým autobusem je supr. Ale na skutečné cestování je lepší metro. Které bývá tak přeplněné, že si nelze ani číst. Jako alternativa jsou všude přítomné Santandery. Kola k zapůjčení za docela slušný peníz.

Což se nedá říct o zbytku dopravě. Krátká cesta z letiště do města vlakem stojí necelých 20 liber (vyplatí se vlak zabookovat s předstihem a ušetřit nějakou tu libru). Lítačka po městě (pouze centrum) na pět dní 35 liber. Vůbec Londýn a celá Británie obecně je drahé místo. Když mi přicházely pracovní nabídky s tolika cifry, donutilo mne aspoň nabídku dočíst do konce. Ale teď už vím, že by ty částky musely být ještě větší, pokud bych měl žít v Británii.

Ale mají to tam hezké. Jejich styl se mi moc líbí. Ty jejich taxíky, autobusy, budky (už se nedivím, že Doctor Who nevypadá podezřele při cestování do budoucnosti), budovy, … I styl oblékání. Takové gentlemanské místo.

Python 3.0 až 3.5

Python 2.7 se hodně používá a zřejmě nějaký ten pátek ještě bude. Přechod na Python 3 se ale nevyhnutelně blíží a při takovém přechodu se skočí rovnou na nějakou nejposlednější verzi. Momentálně to může být 3.4 či dokonce před pár dny vypuštěný Python 3.5. Říkal jsem si, co vlastně všechno takového hezkého bylo přidáno od verze 3.0 do 3.5 a nebylo backportováno? Prošel jsem si všechny změny a řekl si, že se podělím o to, co mne zaujalo.

Python 3.0: Print!

print() je funkce. S tím bude těžké sžít se. První třetí verze se objevila v roce 2009 a stále jsem se nenaučil psát závorky.

Další velká změna je, že text je opravdu text a nejde mixovat s binárními daty. Takže žádné fungování při testech a poté v provozu neustálé ošetřování výjimek UnicodeDecodeError.

Všude jsou iterátory. Žádné range vs. xrange, ale pouze range vracející iterátor. Další funkce dříve vracející seznamy také jedou na iterátorech, jako třeba map, filter, zip, … Ale pozor, items, keys apod. nad slovníkem nevrací iterátor, nýbrž view. To je zase trochu něco jiného.

super() bez parametrů!

A detail možnost rozbalit tuple s hvězdičkou: (a, *rest, b) = range(5).

Python 3.1: Vůbec nic

Vše důležité bylo backportnuto i do Pythonu 2.7. Nový Python si holt teprve sedal. :-)

Python 3.2: První featury

První krůčky k asynchronnímu Pythonu, knihovna concurrent.futures.

Konečně si nebudeme muset dělat sami řešení na cachování výsledků funkcí, aneb ať žije lru_cache!

@lru_cache(maxsize=None)
def fib(n):
    if n < 2:
        return n
    return fib(n-1) + fib(n-2)

>>> [fib(n) for n in range(16)]
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610]

>>> fib.cache_info()
CacheInfo(hits=28, misses=16, maxsize=None, currsize=16)

Ve functools přibyla ještě jedna zajímavost a to, že wraps navíc přidává __wrapped__ odkazující na původní funkci. Takže jde introspektnout, vrátit atp. :-)

OrderedDict dostal novou metodu move_to_end. Jen škoda, že opak udělali ošklivě parametrem…

Je možné mít configuráky s proměnnými díky ExtendedInterpolation. Mimochodem lze předat konfiguraci i jako slovník, což dodává proměnným ještě větší šťávu!

>>> parser = ConfigParser(interpolation=ExtendedInterpolation())
>>> parser.read_dict({'buildout': {'directory': '/home/ambv/zope9'}})
>>> parser.read_string("""
    [buildout]
    find-links = ${buildout:directory}/downloads/dist
    """)
>>> parser['buildout']['find-links']
'/home/ambv/zope9/downloads/dist'

Vzniknul modul argparse. Ten byl teda backportnut i do Pythonu 2.7. Ale chci se pochlubit, že existuje i argparsedialog (jen pro trojku).

Python 3.3: Rozjíždíme…

Je to tu. Tak kolik aplikací 3.3ka složí? :-) Slovník nemá definované pořadí. V dokumentaci bylo upozornění, že se nejedná o náhodné řazení, ale rozhodně se na to nemá spoléhat. Kvůli bezpečnostní chybě už nelze pořadí předvídat.

Nová syntaxe yield from pro delegování generatorů. Především pro to, co přijde v Pythonu 3.4, aby se později stalo v 2.5 zbytečným. :-)) Zkratka pro:

>>> for item in iterable:
...    yield item

>>> yield from iterable

Virtualenv už není třeba, součástí Pythonu je nový pyvenv, který řeší všechny problémy, které nemohly tooly třetích stran vyřešit na 100 procent.

__init__.py není povinný! Ano, NE-NÍ povinný. Jen otázka, zda je to dobrý nápad. Protože pak je možné naimportovat jakýkoliv adresář…

Pokud se odchytí výjimka a ta vyhodí novou výjimku, budou vidět obě. Často zbytečné, ale věřte, že v praxi se stávají i chyby při zpracování chyby, a pak je akorát původní chyba občas nedohledatelná.

>>> class C:
...     def __init__(self, extra):
...         self._extra_attributes = extra
...     def __getattr__(self, attr):
...         try:
...             return self._extra_attributes[attr]
...         except KeyError:
...             raise AttributeError(attr)
...
>>> C({}).x
Traceback (most recent call last):
  File "", line 6, in __getattr__
KeyError: 'x'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "", line 1, in 
  File "", line 8, in __getattr__
AttributeError: x

Přes atribut __qualname__ půjde nově zjistit přesně, kde byla funkce či třída definována.

>>> class C:
...     def meth(self):
...         pass
>>> C.meth.__name__
'meth'
>>> C.meth.__qualname__
'C.meth'

Vytváření souborů a vyhodit výjimku, pokud už existuje, půjde s novým módem x.

>>> open('/tmp/somefile', 'x')
<_io.TextIOWrapper name='/tmp/aaa' mode='x' encoding='ANSI_X3.4-1968'>
>>> open('/tmp/somefile', 'x')
Traceback (most recent call last):
  File "", line 1, in 
FileExistsError: [Errno 17] File exists: '/tmp/somefile'

datetime instance dostala novou metodu timestamp. Ale že to trvalo, že? :-)

>>> some_datetime.timestamp()
1442266005.577331

Nový hezký Pythonic modul ipaddress. Díky tomu lze zapsat například: (IPv4Address('127.0.0.1') + 42).is_private.

mock je součástí unittestu!

Je zpět u'' pro lepší port z dvojky! Není to jediná drobnost, která ulehčuje přechod na trojku. Takže pokud přechod, tak minimálně na… 3.4 (ne, to není překlep, jen dnes dřívější nemá moc smysl).

Python 3.4: Balíky, balíky, balíky, …

ensurepip je nový balík zajišťující přítomnost instalací Pythonu, i když se jedná o projekt mimo samotný Python. Jinými slovy pip po ruce po instalaci Pythonu!

Nový balík pro asynchronní aplikace AsyncIO. To je kde se využije delegování generátorů. AsyncIO je totiž na generátorech tak trochu postavené.

Vlastně až balík pathlib mne nahlodal projít podrobně, co vše v Pythonu 3.x bylo přidáno a upraveno.

>>> p = Path('/etc')
>>> q = p / 'init.d' / 'reboot'
>>> q
PosixPath('/etc/init.d/reboot')
>>> q.resolve()
PosixPath('/etc/rc.d/init.d/halt')

Třeba takový enum se bude taky hodit…

>>> from enum import Enum
>>> class Color(Enum):
...     red = 1
...     green = 2
...     blue = 3
>>> type(Color.red)
<enum 'Color'>
>>> isinstance(Color.green, Color)
True
>>> print(Color.red.name)
red

Nebo různé statistické metody v modulu statistics

Modul functools se rozrostl o další užitečnosti. První z nich je partialmethod, což dodává super nové možnosti:

>>> class Cell(object):
...     def __init__(self):
...         self._alive = False
...     @property
...     def alive(self):
...         return self._alive
...     def set_state(self, state):
...         self._alive = bool(state)
...     set_alive = partialmethod(set_state, True)
...     set_dead = partialmethod(set_state, False)

A pokud vám chybělo method overloading, pak to lze aspoň trochu dohnat se singledispatch. I když nedoporučoval bych takový přístup.

>>> from functools import singledispatch
>>> @singledispatch
... def fun(arg, verbose=False):
...     if verbose:
...         print("Let me just say,", end=" ")
...     print(arg)
...
>>> @fun.register(int)
... def _(arg, verbose=False):
...     if verbose:
...         print("Strength in numbers, eh?", end=" ")
...     print(arg)
...
>>> fun("Hello, world.")
Hello, world.
>>> fun("test.", verbose=True)
Let me just say, test.
>>> fun(42, verbose=True)
Strength in numbers, eh? 42

Občas se může stát, že se do reguláru zapomene přidat dolar nebo se při nějakých změnách vytratí atp., proto další metoda fullmatch.

Zrovna nedávno jsme řešili, že naše aplikace žere docela dost paměti a občas neúměrně moc. Chtěli jsme to pořádně zanalyzovat, ale nebylo čím. Mile mne překvapil modul tracemalloc. S ním to bude sranda debugovat. :-)

Funkce min a max požírají parametr default, řešící současné vyhazování ValueError při prázdné iterable proměnné.

Python 3.5: To nejlepší nakonec

Už žádné yield from s AsyncIO. Vznik nových klíčových slov async a await. Tedy abych byl přesný, pravými klíčovými slovy budou až od Pythonu 3.7, ale je dobré se jim vyhnout už nyní.

async def read_data(db):
    data = await db.fetch('SELECT ...')

Type hinty. Druhá velká věc, o které se hodně mluví. Za mne se moc těším na možnost sem tam vynutit typ a pomoct tak i editorům v napovídání. Vlastně nemusím, jelikož se stub fily lze využít už nyní. Ale přímo v kódu je přímo v kódu. Konečně žádné cusotm dekorátory či asserty na začátku funkce.

def greeting(name: str) -> str:
    return 'Hello ' + name

Jen se mi moc nelíbí jak se budou zapisovat nějaké složitější typy s dodávanou knihovnou typing. No, diskutovalo kolem toho spoustu chytrých lidí, tak uvidíme, jaké to bude v praxi.

Krom nových klíčových slov a type hintů se dostal do Pythonu i nový operýtor @ pro násobení matic. Známá knihovna numpy přijde s podporou ve verzi 1.10. Matematici se mohou na co těšit. :-)

>>> x = numpy.ones(3)
>>> x
array([ 1., 1., 1.])

>>> m = numpy.eye(3)
>>> m
array([[ 1., 0., 0.],
       [ 0., 1., 0.],
       [ 0., 0., 1.]])

>>> x @ m
array([ 1., 1., 1.])

Kolikrát jste potřebovali zmergovat slovník a používali pro to ne úplně jasnou konstrukci dict(first, **second)? Tak nově lze pěkně hezky: {**first, **second}. Samozřejmostí je funkčnost i se seznamy, sety apod.

A to víte, že existuje možnost zabalit Pythoní aplikaci do zipu a přímo spustit? Se zipapp už ano. Zajímavá metoda pro drobnosti, které nepatří do PyPI a je zbytečné dělat jiný, třeba debianí, balík.

configparser ještě jednou. Je možné s předáním converters přidat další get* metody.

>>> parser = ConfigParser(converters={'list': [item.strip() for item in value.split() if item.strip()]})    
>>> parser.read_string("""[section]
... value = a b c d""")
>>> parser.get('section', 'value')
'a b c d'
>>> parser.getlist('section', 'value')
['a', 'b', 'c', 'd']

Pár zajímavých věcí bylo přepsáno do céčka. Například OrderedDict či lru_cache. A spoustu dalších optimalizací přes všechny releasy, jako třeba zrychlení načtení interpretu, rychlejší dumpování všeho druhu (pickle, marshall, json), rychlejší volání get property, optimalizace podmínky s výčtem (tedy lepší psát if x in {a, b, c}), …

Mne nejvíce potěšilo…

  • Vždy přítomný pip a pyvenv
  • Možnost občas hintit typy
  • Asynchronní aplikace s AsyncIO
  • Jednoduše mergovat slovníky {**first, **second}
  • Rozbalování tuplů s hvězdičkou (a, *rest, b) = range(5)
  • Možnost předat funkcím min a max defaultní hodnotu
  • Všude iterátory
  • Cachování s lru_cache
  • Práce s cestami s pathlib

Takže… taky byste nejradši hned zahodili současný codebase a použili Python 3.5? :-)

EuroPython 2015 – poznámky

Logování

Stejně tak jsem začínal i minulé poznámky. Tentokrát jsem se však dozvěděl víc. A to to, že stále neexistuje žádný pořádný tool. Resp. existuje jich spoustu a každý umí stejnou věc trochu jinak. V základu jde o to, že není potřeba otevírat logy. Automaticky jsou shromažďovány na jednom místě a analyzují se. Vyhledávají se chyby a jiné užitečné „události“. Například pomalé odpovědi, warningy atp. Tyto události se groupují a zobrazují v hezké podobě s grafem četností výskytu. Také s možností se podívat kterým lidem událost nastála a kdy se objevila poprvé, případně naposledy.

Jenže stále neexistuje nic, co by si člověk mohl nainstalovat u sebe. Dostupné tooly fungují jako služby, což v mnoha případech není možno použít z důvodu citlivých dat. Takže tu zůstává ELK (Elastic + Logstash + Kibana), což ale „jen“ graficky zobrazí logy v prohlížeči s možností filtrovat. Tedy nutno si udělat v takovém případě vlastní řešení.

Každopádně je důležité si uvědomit, že aktuální situace na zpracování logů je stále nedostačující. Pokud nemáte problém posílat data cizí službě, běžte do toho (seznam různých možností). Pokud máte, investujte čas minimálně do ELK. Věřte mi. :-)

Type Hinty

S novým Pythonem 3.5 přijde PEP 484 – type hinty. Není divu, že o nich bylo hned několik přednášek. Ale nic velkolepého. Mohlo se slyšet o obhajobě, proč něco takového se do Pythonu vůbec zavádí. Jak to vlastně vypadá. Proč to je takové… ošklivé. A tak.

Osobně mi takové diskuze přišli zbytečné. Jasně, že type hinty jsou fajn. Však to známe z jiných jazyků. A jelikož Python je nezavádí povinně a ani na ně nebude defaultně reagovat, není ani potřeba nic řešit. Naopak spoustu starostí odpadne. Třeba nebude potřeba psát asserty. Pylint nebude mít problémy. A hlavně, což je ze všeho nejdůležitější, editory budou schopné lépe napovídat. Například PyCharm přijde s plnou podporou někdy na podzim. Pylint zase příští rok v totálně přepracované verzi 2.

OK, type hinty jsou fajn, jenže my jedeme stále na Pythonu 2.7… Za prvé, není potřeba se stydět. Za druhé, je možné psát tzv. stub files už dnes. :-)

AsyncIO

Dalším velkým tématem bylo asyncio. Přeci jen se stále jedná o novinku.

Pokud vám jde opravdu o výkon, nejvýkonnější asynchronní aplikaci napíšete ve Scale. Ale zdroják není tak pěkný. Hned v závěsu se drží Pythoní Tornádo s asyncio. A nejhůře dopadla Node.js aplikace. Podrobnosti v přednášce Better asynchronous with Tornado and Python 3.

Už kdysi jsem si hrál s asyncio v Pythonu 3.3, což je backportnutý balík z 3.4. Tak nějak mne vůbec nenapadlo, že by mohl existovat port i na nižší verzi Pythonu. U trojky mi to přišlo zbytečné a na dvojku nemožné. Ale existuje – balík trollius. Sice nemá příliš podpory ze strany knihoven, ale za zmínku stojí opět podpora Tornáda.

Sice s asyncio vypadá asynchronní kód jako synchronní, i tak potřebuje trochu změn v testech. Na což pro můj oblíbený pytest existuje plugin pytest-asyncio. Není to jediná knihovna využívající asyncio, od vydání Python 3.4 vzniklo spoustu užitečných knihoven na napojení všemožných databází atp.

Testování

Narazil jsem na velmi zajímavý tool na vylepšení pytestu – po změne kódu či testu automaticky spustit jen ty testy, kterých se změna týká. Zní to opravdu skvěle a vypadá ještě lépe. Ale jedná se o beta verzi a u nás v práci jsme to zatím nerozchodili kvůli závislostem. Počin to je i tak obdivuhodný. Balík se jmenuje pytest-testmon.

V programu jsem zahlédl ještě jednu zajímavou předášku o testování pro machine learning. Bohužel zajímavá byla pouze na papíře. Než jsme se prokousali přes úvodní slajdy, co je vlastně machine learning, nezbyl pořádně žádný čas na to, jak je možné takové programy testovat. Jen že numpy má pár vychytaných assertů. Tak i to se hodí vědět, i když žádný velký zázrak.

Balíčkování

Neustálý boj, jak vlastně distribuovat aplikaci. Buď jednoduše jako Git repozitář. Nebo přes Python balíček. Či jako skutečnou aplikaci jako debianí (či jiný OS) balíček. Jenže při debianím balíčku těžko dáme závislost na pypi. Ale opět, jako vždy, vítězí poslední možnost. Do Pythoního balíčku prostě celá aplikace nepatří. Tečka. Nesnažte se to dělat.

Naopak Pythoní balíček pro knihovny a další tooly je jako dělané. A umí spoustu věcí, o kterých pravděpodobně ani netušíte.

Na balíčkování jsem navštívil ještě jednu přednášku o pluggy. To je totiž způsob, jak funguje pytest a pluginy pro něj. Většinou nic takového nikdo nepotřebuje, ale když na to přijde… je už funkční hezké řešení. Teda, pokud nepočítám, že se jedná zatím o alpha verzi a ještě nemá ani dokumentaci. Ale to přijde! Zatím aspoň slidy.

Terminal Whispering

Jedna z mála přednášek, které se mi opravdu, ale opravdu líbily, byla Terminal Whispering. Bylo v ní totiž několik užitečných věcí:

  • Znáte pdb? Používáte? Taky znám a moc nepoužívám. Existuje vylepšenější, visuální, pudb.
  • Terminál podporuje spoustu escape sequences. Pro mne bylo novinkou možnost vstoupit do full-screen módu. Je to vidět u spoustu programů, ale stejně mne nenapadlo, že to je vlastně děsně jednoduché. A s knihovnou blessed o to víc!
  • Mimochodem zajímavá myšlenka je optimalizovat weby pro konzole. Tedy pokud přijdu na web přes telnet, mohu posílat i escape sekvence a ono to bude fungovat. Nic překvapivého ani nového, ba naopak. Ale kdo si to dnes uvědomuje? :-) Schválně zkuste telnet termcast.org.
  • Zadávání hesel se dá vyřešit pomocí shelového příkazu stty -echo. Aby to bylo v Pythonu hezčí, existuje ve standardní knihovně getpass.

Více v celé přednášce.

Transducers

Styl funkcionálního programování se mi líbí a velmi zajímá. Takže jsem se zašel podívat na workshop s transducery.

V jedné věte s big data dnes často uslyšíte napříkad Hadoop. Což jsou map-reduce joby přes několik serverů. Transducer je technika (představená teprve nedávno v Clojure), jak naopak map a reduce spojit do jednoho průchodu. Není to ale hlavní myšlenka. Důležitější je, jak jsou data zpracovávány. Zpracování dat je úplně odděleno od toho, jak se data dostávají dovnitř a ven. Pak kód na zpracování zůstává nezměnný i když data přicházejí třeba asynchronně.

Workshop začal cvičením, že funkce map a filter v Pythonu vlastně nejsou potřeba. Oboje lze zapsat pomocí funkce reduce. Na tom to celé stojí. Zbytek už jsou postupné hrátky až k finálnímu řešení, což je knihovna transducer. I přesto, že výsledek není těžké pochopit, napsat si vlastní řešení není zrovna jednoduché cvičení. Tedy za tři hodiny jsme se dostali sotva do poloviny. Naštěstí mi to stačilo na pochopení konceptu. Vám doporučuju spíš přečíst sérii článků o tomto tématu od stejného člověka.

O funkcionálním programování bylo více témat. Například blázinec zvaný Mochi, představená knihovna pyrsistent a další.


Poznámek mám víc, ale už to jsou jen takové drobnosti. A na spoustě přednášek jsem nebyl. Takže pokud chcete, podívejte se na přednášky sami. Všechny se nahrávaly. :-) A rozhodně stojí za to se podívat i na některé z Montréalu.

Tak jsem si pořídil konzoli…

Dlouho jsem přemýšlel si pořídit něco, na čem bych mohl hrát hry. Dávat znovu dohromady počítač se mi nechtělo. Kupovat konzoli před vydáním PS4 či Xbox One taky ne. Jenže po vydání přišlo na řadu těžké rozhodování…

Raději jsem si podal máslo, připravil večeři a místo hraní her jsem si pustil oblíbený seriál. Až jednou jsem ležel doma s chlapskou těžkou nemocí, rýmičkou, a koukal na House of Cards, kde hlavní postava Frank Underwood po večerech hraje Call of Duty. Po několika takových scén jsem neodolal, natáhl se pro notebook a porovnával obě konzole. Vyhrál PlayStation 4.

Proč jsem nechtěl počítač? Protože bych musel řešit spoustu věcí. Jakou grafickou kartu. Jaký procesor. Pro to vybrat vhodnou desku. Windows. Řešit ovladače. Instalovat různé knihovny. Složité instalace her. A pak zjistit, že to prostě nespustím, protože XYZ. Možná dneska je situace lepší, ale už jsem měl doma půjčen Xbox 360 pro GTA V a konzole se mi líbí.

Pustím, vložím kotouč a mohu hrát. Od rozbalení PS4 po spuštění uběhlo pouhých třicet minut a to jsem si vše stihl prohlídnout a vytvořit účet u Sony. Nyní kdykoliv sáhnu po kompatibilní hře, mohu hrát během minutky, aniž bych musel cokoliv řešit. Paráda!

Jenže… jenže mne asi nebaví hrát. Je to nějaký pátek, co jsem si konzoli přinesl, hrál pár týdnů, a nyní to je pouze další pracholapka na stole. Nebo možná hry nejsou co bývaly. Hodně mne bavily závodní hry, hry typu GTA (takže GTA) a běžné střílečky. Užil jsem si spoustu zábavy s Flaty, Collinem, GTAčkem, Countrem či Callem.

S PlayStationem jsem si přinesl hry Need for Speed: Rivals, CoD: Advanced Warfare a FarCry 4. Jsou to vydařené hry. Po grafické stránce velký skok kupředu od toho, co si pamatuji. Slintám, i když jsou prý na počítači detaily lepší. Jenže jen toto mi ke spokojenosti nestačí.

U závodních her mi přijde, že se samotné závodění opouští pro pohyb v menu. Čas strávený ve hře vs. čas strávený na trati je sakra rozdílný. O GTA jsem psal dříve. FarCry mi přijde tak nějak podobné. A střílečky se mi zdají na můj vkus příliš komplikované.

Nu což, aspoň mám konečně na čem hrát, když k tomu jednou za čas dojde. Třeba přes zimu PlayStation opráším pro nový Star Wars Battlefront… 

Zápisky z cest: Norsko

Výlet do Norska byla rozhodně plnohodnotná dovolená. Jelikož mívám často nějaké problémy, bez nějakých zádrhelů by to prostě nebylo ono.

Aneb jak jsme nedojeli do Norska

Nikdy, opakuji nikdy, nelétejte s Lufthansou. Vždycky jsem s ní měl problémy a letím s ní naposledy.

Let z Prahy měl zpoždění. Původně 30 minut, nakonec 45. Říkali, že to naženou, ale velký prdlajs nahnali. Místo sedmdesáti minut na přestup jsme měli „krásných“ patnáct. Měli jsme běžet z brány 40 na bránu 60. Zdálo se, že to stihneme do pěti minut normální chůzí… to by ale musely tyto brány být za sebou a ne každá na opačném konci terminálu. Trvalo nám přemístit se deset minut běhu po zrychlovacích pásech!

Člověk by řekl, že když se brána zavírá ve 21.45 a jsme tam ve 21.40, že je všechno v pohodě. Ale paní s úsměvem namířila prstem na tři kilometry vzdálené letadlo za sklem a pověděla „vidíte to letadlo? Tak to je vaše. Ještě tam bude stát minimálně deset minut. Ale pro vás autobus zajišťovat nebudeme. Poslední odjel před deseti minutami. Neměli jste žádnou šanci. — Jo a zapomněla jsem se zmínit, že další let poletí zítra v jedenáct ráno. Užijte si noc ve Frankfurtu!“

Chudák ženská to od nás pěkně schytala. Určitě si o mě nepomyslela, jaký to jsem milý člověk. Aspoň jsme dostali pokoj v luxusním hotelu se snídaní, převoz taxíkem a večeři do €40.

Po bohaté snídani ve Stavangeru

Do Norska jsem jel s kamarádem navštívit kamarádku ve Stavangeru, kde byla na jeden semestr. Díky tomu jsem se dozvěděl spoustu zajímavostí, aniž bych musel sám komunikovat s místními, cestovat kolem, zjišťovat různé věci a tak (prostě mi sebrala zábavu!).

  • Alkohol tu je nejdražší na světě.
  • Proto tu jsou before-party, kde se lidi opijí z domácích zásob a vyrazí se bavit až třeba kolem jedenácté.
  • Děti nemohou nosit do škol sladké. Ani třeba rohlík namazán Nutellou či marmeládou. What?!
  • Děti nemohou být doma sami za žádných okolností, pokud jim není 12 a více let.
  • Je tu velmi vysoká sexuální aktivita. Například studenti na uvítanou ve škole dostávají kondomy.
  • Chodec tu má absolutní přednost. Stačí se jen přiblížit k silnici a auta stojí. S tím se pojí, že si musíme dávat pozor – Norové vlezou do cesty bez rozhlédnutí kdekoliv a očekávají, že řidič prostě sleduje dění na chodníku a stihne zastavit.
  • Jezdí se tu hodně na kole. A to za každého počasí. Viděl jsem tu na horákovi chlápka v riflích za deště. Protože proč ne.
  • Na kole se tu jezdí opravdu hodně – všude tu mají hezké cyklostezky.
  • Prý kola, která se nezamykají, jsou všech. Jsou tu různě pohozená kola. Kdo si ho dřív vezme, toho je.
  • V Norsku je 5 milionu Norského obyvatelstva.
  • Těchto pět milionu lidí má problémy se dohodnout, který jazyk bude jejich primární.
  • Mají tedy primární dva. Oba jsou různé verze Norštiny.
  • Všichni mají oba jako povinný jazyk.
  • Všichni mají také povinnou angličtinu.
  • Tudíž vůbec není problém se domluvit anglicky opravdu s kýmkoliv.
  • Často tu umí také španělsky, protože tam jezdí na víkendy.

Osobně bych k tomu přidal ještě dalších pár bodů:

  • Prší tu.
  • Hodně.
  • Opravdu hodně.
  • Je jedno jestli držíte deštník.
  • Můžete ho držet jakkoliv.
  • Ale nepomůže vám.

S pláštěnkou to je už docela v pohodě. Holt jsme si nevybrali nejvhodnější období na návštěvu Norska (konec října).


Stavanger je moc hezké město, ale turisticky se dá projít za jeden den. Jediné, co dokáže zabavit na delší dobu jsou zdejší sochy – 23 soch (jako ta na fotce) se tu povaluje. Vyndali jsme si Pokebally a vyrazili na lov! Našli jsme jich krásných pět. :-)

Jelikož je Stavanger hlavním ropným městem Norska, šli jsme se poučit do muzea. Mají povedené muzeum, líbilo se nám a vyvrátilo spoustu našich mylných představ. Například ropa bude až do roku 2100 (dojde dřív, ale je spousta zásob), nebo že je surová ropa sladká, nebo že je sice Norsko díky ropě děsně bohaté, tvoří mu 25 % HDP a je jedním z největších dodavatelů, ale v těžbě je až 13. v pořadí. A spoustu dalších zajímavostí jak se těží. Mají tam spoustu hezkých velkých modelů.


Perfektní výlet na Trolltungu 

To byl oficiální popis. Teď ten skutečný klíčově: ani pláštěnky v silném dešti nepomáhají; tma padala rychleji, než se počítalo; kvůli zpoždění, focení a zmiňované tmě jsme byli rádi, že jsme došli k první chatce v polovině cesty (5,5 km z jedenácti); v noci silný vítr, déšť a zima, což jsme všechno měli i v chatce (rozbité okno a bylo použito málo izolepy); ráno byl vítr minimálně dvakrát silnější, než byla předpověď; tedy nebylo bezpečné pokračovat a šli jsme raději dolů; při cestě zpět jsme měli problémy, protože přes noc napršelo spousty vody a tím bylo obtížné některá místa přejít; dole jsme zjistili, že jsou místy povodně a museli jsme projíždět autem ve vodě 20 cm přes cestu.

Ale užili jsme si to. Vrátili jsme se zničený, promočený, zmrzlý, zasviněný, nevím co všechno. I tak to bylo bezva. Vyrazíme jednou znovu. Abychom došli na konec.


Preikestolen

Po Trolltunze jsme zkusili něco přístupnějšího. Preikestolen. Téměř nepršelo a občas svitlo i slunko, takže se výlet povedl. Hezky jsme si zablbli u 700 metrové propasti. Byli jsme dokonce tak nadšení, že jsme se rozhodli udělat dobrý skutek.

Při cestě zpět si nás zastavila jedna Japonka, zda ji hodíme do… vlastně ani nevíme kam. Tušíme, že do Stavangeru. Tam jsme jeli, a tak ji vzali. Moc anglicky neuměla, tak měla pár minut vysvětlit, kam vlastně jede, a pokud na opačnou stranu, svezli bychom ji alespoň k cestě, kde si stopne někoho jiného. Do Stavangeru chtěla, takže super. Jenže až když jsme byli na prvním trajektu, vypadlo z ní, že chce jet z druhé strany. A divila se, kde jsou holky.

Ona totiž nechtěla jet s námi. Ve stejný čas na Preikestolen dorazily dvě holky z Británie a tak jsme šli s nimi. Někde po cestě se Japonka dozvěděla, že holky pokračují její vysněnou cestou, takže si domluvila stop. Ale jak jsme šli dohromady, nepochopila, že k sobě nepatříme, a místo k nim naskočila do našeho auta.

Samozřejmě se ji vše podařilo vyjasnit až na trajektu, který jsme za ni zaplatili. Angličtina opravdu nebyla její silná stránka. Ani orientace v mapě. Vlastně o ni nevíme vůbec nic, protože nám nerozuměla, případně nevěděla, jak to říct.

My však jeli ještě na jednu zastávku a tak ji dovezli na vlakové nádraží. Najednou se cítila uražená, že ji nedovezeme až do města. Už nás ten dobrý skutek začal rozčilovat. Chtěli jsme ještě pár korun za trajekt, který jsme za ni zaplatili. Vytáhla zlatou kartu. Tím se vše vyjasnilo. V hlavě se mi honily myšlenky, že nejsem žádný taxikář a co asi tak mám s tou kartou dělat. Možná jsem to řekl i nahlas. Dostali jsme nějaké zajímavé japonské bonbony a rozloučili se.

Cestou na výšlap nad Stavanger jsme si o ní ještě povídali, kdo to asi tak byl zač. Večer se nám o ni i zdálo.


Tromsø

Když jsme přiletěli do Tromsø, žádný sníh tam nebyl. Večer trochu začalo sněžit a ráno bylo místy až sedm centimetrů sněhu. Takže naše procházky kolem byly tak trochu brodění se sněhem. Ale užili jsme si to. Přes den jsme měli krásně a i večer jsme se kochali krásnými výhledy.

Těšili jsme se tedy na polární záři. Byl to tak trochu důvod, proč jsme se jeli podívat za polární kruh. Dokonce byla velká šance. Jenže vždy když bylo možné polární záři vidět, byla sněhová vánice. Tak příště.

Mimochodem v Tromsø mají spoustu tunelů, dokonce i křižovatky po zemí. Že by odtud název Norsko? :-)

Škatulkování programátorů

Když se člověk podívá na nabídky práce, často narazí na škatulkování. Vlastně téměř pokaždé. Jednou to je Pythonista, jindy JavaScriptář, pak zase PHPčkář, C++kař, databázista a tak dále. K tomu nějaká nutná praxe. Máme to i u nás v práci.

Osobně se mi dělení nelíbí. Naopak mi přijde super mít mix lidí. Už jsem o tom nepřímo psal. Mix ve smyslu, kdy každý má jiný background. Jinou školu. Jinak přemýšlí. Má rád něco jiného. Je úplně v pořádku, když jeden zbožňuje Javu, jiný Go, další Haskell či třeba LISP. To neznamená, že všichni nemůžeme pracovat v Pythonu a přinášet super nápady odjinud.

Moc by se mi líbilo, kdyby se hledali „šikovní programátoři™“ a nijak se nedělili ani po náboru. Tým dostane několik úkolů a ať si tým úkoly rozebere sám dle libosti. Chceš teď chvíli řešit HTML5 a CSS3, aby sis osahal, co se změnilo od dob IE šestky? Chceš omrknout novinku React a ES6? Chceš zkusit ladit výkon databáze, či aplikace celkově? Chceš se naučit Python? Chceš si zkusit konfigurovat servery? Jasně, běž do toho!

Ano, někomu bez daných zkušeností to bude trvat o něco déle. Ale zase je do toho zapálen! Dělat neustále to samé člověka unavuje, až se mu do práce vůbec nechce. Pak tu je možnost párovat. Ten, kdo umí, může dělat nováčkovi v dané technologii pozorovatele a tím ho naučit. Stále to je o něco časově náročnější, ale jedná se o investici do budoucna. A když se jedná o něco, co neumí nikdo, někdo už určitě bude mít chuť se na danou věc mrknout.

Samozřejmě tím nechci říct, že všichni by měli být full-stack vývojáři. Jde mi o to, aby programátoři nebyli svázáni a mohli si vybrat úkoly dle libosti. Od client-side, přes server-side, přes mobilní aplikace až po vše, co tým vyvíjí. Pokud chce někdo zůstat u toho, co umí nejlépe, a všem tak vyhovuje, nemá smysl nijak měnit.

Takhle jsem to měl v hlavě a započal nedávno experiment. Zatím to vypadá na pozitivní reakce. Takže už nehledáme Pythonistu. Ani JavaScriptáře. Ale šikovného programátora, kterému nevadí v takovém prostředí programovat. Zbytek už naučíme. Chceš pracovat s námi? :-)

Django vs. Flask, Rails vs. Sinatra

Výběr frameworku je vždy náročný úkol. V Pythonu jsou nejznámější webové frameworky Django a Flask, který ale vybrat? Vyzkoušeny mám oba pro velké projekty za různých okolností a nemám výherce. Každý je dobrý k něčemu jinému. V Ruby je podobná volba Rails nebo Sinatra. To, že nemám výherce, ale neznamená, že nevím, po kterém sáhnout. Naopak dnes už to vím přesně. Popíšu na dvou případech:

1) Když jsem začínal BOObook.cz, neměl jsem nic a potřeboval jsem rychle něco mít. Sáhl jsem po Djangu, připravil projekt, a ještě tu noc jsem měl základní kostru se šablonami, formuláři, modelem, databází, sessionou a administrací. Mohl jsem se zaměřit na featury a jakmile něco nevyhovovalo, postupně měnit za svůj kód. Například vyměnit/upravit administraci, vlastní servírování souborů chráněné přihlášením a podobně.

2) Když jsme si v práci řekli, že je na čase přejít na open source framework (z našeho interního z dob, kdy ještě nic takového neexistovalo), sáhli jsme po Flasku. Měli jsme totiž vše a Flask nemá nic. Díky tomu nám dovolil ho použít ihned a postupně přecházet na nové šablony, formuláře, modely, session atp. Byl to sice komplikovanější proces, než začít paralelně na zelené louce, jenže přepsat celou aplikaci by trvalo roky. Nyní máme přechod za sebou a funguje nám jak nová, tak stará, ještě nepřepsaná, část aplikace.

Co to tedy znamená?

Django je all-in-one balíček. Od routingu, přes modely a formuláře až po šablony. Samozřejmě nechybí spoustu šikovných či dokonce potřebných utilit. Tedy nainstalujete, přečtete si dokumentaci, první ukázku a můžete se zaměřit na vaši aplikaci.

Flask je naopak vlastně jen routing a vše se musí poskládat z dalších knihoven dle potřeby. Často Jinja, WTForms, SQLAlchemy a další. Tedy nainstalujete, přečtete si dokumentaci a hledáte best practices, jak komponenty poskládat dohromady pro vaši potřebu.

Z toho vyplývá mé doporučení: pokud nemusíte použít nějaké vlastní komponenty, je lepší sáhnout po Djangu. Díky tomu se lze zaměřit na vývoj webové aplikace a neřešit, jak validovat vstupní data, jak si držet sessionu, jak přistupovat k databázi a dalším zdrojům, … S jednou výjimkou – Django je kanón na vrabce, takže nemá smysl se ho držet pro opravdu miniaturní webovou stránku.

Co Rails vs. Sinatra?

Tam to vidím stejně. S tím, že Django se jmenuje Rails a Flask je Sinatra.

Jediný rozdíl vidím ve výjimce. Chtěl jsem se podívat, co zajímavého nabízí Ruby, a tak ho využil pro jedno API k mému novému pet projektu. Jelikož se jedná o SPA a veškerý kód je v JavaScriptu, sáhl jsem po Sinatře. Což byla asi chyba, jelikož jako ve světe JavaScriptu často lidi radí, jak problém vyřešit s jQuery, ve světe Ruby naopak radí, jak problém vyřešit s Rails. Je pak těžké najít čisté Ruby. Na druhou stranu s Rails bych nevěděl, co znamená čisté Ruby. :-)

#programmerhumor

Zápisky z cest: Skotsko

Do Skotska jsem se jel podívat ze dvou důvodů: PyCON konference, o které jsem již psal, a kvůli skotské whisky. Cesta začala komicky hned na začátku příjezdem na konferenci. Po ní kluci odjeli domů a já se přesunul do Skotska.

Musím říct, že se mi styl Britských budov líbí. Líbí se mi, i jak mají všude široké stezky. Jízdní pruhy pro cyklisty vedle chodců, nikoliv mezi auty. Líbí se mi místní rychlé, tiché, časté a přesné vlaky. I ta levá strana mi přijde osobně přirozenější (jsem tak trochu levej). Dovedl bych si představit v tomto prostředí žít. Už jen proto, že je to kousek k dobré whisky.


Vstup do Skotska pro mne byl Edinburgh. Moc krásně kýčovité město. Aspoň podle fotek, které se mi povedlo zachytit. :-)) Líbilo se mi, že i když jsem se šel projít opodál, stále se drželi Skotského stylu. Málokdy jsem narazil na stavby vymykající se místnímu stylu. Jen by mne zajímalo, zda do toho spadá i nemít záclony. S těmi velkými okny jim člověk krásně vidí až do talíře. Nebo pokud nejsou doma, jak asi tak dlouho.

Dále jsem pokračoval na hrad Stirling. Vzal jsem si s sebou řidičku, abych nemusel pouze na whisky tour čichat, ale i koštovat. Takže jsem musel navštívit i místa, které nemá nic společného s alkoholem. (Žertuji, samozřejmě jsem chtěl poznat i v jakém prostředí whisky vznikala. :-))

Stirling je asi nejhezčí hrad, jaký jsem kdy navštívil. Spoustu expozic. Možnost obléknout dobové oblečení. Spoustu informací, jak to na takovém hradě probíhalo. Paráda. Mimochodem na fotografiích jsou vidět dvě komnaty. Zkuste uhodnout, která patřila královně a která králi. (Nápověda: muži to nikdy neměli lehké.)

Poté jsem ještě rychle projel Scone Palace. Nechtělo se mi věřit, že mám opravdu projet tou honosnou bránou a jet nádhernou zahradou až k paláci. V autě jsem si dělal srandu voláním „jean, připravte mi koně, za chvíli jsem doma.“ „Jean, přistavte mi k němu stoličku.“ …

„Jean, udělejte mi fotky. Užiji si krásu později, teď rychle k palírně Edradour.“

Edradour nastavila laťku hodně vysoko. Dovolili mi fotit všude. Je nejmenší a nejmalebnější. Nejpřátelštější. Prohlídka vtipná. Dostal jsem i pózu Spocka. Rozhodně doporučuji navštívit. Navíc v den návštěvy jsem měl možnost koupit jejich nejnovější kouřovou whisky a moc mi chutná.

Cesta pokračovala do Dufftownu. Místo s nejvyšší hustotou whisky palíren. Tam jsem dostal tip se podívat na Glenffidish. Osobně mi moc nesedne, ale ukážou hodně a je vidět, jak dokážou vytvořit za den tolik whisky, co třeba v Edradour za rok. A je taky taková fotogenická.

Jiné palírny, které jsem navštívil, byly takové obyčejné. Doporučil bych navštěvovat podle preferencí, jako jsem udělal já. :-) Podíval jsem se třeba ještě na Dalwhinnie, Cardhu (na fotkách; líbila se mi možnost čichání k různým surovinám a rozřazování, v jakých typech whisky můžeme danou věc hledat) a Talisker. Víc jsem jich nestihl, ale určitě se někdy pojedu podívat ještě na nějaké, minimálně mé oblíbené Lagavulin, Ardbeg a Laphroaig.

Po několika koštovacích panácích jsem opouštěl okolí Dufftownu přes Inverness. Moc jsem se nezdržoval, neb jsem spěchal, zda uvidím Lochnesku. Došlo mi totiž, proč tolik lidí vidělo Lochnesku, ale není stále žádný důkaz… whisky. Bohužel jsem stihl vystřízlivět, takže teorii budu muset zkusit ověřit ještě jednou.

Po cestě na poloostrov Skye jsme míjeli Eilean Donan Castle. Projížděli jsme až k večeru, takže dovnitř jsme se nedostali, ale zato už ani nikdo nevybíral peníze aspoň na projití kolem. :-)

Poloostrov Skye. Velmi nádherné místo, které musím někdy navštívit znovu a zdržet se déle. Škoda jen, že tu neustále prší. Ale stále. A pořád. I nám pršelo. Naštěstí jsme měli docela dobře, když jsme zrovna potřebovali. Na tomto poloostrově je jediná palírna, Talisker, a po návštěvě tohoto poloostrova chápu její charakter.

Kamarádka, která se mnou jela, má ráda Harryho Pottera, takže Glenfinnan Viaduct bylo must-see. Na prvním snímku slavná železnice, na druhém ostrov, kde byl pohřben Brumbál. 

Glencoe. Další místo, krom poloostrova Skye, které musím navštívit znovu a důkladněji. Krásná krajina, která stojí za to si ji prošlapat, ne jen projet autem.

Na konec Castle Campbell. Hrad, který mi zkomplikoval cestu. Měli jsme větší rezervu, tak jsem zahlásil, že se můžeme ještě někam podívat. Jenže mi nějak nedošlo, že pokud mám o tři hodiny větší rezervu na dálnici, mimo budu mít mnohem méně. Takže po prohlídce jsme rychle spěchali do auta a rozhodnout, kudy pojedeme. Buď se vrátit na dálnici, což bude trvat dlouho, nebo to vzít přímo směrem k letišti.

Vybrali jsme přímou variantu. Problém byl, že silnice byly takové ty skotské úzké. Takže jet po nich 60 mph je opravdu hodně. Ale aby nám to vyšlo, bylo potřeba jet trochu svižněji. Zdálo se, že se stíhá, když najednou se na silnici vyřítil ze zatáčky kamion. Z úzké zatáčky. Najel si trochu do proti pruhu. My téměř u ní se řítíme přibližně 55 mph. Po stranách je zídka, takže nejde se pořádně vyhnout. Ani ubrzdit. Rána.

Děsně jsem se lekl. Ale naštěstí se povedlo a schytalo to pouze zrcátko. Kašlal jsem na něj, aspoň jsem konečně využil pojištění, a pokračoval dál. Přes most u South Queensferry. Tam na nás už z dálky na cedulích vítala kolona a během chvilky jsme stáli v ní taky. Spočítal jsem si, že když pojedeme průměrně 30 mph, máme šanci stihnout let. Jeli jsme místy 5 mph, ale spíš stáli.

Naštěstí za mostem se to rozjelo. Potřebovali jsme ještě natankovat (půjčit s plnou, vrátit s plnou), což jsem se rozhodl plácnout přes kapsu a tankování vynechal. Na letiště jsme se dostali tak půl hodiny před odletem. Jenže nás čekalo papírování. A že škodu chtějí zaplatit hned…

Abych to zkrátil: běželi jsme a k bráně jsme se dostali včas. Včas znamená v době odletu, což by normálně nepomohlo. Ale let měl hodinu zpoždění. Aspoň, že ten hrad byl bezvadný!

Hurá sláva výletu, zmokli jsme, šrámy máme, ale zdraví už jsme tu!