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.
- Například setuptool obsahuje funkci find_packages, takže není potřeba ručně vypisovat.
- Udržujte si
MANIFEST.in
sami a pořádně. - Taky jste narazili na problém s konstantou
VERSION
při importu v setup.py? Existuje několik řešení. __init__.py
určitě znáte. Znáte i__main__
?- Občas balík má nepovinnou závislost, která se prostě flákne mezi ostatní závislosti. Existuje hezčí varianta.
- A tak dále…
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.