Cyfroteka.pl

klikaj i czytaj online

Cyfro
Czytomierz
00414 007003 19024103 na godz. na dobę w sumie
Uczenie maszynowe z językiem JavaScript. Rozwiązywanie złożonych problemów - książka
Uczenie maszynowe z językiem JavaScript. Rozwiązywanie złożonych problemów - książka
Autor: Liczba stron: 328
Wydawca: Helion Język publikacji: polski
ISBN: 978-83-283-5196-7 Data wydania:
Lektor:
Kategoria: ebooki >> komputery i informatyka >> webmasterstwo >> javascript - programowanie
Porównaj ceny (książka, ebook (-35%), audiobook).

Uczenie maszynowe jeszcze kilka lat temu stanowiło niemal wiedzę tajemną. Nieliczni eksperci w tej dziedzinie publikowali materiały w naukowym, matematycznym języku, który wymagał biegłości w algebrze liniowej czy rachunku wektorowym. Korzystano najczęściej z Pythona i jego bibliotek. Obecnie, wraz ze wzrostem popularności uczenia maszynowego, zwiększają się możliwości jego praktycznej implementacji. Rzeczywista biegłość w tej dziedzinie wymaga jednak dogłębnego zrozumienia mechaniki działania algorytmów stosowanych w uczeniu maszynowym. Implementacja tych algorytmów w JavaScripcie jest znakomitym wyborem: język ten stał się dojrzałym, potężnym i wszechstronnym narzędziem do rozwiązywania złożonych problemów.

Chcesz nauczyć się implementacji algorytmów uczenia maszynowego bez zbytniego zagłębiania się w niuanse matematyczne? Jeśli dodatkowo znasz język JavaScript, ta książka jest dla Ciebie idealnym wyborem. Wyjaśniono w niej, w jaki sposób tworzyć własne implementacje, podano też przykłady przydatnych bibliotek. Sporo miejsca poświęcono sieciom neuronowym, ich architekturze i przykładom zastosowania. Przedstawiono takie zagadnienia jak wykrywanie twarzy, filtrowanie spamu, tworzenie systemów rekomendacji, rozpoznawanie znaków oraz przetwarzanie języka naturalnego. Znalazły się tu również wskazówki dotyczące dobierania odpowiednich bibliotek JavaScriptu, takich jak NaturalNode, brain, harthur oraz klasyfikatory, co umożliwia projektowanie bardziej inteligentnych aplikacji.

Najważniejsze zagadnienia przedstawione w książce:

Uczenie maszynowe - coś dla wyjadaczy JavaScriptu!

Znajdź podobne książki Ostatnio czytane w tej kategorii

Darmowy fragment publikacji:

Tytuł oryginału: Hands-on Machine Learning with JavaScript: Solve complex computational web problems using machine learning Tłumaczenie: Piotr Rajca ISBN: 978-83-283-5196-7 Copyright © Packt Publishing 2018. First published in the English language under the title ‘Hands-on Machine Learning with JavaScript – (9781788998246)’ Polish edition copyright © 2019 by Helion SA All rights reserved. No part of this book may be reproduced or transmitted in any form or by any means, electronic or mechanical, including photocopying, recording or by any information storage retrieval system, without permission from the Publisher. Wszelkie prawa zastrzeżone. Nieautoryzowane rozpowszechnianie całości lub fragmentu niniejszej publikacji w jakiejkolwiek postaci jest zabronione. Wykonywanie kopii metodą kserograficzną, fotograficzną, a także kopiowanie książki na nośniku filmowym, magnetycznym lub innym powoduje naruszenie praw autorskich niniejszej publikacji. Wszystkie znaki występujące w tekście są zastrzeżonymi znakami firmowymi bądź towarowymi ich właścicieli. Autor oraz Helion SA dołożyli wszelkich starań, by zawarte w tej książce informacje były kompletne i rzetelne. Nie biorą jednak żadnej odpowiedzialności ani za ich wykorzystanie, ani za związane z tym ewentualne naruszenie praw patentowych lub autorskich. Autor oraz Helion SA nie ponoszą również żadnej odpowiedzialności za ewentualne szkody wynikłe z wykorzystania informacji zawartych w książce. Helion SA ul. Kościuszki 1c, 44-100 Gliwice tel. 32 231 22 19, 32 230 98 63 e-mail: helion@helion.pl WWW: http://helion.pl (księgarnia internetowa, katalog książek) Drogi Czytelniku! Jeżeli chcesz ocenić tę książkę, zajrzyj pod adres http://helion.pl/user/opinie/umasjs Możesz tam wpisać swoje uwagi, spostrzeżenia, recenzję. Printed in Poland. • Kup książkę • Poleć książkę • Oceń książkę • Księgarnia internetowa • Lubię to! » Nasza społeczność Spis tre(cid:258)ci O autorze O recenzencie Wst(cid:218)p Rozdzia(cid:239) 1. Poznawanie potencja(cid:239)u j(cid:218)zyka JavaScript J(cid:218)zyk JavaScript Uczenie maszynowe Zalety i wyzwania zwi(cid:200)zane ze stosowaniem j(cid:218)zyka JavaScript Inicjatywa CommonJS Node.js J(cid:218)zyk TypeScript Usprawnienia wprowadzone w ES6 Let i const Klasy Importowanie modu(cid:239)ów Funkcje strza(cid:239)kowe Litera(cid:239)y obiektowe Funkcja for…of Obietnice Funkcje async/wait Przygotowywanie (cid:258)rodowiska programistycznego Instalowanie Node.js Opcjonalne zainstalowanie Yarn Tworzenie i inicjowanie przyk(cid:239)adowego projektu Tworzenie projektu „Witaj, (cid:258)wiecie!” Podsumowanie 7 8 9 15 15 18 20 21 22 24 26 26 27 29 29 31 31 32 33 34 34 35 35 36 38 Poleć książkęKup książkę Spis tre(cid:286)ci Rozdzia(cid:239) 2. Badanie danych Przetwarzanie danych Identyfikacja cech Przekle(cid:241)stwo wymiarowo(cid:258)ci Wybór cech oraz wyodr(cid:218)bnianie cech Przyk(cid:239)ad korelacji Pearsona Czyszczenie i przygotowywanie danych Obs(cid:239)uga brakuj(cid:200)cych danych Obs(cid:239)uga szumów Obs(cid:239)uga elementów odstaj(cid:200)cych Przekszta(cid:239)canie i normalizacja danych Podsumowanie Rozdzia(cid:239) 3. Przegl(cid:200)d algorytmów uczenia maszynowego Wprowadzenie do uczenia maszynowego Typy uczenia Uczenie nienadzorowane Uczenie nadzorowane Uczenie przez wzmacnianie Kategorie algorytmów Grupowanie Klasyfikacja Regresja Redukcja wymiarowo(cid:258)ci Optymalizacja Przetwarzanie j(cid:218)zyka naturalnego Przetwarzanie obrazów Podsumowanie Rozdzia(cid:239) 4. Algorytmy grupowania na podstawie klastrów (cid:165)rednia i odleg(cid:239)o(cid:258)(cid:202) Pisanie algorytmu k-(cid:258)rednich Przygotowanie (cid:258)rodowiska Inicjalizacja algorytmu Testowanie losowo wygenerowanych centroidów Przypisywanie punktów do centroidów Aktualizowanie po(cid:239)o(cid:285)enia centroidów P(cid:218)tla g(cid:239)ówna Przyk(cid:239)ad 1. — k-(cid:258)rednich na prostych danych dwuwymiarowych Przyk(cid:239)ad 2. — dane trójwymiarowe Algorytm k-(cid:258)rednich, kiedy k nie jest znane Podsumowanie 4 39 39 42 43 45 48 51 51 53 58 61 68 69 70 70 72 75 83 84 84 84 85 85 86 86 87 87 89 90 93 93 94 99 100 102 106 107 114 116 122 Poleć książkęKup książkę Rozdzia(cid:239) 5. Algorytmy klasyfikacji k najbli(cid:285)szych s(cid:200)siadów Implementacja algorytmu KNN Naiwny klasyfikator bayesowski Tokenizacja Implementacja algorytmu Przyk(cid:239)ad 3. — ocenianie charakteru recenzji filmów Maszyna wektorów no(cid:258)nych Lasy losowe Podsumowanie Rozdzia(cid:239) 6. Algorytmy regu(cid:239) asocjacyjnych Z matematycznego punktu widzenia Z punktu widzenia algorytmu Zastosowania regu(cid:239)y asocjacji Przyk(cid:239)ad — dane ze sprzeda(cid:285)y detalicznej Podsumowanie Rozdzia(cid:239) 7. Przewidywanie z u(cid:285)yciem algorytmów regresji Porównanie regresji i klasyfikacji Podstawy regresji Przyk(cid:239)ad 1. — regresja liniowa Przyk(cid:239)ad 2. — regresja wyk(cid:239)adnicza Przyk(cid:239)ad 3. — regresja wielomianowa Inne techniki analizy szeregów czasowych Filtrowanie Analiza sezonowo(cid:258)ci Analiza fourierowska Podsumowanie Rozdzia(cid:239) 8. Algorytmy sztucznych sieci neuronowych Opis koncepcji sieci neuronowych Uczenie metod(cid:200) propagacji wstecznej Przyk(cid:239)ad — XOR z u(cid:285)yciem TensorFlow.js Podsumowanie Rozdzia(cid:239) 9. G(cid:239)(cid:218)bokie sieci neuronowe Konwolucyjne sieci neuronowe Konwolucje oraz warstwy konwolucyjne Przyk(cid:239)ad — zbiór MNIST r(cid:218)cznie zapisanych cyfr Rekurencyjne sieci neuronowe SimpleRNN Topologia GRU D(cid:239)uga pami(cid:218)(cid:202) krótkoterminowa — LSTM Podsumowanie Spis tre(cid:286)ci 123 124 125 138 140 141 150 154 162 168 169 171 174 176 178 182 183 184 185 189 193 198 200 201 203 204 206 209 210 214 217 224 227 228 229 234 241 242 246 249 252 5 Poleć książkęKup książkę Spis tre(cid:286)ci Rozdzia(cid:239) 10. Przetwarzanie j(cid:218)zyka naturalnego w praktyce Odleg(cid:239)o(cid:258)(cid:202) edycyjna Wa(cid:285)enie termów — odwrotna cz(cid:218)sto(cid:258)(cid:202) w dokumentach Tokenizacja Stemming Fonetyka Oznaczanie cz(cid:218)(cid:258)ci mowy Techniki przekazywania s(cid:239)ów do sieci neuronowych Podsumowanie Rozdzia(cid:239) 11. Stosowanie uczenia maszynowego w aplikacjach czasu rzeczywistego Serializacja modeli Uczenie modeli na serwerze W(cid:200)tki robocze Modele samodoskonal(cid:200)ce oraz spersonalizowane Potokowanie danych Przeszukiwanie danych (cid:146)(cid:200)czenie i agregacja danych Przekszta(cid:239)cenia i normalizacja Przechowywanie i dostarczanie danych Podsumowanie Rozdzia(cid:239) 12. Wybieranie najlepszego algorytmu dla aplikacji Tryb uczenia Zadanie do wykonania Format, posta(cid:202), wej(cid:258)cie i wyj(cid:258)cie Dost(cid:218)pne zasoby W razie problemów (cid:146)(cid:200)czenie modeli Podsumowanie Skorowidz 253 255 257 263 270 272 274 276 279 281 282 283 286 287 290 291 293 295 298 300 303 305 308 309 312 313 316 318 321 6 Poleć książkęKup książkę 1 Poznawanie potencja(cid:239)u j(cid:218)zyka JavaScript W tym rozdziale zostan(cid:200) opisane nast(cid:218)puj(cid:200)ce zagadnienia: (cid:81) j(cid:218)zyk JavaScript; (cid:81) uczenie maszynowe; (cid:81) zalety i wyzwania zwi(cid:200)zane ze stosowaniem j(cid:218)zyka JavaScript; (cid:81) inicjatywa CommonJS; (cid:81) (cid:258)rodowisko Node.js; (cid:81) j(cid:218)zyk TypeScript; (cid:81) usprawnienia wprowadzone w ES6; (cid:81) przygotowywanie (cid:258)rodowiska do programowania. J(cid:218)zyk JavaScript Zaczyna(cid:239)em pisa(cid:202) o uczeniu maszynowym (ang. machine learning — ML) w j(cid:218)zyku Java- Script w 2010 r. W tamtym czasie (cid:258)rodowisko Node.js by(cid:239)o czym ca(cid:239)kowicie nowym, a Java- Script dopiero zaczyna(cid:239) udowadnia(cid:202) swoj(cid:200) przydatno(cid:258)(cid:202) jako j(cid:218)zyk programowania. Przez d(cid:239)ugi okres historii internetu by(cid:239) postrzegany jako raczej ma(cid:239)o powa(cid:285)ny j(cid:218)zyk, u(cid:285)ywany jedynie do tworzenia prostych, dynamicznych interakcji na stronach WWW. Sposób postrzegania j(cid:218)zyka JavaScript zacz(cid:200)(cid:239) si(cid:218) zmienia(cid:202) w roku 2005, wraz z udost(cid:218)pnieniem frameworka Prototype, opracowanego w celu u(cid:239)atwienia stosowania (cid:285)(cid:200)da(cid:241) AJAX i uprosz- czenia obs(cid:239)ugi obiektu XMLHttpRequest w ró(cid:285)nych przegl(cid:200)darkach. Framework Prototype wprowadzi(cid:239) znan(cid:200) notacj(cid:218) wykorzystuj(cid:200)c(cid:200) znak $, w której np. wyra(cid:285)enie document.getEle (cid:180)mentById( myId ) mo(cid:285)na by(cid:239)o zast(cid:200)pi(cid:202) wyra(cid:285)eniem $( myId ). Poleć książkęKup książkę Uczenie maszynowe z j(cid:266)zykiem JavaScript Rok pó(cid:283)niej John Resig udost(cid:218)pni(cid:239) swoj(cid:200) niezwykle popularn(cid:200) bibliotek(cid:218) jQuery. Jak podaje serwis https://w3techs.com, biblioteka jQuery jest obecnie u(cid:285)ywana w 97 witryn WWW, których zestaw bibliotek jest znany serwisowi (to ok. 73 wszystkich istniej(cid:200)cych witryn WWW). Biblioteka jQuery zosta(cid:239)a opracowana po to, by najcz(cid:218)(cid:258)ciej stosowane operacje w j(cid:218)zyku JavaScript mo(cid:285)na by(cid:239)o wykonywa(cid:202) (cid:239)atwo i tak samo we wszystkich przegl(cid:200)darkach, udost(cid:218)pniaj(cid:200)c dla ka(cid:285)dego programisty bardzo wa(cid:285)ne narz(cid:218)dzia, takie jak obs(cid:239)uga (cid:285)(cid:200)da(cid:241) AJAX, przegl(cid:200)danie i manipulowanie DOM (ang. Document Object Model — obiektowy model dokumentu) oraz animacje. Pó(cid:283)niej, w 2008 r., zosta(cid:239)a udost(cid:218)pniona przegl(cid:200)darka Chrome oraz stosowany w niej silnik j(cid:218)zyka JavaScript — V8. Zarówno Chrome, jak i V8 stanowi(cid:239)y znacz(cid:200)cy post(cid:218)p w wydajno(cid:258)ci dzia(cid:239)ania JavaScriptu w porównaniu z innymi przegl(cid:200)darkami: JavaScript sta(cid:239) si(cid:218) szybki, co w g(cid:239)ównej mierze uda(cid:239)o si(cid:218) osi(cid:200)gn(cid:200)(cid:202) dzi(cid:218)ki zastosowaniu innowacyjnego kompilatora just-in-time, który generuje kod maszynowy bezpo(cid:258)rednio na podstawie kodu JavaScriptu. Popularno(cid:258)(cid:202) j(cid:218)zyka JavaScript wzros(cid:239)a jeszcze bardziej, kiedy jQuery i Chrome podbi(cid:239)y in- ternet. Wcze(cid:258)niej programi(cid:258)ci nie przepadali za JavaScriptem jako j(cid:218)zykiem programowania, jednak po pojawieniu si(cid:218) biblioteki jQuery i dzi(cid:218)ki szybkim przegl(cid:200)darkom sta(cid:239)o si(cid:218) jasne, (cid:285)e JavaScript by(cid:239) narz(cid:218)dziem niedocenianym i dysponuj(cid:200)cym mo(cid:285)liwo(cid:258)ciami, które wcze(cid:258)niej nie by(cid:239)y w pe(cid:239)ni wykorzystywane. W 2009 r. spo(cid:239)eczno(cid:258)(cid:202) programistów JavaScriptu postanowi(cid:239)a wyzwoli(cid:202) go ze (cid:258)rodowiska przegl(cid:200)darek WWW, w których dzia(cid:239)a(cid:239) do tej pory. Na pocz(cid:200)tku tamtego roku zosta(cid:239)a po- wo(cid:239)ana inicjatywa CommonJS, a kilka miesi(cid:218)cy pó(cid:283)niej — projekt Node.js. Celem modu(cid:239)ów CommonJS by(cid:239)o opracowanie standardowej biblioteki i poprawa ekosystemu j(cid:218)zyka Java- Script w taki sposób, by mo(cid:285)na go by(cid:239)o u(cid:285)ywa(cid:202) poza (cid:258)rodowiskiem przegl(cid:200)darek WWW. Jednym z kierunków dzia(cid:239)a(cid:241) CommonJS by(cid:239)o utworzenie standaryzowanego interfejsu wczytywania modu(cid:239)ów, który pozwoli(cid:239)by programistom na tworzenie bibliotek i udost(cid:218)pnia- nie ich innym. Udost(cid:218)pnienie (cid:258)rodowiska Node.js w po(cid:239)owie 2009 r. sta(cid:239)o si(cid:218) nowym impulsem dla rozwoju ca(cid:239)ego (cid:258)wiata j(cid:218)zyka JavaScript, udost(cid:218)pniaj(cid:200)c programistom u(cid:285)ywaj(cid:200)cym tego j(cid:218)zyka zu- pe(cid:239)nie nowy paradygmat: JavaScript jako j(cid:218)zyk dzia(cid:239)aj(cid:200)cy po stronie serwera. Zastosowanie w Node.js silnika V8 sprawi(cid:239)o, (cid:285)e (cid:258)rodowisko to dzia(cid:239)a(cid:239)o niezwykle szybko, cho(cid:202) nie tylko silnik V8 przyczyni(cid:239) si(cid:218) do jego wysokiej wydajno(cid:258)ci. W Node.js do przetwarzania (cid:285)(cid:200)da(cid:241) u(cid:285)ywana jest p(cid:218)tla obs(cid:239)ugi zdarze(cid:241), dzi(cid:218)ki czemu, cho(cid:202) (cid:258)rodowisko Node.js jest jednow(cid:200)t- kowe, mo(cid:285)e obs(cid:239)ugiwa(cid:202) du(cid:285)e ilo(cid:258)ci jednoczesnych (cid:285)(cid:200)da(cid:241). Nowo(cid:258)ci, jakimi by(cid:239)y mo(cid:285)liwo(cid:258)(cid:202) u(cid:285)ywania JavaScriptu po stronie serwera, jego zaskakuj(cid:200)ca wydajno(cid:258)(cid:202) oraz wczesne udost(cid:218)pnienie rejestru modu(cid:239)ów npm, pozwalaj(cid:200)cego programi- stom na tworzenie modu(cid:239)ów, ich publikowanie i poszukiwanie, sta(cid:239)y si(cid:218) czynnikami, które przyci(cid:200)gn(cid:218)(cid:239)y tysi(cid:200)ce programistów. Standardowe biblioteki udost(cid:218)pniane wraz z Node.js ogranicza(cid:239)y si(cid:218) g(cid:239)ównie do niskopoziomowych bibliotek wej(cid:258)cia-wyj(cid:258)cia, wi(cid:218)c programi(cid:258)ci zacz(cid:218)li (cid:258)ciga(cid:202) si(cid:218), kto stworzy pierwsz(cid:200) dobr(cid:200) bibliotek(cid:218) do obs(cid:239)ugi (cid:285)(cid:200)da(cid:241) HTTP, pierwszy (cid:239)atwy w obs(cid:239)udze serwer HTTP, pierwsz(cid:200) bibliotek(cid:218) wysokiego poziomu do przetwarzania obrazów itd. B(cid:239)yskawiczny rozwój ekosystemu j(cid:218)zyka JavaScript przyczyni(cid:239) si(cid:218) z kolei do wzrostu zaufania w(cid:258)ród programistów, którzy wcze(cid:258)niej nie byli ch(cid:218)tni do wykorzystywania 16 Poleć książkęKup książkę Rozdzia(cid:225) 1. • Poznawanie potencja(cid:225)u j(cid:266)zyka JavaScript tej technologii. Po raz pierwszy w swej historii JavaScript zacz(cid:200)(cid:239) by(cid:202) traktowany jako praw- dziwy j(cid:218)zyk programowania, a nie jako co(cid:258), co tolerowano, bo by(cid:239)o u(cid:285)ywane w przegl(cid:200)dar- kach WWW. W czasie gdy (cid:258)rodowisko JavaScriptu powoli dojrzewa(cid:239)o, spo(cid:239)eczno(cid:258)(cid:202) u(cid:285)ytkowników j(cid:218)zyka Python, zainspirowana sukcesami firmy Google, pracowa(cid:239)a nad zagadnieniami uczenia ma- szynowego. W 2006 r. zosta(cid:239)a udost(cid:218)pniona podstawowa i niezwykle popularna biblioteka obliczeniowa NumPy, cho(cid:202) w takiej czy innej formie istnia(cid:239)a ona ju(cid:285) od jakiego(cid:258) czasu. Biblioteka do uczenia maszynowego o nazwie scikit-learn zosta(cid:239)a udost(cid:218)pniona w 2010 r. i w(cid:239)a(cid:258)nie w tym momencie zdecydowa(cid:239)em si(cid:218) edukowa(cid:202) programistów JavaScriptu w kwestii zagadnie(cid:241) zwi(cid:200)zanych z uczeniem maszynowym. Popularno(cid:258)(cid:202) uczenia maszynowego w j(cid:218)zyku Python oraz (cid:239)atwo(cid:258)(cid:202) tworzenia i uczenia mo- deli przy wykorzystaniu narz(cid:218)dzi takich jak scikit-learn zaskoczy(cid:239)a zarówno mnie, jak i wiele innych osób. Na moich oczach fala popularno(cid:258)ci unios(cid:239)a balonik uczenia maszynowego — zauwa(cid:285)y(cid:239)em, (cid:285)e ze wzgl(cid:218)du na wielk(cid:200) (cid:239)atwo(cid:258)(cid:202) budowania i uruchamiania modeli wielu pro- gramistów przesta(cid:239)o rozumie(cid:202) mechanik(cid:218) dzia(cid:239)ania u(cid:285)ywanych algorytmów i technik. Uskar- (cid:285)ali si(cid:218) oni na niewystarczaj(cid:200)co dzia(cid:239)aj(cid:200)ce modele, nie zdaj(cid:200)c sobie sprawy z tego, (cid:285)e to oni sami stanowi(cid:200) s(cid:239)abe ogniwo w (cid:239)a(cid:241)cuchu. W tamtym czasie uczenie maszynowe by(cid:239)o postrzegane jako co(cid:258) mistycznego, magicznego, akademickiego, dost(cid:218)pnego tylko dla garstki geniuszy i programistów Pythona. Ja mia(cid:239)em jednak zupe(cid:239)nie inn(cid:200) opini(cid:218) na ten temat. Uczenie maszynowe to jedynie kategoria algoryt- mów i nie ma w niej nic magicznego. Wi(cid:218)kszo(cid:258)(cid:202) z tych algorytmów jest w rzeczywisto(cid:258)ci ca(cid:239)kiem prosta, i to nie bez przyczyny! Zamiast pokazywa(cid:202) programistom, jak zaimportowa(cid:202) klasyfikator bayesowski w Pythonie, wola(cid:239)em wyja(cid:258)ni(cid:202) im, jak napisa(cid:202) ten algorytm od podstaw, i pomóc w zrobieniu wa(cid:285)nego kroku na drodze do wykszta(cid:239)cenia intuicji. Pragn(cid:200)(cid:239)em tak(cid:285)e, by moi studenci w przewa(cid:285)aj(cid:200)- cym stopniu zignorowali popularne biblioteki j(cid:218)zyka Python istniej(cid:200)ce ju(cid:285) w tamtym czasie — chcia(cid:239)em w ten sposób podkre(cid:258)li(cid:202), (cid:285)e algorytmy uczenia maszynowego mo(cid:285)na imple- mentowa(cid:202) w dowolnym j(cid:218)zyku programowania, a nie tylko w Pythonie. Jako platform(cid:218) do nauczania wybra(cid:239)em j(cid:218)zyk JavaScript. Szczerze mówi(cid:200)c, wybra(cid:239)em go, gdy(cid:285) wiele osób w tamtym czasie uwa(cid:285)a(cid:239)o JavaScript za z(cid:239)y j(cid:218)zyk programowania. Moje przes(cid:239)anie by(cid:239)o nast(cid:218)puj(cid:200)ce: Uczenie maszynowe jest proste, mo(cid:285)na je implementowa(cid:202) nawet w JavaScripcie! Na moje szcz(cid:218)(cid:258)cie zarówno Node.js, jak i JavaScript b(cid:239)yskawicznie zyski- wa(cid:239)y na popularno(cid:258)ci, a w kolejnych latach moje pierwsze artyku(cid:239)y na temat uczenia maszy- nowego w JavaScripcie zosta(cid:239)y przeczytane przez miliony zainteresowanych programistów. Po cz(cid:218)(cid:258)ci wybra(cid:239)em JavaScript tak(cid:285)e dlatego, (cid:285)e nie chcia(cid:239)em, by uczenie maszynowe by(cid:239)o postrzegane jako narz(cid:218)dzie wykorzystywane jedynie przez wyk(cid:239)adowców, naukowców zaj- muj(cid:200)cych si(cid:218) informatyk(cid:200) czy te(cid:285) absolwentów uczelni. Wierzy(cid:239)em, i wci(cid:200)(cid:285) wierz(cid:218), (cid:285)e przy odpowiedniej ilo(cid:258)ci praktyki i (cid:202)wicze(cid:241) algorytmy te mog(cid:200) by(cid:202) dog(cid:239)(cid:218)bnie zrozumiane przez ka(cid:285)dego kompetentnego programist(cid:218). Wybra(cid:239)em JavaScript, gdy(cid:285) pozwala(cid:239) mi on dotrze(cid:202) do nowych odbiorców — grup programistów zajmuj(cid:200)cych si(cid:218) tworzeniem interfejsów u(cid:285)yt- kownika oraz ca(cid:239)o(cid:258)ciowym tworzeniem aplikacji — spo(cid:258)ród których bardzo wiele osób to 17 Poleć książkęKup książkę Uczenie maszynowe z j(cid:266)zykiem JavaScript samoucy, którzy nigdy formalnie nie uko(cid:241)czyli studiów informatycznych. Skoro moim celem by(cid:239)a demistyfikacja i popularyzacja zagadnie(cid:241) zwi(cid:200)zanych z uczeniem maszynowym, czu- (cid:239)em, (cid:285)e znacznie lepszym pomys(cid:239)em b(cid:218)d(cid:200) próby dotarcia do spo(cid:239)eczno(cid:258)ci programistów aplikacji internetowych ni(cid:285) do (cid:258)rodowiska programistów u(cid:285)ywaj(cid:200)cych Pythona, które w tam- tym czasie znacznie lepiej zna(cid:239)o si(cid:218) na uczeniu maszynowym. Python od zawsze by(cid:239) (i wci(cid:200)(cid:285) jest) najpopularniejszym j(cid:218)zykiem do uczenia maszynowego, po cz(cid:218)(cid:258)ci ze wzgl(cid:218)du na swoj(cid:200) dojrza(cid:239)o(cid:258)(cid:202) jako j(cid:218)zyk programowania, po cz(cid:218)(cid:258)ci ze wzgl(cid:218)du na dojrza(cid:239)o(cid:258)(cid:202) jego ekosystemu, a po cz(cid:218)(cid:258)ci ze wzgl(cid:218)du na sukcesy pocz(cid:200)tkowych wysi(cid:239)ków zwi(cid:200)zanych z implementacj(cid:200) uczenia maszynowego w tym j(cid:218)zyku. Jednak najnowszy rozwój JavaScriptu i jego ekosystemu sprawiaj(cid:200), (cid:285)e to w(cid:239)a(cid:258)nie JavaScript staje si(cid:218) bardziej atrakcyjny pod wzgl(cid:218)dem tworzenia rozwi(cid:200)za(cid:241) dotycz(cid:200)cych uczenia maszynowego. Uwa(cid:285)am, (cid:285)e w ci(cid:200)- gu kilku najbli(cid:285)szych lat zastosowanie JavaScriptu do uczenia maszynowego prze(cid:285)yje rene- sans, zw(cid:239)aszcza bior(cid:200)c pod uwag(cid:218) znacz(cid:200)cy wzrost mo(cid:285)liwo(cid:258)ci urz(cid:200)dze(cid:241) mobilnych oraz po- pularno(cid:258)ci j(cid:218)zyka JavaScript. Uczenie maszynowe Kilka technik uczenia maszynowego istnia(cid:239)o jeszcze, zanim pojawi(cid:239)y si(cid:218) komputery, jednak wi(cid:218)kszo(cid:258)(cid:202) nowoczesnych, aktualnie u(cid:285)ywanych algorytmów uczenia maszynowego zosta(cid:239)a opracowana w latach 70. i 80. ubieg(cid:239)ego wieku. W tamtym czasie by(cid:239)y one interesuj(cid:200)ce, cho(cid:202) nie znalaz(cid:239)y zastosowania praktycznego, dlatego te(cid:285) mia(cid:239)y g(cid:239)ównie charakter akademicki. Co zatem przyczyni(cid:239)o si(cid:218) do tak powa(cid:285)nego wzrostu zainteresowania zagadnieniami uczenia maszynowego? Przede wszystkim komputery sta(cid:239)y si(cid:218) w ko(cid:241)cu na tyle pot(cid:218)(cid:285)ne, by mo(cid:285)na na ich uruchamia(cid:202) nietrywialne sieci neuronowe oraz modele ML. Nieco pó(cid:283)niej wyst(cid:200)pi(cid:239)y jeszcze dwa kluczowe zdarzenia: stworzenie firmy Google oraz udost(cid:218)pnienie Amazon Web Services (AWS). PageRank, algorytm ML obs(cid:239)uguj(cid:200)cy wyszukiwark(cid:218) Google, pokaza(cid:239) nam, jakie s(cid:200) mo(cid:285)liwo(cid:258)ci stosowania uczenia maszynowego w biznesie. Sergey Brin i Larry Page, za(cid:239)o(cid:285)yciele Google’a, udowodnili wszystkim, (cid:285)e za ogromnym sukcesem ich wyszukiwarki i wspó(cid:239)dzia(cid:239)aj(cid:200)cego z ni(cid:200) biznesu reklamowego stoi ten w(cid:239)a(cid:258)nie algorytm: stosunkowo proste równanie algebry liniowej, operuj(cid:200)ce na ogromnej macierzy. Warto zwróci(cid:202) uwag(cid:218), (cid:285)e sieci neuronowe tak(cid:285)e s(cid:200) stosunkowo prostymi równaniami algebry liniowej operuj(cid:200)cymi na wielkiej macierzy. To by(cid:239)o uczenie maszynowe w ca(cid:239)ej swojej chwale: wielkie ilo(cid:258)ci danych zapewniaj(cid:200)ce nie- skr(cid:218)powany wgl(cid:200)d w informacje i przek(cid:239)adaj(cid:200)ce si(cid:218) na wielki sukces biznesowy. Dzi(cid:218)ki nim (cid:258)wiat zainteresowa(cid:239) si(cid:218) uczeniem maszynowym pod k(cid:200)tem ekonomicznym. 18 Poleć książkęKup książkę Rozdzia(cid:225) 1. • Poznawanie potencja(cid:225)u j(cid:266)zyka JavaScript Po uruchomieniu EC2 oraz naliczania godzinowego platforma AWS zdemokratyzowa(cid:239)a dost(cid:218)p do zasobów obliczeniowych. Badacze i w(cid:239)a(cid:258)ciciele start-upów w pocz(cid:200)tkowej fazie dzia(cid:239)al- no(cid:258)ci zyskali mo(cid:285)liwo(cid:258)(cid:202) szybkiego uruchamiania klastrów obliczeniowych, uczenia swoich modeli oraz ponownego skalowania klastrów w dó(cid:239), unikaj(cid:200)c przy tym konieczno(cid:258)ci pono- szenia du(cid:285)ych nak(cid:239)adów finansowych na zakup i uruchamianie pot(cid:218)(cid:285)nych serwerów. Mo(cid:285)li- wo(cid:258)ci te przyczyni(cid:239)y si(cid:218) do wytworzenia nowego wspó(cid:239)zawodnictwa oraz pocz(cid:200)tkowej gene- racji start-upów, produktów i inicjatyw bazuj(cid:200)cych na wykorzystaniu uczenia maszynowego. Ostatnio uczenie maszynowe znowu zyska(cid:239)o na popularno(cid:258)ci, i to zarówno w (cid:258)rodowiskach programistów, jak i biznesmenów. Pierwsza generacja start-upów i produktów bazuj(cid:200)cych na uczeniu maszynowym dojrza(cid:239)a ju(cid:285) i wyra(cid:283)nie pokazuje korzy(cid:258)ci, jakie dla rynku mo(cid:285)e za- pewnia(cid:202) uczenie maszynowe, a wiele z tych firm dogania lub ju(cid:285) przegoni(cid:239)o konkurencj(cid:218). D(cid:200)(cid:285)enie firm do zachowania konkurencyjno(cid:258)ci na rynku nap(cid:218)dza zapotrzebowanie na roz- wi(cid:200)zania korzystaj(cid:200)ce z uczenia maszynowego. Po koniec 2015 r. firma Google udost(cid:218)pni(cid:239)a bibliotek(cid:218) TensorFlow, s(cid:239)u(cid:285)(cid:200)c(cid:200) do tworzenia i wykorzystywania sieci neuronowych, której wprowadzenie zdemokratyzowa(cid:239)o wykorzysta- nie sieci neuronowych w podobnym stopniu jak wcze(cid:258)niej wprowadzenie EC2 zdemokraty- zowa(cid:239)o wykorzystanie mocy przetwarzania. Co wi(cid:218)cej, tak(cid:285)e te start-upy pierwszej genera- cji, które koncentrowa(cid:239)y si(cid:218) na programistach, dojrza(cid:239)y i obecnie przy u(cid:285)yciu prostego API mo(cid:285)emy tworzy(cid:202) (cid:285)(cid:200)dania i przesy(cid:239)a(cid:202) je na serwery AWS lub Google Cloud Platform (GCP), na których dzia(cid:239)aj(cid:200) konwolucyjne sieci neuronowe (ang. Convolutional Neural Network — CNN) wyspecjalizowane w rozpoznawaniu obrazów, by dowiedzie(cid:202) si(cid:218), czy patrzymy na kota, kobiet(cid:218), hamburgera, czy te(cid:285) na wszystkie te trzy rzeczy jednocze(cid:258)nie. W miar(cid:218) coraz to wi(cid:218)kszego wykorzystania uczenia maszynowego jego warto(cid:258)(cid:202) pod wzgl(cid:218)- dem konkurencyjno(cid:258)ci b(cid:218)dzie male(cid:202) — innymi s(cid:239)owy: firmy nie b(cid:218)d(cid:200) mog(cid:239)y ju(cid:285) go u(cid:285)ywa(cid:202) po to, by zyska(cid:202) znacz(cid:200)c(cid:200) przewag(cid:218) nad konkurentami, gdy(cid:285) tak(cid:285)e oni b(cid:218)d(cid:200) stosowa(cid:202) ucze- nie maszynowe. Obecnie wszyscy zajmuj(cid:200)cy si(cid:218) t(cid:200) dziedzin(cid:200) korzystaj(cid:200) z tych samych algo- rytmów, a konkurencja staje si(cid:218) wojn(cid:200) na dane. Je(cid:258)li wci(cid:200)(cid:285) chcemy konkurowa(cid:202) w dziedzi- nie technologii, je(cid:258)li chcemy znale(cid:283)(cid:202) rozwi(cid:200)zanie, które dziesi(cid:218)ciokrotnie poprawi nasze obecne mo(cid:285)liwo(cid:258)ci, to albo b(cid:218)dziemy musieli na nie poczeka(cid:202), albo, co by(cid:239)oby nawet lepsze, musimy sami doprowadzi(cid:202) do kolejnego technologicznego prze(cid:239)omu. Gdyby uczenie maszynowe nie prze(cid:239)o(cid:285)y(cid:239)o si(cid:218) na tak wielkie sukcesy rynkowe, by(cid:239)by to za- pewne koniec jego historii. Wszystkie wa(cid:285)ne algorytmy by(cid:239)yby powszechnie znane, a walka sprowadzi(cid:239)aby si(cid:218) do tego, kto b(cid:218)dzie w stanie zebra(cid:202) najlepsze dane, ogrodzi(cid:202) swój ogródek lub w najlepszy sposób wykorzysta(cid:202) ekosystem. Jednak wszystko zmieni(cid:239)o si(cid:218) wraz z wprowadzeniem na rynek narz(cid:218)dzia TensorFlow. Teraz tak(cid:285)e dost(cid:218)p do sieci neuronowych zosta(cid:239) znacznie u(cid:239)atwiony. Obecnie zaskakuj(cid:200)co (cid:239)atwo mo(cid:285)na budowa(cid:202) modele, uczy(cid:202) je, uruchamia(cid:202) na GPU i generowa(cid:202) rzeczywiste wyniki. Mgie(cid:239)ka akademickiej tajemniczo(cid:258)ci okrywaj(cid:200)ca do tej pory sieci neuronowe rozwia(cid:239)a si(cid:218), a tysi(cid:200)ce programistów zacz(cid:218)(cid:239)o bawi(cid:202) si(cid:218) udost(cid:218)pnionymi technikami, eksperymentowa(cid:202) z nimi i ulepsza(cid:202) je. Doprowadzi to do drugiej wielkiej fali wzrostu popularno(cid:258)ci uczenia maszynowego, skupiaj(cid:200)cej si(cid:218) g(cid:239)ównie wokó(cid:239) sieci neuronowych. W(cid:239)a(cid:258)nie dzi(cid:258) rodzi si(cid:218) druga generacja start-upów korzystaj(cid:200)cych z uczenia maszynowego i sieci neuronowych, 19 Poleć książkęKup książkę Uczenie maszynowe z j(cid:266)zykiem JavaScript które za kilka lat dojrzej(cid:200) i okrzepn(cid:200); mo(cid:285)na s(cid:200)dzi(cid:202), (cid:285)e doczekamy si(cid:218) wtedy kolejnych prze(cid:239)omów oraz firm, którym uda(cid:239)o si(cid:218) do nich doprowadzi(cid:202). Ka(cid:285)dy rynkowy sukces, którego b(cid:218)dziemy (cid:258)wiadkami, doprowadzi do wzrostu zapotrzebo- wania na programistów zajmuj(cid:200)cych si(cid:218) zagadnieniami uczenia maszynowego. Poszerzanie si(cid:218) bazy utalentowanych programistów oraz powszechna dost(cid:218)pno(cid:258)(cid:202) technologii przyczy- niaj(cid:200) si(cid:218) do technologicznych prze(cid:239)omów. Ka(cid:285)dy z takich prze(cid:239)omów wywiera wp(cid:239)yw na ry- nek i wiedzie do rynkowych sukcesów — ten cykl zamyka si(cid:218) i prowadzi do post(cid:218)pów na- st(cid:218)puj(cid:200)cych w coraz to szybszym tempie. S(cid:200)dz(cid:218) wi(cid:218)c, (cid:285)e zd(cid:200)(cid:285)amy w kierunku prawdziwego boomu sztucznej inteligencji (AI), i to z przyczyn ekonomicznych. Zalety i wyzwania zwi(cid:200)zane ze stosowaniem j(cid:218)zyka JavaScript Bez wzgl(cid:218)du na optymizm, z jakim zapatruj(cid:218) si(cid:218) na przysz(cid:239)o(cid:258)(cid:202) wykorzystania technik ucze- nia maszynowego w j(cid:218)zyku JavaScript, wi(cid:218)kszo(cid:258)(cid:202) programistów wci(cid:200)(cid:285) tworzy projekty w j(cid:218)- zyku Python. Obecnie w(cid:239)a(cid:258)ciwie wszystkie du(cid:285)e produkcyjne systemy s(cid:200) tworzone w(cid:239)a(cid:258)nie w Pythonie lub w innych j(cid:218)zykach typowych dla uczenia maszynowego. JavaScript, podobnie jak ka(cid:285)de inne narz(cid:218)dzie, ma swoje zalety i wady. W przesz(cid:239)o(cid:258)ci wi(cid:218)k- szo(cid:258)(cid:202) krytyki tego j(cid:218)zyka koncentrowa(cid:239)a si(cid:218) na kilku zagadnieniach: dziwne zachowanie zwi(cid:200)zane ze stosowaniem typów, model obiektowy bazuj(cid:200)cy na prototypach, problemy doty- cz(cid:200)ce organizacji du(cid:285)ej bazy kodu oraz zarz(cid:200)dzanie g(cid:239)(cid:218)boko zagnie(cid:285)d(cid:285)onymi wywo(cid:239)aniami asynchronicznymi (problem okre(cid:258)lany potocznie jako piek(cid:239)o wywo(cid:239)a(cid:241) zwrotnych, ang. callback hell). Na szcz(cid:218)(cid:258)cie wi(cid:218)kszo(cid:258)(cid:202) z tych historycznych problemów uda(cid:239)o si(cid:218) rozwi(cid:200)za(cid:202) dzi(cid:218)ki wpro- wadzeniu ES6, czyli ECSAScript 2015 — najnowszej aktualizacji sk(cid:239)adni j(cid:218)zyka JavaScript. Niezale(cid:285)nie od tych ostatnich usprawnie(cid:241) wi(cid:218)kszo(cid:258)(cid:202) programistów i tak wci(cid:200)(cid:285) opowiada(cid:239)aby si(cid:218) przeciwko wykorzystaniu JavaScriptu w zastosowaniach zwi(cid:200)zanych z uczeniem maszy- nowym z jednego podstawowego powodu: ekosystemu. Ekosystem zwi(cid:200)zany z implementa- cj(cid:200) uczenia maszynowego w j(cid:218)zyku Python jest tak dojrza(cid:239)y i bogaty, (cid:285)e trudno usprawiedli- wi(cid:202) wybór jakiego(cid:258) innego ekosystemu. Jednak taka logika zarówno sama si(cid:218) potwierdza, jak i sama sobie przeczy: je(cid:258)li chcemy, by ekosystem j(cid:218)zyka JavaScript w zakresie zagadnie(cid:241) uczenia maszynowego dojrzewa(cid:239), to potrzeba nam odwa(cid:285)nych osób, które b(cid:218)d(cid:200) go rozwija(cid:202) i pracowa(cid:202) nad rzeczywistymi problemami uczenia maszynowego. Na szcz(cid:218)(cid:258)cie JavaScript ju(cid:285) od kilku lat jest najpopularniejszym j(cid:218)zykiem programowania na GitHubie, a jego po- pularno(cid:258)(cid:202) wci(cid:200)(cid:285) ro(cid:258)nie, i to pod ka(cid:285)dym wzgl(cid:218)dem. Zastosowanie j(cid:218)zyka JavaScript w zagadnieniach uczenia maszynowego ma kilka zalet. Popularno(cid:258)(cid:202) JavaScriptu jest jedn(cid:200) z nich — cho(cid:202) implementacja uczenia maszynowego w JavaScripcie nie jest mo(cid:285)e obecnie zbyt popularna, to jednak sam j(cid:218)zyk jest. Oczywi(cid:258)cie wraz ze wzrostem zapotrzebowania na aplikacje korzystaj(cid:200)ce z uczenia maszynowego, spad- kiem ceny komponentów sprz(cid:218)towych komputerów oraz wzrostem szybko(cid:258)ci ich dzia(cid:239)ania tak(cid:285)e popularno(cid:258)(cid:202) rozwi(cid:200)za(cid:241) uczenia maszynowego w JavaScripcie stanie si(cid:218) znacznie wi(cid:218)ksza. 20 Poleć książkęKup książkę Rozdzia(cid:225) 1. • Poznawanie potencja(cid:225)u j(cid:266)zyka JavaScript Istniej(cid:200) tysi(cid:200)ce zasobów po(cid:258)wi(cid:218)conych ogólnie nauce j(cid:218)zyka JavaScript, utrzymaniu serwe- rów dzia(cid:239)aj(cid:200)cych na podstawie Node.js oraz wdra(cid:285)aniu aplikacji napisanych w JavaScripcie. Ekosystem Node Package Managera (npm) jest ogromny i wci(cid:200)(cid:285) si(cid:218) rozwija, i cho(cid:202) nie znajdziemy w nim obecnie zbyt wielu dojrza(cid:239)ych pakietów zwi(cid:200)zanych z uczeniem maszy- nowym, to jest tam sporo solidnie napisanych, u(cid:285)ytecznych narz(cid:218)dzi, które zapewne nieba- wem pozytywnie przejd(cid:200) prób(cid:218) czasu. Kolejn(cid:200) zalet(cid:200) JavaScriptu jest jego uniwersalno(cid:258)(cid:202). Nowoczesne przegl(cid:200)darki WWW s(cid:200) w za- sadzie przeno(cid:258)nymi platformami do wykonywania aplikacji, pozwalaj(cid:200)cymi na wykonywanie kodu na niemal dowolnych urz(cid:200)dzeniach, i to w zasadzie bez konieczno(cid:258)ci wprowadzania w tym kodzie jakichkolwiek zmian. Narz(cid:218)dzia takie jak Electron (przez wielu uwa(cid:285)ane za zbytnio prze(cid:239)adowane) umo(cid:285)liwiaj(cid:200) programistom szybkie tworzenie i wdra(cid:285)anie aplikacji komputerowych, które mo(cid:285)na pobiera(cid:202) i uruchamia(cid:202) w dowolnych systemach operacyjnych. Node.js pozwala na wykonywanie kodu w (cid:258)rodowisku serwerowym. React Native pozwala przenosi(cid:202) kod JavaScriptu do rodzimego (cid:258)rodowiska aplikacji mobilnych, a kiedy(cid:258) mo(cid:285)e tak- (cid:285)e sprawi(cid:202), (cid:285)e b(cid:218)dzie mo(cid:285)na tworzy(cid:202) aplikacje dla komputerów biurkowych. JavaScript nie ogranicza si(cid:218) ju(cid:285) do implementacji dynamicznych interakcji na stronach WWW, obecnie jest j(cid:218)zykiem programowania ogólnego przeznaczenia, który z powodzeniem mo(cid:285)na stosowa(cid:202) na bardzo wielu platformach systemowych. Wreszcie stosowanie JavaScriptu w rozwi(cid:200)zaniach uczenia maszynowego sprawia, (cid:285)e mog(cid:200) si(cid:218) nimi zaj(cid:200)(cid:202) programi(cid:258)ci tworz(cid:200)cy interfejsy u(cid:285)ytkownika aplikacji — grupa, która histo- rycznie by(cid:239)a pomijana w rozwa(cid:285)aniach dotycz(cid:200)cych uczenia maszynowego. Rozwi(cid:200)zania serwerowe s(cid:200) zazwyczaj preferowane jako narz(cid:218)dzia uczenia maszynowego, gdy(cid:285) moc obli- czeniowa jest dost(cid:218)pna w(cid:239)a(cid:258)nie na serwerach. Ten fakt sprawia(cid:239), (cid:285)e wcze(cid:258)niej zagadnienia uczenia maszynowego raczej nie by(cid:239)y dost(cid:218)pne dla twórców aplikacji internetowych, jednak wraz z rozwojem sprz(cid:218)tu komputerowego nawet z(cid:239)o(cid:285)one modele ML mog(cid:200) ju(cid:285) by(cid:202) urucha- miane po stronie klienta niezale(cid:285)nie od tego, czy b(cid:218)dzie to przegl(cid:200)darka dzia(cid:239)aj(cid:200)ca na kom- puterze biurkowym, czy na urz(cid:200)dzeniu mobilnym. Je(cid:258)li obecnie zarówno programi(cid:258)ci aplikacji internetowych, programi(cid:258)ci zajmuj(cid:200)cy si(cid:218) in- terfejsami u(cid:285)ytkownika, jak i programi(cid:258)ci JavaScriptu zajm(cid:200) si(cid:218) nauk(cid:200) zagadnie(cid:241) uczenia maszynowego, to ca(cid:239)a ta spo(cid:239)eczno(cid:258)(cid:202) zyska mo(cid:285)liwo(cid:258)(cid:202) poprawiania narz(cid:218)dzi uczenia maszy- nowego, z których w przysz(cid:239)o(cid:258)ci wszyscy b(cid:218)dziemy mogli korzysta(cid:202). Je(cid:258)li udost(cid:218)pnimy i roz- powszechnimy te technologie, wyja(cid:258)nimy poj(cid:218)cia uczenia maszynowego mo(cid:285)liwie jak najwi(cid:218)k- szej liczbie osób, to w efekcie doprowadzimy do podniesienia poziomu wiedzy spo(cid:239)eczno(cid:258)ci i wykszta(cid:239)cimy kolejn(cid:200) generacj(cid:218) badaczy zajmuj(cid:200)cych si(cid:218) uczeniem maszynowym. Inicjatywa CommonJS W 2009 r. Kevin Dangoor, in(cid:285)ynier fundacji Mozilla, doszed(cid:239) do wniosku, (cid:285)e aby j(cid:218)zyk Java- Script w zastosowaniach serwerowych odniós(cid:239) sukces, potrzebna mu jest znacz(cid:200)ca pomoc. Idea u(cid:285)ywania JavaScriptu po stronie serwera by(cid:239)a ju(cid:285) wówczas bardzo ekscytuj(cid:200)ca, jednak ze wzgl(cid:218)du na liczne ograniczenia, zw(cid:239)aszcza zwi(cid:200)zane z ekosystemem j(cid:218)zyka, nie by(cid:239)a jesz- cze zbyt popularna. 21 Poleć książkęKup książkę Uczenie maszynowe z j(cid:266)zykiem JavaScript We wpisie opublikowanym na blogu w styczniu 2009 r. Dangoor przedstawi(cid:239) kilka przyk(cid:239)adów tego, gdzie ta pomoc jest konieczna. Napisa(cid:239), (cid:285)e ekosystem JavaScriptu b(cid:218)dzie potrzebowa(cid:239) standardowej biblioteki oraz standardowych interfejsów do wykonywania takich zada(cid:241) jak operacje na plikach czy te(cid:285) dost(cid:218)p do baz danych. Oprócz tego (cid:258)rodowisko JavaScriptu po- trzebowa(cid:239)o sposobów na pakowanie, publikowanie i instalowanie bibliotek oraz rozwi(cid:200)zy- wanie zale(cid:285)no(cid:258)ci, jak równie(cid:285) niezb(cid:218)dne by(cid:239)o repozytorium pakietów, które zaspokaja(cid:239)oby wszystkie wymienione wcze(cid:258)niej potrzeby. Efektem tych rozwa(cid:285)a(cid:241) by(cid:239)o powstanie inicjatywy CommonJS, której najwa(cid:285)niejszym wk(cid:239)a- dem w ekosystem j(cid:218)zyka JavaScript jest format modu(cid:239)ów CommonJS. Ka(cid:285)dy, kto mia(cid:239) jak(cid:200)- kolwiek styczno(cid:258)(cid:202) z programowaniem w (cid:258)rodowisku Node.js, najprawdopodobniej zna CommonJS: plik package.json jest zapisany w(cid:239)a(cid:258)nie w formacie specyfikacji pakietów opraco- wanym dla modu(cid:239)ów CommonJS, a kod o przyk(cid:239)adowej postaci var app = require( ./app.js ) w jednym pliku oraz module.export = App w pliku app.js korzysta ze specyfikacji mo- du(cid:239)ów CommonJS. Standaryzacja modu(cid:239)ów i pakietów utorowa(cid:239)a drog(cid:218) do znacznego zwi(cid:218)kszenia popularno(cid:258)ci j(cid:218)zyka JavaScript. Dzi(cid:218)ki niej programi(cid:258)ci mogli u(cid:285)ywa(cid:202) modu(cid:239)ów do pisania z(cid:239)o(cid:285)onych aplikacji sk(cid:239)adaj(cid:200)cych si(cid:218) z wielu plików, bez konieczno(cid:258)ci za(cid:258)miecania globalnej przestrzeni nazw. Twórcy pakietów i bibliotek mogli pisa(cid:202) i publikowa(cid:202) nowe biblioteki, operuj(cid:200)ce na wy(cid:285)szym poziomie abstrakcji ni(cid:285) standardowa biblioteka j(cid:218)zyka JavaScript. Node.js oraz npm szybko skorzysta(cid:239)y z tego pomys(cid:239)u i bazuj(cid:200)c na mechanizmie udost(cid:218)pniania pakietów, stworzy(cid:239)y wielki ekosystem. Node.js Udost(cid:218)pnienie Node.js, które nast(cid:200)pi(cid:239)o w 2009 r., jest najprawdopodobniej najwa(cid:285)niejszym momentem w historii j(cid:218)zyka JavaScript, cho(cid:202) nie mog(cid:239)oby zaistnie(cid:202), gdyby nie udost(cid:218)pnio- na rok wcze(cid:258)niej przegl(cid:200)darka Chrome oraz u(cid:285)ywany w niej silnik JavaScriptu — V8. Ci spo(cid:258)ród czytelników, którzy pami(cid:218)taj(cid:200) moment pojawienia si(cid:218) przegl(cid:200)darki Chrome, wiedz(cid:200) zapewne, dlaczego zdominowa(cid:239)a ona rynek przegl(cid:200)darek WWW: by(cid:239)a szybka, mini- malistyczna, nowoczesna, pisanie aplikacji i rozszerze(cid:241) dla niej by(cid:239)o (cid:239)atwe, a kod JavaScriptu by(cid:239) w niej wykonywany szybciej ni(cid:285) w innych przegl(cid:200)darkach WWW. U podstaw Chrome le(cid:285)y otwarty projekt Chromium, w ramach którego zosta(cid:239) opracowany i stworzony silnik JavaScriptu V8. Innowacj(cid:200), jak(cid:200) silnik ten wprowadzi(cid:239) do (cid:258)wiata Java- Scriptu, by(cid:239) nowy model wykonywania kodu: zamiast na bie(cid:285)(cid:200)co interpretowa(cid:202) kod, silnik V8 zawiera kompilator JIT, który przekszta(cid:239)ca kod JavaScriptu bezpo(cid:258)rednio na rodzimy kod maszynowy. Takie rozwi(cid:200)zanie op(cid:239)aci(cid:239)o si(cid:218), a po(cid:239)(cid:200)czony efekt kosmicznej szybko(cid:258)ci silnika V8 i status projektu otwartego sprawi(cid:239)y, (cid:285)e tak(cid:285)e inni twórcy zacz(cid:218)li korzysta(cid:202) z silnika V8 do swoich celów. 22 Poleć książkęKup książkę Rozdzia(cid:225) 1. • Poznawanie potencja(cid:225)u j(cid:266)zyka JavaScript Twórcy Node.js zastosowali silnik V8, obudowali go architektur(cid:200) sterowan(cid:200) zdarzeniami i wyposa(cid:285)yli w niskopoziomow(cid:200) bibliotek(cid:218) wej(cid:258)cia-wyj(cid:258)cia do obs(cid:239)ugi dysków i plików. Krytyczn(cid:200) decyzj(cid:200) okaza(cid:239)o si(cid:218) zastosowanie architektury sterowanej zdarzeniami. Inne j(cid:218)zyki i technologie serwerowe, takie jak PHP, zazwyczaj do obs(cid:239)ugi równoczesnych (cid:285)(cid:200)da(cid:241) u(cid:285)ywaj(cid:200) puli w(cid:200)tków, z których ka(cid:285)dy jest blokowany na czas obs(cid:239)ugi (cid:285)(cid:200)dania. Node.js jest procesem jednow(cid:200)tkowym, jednak dzi(cid:218)ki u(cid:285)yciu p(cid:218)tli zdarze(cid:241) pozwala unikn(cid:200)(cid:202) operacji powoduj(cid:200)- cych blokowanie i zach(cid:218)ca do korzystania z logiki asynchronicznej, bazuj(cid:200)cej na wywo(cid:239)aniach zwrotnych. Cho(cid:202) wielu uwa(cid:285)a, (cid:285)e ten jednow(cid:200)tkowy charakter Node.js jest jego wad(cid:200), (cid:258)ro- dowisko to i tak jest w stanie obs(cid:239)ugiwa(cid:202) wiele jednoczesnych (cid:285)(cid:200)da(cid:241) z dobr(cid:200) wydajno(cid:258)ci(cid:200), co wystarczy(cid:239)o, by przyci(cid:200)gn(cid:200)(cid:202) do tej platformy licznych programistów. Kilka miesi(cid:218)cy pó(cid:283)niej zosta(cid:239) udost(cid:218)pniony projekt npm. Bazuj(cid:200)c na efektach pracy CommonJS, npm zapewni(cid:239) twórcom pakietów mo(cid:285)liwo(cid:258)(cid:202) publikowania swoich modu(cid:239)ów w scentralizowanym rejestrze (rejestrze npm), a innym programistom zezwoli(cid:239) na instalowanie modu(cid:239)ów i obs(cid:239)ug(cid:218) ich zale(cid:285)no(cid:258)ci przy u(cid:285)yciu narz(cid:218)dzia npm obs(cid:239)ugiwanego z poziomu wiersza polece(cid:241). (cid:165)rodowisko Node.js zapewne nie przebi(cid:239)oby si(cid:218) i nie zyska(cid:239)o powszechnej popularno(cid:258)ci, gdyby nie npm. Serwer Node.js udost(cid:218)pnia(cid:239) jedynie silnik j(cid:218)zyka JavaScript, p(cid:218)tl(cid:218) obs(cid:239)ugi zdarze(cid:241) oraz kilka niskopoziomowych API, jednak programi(cid:258)ci pracuj(cid:200)cy nad wi(cid:218)kszymi projektami wol(cid:200) operowa(cid:202) na abstrakcjach wy(cid:285)szego poziomu. Wykonuj(cid:200)c (cid:285)(cid:200)dania HTTP czy te(cid:285) odczytuj(cid:200)c zawarto(cid:258)(cid:202) plików z dysku, programi(cid:258)ci nie zawsze chc(cid:200) operowa(cid:202) na danych binarnych, odczytywa(cid:202) i zapisywa(cid:202) nag(cid:239)ówki czy te(cid:285) zawraca(cid:202) sobie g(cid:239)ow(cid:218) innymi zagad- nieniami niskiego poziomu. npm oraz jego rejestr pozwalaj(cid:200) spo(cid:239)eczno(cid:258)ci programistów pi- sa(cid:202) i udost(cid:218)pnia(cid:202) — pod postaci(cid:200) modu(cid:239)ów — w(cid:239)asne abstrakcje wysokiego poziomu, które inni mog(cid:200) w prosty sposób instalowa(cid:202) i stosowa(cid:202) w kodzie przy u(cid:285)yciu funkcji require(). W odró(cid:285)nieniu od innych j(cid:218)zyków programowania, które zazwyczaj dysponuj(cid:200) wbudowa- nymi abstrakcjami wysokiego poziomu, twórcy Node.js mogli si(cid:218) skoncentrowa(cid:202) na dostar- czeniu podstawowych elementów konstrukcyjnych niskiego poziomu, a ca(cid:239)(cid:200) reszt(cid:200) zaj(cid:218)(cid:239)a si(cid:218) spo(cid:239)eczno(cid:258)(cid:202) programistów. Spo(cid:239)eczno(cid:258)(cid:202) ta wykona(cid:239)a wspania(cid:239)(cid:200) robot(cid:218), tworz(cid:200)c takie fanta- styczne abstrakcje jak Express.js — framework do tworzenia aplikacji internetowych, Sequelize ORM oraz setki tysi(cid:218)cy innych bibliotek gotowych do u(cid:285)ycia po wykonaniu banalnego polecenia npm install. Po pojawieniu si(cid:218) Node.js programi(cid:258)ci JavaScriptu, którzy wcze(cid:258)niej nie znali (cid:285)adnych j(cid:218)zy- ków serwerowych, zyskali mo(cid:285)liwo(cid:258)(cid:202) tworzenia kompletnych aplikacji — obie ich cz(cid:218)(cid:258)ci, kliencka i serwerowa, mog(cid:239)y by(cid:202) pisane w tym samym j(cid:218)zyku przez te same osoby. Ambitni programi(cid:258)ci zacz(cid:218)li zatem tworzy(cid:202) w j(cid:218)zyku JavaScript ca(cid:239)e aplikacje, cho(cid:202) napoty- kali przy tym pewne problemy i wymy(cid:258)lali ich rozwi(cid:200)zania. Popularne sta(cid:239)y si(cid:218) aplikacje jednostronicowe pisane wy(cid:239)(cid:200)cznie w JavaScripcie, cho(cid:202) ich mankamentem by(cid:239)y problemy z tworzeniem szablonów i organizacj(cid:200) bazy kodu. Spo(cid:239)eczno(cid:258)(cid:202) odpowiedzia(cid:239)a na te problemy, tworz(cid:200)c frameworki takie jak Backbone.js (b(cid:218)d(cid:200)cy pierwowzorem rozwi(cid:200)za(cid:241) typu Angular czy React), RequireJS (mechanizm do wczytywania modu(cid:239)ów CommonJS i AMD) oraz j(cid:218)zyki do tworzenia szablonów takie jak Mustache (poprzednik j(cid:218)zyka JSX). 23 Poleć książkęKup książkę Uczenie maszynowe z j(cid:266)zykiem JavaScript Kiedy programi(cid:258)ci zacz(cid:218)li mie(cid:202) problemy ze stosowaniem na swoich jednostronicowych aplikacjach technik SEO, opracowali pomys(cid:239) aplikacji izomorficznych (ang. isomorphic ap- plications) oraz kodów, które mo(cid:285)na by(cid:239)o wykonywa(cid:202) zarówno po stronie serwera (tak by mechanizmy wyszukiwarek internetowych mog(cid:239)y indeksowa(cid:202) tre(cid:258)ci aplikacji), jak i po stro- nie klienta (tak by aplikacje by(cid:239)y szybkie i mog(cid:239)y by(cid:202) pisane w JavaScripcie). To z kolei do- prowadzi(cid:239)o do powstania takich frameworków JavaScriptu jak MeteorJS. W ko(cid:241)cu programi(cid:258)ci JavaScriptu tworz(cid:200)cy aplikacje jednostronicowe u(cid:258)wiadomili sobie, (cid:285)e ich potrzeby dotycz(cid:200)ce rozwi(cid:200)za(cid:241) serwerowych s(cid:200) cz(cid:218)sto bardzo proste — ograniczaj(cid:200) si(cid:218) do konieczno(cid:258)ci uwierzytelniania oraz zapisu i odczytu danych. To z kolei doprowadzi(cid:239)o do powstania technologii eliminuj(cid:200)cych stosowanie serwera lub rozwi(cid:200)za(cid:241) takich jak Firebase okre(cid:258)lanych mianem database-as-a-service (baza danych jako us(cid:239)uga — DBaaS), które z kolei wyznaczy(cid:239)y drog(cid:218) i doprowadzi(cid:239)y do wzrostu popularno(cid:258)ci mobilnych aplikacji pisa- nych w JavaScripcie. Mniej wi(cid:218)cej w tym samym czasie pojawi(cid:239) si(cid:218) projekt Cordova/PhoneGap, który pozwala(cid:239) programistom na umieszczanie kodu JavaScriptu w rodzimych komponen- tach WebView systemów iOS i Android oraz na publikowanie swoich aplikacji JavaScriptu w sklepach z aplikacjami mobilnymi. W tej ksi(cid:200)(cid:285)ce w bardzo du(cid:285)ym stopniu b(cid:218)dziemy u(cid:285)ywa(cid:202) Node.js oraz npm. Wi(cid:218)kszo(cid:258)(cid:202) zaprezentowanych w niej przyk(cid:239)adów b(cid:218)dzie korzysta(cid:202) z pakietów ML pobieranych przy u(cid:285)yciu npm. J(cid:218)zyk TypeScript Tworzenie i udost(cid:218)pnianie nowych pakietów za po(cid:258)rednictwem npm nie by(cid:239)o jedynym efektem wzrostu popularno(cid:258)ci j(cid:218)zyka JavaScript. Coraz cz(cid:218)stsze stosowanie JavaScriptu jako g(cid:239)ównego j(cid:218)zyka programowania sprawi(cid:239)o, (cid:285)e wielu programistów zacz(cid:218)(cid:239)o si(cid:218) uskar(cid:285)a(cid:202) na brak odpowiedniego zintegrowanego (cid:258)rodowiska programistycznego (IDE) wraz z narz(cid:218)- dziami wspomagaj(cid:200)cymi prac(cid:218) w tym j(cid:218)zyku. Wcze(cid:258)niej zintegrowane (cid:258)rodowiska programi- styczne by(cid:239)y bardziej popularne w(cid:258)ród programistów u(cid:285)ywaj(cid:200)cych j(cid:218)zyków kompilowanych, o statycznym typowaniu, takich jak C oraz Java, gdy(cid:285) w takich j(cid:218)zykach (cid:239)atwiej jest przetwa- rza(cid:202) i statycznie analizowa(cid:202) kod. Naprawd(cid:218) dobre (cid:258)rodowiska programistyczne do tworzenia kodu w takich j(cid:218)zykach jak JavaScript czy PHP zacz(cid:218)(cid:239)y si(cid:218) pojawia(cid:202) stosunkowo niedawno, natomiast podobne narz(cid:218)dzia do programowania w Javie istnia(cid:239)y ju(cid:285) od wielu lat. Firma Microsoft chcia(cid:239)a dysponowa(cid:202) lepszymi narz(cid:218)dziami oraz wsparciem dla swoich du- (cid:285)ych projektów tworzonych w JavaScripcie, jednak na jej drodze stan(cid:218)(cid:239)o kilka problemów zwi(cid:200)zanych z j(cid:218)zykiem. W szczególno(cid:258)ci problemem okaza(cid:239)o si(cid:218) dynamiczne typowanie sto- sowane w JavaScripcie (fakt, (cid:285)e zmiennej var number mo(cid:285)na by(cid:239)o pocz(cid:200)tkowo przypisa(cid:202) liczb(cid:218) ca(cid:239)kowit(cid:200) o warto(cid:258)ci 5, a pó(cid:283)niej jaki(cid:258) dowolny obiekt), które uniemo(cid:285)liwia(cid:239)o stosowanie narz(cid:218)dzi do statycznej analizy kodu w celu zapewniania bezpiecze(cid:241)stwa typów oraz znacz(cid:200)co utrudnia(cid:239)o odnajdywanie odpowiednich zmiennych lub obiektów, które móg(cid:239)by sugerowa(cid:202) mechanizm automatycznego uzupe(cid:239)niania. Co wi(cid:218)cej, Microsoft chcia(cid:239) stosowa(cid:202) paradygmat 24 Poleć książkęKup książkę Rozdzia(cid:225) 1. • Poznawanie potencja(cid:225)u j(cid:266)zyka JavaScript programowania obiektowego bazuj(cid:200)cy na klasach i udost(cid:218)pniaj(cid:200)cy poj(cid:218)cia interfejsów i kon- traktów, a programowanie obiektowe w JavaScripcie bazuje na prototypach, a nie klasach. Wszystkie te czynniki sprawi(cid:239)y, (cid:285)e firma Microsoft, w celu wsparcia du(cid:285)ych projektów in- formatycznych tworzonych w JavaScripcie, opracowa(cid:239)a j(cid:218)zyk TypeScript. TypeScript wpro- wadza klasy, interfejsy i statyczne typowanie. W odró(cid:285)nieniu od stworzonego przez Google’a j(cid:218)zyka Dart, Microsoft zadba(cid:239), by TypeScript zawsze by(cid:239) (cid:258)cis(cid:239)ym nadzbiorem JavaScriptu, co oznacza, (cid:285)e ka(cid:285)dy prawid(cid:239)owy kod JavaScriptu jest tak(cid:285)e prawid(cid:239)owym kodem TypeScriptu. Kompilator TypeScriptu przeprowadza (w czasie kompilacji) statyczn(cid:200) kontrol(cid:218) typów, po- magaj(cid:200)c programistom we wczesnym wykrywaniu b(cid:239)(cid:218)dów. Wsparcie dla statycznego typo- wania u(cid:239)atwia tak(cid:285)e zintegrowanym (cid:258)rodowiskom programistycznym dok(cid:239)adniejsz(cid:200) inter- pretacj(cid:218) kodu, poprawiaj(cid:200)c tym samym do(cid:258)wiadczenia zwi(cid:200)zane z pisaniem kodu. Kilka wczesnych usprawnie(cid:241) wprowadzonych przez TypeScript straci(cid:239)o na znaczeniu po udost(cid:218)pnieniu j(cid:218)zyka ECMAScript 2015, okre(cid:258)lanego tak(cid:285)e jako ES6. Na przyk(cid:239)ad mecha- nizm wczytywania modu(cid:239)ów, sk(cid:239)adnia klas oraz sk(cid:239)adnia zapisu funkcji przy u(cid:285)yciu symbolu strza(cid:239)ki zosta(cid:239)y zastosowane bezpo(cid:258)rednio w j(cid:218)zyku ES6, dlatego te(cid:285) obecnie TypeScript u(cid:285)ywa tych konstrukcji w wersjach z j(cid:218)zyka ES6; niemniej jednak TypeScript wci(cid:200)(cid:285) udo- st(cid:218)pnia statyczn(cid:200) kontrol(cid:218) typów, której ES6 nie zapewnia. Cho(cid:202) w przyk(cid:239)adach zamieszczonych w tej ksi(cid:200)(cid:285)ce nie b(cid:218)dziemy u(cid:285)ywali j(cid:218)zyka TypeScript, wspominam tu o nim, gdy(cid:285) kilka z bibliotek do uczenia maszynowego, które przedstawi(cid:218), zosta(cid:239)o w nim napisanych. Jeden z przyk(cid:239)adów dost(cid:218)pnych na stronie deeplearn.js zawiera nast(cid:218)puj(cid:200)cy fragment kodu: const graph = new Graph(); // Make a new input in the graph, called x , with shape [] (a Scalar). const x: Tensor = graph.placeholder( x , []); // Make new variables in the graph, a , b , c with shape [] and random // initial values. const a: Tensor = graph.variable( a , Scalar.new(Math.random())); const b: Tensor = graph.variable( b , Scalar.new(Math.random())); const c: Tensor = graph.variable( c , Scalar.new(Math.random())); Ta sk(cid:239)adnia wygl(cid:200)da jak kod JavaScriptu w wersji ES6, z wyj(cid:200)tkiem zapisu z dwukropkiem: const x: Tensor = … Ten kod informuje kompilator TypeScriptu, (cid:285)e const x musi by(cid:202) in- stancj(cid:200) klasy Tensor. Podczas kompilacji kodu TypeScript w pierwszej kolejno(cid:258)ci upewnia si(cid:218), (cid:285)e wsz(cid:218)dzie tam, gdzie wyst(cid:218)puje x, zostanie u(cid:285)yty obiekt klasy Tensor (w przeciwnym razie kompilator zg(cid:239)osi b(cid:239)(cid:200)d), a pó(cid:283)niej, podczas generowania kodu JavaScriptu, po prostu pomija informacje o typach. Konwersja powy(cid:285)szego kodu TypeScriptu na kod JavaScriptu jest bardzo prosta — sprowadza si(cid:218) do usuni(cid:218)cia z definicji ka(cid:285)dej zmiennej dwukropka i u(cid:285)ytej za nim nazwy klasy Tensor. Czytaj(cid:200)c t(cid:218) ksi(cid:200)(cid:285)k(cid:218) i analizuj(cid:200)c zawarte w niej przyk(cid:239)ady, mo(cid:285)na oczywi(cid:258)cie u(cid:285)ywa(cid:202) j(cid:218)zyka TypeScript, lecz trzeba to b(cid:218)dzie odpowiednio uwzgl(cid:218)dni(cid:202) w procesie budowy kodu przed- stawionego w dalszej cz(cid:218)(cid:258)ci rozdzia(cid:239)u. 25 Poleć książkęKup książkę Uczenie maszynowe z j(cid:266)zykiem JavaScript Usprawnienia wprowadzone w ES6 Komitet ECMAScript, definiuj(cid:200)cy specyfikacj(cid:218) j(cid:218)zyka JavaScript, opublikowa(cid:239) w czerwcu 2015 r. now(cid:200) specyfikacj(cid:218) — ECMAScript 6/ECMAScript 2015. Ten nowy standard j(cid:218)zyka, okre(cid:258)lany potocznie jako ES6, by(cid:239) kolejn(cid:200) g(cid:239)ówn(cid:200) wersj(cid:200) JavaScriptu i wprowadza(cid:239) do niego wiele nowych paradygmatów, opracowanych w celu u(cid:239)atwienia programowania w tym j(cid:218)zyku. Cho(cid:202) ECMAScript definiuje specyfikacj(cid:218) j(cid:218)zyka JavaScript, jego rzeczywiste implemen- tacje zale(cid:285)(cid:200) od twórców przegl(cid:200)darek oraz ró(cid:285)nych silników JavaScriptu. ES6 jest jedynie zbiorem wytycznych, a poniewa(cid:285) twórcy przegl(cid:200)darek implementuj(cid:200) nowe mo(cid:285)liwo(cid:258)ci j(cid:218)zy- ka zgodnie z w(cid:239)asnymi terminarzami, dlatego jego specyfikacje i implementacje nieco si(cid:218) od siebie ró(cid:285)ni(cid:200). Mo(cid:285)liwo(cid:258)ci zdefiniowane w ES6, takie jak klasy, nie by(cid:239)y jeszcze zaimple- mentowane w najpopularniejszych przegl(cid:200)darkach, a programi(cid:258)ci ju(cid:285) chcieli ich u(cid:285)ywa(cid:202). I tak pojawi(cid:239) si(cid:218) Babel — transpilator j(cid:218)zyka JavaScript. Babel potrafi analizowa(cid:202) ró(cid:285)ne wersje j(cid:218)zyka JavaScript (ES6, ES7, ES8 oraz React JSX) i konwertowa(cid:202) je, czy te(cid:285) kompilowa(cid:202), na kod zgodny z zaimplementowan(cid:200) w przegl(cid:200)darkach wersj(cid:200) j(cid:218)zyka ES5. Nawet dzi(cid:258) ES6 nie zosta(cid:239) jeszcze zaimplementowany w przegl(cid:200)darkach w ca(cid:239)o(cid:258)ci, dlatego dla programistów, którzy chc(cid:200) pisa(cid:202) kod ES6, Babel pozostaje kluczowym narz(cid:218)dziem. W przyk(cid:239)adach przedstawionych w tej ksi(cid:200)(cid:285)ce b(cid:218)dziemy u(cid:285)ywali j(cid:218)zyka ES6. Je(cid:258)li kto(cid:258) nie zna stosowanej w nim nowej sk(cid:239)adni, to w dalszej cz(cid:218)(cid:258)ci tego podrozdzia(cid:239)u przedstawi(cid:218) kilka jego najwa(cid:285)niejszych cech, które b(cid:218)dziemy wykorzystywa(cid:202) w tej ksi(cid:200)(cid:285)ce. Let i const W wersji ES5 j(cid:218)zyka JavaScript do definiowania zmiennych u(cid:285)ywane by(cid:239)o s(cid:239)owo kluczowe var. W wi(cid:218)kszo(cid:258)ci przypadków mo(cid:285)na je zast(cid:200)pi(cid:202) s(cid:239)owem kluczowym let, przy czym g(cid:239)ówn(cid:200) ró(cid:285)nic(cid:200) mi(cid:218)dzy nimi jest zasi(cid:218)g zmiennych w odniesieniu do bloku. T(cid:218) subteln(cid:200) ró(cid:285)nic(cid:218) po- mi(cid:218)dzy var i let demonstruje poni(cid:285)szy przyk(cid:239)ad zaczerpni(cid:218)ty z witryny MDN web docs (nosz(cid:200)cej wcze(cid:258)niej nazw(cid:218) Mozilla Developer Network), ze strony https://developer.mozilla.org/ en-US/docs/Web/JavaScript/Reference/Statements/let: function varTest() { var x = 1; if (true) { var x = 2; // ta sama zmienna! console.log(x); // 2 } console.log(x); // 2 } function letTest() { let x = 1; if (true) { let x = 2; // inna zmienna 26 Poleć książkęKup książkę Rozdzia(cid:225) 1. • Poznawanie potencja(cid:225)u j(cid:266)zyka JavaScript console.log(x); // 2 } console.log(x); // 1 } A zatem, cho(cid:202) w niektórych sytuacjach, takich jak ta przedstawiona na powy(cid:285)szym przyk(cid:239)a- dzie, nale(cid:285)y zachowa(cid:202) dodatkow(cid:200) ostro(cid:285)no(cid:258)(cid:202), to jednak w wi(cid:218)kszo(cid:258)ci przypadków mo(cid:285)na po prostu zast(cid:200)pi(cid:202) var s(cid:239)owem kluczowym let. W odró(cid:285)nieniu od let s(cid:239)owo kluczowe const definiuje zmienn(cid:200) jako sta(cid:239)(cid:200) — innymi s(cid:239)owy: po zainicjowaniu zmiennej zdefiniowanej jako const jej warto(cid:258)ci nie mo(cid:285)na ju(cid:285) zmienia(cid:202). Na przyk(cid:239)ad u(cid:285)ycie kodu przedstawionego na kolejnym przyk(cid:239)adzie spowoduje wy(cid:258)wietlenie b(cid:239)(cid:218)du o tre(cid:258)ci zbli(cid:285)onej do invalid assignment to const a1: const a = 1; a = 2; Z drugiej strony, gdyby do zdefiniowania zmiennej a zosta(cid:239)o u(cid:285)yte s(cid:239)owo kluczowe let lub var, to ten kod dzia(cid:239)a(cid:239)by prawid(cid:239)owo. Warto zwróci(cid:202) uwag(cid:218), (cid:285)e je(cid:258)li a jest obiektem, to warto(cid:258)ci w(cid:239)a(cid:258)ciwo(cid:258)ci tego obiektu mo(cid:285)na modyfikowa(cid:202). Kolejny przyk(cid:239)adowy fragment kodu zostanie wykonany prawid(cid:239)owo: const obj = {}; obj.name = Mój obiekt ; Z drugiej strony, próba przedefiniowania ca(cid:239)ego obiektu — obj = {name: inny obiekt }; — spowodowa(cid:239)aby zg(cid:239)oszenie b(cid:239)(cid:218)du. Uwa(cid:285)am, (cid:285)e w wi(cid:218)kszo(cid:258)ci kontekstów lepiej nadaje si(cid:218) const ni(cid:285) let, gdy(cid:285) wi(cid:218)kszo(cid:258)(cid:202) zmiennych nie wymaga przedefiniowywania. Dlatego te(cid:285) sugeruj(cid:218), by jak najcz(cid:218)(cid:258)ciej u(cid:285)y- wa(cid:202) w(cid:239)a(cid:258)nie s(cid:239)owa kluczowego const, a na let decydowa(cid:202) si(cid:218) tylko wtedy, gdy konieczne b(cid:218)dzie pó(cid:283)niejsze przedefiniowanie zmiennej. Klasy Jedn(cid:200) z wyczekiwanych zmian wprowadzonych w ES6 by(cid:239)o dodanie klas oraz mechanizmu ich dziedziczenia. Wcze(cid:258)niej programowanie obiektowe w j(cid:218)zyku JavaScript wymaga(cid:239)o sto- sowania mechanizmu dziedziczenia bazuj(cid:200)cego na prototypach, który dla wielu programi- stów nie by(cid:239) intuicyjny; przyk(cid:239)ad tego tradycyjnego mechanizmu dziedziczenia przedstawia poni(cid:285)szy fragment kodu: 1 Z ang.: nieprawid(cid:239)owe przypisanie do sta(cid:239)ej a — przyp. t(cid:239)um. 27 Poleć książkęKup książkę Uczenie maszynowe z j(cid:266)zykiem JavaScript var Automobile = function(weight, speed) { this.weight = weight; this.speed = speed; } Automobile.prototype.accelerate = function(extraSpeed) { this.speed += extraSpeed; } var RaceCar = function (weight, speed, boost) { Automobile.call(this, weight, speed); this.boost = boost; } RaceCar.prototype = Object.create(Automobile.prototype); RaceCar.prototype.constructor = RaceCar; RaceCar.prototype.accelerate = function(extraSpeed) { this.speed += extraSpeed + this.boost; } W tym przypadku rozszerzenie obiektu wymaga umieszczenia w funkcji constructor klasy pochodnej, wywo(cid:239)ania klasy bazowej, utworzenia kopii obiektu prototypu klasy bazowej i prze- s(cid:239)oni(cid:218)cia konstruktora prototypu klasy bazowej konstruktorem prototypu klasy pochodnej. Wi(cid:218)kszo(cid:258)(cid:202) programistów uwa(cid:285)a(cid:239)a, (cid:285)e czynno(cid:258)ci te s(cid:200) nieintuicyjne i uci(cid:200)(cid:285)liwe. W j(cid:218)zyku ES6 analogiczny kod wygl(cid:200)da nast(cid:218)puj(cid:200)co: class Automobile { constructor(weight, speed) { this.weight = weight; this.speeed = speed; } accelerate(extraSpeed) { this.speed += extraSpeed; } } class RaceCar extends Automobile { constructor(weight, speed, boost) { super(weight, speed); this.boost = boost; } accelerate(extraSpeed) { this.speed += extraSpeed + this.boost; } } Powy(cid:285)szy kod jest ju(cid:285) znacznie bardziej zbli(cid:285)ony do tego, czego mogliby(cid:258)my oczekiwa(cid:202) od kodu napisanego w obiektowym j(cid:218)zyku programowania, i jak wida(cid:202), znacz(cid:200)co upraszcza dziedziczenie. Koniecznie trzeba jednak pami(cid:218)ta(cid:202), (cid:285)e w niezauwa(cid:285)alny dla programistów sposób ES6 wci(cid:200)(cid:285) korzysta z tego samego paradygmatu dziedziczenia bazuj(cid:200)cego na prototypach. Klasy s(cid:200) jedynie „syntaktycznym lukrem” przes(cid:239)aniaj(cid:200)cym istniej(cid:200)cy mechanizm, dlatego jedyn(cid:200) ró(cid:285)nic(cid:200) pomi(cid:218)dzy oboma przedstawionymi przyk(cid:239)adami jest przejrzysto(cid:258)(cid:202) kodu. 28 Poleć książkęKup książkę Rozdzia(cid:225) 1. • Poznawanie potencja(cid:225)u j(cid:266)zyka JavaScript Importowanie modu(cid:239)ów W j(cid:218)zyku ES6 wprowadzono tak(cid:285)e interfejsy do importowania i eksportowania modu(cid:239)ów. We wcze(cid:258)niejszym rozwi(cid:200)zaniu stosowanym przez CommonJS modu(cid:239)y by(cid:239)y eksportowane przy u(cid:285)yciu konstrukcji modules.export oraz importowane przy u(cid:285)yciu funkcji require(nazwapliku). W j(cid:218)zyku ES6 importowanie modu(cid:239)ów wygl(cid:200)da nieco inaczej. W jednym pliku umieszcza si(cid:218) definicj(cid:218) klasy oraz eksportuje j(cid:200) w sposób przedstawiony na kolejnym przyk(cid:239)adzie: Class Automobile { (cid:3257) } export default Automobile Z kolei w innym pliku klasa ta jest importowana w nast(cid:218)puj(cid:200)cy sposób: import Automobile from ./classes/automobile.js ; const myCar = new Automobile(); Obecnie Babel kompiluje modu(cid:239)y ES6 do formatu u(cid:285)ywanego przez modu(cid:239)y CommonJS, dlatego w razie stosowania tego narz(cid:218)dzia mo(cid:285)emy u(cid:285)ywa(cid:202) zarówno modu(cid:239)ów ES6, jak i CommonJS. Funkcje strza(cid:239)kowe Jednym z dziwacznych, u(cid:285)ytecznych, lecz równocze(cid:258)nie nieco denerwuj(cid:200)cych aspektów stan- dardu ES5 JavaScriptu jest cz(cid:218)ste stosowanie wykonywanych asynchronicznie funkcji zwrotnych. Chyba ka(cid:285)dy doskonale zna kod jQuery przypominaj(cid:200)cy fragment przedstawiony poni(cid:285)ej: $( #link ).click(function() { var $self = $(this); doSomethingAsync(1000, function(resp) { $self.addClass( wasFaded ); var processedItems = resp.map(function(item) { return processItem(item); }); return shipItems(processedItems); }); }); Taki kod zmusza nas do utworzenia zmiennej $self, gdy(cid:285) w wewn(cid:218)trznej funkcji anonimo- wej pocz(cid:200)tkowy kontekst jest tracony. Oprócz tego, ze wzgl(cid:218)du na konieczno(cid:258)(cid:202) utworzenia trzech osobnych funkcji anonimowych, kod jest rozbudowany i utrudnia analiz(cid:218). Sk(cid:239)adnia funkcji strza(cid:239)kowych (ang. arrow funcions) jest jednocze(cid:258)nie u(cid:239)atwieniem sk(cid:239)a- dniowym pozwalaj(cid:200)cym na tworzenie funkcji anonimowych przy u(cid:285)yciu krótszego zapisu, jak te(cid:285) funkcjonalnym usprawnieniem, które zachowuje kontekst this w wywo(cid:239)aniu funkcji strza(cid:239)kowej. 29 Poleć książkęKup książkę Uczenie maszynowe z j(cid:266)zykiem JavaScript Na przyk(cid:239)ad w j(cid:218)zyku ES6 powy(cid:285)szy fragment kodu mo(cid:285)na zapisa(cid:202) w nast(cid:218)puj(cid:200)cy sposób: $( #link ).click(function() { dozsSomethingAsync(1000, resp = { $(this).addClass( wasFaded ); const processedItems = resp.map(item = processItem(Item)); return shipItems(processedItems); }); }); Jak wida(cid:202), w tej wersji kodu nie musimy ju(cid:285) tworzy(cid:202) zmiennej $self, by zachowa(cid:202) kontekst this, a wywo(cid:239)anie .map jest znacznie prostsze, gdy(cid:
Pobierz darmowy fragment (pdf)

Gdzie kupić całą publikację:

Uczenie maszynowe z językiem JavaScript. Rozwiązywanie złożonych problemów
Autor:

Opinie na temat publikacji:


Inne popularne pozycje z tej kategorii:


Czytaj również:


Prowadzisz stronę lub blog? Wstaw link do fragmentu tej książki i współpracuj z Cyfroteką: