NodeJS: debugování aplikací

Tímto článkem vykopávám asi větší a obsáhlejší samostatné téma, kterým je debugování NodeJS aplikací. Téma, které nepotřebujete hned jak začnete psát v JavaScriptu, nicméně se k němu určitě postupem času, tak jak vaše aplikace začnou být složitější, nebo jim začně docházet dech, propracujete.

Numeral.js

Vsuvka bokem: Numeral.js je pěkná JS knihovna, která vám pomůže pěkně a jednoduše formátovat informace např. s velikostí volné paměti a podobně. Zvláště pak jeji funkce format().

process.memoryUsage()

process.memoryUsage(): úplně tou nejzákladnější informací o kondici vaší aplikace může být info o tom, jak jste na tom s pamětí. Kolik si ji alokujete, kolik ji GC vrací zpět, ale hlavně kolik jí díky špatně navrženým algoritmům konzumujete a neuvolňujete. Tím pádem GC nemůže vracet paměť zpět do systému a vznikají vám memory leaky, které mohou mít za následek až třeba pád samotné aplikace.

Výstupem je pak info o využití paměti vaší NodeJS aplikací:

Debugging v Chrome DevTools

Chrome DevTools je sada nástrojů, které vám umožní monitorovat, debugovat vaši aplikaci přímo v internetovém plohlížeči Chrome. Ano, i to v NodeJS… Jediné co musíte, je spustit node s parametrem --inspect. Detaily najdete na této stránce.

Prohlížeč se pak díky websocketům, které NodeJS inscpector využívá, připojí na vaší aplikaci a uožní jí takto monitorovat přímo v okně prohlížeče.

Jediné co pak musíte udělat je přimo v prohlížeči otevřít stránku chrome://inspect/

V sekci Remote Target pak uvidíte vaší aplikaci spuštěnou s parametrem --inspect.

Po poroklinutí na ní se pak už dostáváte na nové okno, kde můžete procházet detailními informacemi o vybrané aplikaci.

Jen začátek…

V žádném případě si nedělám iluze o tom, že bych měl tímto postem pokrýt celé téma debugování JavaScriptových aplikací. Jde o první krok, výkop, na který budou navazovat další samostatné příspěvky, které budou popisovat nějaké mé rady, návody, postřehy.

JavaScript: nejen console.log()

Nejpoužívanějším příkazem pro debugování JavaScriptových aplikací je console.log(). Ale věděli jste, že výstup můžete formátovat:

Předpokládám, že console.dir(), console.table() všichni znají, ale co třebe console.assert()?

Do console se zapíše, jen když se 1. parametr funkce nebude pravda:

V případě, že výraz bude pravda, pak se žádný výstup do console neprovede.

Další pěknou funkcí je console.count():

Výsledkem pak bude vlastní počítadlo, které se inkrementuje jen když je čílo dělitelné bezezbytku 2:

Super je také console.trace():

Skrze tuto funkci dostanete do konzolového výstupu svou vlastní informaci, ale i info o tom, odkud jste tuto funkci zavolali…

Funkci console.time(), asi každý zná, ale pro úplnost:

Výstupem pak bude informace o tom, jak dlouho trvalo sečíst včechny čísla do 10.000.000 v milisekundách:

No a poslední funkcí je console.group() a console.groupEnd():

Výsledkem je pak pěkně zformátovaný, odsazený, a tedy u čitelný výstup třeba nějakých strukturovaných dat:

AWS Technical Essentials

Rychlé prototypování JavaScriptu a TypeScriptu v MS VS Code

Znáte to: vyvíjíte aplikace a rádi byste si čas od času něco rychle odzkoušeli. Tím odzkoušeli myslím napsali nějaký kus kódu a hned byste rádi věděli co to dělá. Třeba okamžitě viděli obsah definované proměnné, výsledek volání funkce. A nejlépe bez toho, že byste museli celý svůj kód spouštět, nebo překládat a spuštět. A vůbec nejvíc kůůůůl by bylo, kdyby jste to viděli hned v kódu. Přímo tam, kde ho píšete, protože tam vás to přeci zajímá.

HOLLA!
mám pro vás pěkný plugin do MS Visual Studio Code.
Quokka!

Pěkně si píšete do playbooku nějaký kód, který se vám pod rukama přímo vykonává a do editoru se vém pěkně propisuje jeho výsledek. Super!

Dobré i například pro nějaké vyukové, nebo demonstrativní účely.

Otevírání souborů z terminálu na MacOS

Už je to nějaký ten rok, co jsem nahradil, ke své spokojenosti, plně funkční notebook s OS Linux v distribuci Fedora, za svého prvního Meka.

Aby hned bylo jasné, že to nebylo jen tak! Měl jsem stroj, který v té době měl ojedinělých 32GB RAM, Intel i7 a FullHD LCD! Prostě bomba!

Byl jsem extrémně efektivní na konzoli. Vyvíjet, nasazovat a spravovat vše co mi běželo na linuxech byla jedna radost.

Nicméně problémy přicházely v momentech, kdy jsem měl pracovat třeba s MS dokumenty, koukat na filmy, nebo tak něco. Neříkám, že se to nedalo řešit, ale práce s tím byla…

A to byl vlastně důvod pro svůj přechod na Mac. Chtěl jsem zůstat maximálně efektivní a získat nějaké přívětivější prostředí. Přechod na Widle byl samozřejmě nemožný. Bez toho, že bych chtěl nějak rozdmýchávat nějaké svaté války to tak prostě je, Dodnes si myslím, že když vyvíjíte, nasazujete, hrajete si, zkoušíte a chcete to dělat často a pohodlně, pak prostě Windowsy ne!

Půl roku jsem chodil jak mlsný pes kolem a analyzoval vše, co jsem potřeboval vědět, abych si jednoho dne mohl svého Meka koupit. První Pročko, které jsem si pořídil nebylo tak výkonné, jak stroj který jsem s ním nahrazoval, ale jiné jeho přednosti, sladěnost celého prostředí a benefity, které nabídl celý ekosystém Applu vše nahradily.

Apple si mě získal a dnes bych si nedokázal představit, že bych měl pracovat na něčem jiném.

Nicméně dodnes se snažím zůstat maximálně efektivní a většinu času dál trávím v terminálu, který jen tak mimochodem, mám na Meku ještě radši, a to díky i iTermu.

A tady se dostávám k utilitě, na kterou jsem narazil tento týden a která mi umožňuje ještě více a efektivněji pracovat na příkazové řádce.

duti

duti je utilita, která vám umožní spravovat asociace souborů dle svých přípon s konkrétními aplikacemi nainstalovanými do vašeho MacOS. Jinými slovy: můžete přímo v terminálu zjišťovat a nastavovat kterou aplikací se daný soubor má otevřít. To je velice pohodlné právě v případě, že jste v terminálu a používáte příkaz open pro fyzické otevření, editaci souboru. Díky příkazu open nemusíte zjišťovat s jakou aplikací je soubor spojen. Prostě se vám otevře v té spravná aplikaci. No a proto duti.

Instalace utility

Zjištění souborové asociace

Získáte info o tom, jaká aplikace je asociovaná k souborům s příponou js.

Nastavení souborové asociace

Nastaví Insider jako výchozí aplikaci pro všechny JS soubory.

Získání ID aplikace

Abyste dokázali nastavit požadovanou aplikaci, potřebujete znát její ID. K tomu slouží utilita osascript, pomocí které požadované ID získáte:

Aplikace Visual Studio Code – Insiders.app má ID com.microsoft.VSCodeInsiders

Hotovo

Takto můžete upravovat asociaci pro jakýkoliv soubor v rámci vašeho stroje a terminál se stane vašim skutečným přítelem, pokud se tak už nestalo. 😀

Var dump v JavaScriptu, TypeScriptu

Řekněme, že máte nějakou strukturovanou proměnou.

… nebo jakoukoliv jinou…

A pak byste chtěli nějak jednoduše debugovat, řekněme, že stačí jen vypisovat do konzole:

Výstupem pak bude, v tom lepším případě, že máte nějaký lepší shell a dobře jej nakonfigurovaný, toto:

Alternativně můžete použít funci JSON.stringify

Abyste pak dostali toto:

Ale tohle už nené object, ale JSON….

A tím jsme nejzákladnější možnosti vyčerpali…

Dobrou zprávou je, že přímo v jednom z core balíčku NodeJS utils existuje funkce inspect, která vaše možnosti dál výnamně rozšiřuje.
Její základní použití:

A výsledek pak vypadá následovně:

Přidáním sorted a compact získáte pěkný a abecedně seřazený výstup:

Dokumentaci k funkci najdete zde.

JavaScript: příkaz versus výraz

Tohle všichni určitě znáte a běžně děláte. A ti lepší z vás i několikrát denně 😀

A teď by mě zajímalo, kdo používý tento zápis:

Blbost, že? Ale potěší a ušetří 2 řádky kódu 😀

sleep(), nebo wait() v NodeJS

Znáte to: čas od času byste rádi na něco počkali. A zrovna to čekání není moc v souladu s asynchronní povahou samotného NodeJS.

NodeJS, narozdíl od sleep v PHP, nebo time.sleep v Pythonu, žádnou takovou funkcionalitu, zaplať pán bůh, nemá.

Proč byste měli třeba čekat?
Modelová situace: někde na vaší API, nebo někde úplně mimo váš dosah, spustíte například nějakým POST requestem proces, který nevíte kdy skončí, nebo jak dlouho bude trvat. Takže vám nezbude nic jiného, než se stále dokola ptát na nějakém endpointu, jestli už proces nedoběhl a API má pro vás data. No a abyste APInu nezahltily tunou nic neřešících requestů a nedostali se tak třeba na nějaký black list, je dobré mezi odesláním každého requestu nějakou dobu počkat a opakovaně se ptát až po nějakém rozumném časovém intervalu.

Třeba takto

Srdcem tohoto jednoduchého konceptu je jen využití Promise a díky syntax sugaru async/await, to pak celé vypadá takto imperativně, pochopitelně, pro každého péhápkáře 😀

Kód je tak dlouhý, protože v něm demonstruju krom samotnéo sleep() i vše kolem…

Muzika mě táhne… chtěl bych umět třeba na trumpetu.

A nebojte se vydržet do 1:20. Stojí to za to.

Budoucnost organizací: něco málo o lídrech

Lídři musejí být ochotni zcela odevzdat svou moc skupině. Už nemohou ovládat nebo kamkoliv směrovat výsledek. Musejí naprosto důvěřovat, že skupina dokáže prostřednictvím společného vnímání přijít s lepšími odpovědmi, než jaké by vymysleli oni sami…

Jen málo lídru v dnešních organizací je na něco takového připraveno..

Strategie diktovaná shora prozatím zůstává tou výchozí a bezpečnou možností pro lídry, kteří si chtějí udržet kontrolu…

Výsledky výzkumů i zkušenosti z praxe opakovaně prokazují, že projekty změn diktované shora povětšinou selhávají…

— Frederic Laloux, Budoucnost organizací.

Vím, že tohle není o IT, ale je to pro mě a myslím si, že v dnešní době pro daleko více lidé aktuální téme.

© 2018 pepa.holla.cz

Theme by Anders NorénUp ↑