w Praktyce
9 godz. 47 min · JavaScript · Full-stack i Programowanie
Piotr PalarzWeb DeveloperW pierwszym rozdziale tego kursu poznasz bardzo dokładnie koncepcje programowania zorientowanego obiektowo. W jednej z lekcji, omówimy wszystkie z nich na przykładzie pseudo-kodu, niezwiązanego bezpośrednio z językiem JavaScript. Dzięki temu zrozumiesz, jak realizowane jest programowanie obiektowe w wielu popularnych językach programowania. Dowiesz się czym jest klasa, obiekt, instancja, właściwości, metody, a także zrozumiesz takie pojęcia jak dziedziczenie, polimorfizm, abstrakcja czy enkapsulacja. Następnie przejdziemy już do języka JavaScript i do zrozumienia tego, w jaki sposób powyższe koncepcje są w nim zaimplementowane. Język ten nie jest bowiem w 100% klasycznie obiektowy, jak np. język PHP. Co jednak bardzo istotne, JavaScript implementuje tzw. dziedziczenie prototypowe, którego bardzo dogłębne zrozumienie, gwarantuje zrozumienie całego języka JavaScript. Dowiesz się zatem czym są konstruktory i jak je tworzyć, a także jak korzystać z prototypu funkcji. Dzięki temu będziemy mogli wykorzystać obiektowość do własnych celów, co później w praktycznych przykładach uczynimy.Na przestrzeni kilku lekcji zobaczysz krok po kroku, jak w języku JavaScript zaimplementować dziedziczenie wielokrotne. Taka wiedza absolutnie otwiera oczy na zależności rządzące obiektami w tym języku. Dowiesz się również jak rozszerzać wbudowane konstrukcje języka JavaScript czy Obiektowego Modelu Dokumentu, a także kiedy powinniśmy to robić. Omówimy problemy, jakie mogą się pojawiać przy korzystaniu ze słowa kluczowego this, a także sposoby ich rozwiązania. Poznasz 3 bardzo ważne metody funkcji: call, apply i bind.JavaScript ma wiele specyficznych cech, a jedną z nich są tzw. domknięcia. W jednym z rozdziałów zobaczysz, do czego one służą i kiedy powinniśmy z nich korzystać. Dopełnimy tym również wiedzę związaną z programowaniem obiektowym i tzw. prywatnością.Rozdział o obiektowości został celowo umieszczony na samym początku kursu, gdyż zrozumienie tych koncepcji pozwala patrzeć zupełnie inaczej na wszystkie pozostałe. Po tym rozdziale przejdziemy do omówienia bardzo popularnego, lekkiego formatu wymiany danych JSON. Dowiesz się jak wygląda składnia tego formatu, a także jak współpracuje on z językiem JavaScript.Następnie przejdziemy do bardzo ekscytującego tematu, jakim jest technologia AJAX. Dzięki niej możemy wysyłać zapytania do serwera i pobierać dane, bez przeładowywania witryny. Do zrozumienia AJAXa niezbędne jest jednak rozumienie działania protokołu HTTP, na którym opiera się sieć www. Z tego powodu, jedna z lekcji została w 100% poświęcona HTTP i dowiesz się z niej jak wysyłane są żądania i odpowiedzi, a także tzw. nagłówki, które będą dla nas niezwykle istotne. Chwilę później omówimy również bardzo ważne mechanizmy: Same- origin policy i CORS, które blokują możliwość wysyłania żądań AJAX do pewnych serwerów. Kiedy już będziesz rozumiał te niezwykle istotne koncepcje, przejdziemy do napisania pierwszego kodu, wysyłającego asynchroniczne żądanie do serwera. Następnie dowiesz się jak wysyłać, a także odbierać dane z serwera, umieszczać je na stronie oraz śledzić postęp zarówno wysyłania, jak i pobierania danych.W tym rozdziale na przestrzeni kilku lekcji napiszemy swoją własną bibliotekę AJAX, która pozwoli w niezwykle łatwy sposób wysyłać i odbierać dane. Skorzystamy w niej już w kolejnej lekcji, gdzie zobaczysz, jak wysłać wiadomość e-mail z użyciem AJAX i PHP po stronie serwera. Gotowy skrypt, będziesz mógł umieścić na własnej stronie internetowej. Na zakończenie tego rozdziału omówimy również dokładnie niezwykle sprytną technikę o nazwie JSONP, które pozwala wysyłać tzw. żądania “cross-origin”. Przekonasz się dlaczego taka technika powstała i jak współpraca klienta i serwera potrafi obejść zabezpieczenia przeglądarek.Kolejnym tematem omówionym w kursie będą Cookies, czyli tzw. ciasteczka. Dowiesz się czym są, w jakim celu istnieją, a także jak są ustawianie przez serwer. Co ciekawe, również z poziomu języka JavaScript będziemy mieli do nich dostęp, a zatem zobaczysz jak je ustawiać i odczytywać. Na tym etapie przyda nam się wiedza zdobyta w lekcji o protokole HTTP.W kursie znajdziesz również rozdział poświęcony w 100% wyrażeniom regularnym. To mechanizm języka, który pozwala dopasowywać tekst do definiowanych przez nas wzorców. Wyrażenia regularne potrafią być bardzo zaawansowane i odstraszać, dlatego rozłożymy je na czynniki pierwsze, byś dokładnie je zrozumiał. Na przestrzeni wielu lekcji dowiesz się jakie są specjalne symbole wykorzystywane przy wyrażeniach regularnych, czym są kwantyfikatory, kotwice czy np. grupowanie. Następnie przejdziemy do wykorzystania wyrażeń regularnych w języku JavaScript. Poznasz zarówno metody obiektu RegExp jak i te dostępne na obiekcie String. Dzięki nim będziemy mogli wyszukiwać np. adresów e- mail w podanym tekście, usuwać je lub zamieniać na coś innego. Jako praktyczny projekt, stworzymy “Antybluzgacz”. Wykorzystamy do tego celu programowanie obiektowe, a sama aplikacja będzie pozwalała filtrować wpisywany przez użytkownika tekst wiadomości i wyłapywać w nim niecenzuralne słowa. Wszystkie z nich zamienimy na przypadkową reprezentację znaków, np. $#!@%^. Ten projekt pokaże Ci nie tylko jak korzystać z wyrażeń regularnych, ale także jak profesjonalnie pracować z kodem JavaScript.W przedostatnim rozdziale tego kursu znajdziesz lekcje związane z dobrymi praktykami pracy. Omówimy tzw. “strict mode” języka JavaScript, zagadnienia związane z minifikacją i konkatenacją skryptów, sprawdzaniem poprawności pisanego kodu oraz delegacją zdarzeń DOM.Na końcu kursu znajdziesz 10 krótkich lekcji z serii Tips & Tricks, które przybliżą Ci wiele ciekawych konstrukcji języka JavaScript, a także technik na rozwiązanie różnych problemów. Zobaczysz np. jak wczytać obrazy w tle czy jak wyświetlić na pasku tytułowym witryny migające powiadomienie.Podsumowując, kurs ten jest dopełnieniem wiedzy z zakresu języka JavaScript i Obiektowego Modelu Dokumentu z kursu “JavaScript od Podstaw”. Poprzedni kurs nie jest wymagany, lecz jego przerobienie z pewnością pozwoli dużo lepiej przyswoić wiedzę z tego kursu, gdyż były one przygotowywane równocześnie. Oba te materiały, pozwolą od zera, wskoczyć na naprawdę wysoki poziom rozumienia języka, a także dobrych praktyk pisania kodu.
Do tego kursu mogą jednak przystąpić wszystkie osoby, które znają już podstawy języka HTML, CSS i JavaScript i chcą poszerzyć swoją wiedzę, a także spojrzeć zupełnie inaczej na ten język.
W tej lekcji wykorzystamy stworzoną już Ajaxową bibliotekę i pokażę ci jak możemy z użyciem PHP wysłać maila
z naszej strony.
Ponownie musimy być na serwerze który wspiera PHP.
Tutaj jest ten localhost więc te pliki sobie przekopiuj z takiego katalogu i na początek pokaże ci co ja tutaj stworzyłem mamy
formularz twoje imię Twój e-mail i twoja wiadomość w kodzie HTML.
Wygląda on następująco czyli jest tutaj formularz jak widzisz ma on name your-name czyli coś
takiego będzie przesyłane do serwera your email oraz your message a tutaj wysyłamy i teraz o co chodzi.
Przejdźmy do skryptów już część rzeczy zrobiłem aby niepotrzebnie nie pisać bo na tym etapie powinieneś
wiedzieć o co chodzi.
Szybko to wytłumaczę.
Robiliśmy walidator formularzy w pierwszej części tego kursu JavaScript od podstaw jeżeli przerabiałeś
już ten kurs to tutaj będzie to dla ciebie doskonale znane.
Otóż w zmiennej zapisuje sobie formularz i message a message to będzie wiadomość która będzie wyświetlać
komunikaty z serwera.
Domyślnie jest to ukryte ale możemy do tego dodać np. klasę error albo klasę success.
Jeżeli tak to zdefiniowałem zerknijmy sobie tak jest succes i error wtedy display blog więc on się
pokaże i możemy tam coś wyświetlić.
Dlatego stworzyłem funkcję show message.
Podajemy tutaj type to była klasa która zostanie do tego message dodana i wiadomość.
Jeżeli byśmy sobie teraz wywołali show message w ten sposób to mogę powiedzieć succes.
I tutaj udało się.
Zobaczmy i na naszej stronie pojawi się właśnie taki komunikat a jeżeli napiszemy error to będziemy mieli
trochę inne style czyli z tego sobie będziemy później korzystać.
No i tutaj mam przypisany do formularza zdarzenie submit czyli na wysłanie tego formularza wykonaj
funkcję send mail tutaj mam tę funkcję i jedyne co zrobiłem do tej pory to zatrzymałem domyślną akcję
przeglądarki a więc możemy sobie tutaj po odświeżeniu dowolnie wciskać.
I nie jest nic przesłane na nasz serwer.
Teraz pokażę ci co będziemy chcieli zrobić aby z naszej biblioteki Ajax skorzystać bo co ważne na samym dole
zamieściłem tutaj Ajax js.
Po prostu jest to ten plik na którym skończyliśmy pracę z naszą Ajaxową biblioteką i jedyne co zrobiłem to oczywiście
wyrzuciłem z niego to wywołanie które mieliśmy na samym dole naszej funkcji czyli jest tutaj tylko
czysty kod naszej biblioteki więc będziemy mogli tutaj skripts z tego skorzystać.
Na początek będziemy chcieli wszystkie dane z naszego formularza które tutaj wpisze sobie zserializować.
Pamiętasz że w naszej bibliotece Ajax mogliśmy przekazywać dane jako taki obiekt data.
I tam to mniej więcej tak wyglądało.
Tutaj były te dane więc taki obiekt chciałbym teraz utworzyć.
Łatwo możemy to zrobić mianowicie w tym formularzu w którym jesteśmy.
Będę chciał sobie znaleźć wszystkie pola input i text area a tutaj mam specjalnie button o typie submit bo gdyby tutaj
był input submit,
To również wtedy mi go znalazło.
A tego nie chciałem.
Mam tutaj button i stworzymy sobie taką zmienną którą nazwę fields odwołał się do form i w nim wyszukam
właśnie wszystkich tych pól poprzez query selector all wszystkie pola input oraz text area mnie nie interesują
a następnie utworzy pusty obiekt który nazwę data no i teraz będziemy chcieli przeiterować przez wszystkie
te pola.
Pamiętasz że możemy sobie pożyczyć metodę z utworzonej na szybko tablicy pokazywały to w tym kursie napiszemy
call i chcemy funkcje czy metodę for each wywołać właśnie na naszych polach.
I następnie funkcja field to już też znasz.
Nie chcę tutaj robić pętli for więc robię sobie for each pożyczyłem ją i tutaj będziemy mieli console
log.
Każde z tych pól zrobimy że idziemy do konsoli zrobie trochę miejsca i po wciśnięciu wyślij te pola
powinny pojawić jak widzisz jedno drugie trzecie i będę z nich chciał odczytać your name your email message
czyli atrybuty name i dodać go tutaj do data czyli napiszemy data następnie field i mogę zrobić get
attribute jak wiesz name albo po prostu field name w skrócie można to zrobić.
Równa się to po co w tym polu zostało wpisane czyli field value.
Tak możemy to zrobić i na końcu zróbmy sobie console log data.
Co ten nasz obiekt zawiera.
Jak widzisz yourname jest pusta i tak dalej.
Jeżeli sobie coś wpiszę to wtedy to się tutaj pojawi.
Ok czyli świetnie mamy już taki obiekt i teraz będę chciał go przesłać na serwer.
Bo gdyby tutaj nie było Ajax to oczywiście mógłbym tutaj napisać metoda post action mail php i zostałoby
to poprawnie wysłane.
Natomiast dlatego że zrobiłem tutaj prevent default ale to nie zostało to wysłane normalnie zostałoby to wysłane
do mail PHP.
Tutaj znajduje się ten plik jeszcze go pokaże.
Czyli gdyby na stronie nie był włączony JavaScript to również ten mail zostanie przesłany przez przeglądarkę
bo nie wykona się wtedy nasz skrypt oraz prevent default ok.
Czyli mamy takie dane i teraz nic prostszego.
Otóż mamy naszą bibliotekę Ajaxową więc pamiętasz że możemy się do niej odwołać w ten sposób następnie
podajemy obiekt konfiguracyjny.
Chcemy aby metoda to było post więc tamto było type post ale możemy się odwołać też do formularza i
wyczytać to co jest tutaj czyli napiszemy for get attribute method.
Wtedy to będzie bardziej dynamiczne.
Następnie adres, więc adres to chcemy Action odczytać czyli zrobię to samo.
OK teraz data które tam chcemy przesłać.
Stworzyliśmy to tutaj pobraliśmy wszystko z naszego formularza więc data i teraz jeszcze funkcję którą
chciałbym wykonać jeżeli uda nam się otrzymać z powrotem dane.
Pamiętasz że nazwaliśmy ją success przypiszemy funkcję.
Ona przyjmowała tutaj response a jako drugi parametr xhr,
gdybyśmy się do niego chcieli odwołać pamiętaj że te nazwy są dowolne mogę sobie to nazwać rs.
Nie ma znaczenia pod jaką nazwą to będzie tutaj dostępne.
Czyli jeżeli nam się uda wysłać taki e-mail to będziemy coś chcieli zrobić najpierw zróbmy sobie console log
response i sprawdzimy czy to działa.
Czyli po kliknięciu wyślij kiedy zdarzenie submit ci odpali zbierzemy wszystkie dane z naszego formularza
zmienimy je na obiekt data i spróbujemy wysłać żądanie w konsoli powinniśmy wysłanie żądania widzieć.
Więc wciskam wyśli i widzimy xhr finish loading post czyli po został wysłany pod odpowiedni adres i
to co nam zostało odesłane podaj swoje imię podaj poprawny adres e-mail napisz wiadomość.
Dlaczego takie coś zostało nam odesłane.
Chciałbym ci teraz pokazać.
Otóż mail php wygląda troszkę podobnie tutaj na początku jak to co pokazałam ci w lekcji poprzedniej
czyli jeżeli nie wysyłamy Ajaxa jeżeli chcielibyśmy ten formularz bez Ajaxa wysłać to w tym przypadku
akurat nam na to serwer nie pozwoli.
Mógłbym to usunąć wtedy bym pozwolił.
Czyli jeżeli nie mamy nagłówka http x requested ith który dodawaliśmy,
kiedy tworzyliśmy naszą bibliotekę kiedy nie jest on równy XML http request to chciałbym tutaj zakończyć
cały ten skrypt natomiast w przeciwnym wypadku sprawdzamy czy mamy post your name your email oraz your
message.
Czyli to jest dodane tutaj.
To są dokładnie te nazwy.
Jeżeli one są przesłane na serwer a my je przesłaliśmy właśnie to tworzymy sobie nową tablicę którą nazwałem
errors
i teraz sprawdzamy czy your name nie jest puste.
Czyli konkretnie to będzie to pole jeżeli jest puste to do tablicy array dodajemy poprzez funkcję array push
taką oto wiadomość taki komunikat to widzisz wygląda podobnie jak w JavaScriptcie to jest język PHP jest
po prostu inny zapis.
Jeżeli z kolei e-mail który podamy nie będzie poprawnym emailem nie będzie zawierał małpki itd możemy
to sprawdzić PHP poprzez filter var podając tutaj ten ciąg i podając tutaj taką stałą filter value jak email to
znowu tutaj dodamy jakiś błąd no i jeżeli your message czyli wiadomość również będzie puste to znowu dodamy
błąd.
To oznacza że jeżeli jakikolwiek błąd wystąpił validujemy to po stronie serwera to w tablicy errors coś się
będzie znajdować.
Dlatego możemy sprawdzić count czy errors ma więcej niż jeden element więcej niż 0 elementów czyli czy nie
jest pusta.
Jeżeli tak to odsyłamy do przeglądarki poleceniem echo.
To nie jest polecenie które coś specjalnie odsyła.
Ono po prostu wyświetla aż wysłaliśmy Ajaxa to zostanie nam to również z powrotem odesłane,
json encode już Ci pokazywałem czyli tablicę errors jeżeli coś niej jest.
Chcemy odesłać z powrotem jako json i to dokładnie zostało to odesłane.
Spróbujmy teraz podać imię.
Nie będzie ono puste.
Wyszli i teraz została nam taka tablica odesłana.
Tylko że to jest json.
Dlatego teraz w naszej funkcji którą mamy tutaj będę chciał sobie zrobić z tego obiekt więc napiszmy
sobie tutaj może rez jak response i znaną nam już funkcją json parse zparsujemy response.
OK teraz jeśli zrobię console log rez raz jeszcze coś może wpiszmy po tym razem powinna to być tablica.
Coś źle napisałem tutaj brakowało s i teraz to już jest tablica normalnie w javascript więc jak widzisz
serwer odesłał nam json z tej tablicy phpowej a my ją zmieniliśmy na naszą tablicę.
Dlatego teraz w naszym script będę mógł sprawdzić czy są jakieś błędy w tej właśnie tablicy natomiast
chcę Ci pokazać jeszcze co dzieje się dalej.
Jeżeli były jakieś błędy to je odsyłamy.
Jeżeli nie było błędów to chcemy sobie skonstruować właśnie takie oto nagłówki są to zmienne i następnie
wysłać e-mail więc ten skrypt jeżeli umieścisz u siebie na serwerze na swoim hostingu to zmień sobie tylko
ten adres e-mail.
I wtedy jeżeli ktoś wyśle maila to do Ajaxa zostanie to wysłane właśnie do ciebie tutaj wywołujemy
PHPową funkcję maile przekazujemy wszystkie parametry i ona jeśli się uda wysłać maila zwróci tutaj true.
Jeżeli się nie uda to zwróci false.
No i znowu sprawdzamy jeżeli się udało to odeślij do przeglądarki takiego json z tablicy który będzie
miał success wiadomość została wysłana poprawnie.
Jeżeli się nie uda to wyślij jsona który będzie miał error.
Wystąpił błąd podczas wysyłania natomiast tutaj będziemy mieli przesłane niepoprawne pola formularza
i to jest dla tego isset.
Czyli gdybyśmy nie mieli w tym formularzu takich pól jak your name your email itd.
To wtedy będziemy chcieli to odesłać.
Więc zauważ teraz co się stanie jeżeli mamy błędy to mamy tablicę ale jeżeli to uzupełnię podam tutaj
poprawny e-mail i podam wiadomość.
Nie ma błędów więc próbujemy sobie po stronie PHP wysłać ten e-mail natomiast lokalnego serwera nam
to nie zadziała dlatego tu zostanie zwrócone false i tam powinno zostać odesłany error.
Zobaczmy.
Zrobiłem wyślij i jak widzisz Object error został dla nas odesłany musieliśmy chwilkę poczekać.
Został dla nas odesłany w tym przypadku dwukrotnie.
My sobie go parsujemy poprzez json parse więc teraz jest to obiekt.
I teraz chciałbym sobie móc wyświetlić błędy w tej message którą ci pokazałem ale musimy sobie sprawdzić czy
mamy obiekt z jednym błędem czy mamy wiele błędów.
Bo jeżeli rzeczywiście będziemy mieli wewnątrz error możemy to sprawdzić.
If error in rez czyli jeżeli w tym obiekcie który startowałem znajduje się coś takiego jak error tak
to będę chciał wywołać funkcję którą ci pokazano na początku short message jako type przekażemy jej error
a jako wiadomość przekażemy jej rez kropka error ok.
I powinno nam się to na stronie wyświetlić zobaczmy raz jeszcze wpisze poprawne dane i mamy tutaj po
chwili.
Jak widzisz to się czytało wystąpił błąd podczas wysyłania wiadomości.
Natomiast jeżeli zostanie odesłana tablica z wieloma różnymi błędami czyli np. czegoś nie pisałem zobaczmy
będziemy mieli tablicę tutaj w console log się nie pokaże bo usunąłem console log ale raz jeszcze ci to pokaże jeżeli
odświeżę moża i wyśle mamy tablicę z trzema błędami.
Jeżeli jest to tablica to też chciałbym ją tutaj wyświetlić from message.
Ale jak to zrobić skoro ta funkcja przyjmuje tutaj tylko string który ustawia jako innerHTML.
Otóż możemy tutaj sprawdzić if array is array bo mówiłem ci że json to może być obiekt tak jak
ci pokazałem lub np. tablica.
Jeżeli to będzie tablica kiedy już to sparsowaliśmy to mamy taką metodę na konstruktorze tablicy is array
która sprawdza czy to jest tablica czyli jeżeli nasze rest to jest tablica to będę chciał wywołać funkcję show message
z błędami.
Wiemy że tam będą jakieś błędy i będę chciał się odwołać do res bo tej tablicy i zrobić na niej metodą join
in czyli połączyć ją połączyć ją na br.
Dlaczego.
Jeżeli tego nie zrobię.
Zobacz to zostanie wyświetlone tutaj w ten sposób a chciałbym po każdym takim stringu mieć br czyli
połączymy je na br metodą join.
No i zobaczmy raz jeszcze.
Czyli jeżeli to jest tablica to zostaną tutaj poprawnie wyświetlone na końcu będzie br.
Jeżeli natomiast piszę poprawne dane ale maila się nie udało wysłać to już nie będzie tablica to będzie
obiekt zobaczmy i również działa poprawnie z tego powodu że is array się nie wykonało.
Więc sprawdziliśmy tutaj czy error znajduje się w res i jeżeli tak to go tutaj po prostu wyświetliliśmy.
Na sam koniec możemy sprawdzić tutaj jeszcze np. else if w zasadzie też możemy wstawić tutaj
else if w ten sposób i tutaj jeszcze raz else if success in res czyli jeżeli się udało to chcemy wyświetlić
wiadomość że wszystko poszło OK.
Czyli tutaj będzie success.
To co nam serwer odesłał.
Zobaczmy jak to wyglądało tutaj w mail php.
Jeżeli się uda to zostanie odesłany właśnie success.
Wiadomość została wysłana poprawnie i to będziemy chcieli wstawić natomiast aby ktoś po wciśnięciu tego przycisku
nie wysłał ponownie do nas emaila to będę chciał zrobić rzecz następującą tutaj w naszym script jeżeli
wszystko poszło OK.
Otóż usuniemy sobie to zdarzenie czyli skoro możemy go dodać poprzez add event listener to wiesz że możemy
poprzez remove event listener usunąć takie zdarzenie czyli teraz po wciśnięciu przycisku nie będzie
już ten formularz w ten sposób wysyłany ale byłby on wtedy wysłany normalnie bo skoro odbindujemy całe
to zdarzenie to odbindujemy też całą tę funkcję czyli prevent default.
Dlatego chcę jeszcze wyłączyć przycisk który się na tej stronie znajduje jest to ten przycisk i zróbmy
to tutaj.
Jak widzisz w formularzu znajduje przycisk button i ustawiamy jego atrybut na disabled.
Teraz nie pokażę ci czy to rzeczywiście działa bo wspomniałem że z localhostz nie da się wysłać maila
ale jeżeli ten skrypt wrzuci sobie na swój hosting który obsługuje PHP to bez problemu na Twojej stronie
będziesz mógł go zamieścić.
I ktoś będzie mógł tutaj wpisać swoje dane na przykład Piotr jakiś e-mail poprawny i wiadomość i kiedy
wcisnę wyślij.
To powinno się udać to wysłać.
Jak widzisz tutaj wystąpił błąd ale jeżeli nie wystąpi błąd będzie to na zielono to przy okazji jeszcze
usuniemy zdarzenie z tego formularza i zablokujemy przycisk aby nie można było go ponownie wcisnąć.
Mam nadzieję że taki skrypt ci się przyda i że widzisz zalety biblioteki Ajax którą stworzyliśmy.
Wspominałem że ona nie jest kompletna oraz idealna.
Ale widzisz że zaczyna działać.