CategoryJavaScript

JavaScript: statické proměnné funkce

A tohle znáte:

Skrze název funkce můžete v jejím scope definovat proměnné, které se pak chovají jako statické proměnné a navíc jsou pomocí tečkové notace dostupně i mimo funkci 😀

console.log() pro frontendisty

Jem malé doplnění článku o možnostech funkce console.log, terntokráte pto ty, co se ve vývoji pohybují na frontendu.

Pomocí modifikátoru %c můžete stylovat výstup do konzole prohlížeče a dosáhnout tak větší čtivosti vašich logovaných informací:

Výsledek pak může vypadat třeba takto:

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:

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…

JavaScript: funkcionální map trochu jinak

Jsem si jistý, že všichni znají metodu map.

Jedná se o funkcionální přístup, který nahrazuji tento imperativní přístup:

A tohle je map

Věřím, že všem známý a na první pohled jasný příklad funkcionálního programování, kdy ani tak neříkám jak, ale co se má udělat.

A teď trochu jinak

Tak předně jsem přesvědčen o tom, že tento funkcionální přístup je pro tyto druhy výpočtu, nebo něčeho takového, asi lepším zápisem. Ale také se uvědomuji, že i spousta těch, co třeba už dnes po té co se od klasického PHP for loopu dostali až sem, neví přesně co vidí, respektive co používají.

Výše zmíněný kód s funkcí map se dá napsat i takto:

Furt to dělá to stejné, že? 🙂
Ale zápis už je jiný. Vlastně není. 🙂

Věděli jste, že parametrem metody map je funkce? Jo jo, je mi to jasné. všichni kýváte, že samozřejmě ano…
Dyť přece funkcionální programování, vole….

Proč o tom vůbec píšu?

Jedním z důvodů je, že pokud si tento drobný, samozřejmý detail uvědomíte, pak můžete psát třeba i takto:

Líbí?

Pokud ano, pak máte nakročeno nejenom k tomu, že skutečně pochopíte funkcionální programování, ale že jednou budete schopni skutečně psát i větší aplikace a nezaseknete se, jako většina ve stádiu hele kámo, já umím procházet polem. 🙂

Takže ještě jednou: Proč?

Jak se chcete dostat k takovým věcem, jeko je modularizace kódu, jeho dekompozice, nebo možná třeba jen refaktoring, když neuvidíte věci jak je máte vidět?

Myslím si, že pokud se naučíte hledat drobnosti a budete skutečně vidět detaily, může se z vás jednou skutečně stát dobrý programátor 🙂

JavaScript: proměnná jako klíč v objektu

Pokud byste chtěli v objektu nějak dynamicky generovat název klíče, pak takto:

NodeJS: Threads, práce s vlákny

NodeJS je báječný, a to hlavně díky svému Async I/O. Dalším silným znakem je to, že NodeJS je Single Threaded Event Loop Architecture. Jednoduché, čitelné a výkoné paradigma pro webové aplikace stavějící na Request/Response modelu.

Na základě tětchto principů se NodeJS moc nehodi na takové věci, jako je Machine Learning, nebo Artificial Intelligence, jinými slovy, úlohy závislé na silné paralelizaci. Byť vzhledem k tom, že je samotný javascriptový engine napsaný v C++ a nabízí tak dost vysoký výkon.

Tedy až do teď! 🙂

Od verze 10.5.0 umí NodeJS pracovat s vlákny! Což z něj dělá prostředí vhodné i pro věci kolem strojového učení a umělé inteligence. Funkcionalitu vláken přináší modul worker_threads.

Modul je dostupný od verze 10.5.0 a jen v při spuštění s paramatrem
--experimental-worker, protože se zatím jedná o novinku.

Příklad spuštění javascriptového kódu v několika, v tomto případě ve 2 vláknech.

Z příkladu je jasné, že v procesu potomka můžete spouštět jakýkoliv javascriptový kód, sdílet s rodičovským procesem proměnné (paměť) a také posílat si navzájem zprávy. Vše, co byste po vícevláknových aplikací požadovali.

Dokumentace modulu worker_threads.

Kvalita dokumentace…

Nádherná ukázka toho, jak i rádoby dokumentace může být špatná…

Screenshot jsem pořídil ze stránek w3schools.com 🙂 Vím, že tohle není oficiální dokumentace, ale znám spoustu lidí, co odtud čerpají a berou informace odsud za ty jedině správné…

© 2018 pepa.holla.cz

Theme by Anders NorénUp ↑