<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
    <channel>
        <title>Piotr Kowalski — JavaScript, Front-end oraz Node.js</title>
        <description>Prawie 200 artykułów o programowaniu. Jesteś ciekawy co jest na blogu? Kliknij i zapoznaj się. Piotr Kowalski</description>
        <link>https://piecioshka.pl/</link>
        <atom:link href="https://piecioshka.pl/feed.xml" rel="self" type="application/rss+xml" />

        
        <item>
            <title>15 aplikacji, które zwiększą Twoją produktywność (2024)</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Dziś prezentuję Wam listą 15 narzędzi, które budują moją produktywność
jako programisty w codziennej pracy. Jest to moja subiektywna lista, aczkolwiek myślę,
że może ona pomóc w dowolnej pracy z komputerem.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/post-banner-lifestyle-aplikacje-ktore-zwieksza-twoja-produktywnosc.png&quot; itemprop=&quot;image&quot; alt=&quot;Baner promujący artykuł&quot; /&gt;
&lt;/figure&gt;

&lt;p&gt;Kiedyś &lt;a href=&quot;https://x.com/piecioshka/status/1797228665530429881&quot;&gt;komentowałem&lt;/a&gt; na Twitterze
(albo X-ksie, ale ja będę konsekwentny i dla mnie https://x.com/ to po prostu Twitter),
ale była to lista wymieszana z listą narzędzie shellowych. A o nich napiszę osobny artykuł.
Dziś zajmiemy się tylko desktopowymi aplikacjami.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Dodam, że kolejność nie ma znaczenia. Każda aplikacja jest tak samo ważna.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id=&quot;lets-go&quot;&gt;Let’s go!&lt;/h2&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://1password.com/&quot;&gt;1Password&lt;/a&gt; — Password Manager&lt;/p&gt;

    &lt;p&gt;Świat cyfrowy wymaga od nas zapamiętywania haseł. Oczywiście, człowiek na ograniczone miejsce,
 abyśmy zapamiętali różne ciągi znaków i z łatwości je później przywracali
 w procesie logowania. Aby rozwiązać ten problem, należy używać Password Managera.
 Osobiście korzystam z 1Password. Świetne narzędzie, które ma szereg integracji
 i działa bezbłędnie.&lt;/p&gt;

    &lt;p&gt;&lt;i class=&quot;icon-info&quot;&gt;&lt;/i&gt; Wskazówki&lt;/p&gt;
    &lt;ul&gt;
      &lt;li&gt;Wsparcie do różnych vaults (skarbców), dobrze jest oddzielić sekrety prywatne od firmowych&lt;/li&gt;
      &lt;li&gt;Warto zrezygnować z trzymania haseł w innych miejscach np. zapamiętane w przeglądarce lub w systemie&lt;/li&gt;
    &lt;/ul&gt;

    &lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt; brew &lt;span class=&quot;nb&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--cask&lt;/span&gt; 1password
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;

    &lt;p&gt;&lt;br /&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://www.raycast.com/&quot;&gt;Raycast&lt;/a&gt; — Spotlight na sterydach&lt;/p&gt;

    &lt;p&gt;Spotlight jest przestarzałym rozwiązaniem i mało elastycznym. Świeżość wnosi narzędzie Raycast
 które umożliwia o wiele więcej niż narzędzie wbudowane. Dzięki Raycastowi
 unikamy problemu z regularnym indeksowaniem dysku w poszukiwaniu plików
 oraz dostajemy wygodę korzystania z np. kalkulatora (możemy mieszać waluty, możemy mieszać przecinki z kropkami)
 oraz elastyczność instalując dowolny plugin z dużej bazy pluginów.&lt;/p&gt;

    &lt;p&gt;&lt;i class=&quot;icon-info&quot;&gt;&lt;/i&gt; Wskazówki&lt;/p&gt;
    &lt;ul&gt;
      &lt;li&gt;Polecam instalację pluginu do Visual Studio Code&lt;/li&gt;
    &lt;/ul&gt;

    &lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt; brew &lt;span class=&quot;nb&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--cask&lt;/span&gt; raycast
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;

    &lt;p&gt;&lt;br /&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://iterm2.com/&quot;&gt;iTerm2&lt;/a&gt; — Terminal na sterydach&lt;/p&gt;

    &lt;p&gt;iTerm to świetna alternatywa natywnego &lt;strong&gt;Terminala&lt;/strong&gt;.&lt;/p&gt;

    &lt;p&gt;&lt;i class=&quot;icon-info&quot;&gt;&lt;/i&gt; Wskazówki&lt;/p&gt;
    &lt;ul&gt;
      &lt;li&gt;Po skonfigurowaniu zapisz sobie profil w swoim projekcie &lt;a href=&quot;https://github.com/piecioshka/dotfiles&quot;&gt;dotfiles&lt;/a&gt;.&lt;/li&gt;
    &lt;/ul&gt;

    &lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt; brew &lt;span class=&quot;nb&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--cask&lt;/span&gt; iterm2
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;

    &lt;p&gt;&lt;br /&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://chatgpt.com/&quot;&gt;ChatGPT&lt;/a&gt; — AI&lt;/p&gt;

    &lt;p&gt;AI jest wśród nas. Czy tego chcemy, czy nie. Zamiast się bronić, należy nauczyć się wykorzystywać
 to, że mamy narzędzie, które nam szybko i sprawnie pomoże w każdej sytuacji.&lt;/p&gt;

    &lt;p&gt;Żadnej model nie jest idealny, natomiast z każdym nowym modelem dostajemy szereg usprawnień.
 Warto korzystać z Chata, choćby to prostej pomocy w odpowiedziach na pytania,
 zamiast szukać czegoś w dokumentacji.&lt;/p&gt;

    &lt;p&gt;Należy tutaj wspomnieć o innym narzędziu z kategorii AI, a mianowicie &lt;a href=&quot;https://copilot.microsoft.com/&quot;&gt;Copilot&lt;/a&gt;,
 które pięknie integruje się z każdym edytorem i pomaga pisać kod!&lt;/p&gt;

    &lt;p&gt;&lt;i class=&quot;icon-info&quot;&gt;&lt;/i&gt; Wskazówki&lt;/p&gt;
    &lt;ul&gt;
      &lt;li&gt;Korzystaj z dobroci sztucznej inteligencji w każdym momencie, kiedy masz przestój, AI odpowie ci szybko, ale czy skutecznie?&lt;/li&gt;
    &lt;/ul&gt;

    &lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt; brew &lt;span class=&quot;nb&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--cask&lt;/span&gt; chatgpt
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;

    &lt;p&gt;&lt;br /&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://rectangleapp.com/&quot;&gt;Rectangle&lt;/a&gt; — Window Manager&lt;/p&gt;

    &lt;p&gt;Zarządzanie oknami jest podstawową operacją na komputerze. Podczas
 pracy mamy otwartych kilka aplikacji i płynne poruszanie się po tym środowisku
 podnosi naszą produktywność.&lt;/p&gt;

    &lt;p&gt;Istnieje jeszcze płatne narzędzie &lt;a href=&quot;https://magnet.crowdcafe.com/&quot;&gt;Magnet&lt;/a&gt;,
 ale nie widzę różnicy między tymi dwoma.&lt;/p&gt;

    &lt;p&gt;&lt;i class=&quot;icon-info&quot;&gt;&lt;/i&gt; Wskazówki&lt;/p&gt;
    &lt;ul&gt;
      &lt;li&gt;Nie korzystaj już z zielonej ikonki na oknie, aby je zmaksymalizować - szybciej jest użyć &lt;kbd&gt;Ctrl + Option + Enter&lt;/kbd&gt;&lt;/li&gt;
    &lt;/ul&gt;

    &lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt; brew &lt;span class=&quot;nb&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--cask&lt;/span&gt; rectangle
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;

    &lt;p&gt;&lt;br /&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://www.deepl.com/&quot;&gt;DeepL&lt;/a&gt;&lt;/p&gt;

    &lt;p&gt;Narzędzie, które bardzo szybko tłumaczy tekst z angielskiego na polski i odwrotnie!
 Wykorzystuję go jeszcze do innego celu, a mianowicie, gdy chcę przepisać tekst z obrazka.
 Dzięki wbudowanego mechanizmowi OCR oraz skrótów klawiaturowych taką operację mogę wykonać w sekundę!&lt;/p&gt;

    &lt;p&gt;&lt;i class=&quot;icon-info&quot;&gt;&lt;/i&gt; Wskazówki&lt;/p&gt;
    &lt;ul&gt;
      &lt;li&gt;Koniecznie włącz skróty klawiaturowe!&lt;/li&gt;
    &lt;/ul&gt;

    &lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt; brew &lt;span class=&quot;nb&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--cask&lt;/span&gt; deepl
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;

    &lt;p&gt;&lt;br /&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://insomnia.rest/&quot;&gt;Insomnia&lt;/a&gt; - Twórz requesty bez kodu&lt;/p&gt;

    &lt;p&gt;Insomnia to świetna alternatywa znanego narzędzia &lt;a href=&quot;https://www.postman.com/&quot;&gt;Postman&lt;/a&gt;.&lt;/p&gt;

    &lt;p&gt;Dzięki tej aplikacji możemy tworzyć requesty bez pisania kodu.
 Pomaga to w szybkiej weryfikacji backendu.
 Requesty możemy zamykać w grupy, np. dotyczące jednego endpoint, albo jednego API.&lt;/p&gt;

    &lt;p&gt;&lt;i class=&quot;icon-info&quot;&gt;&lt;/i&gt; Wskazówki&lt;/p&gt;
    &lt;ul&gt;
      &lt;li&gt;Koniecznie załóż konto, aby zapisywać utworzone grupy requestów w chmurze&lt;/li&gt;
    &lt;/ul&gt;

    &lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt; brew &lt;span class=&quot;nb&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--cask&lt;/span&gt; insomnia
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;

    &lt;p&gt;&lt;br /&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://www.macbartender.com/&quot;&gt;Bartender&lt;/a&gt; - Porządek w top menu&lt;/p&gt;

    &lt;p&gt;Po instalacji kilku aplikacji na górnym pasku (top menu) w macOS zaczyna brakować
 miejsca. Dlatego rozwiązaniem jest to narzędzie, dzięki któremu ukryjemy nieistotne
 aplikacje.&lt;/p&gt;

    &lt;p&gt;&lt;i class=&quot;icon-info&quot;&gt;&lt;/i&gt; Wskazówki&lt;/p&gt;
    &lt;ul&gt;
      &lt;li&gt;Polecam nie chować ikonek: Wi-Fi, Bluetooth, Bateria&lt;/li&gt;
    &lt;/ul&gt;

    &lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt; brew &lt;span class=&quot;nb&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--cask&lt;/span&gt; bartender
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;

    &lt;p&gt;&lt;br /&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://nordvpn.com/&quot;&gt;NordVPN&lt;/a&gt; — VPN&lt;/p&gt;

    &lt;p&gt;W dzisiejszych czasach przychodzą potrzeby zmiany lokalizacji, aby móc np. coś obejrzeć na Netflixie,
 czego w Polsce akurat nie można. Aczkolwiek to nie jest podstawowy use case.
 Podczas pracy w międzynarodowych korporacjach przychodzi potrzeba testu naszej aplikacji
 jak wygląda w różnych językach i VPN pomaga znakomicie.&lt;/p&gt;

    &lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt; brew &lt;span class=&quot;nb&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--cask&lt;/span&gt; nordvpn
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;

    &lt;p&gt;&lt;br /&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://cleanshot.com/&quot;&gt;CleanShot&lt;/a&gt; — Zrzuty ekranu&lt;/p&gt;

    &lt;p&gt;To narzędzie to istny GAME CHANGER! Potrafi nie tylko robić zrzuty ekranu
(screenshots), ale również daje możliwość ich szybkiej modyfikacji,
poprzez dodanie tekstu, zaznaczenia tekstu, czy nawet listy kroków.
Dodatkowo możesz zdjęcie zapisać lub skopiować do schowka, ale to nie wszystko!
Narzędzie potrafi nagrywać video i dawaj przy tym mnóstwo opcji konfiguracji.&lt;/p&gt;

    &lt;p&gt;&lt;i class=&quot;icon-info&quot;&gt;&lt;/i&gt; Wskazówki&lt;/p&gt;
    &lt;ul&gt;
      &lt;li&gt;Koniecznie należy skonfigurować narzędzie, bo opcji konfiguracji jest ogrom!&lt;/li&gt;
    &lt;/ul&gt;

    &lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;brew &lt;span class=&quot;nb&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--cask&lt;/span&gt; cleanshot
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;

    &lt;p&gt;&lt;br /&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://www.screenbrush.app/&quot;&gt;ScreenBrush&lt;/a&gt; — Rysowanie po ekranie&lt;/p&gt;

    &lt;p&gt;To narzędzie wykorzystuję w procesie nauczania, ale nie tylko.
Również bardzo często podczas sesji pair programingu, aby coś zaznaczyć na dużym ekranie.
Oczywiście kolejnym use casem są spotkania, gdzie na ogromnych telewizorach
chcę coś zademonstrować.&lt;/p&gt;

    &lt;p&gt;&lt;i class=&quot;icon-info&quot;&gt;&lt;/i&gt; Wskazówki&lt;/p&gt;
    &lt;ul&gt;
      &lt;li&gt;Koniecznie naucz się skrótów klawiaturowych, dzięki temu odkryjesz pełnię możliwości tego narzędzia&lt;/li&gt;
    &lt;/ul&gt;

    &lt;p&gt;&lt;br /&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://sindresorhus.com/plain-text-editor&quot;&gt;Plain Text Editor&lt;/a&gt; — Szybkie notatki&lt;/p&gt;

    &lt;p&gt;Plain Text Editor to świetna alternatywa wbudowanego narzędzia &lt;strong&gt;Stickers&lt;/strong&gt;.&lt;/p&gt;

    &lt;p&gt;Ten edytor (bo w sumie to jest jakaś forma edytora) jest pozbawiony wszystkiego,
no może poza oknem do wpisywania tekstu oraz statystyk liczących ile znaków wpisaliśmy.&lt;/p&gt;

    &lt;p&gt;Wykorzystuje to narzędzie to tworzenia szybkich notatek lub też wiadomości,
którą chcę komuś wysłać, ale nie chcę już jest wpisywać do okna bo mogę przez przypadek ją wysłać.&lt;/p&gt;

    &lt;p&gt;Co prawda różni się od Stickersów, że nie mogę przyklejać sobie notatek do ekranu,
ale za to mogę zapisać daną notatką na dysk.&lt;/p&gt;

    &lt;p&gt;Prawdę mówią, to wykorzystuję oba narzędzia.&lt;/p&gt;

    &lt;p&gt;&lt;i class=&quot;icon-info&quot;&gt;&lt;/i&gt; Wskazówki&lt;/p&gt;
    &lt;ul&gt;
      &lt;li&gt;Dodaj sobie alias w shellu np. &lt;code class=&quot;highlighter-rouge&quot;&gt;p&lt;/code&gt;, aby szybko uruchomić program i zapisać myśl,
tak jak &lt;a href=&quot;https://github.com/piecioshka/dotfiles/blob/main/configs/shells/.aliases.sh#L7&quot;&gt;ja to zrobiłem w swoich plikach z aliasami&lt;/a&gt;.&lt;/li&gt;
    &lt;/ul&gt;

    &lt;p&gt;&lt;br /&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://www.google.com/intl/pl/chrome/&quot;&gt;Google Chrome&lt;/a&gt; — Przegladarka&lt;/p&gt;

    &lt;p&gt;Korzystałem z wielu przeglądarek, ale w każdej mi czegoś brakowało.
Jako UI Engineer mam zainstalowane kilka, aby testować, jak wygląda layout.
Od wielu lat nowoczesność tej przeglądarki nie przestaje zadziwiać.&lt;/p&gt;

    &lt;p&gt;&lt;i class=&quot;icon-info&quot;&gt;&lt;/i&gt; Wskazówki&lt;/p&gt;
    &lt;ul&gt;
      &lt;li&gt;Załóż sobie oddzielny profil na sprawy firmowe&lt;/li&gt;
    &lt;/ul&gt;

    &lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;brew &lt;span class=&quot;nb&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--cask&lt;/span&gt; google-chrome
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;

    &lt;p&gt;&lt;br /&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://visualstudio.microsoft.com/&quot;&gt;Visual Studio Code&lt;/a&gt; — Edytor kodu&lt;/p&gt;

    &lt;p&gt;Moja przygoda z edytorami kodu zaczęła się od &lt;a href=&quot;/blog/2011/09/18/eclipse-skroty-klawiszowe.html&quot;&gt;Eclipse&lt;/a&gt;, później kolejno: Netbeans,
Aptana, VIM, Intellij, WebStorm, PhpStorm, Atom, Sublime, Brackets i pewnie jeszcze kilka się znajdzie.&lt;/p&gt;

    &lt;p&gt;VSC jest najlepszym rozwiązaniem, z jakim przyszło mi pracować.&lt;/p&gt;

    &lt;p&gt;Jeśli interesują Was moje pluginy do Visual Studio, których używam każdego dnia,
to zapraszam do artykułu &lt;a href=&quot;/blog/2023/06/07/visual-studio-code-plugins-2023.html&quot;&gt;15 pluginów do Visual Studio Code&lt;/a&gt;.&lt;/p&gt;

    &lt;p&gt;&lt;i class=&quot;icon-info&quot;&gt;&lt;/i&gt; Wskazówki&lt;/p&gt;
    &lt;ul&gt;
      &lt;li&gt;Po skonfigurowaniu zapisz sobie profil w swoim projekcie &lt;a href=&quot;https://github.com/piecioshka/dotfiles&quot;&gt;dotfiles&lt;/a&gt;.&lt;/li&gt;
    &lt;/ul&gt;

    &lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;brew &lt;span class=&quot;nb&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--cask&lt;/span&gt; visual-studio-code
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;

    &lt;p&gt;&lt;br /&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://open.spotify.com/&quot;&gt;Spotify&lt;/a&gt; — Muzyka&lt;/p&gt;

    &lt;p&gt;Nie samą pracą człowiek żyje, a może właśnie tak? Zależy. Niektórzy nie mogą pracować
bez muzyki, mi ona bardzo pomaga więc mogę z czystym sumieniem polecić Spotify.
Świetne narzędzie, nieustannie się rozwija i dochodzę nowe funkcje.&lt;/p&gt;

    &lt;p&gt;&lt;i class=&quot;icon-info&quot;&gt;&lt;/i&gt; Wskazówki&lt;/p&gt;
    &lt;ul&gt;
      &lt;li&gt;Zrobić sobie playlisty w zależności od efektu, który chcemy osiągnąć,
np. energetyzująca, kiedy chcemy się pobudzić,
oraz spokojna (koniecznie z saksofonem), aby się skupić na pracy.&lt;/li&gt;
    &lt;/ul&gt;

    &lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;brew &lt;span class=&quot;nb&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--cask&lt;/span&gt; spotify
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;podsumowanie&quot;&gt;Podsumowanie&lt;/h2&gt;

&lt;p&gt;To by było na tyle. To garść aplikacji, które ja używam na co dzień.
Ogólnie aplikacji jest i wiele więcej, ale z niektórymi jestem na tyle krótko,
że nie wiem, czy mogę je zarekomendować na takim samym stopniu jak powyższe.&lt;/p&gt;

&lt;p&gt;A Ty? Czy masz aplikację, bez której nie wyobrażasz sobie pracy przy komputerze?&lt;/p&gt;
</description>
            <pubDate>Mon, 09 Sep 2024 10:30:00 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2024/09/09/aplikacje-ktore-zwieksza-twoja-produktywnosc-2024.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2024/09/09/aplikacje-ktore-zwieksza-twoja-produktywnosc-2024.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/post-banner-lifestyle-aplikacje-ktore-zwieksza-twoja-produktywnosc.png</image>
        </item>
        
        <item>
            <title>Dlaczego czytam książki o bibliotekach?</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Dziś wpis, który jest nieco inny niż wszystkie, a mianowicie dziś zajmę
się odpowiedzią na tweet kolegi, który &lt;strong&gt;poleca NIE CZYTAĆ książek o bibliotekach&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Zapraszam do zapoznania się z moim punktem widzenia.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/post-banner-lifestyle-ksiazka-o-react.png&quot; itemprop=&quot;image&quot; alt=&quot;Baner promujący artykuł&quot; /&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;geneza&quot;&gt;Geneza&lt;/h2&gt;

&lt;p&gt;Wszystko zaczęło się od tego, że kupiłem drugą książkę o Reakcie, aby zweryfikować
czego taka lektura może mnie nauczyć o całym podejściu do budowania projektów
z użyciem ekosystemu React-a i wrzuciłem &lt;a href=&quot;https://twitter.com/piecioshka/status/1748988434524303531&quot;&gt;tweet&lt;/a&gt;, że rozpocząłem czytanie.&lt;/p&gt;

&lt;p&gt;Następnego dnia kolega natomiast stanął w opozycji, do mojego pomysłu na napisał:&lt;/p&gt;

&lt;blockquote class=&quot;block-info&quot;&gt;
  &lt;p&gt;Książka o bibliotece? Nie czytał bym. Dokumentacja jest bardziej aktualna i poprawna.
— &lt;a href=&quot;https://twitter.com/ksuszynski&quot;&gt;@ksuszynski&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;figure class=&quot;social-center-block&quot;&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;pl&quot; dir=&quot;ltr&quot;&gt;Książka o bibliotece? Nie czytał bym. Dokumentacja jest bardziej aktualna i poprawna.&lt;/p&gt;&amp;mdash; Chris Suszyński (@ksuszynski) &lt;a href=&quot;https://twitter.com/ksuszynski/status/1749327922484203658?ref_src=twsrc%5Etfw&quot;&gt;January 22, 2024&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async=&quot;&quot; src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;

&lt;/figure&gt;

&lt;p&gt;Zamiast płacić Twitterowi, za możliwość publikacji długiej odpowiedzi postanowiłem,
że całą moją wypowiedź wrzucę tu, na bloga.&lt;/p&gt;

&lt;h2 id=&quot;-dlaczego-czytam-książki&quot;&gt;&lt;i class=&quot;icon-good&quot;&gt;&lt;/i&gt; Dlaczego czytam książki?&lt;/h2&gt;

&lt;ol&gt;
  &lt;li&gt;Dokumentacja nie rzadko jest pisana przez twórców i dlatego nie jest “dobra”
    &lt;ul&gt;
      &lt;li&gt;Rozwiązaniem jest tworzenie dokumentacji przez społeczność&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;W książce możemy poczytać o różnych sytuacjach, w których jakiś temat “biblioteki” w jakiś sposób autorowi książki przypadł do gustu lub też nie
    &lt;ul&gt;
      &lt;li&gt;W dokumentacji online, znajdziemy zawsze superlatywy o narzędziu&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Dygresje — często gęsto są przyjemne, jeśli nie odbiegają za bardzo od tematu książki
    &lt;ul&gt;
      &lt;li&gt;Tego brakuje w oficjalnej dokumentacji&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Książka to papier, mogę sobie czytać bez prądu i nie wytężając oczu
    &lt;ul&gt;
      &lt;li&gt;Czytanie książek jest bardziej praktyczne!&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;…no i lubię zapach papieru!&lt;/p&gt;

&lt;blockquote class=&quot;block-good&quot;&gt;
  &lt;p&gt;Dawno temu napisałem artykuł pt. “&lt;a href=&quot;/blog/2018/05/18/jaki-mam-stosunek-do-ksiazek-technicznych.html&quot;&gt;Jaki mam stosunek do książek technicznych?&lt;/a&gt;”,
opowiadający, dlaczego &lt;strong&gt;w ogóle&lt;/strong&gt; lubię czytać książki techniczne.
&lt;small&gt;Artykuł pochodzi z 2018 roku&lt;/small&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id=&quot;-co-stoi-w-opozycji&quot;&gt;&lt;i class=&quot;icon-poor&quot;&gt;&lt;/i&gt; Co stoi w opozycji?&lt;/h2&gt;

&lt;ol&gt;
  &lt;li&gt;Książka to papier, a papier to drzewa, nie szkoda Ci drzew?
    &lt;ul&gt;
      &lt;li&gt;Warto dbać o przyrodę i nie produkować makulatury i czytać elektronicznie&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Książki technologiczne szybko się dezaktualizują
    &lt;ul&gt;
      &lt;li&gt;Linki w książkach mogą nie działać po dłuższym czasie&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Co zrobić z książką techniczną, którą się przeczytało?
    &lt;ul&gt;
      &lt;li&gt;Sprzedanie lektury generuje dodatkowe zadanie i stratę finansową&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;podsumowanie&quot;&gt;Podsumowanie&lt;/h2&gt;

&lt;p&gt;Bez względu, czy preferujesz książki papierowe, czy elektroniczne,
czytanie o narzędziach, których się używa to &lt;strong&gt;wiedza teoretyczna&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Jest ona niezbędna, aby tworzyć oprogramowanie zgodnie z zaleceniami autorów,
natomiast &lt;strong&gt;najważniejsza jest praktyka&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Zachęcam do czytania (w taki sposób jaki lubisz), ale także do kodowania!&lt;/p&gt;

&lt;p&gt;Cya! 👋&lt;/p&gt;

&lt;!-- Resources --&gt;

</description>
            <pubDate>Mon, 22 Jan 2024 20:00:00 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2024/01/22/dlaczego-czytam-ksiazki-o-bibliotekach.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2024/01/22/dlaczego-czytam-ksiazki-o-bibliotekach.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/post-banner-lifestyle-ksiazka-o-react.png</image>
        </item>
        
        <item>
            <title>Recenzja: "React w działaniu. Tworzenie aplikacji internetowych. Wydanie II"</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Chciałbym się z Wami podzielić recenzją książki, którą dane mi było ostatnio
przeczytać. Zapraszam do krótkiego artykułu na temat książki autorstwa &lt;a href=&quot;https://twitter.com/stoyanstefanov&quot;&gt;Stoyan Stefanov&lt;/a&gt;,
byłego programisty Facebooka, pt. “&lt;a href=&quot;https://helion.pl/ksiazki/react-w-dzialaniu-tworzenie-aplikacji-internetowych-wydanie-ii-stoyan-stefanov,reacw2.htm#format/d&quot;&gt;React w działaniu. Tworzenie aplikacji internetowych. Wydanie II&lt;/a&gt;”.&lt;/p&gt;

&lt;figure class=&quot;full-width&quot;&gt;
    &lt;img src=&quot;/assets/images/posts/review-react-up-running/1N6A8703.jpg&quot; itemprop=&quot;image&quot; alt=&quot;Baner promujący artykuł&quot; /&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;dlaczego-kupiłem-tą-książkę&quot;&gt;Dlaczego kupiłem tą książkę?&lt;/h2&gt;

&lt;p&gt;Książkę zakupiłem via &lt;a href=&quot;https://www.empik.com/react-w-dzialaniu-tworzenie-aplikacji-internetowych-wydanie-ii-stefanov-stoyan,p1355654768,ksiazka-p&quot;&gt;empik.com&lt;/a&gt;, &lt;strong&gt;aby wreszcie przeczytać jakąś pozycję
o narzędziu, które jest tak bardzo popularne, a zarazem, którego używam na co dzień&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Fakt, że książki w dzisiejszych czasach może nie są tak samo popularne jak kiedyś,
natomiast ja lubię czytać zwykłe książki i doświadczać faktury papieru oraz tworzyć notatki ołówkiem,
i nie odrywać się od czytania tylko zalegnąć z lekturą na kilka godzin.&lt;/p&gt;

&lt;p&gt;Autorem książki jest ten sam programista, który jest autorem starej i sławnej
książki pt. “&lt;a href=&quot;https://helion.pl/ksiazki/javascript-wzorce-stoyan-stefanov,jascwz.htm#format/e&quot;&gt;JavaScript. Wzorce&lt;/a&gt;” opublikowanej w 2012 roku.
Ta lektura dość mocno wpłynęła na moją karierę zawodową, stąd też cenię tego autora.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Książka “JavaScript. Wzorce” znajduje się mojej biblioteczce książek polecanych dostępnej pod adresem &lt;a href=&quot;/polecane-ksiazki/&quot;&gt;/polecane-ksiazki/&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Kolejnym argumentem motywującym zakup książki jest to, że będzie opisywać
bibliotekę, która nie rozwija się już tak szybko jak kiedyś. Tak więc, &lt;strong&gt;książka nie będzie
bardzo nieaktualna względem najnowszej wersji&lt;/strong&gt;. &lt;em&gt;Niestety, React rzadko się rozwija.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Tak wygląda ostatnie kilka wpisów &lt;a href=&quot;https://github.com/facebook/react/releases&quot;&gt;wydań biblioteki na GitHubie&lt;/a&gt;:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;18.2.0 (June 14, 2022)&lt;/li&gt;
  &lt;li&gt;18.1.0 (April 26, 2022)&lt;/li&gt;
  &lt;li&gt;18.0.0 (March 29, 2022)&lt;/li&gt;
  &lt;li&gt;17.0.2 (March 22, 2021)&lt;/li&gt;
  &lt;li&gt;17.0.1 (October 22, 2020)&lt;/li&gt;
  &lt;li&gt;17.0.0 (October 20, 2020)&lt;/li&gt;
  &lt;li&gt;16.14.0 (October 14, 2020)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Książka, którą recenzuję została wydana:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;2021-11-11 (oryginał)
    &lt;ul&gt;
      &lt;li&gt;“&lt;a href=&quot;https://www.empik.com/react-up-running-building-web-applications-stefanov-stoyan,p1327929988,ksiazka-p&quot;&gt;React: Up &amp;amp; Running: Building Web Applications&lt;/a&gt;”&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;2023-02-14 (polska wersja, przetłumaczona przez Helion)
    &lt;ul&gt;
      &lt;li&gt;“&lt;a href=&quot;https://www.empik.com/react-w-dzialaniu-tworzenie-aplikacji-internetowych-wydanie-ii-stefanov-stoyan,p1355654768,ksiazka-p&quot;&gt;React w działaniu. Tworzenie aplikacji internetowych. Wydanie II&lt;/a&gt;”&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;czego-mogę-się-nauczyć-z-tej-książki&quot;&gt;Czego mogę się nauczyć z tej książki?&lt;/h2&gt;

&lt;p&gt;Niestety, ale tłumaczenia książek technologicznych to często jakieś nieporozumienie.
Nie wiem po co na siłę tłumaczyć konstrukcje, które nie są jednoznaczne.
Przykładem niech będzie “operator rozszczepienia”. Drogi czytelniku, czy wiesz
co autor książki opisuje? No właśnie, ja też nie wiedziałem. W tym przypadku
autor książki opisywał &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_syntax&quot;&gt;Spread Operator&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Książka nie jest gruba. Opisuje dwa projekty, które łączą się w jedną całość.&lt;/p&gt;

&lt;p&gt;✅ &lt;strong&gt;Z książki dowiesz się o:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;składnia JSX
    &lt;ul&gt;
      &lt;li&gt;&lt;a href=&quot;https://magic.reactjs.net/htmltojsx.htm&quot;&gt;HTML to JSX Compiler&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;komponenty kontrolowane (formularze, kontrolki)&lt;/li&gt;
  &lt;li&gt;przekazywanie danych do komponentu&lt;/li&gt;
  &lt;li&gt;klasowe komponenty, oraz zdarzenia cyklu życia:
    &lt;ul&gt;
      &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;componentDidUpdate()&lt;/code&gt;&lt;/li&gt;
      &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;componentDidMount()&lt;/code&gt;&lt;/li&gt;
      &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;componentWillUnmount()&lt;/code&gt;&lt;/li&gt;
      &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;getSnapshotBeforeUpdate()&lt;/code&gt;&lt;/li&gt;
      &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;shouldComponentUpdate()&lt;/code&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;komponenty funkcyjne&lt;/li&gt;
  &lt;li&gt;idea funkcji typu reducer oraz testy jednostkowe do nich&lt;/li&gt;
  &lt;li&gt;atrybuty:
    &lt;ul&gt;
      &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;key&lt;/code&gt; a iteracja po liście elementów,&lt;/li&gt;
      &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;className&lt;/code&gt;&lt;/li&gt;
      &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;style&lt;/code&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Hooks
    &lt;ul&gt;
      &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;useRef()&lt;/code&gt;&lt;/li&gt;
      &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;useLayoutEffect()&lt;/code&gt;&lt;/li&gt;
      &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;useEffect()&lt;/code&gt;&lt;/li&gt;
      &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;useState()&lt;/code&gt;&lt;/li&gt;
      &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;useReducer()&lt;/code&gt;&lt;/li&gt;
      &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;useCallback()&lt;/code&gt;&lt;/li&gt;
      &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;useContext()&lt;/code&gt; (Consumer)&lt;/li&gt;
      &lt;li&gt;Tworzenie własnego hooka - &lt;code class=&quot;highlighter-rouge&quot;&gt;useLoggedState()&lt;/code&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;APIs
    &lt;ul&gt;
      &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;forwardRef()&lt;/code&gt;&lt;/li&gt;
      &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;createContext()&lt;/code&gt; (Provider)&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Components
    &lt;ul&gt;
      &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;&amp;lt;Fragment&amp;gt;&lt;/code&gt; &amp;amp; &lt;code class=&quot;highlighter-rouge&quot;&gt;&amp;lt;&amp;gt;&lt;/code&gt;&lt;/li&gt;
      &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;&amp;lt;StrictMode&amp;gt;&lt;/code&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;⛔️ Niestety, ale &lt;strong&gt;w książce brakuje opisu bardziej zaawansowanych funkcji&lt;/strong&gt; jak:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;APIs
    &lt;ul&gt;
      &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;lazy()&lt;/code&gt;&lt;/li&gt;
      &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;memo()&lt;/code&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Hooks
    &lt;ul&gt;
      &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;useMemo()&lt;/code&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Components
    &lt;ul&gt;
      &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;&amp;lt;Profiler&amp;gt;&lt;/code&gt;&lt;/li&gt;
      &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;&amp;lt;Suspense&amp;gt;&lt;/code&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Router&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;czy-jest-treściwa-czy-dużo-jest-lania-wody&quot;&gt;Czy jest “treściwa”, czy dużo jest lania wody?&lt;/h2&gt;

&lt;p&gt;W tej sekcji spróbuję odpowiedzieć czy w książce nie ma tekstu pisanego tylko po to, aby zapełnić strony.&lt;/p&gt;

&lt;p&gt;Jeśli miałbym ocenić książkę pod tym kątem to dałbym &lt;strong&gt;ocenę 6/10&lt;/strong&gt;.
Początek książki jest obiecujący. Można się dowiedzieć o tym jak działa
biblioteka, natomiast druga połowa to już raczej nikomu nieprzydatna treść.
W drugiej części jest tylko przedstawiony workflow opisujący logikę aplikacji,
która jest tworzona, przestawić coś nowego, czego brakuje w książce.&lt;/p&gt;

&lt;p&gt;Dlatego też tę drugą część książki oceniam jako może nie “lanie wody”,
ale też nie mogą jej ocenić jako przydatną treść.&lt;/p&gt;

&lt;h2 id=&quot;czy-zawiera-wiedzę-którą-trudno-gdzieś-indziej-znaleźć&quot;&gt;Czy zawiera wiedzę, którą trudno gdzieś indziej znaleźć?&lt;/h2&gt;

&lt;p&gt;Nie mogę odpowiedzieć twierdząco na to pytanie. Wszystko, co jest
w książce można śmiało przeczytać w dokumentacji Reacta. Może dokumentacja
nie jest wybitnie dokładna i precyzyjna, ale za to napisana prostym językiem,
co ułatwia jej zrozumienie.&lt;/p&gt;

&lt;p&gt;Książki techniczne rzadko zawierają unikalną wiedzę, której nie można znaleźć
w sieci. Na pewno żadna książka o bibliotece nie będzie zawierała unikalnej wiedzy.&lt;/p&gt;

&lt;h2 id=&quot;jaki-jest-docelowy-odbiorca-stary-wyjadacz-czy-początkujący&quot;&gt;Jaki jest docelowy odbiorca (stary wyjadacz czy początkujący)?&lt;/h2&gt;

&lt;p&gt;Docelowym odbiorcą jest początkujący programista (początkująca programistka),
który (która) chce tworzyć proste aplikacje w oparciu o bibliotekę React.&lt;/p&gt;

&lt;p&gt;Osoby ze stażem w budowaniu aplikacji webowych z użyciem Reacta, nie znajdą
w tej książce niczego interesującego, ani niczego czego nie mogliby znaleźć w sieci.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Polecam tę książkę na początek swojej przygody z biblioteką React.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id=&quot;czy-jest-bardziej-teoretyczna-czy-też-większy-nacisk-jest-postawiony-na-przykłady&quot;&gt;Czy jest bardziej teoretyczna, czy też większy nacisk jest postawiony na przykłady?&lt;/h2&gt;

&lt;p&gt;Książka kładzie duży nacisk na przykłady. W oparciu o budowanie komponentów tłumaczy
podstawowe elementy Reacta. Moim zdaniem natomiast ostatnie 2 rozdziały, to strata czasu.
Nie ma w nich wytłumaczenia nowych zagadnień.&lt;/p&gt;

&lt;p&gt;Proces nauki wymaga wiedzy teoretycznej i praktycznej. Natomiast proporcje powinny
być w przeważającej większości skierowane w stronę praktyki.&lt;/p&gt;

&lt;p&gt;W książce nie znajduję żadnych dygresji.&lt;/p&gt;

&lt;h2 id=&quot;czy-przykłady-są-wartościowe&quot;&gt;Czy przykłady są wartościowe?&lt;/h2&gt;

&lt;p&gt;Tak, przykłady były przydatne, bo na ich podstawie były wyjaśniane elementy Reacta.&lt;/p&gt;

&lt;p&gt;Każda nowa konstrukcja była na początku opisana teoretycznie, a następnie
zaprezentowany był przykład.&lt;/p&gt;

&lt;p&gt;Myślę, że najbardziej trafione było wytłumaczenie hooka &lt;code class=&quot;highlighter-rouge&quot;&gt;useReducer&lt;/code&gt;.
Do takiego stopnia mi się ono spodobało, że wrzuciłem o tym tweeta:&lt;/p&gt;

&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;One of my fav part of this 📖 &lt;a href=&quot;https://twitter.com/hashtag/Reducer?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#Reducer&lt;/a&gt; &lt;a href=&quot;https://t.co/GhzGkA0Vhk&quot;&gt;pic.twitter.com/GhzGkA0Vhk&lt;/a&gt;&lt;/p&gt;&amp;mdash; Piotr Kowalski (@piecioshka) &lt;a href=&quot;https://twitter.com/piecioshka/status/1723650065213038800?ref_src=twsrc%5Etfw&quot;&gt;November 12, 2023&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async=&quot;&quot; src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;

&lt;p&gt;Ciekawy jest też sposób na stworzenie funkcji do aktualizacji kontekstu.
Przykład:&lt;/p&gt;

&lt;div class=&quot;language-js highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;// contexts/DataContext.js&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;React&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'react'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;DataContext&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;React&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;createContext&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;({&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[],&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;updateData&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{},&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;});&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;default&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;DataContext&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class=&quot;language-js highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;// components/App.js&lt;/span&gt;
&lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;App&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;initialData&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;JSON&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;parse&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;localStorage&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;getItem&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'data'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;));&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;setData&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;useState&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;initialData&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

    &lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;updateData&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;newData&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;nx&quot;&gt;newData&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;clone&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;newData&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;nx&quot;&gt;commitToStorage&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;newData&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;nx&quot;&gt;setData&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;newData&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
        &lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;DataContext&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;Provider&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{{&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;updateData&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}}&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt;
            &lt;span class=&quot;c&quot;&gt;&amp;lt;!--&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;...&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;--&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;sr&quot;&gt;/DataContext.Provider&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;&amp;gt;
&lt;/span&gt;    &lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;default&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;App&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class=&quot;language-js highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;// components/Header.js&lt;/span&gt;
&lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Header&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;updateData&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;useContext&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;DataContext&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;// ...&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;default&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;App&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;czy-ktoś-doświadczony-może-się-czegoś-nowego-dowiedzieć&quot;&gt;Czy ktoś doświadczony może się czegoś nowego dowiedzieć?&lt;/h2&gt;

&lt;p&gt;W książce podkreśliłem następujące fragmenty:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;“Można przecież utworzyć aplikację za pomocą Reacta przeznaczoną do renderowania
w różnych środowiskach poza przeglądarką - na przykład w elemencie Canvas.”
&lt;br /&gt;— (strona 17)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Zastanawiam się, czy istnieje jakaś biblioteka, gdzie możemy używać Reacta
do budowy komponentów, natomiast nie renderować ich w drzewie DOM, tylko
na płaszczyźnie Canvas.&lt;/p&gt;

&lt;p&gt;Nie mam doświadczenia w takim sposobie renderowania komponentów.
Ciekawi mnie, czy transparentne jest przeniesienie przestrzeni do renderowania
z drzewa DOM do obiektu Canvas.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;“Komponenty funkcyjne wymagają nieco mniejszej mocy obliczeniowej CPU i mniej kodu.”
&lt;br /&gt;— (strona 25)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Tu nie jestem pewien jak to sprawdzić. Nie wiem, czy autor jest pewny, że
to zdanie jest prawdziwe. Chciałbym w jakiś sposób to sprawdzić, czy faktycznie
komponenty funkcyjne wymagają mniejszej mocy obliczeniowej.&lt;/p&gt;

&lt;h2 id=&quot;porównanie-do-podobnych-pozycji-na-rynku&quot;&gt;Porównanie do podobnych pozycji na rynku&lt;/h2&gt;

&lt;p&gt;Nie mam porównania z innymi pozycjami na rynku.&lt;/p&gt;

&lt;p&gt;Jeśli Ty takie posiadasz, to dodaj komentarz co myślisz o innych książkach.&lt;/p&gt;

&lt;h2 id=&quot;podsumowanie&quot;&gt;Podsumowanie&lt;/h2&gt;

&lt;p&gt;Czy było warto przeczytać? Ogólnie myślę, że &lt;strong&gt;było warto&lt;/strong&gt;.&lt;/p&gt;

&lt;h3 id=&quot;-plusy&quot;&gt;&lt;i class=&quot;icon-good&quot;&gt;&lt;/i&gt; Plusy&lt;/h3&gt;

&lt;ol&gt;
  &lt;li&gt;Czytanie książek to satysfakcjonujące zajęcie. Gdy przeczytasz kolejną lekturę to masz poczucie dobrze spędzonego czasu&lt;/li&gt;
  &lt;li&gt;Pozycja nie była gruba, więc czytanie jej (a czasami męki) nie trwało zbyt długo&lt;/li&gt;
  &lt;li&gt;Zweryfikowanie swojego zakresu wiedzy na temat biblioteki&lt;/li&gt;
  &lt;li&gt;Znalezienie czegoś nowego dla siebie, np. link do wszystkich wspieranych encji HTML, oraz ciekawe podejście do kontekstu&lt;/li&gt;
&lt;/ol&gt;

&lt;h3 id=&quot;-minusy&quot;&gt;&lt;i class=&quot;icon-poor&quot;&gt;&lt;/i&gt; Minusy&lt;/h3&gt;

&lt;ol&gt;
  &lt;li&gt;Brakowało mi lepszego wyjaśnienia &lt;code class=&quot;highlighter-rouge&quot;&gt;useCallback()&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;Techniki optymalizacji jak np. &lt;code class=&quot;highlighter-rouge&quot;&gt;React.memo()&lt;/code&gt; oraz &lt;code class=&quot;highlighter-rouge&quot;&gt;useMemo()&lt;/code&gt; zostały pominięte&lt;/li&gt;
&lt;/ol&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;p&gt;To tyle ode mnie.&lt;/p&gt;

&lt;p&gt;Czytelniku! Dziękuję Ci za przeczytanie tego artykułu.&lt;br /&gt;
Jeśli Ci się on spodobał, to proszę zaznacz to w sekcji komentarzy.&lt;br /&gt;
Będzie mi miło.&lt;/p&gt;

&lt;p&gt;Pozdrawiam, Piotr 🖐️&lt;/p&gt;

&lt;!-- Resources --&gt;

</description>
            <pubDate>Wed, 27 Dec 2023 09:00:00 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2023/12/27/ksiazka-react-w-dzialaniu-stoyan-stefanov.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2023/12/27/ksiazka-react-w-dzialaniu-stoyan-stefanov.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/review-react-up-running/1N6A8703.jpg</image>
        </item>
        
        <item>
            <title>Diagram Sekwencji w UML (przykłady w JavaScript)</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Dziś przygotowałem dla Was artykuł o &lt;em&gt;Diagramie Sekwencji&lt;/em&gt;. Dowiecie się z niego
jakie korzyści płyną z jego używania. Jestem przekonany, że ten diagram spodoba
się wszystkim programistkom i programistom.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/uml/uml-logo.png&quot; itemprop=&quot;image&quot; alt=&quot;Baner promujący artykuł&quot; /&gt;
    &lt;figcaption&gt;
        Oficjalne logo &lt;a href=&quot;https://en.wikipedia.org/wiki/Unified_Modeling_Language&quot;&gt;UML&lt;/a&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Inne artykułu na blogu traktujące o UML:&lt;/p&gt;

&lt;ul&gt;
    
        
    
        
    
        
    
        
        &lt;li&gt;
            &lt;time&gt;2023-11-28&lt;/time&gt; - &lt;a href=&quot;/blog/2023/11/28/uml-diagram-sekwencji.html&quot;&gt;Diagram Sekwencji w UML (przykłady w JavaScript)&lt;/a&gt;
        &lt;/li&gt;
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
        &lt;li&gt;
            &lt;time&gt;2020-06-26&lt;/time&gt; - &lt;a href=&quot;/blog/2020/06/26/uml-diagram-klas.html&quot;&gt;Diagram Klas w UML (przykłady w JavaScript)&lt;/a&gt;
        &lt;/li&gt;
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
        &lt;li&gt;
            &lt;time&gt;2017-06-06&lt;/time&gt; - &lt;a href=&quot;/blog/2017/06/06/po-co-mi-uml.html&quot;&gt;Po co mi UML?&lt;/a&gt;
        &lt;/li&gt;
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
&lt;/ul&gt;

&lt;h2 id=&quot;po-co-stosować-diagram-sekwencji&quot;&gt;Po co stosować &lt;em&gt;Diagram Sekwencji&lt;/em&gt;?&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Diagram Sekwencji&lt;/em&gt;, który jest podtypem &lt;em&gt;Diagramu Interakcji&lt;/em&gt;, służy do
&lt;strong&gt;opisania ścieżki algorytmu, bez zagłębiania się w detale&lt;/strong&gt;. Wykorzystywany,
aby zamodelować proces lub ścieżkę algorytmu w sposób przystępny i ustandaryzowany.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Diagram Sekwencji&lt;/em&gt; nie zawiera szczegółów implementacyjnych, więc idealnie służy
do projektowania.&lt;/p&gt;

&lt;p&gt;Dodatkowym plusem, który jest cechą wszystkich diagramów, jest oczywiście to,
że diagramy są agnostyczne względem języka oraz technologii.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;h3 id=&quot;co-to-jest-uml&quot;&gt;Co to jest UML?&lt;/h3&gt;
  &lt;p&gt;Jeśli nie wiesz, to zapraszam do &lt;a href=&quot;/blog/2017/06/06/po-co-mi-uml.html&quot;&gt;artykułu nt. UML&lt;/a&gt; na tym blogu.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id=&quot;diagram-sekwencji-w-specyfikacji-uml&quot;&gt;Diagram Sekwencji w Specyfikacji UML&lt;/h2&gt;

&lt;p&gt;Wersja aktualna na dzień pisania artykułu to v2.5.1. Opublikowana w grudniu 2017.&lt;br /&gt;
Do pobrania w wersji PDF: &lt;a href=&quot;https://www.omg.org/spec/UML/2.5.1/PDF&quot;&gt;https://www.omg.org/spec/UML/2.5.1/PDF&lt;/a&gt;&lt;br /&gt;
Rozdział, który nas interesuje to &lt;strong&gt;“17.8 Sequence Diagrams”&lt;/strong&gt; (na stronie 595).&lt;/p&gt;

&lt;h2 id=&quot;notacja&quot;&gt;Notacja&lt;/h2&gt;

&lt;p&gt;Lista elementów, które są używane na &lt;em&gt;Diagramach Sekwencji&lt;/em&gt; wraz ze znaczeniami:&lt;/p&gt;

&lt;h3 id=&quot;linia-życia---prostokąt-z-pionową-linią&quot;&gt;Linia życia &lt;small&gt;- prostokąt z pionową linią&lt;/small&gt;&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Prostokąt:
    &lt;ul&gt;
      &lt;li&gt;Reprezentuje &lt;code class=&quot;highlighter-rouge&quot;&gt;encję&lt;/code&gt; z opisywanego procesu&lt;/li&gt;
      &lt;li&gt;W prostokącie możemy użyć nazwę klasy jako element dziedziny problemu&lt;/li&gt;
      &lt;li&gt;Ale również możemy użyć nazwy obiektu, stworzonego za pomocą klasy&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Pionowa linia:
    &lt;ul&gt;
      &lt;li&gt;Reprezentuje czas życia opisywanego elementu&lt;/li&gt;
      &lt;li&gt;Kolejne linie życia tworzymy TYLKO po prawej stronie w kolejności użycia&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;figure class=&quot;two-columns&quot;&gt;
    &lt;div&gt;
        &lt;img src=&quot;/assets/images/posts/uml/sequence-diagram/diagram-sekwencji-linia-zycia.svg&quot; alt=&quot;&quot; /&gt;
    &lt;/div&gt;
    &lt;figcaption&gt;
        &lt;pre&gt;
option footer=none

participant A
participant b: B
        &lt;/pre&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;ul&gt;
  &lt;li&gt;Atomowa operacja
    &lt;ul&gt;
      &lt;li&gt;Jeśli chcemy zaznaczyć, czas trwania obsługi komunikatu możemy stworzyć
  na linii życia dodatkowy prostokąt&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;figure class=&quot;two-columns&quot;&gt;
    &lt;div&gt;
        &lt;img src=&quot;/assets/images/posts/uml/sequence-diagram/diagram-sekwencji-atomowa-operacja.svg&quot; alt=&quot;&quot; /&gt;
    &lt;/div&gt;
    &lt;figcaption&gt;
        &lt;pre&gt;
option footer=none

participant A
participant B

A-&amp;gt;B: request
activate B
B--&amp;gt;A: response
deactivate B
        &lt;/pre&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;Zakończenie linii życia - Wielki znak iks użyty na linii życia informuje, że czas życia
  danej &lt;code class=&quot;highlighter-rouge&quot;&gt;encji&lt;/code&gt; został właśnie zakończony&lt;/p&gt;

    &lt;p&gt;Na diagramie powyżej można zobaczyć wizualizację zakończenia linii życia.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;figure class=&quot;two-columns&quot;&gt;
    &lt;div&gt;
        &lt;img src=&quot;/assets/images/posts/uml/sequence-diagram/diagram-sekwencji-koniec-linii-zycia.svg&quot; alt=&quot;&quot; /&gt;
    &lt;/div&gt;
    &lt;figcaption&gt;
        &lt;pre&gt;
option footer=none

participant A
destroy A
        &lt;/pre&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h3 id=&quot;komunikat----pozioma-strzałka-z-podpisem&quot;&gt;Komunikat &lt;small&gt; - pozioma strzałka z podpisem&lt;/small&gt;&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Podpis&lt;/strong&gt;:
    &lt;ul&gt;
      &lt;li&gt;Zawiera nazwę czynności uruchomionej na &lt;code class=&quot;highlighter-rouge&quot;&gt;encji&lt;/code&gt;, do której strzałka kieruje.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Strzałka&lt;/strong&gt;:
    &lt;ul&gt;
      &lt;li&gt;Mamy do dyspozycji kilka typów, ale &lt;strong&gt;najpopularniejsze&lt;/strong&gt; z nich to:
        &lt;ul&gt;
          &lt;li&gt;
            &lt;dl&gt;
              &lt;dt&gt;linia &lt;u&gt;ciągła&lt;/u&gt; połączona z &lt;u&gt;wypełnionym&lt;/u&gt; grotem&lt;/dt&gt;
              &lt;dd&gt;oznacza &lt;strong&gt;synchroniczne wywołanie&lt;/strong&gt;&lt;/dd&gt;
            &lt;/dl&gt;
          &lt;/li&gt;
          &lt;li&gt;
            &lt;dl&gt;
              &lt;dt&gt;linia &lt;u&gt;ciągła&lt;/u&gt; połączona z &lt;u&gt;pustym&lt;/u&gt; grotem&lt;/dt&gt;
              &lt;dd&gt;oznacza &lt;strong&gt;asynchroniczne wywołanie&lt;/strong&gt;&lt;/dd&gt;
            &lt;/dl&gt;
          &lt;/li&gt;
          &lt;li&gt;
            &lt;dl&gt;
              &lt;dt&gt;linia &lt;u&gt;przerywana&lt;/u&gt; połączona z &lt;u&gt;pełnym&lt;/u&gt; grotem&lt;/dt&gt;
              &lt;dd&gt;oznacza &lt;strong&gt;odpowiedź&lt;/strong&gt;&lt;/dd&gt;
            &lt;/dl&gt;
          &lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;figure class=&quot;two-columns&quot;&gt;
    &lt;div&gt;
        &lt;img src=&quot;/assets/images/posts/uml/sequence-diagram/diagram-sekwencji-komunikaty.svg&quot; alt=&quot;&quot; /&gt;
    &lt;/div&gt;
    &lt;figcaption&gt;
        &lt;pre&gt;
option footer=none

A-&amp;gt;B: Synchroniczne wywołanie
A-&amp;gt;&amp;gt;B: Asynchroniczne wywołanie
B--&amp;gt;A: Odpowiedź
        &lt;/pre&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;ul&gt;
  &lt;li&gt;Komunikat zwrotny
    &lt;ul&gt;
      &lt;li&gt;Jeśli chcemy zaznaczyć, że encja coś procesuje, możemy utworzyć wiadomość
  w której nadawca i odbiorca będę pochodzić z tej samej linii życia&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;figure class=&quot;two-columns&quot;&gt;
    &lt;div&gt;
        &lt;img src=&quot;/assets/images/posts/uml/sequence-diagram/diagram-sekwencji-komunikat-zwrotny.svg&quot; alt=&quot;&quot; /&gt;
    &lt;/div&gt;
    &lt;figcaption&gt;
        &lt;pre&gt;
option footer=none

A-&amp;gt;A: message
        &lt;/pre&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h3 id=&quot;fragment---prostokąt-który-zawiera-pewien-zakres-czynności&quot;&gt;Fragment &lt;small&gt;- prostokąt, który zawiera pewien zakres czynności&lt;/small&gt;&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Tworzy obszar z warunkiem, pętlą lub jednoczesnym uruchomieniem
  więcej niż jednej czynności&lt;/li&gt;
  &lt;li&gt;Rozróżniamy kilka typów fragmentów:
    &lt;ul&gt;
      &lt;li&gt;
        &lt;dl&gt;
          &lt;dt&gt;alt&lt;/dt&gt;
          &lt;dd&gt;Alternatywa: tylko ten, którego warunek jest prawdziwy, zostanie wykonany (możemy zdefiniować blok &lt;code class=&quot;highlighter-rouge&quot;&gt;else&lt;/code&gt;)&lt;/dd&gt;
        &lt;/dl&gt;
      &lt;/li&gt;
      &lt;li&gt;
        &lt;dl&gt;
          &lt;dt&gt;opt&lt;/dt&gt;
          &lt;dd&gt;Opcjonalnie: fragment jest wykonywany tylko wtedy, gdy podany warunek jest prawdziwy (taki &lt;code class=&quot;highlighter-rouge&quot;&gt;alt&lt;/code&gt;, ale bez &lt;code class=&quot;highlighter-rouge&quot;&gt;else&lt;/code&gt;`)&lt;/dd&gt;
        &lt;/dl&gt;
      &lt;/li&gt;
      &lt;li&gt;
        &lt;dl&gt;
          &lt;dt&gt;par&lt;/dt&gt;
          &lt;dd&gt;Równolegle: każdy fragment jest uruchamiany równolegle&lt;/dd&gt;
        &lt;/dl&gt;
      &lt;/li&gt;
      &lt;li&gt;
        &lt;dl&gt;
          &lt;dt&gt;loop&lt;/dt&gt;
          &lt;dd&gt;Pętla: fragment może być wykonywany wielokrotnie, a warunek wskazuje podstawę iteracji&lt;/dd&gt;
        &lt;/dl&gt;
      &lt;/li&gt;
      &lt;li&gt;
        &lt;dl&gt;
          &lt;dt&gt;region&lt;/dt&gt;
          &lt;dd&gt;Obszar krytyczny: fragment może być wykonywany tylko przez jeden wątek jednocześnie&lt;/dd&gt;
        &lt;/dl&gt;
      &lt;/li&gt;
      &lt;li&gt;
        &lt;dl&gt;
          &lt;dt&gt;neg&lt;/dt&gt;
          &lt;dd&gt;Negatywny: fragment wykazuje nieprawidłową interakcję&lt;/dd&gt;
        &lt;/dl&gt;
      &lt;/li&gt;
      &lt;li&gt;
        &lt;dl&gt;
          &lt;dt&gt;ref&lt;/dt&gt;
          &lt;dd&gt;Odniesienie: odnosi się do interakcji zdefiniowanej na innym diagramie. Ramka jest rysowana tak, aby obejmowała linie życia zaangażowane w interakcję. Można zdefiniować parametry i wartość zwracaną&lt;/dd&gt;
        &lt;/dl&gt;
      &lt;/li&gt;
      &lt;li&gt;
        &lt;dl&gt;
          &lt;dt&gt;sd&lt;/dt&gt;
          &lt;dd&gt;Diagram sekwencji: używany do otaczania całego diagramu sekwencji.&lt;/dd&gt;
        &lt;/dl&gt;
      &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;figure class=&quot;two-columns&quot;&gt;
    &lt;div&gt;
        &lt;img src=&quot;/assets/images/posts/uml/sequence-diagram/diagram-sekwencji-fragmenty.svg&quot; alt=&quot;&quot; /&gt;
    &lt;/div&gt;
    &lt;figcaption&gt;
        &lt;pre&gt;
option footer=none

loop
A-&amp;gt;B: message1
A-&amp;gt;&amp;gt;B: message2
end

alt condition
A-&amp;gt;B: message3
else else
A-&amp;gt;B: message4
end

opt
    A-&amp;gt;B: message5
    seq
        A-&amp;gt;B: message6
    end
end
        &lt;/pre&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;jakiego-typu-informacje-zamieszczamy-na-diagramie-sekwencji&quot;&gt;Jakiego typu informacje zamieszczamy na &lt;em&gt;Diagramie Sekwencji&lt;/em&gt;?&lt;/h2&gt;

&lt;p&gt;Umieszczamy:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Nazwy elementów dziedziny problemu oraz ich linie życia&lt;/li&gt;
  &lt;li&gt;Komunikaty wysyłane między liniami życia (wywołania i odpowiedzi)&lt;/li&gt;
  &lt;li&gt;Obszary, które zmieniają przepływ algorytmu, tj. pętle, warunki&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Opcjonalnie umieszczamy:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Tworząc komunikat, możemy dodać podpis nad strzałką będący nazwą funkcji
  wraz z listą argumentów, jakie do niej przekazujemy&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nie umieszczamy:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Implementacji funkcji&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;przykład&quot;&gt;Przykład&lt;/h2&gt;

&lt;p&gt;Chcemy zbudować &lt;em&gt;listę zadań&lt;/em&gt; (to będzie nasza &lt;em&gt;domena&lt;/em&gt;).
Jakie elementy będę występować w domenie problemu?&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Lista zadań&lt;/li&gt;
  &lt;li&gt;Zadanie&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Przykładowy kod (stworzony tylko na potrzeby lepszego zrozumienia przykładu):&lt;/p&gt;

&lt;div class=&quot;language-js highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;TaskList&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;cm&quot;&gt;/* logic */&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;kd&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Task&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;cm&quot;&gt;/* logic */&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;TaskList&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;nx&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Zatem, jak będzie wyglądał Diagram Sekwencji? Czy możemy zaplanować jak
będzie wyglądała komunikacja między elementami tej domeny? Tak!&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/uml/sequence-diagram/diagram-sekwencji-lista-zadan.svg&quot; alt=&quot;&quot; /&gt;
    &lt;figcaption&gt;
        &lt;details&gt;
            &lt;summary&gt;Kod powyższego Diagramu Sekwencji&lt;/summary&gt;
            &lt;pre style=&quot;text-align: left&quot;&gt;
participant TaskList
participant Task

note over TaskList,Task: create
TaskList-&amp;gt;Task: create( value: string )
activate Task
Task--&amp;gt;TaskList: taskId: number

note over TaskList,Task: render
TaskList-&amp;gt;Task: render()
Task--&amp;gt;TaskList:

note over TaskList: add task to a list of tasks
TaskList-&amp;gt;TaskList:

note over TaskList,Task: delete
Task-&amp;gt;Task: delete()
Task-&amp;gt;TaskList: onRemoveTask()
deactivate Task

note over TaskList: remove task from a list of tasks
TaskList-&amp;gt;TaskList:

destroy Task
            &lt;/pre&gt;
        &lt;/details&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;A teraz jak to wygląda w praktyce? Poniżej możecie zobaczyć listę akcji
zdefiniowanych w prostokątach wraz z ich implementacją na GitHubie:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/piecioshka/demo-javascript-todo-list/blob/main/scripts/todo-list.js#L49&quot;&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;create&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/piecioshka/demo-javascript-todo-list/blob/main/scripts/todo-list.js#L58&quot;&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;render&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/piecioshka/demo-javascript-todo-list/blob/main/scripts/todo-list.js#L60&quot;&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;add task to a list of tasks&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/piecioshka/demo-javascript-todo-list/blob/main/scripts/task.js#L23&quot;&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;delete&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/piecioshka/demo-javascript-todo-list/blob/main/scripts/todo-list.js#L53&quot;&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;remove task from a list of tasks&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;w-jakich-narzędziach-tworzymy-diagramy-sekwencji&quot;&gt;W jakich narzędziach tworzymy &lt;em&gt;Diagramy Sekwencji&lt;/em&gt;?&lt;/h2&gt;

&lt;p&gt;Konwertery kodu na diagram:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;(🌟 Polecam) &lt;a href=&quot;https://websequencediagrams.com/&quot;&gt;https://websequencediagrams.com/&lt;/a&gt; - [&lt;a href=&quot;https://www.websequencediagrams.com/examples.html&quot;&gt;Przykłady&lt;/a&gt;]&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://sequencediagram.org/&quot;&gt;https://sequencediagram.org/&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://planttext.com/&quot;&gt;https://planttext.com/&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://bramp.github.io/js-sequence-diagrams/&quot;&gt;https://bramp.github.io/js-sequence-diagrams/&lt;/a&gt;
    &lt;ul&gt;
      &lt;li&gt;UWAGA: to narzędzie używa delikatnie innej składni niż poprzednie&lt;/li&gt;
      &lt;li&gt;[&lt;a href=&quot;https://bramp.github.io/js-sequence-diagrams/images/grammar.png&quot;&gt;Wspierana składnia&lt;/a&gt;]&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Edytory WYSIWYG, tj. budowanie diagramów za pomocą pointera:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://app.mural.co/&quot;&gt;https://app.mural.co/&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.yworks.com/yed-live/&quot;&gt;https://www.yworks.com/yed-live/&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.visual-paradigm.com/&quot;&gt;https://www.visual-paradigm.com/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/uml/sequence-diagram/sequence-diagram-change-patient-name.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;figcaption&gt;
        Diagram Sekwencji mojego autorstwa. Temat - Zmiana nazwiska pacjenta. 2013 rok.
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;narzędzie-vscode-sequence-diagrams---plugin-do-vsc&quot;&gt;Narzędzie &lt;a href=&quot;vsc-plugin&quot;&gt;VSCode Sequence Diagrams&lt;/a&gt; - plugin do &lt;a href=&quot;https://code.visualstudio.com/&quot;&gt;VSC&lt;/a&gt;&lt;/h2&gt;

&lt;p&gt;Ten plugin do &lt;em&gt;Visual Studio Code&lt;/em&gt; to ciekawa alternatywa do wcześniej wymienionych narzędzi,
która pozwala renderować &lt;em&gt;Diagram Sekwencji&lt;/em&gt; wewnątrz edytora.&lt;/p&gt;

&lt;blockquote class=&quot;block-average&quot;&gt;
  &lt;h3 id=&quot;-ważne&quot;&gt;&lt;i class=&quot;icon-average&quot;&gt;&lt;/i&gt; Ważne!&lt;/h3&gt;
  &lt;p&gt;Plugin &lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=AleksandarDev.vscode-sequence-diagrams&quot;&gt;VSCode Sequence Diagrams&lt;/a&gt; korzysta z &lt;a href=&quot;https://bramp.github.io/js-sequence-diagrams/&quot;&gt;js-sequence-diagrams&lt;/a&gt;.
dzięki czemu musimy korzystać z tej wspieranej składni.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id=&quot;książki&quot;&gt;Książki&lt;/h2&gt;

&lt;p&gt;Lista książek, z których można dowiedzieć się więcej na temat &lt;em&gt;Diagramu Sekwencji&lt;/em&gt;:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;🇵🇱 (ebook) “&lt;a href=&quot;https://helion.pl/ksiazki/skrzynka-narzedziowa-architekta-oprogramowania-michael-keeling,e_24hi.htm#format/e&quot;&gt;Skrzynka narzędziowa architekta oprogramowania&lt;/a&gt;” Michael Keeling
    &lt;ul&gt;
      &lt;li&gt;Data wydania ebooka: 2021-08-17&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;🇵🇱 (ebook) “&lt;a href=&quot;https://www.empik.com/modelowanie-systemow-informatycznych-w-jezyku-uml-2-1-stasiak-andrzej-dabrowski-wlodzimierz-wolski-michal,p1245341460,ebooki-i-mp3-p&quot;&gt;Modelowanie systemów informatycznych w języku UML 2.1&lt;/a&gt;” Andrzej Stasiak, Włodzimierz Dąbrowski, Michał Wolski
    &lt;ul&gt;
      &lt;li&gt;Data wydania ebooka: 2020-06-29&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;🇵🇱 (ebook) “&lt;a href=&quot;https://helion.pl/ksiazki/zostan-architektem-oprogramowania-michael-keeling,e_1e9c.htm&quot;&gt;Zostań architektem oprogramowania&lt;/a&gt;” Michael Keeling
    &lt;ul&gt;
      &lt;li&gt;Data wydania ebooka: 2019-12-03&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;filmy&quot;&gt;Filmy&lt;/h2&gt;

&lt;p&gt;Lista filmów, z których można dowiedzieć się na temat &lt;em&gt;Diagramu Sekwencji&lt;/em&gt;:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;🇺🇸 &lt;a href=&quot;https://www.youtube.com/watch?v=pCK6prSq8aw&quot;&gt;How to Make a UML Sequence Diagram&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;🇵🇱 &lt;a href=&quot;https://www.youtube.com/watch?v=25GonQNHODY&quot;&gt;Po co używamy diagramu sekwencji&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;🇺🇸 (Udacity) &lt;a href=&quot;https://www.youtube.com/watch?v=XIQKt5Bs7II&quot;&gt;UML Behavioral Diagrams: Sequence - Georgia Tech - Software Development Process&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;słownik-trudnych-słówek&quot;&gt;Słownik trudnych słówek&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;dl&gt;
      &lt;dt&gt;dziedzina problemu&lt;/dt&gt;
      &lt;dd&gt;obszar, w którym poruszana jest dyskusja&lt;br /&gt;
&lt;em&gt;Przykład:&lt;/em&gt; proces logowania użytkownika w serwisie&lt;/dd&gt;
    &lt;/dl&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;dl&gt;
      &lt;dt&gt;encja&lt;/dt&gt;
      &lt;dd&gt;dowolny element z dziedziny problemu&lt;br /&gt;
&lt;em&gt;Przykład:&lt;/em&gt; użytkownik w procesie logowania&lt;/dd&gt;
    &lt;/dl&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;dl&gt;
      &lt;dt&gt;algorytm&lt;/dt&gt;
      &lt;dd&gt;pewien ciąg zdarzeń następujących po sobie.
Zdarzenie uruchomione w zdefiniowany sposób realizują jakąś funkcjonalność.&lt;br /&gt;
&lt;em&gt;Przykład:&lt;/em&gt;&lt;/dd&gt;
    &lt;/dl&gt;
    &lt;ul&gt;
      &lt;li&gt;pobieranie danych z formularza,&lt;/li&gt;
      &lt;li&gt;budowanie obiektu, który posłuży jako &lt;em&gt;payload&lt;/em&gt; w żądania do serwera,&lt;/li&gt;
      &lt;li&gt;wysłanie zapytania HTTP&lt;/li&gt;
      &lt;li&gt;parsowanie odpowiedzi&lt;/li&gt;
      &lt;li&gt;obsługa odpowiedzi
        &lt;ul&gt;
          &lt;li&gt;prezentacja komunikatu błędu&lt;/li&gt;
          &lt;li&gt;przekierowane na stronę główną z informacją o pomyślnym zalogowaniu&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;zadania-na-przećwiczenie&quot;&gt;Zadania na przećwiczenie&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;dl&gt;
      &lt;dt&gt;Zadanie 1.&lt;/dt&gt;
      &lt;dd&gt;Za pomocą &lt;em&gt;Diagramu Sekwencji&lt;/em&gt;, opisz proces kupowania jabłek w sklepie spożywczym.&lt;/dd&gt;
    &lt;/dl&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;dl&gt;
      &lt;dt&gt;Zadanie 2.&lt;/dt&gt;
      &lt;dd&gt;Za pomocą &lt;em&gt;Diagramu Sekwencji&lt;/em&gt;, opisz proces uwierzytelniania użytkownika.&lt;/dd&gt;
    &lt;/dl&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;bibliografia&quot;&gt;Bibliografia&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.omg.org/spec/UML/2.5.1/PDF&quot;&gt;https://www.omg.org/spec/UML/2.5.1/PDF&lt;/a&gt;
    &lt;ul&gt;
      &lt;li&gt;Specyfikacja UML&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.visual-paradigm.com/guide/uml-unified-modeling-language/what-is-sequence-diagram/&quot;&gt;https://www.visual-paradigm.com/guide/uml-unified-modeling-language/what-is-sequence-diagram/&lt;/a&gt;
    &lt;ul&gt;
      &lt;li&gt;Świetnie przedstawiony opis Diagramu Sekwencji&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://pl.wikipedia.org/wiki/Unified_Modeling_Language&quot;&gt;https://pl.wikipedia.org/wiki/Unified_Modeling_Language&lt;/a&gt;
    &lt;ul&gt;
      &lt;li&gt;Strona o UML na polskiej Wikipedii&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.uml-diagrams.org/sequence-diagrams.html&quot;&gt;https://www.uml-diagrams.org/sequence-diagrams.html&lt;/a&gt;
    &lt;ul&gt;
      &lt;li&gt;Przyjemna dokumentacja &lt;em&gt;Diagramu Sekwencji&lt;/em&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=AleksandarDev.vscode-sequence-diagrams&quot;&gt;https://marketplace.visualstudio.com/items?itemName=AleksandarDev.vscode-sequence-diagrams&lt;/a&gt;
    &lt;ul&gt;
      &lt;li&gt;🔨 &lt;code class=&quot;highlighter-rouge&quot;&gt;VSCode Sequence Diagrams&lt;/code&gt; - plugin do &lt;a href=&quot;https://code.visualstudio.com/&quot;&gt;Visual Studio Code&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;!-- Resources --&gt;

</description>
            <pubDate>Tue, 28 Nov 2023 09:50:50 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2023/11/28/uml-diagram-sekwencji.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2023/11/28/uml-diagram-sekwencji.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/uml/uml-logo.png</image>
        </item>
        
        <item>
            <title>Jak sprawdzić typ zmiennej w JavaScript? Operator typeof</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Język programowania JavaScript jest dynamicznie typowany, co oznacza,
że zmienne mogą zmieniać typy danych podczas wykonywania programu.
Mając to na uwadze, jak możemy określić typ danego obiektu w dowolnym momencie?&lt;/p&gt;

&lt;p&gt;Tu z pomocą przychodzi operator &lt;code class=&quot;highlighter-rouge&quot;&gt;typeof&lt;/code&gt;.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/post-banner-javascript.png&quot; itemprop=&quot;image&quot; alt=&quot;Baner promujący artykuł&quot; /&gt;
&lt;/figure&gt;

&lt;p&gt;Dzięki temu artykułowi dowiesz się:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Jak sprawdzić typ zmiennej w JavaScript?&lt;/li&gt;
  &lt;li&gt;Jak sprawdzić, czy zmienna jest tablicą?&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;typowanie-w-języku-javascript&quot;&gt;Typowanie w języku JavaScript&lt;/h2&gt;

&lt;p&gt;Wbrew niektórym opiniom, w JavaScript istnieją typy. Sprawdzanie ich działa w runtime.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Więcej o samym “runtime” w artykule na tym blogu pt. &lt;a href=&quot;/blog/2020/06/17/runtime.html&quot;&gt;“Co to jest runtime?”&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Zatem, czy istnieje mechanizm, który sprawdzi nam typy w fazie kompilacji?&lt;/p&gt;

&lt;p&gt;Oczywiście, ale nie w JavaScript. Tak działa TypeScript a dokładnie TypeScript Compiler (&lt;code class=&quot;highlighter-rouge&quot;&gt;tsc&lt;/code&gt;), który to jest uruchomiony do tego, aby:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;w edytorach, aby podświetlać błędy w kodzie,&lt;/li&gt;
  &lt;li&gt;w terminalu, aby wygenerować plik(i) JavaScript, który(e) zostaną
zinterpretowane przez przeglądarkę.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;typeof-w-specyfikacji-ecma-262-edycja-14-2023&quot;&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;typeof&lt;/code&gt; w specyfikacji &lt;strong&gt;ECMA-262 edycja 14 (2023)&lt;/strong&gt;&lt;/h2&gt;

&lt;p&gt;Formalny zapis prosto z oficjalnego dokumentu:&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/ecma-spec/ecma-262_14th-edition-typeof.png&quot; alt=&quot;&quot; /&gt;
    &lt;figcaption&gt;
        &lt;a href=&quot;https://262.ecma-international.org/14.0/#sec-typeof-operator&quot;&gt;
          ECMA-262 14th edition — 13.5.3 The typeof Operator
        &lt;/a&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/ecma-spec/ecma-262_14th-edition-typeof-changes.png&quot; alt=&quot;&quot; /&gt;
    &lt;figcaption&gt;
        &lt;a href=&quot;https://262.ecma-international.org/14.0/#sec-IsHTMLDDA-internal-slot-typeof&quot;&gt;
          ECMA-262 14th edition — B.3.6.3 Changes to the typeof Operator
        &lt;/a&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;zasada-działania-bez-języka-formalnego-tak-zwyczajnie-po-polsku&quot;&gt;Zasada działania &lt;em&gt;(bez języka formalnego, tak zwyczajnie, po polsku)&lt;/em&gt;&lt;/h2&gt;

&lt;p&gt;Specyfikacja jest pisana… specyficznym językiem.
Myślę, że dobrze jest potrafić ją czytać.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Swego czasu blog V8 opublikował całą serię dotyczącą czytania specyfikacji ES
&lt;a href=&quot;https://v8.dev/blog/tags/understanding-ecmascript&quot;&gt;https://v8.dev/blog/tags/understanding-ecmascript&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Natomiast, gdy ktoś nigdy nie widział powyższego zapisu to opiszę jak działa
operator &lt;code class=&quot;highlighter-rouge&quot;&gt;typeof&lt;/code&gt; potocznym językiem.&lt;/p&gt;

&lt;p&gt;Przykład: &lt;code class=&quot;highlighter-rouge&quot;&gt;typeof val&lt;/code&gt;&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Zmienna &lt;code class=&quot;highlighter-rouge&quot;&gt;val&lt;/code&gt; przechowuje wynik wykonania wyrażania znajdującego się po prawej stronie operatora &lt;code class=&quot;highlighter-rouge&quot;&gt;typeof&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;Sprawdzamy, czy &lt;code class=&quot;highlighter-rouge&quot;&gt;val&lt;/code&gt; należy do tzw. &lt;code class=&quot;highlighter-rouge&quot;&gt;Reference Record&lt;/code&gt;, tj.
    &lt;ul&gt;
      &lt;li&gt;jeśli nie należy, to zwracamy &lt;code class=&quot;highlighter-rouge&quot;&gt;undefined&lt;/code&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Pobieramy wartość zmiennej, bo np. &lt;code class=&quot;highlighter-rouge&quot;&gt;val&lt;/code&gt; nie musi być zmienną, może być dowolnym wyrażeniem (np. odwołaniem do właściwości obiektu - &lt;code class=&quot;highlighter-rouge&quot;&gt;object.prop&lt;/code&gt;, w takim przypadku wyliczamy jego wartość)&lt;/li&gt;
  &lt;li&gt;Jeśli &lt;code class=&quot;highlighter-rouge&quot;&gt;val&lt;/code&gt; to &lt;code class=&quot;highlighter-rouge&quot;&gt;undefined&lt;/code&gt; zwracamy &lt;code class=&quot;highlighter-rouge&quot;&gt;&quot;undefined&quot;&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;Jeśli &lt;code class=&quot;highlighter-rouge&quot;&gt;val&lt;/code&gt; to &lt;code class=&quot;highlighter-rouge&quot;&gt;null&lt;/code&gt; zwracamy &lt;code class=&quot;highlighter-rouge&quot;&gt;&quot;object&quot;&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;Jeśli &lt;code class=&quot;highlighter-rouge&quot;&gt;val&lt;/code&gt; to &lt;code class=&quot;highlighter-rouge&quot;&gt;String&lt;/code&gt; zwracamy &lt;code class=&quot;highlighter-rouge&quot;&gt;&quot;string&quot;&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;Jeśli &lt;code class=&quot;highlighter-rouge&quot;&gt;val&lt;/code&gt; to &lt;code class=&quot;highlighter-rouge&quot;&gt;Symbol&lt;/code&gt; zwracamy &lt;code class=&quot;highlighter-rouge&quot;&gt;&quot;symbol&quot;&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;Jeśli &lt;code class=&quot;highlighter-rouge&quot;&gt;val&lt;/code&gt; to &lt;code class=&quot;highlighter-rouge&quot;&gt;Boolean&lt;/code&gt; zwracamy &lt;code class=&quot;highlighter-rouge&quot;&gt;&quot;boolean&quot;&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;Jeśli &lt;code class=&quot;highlighter-rouge&quot;&gt;val&lt;/code&gt; to &lt;code class=&quot;highlighter-rouge&quot;&gt;Number&lt;/code&gt; zwracamy &lt;code class=&quot;highlighter-rouge&quot;&gt;&quot;number&quot;&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;Jeśli &lt;code class=&quot;highlighter-rouge&quot;&gt;val&lt;/code&gt; to &lt;code class=&quot;highlighter-rouge&quot;&gt;BigInt&lt;/code&gt; zwracamy &lt;code class=&quot;highlighter-rouge&quot;&gt;&quot;bigint&quot;&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;Sprawdzamy, czy &lt;code class=&quot;highlighter-rouge&quot;&gt;val&lt;/code&gt; jest obiektem&lt;/li&gt;
  &lt;li&gt;⚠️ UWAGA: Jeśli typem &lt;code class=&quot;highlighter-rouge&quot;&gt;val&lt;/code&gt; jest &lt;code class=&quot;highlighter-rouge&quot;&gt;Object&lt;/code&gt; oraz &lt;code class=&quot;highlighter-rouge&quot;&gt;val&lt;/code&gt; jest równe &lt;code class=&quot;highlighter-rouge&quot;&gt;document.all&lt;/code&gt; to zwracamy &lt;code class=&quot;highlighter-rouge&quot;&gt;undefined&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;Jeśli &lt;code class=&quot;highlighter-rouge&quot;&gt;val&lt;/code&gt; jest możliwa do uruchomienia zwracamy &lt;code class=&quot;highlighter-rouge&quot;&gt;&quot;function&quot;&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;Zwracamy &lt;code class=&quot;highlighter-rouge&quot;&gt;&quot;object&quot;&lt;/code&gt; dla wszystkich innych wartości&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;reference-record&quot;&gt;Reference Record&lt;/h2&gt;

&lt;p&gt;Czytając specyfikację, można się dowiedzieć, że jest to wyrażenie:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;x&lt;/code&gt; - pobranie referencji&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;x[y]&lt;/code&gt; - dostęp do elementu tablicy na podstawie indeksu&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;x.a&lt;/code&gt; - dostęp do właściwości obiektu na podstawie nazwy&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;super.a&lt;/code&gt; - dostęp do właściwości przodka (używamy w klasach dziedziczących)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;documentall&quot;&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;document.all&lt;/code&gt;&lt;/h2&gt;

&lt;p&gt;Za czasów świetności Internet Explorera (IE), który był liderem wśród przeglądarek
internetowych we wczesnych latach dwutysięcznych, próbował rozwijać język samodzielnie
dodając coś nowego do JavaScript (a nawet &lt;a href=&quot;https://en.wikipedia.org/wiki/JScript&quot;&gt;JScript&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;Jednym z takim wyjątkowych elementów, jest właśnie kolekcja &lt;code class=&quot;highlighter-rouge&quot;&gt;document.all&lt;/code&gt;.
Która to NIESTETY musi być wspierana z uwagi na kompatybilność wsteczną,
natomiast ta kolekcja jest bardzo specyficzna.&lt;/p&gt;

&lt;p&gt;UWAGA:&lt;/p&gt;

&lt;div class=&quot;language-js highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;typeof&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;document&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;all&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;undefined&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// true&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;Boolean&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;document&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;all&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;false&lt;/span&gt;   &lt;span class=&quot;c1&quot;&gt;// true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Pomimo, że:&lt;/p&gt;

&lt;div class=&quot;language-js highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;document&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;all&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;toString&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'[object HTMLAllCollection]'&lt;/span&gt;  &lt;span class=&quot;c1&quot;&gt;// true&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;typeof&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;document&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;all&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;length&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'number'&lt;/span&gt;                   &lt;span class=&quot;c1&quot;&gt;// true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Dlatego też, w dzisiejszych czasach nie korzysta się z &lt;code class=&quot;highlighter-rouge&quot;&gt;document.all&lt;/code&gt;, a jeśli
istnieje potrzeba pobrania wszystkich elementów drzewa DOM, to można osiągnąć
to za pomocą &lt;code class=&quot;highlighter-rouge&quot;&gt;document.querySelectorAll('*')&lt;/code&gt;.&lt;/p&gt;

&lt;h2 id=&quot;reserved-word&quot;&gt;Reserved Word&lt;/h2&gt;

&lt;p&gt;Operator &lt;code class=&quot;highlighter-rouge&quot;&gt;typeof&lt;/code&gt; należy do kolekcji &lt;code class=&quot;highlighter-rouge&quot;&gt;Reserved Words&lt;/code&gt; oznacza to, że nie można użyć tej nazwy do własnych identyfikatorów,
tj. funkcji, zmiennych, itd.&lt;/p&gt;

&lt;div class=&quot;language-js highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;typeof&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// Uncaught SyntaxError: Unexpected token 'typeof'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;blockquote&gt;
  &lt;p&gt;Jest różnica między “słowami kluczowymi” a “słowami zastrzeżonymi”.&lt;br /&gt;
Dobrym przykładem jest wyraz &lt;code class=&quot;highlighter-rouge&quot;&gt;async&lt;/code&gt;, który należy do słów kluczowych, ale nie do zastrzeżonych,
tj. &lt;strong&gt;możemy go użyć&lt;/strong&gt; jako identyfikatora zmiennej.&lt;/p&gt;
  &lt;div class=&quot;language-js highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'yes'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;nx&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;async&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// 'yes'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;  &lt;/div&gt;
  &lt;p&gt;Więcej informacji na ten temat w specyfikacji:&lt;br /&gt;
&lt;a href=&quot;https://tc39.es/ecma262/#sec-keywords-and-reserved-words&quot;&gt;https://tc39.es/ecma262/#sec-keywords-and-reserved-words&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id=&quot;przypadki-użycia-typeof&quot;&gt;Przypadki użycia &lt;code class=&quot;highlighter-rouge&quot;&gt;typeof&lt;/code&gt;&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;Q: A do czego możemy wykorzystać ten operator?&lt;/li&gt;
  &lt;li&gt;A: Do sprawdzenia, z jakim typem wartości mamy do czynienia.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Poniżej przykłady wszystkich sprawdzeń.&lt;/p&gt;

&lt;div class=&quot;language-js highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;// undefined&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;typeof&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;undefined&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'undefined'&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;// ⚠️ UWAGA: Ukryty undefined&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;typeof&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;document&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;all&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'undefined'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class=&quot;language-js highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;// boolean&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;typeof&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;true&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'boolean'&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;typeof&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;false&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'boolean'&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;typeof&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;Boolean&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'boolean'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class=&quot;language-js highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;// number&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;typeof&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'number'&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;typeof&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'number'&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;typeof&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'number'&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;typeof&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;NaN&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'number'&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;typeof&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;Number&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'number'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class=&quot;language-js highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;// string&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;typeof&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'string'&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;typeof&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;text&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'string'&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;typeof&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'string'&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;typeof&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;Date&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'string'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class=&quot;language-js highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;// function&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;typeof&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{}&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;function&quot;&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;typeof&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{})&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;function&quot;&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;typeof&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;Function&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;function&quot;&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;typeof&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{}&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;function&quot;&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;typeof&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;Date&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;function&quot;&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;typeof&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;Object&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;function&quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class=&quot;language-js highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;// object&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;typeof&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{}&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'object'&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;typeof&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;Object&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'object'&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;// Array object&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;typeof&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'object'&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;typeof&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;Array&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'object'&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;// Promise object&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;typeof&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;Promise&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;resolve&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'object'&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;typeof&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;Promise&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;reject&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'object'&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;// RegExp object&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;typeof&lt;/span&gt; &lt;span class=&quot;sr&quot;&gt;/e/i&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'object'&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;typeof&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;RegExp&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'e'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'i'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'object'&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;// operator `new` zawsze tworzy object&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;typeof&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;Array&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'object'&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;typeof&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;Boolean&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'object'&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;typeof&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;Date&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'object'&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;typeof&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;Object&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'object'&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;typeof&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;Function&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'object'&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;typeof&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'object'&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;// kolekcja danych&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;typeof&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;Map&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'object'&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;typeof&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;WeakMap&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'object'&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;typeof&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;Set&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'object'&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;typeof&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;WeakSet&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'object'&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;// ⚠️ UWAGA: Ukryty obiekt&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;typeof&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;null&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'object'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class=&quot;language-js highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;// symbol&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;typeof&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;Symbol&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'symbol'&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;typeof&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;Symbol&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'text'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'symbol'&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;typeof&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;Symbol&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;111&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'symbol'&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;typeof&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;Symbol&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;for&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'symbol'&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;typeof&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;Symbol&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;for&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'text'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'symbol'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class=&quot;language-js highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;// bigint&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;typeof&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;BigInt&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;e100&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'bigint'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;blockquote class=&quot;block-good&quot;&gt;
  &lt;h3 id=&quot;-wskazówka&quot;&gt;&lt;i class=&quot;icon-good&quot;&gt;&lt;/i&gt; Wskazówka&lt;/h3&gt;
  &lt;p&gt;Każdy operator w JavaScript możemy uruchomić z wartością otoczoną w nawiasy
lub też bez nich. Zatem równoważny jest zapis:&lt;/p&gt;
  &lt;div class=&quot;language-js highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;typeof&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;typeof&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;  &lt;/div&gt;
  &lt;p&gt;Dobrą praktyką (a raczej standardem formatowania) jest &lt;strong&gt;nieużywanie&lt;/strong&gt; nawiasów.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id=&quot;co-z-tablicą&quot;&gt;Co z tablicą?&lt;/h2&gt;

&lt;p&gt;Tablica jest obiektem. Operator &lt;code class=&quot;highlighter-rouge&quot;&gt;typeof&lt;/code&gt;, niestety nie jest tutaj pomocny.&lt;br /&gt;
Aby sprawdzić, czy mamy do czynienia z tablicą, należy wykorzystać funkcję &lt;code class=&quot;highlighter-rouge&quot;&gt;Array.isArray()&lt;/code&gt;.&lt;/p&gt;

&lt;div class=&quot;language-js highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;Array&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;isArray&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;([])&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;true&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;Array&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;isArray&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;({})&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;false&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;typeof&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'object'&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;typeof&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{}&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'object'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;A teraz zobaczmy jak wygląda specyfikacja funkcji &lt;code class=&quot;highlighter-rouge&quot;&gt;Array.isArray()&lt;/code&gt;:&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/ecma-spec/ecma-262_14th-edition-array-isarray.png&quot; alt=&quot;&quot; /&gt;
    &lt;figcaption&gt;
        &lt;a href=&quot;https://262.ecma-international.org/14.0/#sec-array.isarray&quot;&gt;
          ECMA-262 14th edition — 23.1.2.2 Array.isArray ( arg )
        &lt;/a&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/ecma-spec/ecma-262_14th-edition-isarray.png&quot; alt=&quot;&quot; /&gt;
    &lt;figcaption&gt;
        &lt;a href=&quot;https://262.ecma-international.org/14.0/#sec-isarray&quot;&gt;
          ECMA-262 14th edition — 7.2.2 IsArray ( argument )
        &lt;/a&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;typeof-w-popularnych-bibliotekach&quot;&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;typeof&lt;/code&gt; w popularnych bibliotekach&lt;/h2&gt;

&lt;p&gt;Przykład wykorzystania operatora &lt;code class=&quot;highlighter-rouge&quot;&gt;typeof&lt;/code&gt; w bibliotekach (oraz frameworkach):&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/facebook/react/blob/0a360642dcc08cab469da0a0e4f1050e56b0ef7e/packages/react/src/ReactFetch.js#L43&quot;&gt;React&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/vuejs/vue/blob/49b6bd4264c25ea41408f066a1835f38bf6fe9f1/src/core/util/env.ts#L5&quot;&gt;Vue.js&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/angular/angular/blob/25153e94f60f7be055d472ab573f4e367f53cbe8/packages/compiler/src/util.ts#L77&quot;&gt;Angular&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/sveltejs/svelte/blob/9da320b151267b688d4ea03e020d5af6ac76531e/packages/svelte/src/runtime/motion/tweened.js#L10&quot;&gt;Svelte&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/ckeditor/ckeditor5/blob/8d970f20e689584df31851263dae74b86f1220ff/packages/ckeditor5-engine/src/model/writer.ts#L1112&quot;&gt;CKEditor 5&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;podsumowanie&quot;&gt;Podsumowanie&lt;/h2&gt;

&lt;p&gt;Operator &lt;code class=&quot;highlighter-rouge&quot;&gt;typeof&lt;/code&gt; określa typ wartości, jaką przechowuje zmienna.
Bardzo przydatne rozwiązanie w trakcie weryfikacji, z jakimi danymi mamy do czynienia.&lt;/p&gt;
</description>
            <pubDate>Thu, 13 Jul 2023 00:00:00 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2023/07/13/jak-sprawdzic-typ-zmiennej-w-javascript-operator-typeof.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2023/07/13/jak-sprawdzic-typ-zmiennej-w-javascript-operator-typeof.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/post-banner-javascript.png</image>
        </item>
        
        <item>
            <title>15 pluginów do Visual Studio Code (2023)</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Pomyślałem, że 7 czerwca 😎 to piękny dzień, aby się podzielić swoimi pluginami
do &lt;a href=&quot;https://visualstudio.microsoft.com/&quot;&gt;Visual Studio Code&lt;/a&gt;, których używam na co dzień!&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/post-banner-visual-studio-code.png&quot; itemprop=&quot;image&quot; alt=&quot;Baner promujący artykuł&quot; /&gt;
&lt;/figure&gt;

&lt;blockquote&gt;
  &lt;p&gt;Dodam, że kolejność nie ma znaczenia. Każda aplikacja jest tak samo ważna.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id=&quot;lets-go&quot;&gt;Let’s go!&lt;/h2&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=formulahendry.auto-rename-tag&quot;&gt;Auto Rename Tag&lt;/a&gt;&lt;/p&gt;

    &lt;p&gt;Jeśli dużo piszesz HTMLa, to zmiana edycja znaczników z tym pluginem będzie przyjemniejsza.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=aaron-bond.better-comments&quot;&gt;Better Comments&lt;/a&gt;&lt;/p&gt;

    &lt;p&gt;Podświetlanie komentarzy w kodzie, co pomaga mi szybciej dostrzec ważne linijki.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=streetsidesoftware.code-spell-checker&quot;&gt;Code Spell Checker&lt;/a&gt;&lt;/p&gt;

    &lt;p&gt;Literówki, ach te literówki! Ten plugin pomaga mi je wyeliminować. Domyślnie działa  analiza tylko angielskich wyrazów.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=moshfeu.compare-folders&quot;&gt;Compare Folders&lt;/a&gt;&lt;/p&gt;

    &lt;p&gt;Porównywanie występowania plików w różnych folderach oraz porównanie samych plików. Nie jest to plugin przez mnie używany regularnie, ale i tak warto go mieć!&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=EditorConfig.EditorConfig&quot;&gt;EditorConfig for VS Code&lt;/a&gt;&lt;/p&gt;

    &lt;p&gt;Formatowanie pliku w formie konfigurowalnej podczas pisania kodu.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=dbaeumer.vscode-eslint&quot;&gt;ESLint&lt;/a&gt;&lt;/p&gt;

    &lt;p&gt;Chyba nie trzeba przedstawiać. Podkreślanie błędów w kodzie.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=pomber.git-file-history&quot;&gt;Git File History&lt;/a&gt;&lt;/p&gt;

    &lt;p&gt;Analiza rewizji konkretnego pliku.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=donjayamanne.githistory&quot;&gt;Git History&lt;/a&gt;&lt;/p&gt;

    &lt;p&gt;Dość przyjemny interfejs do przeglądania historii rewizji.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=cmstead.js-codeformer&quot;&gt;JS CodeFormer&lt;/a&gt;&lt;/p&gt;

    &lt;p&gt;Refaktorowanie plików z końcówką *.js oraz *.ts. Testuję jeszcze!&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=streetsidesoftware.code-spell-checker-polish&quot;&gt;Polish - Code Spell Checker&lt;/a&gt;&lt;/p&gt;

    &lt;p&gt;Wsparcie dla języka polskiego do wykrywania literówek.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=esbenp.prettier-vscode&quot;&gt;Prettier - Code formatter&lt;/a&gt;&lt;/p&gt;

    &lt;p&gt;Formatowanie kodu po raz kolejny, tutaj natomiast jest dużo konfiguracji w stylu opinionated.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=Gruntfuggly.todo-tree&quot;&gt;Todo Tree&lt;/a&gt;&lt;/p&gt;

    &lt;p&gt;Drzewko z listą zadań w kodzie, które jest zbudowane za pomocą wyrazu “TODO”.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=shardulm94.trailing-spaces&quot;&gt;Trailing Spaces&lt;/a&gt;&lt;/p&gt;

    &lt;p&gt;Zaznaczanie spacji na końcach linijek, które totalnie nie są potrzebne.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=vscode-icons-team.vscode-icons&quot;&gt;vscode-icons&lt;/a&gt;&lt;/p&gt;

    &lt;p&gt;Nie podobają mi się domyślne ikonki VSC, nie ma co płakać, można je zmienić.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://marketplace.visualstudio.com/items?itemName=webhint.vscode-webhint&quot;&gt;webhint&lt;/a&gt;&lt;/p&gt;

    &lt;p&gt;Podpowiedzi dla programisty HTML oraz CSS.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;pytanie-do-ciebie-&quot;&gt;Pytanie do Ciebie 💡&lt;/h2&gt;

&lt;p&gt;A Ty, jakich pluginów używasz, które ulepszają Twój workflow?&lt;/p&gt;
</description>
            <pubDate>Wed, 07 Jun 2023 14:30:23 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2023/06/07/visual-studio-code-plugins-2023.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2023/06/07/visual-studio-code-plugins-2023.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/post-banner-visual-studio-code.png</image>
        </item>
        
        <item>
            <title>Technika Pomodoro. Dzień 1. Wnioski</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Od kilku dni myślałem o zastosowaniu Pomodoro. Dziś podczas pracy w biurze wreszcie się skusiłem.
Po przeczytaniu dowiesz się, jakie są moje wnioski. Doczytaj do końca, bo tam znajdziesz bonus.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/post-banner-pomodoro.png&quot; itemprop=&quot;image&quot; alt=&quot;Baner promujący artykuł&quot; /&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;co-to-jest-technika-pomodoro&quot;&gt;Co to jest technika Pomodoro?&lt;/h2&gt;

&lt;p&gt;Na ten temat powstały setki artykułów. A to NIE JEST kolejny z nich.
Natomiast dla ciągłości warto opisać kluczowe zasady w dużym skrócie.&lt;/p&gt;

&lt;p&gt;Moja rozumienie założeń wygląda tak:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Podziel czas pracy na iteracje. Jedna iteracja to:
    &lt;ul&gt;
      &lt;li&gt;25 min skupienia&lt;/li&gt;
      &lt;li&gt;5 min odpoczynku&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Wykonaj tyle iteracji, ile jesteś w stanie&lt;/li&gt;
  &lt;li&gt;Zakończ pracę “na koniec dnia”, bez względu, w jakiej fazie jesteś&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;wnioski&quot;&gt;Wnioski&lt;/h2&gt;

&lt;p&gt;Skoro już tu jesteś, to pewnie chcesz przeczytać mięsko.&lt;/p&gt;

&lt;p&gt;Zatem zapraszam do głównej części artykułu.&lt;/p&gt;

&lt;h3 id=&quot;1-przerwy&quot;&gt;1. Przerwy&lt;/h3&gt;

&lt;p&gt;Na początku miałem wrażenie, że przerwy są ZBYT często. Nie mogłem uwierzyć,
że to już, że trzeba bezwzględnie zrobić pauzę na &lt;strong&gt;5 min&lt;/strong&gt;. W końcu tak dobrze się koduje,
dlaczego mam przerywać?! No cóż, rules. Wstałem i pochodziłem po biurze przez kilka minut.&lt;/p&gt;

&lt;p&gt;Tak wyglądała pierwsza iteracja.&lt;/p&gt;

&lt;p&gt;Po kilku takich sekwencjach etap przerwy był oczekiwany. Nawet je sobie urozmaicałem,
ale o tym w innym punkcie.&lt;/p&gt;

&lt;h3 id=&quot;2-czas-skupienia&quot;&gt;2. Czas skupienia&lt;/h3&gt;

&lt;p&gt;Ustawiłem (a raczej nie zmieniałem domyślnego) czas skupienia na &lt;strong&gt;25 min&lt;/strong&gt;. Krótko!
Miałem wrażenie, że przerwy są co chwilę.&lt;/p&gt;

&lt;p&gt;Nie jestem przyzwyczajony do tego, aby co niecałe pół godziny wstawać od komputera.
Czas płynie szybko, gdy mierzymy się z problemem w kodzie.&lt;/p&gt;

&lt;h3 id=&quot;3-rozpraszacze&quot;&gt;3. Rozpraszacze&lt;/h3&gt;

&lt;p&gt;Kolejny problem. Co zrobić, gdy w trakcie skupienia wpadnie nam do głowy jakiś pomysł,
który odbiega od meritum, od tego, czym się obecnie zajmujemy. Czy mamy otwartą furtkę,
aby wtedy wyjść z fazy skupienia? Nie!&lt;/p&gt;

&lt;p&gt;Co zrobić, gdy chcemy coś sprawdzić? Zapiszmy ten rozpraszacz do notatki.
Ten sposób jest świetny, bo później - podczas przerwy - możemy zdecydować,
czy nasz pomysł jest wart weryfikacji, czy może lepiej jest się porozciągać.&lt;/p&gt;

&lt;blockquote class=&quot;block-good&quot;&gt;
  &lt;h3 id=&quot;-mój-sposób&quot;&gt;&lt;i class=&quot;icon-good&quot;&gt;&lt;/i&gt; Mój sposób:&lt;/h3&gt;
  &lt;p&gt;Notatka jest non stop otwarta i czeka aż, coś do niej wpiszę.
Następnie, podczas fazy przerwy wracam do notatki i “googluję”.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/pomodoro/notes.png&quot; itemprop=&quot;image&quot; alt=&quot;Zrzut ekranu z aplikacji Notes.app&quot; /&gt;
    &lt;figcaption&gt;
        Notatka, w której dodawałem pomysły w trakcie fazy skupienia
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h3 id=&quot;4-narzędzia&quot;&gt;4. Narzędzia&lt;/h3&gt;

&lt;p&gt;Aplikacja wspierająca korzystanie z techniki Pomodoro to podstawa.&lt;/p&gt;

&lt;p&gt;Zainwestowałem dziś w projekt FLOW i jestem z niego zadowolony!&lt;/p&gt;

&lt;p&gt;Może, gdyby blokowanie stron działało lepiej oraz było cross-browser to byłbym
“bardzo zadowolony”, ale kontrolowanie stron mam opanowane, więc nie oszukiwałem,
dlatego podczas fazy skupienia obyło się bez skrolowania Twitterka.&lt;/p&gt;

&lt;blockquote class=&quot;block-average&quot;&gt;
  &lt;h3 id=&quot;-tip-do-autorów-aplikacji-flow&quot;&gt;&lt;i class=&quot;icon-average&quot;&gt;&lt;/i&gt; Tip do autorów aplikacji FLOW&lt;/h3&gt;
  &lt;p&gt;Blokowanie stron powinno działać, bez względu jakiej przeglądarki używam.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3 id=&quot;5-skupienie&quot;&gt;5. Skupienie&lt;/h3&gt;

&lt;p&gt;Pilnowałem się, aby w trakcie sesji skupienia nie korzystać z telefonu i wiecie co?
Było to dla mnie najtrudniejsze!&lt;/p&gt;

&lt;p&gt;Natomiast mam pewien pomysł jak można rozwiązać ten problem raz, a porządnie!&lt;/p&gt;

&lt;blockquote class=&quot;block-average&quot;&gt;
  &lt;h3 id=&quot;-tip-do-autorów-aplikacji-flow-1&quot;&gt;&lt;i class=&quot;icon-average&quot;&gt;&lt;/i&gt; Tip do autorów aplikacji FLOW&lt;/h3&gt;
  &lt;p&gt;Fajnie, gdyby telefon wiedział, że jestem w fazie skupienia i mi nie przeszkadzał,
wyłączając powiadomienia z aplikacji.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Podczas którejś fazy odpoczynku, zobaczyłem, że aplikacja FLOW występuje również na telefon!&lt;/p&gt;

&lt;blockquote class=&quot;block-average&quot;&gt;
  &lt;h3 id=&quot;-tip-do-autorów-aplikacji-flow-2&quot;&gt;&lt;i class=&quot;icon-average&quot;&gt;&lt;/i&gt; Tip do autorów aplikacji FLOW&lt;/h3&gt;
  &lt;p&gt;Świetnie by było, gdyby faza oraz aktualny czas fazy się synchronizował między telefonem
a komputerem.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3 id=&quot;6-przerwy&quot;&gt;6. Przerwy&lt;/h3&gt;

&lt;p&gt;Kiedy w trakcie przerwy rozmawialiśmy z kolegami z biura o czymś, co dotyczyło projektu,
to siedliśmy do kodu dopiero po przerwie! Było świetne uczucie, bo czułem,
że czas jest dobrze zarządzany. Jak to w życiu, ważne jest, aby mieć czas na pracę,
ale także czas na odpoczynek.&lt;/p&gt;

&lt;h3 id=&quot;7-odruchy&quot;&gt;7. Odruchy&lt;/h3&gt;

&lt;p&gt;Podczas fazy skupienia miałem pewien problem. Otóż czułem silną potrzebę
rozpoczynania rozmowy z kolegą w trakcie, kiedy coś mi się uruchamia
dłuższą chwilę.&lt;/p&gt;

&lt;p&gt;To chyba takie typowe, że gdy np. testy uruchamiają się 2 minuty, to czujemy,
że ten czas jest naszą przerwą i nic nie musimy robić poza oczekiwaniem.&lt;/p&gt;

&lt;p&gt;Chciałem wyzbyć się tego przyzwyczajenia i wiece co? Chyba mi się udało.
Bo gdy czekałem na zakończenie dłuższej operacji to wykonywałem Code Review,
innemu koledze z innego projektu. Moim zdaniem to dobre rozwiązanie i niesie
ze sobą same plusy.&lt;/p&gt;

&lt;h3 id=&quot;8-przerwy-a-aktywność-fizyczna&quot;&gt;8. Przerwy, a aktywność fizyczna&lt;/h3&gt;

&lt;p&gt;Podczas jednej z kolejnych przerw wpadłem na pomysł, aby poza zwykłym rozciąganiem
zrobić coś więcej. Do głowy od razu przyszedł mi pomysł pompek, tj. uginania ramion w podporze.&lt;/p&gt;

&lt;p&gt;Zmęczenie fizyczne to dobry pomysł na “odpoczynek” od zmęczenia psychicznego,
jakiego to doświadcza się w pracy inżyniera oprogramowania.&lt;/p&gt;

&lt;blockquote class=&quot;block-good&quot;&gt;
  &lt;h3 id=&quot;-mój-sposób-1&quot;&gt;&lt;i class=&quot;icon-good&quot;&gt;&lt;/i&gt; Mój sposób:&lt;/h3&gt;
  &lt;p&gt;Po kilku iteracjach wyłączyłem telefon, aby pozbyć się odruchu sprawdzenia powiadomień.
Włączyłem go dopiero po zakończeniu pracy. Może to zbyt radykalne, ale regularne
spoglądanie na telefon niszczy skupienie.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id=&quot;narzędzia-vs-budżet&quot;&gt;Narzędzia vs Budżet&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;Flow.app - 99PLN, jednorazowa płatność&lt;/li&gt;
  &lt;li&gt;Notes.app — wbudowana w macOS&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;zakończenie&quot;&gt;Zakończenie&lt;/h2&gt;

&lt;p&gt;Podczas pierwszego dnia wykonałem 10 iteracji Pomodoro.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/pomodoro/flow.png&quot; itemprop=&quot;image&quot; alt=&quot;Wykres z liczbą iteracji Pomodoro&quot; /&gt;
    &lt;figcaption&gt;
        Statystyki z programu FLOW
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Czy to dużo czy mało? Nie wiem, ale chodzą głosy, że to dobry wynik.&lt;/p&gt;

&lt;figure class=&quot;social-center-block&quot;&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;pl&quot; dir=&quot;ltr&quot;&gt;Realnie robię 3-5 pomodoro dziennie.&lt;br /&gt;Kiedyś udawało mi się dochodzić do 6-8, ale byłem bardzo zmęczony po. Ktoś twierdził, że dochodzi do 10-12...&lt;br /&gt;Samo utrzymanie focusu w Pomodoro raczej lekko mi przychodzi. &lt;br /&gt;Grunt to backlog i zapisywani dystrakcji.&lt;/p&gt;&amp;mdash; zkMarek ⛛ (@zkMarek) &lt;a href=&quot;https://twitter.com/zkMarek/status/1658766134143860738?ref_src=twsrc%5Etfw&quot;&gt;May 17, 2023&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async=&quot;&quot; src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;

&lt;/figure&gt;
</description>
            <pubDate>Wed, 17 May 2023 19:00:00 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2023/05/17/wnioski-technika-pomodoro.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2023/05/17/wnioski-technika-pomodoro.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/post-banner-pomodoro.png</image>
        </item>
        
        <item>
            <title>Feature Flags: Poznaj różnicę między deployem a releasem</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Boisz się deployować po długim czasie? Pewnie dlatego, że dawno tego nie robiłeś
i przez to, obawiasz się, że gdy zrobisz to teraz, to pewnie coś wybuchnie.&lt;/p&gt;

&lt;p&gt;Zmień to! Wdróż mechanizm &lt;strong&gt;Feature Flag&lt;/strong&gt;.&lt;/p&gt;

&lt;h2 id=&quot;co-to-jest-mechanizm-feature-flag&quot;&gt;Co to jest mechanizm Feature Flag?&lt;/h2&gt;

&lt;p&gt;Feature Flagi to konfiguracja, która jest odpowiedzialna za STEROWANIE dostępnymi
możliwościami aplikacji oddanej w ręce użytkownika.&lt;/p&gt;

&lt;p&gt;Feature Flagi nie powinny być dostępne publicznie do zmiany, z tego powodu,
że blokują one dostęp do feature-a, który jeszcze nie jest ukończony.&lt;/p&gt;

&lt;p&gt;Jeśli funkcjonalność jest gotowa, to wtedy możemy ją opublikować, ALE nie musimy.
W takim przypadku możemy udostępnić użytkownikowi taką Feature Flagę,
aby to on sam sobie ją włączył, jeśli chce wejść w tryb posiadania wersji
z oprogramowaniem BETA.&lt;/p&gt;

&lt;h2 id=&quot;z-czego-składa-się-mechanizm-feature-flag&quot;&gt;Z czego składa się mechanizm Feature Flag?&lt;/h2&gt;

&lt;p&gt;Feature Flagi to bardzo prosty mechanizm, bazujący na dwóch elementach:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;mapy gdzie kluczem jest &lt;code class=&quot;highlighter-rouge&quot;&gt;string&lt;/code&gt;, a wartością &lt;code class=&quot;highlighter-rouge&quot;&gt;boolean&lt;/code&gt;:
    &lt;div class=&quot;language-js highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;featureFlags&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;secretLink&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;specialFeature&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;modernToast&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
  &lt;li&gt;oraz funkcji sprawdzającej, czy flaga jest włączona:
    &lt;div class=&quot;language-js highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;isFeatureEnabled&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;featureFlags&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;];&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;jak-wykorzystać-mechanizm-feature-flag&quot;&gt;Jak wykorzystać mechanizm Feature Flag?&lt;/h2&gt;

&lt;p&gt;Wystarczy, że w miejscu w którym dodajemy nową funkcjonalność, której
nie chcemy włączać produkcyjnie, dodamy sprawdzenie:&lt;/p&gt;

&lt;div class=&quot;language-js highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;isFeatureEnabled&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'secretLink'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;nx&quot;&gt;displaySecretLink&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;deploy-vs-release&quot;&gt;“deploy” vs “release”&lt;/h2&gt;

&lt;p&gt;“Deploy” to wrzucenie nowego kodu na produkcję. Nie znaczy, że ten kod
będzie uruchomiony dla klientów.&lt;/p&gt;

&lt;p&gt;“Release” odkrywa funkcjonalność dla użytkownika. Kiedy używamy mechanizmu FF,
to de facto release będzie polegał na podmianie feature flagi z &lt;code class=&quot;highlighter-rouge&quot;&gt;false&lt;/code&gt; na &lt;code class=&quot;highlighter-rouge&quot;&gt;true&lt;/code&gt;.&lt;/p&gt;

&lt;h2 id=&quot;dobre-praktyki-związane-z-feature-flagami&quot;&gt;Dobre praktyki związane z Feature Flagami&lt;/h2&gt;

&lt;p&gt;Dobrą praktyką jest włączenie nowej funkcjonalności tylko dla określonych użytkowników,
po to aby zebrać feedback na jej temat.&lt;/p&gt;

&lt;p&gt;Możemy to wykonać bardzo prosto. Otóż dla klientów których sobie wybierzemy,
możemy zaktualizować mapę z feature flagami.&lt;/p&gt;

&lt;p&gt;Po okresie, w którym otrzymamy feedback od użytkowników nt. ODKRYTEJ funkcjonalności
mamy czas, aby ją dopieścić. Następnie możemy wtedy opublikować ją globalnie,
czyli dokonać tzw. GENERAL AVAILABILITY.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;Gdyby kogoś interesował cykl życia aplikacji, to wiki fajnie to opisuje:
&lt;a href=&quot;https://en.wikipedia.org/wiki/Software_release_life_cycle&quot;&gt;https://en.wikipedia.org/wiki/Software_release_life_cycle&lt;/a&gt;&lt;/p&gt;

&lt;h2 id=&quot;demo-&quot;&gt;Demo 🎉&lt;/h2&gt;

&lt;p&gt;Stworzyłem bardzo minimalistyczną aplikację, w której jest zaprezentowana istota
feature flag: &lt;a href=&quot;https://piecioshka.github.io/demo-feature-flags/&quot;&gt;https://piecioshka.github.io/demo-feature-flags/&lt;/a&gt;&lt;/p&gt;
</description>
            <pubDate>Sun, 22 Jan 2023 16:10:43 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2023/01/22/feature-flags.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2023/01/22/feature-flags.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/post-banner-feature-flags.png</image>
        </item>
        
        <item>
            <title>Test First</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Dziś miałem przyjemność zapoznać się z artykułem na blogu &lt;em&gt;The Clean Code Blog&lt;/em&gt;, pt. &lt;a href=&quot;https://blog.cleancoder.com/uncle-bob/2013/09/23/Test-first.html&quot;&gt;Test First&lt;/a&gt;, autorstwa &lt;a href=&quot;https://twitter.com/unclebobmartin&quot;&gt;Uncle Boba&lt;/a&gt;. Wpis ten objaśnia, czym jest &lt;em&gt;Test First&lt;/em&gt;… i robi to na tyle dobrze, że i ja zrozumiałem.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/post-banner-test-first.png&quot; itemprop=&quot;image&quot; alt=&quot;Baner promujący artykuł&quot; /&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;test-driven-development-tdd&quot;&gt;Test-Driven Development (TDD)&lt;/h2&gt;

&lt;p&gt;Jak dobrze wiecie, TDD to styl wytwarzania oprogramowania, który skupia się na trzech regułach:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;zanim napiszesz kod produkcyjny, napisz test sprawdzający jego działanie,&lt;/li&gt;
  &lt;li&gt;napisz jak najprostszy kod produkcyjny, który powoduje, że test przechodzi,&lt;/li&gt;
  &lt;li&gt;dokonaj refaktoryzacji kodu produkcyjnego oraz testu.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;red-green-refactor&quot;&gt;Red, Green, Refactor&lt;/h2&gt;

&lt;p&gt;Te reguły tworzą &lt;strong&gt;3 fazy cyklu życia&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Red&lt;/strong&gt; — piszesz test, który failuje&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Green&lt;/strong&gt; — piszesz kod produkcyjny, który rozwiązuje test&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Refactor&lt;/strong&gt; (&lt;strong&gt;Blue&lt;/strong&gt;) — ulepszasz obie warstwy&lt;/li&gt;
&lt;/ul&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/tdd/tdd-lifecycle.png&quot; itemprop=&quot;image&quot; alt=&quot;TDD Lifecycle&quot; /&gt;
    &lt;figcaption&gt;
        Diagram pochodzi z moich materiałów szkolenia o TDD.
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;asymetria&quot;&gt;Asymetria&lt;/h2&gt;

&lt;p&gt;Jasne jest więc, że jakość kodu produkcyjnego zależy od testów, ale czy jakość testów zależy od kodu produkcyjnego? Nie.&lt;/p&gt;

&lt;p&gt;Dlatego też mityczne &lt;em&gt;Test First&lt;/em&gt; polega na tym, aby:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;dbać o kod produkcyjny &lt;strong&gt;ZACZYNAJĄC&lt;/strong&gt; od dbania o testy,&lt;/li&gt;
  &lt;li&gt;utrzymywać kod produkcyjny &lt;strong&gt;ZACZYNAJĄC&lt;/strong&gt; lepszego zarządzania testami,&lt;/li&gt;
  &lt;li&gt;myśleć o kodzie produkcyjnym &lt;strong&gt;ZACZYNAJĄC&lt;/strong&gt; od testów.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Oczywiście, w stylu TDD powinniśmy:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;ZACZYNAĆ&lt;/strong&gt; od napisania testów,&lt;/li&gt;
  &lt;li&gt;oraz ustawić testom &lt;strong&gt;NAJWYŻSZY&lt;/strong&gt; priorytet w wytwarzaniu oprogramowania.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;podsumowanie&quot;&gt;Podsumowanie&lt;/h2&gt;

&lt;p&gt;O to właśnie chodzi w &lt;em&gt;Test First&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Nie możemy&lt;/strong&gt; napisać testów i o nich &lt;strong&gt;zapomnieć&lt;/strong&gt;. Kod w testach należy
traktować tak samo poważnie (a nawet bardziej poważnie) jak kod produkcyjny.
Dlaczego? Uncle Bob podaje świetny przykład.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Jeśli stracimy kod produkcyjny, ale mamy testy, to możemy odtworzyć z niego
kod produkcyjny, ale kiedy nie mamy testów, ale mamy kod produkcyjny,
to ciężko jest do takiego kodu napisać testy, z uwagi na to, że istnieje
w nim duża liczba zależności. &lt;br /&gt;&lt;br /&gt;Kod, który nie posada testów określa się
mianem &lt;strong&gt;legacy&lt;/strong&gt;. A taki kod rozwija się wolno i z brakiem przekonania,
że zmiana nie wygeneruje regresji.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Podoba mi się to wyjaśnienie. Powtórzę jeszcze raz:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;em&gt;Legacy Code&lt;/em&gt;, to kod, który nie posiada testów.&lt;/p&gt;
&lt;/blockquote&gt;
</description>
            <pubDate>Tue, 05 Apr 2022 07:51:48 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2022/04/05/test-first.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2022/04/05/test-first.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/post-banner-test-first.png</image>
        </item>
        
        <item>
            <title>Git. Jak dodać własne polecenie w shellu?</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Jak dodać własne polecenie dla Gita? Z tego artykułu dowiesz się,
jak możesz rozszerzać możliwości swojego środowiska operującego na repozytoriach Git.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/post-banner-git.jpg&quot; itemprop=&quot;image&quot; alt=&quot;Baner promujący artykuł&quot; /&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;kroki&quot;&gt;Kroki&lt;/h2&gt;

&lt;p&gt;Wykonując podane niżej kroki, dodacie nowe polecenie, którego będziecie mogli używać w każdym repozytorium, i nie tylko! Polecanie Gita możemy używać przecież w katalogach, które nie przechowują repozytorium.&lt;/p&gt;

&lt;h3 id=&quot;1-stworzyć-katalog-dla-swoich-skryptów&quot;&gt;1. Stworzyć katalog dla swoich skryptów&lt;/h3&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;mkdir&lt;/span&gt; ~/projects/git-scripts
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Nazwa &lt;code class=&quot;highlighter-rouge&quot;&gt;git-scripts&lt;/code&gt; jest popularną nazwą, zawierają pliki wykonywalne, które to związane są ze światem repozytorium Git.&lt;/p&gt;

&lt;h3 id=&quot;2-dodać-nową-ścieżkę-do-zmiennej-środowiskowej-path&quot;&gt;2. Dodać nową ścieżkę do zmiennej środowiskowej &lt;code class=&quot;highlighter-rouge&quot;&gt;$PATH&lt;/code&gt;&lt;/h3&gt;

&lt;p&gt;Każdy shell bazuje na zmiennych środowiskowych. To one zawierają kluczowe informacje dla działania shella.&lt;/p&gt;

&lt;p&gt;Wystarczy, że uruchomicie w terminalu polecenie &lt;code class=&quot;highlighter-rouge&quot;&gt;env&lt;/code&gt;, a zobaczycie obecną listę zmiennych środowiskowych używanych w obecnym procesie uruchomionego shella.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Zmienne środowiskowe dostępne są w skryptach uruchomionych w shellu.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Jak rozszerzyć zmienną PATH?&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;Dla Basha&lt;/p&gt;

    &lt;p&gt;Otwórzcie plik &lt;code class=&quot;highlighter-rouge&quot;&gt;~/.bash_profile&lt;/code&gt; dopisując:&lt;/p&gt;

    &lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;  &lt;span class=&quot;nb&quot;&gt;export &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;PATH&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$HOME&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;/projects/git-scripts/:&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$PATH&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Dla Fisha&lt;/p&gt;

    &lt;p&gt;Otwórzcie plik &lt;code class=&quot;highlighter-rouge&quot;&gt;~/.config/fish/config.sh&lt;/code&gt; dopisując:&lt;/p&gt;

    &lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;  &lt;span class=&quot;nb&quot;&gt;set&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-gx&lt;/span&gt; PATH &lt;span class=&quot;nv&quot;&gt;$HOME&lt;/span&gt;/projects/git-scripts/ &lt;span class=&quot;nv&quot;&gt;$PATH&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Aby zmiana została “zaaplikowana” należy uruchomić nowego shella. Najszybciej to można wykonać, uruchamiając nową zakładkę w terminalu.&lt;/p&gt;

&lt;h3 id=&quot;3-stworzyć-plik-git-user-w-katalogu-git-scripts&quot;&gt;3. Stworzyć plik &lt;code class=&quot;highlighter-rouge&quot;&gt;git-user&lt;/code&gt; w katalogu &lt;code class=&quot;highlighter-rouge&quot;&gt;git-scripts&lt;/code&gt;&lt;/h3&gt;

&lt;p&gt;Plik możemy utworzyć za pomocą polecenia:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;~/projects/git-scripts &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;touch &lt;/span&gt;git-user
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;blockquote class=&quot;block-average&quot;&gt;
  &lt;p&gt;Nie podajemy rozszerzenia. Nazwa pliku będzie poleceniem.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3 id=&quot;4-dodać-uprawnienia-do-uruchamiania&quot;&gt;4. Dodać uprawnienia do uruchamiania&lt;/h3&gt;

&lt;p&gt;To najważniejszy punkt, ponieważ &lt;strong&gt;bardzo często o nim się zapomina&lt;/strong&gt;. Dzięki temu, że plik będzie miał uprawnienia do uruchomienia, będzie mógł być uruchamiany w terminalu jak każde inne polecenie.&lt;/p&gt;

&lt;p&gt;Jak nadać uprawnienia do uruchomienia?&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;~/projects/git-scripts &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;chmod&lt;/span&gt; +x git-user
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Aby sprawdzić, czy uprawnienia zostały zaktualizowane, wystarczy wylistować zawartość katalogu:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;~/projects/git-scripts &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;ls&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-l&lt;/span&gt;

&lt;span class=&quot;nt&quot;&gt;-rwxr-xr-x&lt;/span&gt;   1 piecioshka  staff   102B Jan 22  2021 git-user
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Trzy &lt;code class=&quot;highlighter-rouge&quot;&gt;x&lt;/code&gt; oznaczają, że każdy będzie miał możliwość uruchomić ten plik.&lt;/p&gt;

&lt;blockquote class=&quot;block-good&quot;&gt;
  &lt;p&gt;Więcej na temat uprawnień do pliku &lt;a href=&quot;https://pl.wikipedia.org/wiki/Chmod&quot;&gt;https://pl.wikipedia.org/wiki/Chmod&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3 id=&quot;5-uzupełnić-zawartość-pliku&quot;&gt;5. Uzupełnić zawartość pliku&lt;/h3&gt;

&lt;p&gt;Kopiujemy poniższy listing i wklejamy do pliku &lt;code class=&quot;highlighter-rouge&quot;&gt;~/projects/git-scripts/git-user&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;#!/usr/bin/env bash&lt;/span&gt;

&lt;span class=&quot;nv&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;git config user.name&lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;email&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;git config user.email&lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;

&lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$name&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$email&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;gt;&quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;6-uruchomić-polecenie-git-user&quot;&gt;6. Uruchomić polecenie &lt;code class=&quot;highlighter-rouge&quot;&gt;git user&lt;/code&gt;&lt;/h3&gt;

&lt;p&gt;A teraz najprzyjemniejsza i zarazem ostatnia część — uruchomienie!&lt;/p&gt;

&lt;p&gt;Plik możemy uruchomić na kilka sposobów!&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;…ze ścieżką do pliku:&lt;/p&gt;

    &lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt; ~/projects/git-scripts &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; ./git-user
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;…po nazwie pliku, będąc w dowolnym miejscu:&lt;/p&gt;

    &lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt; ~/tmp &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; git-user
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;…jako polecenie Git:&lt;/p&gt;

    &lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt; ~/ &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; git user
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Pojawia się pytania, jak to się stało, że nasze uruchomione polecenie posiada spację i działa? Przecież nazwa pliku takiej spacji nie posiadała!&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Git potraktuje polecenie jako “swoje”, tj. będzie można je uruchamiać ze spacją, czyli będzie “pod poleceniem” (eng. subcommand) — wystarczy, że nazwa pliku będzie rozpoczynała się od prefixu &lt;code class=&quot;highlighter-rouge&quot;&gt;git-&lt;/code&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Każde z powyższych poleceń powinno wyświetlić w terminalu:&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;Piotr Kowalski &amp;lt;piecioshka@example.com&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;(btw. nie jest to mój prawdziwy mail)&lt;/p&gt;

&lt;h2 id=&quot;moje-git-scripts&quot;&gt;Moje &lt;code class=&quot;highlighter-rouge&quot;&gt;git-scripts&lt;/code&gt;&lt;/h2&gt;

&lt;p&gt;Na zakończenie zachęcam Was do sprawdzenia mojego repozytorium ze skryptami pomagającymi mi w pracy z repozytoriami Git:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/piecioshka/git-scripts&quot;&gt;https://github.com/piecioshka/git-scripts&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Najfajniejsze moim zdaniem jest polecenie &lt;code class=&quot;highlighter-rouge&quot;&gt;git-bars&lt;/code&gt;, które to wyświetla statystyki dla danego użytkownika w konkretnym repozytorium jako &lt;em&gt;bar chart&lt;/em&gt;!&lt;/p&gt;

&lt;p&gt;A tak się prezentują statystyki dla mojego użytkownika w repozytorium tego bloga:&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;~/projects/blog &amp;gt; git bars &quot;Piotr Kowalski&quot; 2021

30 commits
2021-04     8 ■■■■■■■■
2021-05     5 ■■■■■
2021-07     5 ■■■■■
2021-08     6 ■■■■■■
2021-10     3 ■■■
2021-11     2 ■■
2021-12     1 ■
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Zachęcam Was do tworzenia własnych projektów typu &lt;code class=&quot;highlighter-rouge&quot;&gt;git-scripts&lt;/code&gt; i wrzucania do komentarzy pod tym artykułem!&lt;/p&gt;
</description>
            <pubDate>Fri, 28 Jan 2022 14:47:45 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2022/01/28/nowe-polecenie-dla-gita.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2022/01/28/nowe-polecenie-dla-gita.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/post-banner-git.jpg</image>
        </item>
        
        <item>
            <title>Czy wiesz, jak działają zdarzenia w React?</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Podczas realizacji pewnego ficzera w aplikacji, gdzie UI zbudowany był z komponentów Reactowych, natknąłem się na problem z eventami. Jeśli też miałeś / miałaś kłopot ze zdarzeniami w Reactowej aplikacji, to zapraszam do lektury.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/post-banner-react-synthetic-event.png&quot; itemprop=&quot;image&quot; alt=&quot;Baner promujący artykuł&quot; /&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;story-time&quot;&gt;Story time&lt;/h2&gt;

&lt;p&gt;Zadanie polegało na dodanie debounce &lt;sup id=&quot;fnref:1&quot;&gt;&lt;a href=&quot;#fn:1&quot; class=&quot;footnote&quot;&gt;1&lt;/a&gt;&lt;/sup&gt; do inputa, który był użyty
w komponencie wyszukiwarki. A wszystko po to, aby naciśnięcie i trzymanie
wciśniętego przycisku &lt;kbd&gt;ENTER&lt;/kbd&gt; na klawiaturze nie powodowało
ciągłego wysłania zapytań HTTP do serwera.&lt;/p&gt;

&lt;div class=&quot;language-jsx highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;  &lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;keyDownHandler&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;evt&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;evt&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;key&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// Display pressed key name&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;// ...&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;};&lt;/span&gt;

  &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;// ...&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;input&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;onKeyDown=&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;keyDownHandler&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;// ...&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Wpadłem więc na pomysł, aby &lt;em&gt;handler&lt;/em&gt; — który uruchamia się, kiedy zdarzenie
&lt;code class=&quot;highlighter-rouge&quot;&gt;keydown&lt;/code&gt; zostanie wyzwolone — owrapować za pomocą &lt;code class=&quot;highlighter-rouge&quot;&gt;debounce&lt;/code&gt;.&lt;/p&gt;

&lt;div class=&quot;language-jsx highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;  &lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;keyDownHandler&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;debounce&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;evt&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;evt&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;key&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// Ups...&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;// ...&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;},&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

  &lt;span class=&quot;c1&quot;&gt;// ...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Wówczas pozyskanie informacji z obiektu &lt;code class=&quot;highlighter-rouge&quot;&gt;evt&lt;/code&gt; stało się niemożliwe. Dlaczego?&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Projekt na StackBlitz gotowy do edycji:&lt;br /&gt;
&lt;a href=&quot;https://stackblitz.com/edit/problem-with-react-events&quot;&gt;https://stackblitz.com/edit/problem-with-react-events&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id=&quot;kilka-słów-o-syntheticevent&quot;&gt;Kilka słów o &lt;code class=&quot;highlighter-rouge&quot;&gt;SyntheticEvent&lt;/code&gt;&lt;/h2&gt;

&lt;p&gt;W pliku &lt;code class=&quot;highlighter-rouge&quot;&gt;package.json&lt;/code&gt; projektu, o którym mowa jest zależność:&lt;/p&gt;

&lt;div class=&quot;language-json highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;w&quot;&gt;    &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;react-dom: ^16.0.0&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;A to oznacza, że trzeba powiedzieć kilka słów o starej (w chwili publikacji
aktualna wersja to &lt;code class=&quot;highlighter-rouge&quot;&gt;v17.0.2&lt;/code&gt;) naturze wrappera &lt;code class=&quot;highlighter-rouge&quot;&gt;SyntheticEvent&lt;/code&gt;.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Oficjalna dokumentacja znajduje się na stronie reactjs.org &lt;sup id=&quot;fnref:2&quot;&gt;&lt;a href=&quot;#fn:2&quot; class=&quot;footnote&quot;&gt;2&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Obiekt &lt;code class=&quot;highlighter-rouge&quot;&gt;SyntheticEvent&lt;/code&gt; wrapuje wszystkie natywne eventy, rozwiązując tym
samym problem cross platformowości.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Problem cross platformowości polega na tym, że pod różnymi przeglądarkami
API może wyglądać inaczej, przez co trzeba pisać wyjątki sprawdzające
czy dana funkcja jest dostępna, czy też nie.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote class=&quot;block-average&quot;&gt;
  &lt;h3 id=&quot;-uwaga&quot;&gt;&lt;i class=&quot;icon-average&quot;&gt;&lt;/i&gt; Uwaga&lt;/h3&gt;
  &lt;p&gt;Nie wolno używać API na podstawie nazwy przeglądarki.&lt;br /&gt;
Taka technika nie jest mile widziana. Należy sprawdzić, czy API
jest dostępne w obecnym środowisku, a następnie, gdy jest, użyć go.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Tym samym rejestrowanie zdarzeń (w trybie bubbling) w komponentach
Reactowych jest niezwykle proste. Wystarczy skorzystać ze starej nazwy
atrybutu HTML, ale w zapisie &lt;em&gt;camelCase&lt;/em&gt;. Przykład:&lt;/p&gt;

&lt;div class=&quot;language-jsx highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Example&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;input&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;onFocus=&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;nx&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'Focused on input'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
      &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;si&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;blockquote class=&quot;block-good&quot;&gt;
  &lt;h3 id=&quot;-ciekawostka&quot;&gt;&lt;i class=&quot;icon-good&quot;&gt;&lt;/i&gt; Ciekawostka&lt;/h3&gt;
  &lt;p&gt;Jeśli chcemy zarejestrować event w trybie capture, wystarczy zmienić
nazwę handlera &lt;code class=&quot;highlighter-rouge&quot;&gt;onFocus&lt;/code&gt; na &lt;code class=&quot;highlighter-rouge&quot;&gt;onFocusCapture&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Idąc dalej, w &lt;code class=&quot;highlighter-rouge&quot;&gt;v16&lt;/code&gt; istniała strategia stworzenia puli eventów &lt;sup id=&quot;fnref:3&quot;&gt;&lt;a href=&quot;#fn:3&quot; class=&quot;footnote&quot;&gt;3&lt;/a&gt;&lt;/sup&gt;.
Została ona wyeliminowana w wersji &lt;code class=&quot;highlighter-rouge&quot;&gt;v17&lt;/code&gt;… i bardzo dobrze!&lt;/p&gt;

&lt;p&gt;Utworzenie takiej puli wprowadziło mnie w kłopoty.&lt;/p&gt;

&lt;p&gt;Otóż kiedy dodałem &lt;code class=&quot;highlighter-rouge&quot;&gt;debounce&lt;/code&gt; i przekazałem obecny handler jako callback,
to utraciłem dostęp do obiektu zdarzenia &lt;code class=&quot;highlighter-rouge&quot;&gt;evt&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;W dokumentacji jest nawet przykład ze zwykłym &lt;code class=&quot;highlighter-rouge&quot;&gt;setTimeout&lt;/code&gt;, na którym jest
zaprezentowany niedziałający kod:&lt;/p&gt;

&lt;div class=&quot;language-js highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;// @see https://reactjs.org/docs/legacy-event-pooling.html&lt;/span&gt;
&lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;handleChange&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;c1&quot;&gt;// This won't work because the event object gets reused.&lt;/span&gt;
  &lt;span class=&quot;nx&quot;&gt;setTimeout&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;target&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// Too late!&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;},&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;100&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Jedyny rozwiązaniem, aby w callbacku &lt;code class=&quot;highlighter-rouge&quot;&gt;setTimeout&lt;/code&gt; (lub też &lt;code class=&quot;highlighter-rouge&quot;&gt;debounce&lt;/code&gt;)
obiekt zdarzenia był dostępny, jest wykorzystanie metody &lt;code class=&quot;highlighter-rouge&quot;&gt;persist()&lt;/code&gt;,
która tworzy funkcję &lt;code class=&quot;highlighter-rouge&quot;&gt;isPersistent&lt;/code&gt; zwracającą &lt;code class=&quot;highlighter-rouge&quot;&gt;true&lt;/code&gt;.&lt;/p&gt;

&lt;div class=&quot;language-js highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;  &lt;span class=&quot;cm&quot;&gt;/**
   * We release all dispatched `SyntheticEvent`s after each event loop, adding
   * them back into the pool. This allows a way to hold onto a reference that
   * won't be added back into the pool.
   */&lt;/span&gt;
  &lt;span class=&quot;nx&quot;&gt;persist&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;// Modern event system doesn't use pooling.&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;enableModernEventSystem&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;isPersistent&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;functionThatReturnsTrue&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Poprzedni system zarządzania eventami oparty na poolingu polegał na tym,
że gdy &lt;code class=&quot;highlighter-rouge&quot;&gt;isPersistent&lt;/code&gt; zwracała &lt;code class=&quot;highlighter-rouge&quot;&gt;true&lt;/code&gt; to dany event nie był usuwany.&lt;/p&gt;

&lt;h2 id=&quot;co-to-jest-event-pooling-eng-grupowanie&quot;&gt;Co to jest Event Pooling (eng. grupowanie)?&lt;/h2&gt;

&lt;p&gt;Podczas tworzenia dużej listy obiektów istnieje problem, że do trzymania
w pamięci danych o tych obiektach zostanie wykorzystana duża pamięć.&lt;/p&gt;

&lt;p&gt;Dlatego też w silnikach istnieje system Usuwania Nieużytków (Garbage
Collection), który to proces usuwa obiekty, do których nie ma już
referencji. Świetny mechanizm, który powoduje, że możemy używać aplikacji
dłuższy czas.&lt;/p&gt;

&lt;p&gt;Problemem jest stworzenie “za dużej” liczby obiektów. Ponieważ może być tak,
że tworząc nowe obiekty, nie potrzebujemy już starych, więc po co trzymać
je w pamięci i czekać aż proces Garbage Collection zostanie uruchomiony?&lt;/p&gt;

&lt;p&gt;Proces usuwania “śmieci” może być kosztowny i trwać na tyle długo,
że zostanie to zauważaone w UI. Dobrym przykładem są gry o dużej responsywności, tam zatrzymanie wątku na kilkanąście minilekund może
powodować, że gra nie jest solidna.&lt;/p&gt;

&lt;blockquote class=&quot;block-good&quot;&gt;
  &lt;h3 id=&quot;-ciekawostka-1&quot;&gt;&lt;i class=&quot;icon-good&quot;&gt;&lt;/i&gt; Ciekawostka&lt;/h3&gt;
  &lt;p&gt;Z poziomu API silnika nie mamy możliwości uruchomienia usuwania śmieci.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Świetnym rozwiązaniem na tego typu problem jest stworzenie stałej liczby
obiektów, która to posiada konkretną liczbę utworzonych obiektów.
Tym samym, proces Garbage Collection nie musi usuwać nieużytków,
ponieważ my ich nie tworzymy, a tylko aktualizujemy już istniejące.&lt;/p&gt;

&lt;h2 id=&quot;dlaczego-usunięto-event-pooling&quot;&gt;Dlaczego usunięto Event Pooling?&lt;/h2&gt;

&lt;p&gt;Pooling miał pomagać na problemy z pamięcią, ale dla nowoczesnych
przeglądarek (eng. &lt;em&gt;modern browsers&lt;/em&gt;) nie pomagał, a wprowadzał
tylko problemy (np. opisywany w tym artykule), więc zdecydowano się
go usunąć.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Pull Request usuwający Event Pooling:&lt;br /&gt;
&lt;a href=&quot;https://github.com/facebook/react/pull/18969&quot;&gt;https://github.com/facebook/react/pull/18969&lt;/a&gt;, zmerdżowany do mastera
21 maja 2020.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote class=&quot;block-good&quot;&gt;
  &lt;h3 id=&quot;-ciekawostka-2&quot;&gt;&lt;i class=&quot;icon-good&quot;&gt;&lt;/i&gt; Ciekawostka&lt;/h3&gt;
  &lt;p&gt;Pomysłodawcą usunięcie Event Pooling był Dan Abramov.
Pull Request &lt;a href=&quot;https://github.com/facebook/react/pull/18216&quot;&gt;https://github.com/facebook/react/pull/18216&lt;/a&gt;,
nie został zmerdżowany, ponieważ pojawił się nowy PR, który realizował
więcej np. usunięcie odpowiednich Feature Flag.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Argumenty jakie przytoczył Dan Abramov w swojej propozycji pozbycia się EP:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;EP pomagał w tworzeniu eventów, ale nie był pomocny w:
    &lt;ul&gt;
      &lt;li&gt;usuwaniu eventów&lt;/li&gt;
      &lt;li&gt;niszczeniu eventów&lt;/li&gt;
      &lt;li&gt;reużyciu eventów&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;nikt inny nie używa takiej techniki&lt;/li&gt;
  &lt;li&gt;EP jest zagmatwane (np. nie można użyć &lt;code class=&quot;highlighter-rouge&quot;&gt;e.target&lt;/code&gt; w fn używającej &lt;code class=&quot;highlighter-rouge&quot;&gt;setState&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;zmiany-od-wersji-v17&quot;&gt;Zmiany od wersji v17&lt;/h2&gt;

&lt;p&gt;Poniżej możecie zobaczyć aktualny (na dzień publikacji artykułu) kod prosto
z repozytorium &lt;a href=&quot;https://github.com/facebook/react/&quot;&gt;facebook/react&lt;/a&gt;, gdzie
jest informacja, że nowy system zarządzania eventami nie używa &lt;em&gt;poolingu&lt;/em&gt;.&lt;/p&gt;

&lt;div class=&quot;language-js highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;// @see https://github.com/facebook/react/blob/cae635054e17a6f107a39d328649137b83f25972/packages/react-dom/src/events/SyntheticEvent.js&lt;/span&gt;

&lt;span class=&quot;cm&quot;&gt;/**
 * We release all dispatched `SyntheticEvent`s after each event loop, adding
 * them back into the pool. This allows a way to hold onto a reference that
 * won't be added back into the pool.
 */&lt;/span&gt;
&lt;span class=&quot;nx&quot;&gt;persist&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;// Modern event system doesn't use pooling.&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;

&lt;span class=&quot;cm&quot;&gt;/**
 * Checks if this event should be released back into the pool.
 *
 * @return {boolean} True if this should not be released, false otherwise.
 */&lt;/span&gt;
&lt;span class=&quot;nx&quot;&gt;isPersistent&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;functionThatReturnsTrue&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;W changelogu do wersji v17 również jest w wzmianka o nowym sposobie
na zarządzenia Eventami — &lt;a href=&quot;https://reactjs.org/blog/2020/08/10/react-v17-rc.html#no-event-pooling&quot;&gt;https://reactjs.org/blog/2020/08/10/react-v17-rc.html#no-event-pooling&lt;/a&gt;&lt;/p&gt;

&lt;h2 id=&quot;moje-rozwiązanie-problemu&quot;&gt;Moje rozwiązanie problemu&lt;/h2&gt;

&lt;p&gt;Z uwagi na to, że nie mogę podnieść wersji tej zależności tak łatwo,
to najlepszym rozwiązaniem będzie użycie &lt;code class=&quot;highlighter-rouge&quot;&gt;debounce&lt;/code&gt;… ale w innym miejscu!&lt;/p&gt;

&lt;p&gt;Największym problemem, jest to, że trzymając wciśnięty klawisz
&lt;kbd&gt;ENTER&lt;/kbd&gt;, wysyłane są zapytania HTTP, w takim razie owrapuję tylko
wywołanie funkcji wysyłającej zapytanie!&lt;/p&gt;

&lt;p&gt;Problem rozwiązany.&lt;/p&gt;

&lt;h2 id=&quot;podziękowania&quot;&gt;Podziękowania&lt;/h2&gt;

&lt;p&gt;Dziękuję &lt;a href=&quot;https://twitter.com/miloszpp&quot;&gt;@miloszpp&lt;/a&gt; za podsunięcie pomysłu,
aby napisać o tym artykuł na blogu.&lt;/p&gt;

&lt;h2 id=&quot;bibliografia&quot;&gt;Bibliografia&lt;/h2&gt;

&lt;div class=&quot;footnotes&quot;&gt;
  &lt;ol&gt;
    &lt;li id=&quot;fn:1&quot;&gt;
      &lt;p&gt;&lt;a href=&quot;https://lodash.com/docs/4.17.15#debounce&quot;&gt;https://lodash.com/docs/4.17.15#debounce&lt;/a&gt; &lt;a href=&quot;#fnref:1&quot; class=&quot;reversefootnote&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:2&quot;&gt;
      &lt;p&gt;&lt;a href=&quot;https://reactjs.org/docs/events.html&quot;&gt;https://reactjs.org/docs/events.html&lt;/a&gt; &lt;a href=&quot;#fnref:2&quot; class=&quot;reversefootnote&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:3&quot;&gt;
      &lt;p&gt;&lt;a href=&quot;https://reactjs.org/docs/legacy-event-pooling.html&quot;&gt;https://reactjs.org/docs/legacy-event-pooling.html&lt;/a&gt; &lt;a href=&quot;#fnref:3&quot; class=&quot;reversefootnote&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
  &lt;/ol&gt;
&lt;/div&gt;
</description>
            <pubDate>Fri, 29 Oct 2021 06:45:49 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2021/10/29/react-synthetic-event-event-pooling.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2021/10/29/react-synthetic-event-event-pooling.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/post-banner-react-synthetic-event.png</image>
        </item>
        
        <item>
            <title>Diagram Klas w UML (przykłady w JavaScript)</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Aby opisać projekt obiektowy, wykorzystujący klasy warto, jest wykorzystać
&lt;em&gt;Diagram Klas&lt;/em&gt;. Dzięki takiemu schematowi jesteśmy w stanie przedstawić relacje
między klasami.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Diagram Klas&lt;/em&gt; został opracowany za pomocą OMT — Object Modeling Technique
w 1991 roku przez &lt;a href=&quot;https://en.wikipedia.org/wiki/James_Rumbaugh&quot;&gt;James Rumbaugh&lt;/a&gt;,
który to w 1994 roku przeszedł z &lt;em&gt;General Electric Research and Development Center&lt;/em&gt;
to firmy &lt;em&gt;Rational Software&lt;/em&gt;, gdzie razem
z &lt;a href=&quot;https://en.wikipedia.org/wiki/Ivar_Jacobson&quot;&gt;Ivar Jacobson&lt;/a&gt;
oraz &lt;a href=&quot;https://en.wikipedia.org/wiki/Grady_Booch&quot;&gt;Grady Booch&lt;/a&gt; udoskonalili
OMT i stworzyli UML - Unified Modeling Language.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Różnice między OMT a UML w formie tabelarycznej:
&lt;a href=&quot;https://www.differencebetween.info/difference-between-uml-and-omt&quot;&gt;https://www.differencebetween.info/difference-between-uml-and-omt&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/uml/uml-logo.png&quot; itemprop=&quot;image&quot; alt=&quot;Baner promujący artykuł&quot; /&gt;
    &lt;figcaption&gt;
        Oficjalne logo &lt;a href=&quot;https://en.wikipedia.org/wiki/Unified_Modeling_Language&quot;&gt;UML&lt;/a&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;klasa&quot;&gt;Klasa&lt;/h2&gt;

&lt;p&gt;W notacji OMT, a tym samym UML, jest to prostokąt składający się
z kilku sekcji.&lt;/p&gt;

&lt;p&gt;Rysunek w ASCII art:&lt;/p&gt;

&lt;div class=&quot;language-text highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;+---------------------+
| Computer            | Nazwa klasy
+---------------------+
| -startTime: number  | Atrybuty
+---------------------+
| +powerOn(): boolean | Operacje
+---------------------+
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Przykład w kodzie JavaScript:&lt;/p&gt;

&lt;div class=&quot;language-js highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Computer&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;// Prywatna właściwość&lt;/span&gt;
    &lt;span class=&quot;err&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;startTime&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;c1&quot;&gt;// Publiczna metoda&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;powerOn&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;startTime&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;Date&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;now&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
        &lt;span class=&quot;c1&quot;&gt;// ...&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;// Sprawdźmy to!&lt;/span&gt;
&lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;c&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Computer&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
&lt;span class=&quot;nx&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;powerOn&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
&lt;span class=&quot;nx&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;c&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;instanceof&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Computer&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;h2 id=&quot;relacje&quot;&gt;Relacje&lt;/h2&gt;

&lt;p&gt;Lista wszystkich relacji w jednym miejscu:&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/uml/class-diagram/class-diagram-relations.svg&quot; alt=&quot;&quot; /&gt;
&lt;/figure&gt;

&lt;h3 id=&quot;1-association&quot;&gt;1. Association&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;PL: Asocjacja&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Luźna relacja między klasą A (Computer) oraz klasą B (Developer)&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Więcej: &lt;a href=&quot;https://www.uml-diagrams.org/association.html&quot;&gt;https://www.uml-diagrams.org/association.html&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;Rysunek w ASCII art:&lt;/p&gt;

    &lt;div class=&quot;language-text highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;  +-----------+     +----------+
  | Developer |-—--&amp;gt;| Computer |
  +-----------+     +----------+
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;

    &lt;p&gt;(ciągła linia ze strzałką)&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Przykład w kodzie JavaScript:&lt;/p&gt;

    &lt;div class=&quot;language-js highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;  &lt;span class=&quot;kd&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Computer&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;c1&quot;&gt;// ...&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;kd&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Developer&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;nx&quot;&gt;workOn&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;c&lt;/span&gt; &lt;span class=&quot;cm&quot;&gt;/* Computer */&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
          &lt;span class=&quot;c1&quot;&gt;// ...&lt;/span&gt;
      &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

  &lt;span class=&quot;c1&quot;&gt;// Sprawdźmy to!&lt;/span&gt;
  &lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;c&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Computer&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
  &lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;d&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Developer&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
  &lt;span class=&quot;nx&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;workOn&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;h3 id=&quot;2-inheritance--generalization-is-a&quot;&gt;2. Inheritance / Generalization (is-a)&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;PL: Generalizacja, Dziedziczenie&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Klasa B (Laptop) &lt;em&gt;jest&lt;/em&gt; potomkiem klasy A (Computer).&lt;/p&gt;

&lt;p&gt;Klasa B (Laptop) będąca dzieckiem, dziedziczy cechy rodzica klasy A (Computer).&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Więcej: &lt;a href=&quot;https://www.uml-diagrams.org/generalization.html&quot;&gt;https://www.uml-diagrams.org/generalization.html&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;Rysunek w ASCII art:&lt;/p&gt;

    &lt;div class=&quot;language-text highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;  +--------+      +----------+
  | Laptop |-—--|&amp;gt;| Computer |
  +--------+      +----------+
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;

    &lt;p&gt;(ciągła linia z pustym trójkątem)&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Przykład w kodzie JavaScript:&lt;/p&gt;

    &lt;div class=&quot;language-js highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;  &lt;span class=&quot;kd&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Computer&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;nx&quot;&gt;powerOn&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
          &lt;span class=&quot;c1&quot;&gt;// ...&lt;/span&gt;
      &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;kd&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Laptop&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;extends&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Computer&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{}&lt;/span&gt;

  &lt;span class=&quot;c1&quot;&gt;// Sprawdźmy to!&lt;/span&gt;
  &lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;l&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Laptop&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
  &lt;span class=&quot;nx&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;powerOn&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
  &lt;span class=&quot;nx&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;l&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;instanceof&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Computer&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;h3 id=&quot;3-realization--implementation&quot;&gt;3. Realization / Implementation&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;PL: Realizacja / Implementacja&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Relacja między interfejsem (Product) a klasą (Computer).&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Więcej: &lt;a href=&quot;https://www.uml-diagrams.org/realization.html&quot;&gt;https://www.uml-diagrams.org/realization.html&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;Rysunek w ASCII art:&lt;/p&gt;

    &lt;div class=&quot;language-text highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;  +----------+           +------------------+
  | Computer | - — - - |&amp;gt;| ProductInterface |
  +----------+           +------------------+
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;

    &lt;p&gt;(przerywana linia z pustym trójkątem)&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Przykład w kodzie TypeScript:&lt;/p&gt;

    &lt;div class=&quot;language-js highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;  &lt;span class=&quot;kr&quot;&gt;interface&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Product&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;nx&quot;&gt;getPrice&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;():&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;number&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;};&lt;/span&gt;

  &lt;span class=&quot;kd&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Computer&lt;/span&gt; &lt;span class=&quot;kr&quot;&gt;implements&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Product&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;nx&quot;&gt;getPrice&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
          &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;mf&quot;&gt;99.95&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

  &lt;span class=&quot;c1&quot;&gt;// Sprawdźmy to!&lt;/span&gt;
  &lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;c&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Computer&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
  &lt;span class=&quot;nx&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;getPrice&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// 99.95&lt;/span&gt;
  &lt;span class=&quot;c1&quot;&gt;// ...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;h3 id=&quot;4-dependency&quot;&gt;4. Dependency&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;PL: Zależność&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Metoda klasy B (Computer) oczekuje obiektu klasy A (Owner).&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Więcej: &lt;a href=&quot;https://www.uml-diagrams.org/dependency.html&quot;&gt;https://www.uml-diagrams.org/dependency.html&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;Rysunek w ASCII art:&lt;/p&gt;

    &lt;div class=&quot;language-text highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;  +---------+       +----------+
  | Sticker | - - &amp;gt; | Computer |
  +---------+       +----------+
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;

    &lt;p&gt;(przerywana linia ze strzałką)&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Przykład w kodzie JavaScript:&lt;/p&gt;

    &lt;div class=&quot;language-js highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;  &lt;span class=&quot;kd&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Sticker&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;nx&quot;&gt;stick&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;t&lt;/span&gt; &lt;span class=&quot;cm&quot;&gt;/* Computer */&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
          &lt;span class=&quot;c1&quot;&gt;// ...&lt;/span&gt;
      &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

  &lt;span class=&quot;kd&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Computer&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;c1&quot;&gt;// ...&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

  &lt;span class=&quot;c1&quot;&gt;// Sprawdźmy to!&lt;/span&gt;
  &lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;c&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Computer&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
  &lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;s&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Sticker&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
  &lt;span class=&quot;nx&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;stick&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;h3 id=&quot;5-aggregation-part-of-has-a&quot;&gt;5. Aggregation (part-of, has-a)&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;PL: Agregacja&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Klasa B (CPU) &lt;em&gt;jest częścią&lt;/em&gt; klasy A (Computer).&lt;/p&gt;

&lt;p&gt;Obiekt klasy A (Computer) ma dostęp do publicznych składowych klasy B (CPU).&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Więcej: &lt;a href=&quot;https://www.uml-diagrams.org/aggregation.html&quot;&gt;https://www.uml-diagrams.org/aggregation.html&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;Rysunek w ASCII art:&lt;/p&gt;

    &lt;div class=&quot;language-text highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;  +----------+     +-----+
  | Computer |&amp;lt;&amp;gt;---| CPU |
  +----------+     +-----+
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;

    &lt;p&gt;(ciągła linia z pustym rombem)&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Przykład w kodzie JavaScript:&lt;/p&gt;

    &lt;div class=&quot;language-js highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;  &lt;span class=&quot;kd&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;CPU&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{}&lt;/span&gt;
  &lt;span class=&quot;kd&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;HardDrive&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{}&lt;/span&gt;

  &lt;span class=&quot;kd&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Computer&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;kd&quot;&gt;constructor&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;cpu&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;hardDrive&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
          &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;cpu&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;cpu&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
          &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;hardDrive&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;hardDrive&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

  &lt;span class=&quot;c1&quot;&gt;// Sprawdźmy to!&lt;/span&gt;
  &lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;c&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Computer&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;CPU&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(),&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;HardDrive&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'500GB'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;h3 id=&quot;6-composition&quot;&gt;6. Composition&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;PL: Kompozycja&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Specjalny rodzaj agregacji.&lt;/p&gt;

&lt;p&gt;Obiekty klasy B żyją i umierają wraz z obiektami klasy A.&lt;/p&gt;

&lt;p&gt;Klasa B nie może istnieć samodzielnie.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Więcej: &lt;a href=&quot;https://www.uml-diagrams.org/composition.html&quot;&gt;https://www.uml-diagrams.org/composition.html&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;Rysunek w ASCII art:&lt;/p&gt;

    &lt;div class=&quot;language-text highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;  +----------+      +-----+
  | Computer |&amp;lt;x&amp;gt;---| CPU |
  +----------+      +-----+
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;

    &lt;p&gt;(ciągła linia z wypełnionym rombem)&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Przykład w kodzie JavaScript:&lt;/p&gt;

    &lt;div class=&quot;language-js highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;  &lt;span class=&quot;kd&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;CPU&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{}&lt;/span&gt;
  &lt;span class=&quot;kd&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;HardDrive&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{}&lt;/span&gt;

  &lt;span class=&quot;kd&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Computer&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;kd&quot;&gt;constructor&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
          &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;cpu&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;CPU&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
          &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;hardDrive&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;HardDrive&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'500GB'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
      &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

  &lt;span class=&quot;c1&quot;&gt;// Sprawdźmy to!&lt;/span&gt;
  &lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;c&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Computer&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;h2 id=&quot;przykład&quot;&gt;Przykład&lt;/h2&gt;

&lt;p&gt;Poniżej realizacja &lt;em&gt;Diagramu Klas&lt;/em&gt;, który opisuje budowę zamku, oraz relacje z pracownikami:&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/uml/class-diagram/class-diagram-castle.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;figcaption&gt;
        Diagram Klas mojego autorstwa. Temat — Zamek. 2010 rok.
    &lt;/figcaption&gt;
&lt;/figure&gt;
</description>
            <pubDate>Fri, 26 Jun 2020 13:31:35 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2020/06/26/uml-diagram-klas.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2020/06/26/uml-diagram-klas.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/uml/uml-logo.png</image>
        </item>
        
        <item>
            <title>Co to jest runtime?</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;&lt;em&gt;Runtime — czas wykonania programu.&lt;/em&gt; I tutaj mógłbym zakończyć wpis,
ale postanowiłem, że go jeszcze trochę rozwinę. Co to właściwie znaczy “runtime”?&lt;/p&gt;

&lt;h2 id=&quot;błąd-został-zauważony-w-runtime-czy-kompilacji&quot;&gt;Błąd został zauważony w runtime, czy kompilacji?&lt;/h2&gt;

&lt;p&gt;Zdefiniujmy dwa ważne procesy:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;strong&gt;Kompilacja&lt;/strong&gt;, czyli stworzenie pliku programu, na podstawie kodu źródłowego,
który będzie mógł być uruchomiony w środowisku uruchomieniowym.&lt;br /&gt;&lt;br /&gt;
Przykład:&lt;br /&gt;
Kod w TypeScript, aby został uruchomiony w przeglądarce, musi
zostać skompilowany za pomocą kompilatora &lt;code class=&quot;highlighter-rouge&quot;&gt;tsc&lt;/code&gt; do składni języka JavaScript.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;oraz:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;strong&gt;Runtime&lt;/strong&gt;, czyli czas liczony od momentu, w którym program zostaje uruchomiony,
działając w swoim środowisku uruchomieniowym, aż do momentu jego wyłączenia.&lt;br /&gt;&lt;br /&gt;
Przykład:&lt;br /&gt;
Aplikacja uruchomiona w przeglądarce posiada swój runtime,
dopóki użytkownik nie zamknie taba.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id=&quot;runtime-do-uruchomienia-języka-x&quot;&gt;“Runtime do uruchomienia języka X”&lt;/h2&gt;

&lt;p&gt;Często w rozmowie między developerami, możemy usłyszeć, że słowem &lt;strong&gt;“runtime”
zostało opisane “narzędzie”, a może nawet środowisko, które uruchamia programy&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Przykłady z najpopularniejszych narzędzi typu “runtime”:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Node.js
    &lt;ul&gt;
      &lt;li&gt;Oryginalny opis projektu: &lt;em&gt;Node.js JavaScript runtime&lt;/em&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;https://github.com/nodejs/node&quot;&gt;https://github.com/nodejs/node&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Deno
    &lt;ul&gt;
      &lt;li&gt;Oryginalny opis projektu: &lt;em&gt;A secure runtime for JavaScript and TypeScript&lt;/em&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;https://github.com/denoland/deno&quot;&gt;https://github.com/denoland/deno&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Java Runtime Environment
    &lt;ul&gt;
      &lt;li&gt;&lt;a href=&quot;https://www.oracle.com/java/technologies/javase-jre8-downloads.html&quot;&gt;https://www.oracle.com/java/technologies/javase-jre8-downloads.html&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/runtime/runtime.gif&quot; alt=&quot;&quot; /&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;błędy&quot;&gt;Błędy&lt;/h2&gt;

&lt;p&gt;z &lt;em&gt;kompilacji&lt;/em&gt; pliku napisanego w TypeScript do składni JavaScript:&lt;/p&gt;

&lt;div class=&quot;language-text highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;TS2322: Type '(p: any) =&amp;gt; void' is not assignable to type 'void'.
TS2339: Property 'url' does not exist on type 'Page'.
TS2307: Cannot find module './service'.
TS2529: Duplicate identifier 'Promise'.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;z &lt;em&gt;runtime&lt;/em&gt;-u aplikacji napisanej w JavaScript uruchomionej w przeglądarce:&lt;/p&gt;

&lt;div class=&quot;language-text highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;Uncaught TypeError: undefined is not a function
Uncaught ReferenceError: Invalid left-hand side in assignment
Uncaught TypeError: Converting circular structure to JSON
Uncaught TypeError: Cannot read property ‘foo’ of null
Uncaught RangeError: Maximum call stack size exceeded
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
</description>
            <pubDate>Wed, 17 Jun 2020 11:00:23 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2020/06/17/runtime.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2020/06/17/runtime.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/post-banner-runtime.png</image>
        </item>
        
        <item>
            <title>Dziękuję WarsawJS 💛</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Chciałem serdecznie podziękować całej społeczności WarsawJS, którą miałem
przyjemność współtworzyć przez minione ponad 5 lat.&lt;/p&gt;

&lt;blockquote class=&quot;block-info&quot;&gt;
  &lt;p&gt;W społeczności siła!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/post-banner-warsawjs-thanks.png&quot; itemprop=&quot;image&quot; alt=&quot;Baner promujący artykuł&quot; /&gt;
&lt;/figure&gt;

&lt;p&gt;&lt;strong&gt;Maj 2020&lt;/strong&gt; był ostatnim miesiącem, podczas którego byłem odpowiedzialny za wydarzenia
organizowane dla społeczności &lt;a href=&quot;https://warsawjs.com&quot;&gt;WarsawJS&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Przez ten okres byłem zaangażowany w realizację:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;69 meetupów&lt;/strong&gt; (w tym 2 online)
    &lt;ul&gt;
      &lt;li&gt;podczas 6 z nich również występowałem jako &lt;em&gt;prelegent&lt;/em&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;43 workshopów&lt;/strong&gt; (w tym 2 online)
    &lt;ul&gt;
      &lt;li&gt;podczas 26 z nich również występowałem jako &lt;em&gt;trener&lt;/em&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;9 szkoleń komercyjnych&lt;/strong&gt;
    &lt;ul&gt;
      &lt;li&gt;podczas 3 z nich również występowałem jako &lt;em&gt;mentor&lt;/em&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;2 konferencje&lt;/strong&gt;
    &lt;ul&gt;
      &lt;li&gt;ConFrontJS 2018 &amp;amp; 2019&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;1 hackathon&lt;/strong&gt;
    &lt;ul&gt;
      &lt;li&gt;Edukaton 2018&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Chciałbym Wam opowiedzieć o każdym wydarzeniu, ale nie jest to możliwe.
Czuję, że przez te ponad 5 lat organizowania wydarzeń nazbierałoby się
tyle historii, że moglibyśmy stworzyć książkę, która z pewnością mogłaby stać
na półce w Empiku.&lt;/p&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;h2 id=&quot;artykuły-o-wydarzeniach-warsawjs-na-tym-blogu&quot;&gt;Artykuły o wydarzeniach WarsawJS (na tym blogu)&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;/blog/2014/06/15/warsawjs-nowa-organizacja-w-warszawie.html&quot;&gt;WarsawJS — Nowa Organizacja w Warszawie&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;WarsawJS Meetup:
    &lt;ul&gt;
      &lt;li&gt;2014:
&lt;a href=&quot;/blog/2014/09/17/warsawjs-meetup-1.html&quot;&gt;#1&lt;/a&gt;
&lt;a href=&quot;/blog/2014/10/26/warsawjs-meetup-2.html&quot;&gt;#2&lt;/a&gt;
&lt;a href=&quot;/blog/2014/11/13/warsawjs-meetup-3.html&quot;&gt;#3&lt;/a&gt;
&lt;a href=&quot;/blog/2014/12/18/warsawjs-meetup-4.html&quot;&gt;#4&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;2015:
&lt;a href=&quot;/blog/2015/01/13/warsawjs-meetup-5.html&quot;&gt;#5&lt;/a&gt;
&lt;a href=&quot;/blog/2015/02/10/warsawjs-meetup-6.html&quot;&gt;#6&lt;/a&gt;
&lt;a href=&quot;/blog/2015/03/23/warsawjs-meetup-7.html&quot;&gt;#7&lt;/a&gt;
&lt;a href=&quot;/blog/2015/05/05/warsawjs-meetup-8.html&quot;&gt;#8&lt;/a&gt;
&lt;a href=&quot;/blog/2015/05/25/warsawjs-meetup-9.html&quot;&gt;#9&lt;/a&gt;
&lt;a href=&quot;/blog/2015/06/22/warsawjs-meetup-10.html&quot;&gt;#10&lt;/a&gt;
&lt;a href=&quot;/blog/2015/08/09/warsawjs-meetup-11.html&quot;&gt;#11&lt;/a&gt;
&lt;a href=&quot;/blog/2015/08/22/warsawjs-meetup-12.html&quot;&gt;#12&lt;/a&gt;
&lt;a href=&quot;/blog/2015/09/22/warsawjs-meetup-13.html&quot;&gt;#13&lt;/a&gt;
&lt;a href=&quot;/blog/2015/10/29/warsawjs-meetup-14.html&quot;&gt;#14&lt;/a&gt;
&lt;a href=&quot;/blog/2015/12/13/warsawjs-meetup-15.html&quot;&gt;#15&lt;/a&gt;
&lt;a href=&quot;/blog/2015/12/26/warsawjs-meetup-16.html&quot;&gt;#16&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;2016:
&lt;a href=&quot;/blog/2016/01/17/warsawjs-meetup-17.html&quot;&gt;#17&lt;/a&gt;
&lt;a href=&quot;/blog/2016/02/24/warsawjs-meetup-18.html&quot;&gt;#18&lt;/a&gt;
&lt;a href=&quot;/blog/2016/04/24/warsawjs-meetup-19.html&quot;&gt;#19&lt;/a&gt;
&lt;a href=&quot;/blog/2016/04/24/warsawjs-meetup-20.html&quot;&gt;#20&lt;/a&gt;
&lt;a href=&quot;/blog/2016/06/26/warsawjs-meetup-21.html&quot;&gt;#21&lt;/a&gt;
&lt;a href=&quot;/blog/2016/06/27/warsawjs-meetup-22.html&quot;&gt;#22&lt;/a&gt;
&lt;a href=&quot;/blog/2016/07/15/warsawjs-meetup-23.html&quot;&gt;#23&lt;/a&gt;
&lt;a href=&quot;/blog/2016/08/23/warsawjs-meetup-24.html&quot;&gt;#24&lt;/a&gt;
&lt;a href=&quot;/blog/2016/09/14/warsawjs-meetup-25.html&quot;&gt;#25&lt;/a&gt;
&lt;a href=&quot;/blog/2016/11/05/warsawjs-meetup-26.html&quot;&gt;#26&lt;/a&gt;
&lt;a href=&quot;/blog/2016/11/19/warsawjs-meetup-27.html&quot;&gt;#27&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;2017:
&lt;a href=&quot;/blog/2017/01/17/warsawjs-meetup-28.html&quot;&gt;#28&lt;/a&gt;
&lt;a href=&quot;/blog/2017/05/09/warsawjs-meetup-29.html&quot;&gt;#29&lt;/a&gt;
&lt;a href=&quot;/blog/2017/05/17/warsawjs-meetup-30.html&quot;&gt;#30&lt;/a&gt;
&lt;a href=&quot;/blog/2017/05/27/warsawjs-meetup-31.html&quot;&gt;#31&lt;/a&gt;
&lt;a href=&quot;/blog/2017/06/02/warsawjs-meetup-32.html&quot;&gt;#32&lt;/a&gt;
&lt;a href=&quot;/blog/2017/06/08/warsawjs-meetup-33.html&quot;&gt;#33&lt;/a&gt;
&lt;a href=&quot;/blog/2017/07/12/warsawjs-meetup-34.html&quot;&gt;#34&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;WarsawJS Workshop:
    &lt;ul&gt;
      &lt;li&gt;2016: &lt;a href=&quot;/blog/2016/12/13/warsawjs-workshop-1.html&quot;&gt;#1&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;2017: &lt;a href=&quot;/blog/2017/04/23/warsawjs-workshop-5.html&quot;&gt;#5&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Wszystkie wpisy dostępne są pod tagiem &lt;a href=&quot;/tag/warsawjs/&quot;&gt;#warsawjs&lt;/a&gt;.&lt;/p&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;h2 id=&quot;jak-to-się-zaczęło&quot;&gt;Jak to się zaczęło?&lt;/h2&gt;

&lt;p&gt;Wszystko zaczęło się od kiełbasy smażonej w jednym z żoliborskich parków.
Serio! Na początku prowadziliśmy rozmowy internetowe,
i telefoniczne, ale pewnego dnia spotkaliśmy się w 3 pary na Kępie
Potockiej, gdzie omówiliśmy temat nowej organizacji / inicjatywy.&lt;/p&gt;

&lt;div class=&quot;gallery&quot;&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/born/grill-unsplash.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/born/grill-unsplash.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/born/kepa-potocka.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/born/kepa-potocka.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
&lt;/div&gt;

&lt;p&gt;Wtedy jeszcze nie NIKT nie wiedział, że będzie to tak duży projekt, który
będzie zrzeszał tyle tysięcy osób w social mediach oraz, że znajdą się inne
osoby chętne do organizowania wydarzeń.&lt;/p&gt;

&lt;p&gt;Po pierwszym meetupie, miałem poczucie, że to może być bardzo fajna rozrywka
dla środowiska Front-end. Po pracy programiści mogli zrobić coś więcej niż tylko
przyjść do domu i zamknąć się w swoich czterech ścianach.&lt;/p&gt;

&lt;p&gt;Spotkania przy barze spowodowały, że ludzie przychodzili nie tylko, aby wysłuchać
kilku prezentacji, ale także poznać nowe osoby, dowiedzieć się jak to jest
w innych firmach, a nawet znaleźć swojego kolejnego pracodawcę.&lt;/p&gt;

&lt;p&gt;Networking po prelekcjach był jednym z fajniejszych momentów w miesiącu,
jakie wówczas przeżywaliśmy jako organizatorzy. Za każdym razem mieliśmy
przyjemność poznać tylu ludzi i nawiązać tyle - krótszych lub dłuższych - relacji,
że spokojnie wystarczyłoby ich na każdy z 4 weekendów w miesiącu.&lt;/p&gt;

&lt;p&gt;Dla mnie WarsawJS było pierwszym regularnym meetupem dla programistów JavaScript,
na jaki przychodziłem. Wcześniej byłem raz na meet.js i było fajnie. Szkoda,
że te spotkania nie były regularne. Stąd też narodził się pomysł, aby stworzyć
lokalną grupę dla programistów języka JavaScript. Nie mieliśmy ambicji,
aby konkurować z meet.js i być w każdym mieście w kraju. Interesowała nas
tylko Warszawa.&lt;/p&gt;

&lt;h2 id=&quot;trudne-początki--kosa-z-meetjs&quot;&gt;Trudne początki — “Kosa” z meet.js&lt;/h2&gt;

&lt;p&gt;Wiecie, że mieliśmy kosę z meet.js? Takie były początki, niestety. Podczas pierwszego
meetupu nie wyraziliśmy się dokładnie jaki jest cel i sens spotkań naszej grupy.
Przyznam, że zżarła nas trochę trema. Nie mieliśmy kartki z tekstem
jaki powinniśmy wypowiedzieć ze sceny.&lt;/p&gt;

&lt;div class=&quot;gallery&quot;&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-2/highres_427351562.jpeg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-2/highres_427351562.jpeg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-2/highres_427351672.jpeg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-2/highres_427351672.jpeg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
&lt;/div&gt;

&lt;p&gt;Cały spór związany był z tym, że ze sceny zostało wypowiedziane zdanie,
że &lt;em&gt;“w stolicy nie ma spotkań dla programistów języka JavaScript”&lt;/em&gt;. Oczywiście
nie była to do końca prawda, bo takie spotkania były, a raczej bywały.
Zabrakło słowa “regularnych” spotkań i wtedy nie byłoby kłopotu — przynajmniej
tak mi się wydaje. Wówczas organizator meet.js — Damian Wielgosik — wyraził głośno
swoje poglądy na temat naszej organizacji na grupie dla organizatorów warszawskich
spotkań. Trochę nam się dostało, ale po kilku tygodniach sytuacja się unormowała,
a my robiliśmy swoje.&lt;/p&gt;

&lt;p&gt;Regularne spotkania to klucz do sukcesu — zależało nam na tym, aby nie robić
przerw wakacyjnych ani ferii zimowych. Zwykle na wydarzeniach wakacyjnych bywało
więcej osób niż zwykle — a to nas tylko cieszyło!&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Regularność stała się naszym mottem!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I tak w ciągu minionych &lt;strong&gt;69 miesięcy&lt;/strong&gt; zorganizowaliśmy &lt;strong&gt;69 meetupów&lt;/strong&gt;.&lt;br /&gt;
Regularnie? O tak. I to jak bardzo!&lt;/p&gt;

&lt;p&gt;W każdą drugą środę miesiąca organizowaliśmy spotkania dla naszej społeczności.
Na początku testowaliśmy, który dzień tygodnia będzie najlepszym na tego typu
wydarzenia.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;em&gt;Poniedziałek&lt;/em&gt; i &lt;em&gt;Piątek&lt;/em&gt; — słaba frekwencja,&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;Wtorek&lt;/em&gt; - zajęty zwykle przez jakieś sprawy osobiste,&lt;/li&gt;
  &lt;li&gt;…a w &lt;em&gt;Czwartek&lt;/em&gt; świat IT spędza na tzw. czwartkowych biesiadach z ludźmi z pracy.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Stąd też wybrana została &lt;em&gt;środa&lt;/em&gt;. Środek tygodnia okazał się najlepszy.
Dlaczego druga środa miesiąca? Po odrzuceniu skrajnych tygodni (kiepska frekwencja)
zostawała środa w trzecim tygodniu. Ten termin natomiast był zarezerwowany przez
&lt;a href=&quot;http://wrug.eu/&quot;&gt;WRUG&lt;/a&gt;, tj. spotkania społeczności języka Ruby. Z organizatorami
WRUGa żyliśmy od początku bardzo dobrze, więc aby nie wchodzić sobie w drogę
&lt;strong&gt;wybraliśmy drugą środę miesiąca&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Dziś, relacje z meet.js są bardzo dobre. W zeszłym roku wystąpiłem pierwszy
raz na ich scenie, a osoby organizujące warszawskie edycje wystąpiły na scenie
WarsawJS.&lt;/p&gt;

&lt;p&gt;Konflikt zażegnany. Uff! ;)&lt;/p&gt;

&lt;h2 id=&quot;kalendarium&quot;&gt;Kalendarium&lt;/h2&gt;

&lt;p&gt;Ważne momenty w historii społeczności:&lt;/p&gt;

&lt;ul class=&quot;flos&quot;&gt;
  &lt;li&gt;
    &lt;h3 id=&quot;2014-06-15&quot;&gt;2014-06-15&lt;/h3&gt;

    &lt;p&gt;&lt;strong&gt;Oficjalne rozpoczęcie działalności&lt;/strong&gt;&lt;br /&gt;&lt;/p&gt;

    &lt;p&gt;Kępa Potocka — w tym miejscu nastąpiło pierwsze spotkanie organizatorów WarsawJS.
  Podczas grilla na Żoliborzu poznaliśmy się i mogliśmy obgadać cel stworzenia
  takiej inicjatywy jaką był wtedy WarsawJS.&lt;/p&gt;

    &lt;p&gt;Poniżej znajdziesz zrzut ekranu z pierwszego maila w mojej skrzynce
  odbiorczej dotyczącego “WarsawJS”.&lt;/p&gt;

    &lt;div class=&quot;gallery&quot;&gt;
      &lt;a href=&quot;/assets/photos/warsawjs/born/warsawjs-is-here.png&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
          &lt;img data-src=&quot;/assets/photos/warsawjs/born/warsawjs-is-here.png&quot; alt=&quot;&quot; /&gt;
      &lt;/a&gt;
  &lt;/div&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;h3 id=&quot;2014-09-14&quot;&gt;2014-09-14&lt;/h3&gt;

    &lt;p&gt;&lt;strong&gt;Nagranie pierwszego zaproszenia na meetup&lt;/strong&gt;&lt;/p&gt;

    &lt;div class=&quot;youtube-lazy&quot; data-youtube-id=&quot;nF_7xdzesT8&quot;&gt;&lt;/div&gt;

    &lt;p&gt;Razem z Kasią — moją partnerką (która po kilku wydarzeniach dołączył do grona
  organizatorów), nagraliśmy zaproszenie na pierwsze wydarzenie.
  Pamiętam jak wtedy poczułem, że jest to czas w którym przestałem się obawiać
  swojego wizerunku w internecie.&lt;/p&gt;

    &lt;p&gt;Każdy “YouTuber” na początku czuje taki pewnego rodzaju wstyd, że ludzie
  zaczną go oceniać itd. Przełamałem się i korzystając z telefonu (oraz oparcia
  łóżka jako statywu) nagraliśmy ZAPROSZENIE. Warunki mieszkalne nie pozwalały
  uzyskać jednolitego tła, stąd potrzebne było niemałe przemeblowanie.&lt;/p&gt;

    &lt;p&gt;Dziś uważam, że ten film jest beznadziejny. Wszystko jest w nim do poprawy.
  Ale z jednej rzeczy jestem dumny. Z tego, że to zrobiłem. Przełamałem
  swój lęk przed publicznym “upokorzeniem”. To dla chłopaka z małej miejscowości
  jak ja, było sporym wyzwaniem.&lt;/p&gt;

    &lt;p&gt;Po publikacji tego nagrania chciałem iść dalej i w naszym gronie
  organizacyjnym zgodziliśmy się na to, aby nagrać również PODZIĘKOWANIE
  za przyjście na wydarzenie. Powstały dwa takie filmy. To jest drugi:&lt;/p&gt;

    &lt;div class=&quot;youtube-lazy&quot; data-youtube-id=&quot;UX2yGpGgviQ&quot;&gt;&lt;/div&gt;

    &lt;p&gt;Pamiętam jak dziś, że po tym filmie stwierdziliśmy, że jednak takie filmy
  nic nie wnoszą, więc zrezygnowaliśmy z takiego formatu.&lt;/p&gt;

    &lt;p&gt;Zaproszenia wideo zadomowiły się u nas na dobre. Każdy meetup promowany był
  uprzednio zmontowanym zaproszeniem. Często jeździliśmy po różnych miejscach
  w stolicy, aby pokazywać jak piękne jest nasze miasto.&lt;/p&gt;

    &lt;p&gt;Celem takich “filmików” było uatrakcyjnienie zaproszenia. Większość wydarzeń
  w social mediach promowanych jest przez suchy tekst w opisie wydarzenia.
  Zupełnie inaczej wygląda sytuacja kiedy to możemy obejrzeć film nagrany
  specjalnie na wydarzenie. Taki format nie był wówczas jeszcze tak
  popularny jak dziś, więc pierwsze filmy zdobywały “fajną” oglądalność.&lt;/p&gt;

    &lt;p&gt;Jak wyglądała produkcja takiego materiału?.
  Zdradzę wam pewien “sekret”: Każda minuta filmu wymaga kilku godzin montażu.
  Mój rekord wynosi ok. 15 godzin montażu na kilkuminutowe wideozaproszenie.
  Podczas tworzenia takich produkcji bardzo wiele się nauczyłem.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;h3 id=&quot;2014-09-16&quot;&gt;2014-09-16&lt;/h3&gt;

    &lt;p&gt;&lt;strong&gt;Pierwszy meetup — WarsawJS Meetup #1&lt;/strong&gt;&lt;br /&gt;&lt;/p&gt;

    &lt;div class=&quot;gallery&quot;&gt;
      &lt;a href=&quot;/assets/photos/warsawjs/meetup-1/IMG_3162.JPG&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
          &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-1/IMG_3162.JPG&quot; alt=&quot;&quot; /&gt;
      &lt;/a&gt;
  &lt;/div&gt;

    &lt;p&gt;Pierwsze wydarzenie było dla mnie czymś ABSTRAKCYJNYM. Pierwszy raz
  organizowałem publiczne wydarzenie, na które mógł przyjść każdy bez
  uprzedniej rejestracji. Totalnie nie wiedzieliśmy, kto jest na sali
  i jakiej frekwencji mamy się spodziewać.&lt;/p&gt;

    &lt;p&gt;Rzeczywistość w zupełności przerosła nasze oczekiwania!
  Na pierwsze spotkanie przyszło ponad 100 osób. Wszystkie krzesełka zajęte.
  Nawet na podłodze, na której zasiadło kilka osób zabrakło miejsca.
  To był dla nas SZOK! Nie sądziliśmy, że na nasze wydarzenie ludzie zjawią się
  tak licznie.&lt;/p&gt;

    &lt;p&gt;Tego dnia wcieliłem się również &lt;strong&gt;pierwszy raz w rolę prelegenta&lt;/strong&gt;.
  To było coś dziwnego. Kolejny raz w życiu nie poznawałem swojego głosu,
  kiedy na scenie opowiadałem o aplikacjach Smart TV.&lt;/p&gt;

    &lt;p&gt;Prezentacja z mojego wystąpienia jest dostępna
  na &lt;a href=&quot;https://www.youtube.com/watch?v=2ktpOVFQOe8&quot;&gt;kanale YouTube&lt;/a&gt;.&lt;/p&gt;

    &lt;p&gt;Po prelekcjach w części networkingowej mieliśmy już ochotników na kolejne wydarzenia!
  To było niesamowite! Długo się nie zastanawiając przeszliśmy więc do organizowania
  kolejnego wydarzenia.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;h2 id=&quot;meetupy-w-państwomiasto&quot;&gt;Meetupy w “Państwomiasto”&lt;/h2&gt;

&lt;p&gt;Rok 2014&lt;/p&gt;

&lt;div class=&quot;gallery&quot;&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-3/IMG_1436.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-3/IMG_1436.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-3/IMG_1553.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-3/IMG_1553.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
&lt;/div&gt;

&lt;p&gt;Rok 2015&lt;/p&gt;

&lt;div class=&quot;gallery&quot;&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-4/IMG_9279.JPG&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-4/IMG_9279.JPG&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-4/IMG_9283.JPG&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-4/IMG_9283.JPG&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-6/IMG_0319.JPG&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-6/IMG_0319.JPG&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-7/IMG_0670.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-7/IMG_0670.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-8/IMG_1428.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-8/IMG_1428.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;gallery&quot;&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-4/IMG_9285.JPG&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-4/IMG_9285.JPG&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-5/IMG_0262.JPG&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-5/IMG_0262.JPG&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-5/IMG_0278.JPG&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-5/IMG_0278.JPG&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-6/IMG_0337.JPG&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-6/IMG_0337.JPG&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;gallery&quot;&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-6/IMG_0345.JPG&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-6/IMG_0345.JPG&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-6/IMG_0375.JPG&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-6/IMG_0375.JPG&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-7/IMG_0489.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-7/IMG_0489.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;gallery&quot;&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-7/IMG_0523.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-7/IMG_0523.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-7/IMG_0565.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-7/IMG_0565.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-8/IMG_1349.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-8/IMG_1349.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-8/IMG_1368.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-8/IMG_1368.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-8/IMG_1397.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-8/IMG_1397.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;gallery&quot;&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-9/IMG_1523.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-9/IMG_1523.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-9/IMG_1556.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-9/IMG_1556.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-9/IMG_1560.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-9/IMG_1560.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;gallery&quot;&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-9/IMG_1593.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-9/IMG_1593.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-10/IMG_1733.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-10/IMG_1733.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-10/IMG_1750.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-10/IMG_1750.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;gallery&quot;&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-10/IMG_1755.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-10/IMG_1755.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-10/IMG_1757.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-10/IMG_1757.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-11/IMG_2825.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-11/IMG_2825.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-11/IMG_2928.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-11/IMG_2928.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-11/IMG_2938.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-11/IMG_2938.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;gallery&quot;&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-11/IMG_2992.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-11/IMG_2992.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-12/IMG_3567.JPG&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-12/IMG_3567.JPG&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-12/IMG_3575.JPG&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-12/IMG_3575.JPG&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-12/IMG_3591.JPG&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-12/IMG_3591.JPG&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-12/IMG_3613.JPG&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-12/IMG_3613.JPG&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
&lt;/div&gt;

&lt;h2 id=&quot;pierwsze-urodziny-&quot;&gt;Pierwsze urodziny 🎉&lt;/h2&gt;

&lt;p&gt;&lt;small&gt;(2015-09-16)&lt;/small&gt;&lt;/p&gt;

&lt;p&gt;Pierwszy rok za nami. To były piękne miesiące. Ciągle się uczyliśmy organizowania
meetupów. Dalej nie mieliśmy przekonania, że wydarzenia są już wystarczająco dobre.&lt;/p&gt;

&lt;div class=&quot;gallery&quot;&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-13/IMG_4166.JPG&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-13/IMG_4166.JPG&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-13/IMG_4182.JPG&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-13/IMG_4182.JPG&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;gallery&quot;&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-13/IMG_4203.JPG&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-13/IMG_4203.JPG&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-13/IMG_4287.JPG&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-13/IMG_4287.JPG&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
&lt;/div&gt;

&lt;p&gt;“To był najfajniejszy meetup jak do tej pory!” — takie miałem odczucia,
zaraz po zakończeniu wydarzenia. Mieliśmy bardzo dużą frekwencję,
a i pojawiło się więcej osób do pomocy przy wydarzeniu.&lt;/p&gt;

&lt;p&gt;Więcej zdjęć w &lt;a href=&quot;https://www.meetup.com/WarsawJS/photos/26413255/&quot;&gt;galerii&lt;/a&gt;.&lt;/p&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;p&gt;Rok 2015&lt;/p&gt;

&lt;div class=&quot;gallery&quot;&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-14/IMG_5184.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-14/IMG_5184.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-14/IMG_5231.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-14/IMG_5231.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-14/IMG_5289.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-14/IMG_5289.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-14/IMG_5305.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-14/IMG_5305.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;gallery&quot;&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-15/IMG_5546.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-15/IMG_5546.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-15/IMG_5550.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-15/IMG_5550.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-15/IMG_5576.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-15/IMG_5576.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-16/IMG_5839.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-16/IMG_5839.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;gallery&quot;&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-16/IMG_5858.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-16/IMG_5858.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-16/IMG_5918.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-16/IMG_5918.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-16/IMG_5958.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-16/IMG_5958.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-17/IMG_6577.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-17/IMG_6577.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;gallery&quot;&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-17/IMG_6607.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-17/IMG_6607.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-17/IMG_6611.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-17/IMG_6611.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-17/IMG_6659.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-17/IMG_6659.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-18/Warsaw_JS_luty2016_Foto_P_Tarasewicz-5.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-18/Warsaw_JS_luty2016_Foto_P_Tarasewicz-5.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;gallery&quot;&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-18/Warsaw_JS_luty2016_Foto_P_Tarasewicz-1.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-18/Warsaw_JS_luty2016_Foto_P_Tarasewicz-1.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-18/Warsaw_JS_luty2016_Foto_P_Tarasewicz-11.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-18/Warsaw_JS_luty2016_Foto_P_Tarasewicz-11.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-19/IMG_7026.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-19/IMG_7026.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
&lt;/div&gt;

&lt;figure&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-18/Warsaw_JS_luty2016_Foto_P_Tarasewicz-16.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-18/Warsaw_JS_luty2016_Foto_P_Tarasewicz-16.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;figcaption&gt;
        Piękni i Młodzi
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;div class=&quot;gallery&quot;&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-19/IMG_6939.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-19/IMG_6939.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-19/IMG_6953.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-19/IMG_6953.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-19/IMG_7005.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-19/IMG_7005.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;gallery&quot;&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-20/IMG_0120.JPG&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-20/IMG_0120.JPG&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-20/IMG_0130.JPG&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-20/IMG_0130.JPG&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-20/IMG_0190.JPG&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-20/IMG_0190.JPG&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-20/IMG_0257.JPG&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-20/IMG_0257.JPG&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
&lt;/div&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;ul class=&quot;flos&quot;&gt;
  &lt;li&gt;
    &lt;h3 id=&quot;2016-05-11&quot;&gt;2016-05-11&lt;/h3&gt;

    &lt;p&gt;&lt;strong&gt;Pierwsza kobieta na scenie — Paulina Kamińska&lt;/strong&gt;&lt;br /&gt;&lt;/p&gt;

    &lt;p&gt;Dopiero podczas 21. edycji WarsawJS Meetup mogliśmy wysłuchać pierwszej
  prelekcji poprowadzonej przez kobietę. Podczas wydarzeń mogliśmy
  zaobserwować wiele kobiet, ale dopiero Paulina odważyła się wyjść na
  scenę. Pragnę Jej z tego miejsca serdecznie pogratulować odwagi.
  Brawo i wielkie dzięki Paulina!&lt;/p&gt;

    &lt;div class=&quot;gallery&quot;&gt;
      &lt;a href=&quot;/assets/photos/warsawjs/meetup-21/IMG_2145.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
          &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-21/IMG_2145.jpg&quot; alt=&quot;&quot; /&gt;
      &lt;/a&gt;
      &lt;a href=&quot;/assets/photos/warsawjs/meetup-21/IMG_2214.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
          &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-21/IMG_2214.jpg&quot; alt=&quot;&quot; /&gt;
      &lt;/a&gt;
      &lt;a href=&quot;/assets/photos/warsawjs/meetup-21/IMG_2229.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
          &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-21/IMG_2229.jpg&quot; alt=&quot;&quot; /&gt;
      &lt;/a&gt;
      &lt;a href=&quot;/assets/photos/warsawjs/meetup-21/IMG_2269.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
          &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-21/IMG_2269.jpg&quot; alt=&quot;&quot; /&gt;
      &lt;/a&gt;
  &lt;/div&gt;

    &lt;p&gt;Wielokrotnie rozmawialiśmy co możemy zrobić, aby zachęcić kobiety do wyjścia
  na scenę. To trudny temat. Nie chcieliśmy urazić tej części społeczności
  poprzez wysyłanie jakichś specjalnych zaproszeń itp.&lt;/p&gt;

    &lt;p&gt;Naszym celem jest i było traktowanie wszystkich na równi i dbanie o to by
  wszyscy czuli się komfortowo.
  Spotkania przestrzegały &lt;a href=&quot;https://berlincodeofconduct.org/pl/&quot;&gt;Berlińskiego Code of Conduct&lt;/a&gt;,
  który fajnie nadmienia zasady jakie powinny panować w relacjach
  między uczestnikami.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;p&gt;Rok 2016&lt;/p&gt;

&lt;div class=&quot;gallery&quot;&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-22/IMG_2461.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-22/IMG_2461.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-22/IMG_2502.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-22/IMG_2502.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-22/IMG_2587.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-22/IMG_2587.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-22/IMG_2594.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-22/IMG_2594.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;gallery&quot;&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-23/IMG_3183.JPG&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-23/IMG_3183.JPG&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-23/IMG_3222.JPG&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-23/IMG_3222.JPG&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-23/IMG_3293.JPG&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-23/IMG_3293.JPG&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-23/IMG_3304.JPG&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-23/IMG_3304.JPG&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;gallery&quot;&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-24/IMG_4036.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-24/IMG_4036.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-24/IMG_4071.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-24/IMG_4071.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-24/IMG_4122.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-24/IMG_4122.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-24/IMG_4145.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-24/IMG_4145.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
&lt;/div&gt;

&lt;h2 id=&quot;drugie-urodziny-&quot;&gt;Drugie urodziny 🎉&lt;/h2&gt;

&lt;p&gt;&lt;small&gt;(2016-09-14)&lt;/small&gt;&lt;/p&gt;

&lt;div class=&quot;gallery&quot;&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-25/IMG_5533.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-25/IMG_5533.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-25/IMG_5538.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-25/IMG_5538.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
&lt;/div&gt;
&lt;div class=&quot;gallery&quot;&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-25/IMG_5671.JPG&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-25/IMG_5671.JPG&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-25/IMG_5643.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-25/IMG_5643.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
&lt;/div&gt;
&lt;div class=&quot;gallery&quot;&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-25/IMG_5593.JPG&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-25/IMG_5593.JPG&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-25/IMG_5629.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-25/IMG_5629.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-25/IMG_5674.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-25/IMG_5674.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
&lt;/div&gt;

&lt;p&gt;“To już dwa lata regularnych wydarzeń! Wow!” — a takie przemyślenia naszły mnie
podczas tego wydarzenia. To były fajne urodziny. Mieliśmy tort oraz “orkiestrę”!
To było coś!&lt;/p&gt;

&lt;p&gt;Już wiedzieliśmy jak powinien wyglądać urodzinowy meetup.
Każdy kolejny event tego typu był z tortem i muzyką!&lt;/p&gt;

&lt;p&gt;Mój kolega Rafał zabrał ze sobą gitarę, aby zagrać nam melodię Sto Lat,
która zabrzmiała na początku wydarzenia, mogliśmy wtedy nawet zaśpiewać!
Ale to był przyjemny moment!&lt;/p&gt;

&lt;p&gt;Na wydarzenie przyjechała siostra Kasi, Natalia, która służyła pomocą!
Bardzo miło się robiło na sercu, gdy tyle osób wyraziło swoją wdzięczność
za trud włożony w organizację.&lt;/p&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;p&gt;Rok 2016&lt;/p&gt;

&lt;div class=&quot;gallery&quot;&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-26/IMG_6721.JPG&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-26/IMG_6721.JPG&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-26/IMG_6754.JPG&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-26/IMG_6754.JPG&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-26/IMG_6845.JPG&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-26/IMG_6845.JPG&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-27/IMG_7267.JPG&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-27/IMG_7267.JPG&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;gallery&quot;&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-27/IMG_7301.JPG&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-27/IMG_7301.JPG&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-27/IMG_7333.JPG&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-27/IMG_7333.JPG&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-27/IMG_7392.JPG&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-27/IMG_7392.JPG&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-28/IMG_7914.JPG&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-28/IMG_7914.JPG&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;gallery&quot;&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-28/IMG_7944.JPG&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-28/IMG_7944.JPG&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-28/IMG_7980.JPG&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-28/IMG_7980.JPG&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-28/IMG_8035.JPG&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-28/IMG_8035.JPG&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-32/IMG_0405.JPG&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-32/IMG_0405.JPG&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
&lt;/div&gt;

&lt;ul class=&quot;flos&quot;&gt;
  &lt;li&gt;
    &lt;h3 id=&quot;2016-12-04&quot;&gt;2016-12-04&lt;/h3&gt;

    &lt;p&gt;&lt;strong&gt;Pierwszy workshop — WarsawJS Workshop #1&lt;/strong&gt;&lt;br /&gt;&lt;/p&gt;

    &lt;p&gt;Po 2 latach organizowania meetupów chcieliśmy czegoś nowego. Szkolenia!
  O takiej formie spotkań rozmawialiśmy już od początku naszego istnienia.
  Nie chcieliśmy jednak chwytać byka za rogi od razu.
  Zebraliśmy odpowiednie doświadczenie w organizowaniu publicznych wydarzeń,
  więc mogliśmy podwyższyć sobie poprzeczkę.&lt;/p&gt;

    &lt;p&gt;Całodniowe wydarzenie to trochę inny rodzaj eventu niż wieczorne spotkanie.
  Liczba zadań do wykonania jest trochę bardziej obszerna i “rozległa”,
  tj. podczas organizacji tego typu wydarzenia jest więcej zadań logistycznych
  oraz takich, które mogą być oddelegowane do innych osób.&lt;/p&gt;

    &lt;p&gt;Dla mnie szkolenia WarsawJS były perfekcyjnym miejscem do edukacji.&lt;/p&gt;

    &lt;figure class=&quot;social-center-block&quot;&gt;
      &lt;iframe src=&quot;https://www.facebook.com/plugins/post.php?href=https%3A%2F%2Fwww.facebook.com%2Fwarsawjs%2Fphotos%2Fa.2019795684913431.1073741831.1578130679079936%2F2019795961580070%2F%3Ftype%3D3&amp;amp;width=500&quot; width=&quot;500&quot; height=&quot;337&quot; style=&quot;border:none;overflow:hidden&quot; scrolling=&quot;no&quot; frameborder=&quot;0&quot; allowtransparency=&quot;true&quot;&gt;&lt;/iframe&gt;
  &lt;/figure&gt;

    &lt;p&gt;Uwielbiam uczyć ludzi, szczególnie pasjonatów, a osoby przychodzące na wydarzenie
  w niedzielę na 10:00 zaliczają się do takiego grona bez dwóch zdań!&lt;/p&gt;

    &lt;p&gt;Uśmiech na twarzach uczestników oraz ta wdzięczność po szkoleniu wynagradza
  trud jaki trzeba było ponieść przy organizacji i podczas przygotowań
  do roli trenera. W ciągu tych ponad 3 lat szkoleń w roli trenera występowałem
  aż 26 razy — to prawie &lt;strong&gt;60% wszystkich workshopów&lt;/strong&gt;!&lt;/p&gt;

    &lt;p&gt;W tym roku postanowiłem, że wszystkie szkolenia, która przyjdzie mi prowadzić
  będę prowadził w języku angielskim. Znam swój poziom angielskiego i wiedziałem,
  jak trudno będzie mi przekazać wiedzę w tym języku. Całe szczęście WarsawJS
  to miejsce w którym każdy może się rozwijać, nawet ja!&lt;/p&gt;

    &lt;p&gt;Więcej na temat pierwszego workshopu możecie znaleźć
  &lt;a href=&quot;/blog/2016/12/13/warsawjs-workshop-1.html&quot;&gt;w osobnym artykule&lt;/a&gt;.&lt;/p&gt;

    &lt;hr /&gt;

    &lt;p&gt;Uruchomienie nowej inicjatywy w organizacji wymusiło na nas zmianę nazw wydarzeń.
  Spotkania od tego momentu nie nazywały się “WarsawJS” tylko “WarsawJS Meetup”.
  Była to moim zdaniem naturalna aktualizacja. Nawet nie wiecie w ilu miejscach
  trzeba było zmienić tą nazwę :-D&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;h3 id=&quot;2017-01-11&quot;&gt;2017-01-11&lt;/h3&gt;

    &lt;p&gt;&lt;strong&gt;Pierwsza zmiana miejsca dla inicjatywy WarsawJS Meetup&lt;/strong&gt;&lt;br /&gt;&lt;/p&gt;

    &lt;p&gt;Wszystkie meetupy w ciągu pierwszych dwóch lat z hakiem organizowaliśmy w kawiarni
  &lt;a href=&quot;http://panstwomiasto.pl/&quot;&gt;Państwomiasto&lt;/a&gt; przy ul. Generała Andersa 29
  (Śródmieście Północne). Było to świetne miejsce na spotkania towarzyskie.
  Z uwagi na rosnącą frekwencję musieliśmy podjąć jakieś kroki, aby zapewnić
  komfortowe warunki dla ok. 120 osób, którzy regularnie pojawiali się na eventach.
  Stąd podjęliśmy decyzję o zmianie miejsca.&lt;/p&gt;

    &lt;div class=&quot;gallery&quot;&gt;
      &lt;a href=&quot;/assets/photos/warsawjs/meetup-29/IMG_8260.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
          &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-29/IMG_8260.jpg&quot; alt=&quot;&quot; /&gt;
      &lt;/a&gt;
      &lt;a href=&quot;/assets/photos/warsawjs/meetup-29/IMG_8268.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
          &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-29/IMG_8268.jpg&quot; alt=&quot;&quot; /&gt;
      &lt;/a&gt;
      &lt;a href=&quot;/assets/photos/warsawjs/meetup-29/IMG_8280.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
          &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-29/IMG_8280.jpg&quot; alt=&quot;&quot; /&gt;
      &lt;/a&gt;
      &lt;a href=&quot;/assets/photos/warsawjs/meetup-29/IMG_8311.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
          &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-29/IMG_8311.jpg&quot; alt=&quot;&quot; /&gt;
      &lt;/a&gt;
  &lt;/div&gt;

    &lt;p&gt;Przenieśliśmy się do pięknego budynku Warsaw Spire usytuowanego pod adresem
  pl. Europejski 1, który na 4. piętrze mieścił restaurację “The Place”.&lt;/p&gt;

    &lt;p&gt;Dało się odczuć inny klimat. Po pierwsze forma współpracy z restauracją
  polegała na tym, że wynajmujemy całą przestrzeń. Stąd też w restauracji
  po godzinie 17:00 mogli przebywać tylko uczestnicy wydarzenia. Zrobiło
  się wtedy bardziej “profesjonalnie” (jeśli w ogóle można użyć takiego
  stwierdzenia w kontekście meetupu).&lt;/p&gt;

    &lt;p&gt;Nowa sala spokojnie mogła pomieścić nawet 150 osób w części konferencyjnej.
  Miało to swoje uroki. Jednym z nich był na pewno OGROMNY taras,
  na którym można śmiało zorganizować networking albo… inny meetup!&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;h2 id=&quot;wspieramy-wośp&quot;&gt;Wspieramy WOŚP&lt;/h2&gt;

&lt;p&gt;W 2017 roku wpadliśmy na pomysł, aby stworzyć licytację koszulki z logiem WarsawJS,
na rzecz Wielkiej Orkiestry Świątecznej Pomocy.&lt;/p&gt;

&lt;figure&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/thanks/t-shirt-wosp-2017.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/thanks/t-shirt-wosp-2017.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;figcaption&gt;
        Koszulka z podpisami społeczności
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Koszulka został sprzedana za ok. 300 zł dla Krzysztofa, która był ze sceny
poprosić społeczność aby każdy z osoba podpisał się na koszulce. Koszulka
została powieszona u Krzysztofa w biurze. Pieniądze zostały przekazane na WOŚP.&lt;/p&gt;

&lt;p&gt;Zdjęcia z &lt;a href=&quot;/blog/2017/05/17/warsawjs-meetup-30.html&quot;&gt;WarsawJS Meetup #30&lt;/a&gt;&lt;/p&gt;

&lt;div class=&quot;gallery&quot;&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-30/IMG_9461.JPG&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-30/IMG_9461.JPG&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-30/IMG_9597.JPG&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-30/IMG_9597.JPG&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-30/IMG_9607.JPG&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-30/IMG_9607.JPG&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-30/IMG_9743.JPG&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-30/IMG_9743.JPG&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
&lt;/div&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;h2 id=&quot;meetupy-w-the-place&quot;&gt;Meetupy w “The Place”&lt;/h2&gt;

&lt;div class=&quot;gallery&quot;&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-31/IMG_0013.JPG&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-31/IMG_0013.JPG&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-31/IMG_0118.JPG&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-31/IMG_0118.JPG&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-31/IMG_0298.JPG&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-31/IMG_0298.JPG&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-31/IMG_9984.JPG&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-31/IMG_9984.JPG&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;gallery&quot;&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-32/IMG_0418.JPG&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-32/IMG_0418.JPG&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-32/IMG_0489.JPG&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-32/IMG_0489.JPG&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-32/IMG_0553.JPG&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-32/IMG_0553.JPG&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-33/IMG_1156.JPG&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-33/IMG_1156.JPG&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;gallery&quot;&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-33/IMG_1325.JPG&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-33/IMG_1325.JPG&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-33/IMG_1383.JPG&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-33/IMG_1383.JPG&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-33/IMG_1488.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-33/IMG_1488.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-34/IMG_2012.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-34/IMG_2012.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;gallery&quot;&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-34/IMG_2017.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-34/IMG_2017.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-34/IMG_2031.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-34/IMG_2031.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-34/IMG_2047.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-34/IMG_2047.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-34/IMG_2056.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-34/IMG_2056.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
&lt;/div&gt;

&lt;figure&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-34/IMG_2164.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-34/IMG_2164.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;figcaption&gt;
        2/3 składu organizacyjnego
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;div class=&quot;gallery&quot;&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-34/IMG_2273.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-34/IMG_2273.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-34/IMG_2334.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-34/IMG_2334.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-35/WarsawJS-12.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-35/WarsawJS-12.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;gallery&quot;&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-35/WarsawJS_010.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-35/WarsawJS_010.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-35/WarsawJS_023.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-35/WarsawJS_023.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-35/WarsawJS_033.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-35/WarsawJS_033.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-35/WarsawJS_037.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-35/WarsawJS_037.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
&lt;/div&gt;

&lt;figure&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-35/WarsawJS_090-ULTRA.png&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-35/WarsawJS_090-ULTRA.png&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;figcaption&gt;
        Przed wydarzeniem. Organizatorzy i prelegenci.
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;div class=&quot;gallery&quot;&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-35/WarsawJS_050.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-35/WarsawJS_050.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-35/WarsawJS_058.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-35/WarsawJS_058.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-35/WarsawJS_097.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-35/WarsawJS_097.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
&lt;/div&gt;

&lt;figure&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-36/IMG_3393.JPG&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-36/IMG_3393.JPG&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;figcaption&gt;
        Nie wiem co tu się dzieje... ale kodziwo leci!&lt;br /&gt;
        Zdjęcie pewnie robione podczas jednego z moich lightning talków.
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;div class=&quot;gallery&quot;&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-36/IMG_3385.JPG&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-36/IMG_3385.JPG&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-36/IMG_3406.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-36/IMG_3406.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-36/IMG_3478.JPG&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-36/IMG_3478.JPG&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-36/IMG_3496.JPG&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-36/IMG_3496.JPG&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;gallery&quot;&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-36/IMG_3524.JPG&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-36/IMG_3524.JPG&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-36/IMG_3540.JPG&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-36/IMG_3540.JPG&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
&lt;/div&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;h3 id=&quot;workshop-prowadzony-samodzielnie--warsawjs-workshop-9--rxjs&quot;&gt;Workshop prowadzony samodzielnie — WarsawJS Workshop #9 — RxJS&lt;/h3&gt;

&lt;p&gt;&lt;small&gt;(2017-08-20)&lt;/small&gt;&lt;/p&gt;

&lt;p&gt;To szkolenie było dla mnie wyjątkowe. Pierwszy (i jak na razie ostatni)
raz zdarzyło się tak, że był tylko jeden trener — i dziwny los chciał,
że to ja zostałem tym samotnym trenerem. Liczba osób na szkoleniu była
bliska 50. To było najtrudniejsze szkolenie jakie miałem kiedykolwiek
w dziejach WarsawJS. Kilka dni przygotowań, kilka zadań przygotowanych
na potrzeby przekazywania wiedzy podczas szkolenia oraz tyle osób
na ogromnej sali słuchającej tylko mnie. To był hardcore.&lt;/p&gt;

&lt;div class=&quot;gallery&quot;&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/workshop-9/IMG_3629.JPG&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/workshop-9/IMG_3629.JPG&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/workshop-9/IMG_3672.JPG&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/workshop-9/IMG_3672.JPG&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
&lt;/div&gt;

&lt;p&gt;To wydarzenie było również niepowtarzalne pod tym kątem, że pojawiło się
nami wiele osób, które już znałem oraz te które poznałem w przyszłości.&lt;/p&gt;

&lt;p&gt;Można powiedzieć to, że to było najważniejsze szkolenie w historii WarsawJS.&lt;/p&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;h2 id=&quot;trzecie-urodziny-&quot;&gt;Trzecie urodziny 🎉&lt;/h2&gt;

&lt;p&gt;&lt;small&gt;(2017-09-13)&lt;/small&gt;&lt;/p&gt;

&lt;div class=&quot;gallery&quot;&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-37/1S2A6926.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-37/1S2A6926.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-37/1S2A6950.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-37/1S2A6950.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;gallery&quot;&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-37/1S2A7027.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-37/1S2A7027.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-37/1S2A7111.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-37/1S2A7111.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;gallery&quot;&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-37/1S2A7166.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-37/1S2A7166.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-37/1S2A7185.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-37/1S2A7185.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-37/1S2A7196.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-37/1S2A7196.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
&lt;/div&gt;

&lt;p&gt;To były zdecydowanie &lt;strong&gt;najlepsze urodziny ever&lt;/strong&gt;! Tym razem melodię do Sto Lat
zagrał nam DJ! Mieliśmy cudowne fioletowe światełka! Zdjęcia robił nam
świetny fotograf (pozdro Michał). Dodatkowo, na bębnach przygrywał nam pan
w skórzanej kamizelce — to był czaaad!&lt;/p&gt;

&lt;p&gt;Trudno wyobrazić sobie lepsze urodziny społeczności. Na wydarzenie przyszła
ogromna liczba osób! Była też mocna ekipa ode mnie z pracy! Zerknijcie sobie
na zdjęcia powyżej — pięknie! Wtedy byliśmy “mocni w te klocki”!&lt;/p&gt;

&lt;p&gt;Coś na oko, to było z 500 osób :-D&lt;/p&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;div class=&quot;gallery&quot;&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-38/IMG_6652.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-38/IMG_6652.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-38/IMG_6712.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-38/IMG_6712.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-38/IMG_6776.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-38/IMG_6776.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-38/IMG_6838.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-38/IMG_6838.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;gallery&quot;&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-39/IMG_7099.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-39/IMG_7099.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-39/IMG_7225.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-39/IMG_7225.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-39/IMG_7280.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-39/IMG_7280.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
&lt;/div&gt;

&lt;figure&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-39/IMG_7277.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-39/IMG_7277.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;figcaption&gt;
        Przyjaciele. Ekipa Hrubieszowska!&lt;br /&gt;Podczas #39 meetupu, mieliśmy silną
        reprezentację z naszego rodzinnego miasta.
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;div class=&quot;gallery&quot;&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-40/IMG_8121.JPG&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-40/IMG_8121.JPG&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-40/IMG_8149.JPG&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-40/IMG_8149.JPG&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-40/IMG_8163.JPG&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-40/IMG_8163.JPG&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;gallery&quot;&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-40/IMG_8186.JPG&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-40/IMG_8186.JPG&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-40/IMG_8198.JPG&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-40/IMG_8198.JPG&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
&lt;/div&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;h2 id=&quot;pierwsza-wzmianka-w-gazecie&quot;&gt;Pierwsza wzmianka w gazecie&lt;/h2&gt;

&lt;p&gt;&lt;small&gt;(2018-02-12)&lt;/small&gt;&lt;/p&gt;

&lt;p&gt;Ale się zdziwiłem, kiedy to przeczytałem o szkoleniach WarsawJS w gazecie,
w rozdziale poświęconym branży IT i jak do niej “wejść”.&lt;/p&gt;

&lt;figure&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/thanks/paper.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/thanks/paper.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;figcaption&gt;
        Artykuł w jakimś czasopiśmie o tym, jak wejść do branży IT.
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Obok naszej inicjatywy były także inne popularne organizacje takie jak:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://gocarrots.org/&quot;&gt;Geek Girls Carrots&lt;/a&gt;,
  &lt;a href=&quot;http://railsgirls.com/&quot;&gt;Rails Girls&lt;/a&gt;,
  &lt;a href=&quot;https://djangogirls.org/&quot;&gt;Django Girls&lt;/a&gt;,
  &lt;a href=&quot;http://www.girlswhotest.pl/&quot;&gt;Girls Who Test&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;/tag/devmeetings/&quot;&gt;DevMeetings&lt;/a&gt; (to tutaj pobierałem pierwsze nauki inżynierskie)&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://coderslab.pl/&quot;&gt;Coders Lab&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bardzo miło się czyta w gazecie o wydarzeniu, za które jest się odpowiedzialnym,
a które jest polecane przez niezależne podmioty. Uzupełniam motywację
do organizowania kolejnych workshopów!&lt;/p&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;p&gt;Rok 2018&lt;/p&gt;

&lt;div class=&quot;gallery&quot;&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-41/IMG_9872.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-41/IMG_9872.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-42/IMG_0408.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-42/IMG_0408.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
&lt;/div&gt;
&lt;div class=&quot;gallery&quot;&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-43/ZDJ005.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-43/ZDJ005.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-44/IMG_2492.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-44/IMG_2492.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
&lt;/div&gt;

&lt;p&gt;Po drodze pojawiło się 42-gie spotkanie. Dlaczego jest tak wyjątkowe?
Po pierwsze to ulubiona liczba Piotra Zientary, po drugie ta liczba to
&lt;a href=&quot;https://simple.wikipedia.org/wiki/42_(answer)&quot;&gt;odpowiedź na ostateczne pytanie o życie, wszechświat i wszystko&lt;/a&gt;.&lt;/p&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;ul class=&quot;flos&quot;&gt;
  &lt;li&gt;
    &lt;h3 id=&quot;2018-02-16&quot;&gt;2018-02-16&lt;/h3&gt;

    &lt;p&gt;&lt;strong&gt;Pierwszy hackathon — &lt;a href=&quot;https://edukaton.com/&quot;&gt;Edukaton 2018&lt;/a&gt;&lt;/strong&gt;&lt;br /&gt;&lt;/p&gt;

    &lt;p&gt;Razem z ekipą z Kids Code Fun oraz Techsoup Europe zorganizowaliśmy kilkudniowy
  hackathon. Tematem przewodnim wydarzenia była walka z fake news-ami.&lt;/p&gt;

    &lt;p&gt;Zadaniem uczestników było wyprodukowanie aplikacji dla osób najbardziej
  podatnych na oszustwa w sieci (tj. dzieci i osób starszych), które
  będą uczyć odporności na manipulację w internecie, jaką są np. fake news,
  phishing, oszustwa internetowe, clickbait, łańcuszki wyłudzające
  dane osobowe itp.&lt;/p&gt;

    &lt;p&gt;Wydarzenie zbiegło się z wdrożeniem dużego projektu z firmie w której
  wówczas pracowałem przez co czasu na odpoczynek nie było w ogóle.
  Miałem dwa zajęcia: Edukaton albo &lt;a href=&quot;https://ipla.tv&quot;&gt;ipla.tv&lt;/a&gt;.
  To był trudny czas dla mnie, ale także dla innych.&lt;/p&gt;

    &lt;p&gt;Projekt był “skazany” na sukces i tak też się zakończył. Po wydarzeniu,
  każdy mógł odetchnąć z ulgą, że to już koniec.&lt;/p&gt;

    &lt;p&gt;Z tego miejsca składam serdeczne podziękowania ekipie:&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;Van Anh Dam&lt;/li&gt;
      &lt;li&gt;Tomasz Dobrowolski&lt;/li&gt;
      &lt;li&gt;Karolina Wysocka&lt;/li&gt;
      &lt;li&gt;Katarzyna Grabowska&lt;/li&gt;
      &lt;li&gt;Piotr Zientara&lt;/li&gt;
      &lt;li&gt;oraz innym, którzy również przyczynili się do tego wydarzenia!&lt;/li&gt;
    &lt;/ul&gt;

    &lt;p&gt;Podczas tego wydarzenia mieliśmy możliwość współpracy z byłą Minister
  Cyfryzacji panią &lt;a href=&quot;https://pl.wikipedia.org/wiki/Anna_Stre%C5%BCy%C5%84ska&quot;&gt;Anną Streżyńską&lt;/a&gt;,
  którą zaprosiliśmy do Jury.&lt;/p&gt;

    &lt;p&gt;Zdjęcia w &lt;a href=&quot;https://www.facebook.com/pg/edukaton/photos/&quot;&gt;galerii na fanpage’u&lt;/a&gt;.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;h3 id=&quot;2018-10-10&quot;&gt;2018-10-10&lt;/h3&gt;

    &lt;p&gt;&lt;strong&gt;Nagrywanie wydarzenia WarsawJS Meetup #50&lt;/strong&gt;&lt;/p&gt;

    &lt;p&gt;Dlaczego to takie wyjątkowe? Ponieważ spotkanie nagrywałem pierwszy raz ja!
  49 minionych spotkań było nagrywanych przez &lt;strong&gt;Kamila Grabowskiego&lt;/strong&gt;.&lt;/p&gt;

    &lt;p&gt;Yeti, współpracować z Tobą, to była przyjemność!&lt;/p&gt;

    &lt;p&gt;Nie sądziłem, że nagrywanie wydarzeń, jest tak trudne logistycznie,
  jak i technicznie. Mogę śmiało powiedzieć, że podczas tego wydarzenia
  konfiguracja sprzętu mnie przerosła.&lt;/p&gt;

    &lt;p&gt;Chciałem z tego miejsca podziękować serdecznie &lt;strong&gt;Danielowi Szymankowi&lt;/strong&gt;,
  który pomógł mi w całym procesie. Thanks man!&lt;/p&gt;

    &lt;p&gt;Poniżej znajdziesz vlog z tego dnia:&lt;/p&gt;

    &lt;div class=&quot;youtube-lazy&quot; data-youtube-id=&quot;sL7-lil6BB4&quot;&gt;&lt;/div&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;h3 id=&quot;2018-10-28&quot;&gt;2018-10-28&lt;/h3&gt;

    &lt;p&gt;&lt;strong&gt;Pierwsza konferencja — &lt;a href=&quot;https://2018.confrontjs.com/&quot;&gt;ConFrontJS 2018&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

    &lt;p&gt;Stwierdziliśmy, że zrobimy konferencję, a co! To było jedno z trudniejszych
  wydarzeń jakie organizowaliśmy. Sporo rzeczy do załatwienia. Lista zadań
  nie miała końca. Założona frekwencja potwierdzona.&lt;/p&gt;

    &lt;div class=&quot;youtube-lazy&quot; data-youtube-id=&quot;v2fncJr-74Q&quot;&gt;&lt;/div&gt;

    &lt;p&gt;Najśmieszniejsze w tym wszystkim było to, że przygotowania do wydarzenia
  rozpoczęliśmy 3 miesiące wcześniej. Kto inny organizuje tak duże przedsięwzięcie
  w tak krótkim czasie? No chyba tylko zawodowcy, którzy mają już sztab ludzie
  ze zdefiniowanymi odpowiedzialnościami oraz doświadczenie w imprezach tego
  typu.&lt;/p&gt;

    &lt;figure class=&quot;full-width&quot;&gt;
      &lt;a href=&quot;/assets/photos/confrontjs/confrontjs-2018.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
          &lt;img data-src=&quot;/assets/photos/confrontjs/confrontjs-2018.jpg&quot; alt=&quot;&quot; /&gt;
      &lt;/a&gt;
  &lt;/figure&gt;

    &lt;p&gt;Podczas tego wydarzenia nawiązaliśmy współpracę z Barrym Solone, który
  był tzw. MC, tj. Master of Ceremony albo po prostu konferansjerem,
  czyli osobą z mikrofonem prowadzącą całe wydarzenie.
  Świetna charyzma i jego żart sceniczny nie dawały
  się zapomnieć, stąd też chcieliśmy “mieć” Barrego również na kolejnej
  konferencji.&lt;/p&gt;

    &lt;p&gt;Zdjęcia w &lt;a href=&quot;https://www.facebook.com/confrontjs/photos/?tab=album&amp;amp;album_id=1139586502875041&quot;&gt;galerii na fanpage’u&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;div class=&quot;gallery&quot;&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-45/IMG_4319.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-45/IMG_4319.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-46/IMG_4899.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-46/IMG_4899.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-47/IMG_6905.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-47/IMG_6905.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-48/IMG_8808.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-48/IMG_8808.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
&lt;/div&gt;

&lt;h2 id=&quot;czwarte-urodziny-&quot;&gt;Czwarte urodziny 🎉&lt;/h2&gt;

&lt;p&gt;&lt;small&gt;(2018-09-12)&lt;/small&gt;&lt;/p&gt;

&lt;div class=&quot;gallery&quot;&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-49/4lata_WarsawJS-130.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-49/4lata_WarsawJS-130.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-49/4lata_WarsawJS-139.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-49/4lata_WarsawJS-139.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;gallery&quot;&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-49/4lata_WarsawJS-161.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-49/4lata_WarsawJS-161.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-49/4lata_WarsawJS-3.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-49/4lata_WarsawJS-3.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
&lt;/div&gt;

&lt;p&gt;“Kolejne urodziny za nami” — tak sobie pomyślałem. Fajnie, że to już cztery lata
organizowania wydarzeń. Po tych latach pojawiły się w głowie myśli, że już chyba
wiemy jak się robi te wydarzenia ;)&lt;/p&gt;

&lt;p&gt;Mieliśmy torcik, który zjedliśmy razem ze społecznością.&lt;/p&gt;

&lt;p&gt;“Moja” ekipa z Cyfrowego Polsatu również nie zawiodła! Fajnie, było zobaczyć te
twarze, szczególnie po tych kilku miesiącach jakie minęły od kiedy zakończyłem
pracę w tej firmie.&lt;/p&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;div class=&quot;gallery&quot;&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-50/IMG_2115.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-50/IMG_2115.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-51/IMG_3786.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-51/IMG_3786.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-51/IMG_3915.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-51/IMG_3915.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
&lt;/div&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;ul class=&quot;flos&quot;&gt;
  &lt;li&gt;
    &lt;h3 id=&quot;2018-12-12&quot;&gt;2018-12-12&lt;/h3&gt;

    &lt;p&gt;&lt;strong&gt;Ostatni meetup w “The Place”&lt;/strong&gt;&lt;br /&gt;&lt;/p&gt;

    &lt;p&gt;Kilka dni przed wydarzeniem dowiedzieliśmy się, że restauracja zrywa umowę.
  Wszystko za sprawą zmiany właścicieli i innego planu na przestrzeń, którą
  wynajmowaliśmy. Całe szczęście mogliśmy zorganizować jeszcze jeden meetup.&lt;/p&gt;

    &lt;figure&gt;
      &lt;a href=&quot;/assets/photos/warsawjs/meetup-52/IMG_6278.JPG&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
          &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-52/IMG_6278.JPG&quot; alt=&quot;&quot; /&gt;
      &lt;/a&gt;
      &lt;figcaption&gt;
          Poznajcie mojego brata Pawła oraz jego syna Kordiana.
          Razem z chłopakami ogarnęliśmy kilka razy live streaming!
          Dzięki panowie za pomoc!&lt;br /&gt;
          Który jest najprzystojniejszy? W sumie to wiem, tak tylko pytam :)
      &lt;/figcaption&gt;
  &lt;/figure&gt;

    &lt;p&gt;Po wydarzeniu rozpoczęły się “szaleńcze” poszukiwania kolejnej sali.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;div class=&quot;gallery&quot;&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-53/IMG_7007.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-53/IMG_7007.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-54/IMG_8237.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-54/IMG_8237.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-54/IMG_8561.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-54/IMG_8561.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;gallery&quot;&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-55/IMG_0353.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-55/IMG_0353.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-56/IMG_1794.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-56/IMG_1794.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-56/IMG_2006.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-56/IMG_2006.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
&lt;/div&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;ul class=&quot;flos&quot;&gt;
  &lt;li&gt;
    &lt;h3 id=&quot;2019-04-09&quot;&gt;2019-04-09&lt;/h3&gt;

    &lt;p&gt;&lt;strong&gt;Pierwszy szkolenie komercyjne — WarsawJS MasterClass #1&lt;/strong&gt;&lt;/p&gt;

    &lt;p&gt;Po kilku latach organizowania wydarzeń dla społeczności, wpadliśmy na pomysł,
  aby spróbować zorganizować szkolenia komercyjne, których celem
  jest tzw. deep dive w dany temat. Szkolenia te są dla osób, które już posiadają
  wiedzę w danym obszarze, ale chcą “wejść” na wyższy poziom.&lt;/p&gt;

    &lt;p&gt;Trenerami zawsze były programiści ze sporym doświadczeniem w branży,
  a co najważniejsze mieli potwierdzone przez nas doświadczenie w przekazywaniu
  wiedzy.&lt;/p&gt;

    &lt;p&gt;W ciągu roku zorganizowaliśmy 10 tego typu szkoleń. Bardzo ciekawe
  doświadczenie organizowania dwudniowych wydarzeń. Trenerzy muszą rozkładać
  siły, a organizatorzy zaplanować wydarzenie na dłuższy czas.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;h2 id=&quot;warsawjs-w-himalajach&quot;&gt;WarsawJS w Himalajach!&lt;/h2&gt;

&lt;p&gt;&lt;small&gt;(2019-05-23)&lt;/small&gt;&lt;/p&gt;

&lt;p&gt;We czwartek rano, otrzymuję maila od załącznikiem od jednego z trenerów.
Przeglądam załączniki, a tem logo WarsawJS na piersi, pośród gór!&lt;/p&gt;

&lt;figure&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/thanks/robert-gurgul.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/thanks/robert-gurgul.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;figcaption&gt;
        Jeden z naszych stałych uczestników meetupów oraz kilkukrotny trener
        i prelegent, Robert, wyruszył w podbój Himalajów w koszulce WarsawJS!
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Piękny to widok, logo WarsawJS w górach!&lt;/p&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;div class=&quot;gallery&quot;&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-57/IMG_3062.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-57/IMG_3062.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-58/IMG_4846.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-58/IMG_4846.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-59/IMG_6478.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-59/IMG_6478.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;gallery&quot;&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-59/IMG_6498.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-59/IMG_6498.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-59/IMG_6684.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-59/IMG_6684.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-60/IMG_0251.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-60/IMG_0251.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-60/IMG_0258.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-60/IMG_0258.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-60/IMG_0505.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-60/IMG_0505.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
&lt;/div&gt;

&lt;h2 id=&quot;piąte-urodziny-&quot;&gt;Piąte urodziny 🎉&lt;/h2&gt;

&lt;p&gt;&lt;small&gt;(2019-09-11)&lt;/small&gt;&lt;/p&gt;

&lt;div class=&quot;gallery&quot;&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-61/S2A3486.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-61/S2A3486.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-61/S2A3492.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-61/S2A3492.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-61/S2A3517.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-61/S2A3517.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
&lt;/div&gt;

&lt;p&gt;To wydarzenie przejdzie do historii. Po kilku miesiącach organizowania
wydarzeń w Golden Floor w tej samej sali, nagle to jedno wydarzenie
miało być zorganizowane w zupełnie inne sali. Nie spodziewaliśmy się tego,
że pojawią się takie problemy techniczne. W sali dostępny był tylko jeden mikrofon
oraz jeden głośnik, z brakiem możliwości podłączenia się ze sprzętem,
aby zbierać sygnał audio. Gdybyśmy niczego nie załatwili to live streaming
(oraz materiały) z tego wydarzenia miałyby audio z sali — czyli kiepską jakość.&lt;/p&gt;

&lt;p&gt;20 minutowe opóźnienie jakie wtedy zaliczyliśmy było spowodowane podłączeniem nowego
audio mixera, który udało się nam pozyskać 5 minut przed rozpoczęciem wydarzenia.
Jestem wdzięczny Michałowi (naszemu fotografowi), który uratował nas
i skonfigurował mixer w ekstremalnym czasie!&lt;/p&gt;

&lt;p&gt;Jak zwykle mieliśmy tort, a nawet znalazła się butelka szampana!
Dziękujemy Golden Floor za pomoc w krojeniu i generalnie obsłudze podczas
takiego “specjalnego” wydarzenia.&lt;/p&gt;

&lt;figure&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-61/S2A3565.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-61/S2A3565.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;figcaption&gt;
        Społeczność! Piękny kadr, pozwala na ujrzenie części społeczności,&lt;br /&gt;
        która regularnie pojawiała się na wydarzeniach!
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Wydarzenie (ta oficjalna część) zakończyła się koncertem Barrego Solone,
który od czasu do czasu występował na scenie w roli konferansjera.&lt;/p&gt;

&lt;p&gt;Barry ma przepotężny głos, bardzo lubię go słuchać i oglądać.
Ten facet ma niesamowitą charyzmę! Ciekawostka: Barry kilka lat temu wystąpił
w jednym z odcinków serialu &lt;a href=&quot;https://www.youtube.com/watch?v=p14YqQjw680&quot;&gt;Londyńczycy&lt;/a&gt;.&lt;/p&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;p&gt;Rok 2019&lt;/p&gt;

&lt;div class=&quot;gallery&quot;&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-62/IMG_3479.JPG&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-62/IMG_3479.JPG&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-63/IMG_3866.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-63/IMG_3866.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-64/IMG_6148.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-64/IMG_6148.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
&lt;/div&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;ul class=&quot;flos&quot;&gt;
  &lt;li&gt;
    &lt;h3 id=&quot;2019-12-07&quot;&gt;2019-12-07&lt;/h3&gt;

    &lt;p&gt;&lt;strong&gt;Druga konferencja — &lt;a href=&quot;https://2019.confrontjs.com/&quot;&gt;ConFrontJS 2019&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

    &lt;p&gt;To było coś! Największe wydarzenie jakie organizowaliśmy!&lt;/p&gt;

    &lt;figure class=&quot;full-width&quot;&gt;
      &lt;a href=&quot;/assets/photos/confrontjs/confrontjs-2019.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
          &lt;img data-src=&quot;/assets/photos/confrontjs/confrontjs-2019.jpg&quot; alt=&quot;&quot; /&gt;
      &lt;/a&gt;
  &lt;/figure&gt;

    &lt;p&gt;Prawie 300 uczestników, 17 prelegentów oraz 18 wolontariuszy!
  To tylko niektóre liczby, które opisują z jakim rozmachem było zorganizowane
  to wydarzenie. Całe wydarzenie prowadził Barry Solone. Znacie Barrego
  z poprzedniej edycji konferencji, ale także z niektórych meetupów, które
  prowadził.&lt;/p&gt;

    &lt;p&gt;Przygotowanie do wydarzenia rozpoczęliśmy tym razem 4 miesiące przed wydarzeniem.
  Podjęliśmy decyzję, że chcemy podwoić liczbę uczestników! To było dopiero
  wyzwanie. Wyciągnęliśmy wnioski z pierwszej edycji i dzięki temu, mieliśmy
  zorganizować jeszcze lepszą konferencję. I taka też była! Średnia ocen
  w ankietach była wyższa niż przed rokiem. Brawo!&lt;/p&gt;

    &lt;p&gt;Podczas tego wydarzenia byłem człowiekiem orkiestrą: nagrywanie wydarzenia,
  nagrywanie wywiadów, nagrywanie aftermovie itd. Zobaczcie podsumowanie
  tego wydarzenia w telegraficznym skrócie:&lt;/p&gt;

    &lt;div class=&quot;youtube-lazy&quot; data-youtube-id=&quot;oD2VDhAP-ag&quot;&gt;&lt;/div&gt;

    &lt;p&gt;Tym razem liczba zadań była przeogromna — to jakby liczbę zadań z meetupu,
  oraz workshopu scalić i pomnożyć dwa razy. Praca całymi dniami dała nam w kość.&lt;/p&gt;

    &lt;p&gt;&lt;em&gt;To był najtrudniejszy event jaki zorganizowaliśmy.&lt;/em&gt;
  &lt;em&gt;Grudzień 2019, to był miesiąc który nas zmienił.&lt;/em&gt;&lt;/p&gt;

    &lt;p&gt;Zerknijcie tylko na ten timeline:&lt;/p&gt;

    &lt;figure class=&quot;social-center-block&quot;&gt;
      &lt;blockquote class=&quot;instagram-media&quot; data-instgrm-permalink=&quot;https://www.instagram.com/p/B5m04mOgInO/?utm_source=ig_embed&amp;amp;utm_campaign=loading&quot; data-instgrm-version=&quot;12&quot; style=&quot; background:#FFF; border:0; border-radius:3px; box-shadow:0 0 1px 0 rgba(0,0,0,0.5),0 1px 10px 0 rgba(0,0,0,0.15); margin: 1px; max-width:540px; min-width:326px; padding:0; width:99.375%; width:-webkit-calc(100% - 2px); width:calc(100% - 2px);&quot;&gt;&lt;div style=&quot;padding:16px;&quot;&gt; &lt;a href=&quot;https://www.instagram.com/p/B5m04mOgInO/?utm_source=ig_embed&amp;amp;utm_campaign=loading&quot; style=&quot; background:#FFFFFF; line-height:0; padding:0 0; text-align:center; text-decoration:none; width:100%;&quot; target=&quot;_blank&quot;&gt; &lt;div style=&quot; display: flex; flex-direction: row; align-items: center;&quot;&gt; &lt;div style=&quot;background-color: #F4F4F4; border-radius: 50%; flex-grow: 0; height: 40px; margin-right: 14px; width: 40px;&quot;&gt;&lt;/div&gt; &lt;div style=&quot;display: flex; flex-direction: column; flex-grow: 1; justify-content: center;&quot;&gt; &lt;div style=&quot; background-color: #F4F4F4; border-radius: 4px; flex-grow: 0; height: 14px; margin-bottom: 6px; width: 100px;&quot;&gt;&lt;/div&gt; &lt;div style=&quot; background-color: #F4F4F4; border-radius: 4px; flex-grow: 0; height: 14px; width: 60px;&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style=&quot;padding: 19% 0;&quot;&gt;&lt;/div&gt; &lt;div style=&quot;display:block; height:50px; margin:0 auto 12px; width:50px;&quot;&gt;&lt;svg width=&quot;50px&quot; height=&quot;50px&quot; viewBox=&quot;0 0 60 60&quot; version=&quot;1.1&quot; xmlns=&quot;https://www.w3.org/2000/svg&quot; xmlns:xlink=&quot;https://www.w3.org/1999/xlink&quot;&gt;&lt;g stroke=&quot;none&quot; stroke-width=&quot;1&quot; fill=&quot;none&quot; fill-rule=&quot;evenodd&quot;&gt;&lt;g transform=&quot;translate(-511.000000, -20.000000)&quot; fill=&quot;#000000&quot;&gt;&lt;g&gt;&lt;path d=&quot;M556.869,30.41 C554.814,30.41 553.148,32.076 553.148,34.131 C553.148,36.186 554.814,37.852 556.869,37.852 C558.924,37.852 560.59,36.186 560.59,34.131 C560.59,32.076 558.924,30.41 556.869,30.41 M541,60.657 C535.114,60.657 530.342,55.887 530.342,50 C530.342,44.114 535.114,39.342 541,39.342 C546.887,39.342 551.658,44.114 551.658,50 C551.658,55.887 546.887,60.657 541,60.657 M541,33.886 C532.1,33.886 524.886,41.1 524.886,50 C524.886,58.899 532.1,66.113 541,66.113 C549.9,66.113 557.115,58.899 557.115,50 C557.115,41.1 549.9,33.886 541,33.886 M565.378,62.101 C565.244,65.022 564.756,66.606 564.346,67.663 C563.803,69.06 563.154,70.057 562.106,71.106 C561.058,72.155 560.06,72.803 558.662,73.347 C557.607,73.757 556.021,74.244 553.102,74.378 C549.944,74.521 548.997,74.552 541,74.552 C533.003,74.552 532.056,74.521 528.898,74.378 C525.979,74.244 524.393,73.757 523.338,73.347 C521.94,72.803 520.942,72.155 519.894,71.106 C518.846,70.057 518.197,69.06 517.654,67.663 C517.244,66.606 516.755,65.022 516.623,62.101 C516.479,58.943 516.448,57.996 516.448,50 C516.448,42.003 516.479,41.056 516.623,37.899 C516.755,34.978 517.244,33.391 517.654,32.338 C518.197,30.938 518.846,29.942 519.894,28.894 C520.942,27.846 521.94,27.196 523.338,26.654 C524.393,26.244 525.979,25.756 528.898,25.623 C532.057,25.479 533.004,25.448 541,25.448 C548.997,25.448 549.943,25.479 553.102,25.623 C556.021,25.756 557.607,26.244 558.662,26.654 C560.06,27.196 561.058,27.846 562.106,28.894 C563.154,29.942 563.803,30.938 564.346,32.338 C564.756,33.391 565.244,34.978 565.378,37.899 C565.522,41.056 565.552,42.003 565.552,50 C565.552,57.996 565.522,58.943 565.378,62.101 M570.82,37.631 C570.674,34.438 570.167,32.258 569.425,30.349 C568.659,28.377 567.633,26.702 565.965,25.035 C564.297,23.368 562.623,22.342 560.652,21.575 C558.743,20.834 556.562,20.326 553.369,20.18 C550.169,20.033 549.148,20 541,20 C532.853,20 531.831,20.033 528.631,20.18 C525.438,20.326 523.257,20.834 521.349,21.575 C519.376,22.342 517.703,23.368 516.035,25.035 C514.368,26.702 513.342,28.377 512.574,30.349 C511.834,32.258 511.326,34.438 511.181,37.631 C511.035,40.831 511,41.851 511,50 C511,58.147 511.035,59.17 511.181,62.369 C511.326,65.562 511.834,67.743 512.574,69.651 C513.342,71.625 514.368,73.296 516.035,74.965 C517.703,76.634 519.376,77.658 521.349,78.425 C523.257,79.167 525.438,79.673 528.631,79.82 C531.831,79.965 532.853,80.001 541,80.001 C549.148,80.001 550.169,79.965 553.369,79.82 C556.562,79.673 558.743,79.167 560.652,78.425 C562.623,77.658 564.297,76.634 565.965,74.965 C567.633,73.296 568.659,71.625 569.425,69.651 C570.167,67.743 570.674,65.562 570.82,62.369 C570.966,59.17 571,58.147 571,50 C571,41.851 570.966,40.831 570.82,37.631&quot;&gt;&lt;/path&gt;&lt;/g&gt;&lt;/g&gt;&lt;/g&gt;&lt;/svg&gt;&lt;/div&gt;&lt;div style=&quot;padding-top: 8px;&quot;&gt; &lt;div style=&quot; color:#3897f0; font-family:Arial,sans-serif; font-size:14px; font-style:normal; font-weight:550; line-height:18px;&quot;&gt; Wyświetl ten post na Instagramie.&lt;/div&gt;&lt;/div&gt;&lt;div style=&quot;padding: 12.5% 0;&quot;&gt;&lt;/div&gt; &lt;div style=&quot;display: flex; flex-direction: row; margin-bottom: 14px; align-items: center;&quot;&gt;&lt;div&gt; &lt;div style=&quot;background-color: #F4F4F4; border-radius: 50%; height: 12.5px; width: 12.5px; transform: translateX(0px) translateY(7px);&quot;&gt;&lt;/div&gt; &lt;div style=&quot;background-color: #F4F4F4; height: 12.5px; transform: rotate(-45deg) translateX(3px) translateY(1px); width: 12.5px; flex-grow: 0; margin-right: 14px; margin-left: 2px;&quot;&gt;&lt;/div&gt; &lt;div style=&quot;background-color: #F4F4F4; border-radius: 50%; height: 12.5px; width: 12.5px; transform: translateX(9px) translateY(-18px);&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style=&quot;margin-left: 8px;&quot;&gt; &lt;div style=&quot; background-color: #F4F4F4; border-radius: 50%; flex-grow: 0; height: 20px; width: 20px;&quot;&gt;&lt;/div&gt; &lt;div style=&quot; width: 0; height: 0; border-top: 2px solid transparent; border-left: 6px solid #f4f4f4; border-bottom: 2px solid transparent; transform: translateX(16px) translateY(-4px) rotate(30deg)&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style=&quot;margin-left: auto;&quot;&gt; &lt;div style=&quot; width: 0px; border-top: 8px solid #F4F4F4; border-right: 8px solid transparent; transform: translateY(16px);&quot;&gt;&lt;/div&gt; &lt;div style=&quot; background-color: #F4F4F4; flex-grow: 0; height: 12px; width: 16px; transform: translateY(-4px);&quot;&gt;&lt;/div&gt; &lt;div style=&quot; width: 0; height: 0; border-top: 8px solid #F4F4F4; border-left: 8px solid transparent; transform: translateY(-4px) translateX(8px);&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt; &lt;div style=&quot;display: flex; flex-direction: column; flex-grow: 1; justify-content: center; margin-bottom: 24px;&quot;&gt; &lt;div style=&quot; background-color: #F4F4F4; border-radius: 4px; flex-grow: 0; height: 14px; margin-bottom: 6px; width: 224px;&quot;&gt;&lt;/div&gt; &lt;div style=&quot; background-color: #F4F4F4; border-radius: 4px; flex-grow: 0; height: 14px; width: 144px;&quot;&gt;&lt;/div&gt;&lt;/div&gt;&lt;/a&gt;&lt;p style=&quot; color:#c9c8cd; font-family:Arial,sans-serif; font-size:14px; line-height:17px; margin-bottom:0; margin-top:8px; overflow:hidden; padding:8px 0 7px; text-align:center; text-overflow:ellipsis; white-space:nowrap;&quot;&gt;&lt;a href=&quot;https://www.instagram.com/p/B5m04mOgInO/?utm_source=ig_embed&amp;amp;utm_campaign=loading&quot; style=&quot; color:#c9c8cd; font-family:Arial,sans-serif; font-size:14px; font-style:normal; font-weight:normal; line-height:17px; text-decoration:none;&quot; target=&quot;_blank&quot;&gt;Post udostępniony przez WarsawJS (@warsawjs.photos)&lt;/a&gt; &lt;time style=&quot; font-family:Arial,sans-serif; font-size:14px; line-height:17px;&quot; datetime=&quot;2019-12-03T10:18:58+00:00&quot;&gt;Gru 3, 2019 o 2:18 PST&lt;/time&gt;&lt;/p&gt;&lt;/div&gt;&lt;/blockquote&gt; &lt;script async=&quot;&quot; src=&quot;//www.instagram.com/embed.js&quot;&gt;&lt;/script&gt;
  &lt;/figure&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;p&gt;Rok 2020&lt;/p&gt;

&lt;div class=&quot;gallery&quot;&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-65/IMG_6726.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-65/IMG_6726.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-65/IMG_6844.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-65/IMG_6844.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-66/IMG_7282.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-66/IMG_7282.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;gallery&quot;&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-66/IMG_7322.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-66/IMG_7322.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/meetup-67/IMG_7748.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/meetup-67/IMG_7748.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
&lt;/div&gt;

&lt;h2 id=&quot;szkolenia--warsawjs-workshop&quot;&gt;Szkolenia — WarsawJS Workshop&lt;/h2&gt;

&lt;figure&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/workshop-2/IMG_8717.JPG&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/workshop-2/IMG_8717.JPG&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;figcaption&gt;
        Mocna ekipa z drugiego szkolenia, które było poświęcone językowi JavaScript.
        Nie ma nic piękniejszego, niż współpraca z ludźmi, którzy są
        zaangażowani.
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;div class=&quot;gallery&quot;&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/workshop-2/IMG_7751.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/workshop-2/IMG_7751.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/workshop-3/IMG_9261.JPG&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/workshop-3/IMG_9261.JPG&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/workshop-3/IMG_9324.JPG&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/workshop-3/IMG_9324.JPG&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/workshop-4/IMG_9936.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/workshop-4/IMG_9936.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
&lt;/div&gt;

&lt;figure&gt;
    &lt;div class=&quot;youtube-lazy&quot; data-youtube-id=&quot;TLOBo7rYsRI&quot;&gt;&lt;/div&gt;
    &lt;figcaption&gt;
        Podsumowanie wydarzenia przez trenera WarsawJS Workshop #5
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;div class=&quot;gallery&quot;&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/workshop-6/IMG_1982.JPG&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/workshop-6/IMG_1982.JPG&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/workshop-7/IMG_2607.JPG&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/workshop-7/IMG_2607.JPG&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
&lt;/div&gt;

&lt;figure&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/workshop-12/IMG_7394.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/workshop-12/IMG_7394.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;figcaption&gt;
        Jedno z moich ulubionych zdjęć. Prosto z Matrixa!
        Wiecie dlaczego tak dobrze tutaj wyglądam? Bo szkoliłem ludzi
        z pasją. Kiedy wkładasz w coś serce, to nie ważne, że czegoś nie wiesz,
        najważniejsze, że się starasz! To te starania są tak cenne dla innych.
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;div class=&quot;gallery&quot;&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/workshop-15/IMG_9670_CROP.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/workshop-15/IMG_9670_CROP.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/workshop-18/IMG_1865.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/workshop-18/IMG_1865.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/workshop-19/IMG_2973.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/workshop-19/IMG_2973.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;gallery&quot;&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/workshop-21/IMG_5450.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/workshop-21/IMG_5450.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/workshop-22/IMG_0113.JPG&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/workshop-22/IMG_0113.JPG&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/workshop-23/IMG_0213.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/workshop-23/IMG_0213.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/workshop-24/IMG_1375.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/workshop-24/IMG_1375.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
&lt;/div&gt;

&lt;figure&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/workshop-25/IMG_1759.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/workshop-25/IMG_1759.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;figcaption&gt;
        Och! Szkolenia to frajda sama w sobie. Tyle ludzie w jednym miejscu,
        którzy chcą się rozwijać jako inżynierzy kodu! Było wspaniale być,
        częścią ekipy, która to wszystko rozkręcała!
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;div class=&quot;gallery&quot;&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/workshop-26/IMG_4944.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/workshop-26/IMG_4944.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/workshop-27/IMG_6096.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/workshop-27/IMG_6096.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/workshop-28/IMG_7297.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/workshop-28/IMG_7297.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/workshop-29/IMG_9739.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/workshop-29/IMG_9739.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;gallery&quot;&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/workshop-30/IMG_0654.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/workshop-30/IMG_0654.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/workshop-31/IMG_1557.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/workshop-31/IMG_1557.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/workshop-33/IMG_5984.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/workshop-33/IMG_5984.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
&lt;/div&gt;

&lt;figure&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/workshop-32/IMG_4547.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/workshop-32/IMG_4547.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;figcaption&gt;
        A tak wyglądała ekipa podczas szkolenia z React.js dla zaawansowanych.
        Serdeczne podziękowania dla trenerów regularnych i trenerów
        wspomagających.
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;div class=&quot;gallery&quot;&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/workshop-34/IMG_9986.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/workshop-34/IMG_9986.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/workshop-35/IMG_1152.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/workshop-35/IMG_1152.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/workshop-36/IMG_3339.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/workshop-36/IMG_3339.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
&lt;/div&gt;

&lt;figure&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/workshop-37/IMG_3716.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/workshop-37/IMG_3716.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;figcaption&gt;
        W drugiej połowie 2019 roku wszystkie szkolenia były organizowane
        w siedzibie firmy &lt;a href=&quot;https://www.sumologic.com/&quot;&gt;Sumo Logic&lt;/a&gt;.
        Lepszego biura w tym mieście nie widziałem.
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;div class=&quot;gallery&quot;&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/workshop-38/IMG_5027.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/workshop-38/IMG_5027.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/workshop-39/IMG_6135.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/workshop-39/IMG_6135.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
&lt;/div&gt;

&lt;div class=&quot;gallery&quot;&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/workshop-40/IMG_7020.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/workshop-40/IMG_7020.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/workshop-41/IMG_7618.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/workshop-41/IMG_7618.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
&lt;/div&gt;

&lt;h3 id=&quot;a-jak-wyglądał-42-workshop&quot;&gt;A jak wyglądał 42. workshop?&lt;/h3&gt;

&lt;p&gt;Z przykrością muszę stwierdzić, że tego wydarzenia nie było.
To pierwsze wydarzenie w całej historii WarsawJS, które zostało odwołane.&lt;/p&gt;

&lt;p&gt;Jest mi bardzo przykro, ale pandemia zrobiła swoje. Nie udźwignęliśmy
tych wszystkich zmian, jakie zgotowałaby nam organizacja wydarzenia
w formie online.&lt;/p&gt;

&lt;p&gt;Szkoda, że akurat workshop z takim numerem się nie odbył (już wcześniej
wspominałem dlaczego ta liczba jest taka ważna).&lt;/p&gt;

&lt;h3 id=&quot;wydarzenia-online&quot;&gt;Wydarzenia online&lt;/h3&gt;

&lt;p&gt;Jak sami dobrze wiecie na początku 2020 roku, na świecie pojawił się groźny
wirus. Pierwszy raz w ciągu mojego 30-letniego życia wprowadzony był stan
pandemii na całym świecie.&lt;/p&gt;

&lt;p&gt;W kwietniu oraz maju zorganizowaliśmy następujące wydarzenia online:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;WarsawJS Meetup #68&lt;/li&gt;
  &lt;li&gt;WarsawJS Meetup #69&lt;/li&gt;
  &lt;li&gt;WarsawJS Workshop #43&lt;/li&gt;
  &lt;li&gt;WarsawJS Workshop #44&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Formuła online jest o tyle korzystna dla społeczności, że nie trzeba poświęcać
czasu na dotarcie do miejsca wydarzenia. To spory plus. Niestety, forma online
utrudnia nawiązywanie nowych znajomości.&lt;/p&gt;

&lt;h2 id=&quot;czy-warto-być-organizatorem&quot;&gt;Czy warto być organizatorem?&lt;/h2&gt;

&lt;p&gt;Tak, warto!&lt;/p&gt;

&lt;h3 id=&quot;doświadczenie-w-organizowaniu-wydarzeń&quot;&gt;Doświadczenie w organizowaniu wydarzeń&lt;/h3&gt;

&lt;p&gt;Organizowanie wydarzeń publicznych niesie za sobą wiele niewiadomych.
Kiedy organizujesz kolację i zapraszasz gości to z dużą dozą prawdopodobieństwa
wiesz ile osób przyjdzie. Niestety przy organizacji wydarzeń publicznych,
jest to jedna wielka niewiadoma.&lt;/p&gt;

&lt;p&gt;Po kilku latach korzystania z platformy &lt;a href=&quot;https://meetup.com/warsawjs&quot;&gt;meetup.com&lt;/a&gt;
zauważyliśmy, że liczba osób, które potwierdziły swoje przybycie nie zgadza
się z liczbą osób podczas wydarzenia. Zawsze było tak, że gdy 200 osób potwierdza
przybycie, to w rzeczywistości pojawia się ok. 60-70%. Aczkolwiek kiedy pierwszy
raz potwierdziło się 200 osób, to mieliśmy stracha “Co mamy zrobić, jeśli faktycznie
tyle osób przyjdzie na wydarzenie?”.&lt;/p&gt;

&lt;p&gt;Czy to, że wydarzenia były organizowane dla społeczności programistów
miało jakieś znaczenie? Hmm, trudno powiedzieć.&lt;/p&gt;

&lt;h3 id=&quot;pozyskiwanie-osób-zainteresowanych-występem-na-scenie-w-roli-speakera-lub-trenera&quot;&gt;Pozyskiwanie osób zainteresowanych występem na scenie w roli speakera lub trenera&lt;/h3&gt;

&lt;p&gt;Muszę się Wam do czegoś przyznać. Od początku istnienia WarsawJS, nigdy
nie poszukiwaliśmy osób do prowadzenia prelekcji. Po pierwszym wydarzeniu,
mieliśmy już zarezerwowane 4 kolejne sloty. Z każdym wydarzeniem liczba
osób zainteresowanych wyjściem na scenę się zwiększała.&lt;/p&gt;

&lt;p&gt;Dziś, jeśli chcesz wyjść na scenę, to szykuj się na termin oddalony o 9 miesięcy.&lt;/p&gt;

&lt;p&gt;Inaczej to miało miejsce z trenerami. Tutaj wymagany jest większy wysiłek.
Pierwszy wydarzenia były trudne pod tym kątem, aż do takiego stopnia,
że 9. workshop prowadziłem jako jedyny trener podczas gdy na sali było 50 osób (sic!).&lt;/p&gt;

&lt;p&gt;Dziś sytuacja jest poprawia i z uwagi na to, że zaplanowaliśmy terminy
oraz tematy szkoleń na cały rok, trenerzy wyrażają swoje zainteresowanie
szkolenia, które będą za kilka miesięcy. Uważam, że taka strategia jest dobra,
szkoda, że dopiero po trzech latach została wprowadzona — człowiek ciągle się uczy!&lt;/p&gt;

&lt;h3 id=&quot;możliwość-poznania-innych-organizatorów&quot;&gt;Możliwość poznania innych organizatorów&lt;/h3&gt;

&lt;p&gt;W początkach budowania społeczności pomagała nam grupa innych organizatorów.
Grupa Warsaw Meta Meetup, która miała wówczas regularne spotkania,
gościła mnie niejednokrotnie, przez co mogłem nawiązać dobre relacje z organizatorami
meetupów innych języków programowania, lub też z osobami organizującymi
wydarzenia zupełnie nietechniczne.&lt;/p&gt;

&lt;p&gt;Dziś taka grupa już praktycznie nie istnieje. Gdzieś to wszystko się zatraciło,
i teraz każdy “sam sobie rzepkę skrobie”. Takie spotkania były dla nas
bardzo pomocne — na początkowym etapie nie wiedzieliśmy za dużo w temacie
organizowania publicznych wydarzeń.&lt;/p&gt;

&lt;h2 id=&quot;podziękowania-️&quot;&gt;Podziękowania 💛❤️&lt;/h2&gt;

&lt;p&gt;Chciałem podziękować każdej osobie z osobna, która przyczyniła się do tego,
aby wydarzenia spod szyldu “WarsawJS” dążyły do doskonałości!&lt;/p&gt;

&lt;h3 id=&quot;dla-społeczności&quot;&gt;…dla Społeczności&lt;/h3&gt;

&lt;p&gt;Droga Społeczności! (tak zawsze zwracałem się do Was w social mediach)
Dziękuję Wam, że często byliście wyrozumiali i przymykaliście oko na problemy,
których nie dało się nie zauważyć. Wszelkie kwestie techniczne, przez
które niejedna osoba narzekała, bardzo brałem do siebie. W dzisiejszych
czasach można tak skonfigurować urządzenia, że nie powinniście być świadkami
tych wszystkich problemów, które się zdarzyły.&lt;/p&gt;

&lt;p&gt;Dziękuję Wam, za te chwile otuchy i wsparcia w trudnych momentach.
Kiedy w moim organizmie poziom stresu sięgał zenitu, to z Waszej strony
mogłem usłyszeć “Piotr, jest dobrze, wyluzuj” — takie słowa mnie zawsze
trochę uspokajały.&lt;/p&gt;

&lt;p&gt;Cieszę się, że poznałem tyle fantastycznych osób. Mój sposób bycia
pomagał mi szybko nawiązać nowe znajomości. W ciągu jednego wydarzenia
poznawałem tak duże ilości osób, że momentami, ciężko było zapamiętać
wszystkie imiona! :)&lt;/p&gt;

&lt;p&gt;Ze społeczności wykrystalizowały się również stałe związki, na które spoglądałem
z boku i im kibicowałem. Zwrócę się teraz do Was: jestem szczęśliwy, że miałem
delikatny wkład w wasze życie. Trzymam kciuki i wierzę, że będziecie kiedyś
swoim wnukom opowiadać, gdzie się poznaliście.&lt;/p&gt;

&lt;p&gt;W tym miejscu nie może zabraknąć podziękowań dla prelegentów oraz trenerów,
którzy odgrywali kluczowe role podczas wydarzeń. To na nich skupiała się największa
uwaga, bo to “dla nich” zbierała się cała społeczność.&lt;/p&gt;

&lt;h3 id=&quot;dla-sponsorów&quot;&gt;…dla Sponsorów&lt;/h3&gt;

&lt;p&gt;Drodzy Sponsorzy! To dzięki Wam mieliśmy fundusze i możliwości na rozwój
wydarzeń organizowanych pod szyldem WarsawJS! Chciałem Wam podziękować
za zaufanie oraz za budowanie społeczności!&lt;/p&gt;

&lt;p&gt;Jedna z firm, wspierała WarsawJS od samego początku — firma 10Clouds!
To jest niesamowite, że od tych ponad 5 (a prawie już 6) lat jest firma,
która tak mocno w nas wierzy! Szacun!&lt;/p&gt;

&lt;h3 id=&quot;dla-wolontariuszy&quot;&gt;…dla Wolontariuszy&lt;/h3&gt;

&lt;p&gt;Drogi Wolontariusze, często nam pomagaliście. Trudno jest opisać, jak fajnie
było organizować wspólnie wydarzenia. Wasza pomoc często była niezastąpiona.
To dzięki Wam mogliśmy zdecentralizować realizację zadań, przez co każdy,
mógł więcej serca włożyć w swoje zadania.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Kinga Wigurska-Bąk&lt;/li&gt;
  &lt;li&gt;Natalia Kędziora&lt;/li&gt;
  &lt;li&gt;Tati Platonova&lt;/li&gt;
  &lt;li&gt;Michał Szymczak&lt;/li&gt;
  &lt;li&gt;Tomasz Budrewicz&lt;/li&gt;
  &lt;li&gt;Mirek Stasiak&lt;/li&gt;
&lt;/ul&gt;

&lt;figure&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/workshop-20/IMG_4526.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/workshop-20/IMG_4526.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;figcaption&gt;
        W byciu wolontariuszem ważne jest dobrze się bawić!
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Po kilku latach pojawiły się “świeże twarze”, które również wkładały swoje
serce w pomoc przy budowaniu wydarzeń dla społeczności. Bardzo Wam dziękuję
za to, że tak płynnie przechodziliście do zadań. Dziękuję Wam za pomoc.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Anna Lukianova&lt;/li&gt;
  &lt;li&gt;Łukasz Basaj&lt;/li&gt;
&lt;/ul&gt;

&lt;figure&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/workshop-38/IMG_4955.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/workshop-38/IMG_4955.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
    &lt;figcaption&gt;
        Och! Co tu się dzieje! Czy ja właśnie używam jQuery do dodawania liczb?
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Przez te kilka lat organizowania wydarzeń miałem okazję współpracować z różnymi osobami,
od których nauczyłem się wiele. Nie sposób jest wymienić wszystkich.
Jesteście bardzo pozytywnymi osobami.&lt;/p&gt;

&lt;p&gt;Dziękuję każdej osobie, która podpowiedziała, zasugerowała, pomogła!&lt;/p&gt;

&lt;h3 id=&quot;dla-współpracowników&quot;&gt;…dla Współpracowników&lt;/h3&gt;

&lt;p&gt;Chciałem wyrazić swoją wdzięczność do współpracowników&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Maciej Machniewski&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Drogi Maćku, chciałem Ci serdecznie podziękować za to, chciałeś wejść do
tej branży. Odnalazłeś się znakomicie! Twoje teksty w social mediach robią robotę!&lt;/p&gt;

&lt;p&gt;Dziękuję Ci, że byłeś zawsze otwarty na wszelkie nowe zadania, jakie musieliśmy
zrealizować! Masz takie “pióro”, którego pozazdrościłby Ci niejeden bloger!&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Tiffany Horan&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cieszę się, że mogłem z Tobą współpracować. Świat mediów społecznościowych
jest szalony. Fajnie, że pokazałaś nam jak na ten świat patrzy się z różnych stron.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Barry Solone&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ach! Barry, Twój świetny głos będę wspominał, kiedy to ktoś mnie zmusi
do śpiewania. Cieszę się, że mogliśmy razem współpracować.
Twoja charyzma jest dla mnie wyznacznikiem jak być dobrym konferansjerem.&lt;/p&gt;

&lt;h3 id=&quot;dla-rady-fundacji&quot;&gt;…dla Rady Fundacji&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Magdalena Ostoja-Chyżyńska&lt;/li&gt;
  &lt;li&gt;Van Anh Dam&lt;/li&gt;
  &lt;li&gt;Jakub Neander&lt;/li&gt;
  &lt;li&gt;Jerzy Brodzikowski&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Serdeczne podziękowania dla całej Rady. Zawsze służyliście “radą”.
Dziękuję! Jestem przekonany, że dzięki Wam Fundacja WarsawJS będzie miała
silne zaplecze!&lt;/p&gt;

&lt;h3 id=&quot;dla-organizatorów&quot;&gt;…dla Organizatorów&lt;/h3&gt;

&lt;p&gt;Na początku chciałem podziękować osobom, które zrezygnowały z organizacji
wydarzeń dawno temu. Bardzo Wam dziękuję, że mogliśmy razem w tym mieście
uruchomić coś tak fascynującego! Początki są najtrudniejsze — wszystko się zgadza.&lt;/p&gt;

&lt;p&gt;Nie zapomnę nigdy jak wyglądały nasze pierwsze spotkania. Ile czasu
spędzaliśmy na planowaniu kolejnych wydarzeń, któż to by policzył?&lt;/p&gt;

&lt;p&gt;Dziękuję Ci Paulina za to, że pokazałaś jak szybko można tworzyć materiały graficzne.
Twoja pomysłowość i kreatywność przyniosła nam pierwszą wersję loga!&lt;/p&gt;

&lt;p&gt;Krzysztof! Od Ciebie uczyłem się non stop! Zapamiętałem Cię jako osobę,
która ma “motorek” — zawsze energia i pomysłowość!&lt;/p&gt;

&lt;p&gt;Marcin, Twoje spojrzenie na sytuację było niezastąpione! Dobrze było mieć osobę
z tak zwanego “biznesu” na pokładzie, aby to wszystko ruszyło na dobre!
Dzięki brachu!&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Paulina Modras&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Krzysztof Modras&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Marcin Cimaszewski&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No i nadszedł ten moment, kiedy chciałem BARDZO podziękować najważniejszej ekipie:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Katarzyna Grabowska&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Piotr Zientara&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;…z którą spędziłem tyle lat wspólnego organizowania!&lt;/p&gt;

&lt;p&gt;Pamiętam tą radość jaka z nas tryskała podczas pierwszych wydarzeń,
kiedy organizowaliśmy wydarzenia tylko we trójkę — byliśmy tacy interoperacyjni.&lt;/p&gt;

&lt;p&gt;Chciałbym, aby wszystkie trudne chwile jakie w naszej współpracy się pojawiały,
zostały przykryte tymi pięknymi, gdy wspieraliśmy i dbaliśmy o siebie,
gratulowaliśmy sobie i dziękowaliśmy za wysiłek, jaki wkładaliśmy
do tego &lt;strong&gt;hobby jakim było organizowanie wydarzeń&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Tworzyliśmy świetny Team, który nakręcał się po to, aby kolejne wydarzenia były
jeszcze lepsze! Regularnie podnosiliśmy sobie poprzeczkę, przez co liczba zadań
rosła z miesiąca na miesiąc. Czasami była ona zawieszona za wysoko, ale - lepiej
lub gorzej - zawsze sobie radziliśmy.&lt;/p&gt;

&lt;p&gt;Aby wydarzenie było dobrze zrealizowane ważne jest, aby w organizację
wkładać swoje serce. Robiłem to przez tyle lat, że szalenie trudno było mi
napisać ten artykuł.&lt;/p&gt;

&lt;blockquote class=&quot;block-poor&quot;&gt;
  &lt;p&gt;WarsawJS w moim sercu zawsze będzie zajmowało szczególne miejsce.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Dla społeczności poświęcałem swój prywatny czas. Budowanie społeczności
jest męczące, ale jakże wdzięczne w momentach, gdy podchodzą do Ciebie ludzie
i najzwyczajniej w świecie Ci dziękują.
Życzę Wam, aby taka wdzięczność gościła też w waszych firmach.&lt;/p&gt;

&lt;p&gt;Organizowaniem kolejnych wydarzeń będzie zajmował się Piotr Zientara
oraz Ania Dławichowska, która będzie zaangażowana w fundację.&lt;/p&gt;

&lt;p&gt;Razem z Kasią trzymamy kciuki za przyszłą ścieżkę WarsawJS.
Nasza przygoda kończy się w tym miejscu i chcielibyśmy razem, raz jeszcze,
tak na zakończenie, podziękować całej społeczności.&lt;/p&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;p&gt;Podsumowanie 5 lat organizacji. Film stworzonym na wydarzenie urodzinowe.&lt;/p&gt;

&lt;div class=&quot;youtube-lazy&quot; data-youtube-id=&quot;9AGT_sYmEK0&quot;&gt;&lt;/div&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;figure&gt;
    &lt;a href=&quot;/assets/photos/warsawjs/thanks/team.jpg&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img data-src=&quot;/assets/photos/warsawjs/thanks/team.jpg&quot; /&gt;
    &lt;/a&gt;
    &lt;figcaption&gt;
        Dziękuję 💙
    &lt;/figcaption&gt;
&lt;/figure&gt;
</description>
            <pubDate>Mon, 08 Jun 2020 06:51:47 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2020/06/08/dziekuje-warsawjs.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2020/06/08/dziekuje-warsawjs.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/post-banner-warsawjs-thanks.png</image>
        </item>
        
        <item>
            <title>Nowy początek</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Nie wierzę. Pojawił się nowy post na blogu? Jak to? Dlaczego? Skąd taka zmiana?&lt;/p&gt;

&lt;p&gt;Wszystko dzięki temu, że znowu zacząłem się rozwijać. Z początkiem tego roku
zacząłem pracę jako Senior Engineer w amerykańskiej firmie &lt;a href=&quot;https://sumologic.com&quot;&gt;Sumo Logic&lt;/a&gt;,
która rozwija swój produkt do analizy logów oraz metryk.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/post-banner-lifestyle-nowy-poczatek.png&quot; itemprop=&quot;image&quot; alt=&quot;Baner promujący artykuł&quot; /&gt;
&lt;/figure&gt;

&lt;p&gt;Zeszły rok był dla mnie piękny. Zrealizowałem mnóstwo szkoleń. Pojeździłem po
całej Polsce. Pokochałem pociągi — świetna forma komunikacji (oczywiście, kiedy
jest cisza w przedziale). Odwiedziłem kilkadziesiąt miast, niektóre po raz pierwszy.&lt;/p&gt;

&lt;p&gt;Poznałem Łódź — miasto Cezarego Pazury. Odwiedziłem tzw. “filmówkę” — najbardziej
znaną szkołę filmową w Polsce (do której skądinąd planowałem aplikować).&lt;/p&gt;

&lt;p&gt;W sumie, w zeszłym roku przepracowałem na sali szkoleniowej 512 godzin.
Czas ten pozwolił mi zrozumieć, jak wygląda praca pełnoetatowego trenera.&lt;/p&gt;

&lt;p&gt;Tematy szkoleń często się powtarzały, dzięki czemu wiele programów szkoleń mam
tak dopieszczonych, że dokładnie wiem ile czasu poświęcić na każde zadanie.
To wprowadza spory komfort do pracy trenera. Timing jest bardzo ważnym elementem,
nad którym należy panować.&lt;/p&gt;

&lt;p&gt;Najpopularniejsze szkolenia, jakie realizowałem to:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;JavaScript (różne poziomy)&lt;/li&gt;
  &lt;li&gt;Node.js (różne potrzeby)&lt;/li&gt;
  &lt;li&gt;Angular (różne wersje)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;W których tematach odnajdywałem się najlepiej? Hmm, w każdym. Powyższe tematy
są dla mnie bardzo bliskie z uwagi na komercyjne doświadczenie, jakie nabyłem
do 2018 roku. Udział w projekcie aplikacji &lt;a href=&quot;https://ipla.tv&quot;&gt;ipla.tv&lt;/a&gt; ugruntował
moją wiedzę z budowy skalowalnych aplikacji webowych.&lt;/p&gt;

&lt;p&gt;Ze szkoleń wyniosłem ogrom wiedzy. Nierzadko byłem w sytuacji, w której
nie znałem odpowiedzi na zadane mi pytanie. Od początku wiedziałem, że taka
sytuacja będzie często się pojawiać. Chciałem w niej się znaleźć.
Te momenty mnie ROZWIJAŁY, ale jak to? Nie bałeś się, że “popiszesz się” brakiem
wiedzy?&lt;/p&gt;

&lt;p&gt;W jaki sposób uczą się trenerzy? Skoro mam przygotowany program i realizuję
z grupą zadania, to kiedy się rozwijać? Właśnie wtedy, gdy pojawia się pytanie,
na które nie znam odpowiedzi. Tworzę wówczas notatkę w kajecie, aby po powrocie
do hotelu przeczytać, zrozumieć, NAUCZYĆ SIĘ czegoś nowego. Z pierwszych szkoleń
wracałem z notesem, który był bogatszy o kilka zapisanych kartek.&lt;/p&gt;

&lt;p&gt;Po ponad rocznej pracy jako trener full time, “przekształcałem” się w nauczyciela,
jakich jest pełno na uczelniach wyższych. Wiedza niepoparta doświadczeniem
to wiedza, która &lt;em&gt;jest cenna&lt;/em&gt;, ale nieoszlifowana. Mnie zależy na doświadczeniu.
Zrozumienie tematu wcale nie jest ostatecznym etapem jego poznania. Dopiero
zastosowanie w praktycznym środowisku pozwala zrozumieć wady i zalety.&lt;/p&gt;

&lt;div class=&quot;gallery&quot;&gt;
    &lt;figure&gt;
        &lt;img data-src=&quot;/assets/photos/sumo-logic/start-date-first-photo-in-office.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/figure&gt;
&lt;/div&gt;

&lt;p&gt;Dziś, po tym, jak przepracowałem 4 miesiące jako developer, bardzo się cieszę,
z tego, co robię. &lt;strong&gt;Kocham programować&lt;/strong&gt; ❤️ — brakowało mi tego mocno.&lt;/p&gt;

&lt;p&gt;Palę się do pracy i wiem, że ten etap, który jest już za mną, był bardzo cenny.
Lekcja życia, którą otrzymałem w 2019 roku, szkoląc innych programistów,
dała mi do zrozumienia, w którą stronę iść dalej.&lt;/p&gt;

&lt;p&gt;Dziękuję wszystkim uczestnikom moich szkoleń. Tylko w 2019 roku przeszkoliłem
ponad 200 osób. Każde szkolenie kończy się wystawieniem ocen trenerowi — często
otrzymywałem maksymalny wynik 10 / 10. Nie zapisywałem wyników ocen,
więc trudno jest wyciągnąć średnią roczną, ale gdyby taką policzyć,
na pewno byłbym z niej zadowolony.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Nie chcę rezygnować ze szkoleń.&lt;/strong&gt; Uwielbiam uczyć ludzi.
Chciałbym realizować szkolenia, może nie już tak często, jak miało to miejsce
w 2019 roku, ale na pewno kilka dni w miesiącu są realne.&lt;/p&gt;

&lt;p&gt;Zaplanowałem, aby początek roku “odpocząć” od szkoleń. Pandemia mi w tym dość pomogła.
Kiedy sytuacja wróci do normy, chciałbym wrócić do stacjonarnych szkoleń.&lt;/p&gt;

&lt;p&gt;Dziś, jestem dostępny na dwóch płaszczyznach:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;szkolenia online organizowanych przez &lt;a href=&quot;https://warsawjs.com&quot;&gt;WarsawJS&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;cotygodniowe spotkania z &lt;a href=&quot;https://patronite.pl/piecioshka&quot;&gt;Patronami&lt;/a&gt;, którzy mnie wspierają&lt;br /&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Oh, jak mi brakowało takiego wieczora, gdzie piszę prozę, a nie zadania na szkolenie.&lt;/p&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;p&gt;Czytelniku! Dziękuję Ci, że dotrwałeś aż tu. Wiem, że to nie jest techniczny
artykuł, do których przyzwyczaiłem Cię na tym blogu, ale chciałem się z Tobą
podzielić, tym co u mnie. Miłego dnia! 🖐️&lt;/p&gt;

&lt;p&gt;Cya! 👋&lt;/p&gt;

&lt;!-- Resources --&gt;

</description>
            <pubDate>Sat, 02 May 2020 12:05:45 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2020/05/02/nowy-poczatek.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2020/05/02/nowy-poczatek.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/post-banner-lifestyle-nowy-poczatek.png</image>
        </item>
        
        <item>
            <title>Własna konfiguracja do TSLint</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Tak, wiem. &lt;em&gt;TSLint is deprecated.&lt;/em&gt; Aczkolwiek JESZCZE nie jest. JESZCZE istnieją
projekty, gdzie głównym narzędziem do lintowania jest &lt;strong&gt;TSLint&lt;/strong&gt;. I dobrze.&lt;/p&gt;

&lt;p&gt;Dziś przedstawiam Wam jak zrobić własną konfigurację do TSLinta. W sumie
bardzo podobnie (jak nie identycznie) tworzy się konfigurację do ESLinta.
Oczywiście to inny projekt (następca TSLinta) więc i nazwy kluczy do reguł
mogą się zmienić, ale schemat jest MEGA podobny.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/post-banner-github-tslint-config-piecioshka.png&quot; itemprop=&quot;image&quot; alt=&quot;Baner promujący artykuł&quot; /&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;1-stwórz-repozytorium-na-github&quot;&gt;1. Stwórz repozytorium na GitHub&lt;/h2&gt;

&lt;p&gt;W nazwie projektu ważne, jest zawarcie dwóch rzeczy:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;prefiksu &lt;code class=&quot;highlighter-rouge&quot;&gt;tslint-config-&lt;/code&gt; — który informuje, jakiego typu jest to projekt&lt;/li&gt;
  &lt;li&gt;postfiksu np. &lt;code class=&quot;highlighter-rouge&quot;&gt;piecioshka&lt;/code&gt; — który informuje, kto używa tej paczki (np. organizacja)
  albo kto jest autorem (np. my sami)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bardzo dobrą praktyką jest tworzenie takich konfiguracji w zespołach projektowych.
Wtedy projekt z konfiguracją może się nazywać &lt;code class=&quot;highlighter-rouge&quot;&gt;tslint-config-NAZWA_FIRMY&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Przykłady:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.npmjs.com/package/tslint-config-airbnb&quot;&gt;https://www.npmjs.com/package/tslint-config-airbnb&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.npmjs.com/package/tslint-config-silind&quot;&gt;https://www.npmjs.com/package/tslint-config-silind&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.npmjs.com/package/tslint-config-scc&quot;&gt;https://www.npmjs.com/package/tslint-config-scc&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;W moim przypadku jest to repozytorium:&lt;br /&gt;
&lt;a href=&quot;https://github.com/piecioshka/tslint-config-piecioshka&quot;&gt;https://github.com/piecioshka/tslint-config-piecioshka&lt;/a&gt;&lt;/p&gt;

&lt;h2 id=&quot;2-stwórz-katalog-na-dysku-a-w-nim-trzy-pliki&quot;&gt;2. Stwórz katalog na dysku, a w nim trzy pliki&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;README.md&lt;/code&gt;&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;Informacja jak użyć Twojego projektu&lt;/li&gt;
      &lt;li&gt;Jeśli paczka została opublikowana na &lt;a href=&quot;https://npmjs.org&quot;&gt;#npm&lt;/a&gt; to warto dodać badge (odznaki),
  które mogą np. prezentować ilość pobrań, oraz informację, jaka jest
  najnowsza opublikowana wersja.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;package.json&lt;/code&gt;&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;Oczywiście, warto zdefiniować takie pola jak: &lt;code class=&quot;highlighter-rouge&quot;&gt;name, version, license,
  description, author&lt;/code&gt;.&lt;/li&gt;
      &lt;li&gt;Jeśli chcesz opublikować paczkę po to, aby mogli z niej korzystać też
  inny deweloperzy, to zadbaj o słowa kluczowe, tj. klucz &lt;code class=&quot;highlighter-rouge&quot;&gt;keywords&lt;/code&gt;.&lt;/li&gt;
      &lt;li&gt;Warto zdefiniować również klucz &lt;code class=&quot;highlighter-rouge&quot;&gt;files&lt;/code&gt;, aby opublikować tylko wybrane
  pliki i katalogi — w tym przypadku będzie to tablica trzyelementowa.&lt;/li&gt;
      &lt;li&gt;Ostatnim dobrym pomysł jest dodanie informacji o repozytorium,
  z którego pochodzi dana paczka, dzięki temu ktoś, kto znajdzie projekt
  na &lt;a href=&quot;https://npmjs.org&quot;&gt;#npm&lt;/a&gt; będzie mógł zobaczyć źródła projektu przed jego pobraniem
  (no, chyba że użyje &lt;a href=&quot;https://npmview.now.sh&quot;&gt;#npmview&lt;/a&gt;).&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;index.js&lt;/code&gt;&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;
        &lt;p&gt;W tym pliku zdefiniuj swoje reguły dla &lt;a href=&quot;https://github.com/palantir/tslint/&quot;&gt;#TSLint&lt;/a&gt;a.
  Pamiętaj, że i tak każdy ma możliwość nadpisania Twoich wartości.
  Przykład:&lt;/p&gt;

        &lt;div class=&quot;language-js highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;  &lt;span class=&quot;nx&quot;&gt;module&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;exports&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;s2&quot;&gt;&quot;extends&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;
          &lt;span class=&quot;s2&quot;&gt;&quot;tslint:recommended&quot;&lt;/span&gt;
      &lt;span class=&quot;p&quot;&gt;],&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;rules&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
          &lt;span class=&quot;s2&quot;&gt;&quot;variable-name&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
              &lt;span class=&quot;s2&quot;&gt;&quot;options&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;
                  &lt;span class=&quot;s2&quot;&gt;&quot;allow-leading-underscore&quot;&lt;/span&gt;
              &lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
          &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
      &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;        &lt;/div&gt;
      &lt;/li&gt;
      &lt;li&gt;Ze względu, że paczka, którą definiujesz, będzie w &lt;a href=&quot;https://npmjs.org&quot;&gt;#npm&lt;/a&gt;, który jest
  rejestrem paczek dla Node.js, zaimplementuj moduł w stylu CommonJS.&lt;/li&gt;
      &lt;li&gt;Warto, aby Twoja konfiguracja rozszerzała już istniejącą, która to ma
  zdefiniowane wartości dla pozostałych pól, tak aby nie korzystać
  (albo aby właśnie korzystać) z domyślnych. W swojej konfiguracji
  postaraj się nadpisać tylko te, które faktycznie zależą od Twojego
  stylu pisania.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;3-publikacja&quot;&gt;3. Publikacja&lt;/h2&gt;

&lt;p&gt;Nadszedł czas na publikację. Stwórz &lt;code class=&quot;highlighter-rouge&quot;&gt;commit&lt;/code&gt;, a potem:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;npm publish
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;tym samym, Twoja paczka będzie już dostępna w rejestrze npm.
Na koniec warto zmiany wysłać na serwer za pomocą &lt;code class=&quot;highlighter-rouge&quot;&gt;git push&lt;/code&gt;.&lt;/p&gt;

&lt;figure class=&quot;social-center-block&quot;&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;Successfully published tslint-config-piecioshka@0.0.1&lt;a href=&quot;https://t.co/P3M38zAaPS&quot;&gt;https://t.co/P3M38zAaPS&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;yay! My configuration for deprecated &lt;a href=&quot;https://twitter.com/hashtag/TSLint?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#TSLint&lt;/a&gt; will be awesome! 😅&lt;/p&gt;&amp;mdash; Piotr Kowalski (@piecioshka) &lt;a href=&quot;https://twitter.com/piecioshka/status/1187308244097736704?ref_src=twsrc%5Etfw&quot;&gt;October 24, 2019&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async=&quot;&quot; src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;

&lt;/figure&gt;

&lt;h2 id=&quot;4-użycie&quot;&gt;4. Użycie&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;tslint.json&lt;/code&gt;&lt;/p&gt;

    &lt;p&gt;Dodać do tablicy &lt;code class=&quot;highlighter-rouge&quot;&gt;extends&lt;/code&gt; np. &lt;code class=&quot;highlighter-rouge&quot;&gt;tslint-config-piecioshka&lt;/code&gt;.&lt;br /&gt;
  &lt;strong&gt;Uwaga&lt;/strong&gt;: Kolejność ma znaczenie. Przykład:&lt;/p&gt;

    &lt;div class=&quot;language-json highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;w&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;extends&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;tslint:recommended&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;tslint-config-piecioshka&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;

    &lt;p&gt;W tym przypadku konfiguracja &lt;code class=&quot;highlighter-rouge&quot;&gt;tslint-config-piecioshka&lt;/code&gt;
  nadpisuje &lt;code class=&quot;highlighter-rouge&quot;&gt;tslint:recommended&lt;/code&gt;.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;5-zainstalować&quot;&gt;5. Zainstalować&lt;/h2&gt;

&lt;p&gt;W dowolnym projekcie można już zainstalować naszą paczkę.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;tslint-config-piecioshka&lt;/code&gt;&lt;/p&gt;

    &lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;  npm i &lt;span class=&quot;nt&quot;&gt;-D&lt;/span&gt; tslint-config-piecioshka
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;

    &lt;p&gt;W przeciwnym przypadku będzie error:&lt;/p&gt;

    &lt;div class=&quot;language-text highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;  Failed to load /Users/piecioshka/projects/example/tslint.json: Invalid &quot;extends&quot; configuration value - could not require &quot;piecioshka&quot;. Review the Node lookup algorithm (https://nodejs.org/api/modules.html#modules_all_together) for the approximate method TSLint uses to find the referenced configuration file.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;

    &lt;p&gt;Dlaczego używam &lt;code class=&quot;highlighter-rouge&quot;&gt;-D&lt;/code&gt;? Konfiguracja do lintera nie dodaje żadnego nowego
  zachowania do aplikacji, więc jest czysto deweloperska.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;6-uruchomić-proces-lintowania&quot;&gt;6. Uruchomić proces lintowania&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;package.json&lt;/code&gt;&lt;/p&gt;

    &lt;p&gt;Dodać zadanie do &lt;strong&gt;run-scripts&lt;/strong&gt;:&lt;/p&gt;

    &lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;  &lt;span class=&quot;s2&quot;&gt;&quot;scripts&quot;&lt;/span&gt;: &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;s2&quot;&gt;&quot;lint&quot;&lt;/span&gt;: &lt;span class=&quot;s2&quot;&gt;&quot;tslint -p .&quot;&lt;/span&gt;
  &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;

    &lt;p&gt;Gdzie &lt;code class=&quot;highlighter-rouge&quot;&gt;-p&lt;/code&gt; oznacza katalog z plikiem &lt;code class=&quot;highlighter-rouge&quot;&gt;tslint.json&lt;/code&gt;.
  Na zakończenie uruchomić:&lt;/p&gt;

    &lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;  npm run lint
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;

    &lt;p&gt;… i zacząć poprawiać “bugi”!&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;h2 id=&quot;faq&quot;&gt;FAQ&lt;/h2&gt;

&lt;dl class=&quot;question-list&quot;&gt;
    &lt;dt&gt;Co to jest proces &quot;lintowania&quot; kodu?&lt;/dt&gt;
    &lt;dd&gt;
        Proces polegający na weryfikacji kodu pod kątem reguł sprawdzające
        sposób jego zapisu. Dla przykładu, czy po wyrażeniu &lt;strong&gt;if&lt;/strong&gt;
        należy napisać spację, czy też nie. Dla interpretera to bez znaczenia,
        ale aby uzyskać spójność kodu między deweloperami, warto zdefiniować
        taki proces, który POKAŻE niedoskonałości.&lt;br /&gt;
        Inny rozwiązaniem jest używanie Prettiera, który to na podstawie
        konfiguracji automatycznie poprawi kod.
    &lt;/dd&gt;
&lt;/dl&gt;

&lt;!-- Resources --&gt;

</description>
            <pubDate>Thu, 24 Oct 2019 12:05:10 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2019/10/24/wlasna-konfiguracja-do-tslint.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2019/10/24/wlasna-konfiguracja-do-tslint.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/post-banner-github-tslint-config-piecioshka.png</image>
        </item>
        
        <item>
            <title>Jak zmienić motyw strony za pomocą SCSS na przykładzie trybu ciemnego?</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Używasz ciemnego motywu w swoim edytorze? A może korzystasz z tego trybu
na popularnych stronach, takich jak YouTube? Jeśli chciałbyś zbudować
taki efekt na stronie, to w tym artykule zostały zawarte wszelkie wskazówki
na ten temat.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/post-banner-dark-mode.png&quot; itemprop=&quot;image&quot; alt=&quot;Baner promujący artykuł&quot; /&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;po-co-tryb-ciemny&quot;&gt;Po co “tryb ciemny”?&lt;/h2&gt;

&lt;p&gt;Czy czujesz, że Twoje oczy szybciej się męczą, kiedy przeglądają jasne strony
internetowe? Jeśli tak, to już wiesz, po co jest taki tryb. Jeśli nie,
to pozwól, że udzielę Ci porady. Prędzej czy później zauważysz, że ciemniejsze
szata graficzna aplikacji oraz stron internetowych nie spowoduję rozszerzenia
się źrenic. Zauważysz to szczególnie podczas przeglądania internetu w tzw.
półmroku.&lt;/p&gt;

&lt;h2 id=&quot;demo-&quot;&gt;Demo 🎉&lt;/h2&gt;

&lt;figure class=&quot;with-border-image&quot;&gt;
    &lt;img src=&quot;/assets/images/posts/css/dark-mode.gif&quot; alt=&quot;Zmiana trybu z jasne na ciemny na stronie z artykułem&quot; /&gt;
    &lt;figcaption&gt;
        Zmiana trybu na tej stronie.&lt;br /&gt;
        Spróbuj zmienić tryb (przycisk znajduje się w prawym dolnym roku strony).
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Gdzie jeszcze możesz wykorzystać zmianę motywu na ciemny:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Strony internetowe, &lt;em&gt;np. YouTube, Twitter&lt;/em&gt;&lt;/li&gt;
  &lt;li&gt;Edytory kodu, &lt;em&gt;np. Visual Studio Code&lt;/em&gt;&lt;/li&gt;
  &lt;li&gt;DevTools, &lt;em&gt;np. narzędzia developerskie w Google Chrome&lt;/em&gt;&lt;/li&gt;
  &lt;li&gt;Systemy operacyjne, &lt;em&gt;np. macOS Mojave&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;tryb-ciemny-w-polskiej-blogosferze-frontendowej&quot;&gt;Tryb ciemny w polskiej blogosferze frontendowej&lt;/h2&gt;

&lt;p&gt;Przeglądając serwis &lt;a href=&quot;https://polskifrontend.pl&quot;&gt;polskifrontend.pl&lt;/a&gt; nie zauważyłem,
aby choć jeden blog miał możliwość zmiany trybu z jasnego na ciemny.&lt;/p&gt;

&lt;p&gt;Moim zdaniem udostępnienie takiej możliwości jest wielce korzystne dla użytkownika.
Czytelnicy tego bloga często go odwiedzają w godzinach wieczornych.
Tym samym, kiedy będą mogli zmienić domyślny wygląd na ciemny, to podniesie
się ich komfort korzystania z tej strony, tym samym
&lt;strong&gt;dodanie trybu ciemnego może wpłynąć na zwiększenie ruchu na stronie&lt;/strong&gt;.&lt;/p&gt;

&lt;h2 id=&quot;jak-wykonać-z-użyciem-scss&quot;&gt;Jak wykonać z użyciem SCSS?&lt;/h2&gt;

&lt;p&gt;Istnieje kilka sposobów na wykonanie mechanizmu przełączania wyglądu.
Zgodnie z tytułem tego artykułu przedstawię teraz sposób jak zrealizować
dane zadanie za pomocą SCSS.&lt;/p&gt;

&lt;p&gt;Załączam poniżej kilka listingów kodu, na których widać, że na początku należy
stworzyć zestawy zmiennych z kolorami. Następnie w pliku (plikach), należy
zbudować wygląd strony wykorzystując zmienne SCSS.&lt;/p&gt;

&lt;p&gt;Ostatnim krokiem jest zdefiniowanie — w głównym pliku &lt;code class=&quot;highlighter-rouge&quot;&gt;main.scss&lt;/code&gt; — struktury,
z wykorzystaniem klasy dodanej do głównego elementu strony (w tym przypadku
jest to &lt;code class=&quot;highlighter-rouge&quot;&gt;html&lt;/code&gt;, ale może to być też znacznik &lt;code class=&quot;highlighter-rouge&quot;&gt;body&lt;/code&gt;).&lt;/p&gt;

&lt;div class=&quot;language-scss highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;// _themes/_light-theme.scss&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;$bg-color&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;#fff&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class=&quot;language-scss highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;// _themes/_dark-theme.scss&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;$bg-color&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mh&quot;&gt;#000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class=&quot;language-scss highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;// _page.scss&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;body&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;nl&quot;&gt;background-color&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$bg-color&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;// ...&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class=&quot;language-scss highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;// main.scss&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;html&lt;/span&gt;&lt;span class=&quot;nd&quot;&gt;:not&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;.dark-mode&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;@import&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;_themes/_light-theme.scss&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;@import&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;_page&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;nt&quot;&gt;html&lt;/span&gt;&lt;span class=&quot;nc&quot;&gt;.dark-mode&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;@import&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;_themes/_dark-theme.scss&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;@import&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;_page&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Teraz wystarczy &lt;strong&gt;stworzyć przycisk, który po kliknięciu doda klasę CSS&lt;/strong&gt; do głównego
elementu strony, tym samym &lt;strong&gt;zostanie stworzony mechanizm zmiany motywu&lt;/strong&gt;.&lt;/p&gt;

&lt;h2 id=&quot;wskazówki&quot;&gt;Wskazówki&lt;/h2&gt;

&lt;ol&gt;
  &lt;li&gt;Komponent z przełączaniem trybu nie powinien być “zaznaczalny” — nie przechowuje
 on treści strony internetowej — jest czymś w roli “opcji”&lt;/li&gt;
  &lt;li&gt;Warto, aby taki komponent ze zmianą trybu jasny/ciemny był albo w opcjach
 aplikacji, albo gdzie z boku treści strony. Do tego można wykorzystać znacznik
 &lt;code class=&quot;highlighter-rouge&quot;&gt;&amp;lt;aside&amp;gt;&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;Komponent może być ciągle widoczny, aby udostępnić możliwość natychmiastowej
 zmiany w trakcie czytania artykułu&lt;/li&gt;
  &lt;li&gt;Ostatni wybór trybu warto zapisać w &lt;code class=&quot;highlighter-rouge&quot;&gt;LocalStorage&lt;/code&gt;, aby podczas kolejnych
 odwiedzin, użytkownik nie musiał dokonywać wyboru ponownie&lt;/li&gt;
  &lt;li&gt;Warto wykorzystać &lt;code class=&quot;highlighter-rouge&quot;&gt;&amp;lt;input type=&quot;checkbox&quot;&amp;gt;&lt;/code&gt; jako kontrolka do zmiany trybu&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote class=&quot;block-good&quot;&gt;
  &lt;p&gt;&lt;strong&gt;Efekt uboczny&lt;/strong&gt; Stworzenie nowego motywu pozwoli na uporządkowanie wyglądu aplikacji,
poprzez wydzielenie wszelkich kolorów (tekstu i teł) do pliku ze zmiennymi.&lt;/p&gt;
&lt;/blockquote&gt;
</description>
            <pubDate>Tue, 18 Jun 2019 10:05:34 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2019/06/18/jak-zmienic-motyw-strony-za-pomoca-scss-na-przykladzie-trybu-ciemnego.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2019/06/18/jak-zmienic-motyw-strony-za-pomoca-scss-na-przykladzie-trybu-ciemnego.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/post-banner-dark-mode.png</image>
        </item>
        
        <item>
            <title>Testy end-to-end w Continuous Integration</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Podczas jednego z &lt;a href=&quot;https://www.youtube.com/watch?v=bmpoLbmMQ30&quot;&gt;moich webinarów&lt;/a&gt; chciałem skonfigurować testy end-to-end
na Travisie. Nie udało się, z prostego powodu — od ostatniego czasu kiedy
to robiłem upłynęło trochę czasu tym samym sposób się zmienił.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/nightwatch/nightwatch-chrome-headless-travis.jpg&quot; itemprop=&quot;image&quot; alt=&quot;Baner promujący artykuł&quot; /&gt;
&lt;/figure&gt;

&lt;p&gt;W tym artykule chciałem odświeżyć temat &lt;strong&gt;jak skonfigurować testy e2e w 2019&lt;/strong&gt; roku.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;2 lata temu &lt;a href=&quot;/blog/2017/08/09/jak-napisac-testy-end-to-end-z-wykorzystaniem-nightwatch-oraz-chrome-headless.html&quot;&gt;napisałem artykuł&lt;/a&gt; o tym, jak łatwo jest uruchomić prosty
scenariusz testów end-to-end. Artykuł wprowadza w tematykę testów e2e.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;em&gt;Ten artykuł będzie opisywał co się stało w tej rewizji &lt;a href=&quot;https://github.com/piecioshka/webinar-e2e/commit/97a75d7ca1c77ee29fd177cde0b17cd9114b6ac0&quot;&gt;97a75d7c&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;h2 id=&quot;co-jest-potrzebne&quot;&gt;Co jest potrzebne?&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;Serwer CI — np. &lt;a href=&quot;https://travis-ci.org&quot;&gt;Travis&lt;/a&gt; (najpopularniejszy)&lt;/li&gt;
  &lt;li&gt;Środowisko do tworzenie testów e2e — np. &lt;a href=&quot;http://nightwatchjs.org&quot;&gt;Nightwatch.js&lt;/a&gt;
  (popularny, używany przez &lt;a href=&quot;https://github.com/vuejs/vue/tree/dev/test/e2e/specs&quot;&gt;Vue.js&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;Komunikacja z przeglądarką — np. &lt;a href=&quot;https://github.com/giggio/node-chromedriver&quot;&gt;ChromeDriver&lt;/a&gt;
  (Chrome to według mnie najlepsza przeglądarka)&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote class=&quot;block-average&quot;&gt;
  &lt;h3 id=&quot;-uwaga&quot;&gt;&lt;i class=&quot;icon-average&quot;&gt;&lt;/i&gt; Uwaga&lt;/h3&gt;
  &lt;p&gt;Na ten moment &lt;em&gt;Travis nie supportuje&lt;/em&gt; w 100% platformy Windows.
Dlatego warto uważać podczas konfiguracji testów na tą platformę.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id=&quot;co-się-zmieniło&quot;&gt;Co się zmieniło?&lt;/h2&gt;

&lt;p&gt;Nie trzeba już explicit uruchamiać serwera Selenium!&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/nightwatch/how-nightwatch-works-with-chromedriver.png&quot; alt=&quot;Komunikacja Nightwatch.js z serwerem webowych&quot; /&gt;
    &lt;figcaption&gt;
        Schemat działania .&lt;br /&gt;
        &lt;em&gt;
            Diagram stworzony z użyciem narzędzia:
            &lt;a href=&quot;https://draw.io&quot;&gt;draw.io&lt;/a&gt;.
        &lt;/em&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;konfiguracja-projektu&quot;&gt;Konfiguracja projektu&lt;/h2&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;Zainstaluj wymagane zależności:&lt;/p&gt;

    &lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt; npm i &lt;span class=&quot;nt&quot;&gt;-D&lt;/span&gt; nightwatch chromedriver
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
  &lt;li&gt;Stwórz katalog na testy e2e. Moja propozycja: &lt;code class=&quot;highlighter-rouge&quot;&gt;test/e2e&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;Stwórz plik z testami. Moja propozycja &lt;code class=&quot;highlighter-rouge&quot;&gt;test/e2e/test.js&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Dodaj w powyższym pliku prosty scenariusz:&lt;/p&gt;

    &lt;div class=&quot;language-js highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt; &lt;span class=&quot;nx&quot;&gt;module&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;exports&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
     &lt;span class=&quot;s1&quot;&gt;'Spr. czy istnieje nagłówek?'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;client&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
         &lt;span class=&quot;kr&quot;&gt;await&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;client&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'http://example.org'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
         &lt;span class=&quot;kr&quot;&gt;await&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;client&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;waitForElementVisible&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'body'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
         &lt;span class=&quot;kr&quot;&gt;await&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;client&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;assert&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;elementPresent&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'h1'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
     &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
 &lt;span class=&quot;p&quot;&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
  &lt;li&gt;Stwórz plik z konfiguracją dla Nightwatch.js w katalogu głównym.
 Moja propozycja &lt;code class=&quot;highlighter-rouge&quot;&gt;nightwatch.conf.js&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Umieść w powyższym pliku podstawową konfigurację:&lt;/p&gt;

    &lt;div class=&quot;language-js highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt; &lt;span class=&quot;nx&quot;&gt;module&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;exports&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;

     &lt;span class=&quot;c1&quot;&gt;// Katalog z testami&lt;/span&gt;
     &lt;span class=&quot;s2&quot;&gt;&quot;src_folders&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;test/e2e/&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt;

     &lt;span class=&quot;c1&quot;&gt;// Konfiguracja sterownika przeglądarki w której uruchomią się testy&lt;/span&gt;
     &lt;span class=&quot;s2&quot;&gt;&quot;webdriver&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
         &lt;span class=&quot;s2&quot;&gt;&quot;start_process&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
         &lt;span class=&quot;s2&quot;&gt;&quot;server_path&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'node_modules/.bin/chromedriver'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
         &lt;span class=&quot;s2&quot;&gt;&quot;port&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;9515&lt;/span&gt;
     &lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;

     &lt;span class=&quot;c1&quot;&gt;// Informacja jaka przeglądarka zostanie użyta do testów&lt;/span&gt;
     &lt;span class=&quot;c1&quot;&gt;// oraz w jakim trybie zostanie uruchomiona (headless)&lt;/span&gt;
     &lt;span class=&quot;s2&quot;&gt;&quot;test_settings&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
         &lt;span class=&quot;s2&quot;&gt;&quot;default&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
             &lt;span class=&quot;s2&quot;&gt;&quot;desiredCapabilities&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
                 &lt;span class=&quot;s2&quot;&gt;&quot;browserName&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;chrome&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
                 &lt;span class=&quot;s2&quot;&gt;&quot;chromeOptions&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
                     &lt;span class=&quot;s2&quot;&gt;&quot;args&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;
                         &lt;span class=&quot;s2&quot;&gt;&quot;--headless&quot;&lt;/span&gt;
                     &lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
                 &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
             &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
         &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
     &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
 &lt;span class=&quot;p&quot;&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;bonus-użyjmy-pluginu-nightwatch-helpers&quot;&gt;Bonus: Użyjmy pluginu &lt;a href=&quot;https://github.com/yyx990803/nightwatch-helpers&quot;&gt;nightwatch-helpers&lt;/a&gt;&lt;/h2&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;Zainstaluj wymagane zależności:&lt;/p&gt;

    &lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt; npm i &lt;span class=&quot;nt&quot;&gt;-D&lt;/span&gt; nightwatch-helpers
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Do pliku z konfiguracją Nightwatch.js (czyli &lt;code class=&quot;highlighter-rouge&quot;&gt;nightwatch.conf.js&lt;/code&gt;) dodaj:&lt;/p&gt;

    &lt;div class=&quot;language-js highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
     &lt;span class=&quot;p&quot;&gt;[...]&lt;/span&gt;
     &lt;span class=&quot;s2&quot;&gt;&quot;custom_commands_path&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;node_modules/nightwatch-helpers/commands&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt;
     &lt;span class=&quot;s2&quot;&gt;&quot;custom_assertions_path&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;node_modules/nightwatch-helpers/assertions&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
     &lt;span class=&quot;p&quot;&gt;[...]&lt;/span&gt;
 &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Do pliku &lt;code class=&quot;highlighter-rouge&quot;&gt;test/e2e/test.js&lt;/code&gt; dodaj nowy test:&lt;/p&gt;

    &lt;div class=&quot;language-js highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt; &lt;span class=&quot;p&quot;&gt;[...]&lt;/span&gt;
 &lt;span class=&quot;s1&quot;&gt;'Spr. czy istnieją wymagane paragrafy?'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;async&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;client&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
     &lt;span class=&quot;kr&quot;&gt;await&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;client&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'http://example.org'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
     &lt;span class=&quot;kr&quot;&gt;await&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;client&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;waitForElementVisible&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'body'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

     &lt;span class=&quot;c1&quot;&gt;// to polecenie zawdzięczamy pluginowi&lt;/span&gt;
     &lt;span class=&quot;kr&quot;&gt;await&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;client&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;assert&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;count&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'p'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
 &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
 &lt;span class=&quot;p&quot;&gt;[...]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Rewizja, gdzie został użyty plugin &lt;a href=&quot;https://github.com/piecioshka/webinar-e2e/commit/ac78a0556acdabdad4a5c1ece714d7fee17a6061&quot;&gt;ac78a0556&lt;/a&gt;.&lt;/p&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;p&gt;Zerknij do projektu &lt;a href=&quot;https://github.com/piecioshka/test-nightwatch-chrome-headless&quot;&gt;test-nightwatch-chrome-headless&lt;/a&gt; aby zobaczyć jak
wygląda kod źródłowy aplikacji z testami end-to-end.&lt;/p&gt;

&lt;p&gt;Zerknij na Travisa &lt;a href=&quot;https://travis-ci.org/piecioshka/test-nightwatch-chrome-headless&quot;&gt;projektu&lt;/a&gt; aby zweryfikować stan testów.&lt;br /&gt;
Aktualny status
&lt;img src=&quot;https://travis-ci.org/piecioshka/test-nightwatch-chrome-headless.svg?branch=main&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;!-- Resources --&gt;

</description>
            <pubDate>Tue, 14 May 2019 17:25:46 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2019/05/14/nightwatchjs-travis-chromedriver.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2019/05/14/nightwatchjs-travis-chromedriver.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/nightwatch/nightwatch-chrome-headless-travis.jpg</image>
        </item>
        
        <item>
            <title>Jak się ma pisanie testów w projekcie, kiedy jest zdefiniowany mocny deadline?</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Pisanie testów wydłuży proces tworzenia aplikacji - kiedy nie mamy doświadczenia.
Jeśli zespół posiada doświadczenie w pisaniu testach a najlepiej kiedy posiada
doświadczenie w TDD, to leader tego zespołu nie może zabronić mu pisania testów,
z tego powodu, że zespół wypracował już sobie pewien sposób wytwarzania
oprogramowania.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/post-banner-lifestyle-testy-vs-deadline.png&quot; itemprop=&quot;image&quot; alt=&quot;Baner promujący artykuł&quot; /&gt;
&lt;/figure&gt;

&lt;blockquote&gt;
  &lt;p&gt;Jeśli takiemu zespołowi zabierze się OFICJALNIE możliwość pisania testów
to i tak będą je tworzyć gdzieś po kryjomu. Zespół już jest przyzwyczajony
to tego aby pisać testy.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Projekt, który posiada napisane testy jest bardziej odporny na błędy związane
z regresją, ponieważ każda jego linijka posiada weryfikację.
Unikniemy wtedy stresujących sytuacji — dodanie nowych funkcjonalności
nie spowoduje zepsucia już napisanych modułów&lt;/p&gt;

&lt;p&gt;Kiedy zespół projektowy nie czuje się pewnie w pisaniu testów, to ich pisanie
można odłożyć po releasie pierwszej wersji aplikacji.&lt;/p&gt;

&lt;p&gt;Takie testy można dopisać, aby uniknąć regresji w przyszłości.&lt;/p&gt;

&lt;p&gt;Cya! 👋&lt;/p&gt;
</description>
            <pubDate>Mon, 15 Apr 2019 18:50:43 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2019/04/15/testy-vs-deadline.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2019/04/15/testy-vs-deadline.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/post-banner-lifestyle-testy-vs-deadline.png</image>
        </item>
        
        <item>
            <title>Git. Używaj typu w Commit Message i zbuduj idealny changelog</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Wszystkie commit message repozytorium Angulara ma jakieś dziwne prefiksy.
Dlaczego? O tym w dzisiejszym wpisie.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/post-banner-git-changelog.png&quot; itemprop=&quot;image&quot; alt=&quot;Baner promujący artykuł&quot; /&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;prefiksy&quot;&gt;Prefiksy&lt;/h2&gt;

&lt;p&gt;Jeśli każdy &lt;strong&gt;Commit Message&lt;/strong&gt; będzie posiadał jeden prefiks z listy dostępnych:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;feat(feature): ...&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;fix(bug fix): ...&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;docs(documentation): ...&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;style(formatting, missing semicolons): ...&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;refactor: ...&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;test(when adding missing tests): ...&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;chore(maintain): ...&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;to wygenerowanie changeloga z podziałem na typ będzie przyjemnością.&lt;/p&gt;

&lt;p&gt;Jakie kroki są potrzebne, aby używać takiego workflow:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Tworzyć &lt;strong&gt;Commit Message&lt;/strong&gt;-e z prefiksem&lt;/li&gt;
  &lt;li&gt;Wygenerować &lt;code class=&quot;highlighter-rouge&quot;&gt;CHANGELOG.md&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Aby nie zapomnieć o typie podczas tworzenia rewizji wykorzystajmy dwa narzędzia:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;husky&lt;/code&gt; — podłączenie się pod zdarzenie tworzenia rewizji&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;commitlint&lt;/code&gt; — weryfikacja treści &lt;strong&gt;Commit Message&lt;/strong&gt;-a&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Do wygenerowania changeloga przedstawię 3 narzędzia.&lt;/p&gt;

&lt;h2 id=&quot;1-commitlint&quot;&gt;1. &lt;a href=&quot;https://github.com/conventional-changelog/commitlint&quot;&gt;commitlint&lt;/a&gt;&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;Instalacja&lt;/p&gt;

    &lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;  npm &lt;span class=&quot;nb&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-D&lt;/span&gt; @commitlint/config-conventional @commitlint/cli
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Stworzyć plik &lt;code class=&quot;highlighter-rouge&quot;&gt;commitlint.config.js&lt;/code&gt; o zawartości:&lt;/p&gt;

    &lt;div class=&quot;language-js highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;  &lt;span class=&quot;nx&quot;&gt;module&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;exports&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;extends&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'@commitlint/config-conventional'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;2-husky&quot;&gt;2. &lt;a href=&quot;https://github.com/typicode/husky&quot;&gt;husky&lt;/a&gt;&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;Instalacja&lt;/p&gt;

    &lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;  npm &lt;span class=&quot;nb&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-D&lt;/span&gt; husky
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Dodać do pliku &lt;code class=&quot;highlighter-rouge&quot;&gt;package.json&lt;/code&gt; następujący wpis (w głównym obiekcie):&lt;/p&gt;

    &lt;div class=&quot;language-json highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;w&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;husky&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
          &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;hooks&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
              &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;commit-msg&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;commitlint -E HUSKY_GIT_PARAMS&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
          &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;3-changelog&quot;&gt;3. Changelog&lt;/h2&gt;

&lt;h3 id=&quot;opcja-nr-1--git-changelog&quot;&gt;Opcja nr 1 — &lt;a href=&quot;https://github.com/rafinskipg/git-changelog&quot;&gt;git-changelog&lt;/a&gt;&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;Instalacja&lt;/p&gt;

    &lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;  npm &lt;span class=&quot;nb&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-D&lt;/span&gt; git-changelog
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Dodać zadanie w &lt;code class=&quot;highlighter-rouge&quot;&gt;package.json&lt;/code&gt;:&lt;/p&gt;

    &lt;div class=&quot;language-json highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;w&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;scripts&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
          &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;changelog&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;git-changelog -e&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Stworzyć plik &lt;a href=&quot;https://github.com/rafinskipg/git-changelog#changelogrc-specification&quot;&gt;.changelogrc&lt;/a&gt;.
  Format pliku dostępny w linku.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote class=&quot;block-average&quot;&gt;
  &lt;p&gt;&lt;strong&gt;Uwaga&lt;/strong&gt;: Brakuje wsparcia dla grupowania rewizji.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3 id=&quot;opcja-nr-2--generate-changelog&quot;&gt;Opcja nr 2 — &lt;a href=&quot;https://www.npmjs.com/package/generate-changelog&quot;&gt;generate-changelog&lt;/a&gt;&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;Instalacja&lt;/p&gt;

    &lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;  npm i &lt;span class=&quot;nt&quot;&gt;-D&lt;/span&gt; generate-changelog
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Dodać do pliku &lt;code class=&quot;highlighter-rouge&quot;&gt;package.json&lt;/code&gt; rekomendowane zadania:&lt;/p&gt;

    &lt;div class=&quot;language-json highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;w&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;scripts&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
          &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;release:major&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;changelog -M &amp;amp;&amp;amp; git add CHANGELOG.md &amp;amp;&amp;amp; git commit -m 'Regenerate CHANGELOG.md' &amp;amp;&amp;amp; npm version major &amp;amp;&amp;amp; git push origin &amp;amp;&amp;amp; git push origin --tags&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
          &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;release:minor&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;changelog -m &amp;amp;&amp;amp; git add CHANGELOG.md &amp;amp;&amp;amp; git commit -m 'Regenerate CHANGELOG.md' &amp;amp;&amp;amp; npm version minor &amp;amp;&amp;amp; git push origin &amp;amp;&amp;amp; git push origin --tags&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
          &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;release:patch&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;changelog -p &amp;amp;&amp;amp; git add CHANGELOG.md &amp;amp;&amp;amp; git commit -m 'Regenerate CHANGELOG.md' &amp;amp;&amp;amp; npm version patch &amp;amp;&amp;amp; git push origin &amp;amp;&amp;amp; git push origin --tags&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote class=&quot;block-average&quot;&gt;
  &lt;p&gt;&lt;strong&gt;Uwaga&lt;/strong&gt;: Brakuje wsparcia dla grupowania rewizji.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3 id=&quot;opcja-nr-3--auto-changelog&quot;&gt;Opcja nr 3 — &lt;a href=&quot;https://github.com/CookPete/auto-changelog&quot;&gt;auto-changelog&lt;/a&gt;&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;Instalacja&lt;/p&gt;

    &lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;  npm &lt;span class=&quot;nb&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-D&lt;/span&gt; auto-changelog
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Dodać zadanie w &lt;code class=&quot;highlighter-rouge&quot;&gt;package.json&lt;/code&gt;:&lt;/p&gt;

    &lt;div class=&quot;language-json highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;w&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;scripts&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
          &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;changelog&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;auto-changelog -u -l false&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote class=&quot;block-good&quot;&gt;
  &lt;p&gt;&lt;strong&gt;Uwaga&lt;/strong&gt;: Posiada wsparcie dla prefiksów.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote class=&quot;block-good&quot;&gt;
  &lt;p&gt;&lt;strong&gt;Uwaga&lt;/strong&gt;: Posiada wsparcie dla grupowania rewizji.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Przykład pracy &lt;code class=&quot;highlighter-rouge&quot;&gt;auto-changelog&lt;/code&gt;a jest widoczny w bibliotece
&lt;a href=&quot;https://github.com/piecioshka/super-event-emitter/blob/main/CHANGELOG.md&quot;&gt;super-event-emitter&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id=&quot;opcja-nr-4--rekomendowana--conventional-changelog&quot;&gt;Opcja nr 4 — &lt;strong&gt;REKOMENDOWANA&lt;/strong&gt; — &lt;a href=&quot;https://github.com/conventional-changelog/conventional-changelog&quot;&gt;conventional-changelog&lt;/a&gt;&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;Instalacja&lt;/p&gt;

    &lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;  npm &lt;span class=&quot;nb&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-D&lt;/span&gt; conventional-changelog-cli
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Dodać zadanie w &lt;code class=&quot;highlighter-rouge&quot;&gt;package.json&lt;/code&gt;:&lt;/p&gt;

    &lt;div class=&quot;language-json highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;w&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;scripts&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
          &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;changelog&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;conventional-changelog -p angular -i CHANGELOG.md -s -r 0&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote class=&quot;block-good&quot;&gt;
  &lt;p&gt;&lt;strong&gt;Uwaga&lt;/strong&gt;: Posiada wsparcie dla ROŻNYCH typów prefiksów.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote class=&quot;block-good&quot;&gt;
  &lt;p&gt;&lt;strong&gt;Uwaga&lt;/strong&gt;: Posiada wsparcie dla grupowania rewizji.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4 id=&quot;rozwiązanie-problemu-release-bez-changeloga&quot;&gt;Rozwiązanie problemu release bez changeloga&lt;/h4&gt;

&lt;p&gt;Jeśli zdefiniujemy zadanie &lt;code class=&quot;highlighter-rouge&quot;&gt;version&lt;/code&gt; w &lt;code class=&quot;highlighter-rouge&quot;&gt;run-scripts&lt;/code&gt; w &lt;code class=&quot;highlighter-rouge&quot;&gt;package.json&lt;/code&gt;,
to podczas uruchamiania &lt;code class=&quot;highlighter-rouge&quot;&gt;npm version [major|minor|patch]&lt;/code&gt;, zadanie zostanie
wykonane przed stworzeniem nowej rewizji oraz taga. Jeśli dowolny plik będzie
dodany do “Git Stage”, to &lt;code class=&quot;highlighter-rouge&quot;&gt;npm version [major|minor|patch]&lt;/code&gt; doda ten plik
do rewizji z podbiciem wersji.&lt;/p&gt;

&lt;p&gt;Przykład rekomendowanego sposobu:&lt;/p&gt;

&lt;div class=&quot;language-json highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;scripts&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;version&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;conventional-changelog -p angular -i CHANGELOG.md -s -r 0 &amp;amp;&amp;amp; git add CHANGELOG.md&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Więcej do poczytania na stronie projektu &lt;a href=&quot;https://github.com/conventional-changelog/conventional-changelog/tree/master/packages/conventional-changelog-cli#with-npm-version&quot;&gt;conventional-changelog&lt;/a&gt;&lt;/p&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;p&gt;Narzędzia do zbudowania pliku &lt;code class=&quot;highlighter-rouge&quot;&gt;CHANGELOG.md&lt;/code&gt; mogą być używane bez dodawania typów
w Commit Message-u, tylko wtedy nie będzie pogrupowanych rewizji i wszystkie
zostaną wrzucone do jednego worka.&lt;/p&gt;
</description>
            <pubDate>Sat, 23 Mar 2019 20:58:42 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2019/03/23/husky-commitlint-git-changelog.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2019/03/23/husky-commitlint-git-changelog.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/post-banner-git-changelog.png</image>
        </item>
        
        <item>
            <title>compose vs pipe</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Kilka dni temu &lt;a href=&quot;https://github.com/piecioshka/pipe/&quot;&gt;opublikowałem&lt;/a&gt; projekt na GitHubie, którego główną ideą
jest komponowanie funkcji. Źródła projektu składają się z jednej funkcji,
która należy do zbioru funkcji typu &lt;code class=&quot;highlighter-rouge&quot;&gt;Higher-order Function&lt;/code&gt;.&lt;/p&gt;

&lt;div class=&quot;language-js highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nx&quot;&gt;module&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;exports&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;pipe&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(...&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;fnList&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;iterator&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;fnList&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;Symbol&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;iterator&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]();&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;result&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;handle&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(...&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;args&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;fn&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;iterator&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;next&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;typeof&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;fn&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'undefined'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;result&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;typeof&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;fn&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;!==&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'function'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;throw&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;TypeError&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;

        &lt;span class=&quot;nx&quot;&gt;result&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;fn&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(...&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;args&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;handle&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;result&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;handle&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p class=&quot;listing-caption&quot;&gt;Listing 1. Cały kod projektu&lt;/p&gt;

&lt;h2 id=&quot;pipe&quot;&gt;Pipe&lt;/h2&gt;

&lt;p&gt;Istnieje umowna zasada, à propos kolejność “składanych” funkcji.
Biblioteka, którą napisałem, nazywa się &lt;code class=&quot;highlighter-rouge&quot;&gt;pipe&lt;/code&gt;, bo uruchamia
funkcje w kolejności ich definicji.&lt;/p&gt;

&lt;p&gt;Podobnie jak ma to miejsce w terminalu:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;ll | &lt;span class=&quot;nb&quot;&gt;wc&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-l&lt;/span&gt; &lt;span class=&quot;c&quot;&gt;# pipe&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;ul&gt;
  &lt;li&gt;na początku zostanie uruchomione polecenie &lt;code class=&quot;highlighter-rouge&quot;&gt;ll&lt;/code&gt;,&lt;/li&gt;
  &lt;li&gt;a następnie &lt;code class=&quot;highlighter-rouge&quot;&gt;wc -l&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;language-text highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;f(plusOne, multiplyBy10)(x) = multiplyBy10(plusOne(x));
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p class=&quot;listing-caption&quot;&gt;Listing 2. Matematyczny zapis składania funkcji.&lt;/p&gt;

&lt;p&gt;Użycie takiej funkcji sprowadza się do uruchomienia:&lt;/p&gt;

&lt;div class=&quot;language-js highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;plusOne&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;v&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;v&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;multiplyBy10&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;v&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;v&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;fn&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;pipe&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;plusOne&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;multiplyBy10&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;nx&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;fn&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;));&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// 30&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p class=&quot;listing-caption&quot;&gt;Listing 3. “Składanie” funkcji w jedną.&lt;/p&gt;

&lt;h2 id=&quot;compose&quot;&gt;Compose&lt;/h2&gt;

&lt;p&gt;Natomiast, co jeśli chcemy uruchamiać funkcje w odwrotnej kolejności?
Do tego właśnie służy function &lt;code class=&quot;highlighter-rouge&quot;&gt;compose&lt;/code&gt;.&lt;/p&gt;

&lt;div class=&quot;language-text highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;f(multiplyBy10, plusOne)(x) = plusOne(multiplyBy10(x));
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p class=&quot;listing-caption&quot;&gt;Listing 4. Matematyczny zapis składania funkcji.&lt;/p&gt;

&lt;p&gt;Użycie funkcji &lt;code class=&quot;highlighter-rouge&quot;&gt;compose&lt;/code&gt; (gdyby taka istniała) dałoby odmienny wynik:&lt;/p&gt;

&lt;div class=&quot;language-js highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;plusOne&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;v&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;v&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;multiplyBy10&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;v&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;v&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;fn&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;compose&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;plusOne&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;multiplyBy10&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;nx&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;fn&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;));&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// 21&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p class=&quot;listing-caption&quot;&gt;Listing 5. “Składanie” funkcji w jedną.&lt;/p&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;p&gt;PS Dziękuję &lt;a href=&quot;https://twitter.com/miloszpp/status/1076935396842446853&quot;&gt;@miloszpp&lt;/a&gt; za podpowiedź w temacie &lt;code class=&quot;highlighter-rouge&quot;&gt;compose&lt;/code&gt; vs &lt;code class=&quot;highlighter-rouge&quot;&gt;pipe&lt;/code&gt;.&lt;/p&gt;

&lt;h2 id=&quot;bibliografia&quot;&gt;Bibliografia&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;… o &lt;a href=&quot;https://blog.piotrnalepa.pl/2013/04/10/js-higher-order-functions-jak-wydajnie-pisac-kod-aplikacji-webowych/&quot;&gt;Higher-order Function&lt;/a&gt; autorstwa &lt;a href=&quot;https://twitter.com/sunpietro&quot;&gt;Piotra Nalepy&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;… o &lt;a href=&quot;https://www.idaszak.com/article/2017/10/22/podstawy-programowania-funkcyjnego-5-function-composition&quot;&gt;Currying&lt;/a&gt;-u autorstwa &lt;a href=&quot;https://www.linkedin.com/in/daniel-idaszak-8b1481121/&quot;&gt;Daniela Idaszaka&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Więcej na temat programowania funkcyjnego znajdziesz na blogu — &lt;a href=&quot;https://codewithstyle.info&quot;&gt;codewithstyle.info&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Jeśli jesteście ciekawi jak wygląda temat HOF w książce “Eloquent JavaScript”
  to zapraszam: &lt;a href=&quot;https://eloquentjavascript.net/05_higher_order.html&quot;&gt;https://eloquentjavascript.net/05_higher_order.html&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Mój dobry kolega — Kyle Simson — w swojej książce YDKJS także opisał
  &lt;a href=&quot;https://github.com/getify/You-Dont-Know-JS/blob/f0d591b6502c080b92e18fc470432af8144db610/scope%20%26%20closures/ch5.md&quot;&gt;tematykę domknięć&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;!-- Resources --&gt;

</description>
            <pubDate>Thu, 14 Feb 2019 15:09:28 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2019/02/14/compose-vs-pipe.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2019/02/14/compose-vs-pipe.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/post-banner-pipe-vs-compose.png</image>
        </item>
        
        <item>
            <title>Jak pisać dobre komentarze? Według książki Clean Code</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Dawno temu chciałem napisać artykuł — ależ to słowo jest popularne na moim
blogu — na temat pisania dobrych komentarzy. Podczas pracy na kodem wiele razy
spotkałem się jak moi współpracownicy pisali komentarz, który nic nie wnosił.
Jak ustrzec się przed takimi komentarzami? Garść mojego doświadczenia oraz
wielki skrót rozdziału 4. z książki — a raczej podręcznika każdego developera
— “Clean Code” autorstwa Roberta C. Martina.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/post-banner-clean-code-comments.png&quot; itemprop=&quot;image&quot; alt=&quot;Baner promujący artykuł&quot; /&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;clean-code--kilka-słów-od-wujka-martina&quot;&gt;Clean Code — kilka słów od wujka Martina&lt;/h2&gt;

&lt;p&gt;Cytaty pochodzą z książki pt. &lt;a href=&quot;https://helion.pl/ksiazki/czysty-kod-podrecznik-dobrego-programisty-robert-c-martin,czykov.htm&quot;&gt;“Czysty kod. Podręcznik dobrego programisty”&lt;/a&gt;
wydawnictwa Helion.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;“Za każdym razem, gdy piszemy komentarz, powinniśmy poczuć smak porażki.”&lt;/p&gt;

    &lt;p&gt;&lt;em&gt;&lt;strong&gt;Moja opinia:&lt;/strong&gt; Zgadzam się. Często, gdy widzę komentarz, to znaczy,
  że ktoś napisał taki kod, który wg autora nie jest zrozumiały — dlatego,
  aby pomóc sobie i innym czytającym, autor kodu napisał komentarz.&lt;/em&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;“[kod]… jest jedynym źródłem naprawdę dokładnych informacji”&lt;/p&gt;

    &lt;p&gt;&lt;em&gt;&lt;strong&gt;Moja opinia:&lt;/strong&gt; Dokumentacja (czyli kod), nigdy nie będzie, z uwagi
  na potrzebę zapewnienia synchronizacji z kodem, co niesie ze sobą kolejne
  zadanie dla programisty.&lt;/em&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;“Wszystkie komentarze, które wymuszają zaglądanie do innych modułów, w celu
  ich zrozumienia, nie są warte bitów, które zajmują.”&lt;/p&gt;

    &lt;p&gt;&lt;em&gt;&lt;strong&gt;Moja opinia:&lt;/strong&gt; Ile to razy miałem problem z odczytem komentarza.
  Otwierałem kolejne pliki, aby lepiej zrozumieć jego sens.&lt;/em&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;“Wymaganie, aby każda funkcja posiadała Javadoc lub aby każda zmienna
  posiadała komentarz jest po prostu głupie.”&lt;/p&gt;

    &lt;p&gt;&lt;em&gt;&lt;strong&gt;Moja opinia:&lt;/strong&gt; Zgadzam się i dlatego też często wyłączamy opcje w ESLint
  sprawdzającą, czy przed funkcję mam napisanego JSDoca. Bez sensu pisać
  komentarz do każdej funkcji.&lt;/em&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;“Nie używaj komentarzy, jeżeli można użyć funkcji lub zmiennej”&lt;/p&gt;

    &lt;p&gt;&lt;em&gt;&lt;strong&gt;Moja opinia:&lt;/strong&gt; Trudno będzie znaleźć kontrargument. Jako developerzy
  czytamy kod. Jeśli nazwy funkcji i zmiennych odzwierciedlają to, co robią
  oraz przechowują, to w takich przypadkach rzadko pojawią się komentarze.&lt;/em&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;“Zadaniem komentarza jest wyjaśnienie kodu, który sam się nie objaśnia”&lt;/p&gt;

    &lt;p&gt;&lt;em&gt;&lt;strong&gt;Moja opinia:&lt;/strong&gt; Dlatego też lepiej jest napisać dobry kod. Nie jestem
  zwolennikiem używania tzw. “magic numbers” oraz “magic strings”. Zawszę
  tworzę stałą, która będzie przechowywała daną wartość. Każda stała
  ma swoją nazwę, która powinna uzasadnić istnienie danej wartości.&lt;/em&gt;&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;moja-najważniejsza-porada&quot;&gt;Moja najważniejsza porada&lt;/h2&gt;

&lt;p&gt;Jak już piszesz komentarz — zrób to właściwie. Dlatego, jeśli miałbym
udzielić tylko jednej porady to &lt;strong&gt;unikaj powtarzających komentarzy&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Zły przykład komentarza&lt;/strong&gt;, który opisuje jak kod działa:&lt;/p&gt;

&lt;div class=&quot;language-js highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;// Stworzenie zmiennej, która przechowuje opóźnienie&lt;/span&gt;
&lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;LOAD_DELAY&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;500&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Dobry przykład komentarza&lt;/strong&gt;, który wyjaśnia:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;dlaczego taki kod został stworzony?&lt;/li&gt;
  &lt;li&gt;komu się przydaje?&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;language-js highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;// Sztuczne opóźnienie (w milisekundach),&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;// aby zasymulować uruchamianie systemu.&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;// Zapewnienie lepszego user experience.&lt;/span&gt;
&lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;LOAD_DELAY&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;500&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;p&gt;Jestem bardzo zadowolony z lektury rozdziału 4. książki “Clean Code” - równo 20
stron. Książka opisuje doświadczenie developerów, którzy “zjedli zęby”
na wytwarzaniu oprogramowania. Może być ona czytana “na wyrywki”, czyli nie
trzeba jej czytać od deski do deski.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Książka ląduje do sekcji &lt;a href=&quot;/polecane-ksiazki/&quot;&gt;“Polecane książki”&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;!-- Resources --&gt;

</description>
            <pubDate>Sun, 03 Feb 2019 11:20:50 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2019/02/03/jak-pisac-dobre-komentarze.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2019/02/03/jak-pisac-dobre-komentarze.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/post-banner-clean-code-comments.png</image>
        </item>
        
        <item>
            <title>Jak zarządzać baterią w MacBooku? Battery Life Extender</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Dziś znowu wymieniłem baterię w laptopie. Drugi raz w ciągu 1.5 roku.
Dlaczego tak często mi się to zdarza? Wszystko przez to, że nie potrafię
zapamiętać prostej rzeczy. Przeczytasz o niej poniżej.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/post-banner-battery-life-extender.png&quot; itemprop=&quot;image&quot; alt=&quot;Baner promujący artykuł&quot; /&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;złota-zasada&quot;&gt;Złota zasada&lt;/h2&gt;

&lt;p&gt;Po pierwszej wymianie baterii dowiedziałem się, że:&lt;/p&gt;

&lt;blockquote class=&quot;block-average&quot;&gt;
  &lt;p&gt;&lt;strong&gt;Złota zasada&lt;/strong&gt;: Aby przedłużyć działania baterii należy odłączać
kabel zasilania, kiedy bateria zostanie w całości naładowana.
Ładowarkę należy podłączyć, kiedy stan naładowania baterii będzie mniejszy
niż ok. 15%.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Niby zasada bardzo prosta, aczkolwiek trzymałem się jej przez kolejne 2 dni.&lt;/p&gt;

&lt;h2 id=&quot;problem-z-pamięcią-u-mnie&quot;&gt;Problem z pamięcią? U mnie?&lt;/h2&gt;

&lt;p&gt;Wszystkiego jest winna moja pamięć, która wyparła informację, aby odłączać
przewód zasilający po osiągnięciu 100% naładowania akumulatorów.&lt;/p&gt;

&lt;p&gt;Istnieje dobry sposób, aby rozwiązać sytuację z pamięcią. Oddelegować je!&lt;/p&gt;

&lt;h2 id=&quot;od-pomysłu-do-realizacji&quot;&gt;Od pomysłu do realizacji&lt;/h2&gt;

&lt;p&gt;Dlaczego by nie napisać aplikacji, której funkcje byłyby dość proste:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;sprawdzić aktualny poziom baterii&lt;/li&gt;
  &lt;li&gt;reagować na skrajne wartości poziomu baterii:
    &lt;ul&gt;
      &lt;li&gt;
        &lt;p&gt;jeśli poziom mniejszy niż 15% wyświetl powiadomienie w stylu:&lt;/p&gt;

        &lt;p&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;podłącz przewód zasilania&lt;/code&gt;&lt;/p&gt;
      &lt;/li&gt;
      &lt;li&gt;
        &lt;p&gt;jeśli poziom równy 100% wyświetl powiadomienie w stylu:&lt;/p&gt;

        &lt;p&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;odłącz przewód zasilania&lt;/code&gt;&lt;/p&gt;
      &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;moje-nowe-narzędzie-battery-life-extender&quot;&gt;Moje nowe narzędzie &lt;code class=&quot;highlighter-rouge&quot;&gt;Battery Life Extender&lt;/code&gt;&lt;/h2&gt;

&lt;p&gt;Stworzyłem aplikację, która realizuje wyżej wymienione funkcje.&lt;/p&gt;

&lt;p&gt;Projekt został opublikowany pod adresem:&lt;br /&gt;
&lt;a href=&quot;https://github.com/piecioshka/battery-life-extender&quot;&gt;https://github.com/piecioshka/battery-life-extender&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Zapraszam do &lt;strong&gt;Code Review&lt;/strong&gt;!&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;https://raw.githubusercontent.com/piecioshka/battery-life-extender/main/screenshots/demo-battery-low.png&quot; alt=&quot;&quot; /&gt;
&lt;img src=&quot;https://raw.githubusercontent.com/piecioshka/battery-life-extender/main/screenshots/demo-battery-full.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;h2 id=&quot;jak-zainstalować&quot;&gt;Jak zainstalować?&lt;/h2&gt;

&lt;ol&gt;
  &lt;li&gt;Pobierz &lt;a href=&quot;https://github.com/piecioshka/battery-life-extender/releases&quot;&gt;najnowszą wersję&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Rozpakuj paczkę&lt;/li&gt;
  &lt;li&gt;Przenieś plik &lt;code class=&quot;highlighter-rouge&quot;&gt;Battery Life Extender.app&lt;/code&gt; do katalogu &lt;code class=&quot;highlighter-rouge&quot;&gt;/Applications/&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;Uruchom aplikację &lt;em&gt;(kliknij ikonkę prawym przyciskiem)&lt;/em&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;p&gt;Dodam, że:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;aplikacja &lt;strong&gt;nie robi więcej niż jest to napisane w tym artykule&lt;/strong&gt;
    &lt;ul&gt;
      &lt;li&gt;chciałbym, aby była ona lekka i nie &lt;em&gt;zżerała&lt;/em&gt; baterii&lt;/li&gt;
      &lt;li&gt;tym samym &lt;strong&gt;nie ma żadnych statystyk&lt;/strong&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;aplikacja działa tylko na macOS — nie mam możliwości napisać uniwersalnej aplikacji&lt;/li&gt;
  &lt;li&gt;nie jest potrzebne żadne GUI (nie ma żadnych pasków i ikonek)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Wyłączenie aplikacji jest tożsame z zakończeniem procesu “Battery Life Extender”.&lt;/p&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;p&gt;Składam podziękowania za pomoc w testach dla &lt;a href=&quot;https://www.linkedin.com/in/tetianaplatonova/&quot;&gt;Tati&lt;/a&gt;, &lt;a href=&quot;https://www.linkedin.com/in/dzieniszewski/&quot;&gt;Kamila&lt;/a&gt; oraz &lt;a href=&quot;https://www.linkedin.com/in/daniel-siwek-637877120/&quot;&gt;Daniela&lt;/a&gt;.&lt;/p&gt;

&lt;!-- Resources --&gt;

</description>
            <pubDate>Fri, 01 Feb 2019 13:56:44 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2019/02/01/jak-zarzadzac-bateria-w-macbooku.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2019/02/01/jak-zarzadzac-bateria-w-macbooku.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/post-banner-battery-life-extender.png</image>
        </item>
        
        <item>
            <title>Jak zwiększyć ilość wolnego miejsca na dysku?</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Czy widziałeś kiedyś komunikat &lt;code class=&quot;highlighter-rouge&quot;&gt;No space left on device&lt;/code&gt;? Czy po restarcie
przeglądarki nie przywracają Ci się zakładki? Czy nie możesz zrobić nowego
projektu, bo nie masz miejsca na dysku? Chciałem się podzielić z Wami, jakie
ja mam rozwiązania na powyższe sytuacje.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/post-banner-free-disk-space.png&quot; itemprop=&quot;image&quot; alt=&quot;Baner promujący artykuł&quot; /&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;rozwiązanie-problemu-no-space-left-on-device&quot;&gt;Rozwiązanie problemu “No space left on device”&lt;/h2&gt;

&lt;p&gt;W moim przypadku, kiedy używam dużo dwóch narzędzi &lt;code class=&quot;highlighter-rouge&quot;&gt;npm&lt;/code&gt; i &lt;code class=&quot;highlighter-rouge&quot;&gt;brew&lt;/code&gt;, jestem
podatny przechowywanie bibliotek, które nie są mi potrzebne,
bo, np. wyszły ich nowe wersje, które mam już zainstalowane.&lt;/p&gt;

&lt;h3 id=&quot;pomysł-1--npm--usuwamy-cache&quot;&gt;💡Pomysł 1 — npm — Usuwamy cache&lt;/h3&gt;

&lt;p&gt;Na początku usuniemy wszystkie paczki, które zostały dodane do cache-a:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;npm cache clean &lt;span class=&quot;nt&quot;&gt;--force&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;pomysł-2--brew--usuwamy-stare-wersje-programów&quot;&gt;💡Pomysł 2 — brew — Usuwamy stare wersje programów&lt;/h3&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;brew cleanup
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;W moim przypadku dostałem taki oto komunikat:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;==&amp;gt; This operation has freed approximately 3.25GB of disk space.&lt;/em&gt;&lt;/p&gt;

&lt;figure class=&quot;social-center-block&quot;&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;pl&quot; dir=&quot;ltr&quot;&gt;Zaoszczędź miejsce na dysku za pomocą:&lt;br /&gt;&lt;br /&gt;npm cache clean --force &lt;br /&gt;brew cleanup&lt;br /&gt;&lt;br /&gt;Napisz o ile schudł dysk Twojej maszyny?&lt;br /&gt;&lt;br /&gt;PS. Ja dziś 3.25GB do przodu! &lt;a href=&quot;https://t.co/lEMwaWbEmG&quot;&gt;pic.twitter.com/lEMwaWbEmG&lt;/a&gt;&lt;/p&gt;&amp;mdash; Piotr Kowalski (@piecioshka) &lt;a href=&quot;https://twitter.com/piecioshka/status/1017351224818094082?ref_src=twsrc%5Etfw&quot;&gt;July 12, 2018&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async=&quot;&quot; src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;

&lt;/figure&gt;

&lt;h3 id=&quot;pomysł-3--node_modules--pozbycie-się-wszystkich-katalogów&quot;&gt;💡Pomysł 3 — node_modules — Pozbycie się wszystkich katalogów&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Poniższe polecenie uruchamiamy z poziomu katalog z projektami.&lt;/strong&gt;
W moim przypadku jest to &lt;code class=&quot;highlighter-rouge&quot;&gt;~/projects/&lt;/code&gt;. Polecenie przeszukuje wszystkie katalogi
pod kątem występowania katalogów z paczkami z npm-a i je usuwa.&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;find &lt;span class=&quot;nb&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-name&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;node_modules&quot;&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-maxdepth&lt;/span&gt; 2 | xargs &lt;span class=&quot;nb&quot;&gt;rm&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-rf&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Przecież wiadomo ile waży katalog &lt;code class=&quot;highlighter-rouge&quot;&gt;node_modules&lt;/code&gt;. Zagraniczne źródła podają,
że jest on cięższy od czarnej dziury.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/npm/node_modules-joke.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;figcaption&gt;
        &lt;a href=&quot;https://www.improgrammer.net/most-popular-node-js-framework-2016/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
            improgrammer.net
        &lt;/a&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Zobaczcie, ile zwolniłem przestrzeni dyskowej po wykonaniu powyższego polecenia:&lt;/p&gt;

&lt;figure class=&quot;social-center-block&quot;&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;pl&quot; dir=&quot;ltr&quot;&gt;cd projects/&lt;br /&gt;find . -name &amp;quot;node_modules&amp;quot; -maxdepth 2 | xargs rm -rf&lt;br /&gt;&lt;br /&gt;// Zwolniłem 5.2 GB&lt;/p&gt;&amp;mdash; Piotr Kowalski (@piecioshka) &lt;a href=&quot;https://twitter.com/piecioshka/status/1020801012259524613?ref_src=twsrc%5Etfw&quot;&gt;July 21, 2018&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async=&quot;&quot; src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;

&lt;/figure&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;p&gt;&lt;mark&gt;Aktualizacja: 2019-04-08&lt;/mark&gt;&lt;/p&gt;

&lt;h3 id=&quot;pomysł-4--docker--pozbycie-się-wszystkich-obrazów-i-kontenerów&quot;&gt;💡Pomysł 4 — docker — Pozbycie się wszystkich obrazów i kontenerów&lt;/h3&gt;

&lt;p&gt;W dobie dzisiejszego oprogramowania wszystko trzymamy w kontenerach Dockerowych.
Nie są one czyszczone kiedy przestajemy ich używać. Dlatego też od czasu
do czasu aby zwolnić kilka gigabajtów warto uruchomić:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;docker system prune &lt;span class=&quot;nt&quot;&gt;-a&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;# oraz&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;rm&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-rf&lt;/span&gt; ~/Library/Containers/com.docker.docker/Data/&lt;span class=&quot;k&quot;&gt;*&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;jak-sprawdzić-wielkość-dostępnej-przestrzeni&quot;&gt;Jak sprawdzić wielkość dostępnej przestrzeni?&lt;/h2&gt;

&lt;p&gt;W systemach unixowych, a do tej rodziny należy system macOS, który jest
zainstalowany na moim komputerze, wystarczy wydać polecenie:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;df&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-h&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
</description>
            <pubDate>Wed, 19 Dec 2018 08:11:37 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2018/12/19/jak-zwiekszyc-ilosc-wolnego-miejsca-na-dysku-twardym.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2018/12/19/jak-zwiekszyc-ilosc-wolnego-miejsca-na-dysku-twardym.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/post-banner-free-disk-space.png</image>
        </item>
        
        <item>
            <title>Dobre praktyki w JavaScript: $ (dolar) w nazwie zmiennej</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Piszę dużo w czystym JavaScript. Wprowadziłem do swojego stylu pracy pewien szczegół.
Mianowicie ulepszyłem nazewnictwo zmiennych. W pewnych przypadkach (o których
więcej w dalszej części) zaczynam nazwę zmiennej od znaku dolara (&lt;code class=&quot;highlighter-rouge&quot;&gt;$&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;Chcesz dowiedzieć się dlaczego?&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/post-banner-javascript.png&quot; itemprop=&quot;image&quot; alt=&quot;Baner promujący artykuł&quot; /&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;po-co-mi-dolar-zadanie-️&quot;&gt;Po co mi dolar? Zadanie ⌨️&lt;/h2&gt;

&lt;p&gt;Zanim odpowiem na pytanie, spróbuj napisać kawałek kodu, który:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;będzie pobierać &lt;code class=&quot;highlighter-rouge&quot;&gt;username&lt;/code&gt; użytkownika z pola &lt;code class=&quot;highlighter-rouge&quot;&gt;input&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;sprawdzi, czy wpisana wartość &lt;em&gt;nie jest pusta&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Masz pomysł na implementację?&lt;/p&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;p&gt;Prawdopodobnie napisałbyś coś takiego:&lt;/p&gt;

&lt;div class=&quot;language-js highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;username&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;document&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;querySelector&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'.username'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;userName&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;username&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;isEmptyUsername&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;userName&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;length&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

&lt;span class=&quot;nx&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;({&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;isEmptyUsername&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;W takim przypadku aż kusi stwierdzenie, że zmienne &lt;code class=&quot;highlighter-rouge&quot;&gt;username&lt;/code&gt; oraz &lt;code class=&quot;highlighter-rouge&quot;&gt;userName&lt;/code&gt;
są bardzo podobne, co może generować błędy.&lt;/p&gt;

&lt;h2 id=&quot;moja-rada&quot;&gt;Moja rada&lt;/h2&gt;

&lt;p&gt;W opisywanej przeze mnie sytuacji uprościłbym sobie życie i zastosował regułę:&lt;/p&gt;

&lt;blockquote class=&quot;block-average&quot;&gt;
  &lt;h3 id=&quot;-złota-zasada&quot;&gt;&lt;i class=&quot;icon-average&quot;&gt;&lt;/i&gt; Złota Zasada&lt;/h3&gt;
  &lt;p&gt;Jeśli zmienna przechowuje referencję do elementu w DOM, poprzedź jej nazwę
znakiem dolara. Poprzez element mam na myśli: &lt;code class=&quot;highlighter-rouge&quot;&gt;Node&lt;/code&gt; lub &lt;code class=&quot;highlighter-rouge&quot;&gt;NodeList&lt;/code&gt;.&lt;br /&gt;
Jeśli używasz jQuery lub jakiejś innej biblioteki do komunikacji z DOMem,
to zmienne przechowujące obiekty jQuery też poprzedzam znakiem dolara.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Powyższy kod przepisałbym do następującego:&lt;/p&gt;

&lt;div class=&quot;language-js highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;$username&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;document&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;querySelector&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'.username'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;username&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;$username&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;isEmptyUsername&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;username&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;length&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

&lt;span class=&quot;nx&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;({&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;isEmptyUsername&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Czytelniej?&lt;/p&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;p&gt;&lt;mark&gt;Aktualizacja: 2018-12-27&lt;/mark&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://codewithstyle.info/Better-RxJS-code-with-pointfree-style/&quot;&gt;Jak widać&lt;/a&gt; nie tylko ja stosuję taką konwencję. Zobaczcie jaki kod wychodzi
spod ręki mojego kolegi blogera — &lt;a href=&quot;https://twitter.com/miloszpp&quot;&gt;Miłosza&lt;/a&gt;:&lt;/p&gt;

&lt;div class=&quot;language-js highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;click$&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;fromEvent&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;breedsFetchEl&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'click'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;breeds$&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;click$&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;pipe&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
  &lt;span class=&quot;nx&quot;&gt;switchMap&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;ajax&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;getJSON&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'https://dog.ceo/api/breeds/list/all'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)),&lt;/span&gt;
  &lt;span class=&quot;nx&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;result&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;Object&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;keys&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;result&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;message&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;join&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;', '&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;nx&quot;&gt;breeds$&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;subscribe&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;breeds&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;breedsListEl&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;innerText&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;breeds&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Jak widać stosuje on dwie konwencje nazewnicze:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;breedsFetchEl&lt;/code&gt; — &lt;code class=&quot;highlighter-rouge&quot;&gt;*El&lt;/code&gt; do nazywania &lt;em&gt;elementów z drzewa DOM&lt;/em&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;breeds$&lt;/code&gt;, &lt;code class=&quot;highlighter-rouge&quot;&gt;click$&lt;/code&gt; — &lt;code class=&quot;highlighter-rouge&quot;&gt;*$&lt;/code&gt; do nazywania &lt;em&gt;reaktywnych strumieni&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;!-- Resources --&gt;

</description>
            <pubDate>Wed, 12 Dec 2018 07:40:42 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2018/12/12/dobre-praktyki-w-javascript-dolar-w-nazwie-zmiennej.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2018/12/12/dobre-praktyki-w-javascript-dolar-w-nazwie-zmiennej.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/post-banner-javascript.png</image>
        </item>
        
        <item>
            <title>Git. Jak usunąć rewizję?</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Miałeś kiedyś problem, aby usunąć przedostatni &lt;a href=&quot;/blog/2013/09/14/git-poczatki-w-najpopularniejszym-systemie-kontroli-wersji.html&quot;&gt;commit&lt;/a&gt;?
Dziś o tym, jak usunąć dowolną rewizję z &lt;a href=&quot;/tag/git/&quot;&gt;Git&lt;/a&gt;-a na 2 sposoby.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/post-banner-git.jpg&quot; itemprop=&quot;image&quot; alt=&quot;Baner promujący artykuł&quot; /&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;krok-po-kroku-&quot;&gt;Krok po kroku 👣&lt;/h2&gt;

&lt;p&gt;Na początku przedstawiam historię repozytorium:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;git log &lt;span class=&quot;nt&quot;&gt;--oneline&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class=&quot;language-text highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;09ee68e Rewizja 4 (HEAD)
60c495b Rewizja 3
6e45e15 Rewizja 2
749fcaa Rewizja 1
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;do-czego-dążymy&quot;&gt;Do czego dążymy?&lt;/h2&gt;

&lt;p&gt;Zdefiniujmy cel zadania, aby wszystko było jasne:&lt;/p&gt;

&lt;blockquote class=&quot;block-info&quot;&gt;
  &lt;h3 id=&quot;-cel&quot;&gt;&lt;i class=&quot;icon-info&quot;&gt;&lt;/i&gt; Cel&lt;/h3&gt;
  &lt;p&gt;Usunięcie commita o &lt;code class=&quot;highlighter-rouge&quot;&gt;id=60c495b&lt;/code&gt;, który ma &lt;a href=&quot;https://chris.beams.io/posts/git-commit/&quot;&gt;commit message&lt;/a&gt; “Rewizja 3”.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id=&quot;realizacja&quot;&gt;Realizacja&lt;/h2&gt;

&lt;p&gt;Skorzystajmy z polecenia &lt;code class=&quot;highlighter-rouge&quot;&gt;git rebase&lt;/code&gt;, które jest w stanie zarządzić historią.&lt;/p&gt;

&lt;h3 id=&quot;1-cofamy-się-o-dwa-commity-czyli-do-rewizja-1&quot;&gt;1. Cofamy się o dwa commity, czyli do “Rewizja 1”&lt;/h3&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;git rebase &lt;span class=&quot;nt&quot;&gt;-i&lt;/span&gt; 749fcaa
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Po tej linijce powinien uruchomić się domyślny edytor.&lt;/p&gt;

&lt;blockquote class=&quot;block-good&quot;&gt;
  &lt;h3 id=&quot;-wskazówka&quot;&gt;&lt;i class=&quot;icon-good&quot;&gt;&lt;/i&gt; Wskazówka&lt;/h3&gt;
  &lt;p&gt;Jak zmienić domyślny edytor? Nadpisz zmienną środowiskową &lt;code class=&quot;highlighter-rouge&quot;&gt;$EDITOR&lt;/code&gt; za pomocą
polecenie: &lt;code class=&quot;highlighter-rouge&quot;&gt;export EDITOR=&quot;nano&quot;&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3 id=&quot;2-dla-starych-wersji-gita-usuwamy-linijkę-z-commitem&quot;&gt;2. (dla starych wersji Gita) Usuwamy linijkę z commitem&lt;/h3&gt;

&lt;div class=&quot;language-text highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;pick 749fcaa - Rewizja 1
pick 6e45e15 - Rewizja 2
pick 09ee68e - Rewizja 4
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;2-dla-nowych-wersji-gita-ustawiamy-stan-commita-na-drop&quot;&gt;2. (dla nowych wersji Gita) Ustawiamy stan commita na &lt;code class=&quot;highlighter-rouge&quot;&gt;drop&lt;/code&gt;&lt;/h3&gt;

&lt;div class=&quot;language-text highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;pick 749fcaa - Rewizja 1
pick 6e45e15 - Rewizja 2
drop 60c495b - Rewizja 3
pick 09ee68e - Rewizja 4
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;3-zapisujemy-plik-oraz-wychodzimy-z-edytora&quot;&gt;3. Zapisujemy plik oraz wychodzimy z edytora&lt;/h3&gt;

&lt;p&gt;Naszym oczom powinien ukazać się komunikat w stylu:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;Successfully rebased and updated refs/heads/master.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Efekt końcowy jest następujący:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Nie ma&lt;/strong&gt; rewizji w historii,&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Nie ma&lt;/strong&gt; zmian wprowadzanych przez usuniętą rewizję.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote class=&quot;block-info&quot;&gt;
  &lt;h3 id=&quot;-dla-przypomnienia&quot;&gt;&lt;i class=&quot;icon-info&quot;&gt;&lt;/i&gt; Dla przypomnienia&lt;/h3&gt;
  &lt;p&gt;W edytorze &lt;a href=&quot;/blog/2017/08/16/vim-porzadek-z-plikami-tymczasowymi.html&quot;&gt;Vim&lt;/a&gt; plik zapisujemy za pomocą polecenie &lt;code class=&quot;highlighter-rouge&quot;&gt;:w&lt;/code&gt; (write),
natomiast opuszczamy edytor za pomocą &lt;code class=&quot;highlighter-rouge&quot;&gt;:q&lt;/code&gt; (quit).&lt;br /&gt;&lt;br /&gt;
Powyższe polecenia można uruchomić za pomocą jednego: &lt;code class=&quot;highlighter-rouge&quot;&gt;:wq&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id=&quot;️-ćwiczenie-dodatkowe&quot;&gt;⭐️ Ćwiczenie dodatkowe&lt;/h2&gt;

&lt;p&gt;Spróbuj zmienić kolejność rewizji, tak aby &lt;code class=&quot;highlighter-rouge&quot;&gt;git log --oneline&lt;/code&gt; pokazywał inną
niż pierwotnie historię rewizji.&lt;/p&gt;

&lt;blockquote class=&quot;block-info&quot;&gt;
  &lt;h3 id=&quot;-wskazówka-1&quot;&gt;&lt;i class=&quot;icon-info&quot;&gt;&lt;/i&gt; Wskazówka&lt;/h3&gt;
  &lt;p&gt;Gdy będzie otwarty edytor, zmień kolejność linijek z rewizjami.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;!-- Resources --&gt;

</description>
            <pubDate>Tue, 11 Dec 2018 08:15:21 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2018/12/11/git-jak-usunac-przedostatnia-rewizje.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2018/12/11/git-jak-usunac-przedostatnia-rewizje.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/post-banner-git.jpg</image>
        </item>
        
        <item>
            <title>Pytanie rekrutacyjne nr 2: Jak optymalizowałbyś zasoby strony internetowej? — JavaScript Developer</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Czas odpowiedzieć na kolejne pytanie rekrutacyjne. Tym razem jest ono związane
z optymalizacją. Jakie znacie techniki optymalizacyjne? Opowiem Wam o kilku,
które znam, a które w tym momencie przychodzą mi do głowy.&lt;/p&gt;

&lt;figure class=&quot;social-center-block&quot;&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;pl&quot; dir=&quot;ltr&quot;&gt;❓ &lt;a href=&quot;https://twitter.com/hashtag/pytanie?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#pytanie&lt;/a&gt; 🎓 &lt;a href=&quot;https://twitter.com/hashtag/rekrutacja?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#rekrutacja&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Drugie pytanie na poziomie podstawowym:&lt;br /&gt;&lt;br /&gt;Jak optymalizowałbyś zasoby strony internetowej? &lt;a href=&quot;https://t.co/ROdUPjucGp&quot;&gt;pic.twitter.com/ROdUPjucGp&lt;/a&gt;&lt;/p&gt;&amp;mdash; Piotr Kowalski (@piecioshka) &lt;a href=&quot;https://twitter.com/piecioshka/status/1070236340816699392?ref_src=twsrc%5Etfw&quot;&gt;December 5, 2018&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async=&quot;&quot; src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;

&lt;/figure&gt;

&lt;h2 id=&quot;moja-odpowiedź&quot;&gt;Moja odpowiedź&lt;/h2&gt;

&lt;p&gt;Jeśli chodzi o techniki optymalizacji, jakie można wprowadzić do strony, to jest
ich mnóstwo. Przygotowałem dla Was &lt;strong&gt;ponad 20 pomysłów&lt;/strong&gt;, aby zoptymalizować
zasoby strony internetowej.&lt;/p&gt;

&lt;h3 id=&quot;obrazki&quot;&gt;Obrazki&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;Technika &lt;code class=&quot;highlighter-rouge&quot;&gt;CSS Sprites&lt;/code&gt; — aby wyeliminować zapytania HTTP za każdym razem,
  gdy strona będzie chciała wyświetlić malutką ikonkę, można obrazki
  połączyć w jeden duży plik.
  &lt;a href=&quot;https://css-tricks.com/css-sprites/&quot;&gt;Więcej&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Obecnie lepszą techniką do wykorzystywania ikono-grafik, jest załączenie
  ich w formie fontu, zbudowanej np. za pomocą &lt;a href=&quot;http://fontello.com/&quot;&gt;Fontello&lt;/a&gt;.
  &lt;a href=&quot;https://forum.pasja-informatyki.pl/104219/fontello-wszystko-co-powinienes-wiedziec&quot;&gt;Więcej&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Kolejnym pomysłem, jest wykorzystanie SVG i używanie ikonek jako
  specjalnie zbudowanych obrazów wektorowych.
  &lt;a href=&quot;https://image.online-convert.com/convert-to-svg&quot;&gt;Więcej&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Wykorzystanie Base64 zamiast bitmap.
  &lt;a href=&quot;https://www.base64-image.de/&quot;&gt;Więcej&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Optymalizacja plików JPG, PNG za pomocą narzędzia &lt;code class=&quot;highlighter-rouge&quot;&gt;ImageOptim&lt;/code&gt; redukując
  delikatnie jakość pliku.
  &lt;a href=&quot;https://imageoptim.com/pl&quot;&gt;Więcej&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Jeśli musi obrazek musi być bitmapą to wykorzystać format JPG, z uwagi
  na możliwość zastosowania dużej kompresji obrazu, redukując tym samym jego
  wielkość.
  &lt;a href=&quot;https://compressor.io/compress&quot;&gt;Więcej&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Zredukowanie wymiarów obrazków do takich, jakie są wykorzystane podczas
  prezentacji na stronie (uniknąć skalowania w dół).
  &lt;a href=&quot;https://developers.google.com/web/tools/chrome-devtools/inspect-styles/edit-dom&quot;&gt;Więcej&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;css-warstwa-arkuszy-stylów-kaskadowych&quot;&gt;CSS: Warstwa arkuszy stylów kaskadowych&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;Spakowanie wszystkich plików &lt;code class=&quot;highlighter-rouge&quot;&gt;*.css&lt;/code&gt; do jednego, aby wyeliminować dużą ilość
  zapytań HTTP.
  &lt;a href=&quot;https://github.com/piecioshka/boilerplate-scss&quot;&gt;Więcej&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Usunięcie nieużywanych selektorów. Do tego celu warto wykorzystać narzędzie
  “Coverage” w DevToolsach przeglądarki Google Chrome.
  &lt;a href=&quot;https://developers.google.com/web/updates/2017/04/devtools-release-notes&quot;&gt;Więcej&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Nie używać składni &lt;code class=&quot;highlighter-rouge&quot;&gt;@import&lt;/code&gt; w plikach &lt;code class=&quot;highlighter-rouge&quot;&gt;*.css&lt;/code&gt;.
  &lt;a href=&quot;https://varvys.com/pagespeed/avoid-css-import.html&quot;&gt;Więcej&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;javascript-warstwa-zdefiniowania-logiki-aplikacji-po-stronie-przeglądarki&quot;&gt;JavaScript: Warstwa zdefiniowania logiki aplikacji po stronie przeglądarki&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;Łączenie plików &lt;code class=&quot;highlighter-rouge&quot;&gt;*.js&lt;/code&gt; w jeden.
  &lt;a href=&quot;https://medium.freecodecamp.org/javascript-modules-part-2-module-bundling-5020383cf306&quot;&gt;Więcej&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Minifikacja kodu (usunięcie białych znaków i komentarzy).
  &lt;a href=&quot;https://webpack.js.org/concepts/mode/#mode-production&quot;&gt;Więcej&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Obfuskacja kodu (zastąpienie długich nazw zmiennych, krótkimi).
  &lt;a href=&quot;https://www.youtube.com/watch?v=8Mhvn2jImwI&quot;&gt;Więcej&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Usunięcie nieużywanych skryptów. Do tego celu warto wykorzystać narzędzie
  “Coverage” w DevToolsach przeglądarki Google Chrome.
  &lt;a href=&quot;https://developers.google.com/web/updates/2017/04/devtools-release-notes&quot;&gt;Więcej&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Osadzenie plików &lt;code class=&quot;highlighter-rouge&quot;&gt;*.js&lt;/code&gt; na dole strony (przed zamknięciem &lt;code class=&quot;highlighter-rouge&quot;&gt;body&lt;/code&gt;).
  &lt;a href=&quot;https://developers.google.com/web/fundamentals/performance/critical-rendering-path/analyzing-crp&quot;&gt;Więcej&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Opóźnienie ładowanie plików &lt;code class=&quot;highlighter-rouge&quot;&gt;*.js&lt;/code&gt; za pomocą atrybutu &lt;code class=&quot;highlighter-rouge&quot;&gt;async&lt;/code&gt;.
  &lt;a href=&quot;https://developers.google.com/web/fundamentals/performance/critical-rendering-path/adding-interactivity-with-javascript&quot;&gt;Więcej&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;html-warstwa-opisu-dokumentu&quot;&gt;HTML: Warstwa opisu dokumentu&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;Wykorzystanie znacznika &lt;code class=&quot;highlighter-rouge&quot;&gt;&amp;lt;link rel=&quot;prefetch&quot; href=&quot;FILENAME&quot;/&amp;gt;&lt;/code&gt;.
  &lt;a href=&quot;https://www.w3.org/TR/resource-hints/#dfn-prefetch&quot;&gt;Więcej&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Poinformowanie przeglądarkę, żeby rozwiązała DNS do często wykorzystywanych
  zasobów z konkretnej domeny. Nie ma sensu podawać adresy do takich
  gigantów jak: Google, Facebook, czy Twitter.&lt;/p&gt;

    &lt;p&gt;Przykład: &lt;code class=&quot;highlighter-rouge&quot;&gt;&amp;lt;link rel=&quot;dns-prefetch&quot; href=&quot;http://example-domain.com/&quot;&amp;gt;&lt;/code&gt;&lt;/p&gt;

    &lt;p&gt;Aby sprawdzić, czy jakie adresy przeglądarka już sobie rozwiązała, należy
  w Google Chrome wejść na adres: &lt;code class=&quot;highlighter-rouge&quot;&gt;chrome://net-internals/#dns&lt;/code&gt;&lt;/p&gt;

    &lt;p&gt;Limit przechowywanych rozwiązanych adresów wynosi 1000 sztuk.
  &lt;a href=&quot;https://www.w3.org/TR/resource-hints/#dfn-dns-prefetch&quot;&gt;Więcej&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;komunikacja-z-serwerem&quot;&gt;Komunikacja z serwerem&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;Wsparcie przesyłania danych spakowanych za pomocą algorytmu GZIP.
  &lt;a href=&quot;https://developers.google.com/web/fundamentals/performance/optimizing-content-efficiency/optimize-encoding-and-transfer&quot;&gt;Więcej&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Wykorzystanie protokołu HTTP/2, który jest w stanie zwrócić kilka plików,
  w jednym responsie. Wyeliminujemy w ten sposób, nawiązywania połączenia
  za każdym razem po zasób.
  &lt;a href=&quot;https://developers.google.com/web/fundamentals/performance/http2/&quot;&gt;Więcej&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Kiedy komunikujemy się za pomocą RESTa, to możemy dostawać “zbyt duże”
  odpowiedzi, tj. dostaniemy także te dane, których nie potrzebujemy.
  Rozwiązaniem na sytuację, jest wykorzystanie technologi GraphQL,
  która to oczekuje od klienta dokładnej struktury, jaka powinna zostać
  zwrócona przez serwer.
  &lt;a href=&quot;https://blog.apollographql.com/graphql-vs-rest-5d425123e34b&quot;&gt;Więcej&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;infrastruktura-konfiguracja-web-serwera&quot;&gt;Infrastruktura (konfiguracja web serwera)&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;Włączenie nagłówków Cache-Control, aby wyeliminować pytanie przeglądarki
  po zasób za każdym razem, kiedy tylko będzie taka definicja na stronie.
  &lt;a href=&quot;https://www.keycdn.com/support/cache-control&quot;&gt;Więcej&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Wykorzystanie serwerów &lt;abbr title=&quot;Content Delivery Network&quot;&gt;CDN&lt;/abbr&gt;,
  które mają skrócić czas dostępu do plików statycznych (obrazków, &lt;code class=&quot;highlighter-rouge&quot;&gt;*.css&lt;/code&gt;,
  &lt;code class=&quot;highlighter-rouge&quot;&gt;*.js&lt;/code&gt;, &lt;code class=&quot;highlighter-rouge&quot;&gt;*.html&lt;/code&gt;, itp.).
  &lt;a href=&quot;https://developers.google.com/web/fundamentals/performance/optimizing-content-efficiency/http-caching&quot;&gt;Więcej&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/post-banner-pytanie-rekrutacyjne-nr-2-javascript-developer.png&quot; itemprop=&quot;image&quot; alt=&quot;Baner promujący artykuł&quot; /&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;rozwiązania-społeczności&quot;&gt;Rozwiązania społeczności&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://twitter.com/maciek_dev&quot;&gt;Maciek Głowacki&lt;/a&gt; via Twitter&lt;/li&gt;
&lt;/ul&gt;

&lt;figure class=&quot;social-center-block&quot;&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;pl&quot; dir=&quot;ltr&quot;&gt;-minifikacja plików,&lt;br /&gt;-łączenie skryptów w jeden plik, aby ograniczyć ilość zapytań do serwera,&lt;br /&gt;-optymalizacja grafik (np. przez tinypng),&lt;br /&gt;-odpowiednia kompresja/format plików wideo&lt;br /&gt;-ustawienia cache po stronie serwera&lt;/p&gt;&amp;mdash; Maciek Glowacki (@maciek_dev) &lt;a href=&quot;https://twitter.com/maciek_dev/status/1070339994009698304?ref_src=twsrc%5Etfw&quot;&gt;December 5, 2018&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async=&quot;&quot; src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;

&lt;/figure&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://www.facebook.com/dominikszczepaniak98&quot;&gt;Dominik Szczepaniak&lt;/a&gt; via Facebook&lt;/p&gt;

    &lt;blockquote&gt;
      &lt;p&gt;Przede wszystkim optymalizacja obrazów, plików audio i video - to waży
zdecydowanie najwięcej. Oprócz tego minifikacja stylów i skryptów.
Można też wykorzystać kompresję GZIP. Część skryptów i arkuszy CSS można
podpiąć korzystając z CDN.&lt;/p&gt;
    &lt;/blockquote&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;h2 id=&quot;ogłoszenie&quot;&gt;Ogłoszenie&lt;/h2&gt;

&lt;p&gt;Dziś o 9:00 na &lt;a href=&quot;https://facebook.com/piecioshka.dev&quot;&gt;fanpage&lt;/a&gt;-u zostało
opublikowane 8. pytanie z serii pytań rekrutacyjnych zadawanych przeze mnie
na rozmowach rekrutacyjnych, które prowadzę.&lt;/p&gt;

&lt;p&gt;Zapraszam do dzielenia się swoimi odpowiedziami!&lt;/p&gt;
</description>
            <pubDate>Mon, 10 Dec 2018 08:15:40 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2018/12/10/pytanie-rekrutacyjne-nr-2-javascript-developer.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2018/12/10/pytanie-rekrutacyjne-nr-2-javascript-developer.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/post-banner-pytanie-rekrutacyjne-nr-2-javascript-developer.png</image>
        </item>
        
        <item>
            <title>Podsumowanie miesiąca — Październik 2018</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Dziś chciałem nadrobić zaległości i podsumować październik. Miesiąc, w którym
obchodziłem urodziny i razem z &lt;a href=&quot;https://twitter.com/kasiarzyna25&quot;&gt;Kasią&lt;/a&gt; i &lt;a href=&quot;https://twitter.com/piotr_zientara&quot;&gt;Piotrem&lt;/a&gt; zorganizowaliśmy
coś, co było naszym marzeniem.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/post-banner-month-summary-2018-10.png&quot; itemprop=&quot;image&quot; alt=&quot;Baner promujący artykuł&quot; /&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;development&quot;&gt;Development&lt;/h2&gt;

&lt;p&gt;Zacznijmy od najprzyjemniejszego dla mnie doświadczenia, czyli developmentu.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://github.com/piecioshka/warsawjs-workshop-25-myskills&quot;&gt;warsawjs-workshop-25-myskills&lt;/a&gt;&lt;/p&gt;

    &lt;p&gt;Projekt stworzony na potrzeby warsztatu z React.js. Aplikacja rozwiązuje
  problem podawania w każdym formularzu rejestracyjnym informacji o swoim
  doświadczeniu.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://github.com/piecioshka/game-tickets-catcher&quot;&gt;game-tickets-catcher&lt;/a&gt;&lt;/p&gt;

    &lt;p&gt;Rozpoczęcie developmentu gry a’la galaxian, aby móc wykorzystać ją podczas
  konkursu gdzie do wygrania byłby bilet na konferencję — &lt;a href=&quot;https://www.facebook.com/events/2149337285314631/&quot;&gt;ConFrontJS 2018&lt;/a&gt;.&lt;/p&gt;

    &lt;p&gt;Niestety projektu nie ukończyłem przed wydarzeniem, więc projekt obecnie
  jest w fazie czekania na lepsze czasy.&lt;/p&gt;

    &lt;p&gt;W tym projekcie nie użyłem żadnego frameworka, tylko chciałem napisać
  swój silnik gry.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Przerobienie strony &lt;a href=&quot;https://confrontjs.com/&quot;&gt;https://confrontjs.com/&lt;/a&gt; na aplikację &lt;a href=&quot;https://nextjs.org/&quot;&gt;Next.js&lt;/a&gt;&lt;/p&gt;

    &lt;p&gt;To było coś! Na początku cała strona była w jednym pliku HTML.
  Wytrwałem tak, do magicznej granicy 500 linii w jednym pliku.
  Później, każda zmiana generowała zajmowała zbyt dużo czasu więc
  zainwestowałem w przebudowanie wszystkiego na &lt;a href=&quot;https://nextjs.org/&quot;&gt;Next.js&lt;/a&gt;,
  framework, którego wykorzystałem do budowania strony głównej &lt;a href=&quot;https://www.warsawjs.com/&quot;&gt;WarsawJS&lt;/a&gt;.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;organizacja-wydarzeń&quot;&gt;Organizacja wydarzeń&lt;/h2&gt;

&lt;p&gt;W tym miesiącu poza konferencją, zorganizowaliśmy z Kasią i Piotrem dwa
wydarzenia: meetup oraz warsztaty.&lt;/p&gt;

&lt;p&gt;Warsztaty &lt;a href=&quot;https://www.facebook.com/events/237710296908672/&quot;&gt;WarsawJS Workshop #25 — React.js&lt;/a&gt; jak zwykle to była świetna sprawa,
kiedy na wydarzenie, które organizujesz w niedzielę i to całą, przychodzi 50 osób,
super!&lt;/p&gt;

&lt;p&gt;Kolejne wydarzenie, bez którego nie mogłoby się obejść to nasz meetup
&lt;a href=&quot;https://www.facebook.com/events/2184909201788892/&quot;&gt;WarsawJS Meetup #50&lt;/a&gt;. To jubileuszowe spotkanie, było złamaniem bariery 50
wydarzeń, które ciężko osiągnąć bez wewnętrznego pragnienia oraz pomocy
społeczności.&lt;/p&gt;

&lt;p&gt;Dziękujemy! &amp;lt;3&lt;/p&gt;

&lt;p&gt;Od kiedy organizujemy meetupu, często w naszych rozmową przewijał się temat,
zorganizowania konferencji. W tym miesiącu przyszedł na to moment i pod koniec
października mogliście być obecni na &lt;a href=&quot;https://www.facebook.com/events/2149337285314631/&quot;&gt;ConFrontJS 2018&lt;/a&gt; — pierwszej w historii
WarsawJS konferencji!&lt;/p&gt;

&lt;p&gt;Rocks!&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Więcej na temat &lt;strong&gt;konferencji ConFrontJS 2018 znajdziesz w osobnym artykule&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id=&quot;przeprowadzone-szkolenia&quot;&gt;Przeprowadzone szkolenia&lt;/h2&gt;

&lt;p&gt;Jak już wcześniej pisałem, w tym miesiącu zorganizowaliśmy workshop,
dla społeczności WarsawJS, na którym to byłem trenerem, także takie rzeczy
jak selekcja i spotkania trenerami również miały miejsce.&lt;/p&gt;

&lt;p&gt;Jeśli byłeś/byłaś na &lt;a href=&quot;https://www.facebook.com/events/237710296908672/&quot;&gt;WarsawJS Workshop #25 — React.js&lt;/a&gt; to zostaw komentarz,
w którym proszę Cię, abyś napisał/a o tym, jaki Tobie spodobało się to wydarzenie.&lt;/p&gt;

&lt;p&gt;Z góry dziękuję!&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;À propos selekcji to mam tutaj ciągle wątpliwość na temat jej skuteczności.
&lt;strong&gt;Wkrótce napiszę osobny artykuł&lt;/strong&gt; na ten przyporządkowania osób do właściwej grupy.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id=&quot;wystąpienia-publiczne&quot;&gt;Wystąpienia publiczne&lt;/h2&gt;

&lt;p&gt;Pewnego dnia &lt;a href=&quot;https://twitter.com/piotr_zientara&quot;&gt;Piotr&lt;/a&gt; zaprosił mnie do firmy App’n’roll, w której pracuje,
aby wygłosił lightning talka. Skorzystałem z okazji i poszedłem. Dziękuję za
zaproszenie i z chęcią podejmę się próby kolejnych!&lt;/p&gt;

&lt;h2 id=&quot;produkcja-filmów&quot;&gt;Produkcja filmów&lt;/h2&gt;

&lt;p&gt;Podczas tego miesiąca stworzyłem rekordową liczbę filmów, bo było ich aż 6.&lt;/p&gt;

&lt;p&gt;Bardzo się z tego powodu cieszę, niestety w listopadzie odbije mi się to czkawką,
i stworzę tylko jeden.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;O tym co się działo w listopadzie &lt;strong&gt;będzie w osobnym artykule&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=U2_SXjAvNIY&quot;&gt;WarsawJS Meetup #50 — Invitation&lt;/a&gt;&lt;/p&gt;

    &lt;p&gt;Jak co miesiąc, zaproszenie. Tym razem beze mnie, bo kiedy Kasia i Piotr
 nagrywali zaproszenie to ja byłem na sali w Campus Warsaw i opowiadałem o React.js&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=uc-_juJdN9U&quot;&gt;Dostałem prezent &lt;em&gt;ZASKOCZONY&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;

    &lt;p&gt;Jak już Wam wspominałem, w październiku, a dokładnie 5 dnia tego miesiąca
 obchodziłem swoje 29 urodziny. Z tej okazji dostałem od przyjaciela Filipa
 upominek, za który serdecznie dziękuję!&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=zUuU0whqDg8&quot;&gt;Zwiedzam Campus Warsaw oraz podziwiam Konesera&lt;/a&gt;&lt;/p&gt;

    &lt;p&gt;Kolejny film, był o tym, jak spacerowałem po Konserze w towarzystwie Magdy.
 Widzieliśmy jak największą salę, a raczej hangar który to jest idealnym
 miejsce na targi.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=3sl5NJwPRao&quot;&gt;Po co pojechałem na pocztę?&lt;/a&gt;&lt;/p&gt;

    &lt;p&gt;Jak by wyglądało wydarzenie bez stickersów? No właśnie. Dziś każde wydarzenie,
 nawet najmniejszy meetup posiada swoje logo, a tym samym naklejki.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Ostatnie dni przed konferencją spędziłem na tworzeniu filmów na to wydarzenie.
Zrealizowałem dwa filmy, których celem było wprowadzenie społeczności do świata
konfrontacji swoich przyzwyczajeń zw. z programowaniem i zaproszeniem ich
na wydarzenie - &lt;a href=&quot;https://www.facebook.com/events/2149337285314631/&quot;&gt;ConFrontJS 2018&lt;/a&gt;:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=6CbQMclHUSU&quot;&gt;ConFrontJS 2018 - Invitation&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=ZVjDTB9Wcng&quot;&gt;ConFrontJS 2018 - Intro&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;tworzenie-artykułów&quot;&gt;Tworzenie artykułów&lt;/h2&gt;

&lt;p&gt;W tym miesiącu zaniedbałem mojego bloga, za co serdecznie przepraszam
czytelników. Jedyny artykuł jaki powstał to &lt;a href=&quot;https://piecioshka.pl/blog/2018/10/03/drugi-miesiac-bez-pracy.html&quot;&gt;Podsumowanie września&lt;/a&gt;.
&lt;strong&gt;To stanowczo za mało!&lt;/strong&gt;&lt;/p&gt;

&lt;h2 id=&quot;inne&quot;&gt;Inne&lt;/h2&gt;

&lt;p&gt;Teraz się zacznie.&lt;/p&gt;

&lt;p&gt;W tym miesiącu działo się bardzo dużo tematów, że tak to nazwę “pobocznych”.&lt;/p&gt;

&lt;p&gt;Poszliśmy z Kasią do kina na &lt;strong&gt;film “Kler”&lt;/strong&gt;. Dziwny to był film. Podczas niektórych
scen odwracałem głowę, bo nie chciałem patrzeć na obraz. Wcześniej już czytałem
recenzję, że niektóre sceny mogły zostać wycięte. Niestety nie zostały.&lt;/p&gt;

&lt;p&gt;Udzieliłem &lt;strong&gt;wywiadu dla konferencji Code Motion Berlin 2018&lt;/strong&gt;, ale… organizatorzy
go nie wykorzystali 😁 Poświęciłem kilka godzin na odpowiedzenie na pytania,
a tu zonk!&lt;/p&gt;

&lt;p&gt;Brałem udział w &lt;strong&gt;szkoleniu z Vue.js firmy ide.school&lt;/strong&gt;. Polecam ideę edukacji
jak najbardziej. Fajnie, że spotkałem się z Magdą i Andrzejem podczas tego
wydarzenia. Myślę, że warto zrobić tego typu szkolenie na WarsawJS. Zastanawiam
się tylko kiedy, bo obecnie tematów jest tak dużo, że trzeba będzie wymyślić
chyba nową inicjatywę.&lt;/p&gt;

&lt;p&gt;Podczas konferencji Business Insiders 4.0 w Koneserze, jednym z prelegentów był
sam &lt;strong&gt;Kevin Mitnick&lt;/strong&gt;. Osoba, które nie trzeba przedstawiać. Ze względu na to, że
mam jego kilka książek chciałem się z nim spotkać i uzyskać autograf. Niestety,
takie gwiazdy jak on, nie chodzą sobie pomiędzy prelekcjami i niestety, ale
moje czekanie przed budynkiem nie zdało się na nic.&lt;/p&gt;

&lt;p&gt;Razem z Kasią poszliśmy na &lt;strong&gt;meetup PyWaw #79&lt;/strong&gt;, który to tym razem miał inną formułę.
Nie było prelekcji. Spotkanie polegało na tym, że uczestnicy dzielą się na
grupy tematyczne. I w każdej grupie można rozmawiać tylko o jednym — wyznaczonym
przez koordynatora — temacie. Każdy ma prawo zmienić grupę w dowolnym momencie.
Pomysł interesujący!&lt;/p&gt;

&lt;p&gt;Kilka dni wcześniej pojechałem na Wolę, aby być uczestnikiem
&lt;strong&gt;pierwszego w historii Udemy meetupie&lt;/strong&gt;. Dowiedziałem się podczas niego,
jaki jest plan Udemy na rozwój, czym się teraz zajmują oraz jak wejść w branżę
nagrywania kursów online.&lt;/p&gt;

&lt;p&gt;Uruchomiliśmy na &lt;strong&gt;WarsawJS platformę newsletterową&lt;/strong&gt;, którą w tym miesiącu
wykorzystałem 3x do wysłania informacji ze świata społeczności WarsawJS.
Uważam, że jest to przyjemna forma komunikacji, z uwagi na to, że mogę
w elegancki sposób przedstawić plany społeczności oraz obecne osiągnięcia.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Jeśli jeszcze nie jesteś zapisany do newslettera to zapraszam Cię na stronę
&lt;a href=&quot;https://newsletter.warsawjs.com&quot;&gt;https://newsletter.warsawjs.com&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;W tym miesiącu również odbywał się hackathon &lt;strong&gt;Nowa strona danych&lt;/strong&gt;, na który
wybrałem się z Kasią, aby zobaczyć jak wyglądał. Poniżej znajdziesz zdjęcie
prosto z miejsca wydarzenia:&lt;/p&gt;

&lt;figure class=&quot;social-center-block&quot;&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;pl&quot; dir=&quot;ltr&quot;&gt;Pozdrowienia dla &lt;a href=&quot;https://twitter.com/KaroWysocka?ref_src=twsrc%5Etfw&quot;&gt;@KaroWysocka&lt;/a&gt;  &lt;a href=&quot;https://twitter.com/hashtag/hackathongovpl?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#hackathongovpl&lt;/a&gt; &lt;a href=&quot;https://twitter.com/hashtag/hackathon?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#hackathon&lt;/a&gt; &lt;a href=&quot;https://t.co/7qqVKh1aVp&quot;&gt;pic.twitter.com/7qqVKh1aVp&lt;/a&gt;&lt;/p&gt;&amp;mdash; Piotr Kowalski (@piecioshka) &lt;a href=&quot;https://twitter.com/piecioshka/status/1056222669841031168?ref_src=twsrc%5Etfw&quot;&gt;October 27, 2018&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async=&quot;&quot; src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;

&lt;/figure&gt;

&lt;p&gt;Jako wierny fan boksu, a szczególnie polskiego, &lt;strong&gt;obejrzałem w IPLA galę
bokserską: Adamek — Miller&lt;/strong&gt;, która odbywała się w Chicago. Niestety Tomek przegrał
przez KO w 2 rundzie. Szkoda, ale jego epoka już minęła. Smutne to, ale trzeba
się z tym pogodzić i podziękować mu za te emocje, które pojawiały się w naszych
sercach, kiedy wygrywał pojedynki za wielką wodą.&lt;/p&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;p&gt;To był pracowity miesiąc! Dziękuję wszystkim, którzy pomagali nam przy
organizacji WarsawJS oraz przy konferencji ConFrontJS (wkrótce artykuł).&lt;/p&gt;

&lt;p&gt;Do zobaczenia w przyszłym miesiącu!&lt;/p&gt;

&lt;p&gt;Piotr&lt;/p&gt;

&lt;!-- Resources --&gt;

</description>
            <pubDate>Sat, 08 Dec 2018 15:46:56 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2018/12/08/podsumowanie-miesiaca-pazdziernik-2018.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2018/12/08/podsumowanie-miesiaca-pazdziernik-2018.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/post-banner-month-summary-2018-10.png</image>
        </item>
        
        <item>
            <title>Pytanie rekrutacyjne nr 1: Stwórz pętle, która będzie wyświetlała liczby od 10 do 0 — JavaScript Developer</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Z okazji końca roku, przygotowałem dla Was pewną rywalizację, a bardziej miejsce
na sprawdzenie swoich umiejętności. W grudniu, codziennie na profilu
&lt;a href=&quot;https://facebook.com/piecioshka.dev&quot;&gt;piecioshka.dev&lt;/a&gt; będą publikowane pytania
które zadawałem podczas spotkań rekrutacyjnych na stanowisko programisty
&lt;a href=&quot;/tag/javascript/&quot;&gt;#JavaScript&lt;/a&gt;.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/post-banner-pytanie-rekrutacyjne-nr-1-javascript-developer.png&quot; itemprop=&quot;image&quot; alt=&quot;Baner promujący artykuł&quot; /&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;pierwsze-pytanie&quot;&gt;Pierwsze pytanie!&lt;/h2&gt;

&lt;p&gt;A raczej zadanie. Jestem zwolennikiem dawania prostych zadań na spotkaniach
rekrutacyjnych. Wiem, że nie sprawdzę całej wiedzy kandydata, aczkolwiek
zadanie prostego zadania rekrutacyjnego da mi informację m.in o sposobie
myślenia.&lt;/p&gt;

&lt;p&gt;Zadanie brzmi: &lt;strong&gt;Stwórz pętle, która będzie wyświetlała liczby od 10 do 0&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Zadanie powinno przetestować:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;znajomość pętli&lt;/li&gt;
  &lt;li&gt;proces dekrementacji zmiennej&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;moja-rozwiązania&quot;&gt;Moja rozwiązania&lt;/h2&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;Pętla &lt;code class=&quot;highlighter-rouge&quot;&gt;for&lt;/code&gt;&lt;/p&gt;

    &lt;div class=&quot;language-js highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt; &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kd&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;--&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
     &lt;span class=&quot;nx&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
 &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Pętla &lt;code class=&quot;highlighter-rouge&quot;&gt;while&lt;/code&gt;&lt;/p&gt;

    &lt;div class=&quot;language-js highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt; &lt;span class=&quot;kd&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;11&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
 &lt;span class=&quot;k&quot;&gt;while&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;--&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
     &lt;span class=&quot;nx&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
 &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Pętla &lt;code class=&quot;highlighter-rouge&quot;&gt;forEach&lt;/code&gt;&lt;/p&gt;

    &lt;div class=&quot;language-js highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt; &lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;limit&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;11&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
 &lt;span class=&quot;nb&quot;&gt;Array&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;({&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;length&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;limit&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}).&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;fill&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kc&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;forEach&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
     &lt;span class=&quot;nx&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;limit&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
 &lt;span class=&quot;p&quot;&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;No dobra, wystarczy. Ostatnia realizacja była super nadmiarowa. Nie polecam jej
używać jako odpowiedzi na pytanie zadane podczas spotkania rekrutacyjnego.&lt;/p&gt;

&lt;h2 id=&quot;rozwiązania-społeczności&quot;&gt;Rozwiązania społeczności&lt;/h2&gt;

&lt;p&gt;A teraz przedstawię Wam rozwiązania społeczności. Na wstępie chciałem,
podziękować za wzięcie udziału w tej przygodzie i zachęcam do odpowiadania
w komentarzach na kolejne pytania!&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://www.facebook.com/kielbasa.kamil&quot;&gt;Kamil Kiełbasa&lt;/a&gt;:&lt;/p&gt;

    &lt;div class=&quot;language-js highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;  &lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;a&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mb&quot;&gt;0b1010&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;while&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;a&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;nx&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
      &lt;span class=&quot;nx&quot;&gt;a&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-=&lt;/span&gt; &lt;span class=&quot;mb&quot;&gt;0b0001&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;

    &lt;p&gt;Kiedy wkleimy ten kod do DevToolsów, to widzimy kolejno wyświetlone liczby
  od 10 do 0. Niestety, ale funkcja &lt;code class=&quot;highlighter-rouge&quot;&gt;console.log&lt;/code&gt;, która jest w kodzie nie
  wyświetli zera. To dlaczego będzie ono widoczne?&lt;/p&gt;

    &lt;p&gt;Otóż narzędzie developerskie zawsze wyświetlają wartość, która jest zwrócona
  przez ostanie wyrażenie. W tym przypadku wyrażenie &lt;code class=&quot;highlighter-rouge&quot;&gt;while&lt;/code&gt; zwróci &lt;code class=&quot;highlighter-rouge&quot;&gt;zero&lt;/code&gt; jako,
  że zmienna &lt;code class=&quot;highlighter-rouge&quot;&gt;a&lt;/code&gt; po ostatnim wywołaniu tej pętli uzyska taką wartość, kończąc
  tym samym wykonywanie się pętli (za sprawą warunku &lt;code class=&quot;highlighter-rouge&quot;&gt;a &amp;gt; 0&lt;/code&gt;).&lt;/p&gt;

    &lt;p&gt;Przykład:&lt;/p&gt;

    &lt;div class=&quot;language-js highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;  &lt;span class=&quot;kd&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;a&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;while&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;a&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;nx&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;({&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;a&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;});&lt;/span&gt;
      &lt;span class=&quot;nx&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;++&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'qwe'&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// Comma operator&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;

    &lt;p&gt;W tym przypadku wyświetlone zostanie:&lt;/p&gt;

    &lt;div class=&quot;language-text highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;  {a: 1}
  &quot;qwe&quot;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;

    &lt;p&gt;Takie zachowanie można śmiało nazwać &lt;code class=&quot;highlighter-rouge&quot;&gt;Side effectem&lt;/code&gt;.
  Dzięki &lt;a href=&quot;https://twitter.com/seb_paw&quot;&gt;Seba&lt;/a&gt; za zwrócenie na to uwagi.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://www.facebook.com/dominikszczepaniak98&quot;&gt;Dominik Szczepaniak&lt;/a&gt;:&lt;/p&gt;

    &lt;div class=&quot;language-js highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;  &lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;numbers&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;target&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kd&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;i&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;target&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;--&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
          &lt;span class=&quot;nx&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
      &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

  &lt;span class=&quot;nx&quot;&gt;numbers&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;ogłoszenie&quot;&gt;Ogłoszenie&lt;/h2&gt;

&lt;p&gt;Jutro kolejne rozwiązanie! A już dziś opublikowana została trzecia zagadka.&lt;/p&gt;

&lt;p&gt;Zapraszam do udzielania odpowiedzi!&lt;/p&gt;
</description>
            <pubDate>Wed, 05 Dec 2018 09:01:04 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2018/12/05/pytanie-rekrutacyjne-nr-1-javascript-developer.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2018/12/05/pytanie-rekrutacyjne-nr-1-javascript-developer.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/post-banner-pytanie-rekrutacyjne-nr-1-javascript-developer.png</image>
        </item>
        
        <item>
            <title>Git. Dlaczego nie dodajemy katalogu node_modules do repozytorium?</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Poszukujecie odpowiedzi na pytanie, dlaczego nie dodajemy katalogu &lt;code class=&quot;highlighter-rouge&quot;&gt;node_modules&lt;/code&gt;
do repozytorium i dlaczego nie &lt;code class=&quot;highlighter-rouge&quot;&gt;push&lt;/code&gt;-ujemy go do origina jakiś przeważnie jest
GitHub? Odpowiedź w dalszej części.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/post-banner-node-modules.png&quot; itemprop=&quot;image&quot; alt=&quot;Baner promujący artykuł&quot; /&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;co-to-jest-node_modules&quot;&gt;Co to jest &lt;code class=&quot;highlighter-rouge&quot;&gt;node_modules&lt;/code&gt;?&lt;/h2&gt;

&lt;p&gt;Katalog &lt;code class=&quot;highlighter-rouge&quot;&gt;node_modules&lt;/code&gt; przechowuje wszystkie zainstalowane zależności projektu.
Zawiera również zależności zależności.&lt;/p&gt;

&lt;p&gt;W dużych projektach, ten katalog może ważyć dużo megabajtów.&lt;/p&gt;

&lt;h2 id=&quot;dlaczego-nie-dodajemy-node_modules-do-repozytorium&quot;&gt;Dlaczego NIE DODAJEMY &lt;code class=&quot;highlighter-rouge&quot;&gt;node_modules&lt;/code&gt; do repozytorium?&lt;/h2&gt;

&lt;ol&gt;
  &lt;li&gt;Bo dużo waży - szkoda, pobierać tyle MB podczas klonowania projektu&lt;/li&gt;
  &lt;li&gt;Nie chcemy wersjonować czyjegoś kodu - aktualizacja paczek wymusiła by na nas
 mnóstwo zmian w projekcie&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://twitter.com/GajowyKamil&quot;&gt;Kamil Gajowy&lt;/a&gt; napisał w swoim komentarz, że biblioteki raz zainstalowane
 i przechowywane w &lt;code class=&quot;highlighter-rouge&quot;&gt;node_modules&lt;/code&gt; na systemie X, mogą nie działać na
 systemie Y, co może doprowadzić do wielu trudnych do rozwiązania błędów&lt;/li&gt;
  &lt;li&gt;Podczas tworzenia nowego kodu i jednoczesnego dodawania
 bibliotek / aktualizowania ich, widzimy w jednej rewizji nasze zmiany,
 ale także mnóstwo innych, które nic nie wnoszą do sensu aplikacji&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;…w skrócie:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Nie wrzucamy katalogu &lt;code class=&quot;highlighter-rouge&quot;&gt;node_modules&lt;/code&gt; na GitHuba.&lt;/em&gt;&lt;/p&gt;

&lt;h2 id=&quot;jak-się-zabezpieczyć&quot;&gt;Jak się zabezpieczyć?&lt;/h2&gt;

&lt;p&gt;Zaraz po stworzeniu projektu, tj. po stworzeniu pliku &lt;code class=&quot;highlighter-rouge&quot;&gt;package.json&lt;/code&gt;,
należy stworzyć plik &lt;code class=&quot;highlighter-rouge&quot;&gt;.gitignore&lt;/code&gt;, w którym wpisujemy katalog &lt;code class=&quot;highlighter-rouge&quot;&gt;node_modules/&lt;/code&gt;.&lt;/p&gt;

&lt;blockquote class=&quot;block-good&quot;&gt;
  &lt;h3 id=&quot;-wskazówka&quot;&gt;&lt;i class=&quot;icon-good&quot;&gt;&lt;/i&gt; Wskazówka&lt;/h3&gt;
  &lt;p&gt;Zawsze dodaję slash na końcu linijki z katalogiem, dzięki czemu wiem,
że mam do czynienia z katalogiem, a nie z plikiem.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id=&quot;co-zrobić-gdy-już-dodało-się-katalog-node_modules-do-repozytorium&quot;&gt;Co zrobić, gdy już dodało się katalog &lt;code class=&quot;highlighter-rouge&quot;&gt;node_modules&lt;/code&gt; do repozytorium?&lt;/h2&gt;

&lt;ol&gt;
  &lt;li&gt;Usunąć katalog &lt;code class=&quot;highlighter-rouge&quot;&gt;node_modules&lt;/code&gt; z dysku komputera, np. &lt;code class=&quot;highlighter-rouge&quot;&gt;rm -rf node_modules&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;Dodać plik &lt;code class=&quot;highlighter-rouge&quot;&gt;.gitignore&lt;/code&gt; w katalogu głównym projektu&lt;/li&gt;
  &lt;li&gt;Dopisać w tym pliku linijkę &lt;code class=&quot;highlighter-rouge&quot;&gt;node_modules/&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;Stworzyć rewizję (commit), np. &lt;code class=&quot;highlighter-rouge&quot;&gt;git commit .gitignore -m &quot;Ignore node_modules&quot;&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Od teraz &lt;strong&gt;możemy śmiało instalować zależności&lt;/strong&gt;!&lt;/p&gt;

&lt;h2 id=&quot;kiedy-warto-dodać-katalog-node_modules-do-repozytorium&quot;&gt;Kiedy warto dodać katalog &lt;code class=&quot;highlighter-rouge&quot;&gt;node_modules&lt;/code&gt; do repozytorium?&lt;/h2&gt;

&lt;p&gt;W swojej historii poznałem dwa przypadki:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Kiedy chcemy przyspieszyć proces deploymentu i nie pobierać za każdym razem
 zależności projektu.&lt;/li&gt;
  &lt;li&gt;Kiedy proces deploymentu nie posiada dostępu do ściągania danych.&lt;/li&gt;
&lt;/ol&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;p&gt;Na blogu istnieje artykuł, w którym kiedyś napisałem, dlaczego nie wolno dodawać
katalogu &lt;code class=&quot;highlighter-rouge&quot;&gt;.idea&lt;/code&gt; do repozytorium - &lt;a href=&quot;/blog/2017/02/06/globalna-konfiguracja-gita.html&quot;&gt;warto przeczytać&lt;/a&gt;.&lt;/p&gt;

&lt;!-- Resources --&gt;

</description>
            <pubDate>Tue, 20 Nov 2018 22:17:13 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2018/11/20/dlaczego-nie-dodajemy-do-gita-katalogu-node-modules.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2018/11/20/dlaczego-nie-dodajemy-do-gita-katalogu-node-modules.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/post-banner-node-modules.png</image>
        </item>
        
        <item>
            <title>Podsumowanie mojego drugiego miesiąca bez pracy — Wrzesień 2018</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Pomysł na “Podsumowanie miesiąca” był strzałem w dziesiątkę! Poczułem się lżej,
kiedy opisałem swoje doświadczenia z mojego pierwszego miesiąca “pracy bez
pracy”. Otrzymałem sporo pozytywnych komentarzy, co zawsze cieszy. Nie chciałbym
jednak poprzestać na jednym wpisie, dlatego przygotowałem dla Was artykuł
o kolejnym miesiącu, który spędziłem “w domu”.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/post-banner-month-summary-2018-09.png&quot; itemprop=&quot;image&quot; alt=&quot;Baner promujący artykuł&quot; /&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;trwoga-&quot;&gt;Trwoga 🚨&lt;/h2&gt;

&lt;p&gt;Kolejny miesiąc pracy w domu (pisząc “praca” nie mam na myśli zarabiania, tylko
realizowania swoich pomysłów, które &lt;em&gt;de facto&lt;/em&gt; rzadko kiedy przynoszą mi jakiś
dochód) dał mi do zrozumienia, jak ciężko jest osobie, która przez poprzednie
10 lat pracowała codziennie z ludźmi, wejść w &lt;strong&gt;tryb samotnika&lt;/strong&gt; i realizować
swoje pomysły każdego dnia &lt;em&gt;w samotności&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Kiedy pracując na etacie, miałem wolny weekend, często poświęcałem go
na realizowanie swoich pomysłów, bo to był najlepszy czas na tego typu zadania.
Byłem wtedy MEGA wydajny — jeśli można tak powiedzieć. Nikt mi nie przeszkadzał
tym samym mogłem się skupić na 100%.&lt;/p&gt;

&lt;p&gt;Teraz kiedy przychodzi poniedziałek, to ciągle czuję ekscytację, że będę
miał cały dzień dla siebie, ale nie jest to uczucie na tym samym poziomie
co kiedyś. Martwię się tym, że sytuacja jest podobna do jedzenia słodyczy.
Jeśli masz ochotę na czekoladę i zjesz jej kawałek, to jesteś uradowany.
Jeśli jednak miałbyś jeść czekoladę non stop, to po jakimś czasie:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Nawet czekolada może Ci się znudzić 🍫&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id=&quot;perfekcjonizm&quot;&gt;Perfekcjonizm&lt;/h2&gt;

&lt;p&gt;W tym miesiącu (jak i w poprzednim) cały czas poznaje siebie. Można powiedzieć,
że “na nowo”, bo mam kupę czasu w ciągu dnia na rozmyślania. Widzę teraz, jak mocno
poświęcam się swoim zadaniom. Teraz kiedy patrzę na to z boku, to stwierdzam,
że jest coś nie tak. Praca przy komputerze po kilkanaście godzin dziennie, kiedy
faktycznie nie muszę chodzić do biura, to lekka przesada.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Czas spędzony przed komputerem wzrósł o 50-80 godzin w skali miesiąca.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Będąc na wykładzie w SWPS, który poleciła mi koleżanka Ania,
&lt;a href=&quot;https://www.facebook.com/events/717709298588059/&quot;&gt;Perfekcjonizm - zasób czy przekleństwo?&lt;/a&gt; poznałem “definicję” niektórych słów.
Tym samym słowo “perfekcjonizm”, które zawsze kojarzyłem &lt;strong&gt;pozytywnie&lt;/strong&gt; przestało
mieć taki wydźwięk w mojej głowie.&lt;/p&gt;

&lt;p&gt;Kiedy ktoś wypowiada to LEGENDARNE słowo to u każdego w głowie pojawiają się
pytania:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Czy jestem perfekcjonistą?&lt;/li&gt;
  &lt;li&gt;Czy moja praca nosi znamiona doskonałej?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;W sumie to nie wiem, czy Wy tak macie, ale ja tak mam.&lt;/p&gt;

&lt;p&gt;Po wykładzie zaczynam inaczej patrzeć na niektóre sprawy. Nie chciałbym opowiadać
wszystkiego, co usłyszałem podczas tych zajęć, ale teraz widzę jakie skutki niesie
bycie “perfekcjonistą”. Istnieją &lt;a href=&quot;http://www.psychologiawygladu.pl/2015/08/perfekcjonizm-dar-czy-przeklenstwo.html&quot;&gt;3 typy bycia perfekcyjnym&lt;/a&gt;:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Zorientowany na siebie&lt;/li&gt;
  &lt;li&gt;Zorientowany na innych&lt;/li&gt;
  &lt;li&gt;Uwarunkowany społecznie&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Nie chcę opisywać każdego przypadku (o wszystkich możecie przeczytać
z linku powyżej), natomiast głęboko się zastanawiam, czy nie &lt;strong&gt;jestem
przypadkiem osobą, która można opisać wszystkimi typami wymienionymi wyżej&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Pamiętam, że od młodych lat starałem się wszystko dobrze zrealizować,
przywiązując wagę do każdej wykonywanej czynności. Dziś, przekłada to się
na trzymanie porządku w kodzie, np. ze spacjami.&lt;/p&gt;

&lt;p&gt;Mój osobisty linter w oczach nie daje mi spokoju, kiedy widzę niepoprawne
formatowanie. Dla wielu z Was może to być zabawne, ale mnie zawsze boli,
kiedy na końcu linijki widzę niepotrzebną spację albo (co gorsze) jej brak po słowie
kluczowym &lt;code class=&quot;highlighter-rouge&quot;&gt;function&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Powinienem o tym nagrać film, może wtedy lepiej wytłumaczę, co jest grane.
Wróćmy jednak do podsumowania miesiąca.&lt;/p&gt;

&lt;h3 id=&quot;development&quot;&gt;Development&lt;/h3&gt;

&lt;p&gt;Ten miesiąc (czytaj wrzesień) był dla mnie obfity w kodowanie.
W &lt;strong&gt;4 dni&lt;/strong&gt; napisałem stronę &lt;a href=&quot;https://www.warsawjs.com&quot;&gt;https://www.warsawjs.com&lt;/a&gt;, którą opublikowaliśmy
podczas &lt;a href=&quot;https://www.facebook.com/events/695110090861201/&quot;&gt;urodzinowego meetupu&lt;/a&gt;. Wykorzystałem &lt;code class=&quot;highlighter-rouge&quot;&gt;Next.js&lt;/code&gt;, bo nauczony
doświadczeniem z poprzednich projektów, wiem jak bardzo ważny jest
&lt;code class=&quot;highlighter-rouge&quot;&gt;Server-side rendering&lt;/code&gt; (nie jest krytycznie ważny dla użytkownika, ale jest
za to istotny dla crawlerów, np. Googlebot).&lt;/p&gt;

&lt;p&gt;Projekt był narysowany przez &lt;a href=&quot;https://twitter.com/kasiarzyna25&quot;&gt;Kasię&lt;/a&gt; kilka miesięcy temu, ale codzienność
nie pozwalała mi na zrealizowanie tego projektu szybciej (oczywiście miałem
tyle czasu, ale &lt;a href=&quot;https://pl.wikipedia.org/wiki/Prawo_Parkinsona&quot;&gt;Prawo Parkinsona&lt;/a&gt; jest ciągle obecne w moim życiu).&lt;/p&gt;

&lt;p&gt;Nowa strona domowa społeczności &lt;a href=&quot;https://fb.com/WarsawJS&quot;&gt;WarsawJS&lt;/a&gt; zawiera podział na wydarzenia,
z rozróżnieniem meetupów i workshopów i mnóstwo innych feature-ów&lt;/p&gt;

&lt;p&gt;Acha! Byłbym zapomniał, na potrzeby prezentacji danych np. o liczbie prelegentów,
zrobić port biblioteki &lt;a href=&quot;http://npmjs.com/package/bounty&quot;&gt;bounty&lt;/a&gt; do komponentu Reactowego, tym samym
powstała moja pierwsza paczka dla tego ekosystemu — &lt;a href=&quot;http://npmjs.com/package/react-bounty&quot;&gt;react-bounty&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Zapraszam w imieniu założycieli WarsawJS!&lt;/strong&gt;&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;Kolejną rzeczą jaką się chciałem pochwalić jest panel fejsbukowy na dole strony.&lt;/p&gt;

&lt;figure&gt;
    &lt;a href=&quot;https://facebook.com/piecioshka.dev/&quot;&gt;
        &lt;img src=&quot;/assets/images/posts/facebook/facebook-panel.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
&lt;/figure&gt;

&lt;p&gt;Wiem, że fanpage-e nie zyskują popularności a wręcz przeciwnie — tracą ją
na rzecz grup. Chciałbym po prostu na tym medium, pokazać Wam to, co robię
jako programista, trener, czy organizator. Chcę odseparować swój prywatny
profil od tego zawodowego.&lt;/p&gt;

&lt;p&gt;Zapraszam do obserwowania i wspierania mnie łapkami oraz co ważniejsze uśmiechem!&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/piecioshka/hamburger&quot;&gt;hamburger&lt;/a&gt; to kolejny projekt, jaki zrealizowałem w tym miesiącu.
Zawsze chciałem zrobić taki widget w czystym CSSie i wiecie co?
Zrobiłem to!&lt;/p&gt;

&lt;figure&gt;
    &lt;a href=&quot;https://github.com/piecioshka/hamburger&quot;&gt;
        &lt;img src=&quot;https://raw.githubusercontent.com/piecioshka/hamburger/main/demo.gif&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
&lt;/figure&gt;

&lt;h3 id=&quot;organizacja-wydarzeń&quot;&gt;Organizacja wydarzeń&lt;/h3&gt;

&lt;p&gt;W tym miesiącu społeczność WarsawJS obchodziła swoje 4. urodziny. Świętowaliśmy
podczas &lt;a href=&quot;https://www.facebook.com/events/695110090861201/&quot;&gt;WarsawJS Meetup #49 - 4 urodziny&lt;/a&gt;, gdzie cała nasz trójka organizatorów
wystąpiła na scenie!&lt;/p&gt;

&lt;p&gt;Aby dobrze się przygotować do tematu, którym był &lt;code class=&quot;highlighter-rouge&quot;&gt;duck typing&lt;/code&gt; przygotowałem
projekt, w którym będę miał już skonfigurowany transpiler TypeScriptu do JavaScriptu.
Tym samym powstał projekt &lt;a href=&quot;https://github.com/piecioshka/typescript-playground&quot;&gt;typescript-playground&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Zapraszam do obejrzenia mojej urodzinowej prelekcji:&lt;/p&gt;

&lt;div class=&quot;youtube-lazy&quot; data-youtube-id=&quot;pUz-LDfj3zc&quot;&gt;&lt;/div&gt;

&lt;p&gt;Slajdy znajdziesz tutaj &lt;a href=&quot;https://piecioshka.github.io/slides-duck-typing/&quot;&gt;slides-duck-typing&lt;/a&gt;.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;Jak co miesiąc społeczność WarsawJS mogła się rozwijać na “prawie” darmowych
warsztatach &lt;a href=&quot;https://www.facebook.com/events/1865649110402869/&quot;&gt;WarsawJS Workshop #24 - Testowanie kodu 3/3: Testy integracyjne&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Aby lepiej wytłumaczyć testy integracyjne, przygotowałem projekt, który
jest namiastką panelu administracyjnego - &lt;a href=&quot;https://github.com/piecioshka/warsawjs-workshop-24-admin-panel&quot;&gt;warsawjs-workshop-24-admin-panel&lt;/a&gt;.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;W sierpniu uruchomiliśmy przygotowania do &lt;a href=&quot;https://confrontjs.com/&quot;&gt;ConFrontJS 2018&lt;/a&gt; - pierwszej
konferencji w społeczności WarsawJS.&lt;/p&gt;

&lt;figure&gt;
    &lt;a href=&quot;https://confrontjs.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;
        &lt;img src=&quot;/assets/images/posts/conference-confrontjs-2018/logo-confrontjs-2018-black.png&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
&lt;/figure&gt;

&lt;p&gt;&lt;em&gt;Strona jest oparta na Bootstrapie&lt;/em&gt;. Autorem layoutu jestem ja, co zresztą
łatwo rozpoznać, z powodu braku artystycznego podejścia &lt;a href=&quot;https://www.linkedin.com/in/katarzyna-grabowska-designer/&quot;&gt;Katarzyny&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Chcieliśmy stworzyć wydarzenie na szeroką skalę, aby do stolicy naszego kraju
mogło przyjechać zdecydowanie więcej ludzi z zagranicy. Wierzymy, że podczas
wydarzenia wysłuchamy kilkanaście świetnych prelekcji.&lt;/p&gt;

&lt;p&gt;Będzie to nasza pierwsza konferencja, także na pewno przytrafią nam się “porażki”,
ale zgodnie z cytatem, jaki opublikowałem wczoraj na fanpage’u:&lt;/p&gt;

&lt;figure class=&quot;social-center-block&quot;&gt;
    &lt;iframe src=&quot;https://www.facebook.com/plugins/post.php?href=https%3A%2F%2Fwww.facebook.com%2Fpiecioshka.dev%2Fposts%2F519296041827199%3A0&amp;amp;width=500&quot; width=&quot;500&quot; height=&quot;248&quot; style=&quot;border:none;overflow:hidden&quot; scrolling=&quot;no&quot; frameborder=&quot;0&quot; allowtransparency=&quot;true&quot; allow=&quot;encrypted-media&quot;&gt;&lt;/iframe&gt;
&lt;/figure&gt;

&lt;p&gt;…nie poddamy się!&lt;/p&gt;

&lt;h3 id=&quot;przeprowadzone-szkolenia&quot;&gt;Przeprowadzone szkolenia&lt;/h3&gt;

&lt;p&gt;Czy wiecie, kto był trenerem podczas &lt;a href=&quot;https://www.facebook.com/events/1865649110402869/&quot;&gt;WarsawJS Workshop #24 - Testowanie kodu 3/3:
Testy integracyjne&lt;/a&gt;? Zgadliście!&lt;/p&gt;

&lt;p&gt;Szkolenie z testów integracyjnych było ostatnim szkoleniem z cyklu “Testowanie
kodu”, jakie wspólnie wymyśliliśmy z trenerami. Był to pierwszy cykl szkoleń
w społeczności WarsawJS.&lt;/p&gt;

&lt;p&gt;Świetnie było uczyć ludzi jak poprawnie pisać testy, jak dbać o kod.
Podczas warsztatów polecaliśmy mnóstwo świetnych źródeł, a jedną z nich była
rekomendowana przeze mnie na każdym szkoleniu książka
&lt;a href=&quot;https://helion.pl/ksiazki/javascript-programowanie-zaawansowane-tomasz-comandeer-jakut,jascpz.htm&quot;&gt;Tomasza Jakuta vel “Comandeer”: Zaawansowany JavaScript&lt;/a&gt; - której recenzja
już jest prawie gotowa i wkrótce zostanie opublikowana na blogu.&lt;/p&gt;

&lt;figure class=&quot;social-center-block&quot;&gt;
    &lt;iframe src=&quot;https://www.facebook.com/plugins/post.php?href=https%3A%2F%2Fwww.facebook.com%2Fwarsawjs%2Fphotos%2Fa.2428029107423418%2F2428031014089894%2F%3Ftype%3D3&amp;amp;width=500&quot; width=&quot;500&quot; height=&quot;430&quot; style=&quot;border:none;overflow:hidden&quot; scrolling=&quot;no&quot; frameborder=&quot;0&quot; allowtransparency=&quot;true&quot; allow=&quot;encrypted-media&quot;&gt;&lt;/iframe&gt;
&lt;/figure&gt;

&lt;h3 id=&quot;webinary&quot;&gt;Webinary&lt;/h3&gt;

&lt;p&gt;W tym miesiąc zrobiłem tylko jeden webinar, pt. &lt;a href=&quot;https://www.youtube.com/watch?v=QgmEHWW-WrM&quot;&gt;Wallaby.js: Zobacz, czy Twój
kod działa poprawnie&lt;/a&gt;. Wszystko za sprawą tego, że brakowało mi pomysłów na miłe
spędzenie czasu przy kodzie, kiedy to przygotowania do konferencji idą pełną parą.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Wrzućcie swoje pomysły na webinary w komentarze.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3 id=&quot;produkcja-filmów&quot;&gt;Produkcja filmów&lt;/h3&gt;

&lt;p&gt;We wrześniu nie mogę pochwalić się dużą ilością wyprodukowanych filmów.
Czy wiecie &lt;a href=&quot;https://www.youtube.com/watch?v=OC3RZTnDIbE&quot;&gt;Jak stworzyć Pull Request za pomocą terminala? | Narzędzia Świata&lt;/a&gt;?
Jeśli nie to zapraszam Was do obejrzenia kilkuminutowego filmu na ten temat.&lt;/p&gt;

&lt;p&gt;Standardowo jak co miesiąc (przez równo 4 lata) produkuję film, będący
zaproszeniem na spotkania warszawskich programistów języka JavaScript.&lt;/p&gt;

&lt;p&gt;Zapraszam do obejrzenia (4 * 12 [liczba miesięcy w roku] + 1 [nie zaczęliśmy
liczyć wydarzeń od 0, eh]) urodzinowej zapowiedzi
&lt;a href=&quot;https://www.youtube.com/watch?v=LlgtbHlCDEU&quot;&gt;WarsawJS Meetup #49 - Invitation&lt;/a&gt;:&lt;/p&gt;

&lt;div class=&quot;youtube-lazy&quot; data-youtube-id=&quot;LlgtbHlCDEU&quot;&gt;&lt;/div&gt;

&lt;p&gt;Tym razem zdjęcia wykonywaliśmy w amfiteatrze na warszawskiej Pradze w Parku
Skaryszewskim. Piękne miejsce. Szkoda, że nie ma już tam żadnych wydarzeń.
Przynajmniej ja o nich nic nie wiem.&lt;/p&gt;

&lt;h3 id=&quot;tworzenie-artykułów&quot;&gt;Tworzenie artykułów&lt;/h3&gt;

&lt;p&gt;Pisanie artykułów w tym miesiącu również nie było dla mnie systematycznym zajęciem.
Na początku miesiąca napisałem podsumowanie poprzedniego, ale to już czytaliście:
&lt;a href=&quot;https://piecioshka.pl/blog/2018/09/03/pierwszy-miesiac-bez-pracy.html&quot;&gt;Podsumowanie mojego pierwszego miesiąca bez pracy - Sierpień 2018&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Poza filmem na temat “&lt;a href=&quot;https://piecioshka.pl/blog/2018/09/06/jak-stworzyc-pull-request-z-terminala.html&quot;&gt;Jak stworzyć Pull Request w terminalu?&lt;/a&gt;”, napisałem
także tekst, po to, aby trafić do tych osób z mojej społeczności, które wolą
czytać, zamiast oglądać. Bardzo się cieszę, że pomimo tego, że tak łatwo jest
obejrzeć film, to dużo ludzi dalej woli czytać. To cieszy i dlatego też ten blog
ciągle się rozwija.&lt;/p&gt;

&lt;h3 id=&quot;przeczytane-książki&quot;&gt;Przeczytane książki&lt;/h3&gt;

&lt;p&gt;Bardzo żałuję, ale w tym miesiącu nie dotknąłem ani jednej książki.
Przenoszenie ich z biurka na półkę i z powrotem chyba się nie liczy prawda? 😁&lt;/p&gt;

&lt;h3 id=&quot;inne&quot;&gt;Inne&lt;/h3&gt;

&lt;p&gt;W tym roku nie brałem udziału w żadnych zawodach biegowych, a szkoda, bo w pewnym
momencie moja forma była dość dobra, aby wystartować i przebiec dystans, np. 10KM
w takim tempie, abym nie czuł wstydu.&lt;/p&gt;

&lt;p&gt;Postanowiliśmy razem z &lt;a href=&quot;https://www.facebook.com/katarzyna.grabowska.9444&quot;&gt;Katarzyną&lt;/a&gt; wziąć udział w &lt;a href=&quot;https://dostartu.pl/vii-wielka-ursynowska-v2623.pl.html&quot;&gt;VII Wielka Ursynowska&lt;/a&gt;.
Biegliśmy pod przykrywką społeczności WarsawJS. Niestety nikt nie rozpoznał
naszych koszulek.&lt;/p&gt;

&lt;figure class=&quot;social-center-block&quot;&gt;
    &lt;iframe src=&quot;https://www.facebook.com/plugins/post.php?href=https%3A%2F%2Fwww.facebook.com%2Fwarsawjs%2Fphotos%2Fa.1611828025710201%2F2440441152848880%2F%3Ftype%3D3&amp;amp;width=500&quot; width=&quot;500&quot; height=&quot;430&quot; style=&quot;border:none;overflow:hidden&quot; scrolling=&quot;no&quot; frameborder=&quot;0&quot; allowtransparency=&quot;true&quot; allow=&quot;encrypted-media&quot;&gt;&lt;/iframe&gt;
&lt;/figure&gt;

&lt;hr /&gt;

&lt;p&gt;Moja dusza artystyczna (jeszcze o mnie dużo nie wiecie) zaprowadziła mnie
we wrześniu do Muzeum Narodowego na wystawę prac &lt;a href=&quot;https://pl.wikipedia.org/wiki/J%C3%B3zef_Brandt&quot;&gt;Józefa Brandta z Warszawy&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Facet miał talent, pięknie malował konie, a to przecież zwierzęta, które
najtrudniej namalować. Sztuką jest pokazać na obrazach emocje tych zwierząt.
Brandtowi się to &lt;span class=&quot;strike&quot;&gt;udawało&lt;/span&gt;, on to po prostu potrafił.&lt;/p&gt;

&lt;figure class=&quot;full-width&quot;&gt;
    &lt;img src=&quot;http://www.agraart.pl/pics/dziela/48-braaandt.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;figcaption&gt;
        Źródło: &lt;a href=&quot;http://www.agraart.pl&quot;&gt;http://www.agraart.pl&lt;/a&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;film&quot;&gt;Film&lt;/h2&gt;

&lt;p&gt;Mój miesiąc za to obfitował w różnego rodzaju filmy! Chyba powinienem się
przyznać… tak, jestem kinomanem. W tym miesiącu obejrzałem kontynuację
mojej ulubionej sagi horrorów, którą rozpoczęła &lt;a href=&quot;https://www.filmweb.pl/film/Obecno%C5%9B%C4%87-2013-627100&quot;&gt;Obecność&lt;/a&gt;, czyli film pt.
&lt;a href=&quot;https://www.filmweb.pl/film/Zakonnica-2018-777024&quot;&gt;Zakonnica&lt;/a&gt;. Czy polecam? Średnio. Lubię się czasami przestraszyć, choć oglądanie
tego filmu o 17:00 nie dało mi takiego lęku, gdyby pora była późniejsza.&lt;/p&gt;

&lt;p&gt;Na Showmaxie skończył się &lt;a href=&quot;https://www.filmweb.pl/serial/Rojst-2018-808109&quot;&gt;Rojst&lt;/a&gt; - śmiem twierdzić, że najlepiej nagrany polski
serial. Podczas oglądania cieszyłem swoje oko tak pięknymi zdjęciami.&lt;/p&gt;

&lt;p&gt;W tym miesiącu moją ulubioną komedią była nowość kinowa: &lt;a href=&quot;https://www.filmweb.pl/film/Johnny+English%3A+Nokaut-2018-802456&quot;&gt;Johnny English: Nokaut&lt;/a&gt;.
Strasznie lubię Atkinsona - dla mnie jest on porównywalny z tym Leslie Nielsenem.&lt;/p&gt;

&lt;p&gt;Niedzielne popołudnia spędzałem, relaksując się podczas westernów, które zawsze
oglądałem w dzieciństwie, będąc trochę zmuszony, bo przecież Tato oglądał
i to on był królem pilota.&lt;/p&gt;

&lt;p&gt;Obecnie ten gatunek filmowy bardzo przypada mi do gustu, tempo akcji zwykle
jest spokojne, a sama fabuła zawsze interesująca. Z tego miejsca polecam
&lt;a href=&quot;https://www.filmweb.pl/Pewnego.Razu.Na.Dzikim.Zachodzie&quot;&gt;Pewnego razu na Dzikim Zachodzie&lt;/a&gt; 1968, reżyserii &lt;strong&gt;Sergio Leone&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Och! Byłbym zapomniał. Najlepszy film tego miesiąca wygrała produkcja stara
jak świat, ale jakże ciekawa: &lt;a href=&quot;https://www.filmweb.pl/film/Dwunastu+gniewnych+ludzi-1957-30701&quot;&gt;Dwunastu gniewnych ludzi&lt;/a&gt;. Czy da się nagrać
1.5 godzinny filmy w jednym pomieszczeniu? Da się. I to jeszcze jak! Polecam.&lt;/p&gt;

&lt;h2 id=&quot;feedback&quot;&gt;Feedback&lt;/h2&gt;

&lt;p&gt;Bardzo dziękuję Ci drogi czytelniku, że dotrwałeś do tego miejsca. Chciałbym
uzyskać od Ciebie opinię na temat tego, czy według Ciebie powinienem więcej
tworzyć takich artykułów.&lt;/p&gt;

&lt;p&gt;Z wyrazami szacunku,&lt;/p&gt;

&lt;p&gt;Piotr&lt;/p&gt;

&lt;!-- Resources --&gt;

</description>
            <pubDate>Wed, 03 Oct 2018 13:48:11 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2018/10/03/podsumowanie-miesiaca-wrzesien-2018.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2018/10/03/podsumowanie-miesiaca-wrzesien-2018.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/post-banner-month-summary-2018-09.png</image>
        </item>
        
        <item>
            <title>Jak stworzyć Pull Request w terminalu?</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Dziś artykuł z cyklu “Narzędzia świata”, bo opisuję tylko jedno narzędzia,
ale za to jakie! Narzędzie nazywa się &lt;a href=&quot;https://github.com/github/hub&quot;&gt;hub&lt;/a&gt; i jest oficjalnym klientem do
GitHuba, który “pięknie” się z nim integruje, dzięki czemu mamy świetny CLI.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/github/github-hub.jpg&quot; itemprop=&quot;image&quot; alt=&quot;Baner promujący artykuł&quot; /&gt;
&lt;/figure&gt;

&lt;p&gt;Dla tych, którzy wolą oglądać, zamiast czytać zapraszam na film:&lt;/p&gt;

&lt;div class=&quot;youtube-lazy&quot; data-youtube-id=&quot;OC3RZTnDIbE&quot;&gt;&lt;/div&gt;

&lt;h2 id=&quot;mój-problem&quot;&gt;Mój problem&lt;/h2&gt;

&lt;p&gt;Moja praca developerska opera się na uruchomieniu 3 okien:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;IDE&lt;/li&gt;
  &lt;li&gt;terminal&lt;/li&gt;
  &lt;li&gt;przeglądarka&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Jeśli chcę dokonać zmiany w IDE albo w terminalu to dokonuję tej czynności &lt;strong&gt;w
sposób płynny&lt;/strong&gt; (bez opóźnień). Natomiast przeglądanie stron internetowych czy
korzystanie z narzędzi w oknie przeglądarki daj mi opóźnienia związane
z warstwą sieciową np. pobieranie całej strony, na której chcę tylko kliknąć 1
malutki przycisk &lt;a href=&quot;https://help.github.com/articles/creating-a-pull-request/&quot;&gt;Create Pull Request&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Chciałbym mieć możliwość tworzenia &lt;a href=&quot;https://help.github.com/articles/about-pull-requests/&quot;&gt;Pull Request&lt;/a&gt;-ów z terminala - traktuję tę
warstwę jako tzw. &lt;strong&gt;sterującą&lt;/strong&gt;. Z tego miejsca zarządzam
projektami, pobieram aktualizacje, czy sprawdzam hasło do Wi-Fi.&lt;/p&gt;

&lt;p&gt;Chciałbym wykorzystać terminal do tego, aby stworzyć Pull Request. Okazuje się
to możliwe, a nawet przyjemne!&lt;/p&gt;

&lt;h2 id=&quot;instalacja-narzędzia-hub&quot;&gt;Instalacja narzędzia “hub”&lt;/h2&gt;

&lt;p&gt;W README.md &lt;a href=&quot;https://github.com/github/hub&quot;&gt;projektu&lt;/a&gt; znajdziesz instrukcję jak zainstalować ten soft.
W moim przypadku wydałem następujące polecenie:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;brew &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;hub
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;tworzymy-pull-request-w-terminalu&quot;&gt;Tworzymy Pull Request w terminalu&lt;/h2&gt;

&lt;p&gt;Wykorzystując &lt;a href=&quot;https://github.com/github/hub&quot;&gt;hub&lt;/a&gt; stwórzmy &lt;a href=&quot;https://lukaszprogramista.pl/praktyczny-kurs-git-dla-zielonych-cz-3-konflikty-gitignore-i-pull-requesty/3/&quot;&gt;Pull Request&lt;/a&gt;:&lt;/p&gt;

&lt;h3 id=&quot;sposób-1&quot;&gt;Sposób 1&lt;/h3&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;Tworzę &lt;a href=&quot;http://www.czterytygodnie.pl/jak-zarzadzac-galeziami-git-flow/&quot;&gt;feature-brancha&lt;/a&gt;&lt;/p&gt;

    &lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt; git feature test-hub
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Tworzę dowolną rewizję (moim przypadku będzie pusta)&lt;/p&gt;

    &lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt; git commit &lt;span class=&quot;nt&quot;&gt;-am&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'Empty revision'&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--allow-empty&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Publikuję branch na &lt;a href=&quot;https://stackoverflow.com/questions/9529497/what-is-origin-in-git&quot;&gt;origin&lt;/a&gt; (w przeciwnym przypadku dostaniecie błąd
 &lt;a href=&quot;https://github.com/github/hub/issues/1258&quot;&gt;Unprocessable Entity (HTTP 422)&lt;/a&gt;)&lt;/p&gt;

    &lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt; git push origin feature/test-hub
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Tworzę &lt;strong&gt;Pull Request&lt;/strong&gt; definiując dla niego tytuł ⭐️&lt;/p&gt;

    &lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt; hub pull-request &lt;span class=&quot;nt&quot;&gt;-m&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;Test PR created with hub&quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Efekt wykonania powyższych poleceń dostępny jest tutaj
&lt;a href=&quot;https://github.com/piecioshka/webinar-testowanie-kodu/pull/2&quot;&gt;https://github.com/piecioshka/webinar-testowanie-kodu/pull/2&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;sposób-2-dla-mnie-optymalny&quot;&gt;Sposób 2 (dla mnie optymalny)&lt;/h3&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;Tworzę &lt;a href=&quot;http://www.czterytygodnie.pl/jak-zarzadzac-galeziami-git-flow/&quot;&gt;feature-brancha&lt;/a&gt;&lt;/p&gt;

    &lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt; git feature test-hub-2
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Tworzę dowolną rewizję (moim przypadku będzie pusta)&lt;/p&gt;

    &lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt; git commit &lt;span class=&quot;nt&quot;&gt;-am&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'Empty revision'&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--allow-empty&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Tworzę &lt;strong&gt;Pull Request&lt;/strong&gt; definiując dla niego tytuł ⭐️&lt;/p&gt;

    &lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt; hub pull-request &lt;span class=&quot;nt&quot;&gt;-pm&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;Test PR created with hub&quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;

    &lt;ul&gt;
      &lt;li&gt;parametr &lt;code class=&quot;highlighter-rouge&quot;&gt;-m&lt;/code&gt; pozwala na zdefiniowanie tytułu Pull Requestu&lt;/li&gt;
      &lt;li&gt;parametr &lt;code class=&quot;highlighter-rouge&quot;&gt;-p&lt;/code&gt; publikuje lokalny branch na &lt;a href=&quot;https://stackoverflow.com/questions/9529497/what-is-origin-in-git&quot;&gt;origin&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Efekt wykonania powyższych poleceń dostępny jest tutaj
&lt;a href=&quot;https://github.com/piecioshka/webinar-testowanie-kodu/pull/3&quot;&gt;https://github.com/piecioshka/webinar-testowanie-kodu/pull/3&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;sposób-3&quot;&gt;Sposób 3&lt;/h3&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;Tworzę &lt;a href=&quot;http://www.czterytygodnie.pl/jak-zarzadzac-galeziami-git-flow/&quot;&gt;feature-brancha&lt;/a&gt;&lt;/p&gt;

    &lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt; git feature test-hub-3
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Tworzę dowolną rewizję (moim przypadku będzie pusta)&lt;/p&gt;

    &lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt; git commit &lt;span class=&quot;nt&quot;&gt;-am&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'Empty revision'&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--allow-empty&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Tworzę &lt;strong&gt;Pull Request&lt;/strong&gt; ⭐️&lt;/p&gt;

    &lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt; hub pull-request &lt;span class=&quot;nt&quot;&gt;--no-edit&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-p&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;

    &lt;ul&gt;
      &lt;li&gt;parametr &lt;code class=&quot;highlighter-rouge&quot;&gt;-p&lt;/code&gt; publikuje lokalny branch na &lt;a href=&quot;https://stackoverflow.com/questions/9529497/what-is-origin-in-git&quot;&gt;origin&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;parametr &lt;code class=&quot;highlighter-rouge&quot;&gt;--no-edit&lt;/code&gt; kopiuje &lt;a href=&quot;https://chris.beams.io/posts/git-commit/&quot;&gt;commit message&lt;/a&gt; z pierwszej rewizji
  i traktuje jako tytuł Pull Requestu&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Efekt wykonania powyższych poleceń dostępny jest tutaj
&lt;a href=&quot;https://github.com/piecioshka/webinar-testowanie-kodu/pull/4&quot;&gt;https://github.com/piecioshka/webinar-testowanie-kodu/pull/4&lt;/a&gt;&lt;/p&gt;

&lt;h2 id=&quot;feedback&quot;&gt;Feedback&lt;/h2&gt;

&lt;p&gt;Dajcie znać, jak Wam się korzysta z &lt;a href=&quot;https://github.com/github/hub&quot;&gt;hub&lt;/a&gt;. Czy przyspieszył on Wasz workflow?&lt;/p&gt;

&lt;!-- Resources --&gt;

</description>
            <pubDate>Thu, 06 Sep 2018 07:01:31 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2018/09/06/jak-stworzyc-pull-request-z-terminala.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2018/09/06/jak-stworzyc-pull-request-z-terminala.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/github/github-hub.jpg</image>
        </item>
        
        <item>
            <title>Podsumowanie mojego pierwszego miesiąca bez pracy — Sierpień 2018</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Właśnie minął mój pierwszy miesiąc bez pracy na etacie. Jak sobie poradziłem?
Co takiego robiłem? Czy nie brakowało mi biura? W końcu przepracowałem w nim 10
poprzednich lat.&lt;/p&gt;

&lt;p&gt;O tym i o innych rzeczach napisałem w podsumowaniu miesiąca. Chciałbym tworzyć
takie podsumowania co miesiąc, aby motywować siebie do przekraczania
kolejnych barier, a jeśli przy okazji uda mi się zmotywować również Ciebie,
to świetnie!&lt;/p&gt;

&lt;p&gt;Dbajmy o produktywność.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/post-banner-month-summary-2018-08.png&quot; itemprop=&quot;image&quot; alt=&quot;Baner promujący artykuł&quot; /&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;dlaczego-zrezygnowałeś-z-pracy&quot;&gt;Dlaczego zrezygnowałeś z pracy?&lt;/h2&gt;

&lt;p&gt;Odpowiedź jest zadziwiająco prosta, ale w tej chwili nie chcę o tym pisać.
Nie uważam, że nadeszła już pora, aby wyłożyć karty na stół. Zaznaczam tylko, że
rozstałem się z zespołem IPLI w baaardzo pozytywnych relacjach.
Zawsze będę o nich ciepło myślał.&lt;/p&gt;

&lt;figure class=&quot;social-center-block&quot;&gt;
    &lt;iframe src=&quot;https://www.facebook.com/plugins/post.php?href=https%3A%2F%2Fwww.facebook.com%2Fphoto.php%3Ffbid%3D2021209244578997%26set%3Da.1502249799808280%26type%3D3&amp;amp;width=500&quot; width=&quot;500&quot; height=&quot;439&quot; style=&quot;border:none;overflow:hidden&quot; scrolling=&quot;no&quot; frameborder=&quot;0&quot; allowtransparency=&quot;true&quot; allow=&quot;encrypted-media&quot;&gt;&lt;/iframe&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;podsumowanie-miesiąca&quot;&gt;Podsumowanie miesiąca&lt;/h2&gt;

&lt;p&gt;Przedstawiam Wam raport z moich miesięcznych dokonań, abyście zobaczyli, jakie
rzeczy przyszło mi zrobić. Pozostawiam Waszej ocenie, czy jest tego aż tyle,
czy tylko tyle.&lt;/p&gt;

&lt;blockquote class=&quot;block-average&quot;&gt;
  &lt;h3 id=&quot;-psst&quot;&gt;&lt;i class=&quot;icon-average&quot;&gt;&lt;/i&gt; Psst…&lt;/h3&gt;
  &lt;p&gt;Zastrzegam sobie prawo, do niepublikowania wszystkich rzeczy
dotyczących moich prywatnych spraw. Wybaczcie. Każdy ma swoją
bezpieczną przestrzeń.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Jako pierwszą weźmiemy na warsztat sekcję, która jest moją
rdzenną i na której skupiam się najbardziej, czyli rozwój projektów
developerskich via GitHub.&lt;/p&gt;

&lt;h3 id=&quot;development&quot;&gt;Development&lt;/h3&gt;

&lt;p&gt;Zacznę od tego, że stworzyłem na mojej stronie domowej specjalną sekcję do
&lt;a href=&quot;https://www.youtube.com/watch?v=wuZjbXSt5Nw&amp;amp;list=PLDTdlgCXlVhgyhzmCTP3ub3yo95XPzqSE&quot;&gt;webinarów&lt;/a&gt;. Dostępna jest ona pod adresem &lt;a href=&quot;https://piecioshka.pl/live&quot;&gt;https://piecioshka.pl/live&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Poświęciłem na nią około 20 godzin, ale dzięki temu jest mocno zautomatyzowana.
Choć oczywiście Jekyll znowu spłatał mi kilka razy figla.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;Przygotowując się do &lt;a href=&quot;https://www.facebook.com/events/2133561886872334/&quot;&gt;warsztatów WarsawJS&lt;/a&gt; wykonałem
kilka miniprojektów, dzięki którym mogłem lepiej wytłumaczyć działanie
narzędzi do testów end-to-end:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/piecioshka/test-codeceptjs&quot;&gt;https://github.com/piecioshka/test-codeceptjs&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/piecioshka/test-cucumberjs&quot;&gt;https://github.com/piecioshka/test-cucumberjs&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/piecioshka/test-testcafe&quot;&gt;https://github.com/piecioshka/test-testcafe&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/piecioshka/test-puppeteer-jasmine&quot;&gt;https://github.com/piecioshka/test-puppeteer-jasmine&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Podczas warsztatów jeden z uczestników podsunął mi pomysł, aby
stworzyć paczkę, która pomoże w konwersji ścieżek xpath do selektorów CSS.
Długo się nie zastanawiając, poświęciłem 10 minut życia (i szkolenia)
na stworzenie takiej oto paczuszki:
&lt;a href=&quot;https://github.com/piecioshka/xpath-to-css-template-string-tag&quot;&gt;https://github.com/piecioshka/xpath-to-css-template-string-tag&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;organizacja-wydarzeń&quot;&gt;Organizacja wydarzeń&lt;/h3&gt;

&lt;p&gt;W tym miesiącu jako &lt;a href=&quot;https://warsawjs.com/&quot;&gt;WarsawJS&lt;/a&gt; organizowaliśmy dwa wydarzenia:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;WarsawJS Meetup #48
    &lt;ul&gt;
      &lt;li&gt;&lt;a href=&quot;https://www.facebook.com/events/140875440085080/&quot;&gt;https://www.facebook.com/events/140875440085080/&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;WarsawJS Workshop #23
    &lt;ul&gt;
      &lt;li&gt;&lt;a href=&quot;https://www.facebook.com/events/2133561886872334/&quot;&gt;https://www.facebook.com/events/2133561886872334/&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ze względu na dużą liczbę osób zainteresowanych wydarzeniem trzeba było
przeprowadzić selekcję. Zajęła mi ona raptem kilka godzin.&lt;/p&gt;

&lt;h3 id=&quot;szkolenia&quot;&gt;Szkolenia&lt;/h3&gt;

&lt;p&gt;Kolejnym jakże ważnym dla mnie tematem są szkolenia. W tym miesiącu przeprowadziłem
tylko jedno, o &lt;a href=&quot;https://www.facebook.com/events/2133561886872334/&quot;&gt;którym pisałem wyżej&lt;/a&gt;. Szkolenie miało
tytuł: &lt;strong&gt;“WarsawJS Workshop #23 - Testowanie kodu 2/3: Testy E2E”&lt;/strong&gt;.
Wystąpiłem w nim w roli &lt;strong&gt;trenera&lt;/strong&gt; (i organizatora, ale to pomijam, bo pisałem
o tym wyżej), a nawet &lt;strong&gt;mentora&lt;/strong&gt; całego kursu “Testowanie kodu”.&lt;/p&gt;

&lt;p&gt;Zawsze przed szkoleniem przygotowuję slajdy. I tym razem było podobnie. Lubię
tworzyć slajdy. Pewnie dlatego, że robię to szybko - piszę je w Markdownie,
przez co nie tracę czasu na niepotrzebne rzeczy (np. animacje), tylko zapełniam
je treścią.&lt;/p&gt;

&lt;figure class=&quot;social-center-block&quot;&gt;
    &lt;blockquote class=&quot;instagram-media&quot; data-instgrm-captioned=&quot;&quot; data-instgrm-permalink=&quot;https://www.instagram.com/p/Bm3fkz2jkxN/?utm_source=ig_embed&quot; data-instgrm-version=&quot;9&quot; style=&quot; background:#FFF; border:0; border-radius:3px; box-shadow:0 0 1px 0 rgba(0,0,0,0.5),0 1px 10px 0 rgba(0,0,0,0.15); margin: 1px; max-width:540px; min-width:326px; padding:0; width:99.375%; width:-webkit-calc(100% - 2px); width:calc(100% - 2px);&quot;&gt;&lt;div style=&quot;padding:8px;&quot;&gt; &lt;div style=&quot; background:#F8F8F8; line-height:0; margin-top:40px; padding:33.33333333333333% 0; text-align:center; width:100%;&quot;&gt; &lt;div style=&quot; background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACwAAAAsCAMAAAApWqozAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAAMUExURczMzPf399fX1+bm5mzY9AMAAADiSURBVDjLvZXbEsMgCES5/P8/t9FuRVCRmU73JWlzosgSIIZURCjo/ad+EQJJB4Hv8BFt+IDpQoCx1wjOSBFhh2XssxEIYn3ulI/6MNReE07UIWJEv8UEOWDS88LY97kqyTliJKKtuYBbruAyVh5wOHiXmpi5we58Ek028czwyuQdLKPG1Bkb4NnM+VeAnfHqn1k4+GPT6uGQcvu2h2OVuIf/gWUFyy8OWEpdyZSa3aVCqpVoVvzZZ2VTnn2wU8qzVjDDetO90GSy9mVLqtgYSy231MxrY6I2gGqjrTY0L8fxCxfCBbhWrsYYAAAAAElFTkSuQmCC); display:block; height:44px; margin:0 auto -44px; position:relative; top:-22px; width:44px;&quot;&gt;&lt;/div&gt;&lt;/div&gt; &lt;p style=&quot; margin:8px 0 0 0; padding:0 4px;&quot;&gt; &lt;a href=&quot;https://www.instagram.com/p/Bm3fkz2jkxN/?utm_source=ig_embed&quot; style=&quot; color:#000; font-family:Arial,sans-serif; font-size:14px; font-style:normal; font-weight:normal; line-height:17px; text-decoration:none; word-wrap:break-word;&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;#warsawjs #trener #uczeń #kurs #programowanie #nauczyciel #javascript #frontend #testy_end_to_end #photooftheday #canon @warsawjs.photos @ricevind More: https://buff.ly/2w7Lm0w or https://buff.ly/2LnmXJl&lt;/a&gt;&lt;/p&gt; &lt;p style=&quot; color:#c9c8cd; font-family:Arial,sans-serif; font-size:14px; line-height:17px; margin-bottom:0; margin-top:8px; overflow:hidden; padding:8px 0 7px; text-align:center; text-overflow:ellipsis; white-space:nowrap;&quot;&gt;Post udostępniony przez &lt;a href=&quot;https://www.instagram.com/piecioshka/?utm_source=ig_embed&quot; style=&quot; color:#c9c8cd; font-family:Arial,sans-serif; font-size:14px; font-style:normal; font-weight:normal; line-height:17px;&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt; Piotr Kowalski&lt;/a&gt; (@piecioshka) &lt;time style=&quot; font-family:Arial,sans-serif; font-size:14px; line-height:17px;&quot; datetime=&quot;2018-08-24T15:43:22+00:00&quot;&gt;Sie 24, 2018 o 8:43 PDT&lt;/time&gt;&lt;/p&gt;&lt;/div&gt;&lt;/blockquote&gt; &lt;script async=&quot;&quot; defer=&quot;&quot; src=&quot;//www.instagram.com/embed.js&quot;&gt;&lt;/script&gt;
&lt;/figure&gt;

&lt;h3 id=&quot;webinary&quot;&gt;Webinary&lt;/h3&gt;

&lt;p&gt;W tym miesiącu zrealizowałem tylko dwa webinary. Jak to? Przecież miałem
organizować je co tydzień! No właśnie, po czwartym webinarze miałem przerwę ze
względu na problemy techniczne.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Webinar: Ulepszamy proces uruchamiania testów z wykorzystaniem Karma
    &lt;ul&gt;
      &lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=7xz1io0PoX0&quot;&gt;https://www.youtube.com/watch?v=7xz1io0PoX0&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Webinar: Eliminacja regresji z git-bisect | Multi-browser za pomocą Karma
| Integracja z Travis CI
    &lt;ul&gt;
      &lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=EzDAzbhtts4&quot;&gt;https://www.youtube.com/watch?v=EzDAzbhtts4&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Problemy rozwiązałem dzięki &lt;a href=&quot;https://www.facebook.com/kamil.grabowski.39&quot;&gt;Kamilowi&lt;/a&gt;, który pożyczył mi
ciekawy sprzęt — grabber video. Gdy przetestuję go w boju, to wybiorę się na
zakupy, aby móc bezproblemowo realizować live streamingi.
Obecnie jestem zadowolony z tego, jak to wyszło ostatnie nagranie.&lt;/p&gt;

&lt;p&gt;Obejrzyjcie webinar poświęcony eliminacji regresji. Jestem z niego zadowolony.
A to dziwne, bo rzadko kiedy jestem z siebie zadowolony.&lt;/p&gt;

&lt;p&gt;Dzięki, &lt;a href=&quot;https://twitter.com/_y3ti&quot;&gt;Kamil&lt;/a&gt;, raz jeszcze 🏆&lt;/p&gt;

&lt;h3 id=&quot;wystąpienia-publiczne&quot;&gt;Wystąpienia publiczne&lt;/h3&gt;

&lt;p&gt;W tym miesiącu (jak prawie w każdym) wystąpiłem na scenie WarsawJS, aby
wygłosić lightning talka. Nie wiem, czy wiecie, ale na poprzednich urodzinach
powiedziałem, że będę robił miniprelekcje przez kolejny rok – oczywiście co
miesiąc.&lt;/p&gt;

&lt;p&gt;Co mnie do tego motywuje? Otóż:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;comiesięczne wystąpienia na scenie dają mi większą pewność siebie podczas
  wszelkich przemówień,&lt;/li&gt;
  &lt;li&gt;realizując lightning talki, zachęcam wahające się osoby ze społeczności, aby
  wyszły na scenę i opowiedziały o swoim ostatnim doświadczeniu,&lt;/li&gt;
  &lt;li&gt;mam kolejne miejsce, w którym mogę uczyć ludzi - YES, YES, YES!&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Zerknijcie na mój ostatni lightning talk pt. “Nightwatch.js: Twoje pierwsze
testy end-to-end” wygłoszony na zakończenie
&lt;a href=&quot;https://www.facebook.com/events/140875440085080/&quot;&gt;WarsawJS Meetup #48&lt;/a&gt;.&lt;/p&gt;

&lt;div class=&quot;youtube-lazy&quot; data-youtube-id=&quot;4SWhYwi9AEg&quot;&gt;&lt;/div&gt;

&lt;h3 id=&quot;produkcja-filmów&quot;&gt;Produkcja filmów&lt;/h3&gt;

&lt;p&gt;Wiecie, że od prawie czterech lat co miesiąc nagrywamy zaproszenie na spotkania
WarsawJS? W tym miesiącu było podobnie. Na moje konto wskoczyła realizacja
filmu (nagrywanie oraz montaż) będącego zaproszeniem na &lt;strong&gt;WarsawJS Meetup #48&lt;/strong&gt;,
o którym już wspominałem wcześniej.&lt;/p&gt;

&lt;p&gt;Film możecie zobaczyć pod adresem &lt;a href=&quot;https://www.youtube.com/watch?v=_HzX8JGro5A&quot;&gt;https://www.youtube.com/watch?v=_HzX8JGro5A&lt;/a&gt;.
Wiecie, że kiedy jest więcej łapek w górze, to wiem, że film Wam się spodobał?&lt;/p&gt;

&lt;p&gt;Just saying…&lt;/p&gt;

&lt;h3 id=&quot;tworzenie-artykułów&quot;&gt;Tworzenie artykułów&lt;/h3&gt;

&lt;p&gt;Rzutem na taśmę – bo ostatniego dnia miesiąca – opublikowałem artykuł dotyczący
mojej ostatniej zmiany serwerowej. Często piszę artykuły, ale ich nie
publikuję. Dlaczego? Bo po prostu ich nie kończę. Coś tam rozdrapię i
zostawię. Niczym kura. Eh.&lt;/p&gt;

&lt;p&gt;Zapraszam Was do lektury artykułu pt. “VPS SSD w OVH jako hosting dla Twojej
aplikacji Node.js. Czy warto?” dostępnego pod tym linkiem:
&lt;a href=&quot;https://piecioshka.pl/blog/2018/08/31/vps-ssd-w-ovh-jako-hosting-dla-twojej-aplikacji-nodejs-czy-warto.html&quot;&gt;https://piecioshka.pl/blog/2018/08/31/vps-ssd-w-ovh-jako-hosting-dla-twojej-aplikacji-nodejs-czy-warto.html&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;inne&quot;&gt;Inne&lt;/h3&gt;

&lt;p&gt;Sekcja wytrych. Wrzucę tutaj wszystkie inne rzeczy, które robiłem w
tym miesiącu, ale nie mogę ich zaliczyć do powyższych kategorii.&lt;/p&gt;

&lt;p&gt;Znacie LinkedIn? Obserwujcie tam &lt;a href=&quot;http://www.linkedin.com/in/piecioshka&quot;&gt;moją działalność&lt;/a&gt;?&lt;/p&gt;

&lt;p&gt;W tym miesiącu wystawiłem moim współpracownikom z byłego zespołu z
&lt;a href=&quot;https://www.ipla.tv/&quot;&gt;IPLA&lt;/a&gt; sześć rekomendacji. Nie wiem, czy dobrze to zrobiłem…&lt;/p&gt;

&lt;figure class=&quot;social-center-block&quot;&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;pl&quot; dir=&quot;ltr&quot;&gt;&lt;a href=&quot;https://twitter.com/hashtag/help?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#help&lt;/a&gt;&lt;br /&gt;Wystawiam właśnie kilka rekomendacji na LinkedIn i trochę się boję... Można zbłądzić i zacząć kogoś oceniać, a tym samym kogoś niepotrzebnie urazić. Ktoś ma jakieś wskazówki, na czym się skupić?&lt;/p&gt;&amp;mdash; Piotr Kowalski (@piecioshka) &lt;a href=&quot;https://twitter.com/piecioshka/status/1034429919894413312?ref_src=twsrc%5Etfw&quot;&gt;August 28, 2018&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async=&quot;&quot; src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;

&lt;/figure&gt;

&lt;hr /&gt;

&lt;p&gt;Dodatkowo w tym miesiącu spełniałem się wolontariacko jako pomocnik na
&lt;a href=&quot;http://lubiehrubie.pl/sport/bedziesz-na-festynie-sprobuj-wspinaczki&quot;&gt;pierwszych zawodach wspinaczkowych&lt;/a&gt; w Hrubieszowie - moim
rodzinnym mieście. Podczas tego wydarzenia byłem tzw. komputerowcem tj.
wprowadzałem wyniki podejść do komputera. Było całkiem miło i nawet - mimo
prognoz - nie padał deszcz. Wkrótce na lokalnym portalu pojawią się zdjęcia
z tego wydarzenia.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;Jako że niekiedy było mi tak gorąco, że nie potrafiłem się skupić, to spędzałem
czas na oglądaniu filmów i seriali. O tak - najlepsze marnowanie czasu ever.&lt;/p&gt;

&lt;p&gt;W tym miesiącu zarejestrowałem się na &lt;a href=&quot;https://www.showmax.com/pol/&quot;&gt;Showmax&lt;/a&gt; i spędziłem w nim 13 godzin.
Obejrzałem (prawie) cały serial “Magicians”. Polecam go fanom Harrego Pottera.&lt;/p&gt;

&lt;p&gt;Dodatkowo pozwoliłem sobie na obejrzenie kilku filmów na tej platformie:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;“Kobiety mafii”,&lt;/li&gt;
  &lt;li&gt;“Czerwony punkt”,&lt;/li&gt;
  &lt;li&gt;“Hakerzy” ❤️&lt;/li&gt;
  &lt;li&gt;“Skazany”,&lt;/li&gt;
  &lt;li&gt;“Miami Vice”.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Niektóre z nich oglądałem w podróży, co mnie bardzo cieszy. Funkcja “pobierz”
w aplikacji mobilnej to świetna rzecz.&lt;/p&gt;

&lt;p&gt;Jako że czas mi się dłużył i nie mogłem się skupić z tego gorąca,
pewnego dnia poszedłem do kina sam. Pierwszy raz SAM. Było dziwnie, ale
nie powiem, że tego nie powtórzę, bo oglądanie filmów o 15:30, kiedy wszyscy
na Mokotowie są pozamykani w biurowcach, jest dość wygodne.&lt;/p&gt;

&lt;p&gt;Oglądasz film na 15-metrowym ekranie, a w sali jest maks. 10 osób.
Przyznasz, że jest to coś pozytywnego, prawda?&lt;/p&gt;

&lt;p&gt;Także “Ant-Man i Osa” to mój pierwszy film obejrzany w kinie &lt;em&gt;w środku dnia&lt;/em&gt;.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;Analizując ten rozdział możecie wysnuć pewien wniosek — tak brakowało mi biura,
zawsze w nim była &lt;strong&gt;superklimatyzacja&lt;/strong&gt;, tym samym zawsze mogłem się skupić.
No chyba że…&lt;/p&gt;

&lt;figure class=&quot;social-center-block&quot;&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;Software engineering &lt;a href=&quot;https://t.co/F5Peg9mYdC&quot;&gt;pic.twitter.com/F5Peg9mYdC&lt;/a&gt;&lt;/p&gt;&amp;mdash; a woman online (@estefanniegg) &lt;a href=&quot;https://twitter.com/estefanniegg/status/1004959552629018625?ref_src=twsrc%5Etfw&quot;&gt;June 8, 2018&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async=&quot;&quot; src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;

&lt;/figure&gt;

&lt;h2 id=&quot;feedback&quot;&gt;Feedback&lt;/h2&gt;

&lt;p&gt;Mam nadzieję, że tym artykułem zmotywuję osoby, które nie wiedzą, co zrobić ze
swoim czasem. Aczkolwiek jestem otwarty na krytykę, także śmiało. Jeśli coś
Ci leży na serduchu to wal. Nie obrażę się.&lt;/p&gt;

&lt;p&gt;Piotr&lt;/p&gt;

&lt;!-- Resources --&gt;

</description>
            <pubDate>Mon, 03 Sep 2018 06:00:00 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2018/09/03/podsumowanie-miesiaca-sierpien-2018.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2018/09/03/podsumowanie-miesiaca-sierpien-2018.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/post-banner-month-summary-2018-08.png</image>
        </item>
        
        <item>
            <title>VPS SSD w OVH jako hosting dla Twojej aplikacji Node.js. Czy warto?</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Rok temu napisałem &lt;a href=&quot;https://pl.wikipedia.org/wiki/Virtual_Private_Server&quot;&gt;artykuł&lt;/a&gt; o tym dlaczego kończę
współpracę z &lt;a href=&quot;https://nazwa.pl/&quot;&gt;nazwa.pl&lt;/a&gt; i spróbuję zarządzać swoim pierwszym
&lt;a href=&quot;/blog/2017/05/01/dlaczego-wybralem-vps.html&quot;&gt;VPS&lt;/a&gt;-em w &lt;a href=&quot;https://www.ovh.pl/&quot;&gt;OVH&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Chciałem podsumować ten czas oraz przedstawić mój nowy zakup!&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/ovh-vps-ssd/post-banner-ovh-vps.png&quot; itemprop=&quot;image&quot; alt=&quot;Baner promujący artykuł&quot; /&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;dlaczego-ovh&quot;&gt;Dlaczego OVH?&lt;/h2&gt;

&lt;p&gt;Pozwolę sobie zacytować siebie sprzed roku:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Słyszałem od obecnych użytkowników OVH, że za tyle pieniędzy ile płaciłem za
hosting w Nazwa.pl, mogę sobie kupić usługę VPS.
&lt;small&gt;Piotr Kowalski - 2016-05-01 - &lt;a href=&quot;/blog/2017/05/01/dlaczego-wybralem-vps.html&quot;&gt;Artykuł, gdzie przeprowadzam się do OVH&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id=&quot;po-co-zmieniam-pakiet-podsumowanie-obecnej-konfiguracji&quot;&gt;Po co zmieniam pakiet? Podsumowanie obecnej konfiguracji&lt;/h2&gt;

&lt;p&gt;Obecnie korzystam z VPS z Ubuntu 15.04 bez możliwości aktualizacji.&lt;/p&gt;

&lt;p&gt;Trochę mi to przeszkadza, chociażby do prowadzenia tego bloga, którego mam
postawionego na &lt;a href=&quot;/blog/2015/06/28/jak-zalozyc-bloga-korzystajac-z-jekyll.html&quot;&gt;Jekyll&lt;/a&gt;-u. Jest to narządzie, a w sumie jest to gem (taka
paczka z kodem, coś podobnego do naszych paczek w &lt;a href=&quot;/blog/2018/01/30/narzedzia-swiata-npm-check.html&quot;&gt;npm&lt;/a&gt;-ie), które wymaga
nowszej wersji Ruby. Niestety, ale tutaj pojawia się problem z wersjami.&lt;/p&gt;

&lt;p&gt;Wymagana wersja Ruby nie jest w stanie być zainstalowana na tak starym Ubuntu
jaki jest zainstalowany na moim VPSie. Oznacza to tylko jedno. Czas na zmianę,
czyli upgrade serwera.&lt;/p&gt;

&lt;h2 id=&quot;możliwości&quot;&gt;Możliwości&lt;/h2&gt;

&lt;p&gt;To może na początek suchar:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;ul&gt;
    &lt;li&gt;Co może być lepszego niż własny VPS?&lt;br /&gt;&lt;/li&gt;
    &lt;li&gt;VPS z nowszym OS oraz wydajniejszym hardwarem.&lt;br /&gt;&lt;/li&gt;
  &lt;/ul&gt;

  &lt;p&gt;Kurtyna.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Analizując ofertę OVH zobaczyłem, że posiadają serwery &lt;a href=&quot;https://www.ovh.pl/vps/vps-ssd.xml&quot;&gt;VPS z serii SSD&lt;/a&gt;,
na których można zainstalować Ubuntu &lt;mark&gt;16.04&lt;/mark&gt; (tak wyczytałem
w sekcji &lt;a href=&quot;https://www.ovh.pl/vps/system-operacyjny.xml#DistributionsNues&quot;&gt;Systemy operacyjne VPS OVH&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;Pomyślałem sobie:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Nie jest to najnowszy system, ale na ten moment w zupełności mi wystarczy.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Wybieram najtańszą ofertę - VPS SSD 1 - z kilku powodów:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;nie przewiduję wykonywać procesów, które obciążą serwer do takiego stopnia,
  że będzie problem z dostępnością jego zasobów (czytaj dalej auto-&lt;a href=&quot;http://www.crypto-it.net/pl/ataki/dos.html&quot;&gt;DOS&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;w każdym momencie mogę zrobić upgrade na wyższą wersję zyskując tym samym
  więcej przestrzeni dyskowej oraz większą ilość pamięci RAM&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cena za serwer to &lt;code class=&quot;highlighter-rouge&quot;&gt;10.99 zł netto miesięcznie&lt;/code&gt;.&lt;br /&gt;
W przeliczeniu na rok dla kogoś, kto nie ma własnej działalności gospodarczej
wychodzi &lt;code class=&quot;highlighter-rouge&quot;&gt;162.21 zł brutto&lt;/code&gt;. ZA CAŁY ROK.&lt;/p&gt;

&lt;h3 id=&quot;za-co-płacę&quot;&gt;Za co płacę?&lt;/h3&gt;

&lt;p&gt;Dostaję VPS-a z następującą konfiguracją:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;1 vCore(s)&lt;/li&gt;
  &lt;li&gt;2,4 GHz&lt;/li&gt;
  &lt;li&gt;2 GB RAM&lt;/li&gt;
  &lt;li&gt;20 GB SSD&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Kiedy przychodzi mi do wyboru szczegółów zamówienia (a jednym z nich jest
wybór zainstalowanego systemu operacyjnego) widzę opcję &lt;mark&gt;18.04&lt;/mark&gt;!&lt;/p&gt;

&lt;p&gt;WOW ⭐️&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Ktoś się chyba pomylił, ale ciiii… może się nie skapną 😄&lt;/em&gt;&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/ovh-vps-ssd/ubuntu-18-04.png&quot; alt=&quot;&quot; /&gt;
    &lt;figcaption&gt;
        Ktoś nie aktualizuje swojej oferty, hmm...
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;dlaczego-ubuntu&quot;&gt;Dlaczego Ubuntu?&lt;/h2&gt;

&lt;p&gt;Najważniejszy powód to &lt;strong&gt;społeczność&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Społeczność ma to do siebie rozwija oprogramowania na ten system, dba o łatki
bezpieczeństwa, analizuje performance i podkręca soft jeszcze mocniej.&lt;/p&gt;

&lt;p&gt;Kolejna rzecz wynikająca z pierwszej to &lt;strong&gt;popularność&lt;/strong&gt;.
System jest popularny więc developerzy piszą na niego soft.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Czy próbowaliście uruchamiać polecenie &lt;code class=&quot;highlighter-rouge&quot;&gt;find&lt;/code&gt; na CentOS?&lt;br /&gt;
Jeśli nie to zobaczcie jak zaskakujące jest życie developera
&lt;a href=&quot;https://github.com/piecioshka/encoding-checker/issues/2&quot;&gt;https://github.com/piecioshka/encoding-checker/issues/2&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id=&quot;migracja&quot;&gt;Migracja&lt;/h2&gt;

&lt;p&gt;Jakie są kolejne kroki po zakupie nowego serwera?&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Dodam, że podczas zakupu dostajemy credentiale do konta &lt;code class=&quot;highlighter-rouge&quot;&gt;root&lt;/code&gt;&lt;/em&gt;&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;Konfiguracja &lt;a href=&quot;https://help.github.com/articles/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent/&quot;&gt;SSH&lt;/a&gt;&lt;/p&gt;

    &lt;p&gt;GitHub świetnie wytłumaczył jak to ogarnąć (link powyżej).&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Utworzenie nowego użytkownika&lt;/p&gt;

    &lt;p&gt;Praca z własną maszyną jest o tyle interesująca, że dostajemy od razu konto,
 które ma najwyższe uprawnienia i możemy zrobić wszystko.&lt;/p&gt;

    &lt;p&gt;Nie posiadając zwykłego użytkownika, kiedy uruchamiamy dowolny soft uruchamiamy
 go z uprawnieniami &lt;code class=&quot;highlighter-rouge&quot;&gt;root&lt;/code&gt;-a. Niesie to za sobą poważne konsekwencje.&lt;/p&gt;

    &lt;p&gt;Każdy skrypt uruchomiony na maszynie będzie upoważniony do tego, aby korzystać
 z zasobów całego systemu operacyjnego. Może zrobić wszystko. Czy na pewno
 chcemy oddać tą władzę?&lt;/p&gt;

    &lt;blockquote&gt;
      &lt;p&gt;Jak to zrobić opisałem w &lt;a href=&quot;/blog/2017/05/01/dlaczego-wybralem-vps.html&quot;&gt;poprzednim artykule&lt;/a&gt; na temat zakupu VPS-a.&lt;/p&gt;
    &lt;/blockquote&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Instalacja niezbędnego oprogramowania&lt;/p&gt;

    &lt;p&gt;Co to znaczy dla mnie &lt;em&gt;niezbędne&lt;/em&gt; oprogramowanie?
 Oczywiście: &lt;code class=&quot;highlighter-rouge&quot;&gt;Git&lt;/code&gt; oraz &lt;code class=&quot;highlighter-rouge&quot;&gt;Node.js&lt;/code&gt;.&lt;/p&gt;

    &lt;p&gt;Tego zawsze mi brakowało w hostingach których używałem. Deployment za pomocą
 Git-a to przyjemność. &lt;strong&gt;Wysyłam&lt;/strong&gt; (&lt;code class=&quot;highlighter-rouge&quot;&gt;git push&lt;/code&gt;) do &lt;code class=&quot;highlighter-rouge&quot;&gt;origin&lt;/code&gt;-a zmiany,
 przełączam terminal na VPS-a, &lt;strong&gt;pobieram&lt;/strong&gt; (&lt;code class=&quot;highlighter-rouge&quot;&gt;git pull&lt;/code&gt;) zmiany i gotowe 🎉&lt;/p&gt;

    &lt;p&gt;W tym miejscu instaluję &lt;a href=&quot;https://nodejs.org/en/download/package-manager/#debian-and-ubuntu-based-linux-distributions&quot;&gt;Node.js&lt;/a&gt; za pomocą prostego narzędzia
 &lt;a href=&quot;https://github.com/creationix/nvm#installation&quot;&gt;nvm&lt;/a&gt;, które daje mi elastyczność w instalowaniu kilku wersji Node.js
 w jednym systemie operacyjnym.&lt;/p&gt;

    &lt;p&gt;Rozwiązanie jest szczególnie pomocne, kiedy masz kilka projektów, które były
 tworzone w różnych wersjach Node.js i są ściśle do nich “przywiązane”.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Instalacja projektów, które były we wcześniejszej lokalizacji&lt;/p&gt;

    &lt;p&gt;Korzystają z Git, przenoszenie projektów jest bardzo proste.
 Na nowym środowisku klonuję repozytorium, instaluje zależności i uruchamiam:&lt;/p&gt;

    &lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt; npm start
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Przekierowanie ruchu ze starego VPS-a na nowy&lt;/p&gt;

    &lt;p&gt;Ostatecznej aktualizacji wymagają DNSy, gdzie trzeba zaktualizować adres,
 na które mają się rozwiązywać domeny.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Wyłączenie starego VPS-a&lt;/p&gt;

    &lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt; shutdown
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;co-powie-dobry-admin&quot;&gt;Co powie dobry admin?&lt;/h2&gt;

&lt;p&gt;“Synku, a gdzie są backupy ze starego serwera?”&lt;/p&gt;

&lt;p&gt;No właśnie, ten temat dla mnie i moich projektów jest opcjonalny.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Znacie ten żart?&lt;br /&gt;
Ludzie dzielą się na tych co robią backupu i tych którzy będą je robili.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id=&quot;podsumowanie&quot;&gt;Podsumowanie&lt;/h2&gt;

&lt;p&gt;Korzystają wiele miesięcy z usług OVH muszę z przykrością powiedzieć, że nie
potrzebuję oglądać innych ofert, bo to jest mi zaoferowane spełnia moje
oczekiwania.&lt;/p&gt;

&lt;p&gt;Posiadanie własnego VPSa daje tą wolność uruchomienia aplikacji Node.js.
Ktoś próbował uruchomić aplikację serwerową na hostingach? No właśnie.&lt;/p&gt;

&lt;p&gt;Nie sądziłem, że korzystanie z VPSa będzie tak przyjemne. Własny serwer to nie
tylko konto &lt;code class=&quot;highlighter-rouge&quot;&gt;root&lt;/code&gt;, ale też możliwość uploadu na serwer czego dusza zapragnie.
Disk quota wynosząca 20GB daje mi dużo możliwości. Tym samym mogę WRESZCIE
przechowywać na serwerze zdjęcia w prywatnej “chmurze”.&lt;/p&gt;

&lt;!-- Resources --&gt;

</description>
            <pubDate>Fri, 31 Aug 2018 16:00:53 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2018/08/31/vps-ssd-w-ovh-jako-hosting-dla-twojej-aplikacji-nodejs-czy-warto.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2018/08/31/vps-ssd-w-ovh-jako-hosting-dla-twojej-aplikacji-nodejs-czy-warto.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/ovh-vps-ssd/post-banner-ovh-vps.png</image>
        </item>
        
        <item>
            <title>Najlepszy styl pracy z kodem: TDD + Pair programming</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Marzy mi się stworzenie idealnego środowiska pracy. Wpadłem na pomysł jak
je osiągnąć, ale do tego potrzebuję kilku desek, aby zbudować customowe biurko.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/post-banner-lifestyle-tdd-praca-z-kodem.png&quot; itemprop=&quot;image&quot; alt=&quot;Baner promujący artykuł&quot; /&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;konfiguracja&quot;&gt;Konfiguracja&lt;/h2&gt;

&lt;p&gt;Słyszę od wielu, że powinno się pracować w TDD, bo to jest najlepsze
dla wytworzonego kodu, aby posiadał od razu testy (a nawet kiedy jeszcze sam
się nie urodził).&lt;/p&gt;

&lt;p&gt;Świetnie, ale bardzo mało ludzi je stosuje &lt;sup&gt;[Potrzebne źródło]&lt;/sup&gt;.&lt;/p&gt;

&lt;p&gt;Co jeśli Wam powiem, że jest to pewna &lt;strong&gt;bariera&lt;/strong&gt;, taka fosa wokół zamku.
Jeśli jednak ją się pokona osiągnie się coś fantastycznego (trzymając się tego
przykładu z zamkiem - zdobędzie się skarb 💰).&lt;/p&gt;

&lt;p&gt;Wyobrażam sobie, że na początku potrzebny jest spory nakład budżetowy
oraz odpowiednia konfiguracja softwarowo-białkowa, ale jakie później zbierze
się owoce takiej pracy, to mało która konfiguracja może z nią konkurować.&lt;/p&gt;

&lt;h2 id=&quot;czego-potrzebujemy&quot;&gt;Czego potrzebujemy?&lt;/h2&gt;

&lt;p&gt;Aby zbudować idealne środowisko potrzebujemy 3 wyświetlaczy (w porywach do 5 -
po 2 dla każdego developera).&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;monitor wyświetlający kod z testami jednostkowymi (dla &lt;code class=&quot;highlighter-rouge&quot;&gt;Developera A&lt;/code&gt;)&lt;/li&gt;
  &lt;li&gt;monitor wyświetlający kod z implementacją (dla &lt;code class=&quot;highlighter-rouge&quot;&gt;Developera B&lt;/code&gt;)&lt;/li&gt;
  &lt;li&gt;monitor wyświetlający raport z testów, który automatycznie się uruchamiają,
  kiedy zmieni się implementacja albo testy&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Przykład:&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/tdd/best-workflow-setup.png&quot; alt=&quot;&quot; /&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;role&quot;&gt;Role&lt;/h2&gt;

&lt;p&gt;Cała idea skupia się na tym, że:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;Developer A&lt;/code&gt; jest odpowiedzialny za zdefiniowanie test case–ów,
  które są przekazane przez np. biznes, albo przez kogoś innego&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;Developer B&lt;/code&gt; jest odpowiedzialny za implementację logiki, tak aby pokryć
  wymagania zdefiniowane przez &lt;code class=&quot;highlighter-rouge&quot;&gt;Developera A&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;monitor na samej górze, wyświetla aktualny procent zaawansowania
  implementacji, tj. ile testów już przeszło, a ile jeszcze pozostało
  do implementacji.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;workflow&quot;&gt;Workflow&lt;/h2&gt;

&lt;p&gt;Jak widzę taki styl pracy:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Przychodzi do nas biznes (albo spotykamy się na planowaniu)&lt;/li&gt;
  &lt;li&gt;Developerzy notują co jest do zrobienia (albo czytają to, co biznes napisał
 w tickecie)&lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;Developer A&lt;/code&gt; pisze pojedynczo oczekiwania biznesowe w katalogu z testami:&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;na początku &lt;a href=&quot;/blog/2017/08/09/jak-napisac-testy-end-to-end-nightwatch-oraz-chrome-headless.html&quot;&gt;end-to-end&lt;/a&gt; (najwyższego poziomu)&lt;/li&gt;
      &lt;li&gt;potem w &lt;a href=&quot;/blog/2016/04/16/definicje-testow.html&quot;&gt;integracyjnych&lt;/a&gt; (komunikacja między modułami)&lt;/li&gt;
      &lt;li&gt;kończy na testach &lt;a href=&quot;https://www.facebook.com/events/202711777098053/&quot;&gt;jednostkowych&lt;/a&gt; (pojedyncze funkcje / klasy)&lt;/li&gt;
    &lt;/ul&gt;

    &lt;p&gt;konsultując się ciągle z &lt;code class=&quot;highlighter-rouge&quot;&gt;Developer B&lt;/code&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;Developer B&lt;/code&gt; tworzy logikę biznesową, podpiera się mocno atrapami
 (najprawdopodobniej będą to stuby)&lt;/li&gt;
  &lt;li&gt;Zadanie można uznać za skończone, jeśli:
    &lt;ul&gt;
      &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;Developer A&lt;/code&gt; skończył swoją pracę, czyli zdefiniuje wszystkie
  &lt;code class=&quot;highlighter-rouge&quot;&gt;test case&lt;/code&gt;-y jakie jemu (oraz biznesowi) mogły przyjść do głowy, oraz&lt;/li&gt;
      &lt;li&gt;monitor prezentujący aktualny raport z testów wyświetla informację,
  że wszystkie przypadki zostały przetestowane.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;opinia&quot;&gt;Opinia&lt;/h2&gt;

&lt;p&gt;Jak sądzisz, czy taki styl pracy jest idealny dla nas, developerów?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Chciałbym spróbować.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Zainteresowałem Ciebie takim stylem pracy? &lt;a href=&quot;/kontakt/&quot;&gt;Odezwij się&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Cya! 👋&lt;/p&gt;

&lt;!-- Resources --&gt;

</description>
            <pubDate>Mon, 16 Jul 2018 12:20:34 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2018/07/16/najlepszy-styl-pracy-z-kodem-tdd-pair-programming.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2018/07/16/najlepszy-styl-pracy-z-kodem-tdd-pair-programming.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/post-banner-lifestyle-tdd-praca-z-kodem.png</image>
        </item>
        
        <item>
            <title>Hexo: Integracja z Google Analytics</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Wielu z nas chciałoby wiedzieć, kto nas obserwuje w danym momencie na naszym
blogu albo ile wyświetleń mają nasze artykuły, które napisaliśmy.&lt;/p&gt;

&lt;p&gt;Z pomocą przychodzi narzędzie &lt;code class=&quot;highlighter-rouge&quot;&gt;Google Analytics&lt;/code&gt;. Jest to internetowy
program, który służy do analizy wyświetleń strony internetowej.&lt;/p&gt;

&lt;p&gt;Opiszę jak dołączyć wcześniej wspomniane narzędzie do swojego bloga.&lt;/p&gt;

&lt;figure class=&quot;with-border-image&quot;&gt;
    &lt;img src=&quot;/assets/images/posts/post-banner-hexo-integrate-google-analytics.png&quot; itemprop=&quot;image&quot; alt=&quot;Baner promujący artykuł&quot; /&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;krok-1-wchodzimy-na-stronę-google-analytics&quot;&gt;Krok 1. Wchodzimy na stronę &lt;code class=&quot;highlighter-rouge&quot;&gt;Google Analytics&lt;/code&gt;&lt;/h2&gt;

&lt;p&gt;Wchodzimy na stronę &lt;a href=&quot;https://analytics.google.com/analytics/&quot;&gt;https://analytics.google.com/analytics/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Przed naszymi oczami ukazuje się komponent:&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/google/analytics-step-1.jpg&quot; alt=&quot;&quot; /&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;krok-2-założenie-nowego-konta-na-google-analytics&quot;&gt;Krok 2. Założenie nowego konta na &lt;code class=&quot;highlighter-rouge&quot;&gt;Google Analytics&lt;/code&gt;&lt;/h2&gt;

&lt;p&gt;Potrzebujemy konta w tym serwisie, dlatego jeśli kliknąłeś w powyższy link
(jeśli nie to zrób to teraz), to kliknij w pozycję &lt;code class=&quot;highlighter-rouge&quot;&gt;Sign up&lt;/code&gt;.
Jeśli to zrobiłeś to otrzymasz taki oto formularz:&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/google/analytics-step-2.jpg&quot; alt=&quot;&quot; /&gt;
&lt;/figure&gt;

&lt;ul&gt;
  &lt;li&gt;w polu &lt;code class=&quot;highlighter-rouge&quot;&gt;Account Name&lt;/code&gt; wpisujesz nazwę swojego konta&lt;/li&gt;
  &lt;li&gt;w &lt;code class=&quot;highlighter-rouge&quot;&gt;Website Name&lt;/code&gt; (&lt;code class=&quot;highlighter-rouge&quot;&gt;Nazwa witryny&lt;/code&gt;) wpisujesz nazwę swojej strony www&lt;/li&gt;
  &lt;li&gt;w &lt;code class=&quot;highlighter-rouge&quot;&gt;Website URL&lt;/code&gt; (&lt;code class=&quot;highlighter-rouge&quot;&gt;URL witryny&lt;/code&gt;) wpisujesz nazwę swojego bloga, dzięki temu
  mechanizm &lt;code class=&quot;highlighter-rouge&quot;&gt;Google Analytics&lt;/code&gt; będzie wiedział, że będzie śledził dokładnie
  Twoją stronę.&lt;/li&gt;
  &lt;li&gt;w &lt;code class=&quot;highlighter-rouge&quot;&gt;Industry Category&lt;/code&gt; (&lt;code class=&quot;highlighter-rouge&quot;&gt;Kategoria branży&lt;/code&gt;) wybierz kategorię do której mógłby
  należeć Twój blog&lt;/li&gt;
  &lt;li&gt;w &lt;code class=&quot;highlighter-rouge&quot;&gt;Reporting Time Zone&lt;/code&gt; (&lt;code class=&quot;highlighter-rouge&quot;&gt;Strefa czasowa raportowania&lt;/code&gt;) wybierz odpowiednią
  dla siebie strefę czasową&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Później klikamy w pozycję końcową - &lt;code class=&quot;highlighter-rouge&quot;&gt;Get Tracking ID&lt;/code&gt; 🎉&lt;/p&gt;

&lt;p&gt;Teraz naszym oczom ukażą się pola służące do akceptacji wszelkich warunków i
regulaminu &lt;code class=&quot;highlighter-rouge&quot;&gt;Google Analytics&lt;/code&gt;. &lt;strong&gt;Pamiętaj, żeby je przeczytać!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Na końcu otrzymamy unikalne ID, które będziemy potrzebować, będzie
ono wyglądać w stylu &lt;code class=&quot;highlighter-rouge&quot;&gt;UA-XXXXXXX-X&lt;/code&gt;.&lt;/p&gt;

&lt;h2 id=&quot;krok-3-osadzenie-unikalnego-id-w-konfiguracji&quot;&gt;Krok 3. Osadzenie unikalnego ID w konfiguracji&lt;/h2&gt;

&lt;p&gt;Będąc w głównym katalogu naszego bloga, otwieramy plik o nazwie &lt;code class=&quot;highlighter-rouge&quot;&gt;_config.yml&lt;/code&gt;
i dopisujemy do niego unikalne ID.&lt;/p&gt;

&lt;div class=&quot;language-yml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;na&quot;&gt;google_analytics&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;UA-XXXXXXX-X&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;krok-4-sprawdzamy-czy-google-analytics-zostało-dobrze-dodane&quot;&gt;Krok 4. Sprawdzamy, czy &lt;code class=&quot;highlighter-rouge&quot;&gt;Google Analytics&lt;/code&gt; zostało dobrze dodane&lt;/h2&gt;

&lt;p&gt;Po zbudowaniu aplikacji (&lt;code class=&quot;highlighter-rouge&quot;&gt;hexo server&lt;/code&gt;) albo jej opublikowaniu i uruchomieniu
w przeglądarce, w sekcji &lt;code class=&quot;highlighter-rouge&quot;&gt;&amp;lt;head&amp;gt;&lt;/code&gt; (w kodzie strony) będzie widoczny nowy skrypt:&lt;/p&gt;

&lt;div class=&quot;language-html highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;g&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;){&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'GoogleAnalyticsObject'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;||&lt;/span&gt;&lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(){&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;].&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;q&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;].&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;q&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;||&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[]).&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;push&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kr&quot;&gt;arguments&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)},&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;].&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;Date&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;createElement&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt;
&lt;span class=&quot;nx&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;getElementsByTagName&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;];&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;async&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;g&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;parentNode&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;insertBefore&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;})(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;window&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;document&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'script'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'//www.google-analytics.com/analytics.js'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'ga'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

&lt;span class=&quot;nx&quot;&gt;ga&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'create'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'UA-XXXXXXX-X'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'auto'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;nx&quot;&gt;ga&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'send'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'pageview'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;feedback&quot;&gt;Feedback&lt;/h2&gt;

&lt;p&gt;Drogi czytelniku / blogerze napisz w komentarzu pod tym wpisem (kończącym serię
jak w 4 prostych krokach stworzyć w pełni bloga z wykorzystaniem &lt;code class=&quot;highlighter-rouge&quot;&gt;hexo&lt;/code&gt;),
czy poradziłeś sobie z konfiguracją &lt;code class=&quot;highlighter-rouge&quot;&gt;Google Analytics&lt;/code&gt; czy może jednak
napotkałeś na problemy.&lt;/p&gt;

&lt;p&gt;Chciałbym, aby mój blog nie był tylko źródłem do czytania wpisów, ale też
miejscem gdzie czytelnicy mogliby wypowiedzieć się w temacie który poruszam.&lt;/p&gt;

&lt;h2 id=&quot;polecane-źródła&quot;&gt;Polecane źródła&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://gist.github.com/ythecombinator/dc245da48a757b91b777&quot;&gt;https://gist.github.com/ythecombinator/dc245da48a757b91b777&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://codeblocq.com/2015/12/Add-Google-Analytics-to-your-hexo-blog/&quot;&gt;http://codeblocq.com/2015/12/Add-Google-Analytics-to-your-hexo-blog/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;p&gt;PS. Dziękuję &lt;a href=&quot;https://ctworzewski.github.io/blog/&quot;&gt;@ctworzewski&lt;/a&gt; za pomoc w napisaniu tego artykułu.&lt;/p&gt;

&lt;div id=&quot;promotion-hexo-articles&quot;&gt;
    &lt;h2&gt;Artykuły, dzięki którym stworzysz &lt;em&gt;bloga&lt;/em&gt; w 10 minut:&lt;/h2&gt;

    &lt;ul&gt;
        &lt;li&gt;
            &lt;a href=&quot;/blog/2018/05/28/jak-zalozyc-bloga-korzystajac-z-hexo.html&quot;&gt;
                &lt;img src=&quot;/assets/images/posts/post-banner-hexo-setup-blog.png&quot; alt=&quot;Jak założyć bloga korzystając z Hexo?&quot; /&gt;
            &lt;/a&gt;
        &lt;/li&gt;
        &lt;li&gt;
            &lt;a href=&quot;/blog/2018/06/04/hexo-jak-zmienic-domyslny-wyglad-bloga.html&quot;&gt;
                &lt;img src=&quot;/assets/images/posts/post-banner-hexo-change-theme.png&quot; alt=&quot;Jak zmienić domyślny wygląd bloga opartego na Hexo?&quot; /&gt;
            &lt;/a&gt;
        &lt;/li&gt;
        &lt;li&gt;
            &lt;a href=&quot;/blog/2018/06/07/hexo-integracja-z-disqus.html&quot;&gt;

                &lt;img src=&quot;/assets/images/posts/post-banner-hexo-integrate-disqus.png&quot; alt=&quot;Hexo: Integracja z Disqus&quot; /&gt;
            &lt;/a&gt;
        &lt;/li&gt;
        &lt;li&gt;
            &lt;a href=&quot;/blog/2018/06/30/hexo-integracja-google-analytics.html&quot;&gt;
                &lt;img src=&quot;/assets/images/posts/post-banner-hexo-integrate-google-analytics.png&quot; alt=&quot;Hexo: Integracja z Google Analytics&quot; /&gt;
            &lt;/a&gt;
        &lt;/li&gt;
    &lt;/ul&gt;
&lt;/div&gt;

&lt;!-- Resources --&gt;

</description>
            <pubDate>Sat, 30 Jun 2018 17:45:41 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2018/06/30/hexo-integracja-google-analytics.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2018/06/30/hexo-integracja-google-analytics.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/post-banner-hexo-integrate-google-analytics.png</image>
        </item>
        
        <item>
            <title>Mam pomysł</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Od jakiegoś czasu nie publikuję filmów. Powodem jest to, że wchodzę
na kolejny poziom w procesie ich tworzenia. W sumie to wszędzie są te same
poziomy edukacji. Przytoczę je, aby wyrównać poziom.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/post-banner-lifestyle-mam-pomysl.png&quot; itemprop=&quot;image&quot; alt=&quot;Baner promujący artykuł&quot; /&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;poziomy-edukacji&quot;&gt;Poziomy edukacji&lt;/h2&gt;

&lt;ol&gt;
  &lt;li&gt;Entuzjastyczny debiutant - “Nie wiem, że nie wiem”&lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Zniechęcony adept - “Wiem, że nie wiem”&lt;/p&gt;

    &lt;p&gt;Obecny stan.&lt;br /&gt;
 &lt;em&gt;Dziecięcia&lt;/em&gt; frajda na produkcję filmów zniknęła.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;Ostrożny praktyk - “Wiem, że wiem”&lt;/li&gt;
  &lt;li&gt;Samodzielny ekspert - “Nie wiem, że wiem”&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;em&gt;Źródło: &lt;a href=&quot;https://piecioshka.github.io/slides-warsawjs-workshop-19-front-end-beginner/#2&quot;&gt;Slajdy z WarsawJS Workshop #19 - Wstęp do Front-endu&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Chcesz abym stworzył: prelekcję, film i artykuł na wybrany przez Ciebie
temat? Wpisz go do sondy.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id=&quot;dlaczego-brakuje-filmów&quot;&gt;Dlaczego brakuje filmów?&lt;/h2&gt;

&lt;p&gt;Kiedy widzę, ile pracy muszę poświęcić na produkcję filmu, czuje się jak dziecko
we mgle. Widzę tyle możliwości, tyle pomysłów, tyle pracy, że się poddaje.&lt;/p&gt;

&lt;p&gt;Trwam już w tym od miesiąca.&lt;/p&gt;

&lt;p&gt;Ciężko mi jest, bo uwielbiam tworzyć filmy i pisać posty - pomimo moich
niedoskonałości związanych z poprawnym wypowiadaniem się (tworzenie konstrukcji
zdań, używaniem odpowiednich słów w opisach).&lt;/p&gt;

&lt;figure class=&quot;social-center-block&quot;&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;pl&quot; dir=&quot;ltr&quot;&gt;&lt;a href=&quot;https://twitter.com/hashtag/AMA?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#AMA&lt;/a&gt; Myślę sobie o takich zawodach, gdzie zweryfikuję czas trwania zbudowania poszczególnych treści. Zrobię prelekcję, napiszę artykuł oraz stworzę film na 1 temat.&lt;br /&gt;&lt;br /&gt;Następnie podliczę ile czasu poświęciłem na każdą z tych aktywności. Ciekawą mnie rezultaty.&lt;br /&gt;&lt;br /&gt;Pomysł na temat?&lt;/p&gt;&amp;mdash; Piotr Kowalski (@piecioshka) &lt;a href=&quot;https://twitter.com/piecioshka/status/1005913586181517313?ref_src=twsrc%5Etfw&quot;&gt;June 10, 2018&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async=&quot;&quot; src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;

&lt;/figure&gt;

&lt;h2 id=&quot;co-zrobić-aby-na-kanale-pojawił-się-nowy-film&quot;&gt;Co zrobić, aby na kanale pojawił się nowy film?&lt;/h2&gt;

&lt;p&gt;Właśnie wpadłem na pomysł. Uruchomię pojedynek.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Nic mnie tak nie mobilizuje jak rywalizacja.&lt;/strong&gt; Walka z samym sobą, kiedy nikt
na Ciebie nie patrzy jet nudna. Kiedy jednak w tej rywalizacji bierze kilka
osób, zaczyna być ciekawie!&lt;/p&gt;

&lt;p&gt;Tym razem zrobię zawody w pojedynkę, ale w kilku obszarach.&lt;/p&gt;

&lt;p&gt;Zrobię mini-zawody, gdzie przygotuję się do zrobienia 3 aktywności:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;prezentacja (a raczej &lt;a href=&quot;https://youtube.com/warsawjs&quot;&gt;lightning talk&lt;/a&gt;, tylko że taki 10 minutowy)&lt;/li&gt;
  &lt;li&gt;artykuł na blogu&lt;/li&gt;
  &lt;li&gt;oraz film &lt;a href=&quot;https://youtube.com/piecioshka&quot;&gt;na kanale&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Każdą z tych aktywności zmierzę pod kątem czasu poświęconego na realizację.
Bardzo ważne jest, że wykonam tylko jeden research. Po to, aby czas na
research nie liczyć kilkukrotnie oraz aby każda z aktywności nie była na
starcie przegrana. Chcę poświęcić kilka godzin, aby zrobić jedno rozeznanie
w temacie, czego efektem będzie jeden prosty dokument w postaci np. mamy
myśli (tak aby nie pisać - jak to zwykle bywa - notatek w formie artykułu).&lt;/p&gt;

&lt;h2 id=&quot;regulamin-zawodów&quot;&gt;Regulamin zawodów&lt;/h2&gt;

&lt;blockquote&gt;
  &lt;p&gt;Śmiesznie jest pisać regulamin do zawodów, które się wymyśliło i w których
będzie się brać rolę oraz będzie się główną postacią zawodów, bo tylko
jedna osoba będzie brała w nich udział. Przypomina mi to scenę z filmu
“&lt;a href=&quot;https://www.filmweb.pl/film/Najlepszy-2017-772700&quot;&gt;Najlepszy&lt;/a&gt;”, gdzie główny bohater filmu brał udział w zawodach specjalnie
przygotowanych dla niego, aby pobił rekord i wziąć udział w prestiżowych
zawodach.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
  &lt;li&gt;§1. Wybór dowolnego tematu z dziedziny technologii webowych.
    &lt;ul&gt;
      &lt;li&gt;Wyboru dokonuję poprzez wybranie tematu, który otrzyma największą liczbę
  głosów w &lt;em&gt;twitterowej&lt;/em&gt; sondzie.&lt;/li&gt;
      &lt;li&gt;Sonda kończy się 17 czerwca 2018.&lt;/li&gt;
      &lt;li&gt;W przypadku tematów o równym poziomie liczby głosów, temat zostanie
  wybrany w drodze losowej (&lt;code class=&quot;highlighter-rouge&quot;&gt;Math.random&lt;/code&gt;)&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;§2. Realizacja researchu, którego &lt;em&gt;efektem&lt;/em&gt; będzie mapa myśli.&lt;/li&gt;
  &lt;li&gt;§3. Realizacja aktywności “&lt;strong&gt;Prezentacja&lt;/strong&gt;”:
    &lt;ul&gt;
      &lt;li&gt;Stworzenie slajdów do prezentacji
        &lt;ul&gt;
          &lt;li&gt;Opracowanie celu&lt;/li&gt;
          &lt;li&gt;Opracowanie planu ramowego&lt;/li&gt;
          &lt;li&gt;Uszczegółowienie&lt;/li&gt;
          &lt;li&gt;Stworzenie notatek do slajdów&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
      &lt;li&gt;Dokonanie 2 prób przed obcą osobą (lub kamerą)&lt;/li&gt;
      &lt;li&gt;Wygłoszenie prezentacji na dowolnym &lt;a href=&quot;https://warsawjs.com/&quot;&gt;meetupie&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;§4. Realizacja aktywności “&lt;strong&gt;Artykuł&lt;/strong&gt;”:
    &lt;ul&gt;
      &lt;li&gt;Przygotowanie treści artykułu
        &lt;ul&gt;
          &lt;li&gt;Dodanie bibliografii i odnośników do wiarygodnych źródeł&lt;/li&gt;
          &lt;li&gt;Stworzenie baneru reklamującego artykuł&lt;/li&gt;
          &lt;li&gt;Stworzenie prostej infografiki&lt;/li&gt;
          &lt;li&gt;Pozyskanie jednej odpowiedzi na pyt. zw. z tematem od innej osoby&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;§5. Realizacja aktywności “&lt;strong&gt;Film&lt;/strong&gt;”:
    &lt;ul&gt;
      &lt;li&gt;Napisanie scenopisu
        &lt;ul&gt;
          &lt;li&gt;Zdefiniowanie listy scen&lt;/li&gt;
          &lt;li&gt;Określenie typu kadru dla każdego ujęcia&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
      &lt;li&gt;Wybranie planu zdjęciowego&lt;/li&gt;
      &lt;li&gt;Nagranie materiału&lt;/li&gt;
      &lt;li&gt;Postprodukcja: Montaż filmu za pomocą specjalistycznego software-u&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;§6. Finalizacja
    &lt;ul&gt;
      &lt;li&gt;Podliczenie czasy trwania każdej aktywności&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;p&gt;Chciałbyś, abym wypowiedział się na Twój temat?&lt;br /&gt;
Dodaj go do &lt;em&gt;twitterowej&lt;/em&gt; sondy. Po &lt;strong&gt;7 dniach&lt;/strong&gt; (od dziś) wybiorę
najpopularniejszy.&lt;/p&gt;

&lt;p&gt;Cya! 👋&lt;/p&gt;

&lt;!-- Resources --&gt;

</description>
            <pubDate>Sun, 10 Jun 2018 22:00:00 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2018/06/10/mam-pomysl.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2018/06/10/mam-pomysl.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/post-banner-lifestyle-mam-pomysl.png</image>
        </item>
        
        <item>
            <title>Hexo: Integracja z Disqus</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Kiedy już mamy blog, cas aby oddać społeczności panel z komentarzami,
aby zdobyć feedback na temat danego artykułu. Dla wszystkich blogerów,
wiadomość zwrotna to bardzo cenna wartość.&lt;/p&gt;

&lt;p&gt;Przyszła więc pora na integrację z &lt;a href=&quot;/blog/2018/06/01/dlaczego-warto-uzywac-disqusa-na-swoim-blogu.html&quot;&gt;Disqus&lt;/a&gt;-em.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/post-banner-hexo-integrate-disqus.png&quot; itemprop=&quot;image&quot; alt=&quot;Baner promujący artykuł&quot; /&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;krok-1-założenie-konta-w-disqus&quot;&gt;Krok 1. Założenie konta w Disqus&lt;/h2&gt;

&lt;p&gt;Wchodzimy na stronę &lt;a href=&quot;https://disqus.com/&quot;&gt;disqus.com&lt;/a&gt; i zakładamy konto.&lt;/p&gt;

&lt;p&gt;Tworzymy konto, by móc ustawić swoje dane: &lt;em&gt;avatar, imię i nazwisko, itp.&lt;/em&gt;&lt;/p&gt;

&lt;h2 id=&quot;krok-2-założenie-nowej-strony-w-disqus&quot;&gt;Krok 2. Założenie nowej strony w Disqus&lt;/h2&gt;

&lt;p&gt;Potrzebowaliśmy konta, aby zostać administratorem komentarzy na nowej stronie.
Załóżmy więc nową stronę, aby móc skonfigurować na niej panel z komentarzami.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Wchodzimy na &lt;a href=&quot;https://disqus.com/admin/&quot;&gt;disqus.com/admin&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;W lewym górnym logu klikamy na &lt;code class=&quot;highlighter-rouge&quot;&gt;Your Sites&lt;/code&gt; a następnie na &lt;code class=&quot;highlighter-rouge&quot;&gt;New&lt;/code&gt;.&lt;/p&gt;

    &lt;p&gt;&lt;em&gt;Powinniśmy być na stronie &lt;a href=&quot;https://disqus.com/admin/create/&quot;&gt;disqus.com/admin/create&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;Uzupełniamy formularz:
    &lt;ul&gt;
      &lt;li&gt;W pole &lt;code class=&quot;highlighter-rouge&quot;&gt;Website Name&lt;/code&gt; wpisujemy nazwę aplikacji / strony, gdzie chcemy
  osadzić komentarze&lt;/li&gt;
      &lt;li&gt;W liście &lt;code class=&quot;highlighter-rouge&quot;&gt;Category&lt;/code&gt; wybieramy 1 z 10 kategorii tematycznej naszej strony.
  Pomocne jest to dla użytkowników Disqusa, którzy podczas przeglądania
  samego portalu Disqus.com będą poszukiwać artykułów z danej kategorii.&lt;/li&gt;
      &lt;li&gt;W liście &lt;code class=&quot;highlighter-rouge&quot;&gt;Language&lt;/code&gt; warto wybrać język strony. W tym języku będzie
  wyświetlany komponent z komentarzami.&lt;/li&gt;
    &lt;/ul&gt;

    &lt;figure&gt;
      &lt;img src=&quot;/assets/images/posts/disqus/disqus-create-new-site.png&quot; alt=&quot;&quot; /&gt;
  &lt;/figure&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;W kolejnym kroku wybieramy plan.&lt;/p&gt;

    &lt;p&gt;&lt;em&gt;Polecam wybrać darmowy, tj. &lt;code class=&quot;highlighter-rouge&quot;&gt;Basic&lt;/code&gt; i potwierdzić klikając w &lt;code class=&quot;highlighter-rouge&quot;&gt;Subscribe Now&lt;/code&gt;.&lt;/em&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;W kolejnym kroku &lt;code class=&quot;highlighter-rouge&quot;&gt;Disqus&lt;/code&gt; prezentuje listę platform, gdzie chcemy osadzić
  panel z komentarzami. Proponuję wybrać ostatnią opcję:&lt;/p&gt;

    &lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;  I don't see my platform listed,
  install manually with Universal Code
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;

    &lt;p&gt;Zostanie zaprezentowany film jak osadzić &lt;code class=&quot;highlighter-rouge&quot;&gt;Disqus&lt;/code&gt;a na zwykłej stronie.
  Nie interesuje nas on. Szablony w Hexo posiadają już integrację z
  &lt;code class=&quot;highlighter-rouge&quot;&gt;Disqus&lt;/code&gt;-em &lt;em&gt;out-of-the-box&lt;/em&gt;.&lt;/p&gt;

    &lt;p&gt;Klikamy w przycisk &lt;code class=&quot;highlighter-rouge&quot;&gt;Configure&lt;/code&gt;, znajdujący się na samym dole strony.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;Na stronie konfiguracji możemy wybrać:
    &lt;ul&gt;
      &lt;li&gt;&lt;strong&gt;styl&lt;/strong&gt; panelu komentarzy dla &lt;em&gt;jasnych&lt;/em&gt; albo &lt;em&gt;ciemnych&lt;/em&gt; teł&lt;/li&gt;
      &lt;li&gt;&lt;strong&gt;typ kroju fontu&lt;/strong&gt; użytego w panelu z komentarzami&lt;/li&gt;
      &lt;li&gt;&lt;strong&gt;adres URL&lt;/strong&gt; do głównej strony, gdzie panel z komentarzami będzie
  dostępny np. &lt;a href=&quot;https://piecioshka.github.io/hexo-blog/&quot;&gt;piecioshka.github.io/hexo-blog&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;

    &lt;p&gt;&lt;em&gt;W tym momencie wszystkie pola są opcjonalne. Oznacza to tyle że nie
  musimy ich uzupełniać.&lt;/em&gt;&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;krok-3-konfiguracja-komentarzy-na-blogu&quot;&gt;Krok 3. Konfiguracja komentarzy na blogu&lt;/h2&gt;

&lt;p&gt;Konfiguracja &lt;code class=&quot;highlighter-rouge&quot;&gt;Disqus&lt;/code&gt;-a w Hexo jest banalnie prosta.&lt;/p&gt;

&lt;p&gt;Wystarczy, że do pliku &lt;code class=&quot;highlighter-rouge&quot;&gt;_config.yml&lt;/code&gt; dodamy odpowiednią wartość
&lt;code class=&quot;highlighter-rouge&quot;&gt;disqus_shortname&lt;/code&gt; i … ale pomału.&lt;/p&gt;

&lt;h3 id=&quot;skąd-pobrać-wartość-disqus_shortname&quot;&gt;Skąd pobrać wartość &lt;code class=&quot;highlighter-rouge&quot;&gt;disqus_shortname&lt;/code&gt;?&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Znowu wchodzimy na &lt;a href=&quot;https://disqus.com/admin/&quot;&gt;disqus.com/admin&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Wybieramy nowo dodaną stronę (z panelu na górze strony)&lt;/li&gt;
  &lt;li&gt;Po prawej stronie klikamy z link &lt;code class=&quot;highlighter-rouge&quot;&gt;Edit Settings&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Znajdziemy się na stronie, gdzie będzie widoczny pole &lt;code class=&quot;highlighter-rouge&quot;&gt;Shortname&lt;/code&gt;.&lt;/p&gt;

    &lt;p&gt;&lt;em&gt;Kopiujemy wartość tego pola: np. &lt;code class=&quot;highlighter-rouge&quot;&gt;piecioshka-pl&lt;/code&gt;&lt;/em&gt;&lt;/p&gt;

    &lt;blockquote class=&quot;block-average&quot;&gt;
      &lt;h3 id=&quot;-uwaga&quot;&gt;&lt;i class=&quot;icon-average&quot;&gt;&lt;/i&gt; Uwaga&lt;/h3&gt;
      &lt;p&gt;Wartość tego pola &lt;strong&gt;nie może być zmieniona&lt;/strong&gt;.&lt;br /&gt;
Jedynym rozwiązaniem jest usunięcie strony i założenie nowej.&lt;/p&gt;
    &lt;/blockquote&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;W pliku &lt;code class=&quot;highlighter-rouge&quot;&gt;_config.yml&lt;/code&gt; na dole strony dodajemy:&lt;/p&gt;

    &lt;div class=&quot;language-yml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;  &lt;span class=&quot;na&quot;&gt;theme_config&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;comments&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;disqus_shortname&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;piecioshka-test&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;

    &lt;p&gt;&lt;em&gt;Jeśli już wcześniej istniał klucz &lt;code class=&quot;highlighter-rouge&quot;&gt;theme_config&lt;/code&gt; to dodajemy tylko blok
  &lt;code class=&quot;highlighter-rouge&quot;&gt;comments&lt;/code&gt;.&lt;/em&gt;&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;demo-&quot;&gt;Demo 🎉&lt;/h2&gt;

&lt;p&gt;Zapraszam na stronę: &lt;a href=&quot;https://piecioshka.github.io/hexo-blog/2018/06/01/iife/&quot;&gt;piecioshka.github.io/hexo-blog/2018/06/01/iife/&lt;/a&gt;,
gdzie zainstalowany został &lt;strong&gt;panel z komentarzami&lt;/strong&gt; 🏆&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/disqus/disqus-initial-layout.png&quot; alt=&quot;&quot; /&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;polecane-źródła&quot;&gt;Polecane źródła&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://gist.github.com/ythecombinator/dc245da48a757b91b777&quot;&gt;https://gist.github.com/ythecombinator/dc245da48a757b91b777&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://codeblocq.com/2015/12/Add-Disqus-comments-in-Hexo/&quot;&gt;http://codeblocq.com/2015/12/Add-Disqus-comments-in-Hexo/&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://codeblocq.com/2016/07/Add-Disqus-Comment-Count-to-your-Static-Blog-Index-Page/&quot;&gt;http://codeblocq.com/2016/07/Add-Disqus-Comment-Count-to-your-Static-Blog-Index-Page/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div id=&quot;promotion-hexo-articles&quot;&gt;
    &lt;h2&gt;Artykuły, dzięki którym stworzysz &lt;em&gt;bloga&lt;/em&gt; w 10 minut:&lt;/h2&gt;

    &lt;ul&gt;
        &lt;li&gt;
            &lt;a href=&quot;/blog/2018/05/28/jak-zalozyc-bloga-korzystajac-z-hexo.html&quot;&gt;
                &lt;img src=&quot;/assets/images/posts/post-banner-hexo-setup-blog.png&quot; alt=&quot;Jak założyć bloga korzystając z Hexo?&quot; /&gt;
            &lt;/a&gt;
        &lt;/li&gt;
        &lt;li&gt;
            &lt;a href=&quot;/blog/2018/06/04/hexo-jak-zmienic-domyslny-wyglad-bloga.html&quot;&gt;
                &lt;img src=&quot;/assets/images/posts/post-banner-hexo-change-theme.png&quot; alt=&quot;Jak zmienić domyślny wygląd bloga opartego na Hexo?&quot; /&gt;
            &lt;/a&gt;
        &lt;/li&gt;
        &lt;li&gt;
            &lt;a href=&quot;/blog/2018/06/07/hexo-integracja-z-disqus.html&quot;&gt;

                &lt;img src=&quot;/assets/images/posts/post-banner-hexo-integrate-disqus.png&quot; alt=&quot;Hexo: Integracja z Disqus&quot; /&gt;
            &lt;/a&gt;
        &lt;/li&gt;
        &lt;li&gt;
            &lt;a href=&quot;/blog/2018/06/30/hexo-integracja-google-analytics.html&quot;&gt;
                &lt;img src=&quot;/assets/images/posts/post-banner-hexo-integrate-google-analytics.png&quot; alt=&quot;Hexo: Integracja z Google Analytics&quot; /&gt;
            &lt;/a&gt;
        &lt;/li&gt;
    &lt;/ul&gt;
&lt;/div&gt;

&lt;!-- Resources --&gt;

</description>
            <pubDate>Thu, 07 Jun 2018 10:17:41 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2018/06/07/hexo-integracja-z-disqus.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2018/06/07/hexo-integracja-z-disqus.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/post-banner-hexo-integrate-disqus.png</image>
        </item>
        
        <item>
            <title>Jak zmienić domyślny wygląd bloga opartego na Hexo?</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Kiedy napisaliśmy kilka artykułów to teraz warto zmienić domyślny wygląd bloga.
Przecież każdy blog musi się czymś wyróżniać, tak aby czytelnicy mogli
je łatwo zapamiętać. Takie &lt;em&gt;zjawisko&lt;/em&gt; nazywa się &lt;strong&gt;pamięcią wzrokową&lt;/strong&gt;.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/post-banner-hexo-change-theme.png&quot; itemprop=&quot;image&quot; alt=&quot;Baner promujący artykuł&quot; /&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;gdzie-znaleźć-szablony-dla-hexo&quot;&gt;Gdzie znaleźć szablony dla &lt;code class=&quot;highlighter-rouge&quot;&gt;Hexo&lt;/code&gt;?&lt;/h2&gt;

&lt;p&gt;Wejdź na stronę: &lt;a href=&quot;https://hexo.io/themes/&quot;&gt;hexo.io/themes&lt;/a&gt;, gdzie jest lista 207
darmowych szablonów.&lt;br /&gt;
&lt;em&gt;Stan na dzień 2018-06-01&lt;/em&gt;&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Myślicie, że je liczyłem? Oczywiście, że nie! Wykorzystałem panel
&lt;code class=&quot;highlighter-rouge&quot;&gt;DevTools&lt;/code&gt; i wpisałem do zakładki &lt;code class=&quot;highlighter-rouge&quot;&gt;Console&lt;/code&gt; coś takiego:&lt;/p&gt;
  &lt;div class=&quot;language-js highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;document&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;querySelector&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'#plugin-list'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;children&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;length&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;  &lt;/div&gt;
  &lt;p&gt;Skąd wiedziałem jaki &lt;code class=&quot;highlighter-rouge&quot;&gt;id&lt;/code&gt; ma lista?&lt;br /&gt;
Uprzednio wykorzystałem zakładkę &lt;code class=&quot;highlighter-rouge&quot;&gt;Elements&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id=&quot;gdy-zrobię-swój-szablon-to-jak-go-opublikować&quot;&gt;Gdy zrobię swój szablon to jak go opublikować?&lt;/h2&gt;

&lt;p&gt;Masz na to minimum &lt;strong&gt;2 sposoby&lt;/strong&gt;:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;Publikujesz paczkę w &lt;code class=&quot;highlighter-rouge&quot;&gt;npm&lt;/code&gt;-ie&lt;/p&gt;

    &lt;p&gt;Istnieje już 40 takich tematów: &lt;a href=&quot;https://www.npmjs.com/search?q=hexo-theme-&quot;&gt;npmjs.com/search?q=hexo-theme-&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Tworzysz &lt;strong&gt;Pull Request&lt;/strong&gt;&lt;/p&gt;

    &lt;p&gt;W projekcie strony domowej: &lt;a href=&quot;https://github.com/hexojs/site/&quot;&gt;github.com/hexojs/site/&lt;/a&gt;
 znajduje się lista obecnych szablonów.&lt;/p&gt;

    &lt;p&gt;Dodaj definicję swojego szablonu do pliku &lt;code class=&quot;highlighter-rouge&quot;&gt;source/_data&lt;/code&gt; i wystaw Pull
 Request. Przykład dodania szablonu (pierwszy z brzegu):
 &lt;a href=&quot;https://github.com/hexojs/site/commit/44f4a2b8a9691ac0adcfcbbadd40d15de2b917f4&quot;&gt;github.com/hexojs/site/commit/44f4a2b8a9691ac0adcfcbbadd40d15de2b917f4&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;instalacja-szablonu-cleanblog&quot;&gt;Instalacja szablonu &lt;a href=&quot;http://codeblocq.com/2016/03/New-Hexo-Theme-Clean-Blog/&quot;&gt;CleanBlog&lt;/a&gt;&lt;/h2&gt;

&lt;p&gt;Już wybrałem szablon. Jest minimalistyczny, za to jednak ma interesujący font.
Przekonał mnie do siebie!&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/hexo/hexo-theme-clean-blog.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;figcaption&gt;
        Tak wygląda blog, po instalacji tematu &lt;strong&gt;CleanBlog&lt;/strong&gt;.
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;Odwiedź repozytorium: &lt;a href=&quot;https://github.com/klugjo/hexo-theme-clean-blog&quot;&gt;github.com/klugjo/hexo-theme-clean-blog&lt;/a&gt;&lt;/p&gt;

    &lt;p&gt;Wszystkie informacje (no prawie) na temat instalacji znajduję się tutaj.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;W sekcji “Installation” w pliku &lt;code class=&quot;highlighter-rouge&quot;&gt;README.md&lt;/code&gt; napisane jest, aby wykonać
 następujące polecenie (będąc oczywiście w katalogu projektu):&lt;/p&gt;

    &lt;p&gt;&lt;kbd&gt;Copy + paste&lt;/kbd&gt;&lt;/p&gt;

    &lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt; git clone https://github.com/klugjo/hexo-theme-clean-blog.git themes/clean-blog
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Następnie w pliku &lt;code class=&quot;highlighter-rouge&quot;&gt;_config.yml&lt;/code&gt; ustawić obecny temat na:&lt;/p&gt;

    &lt;div class=&quot;language-yml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt; &lt;span class=&quot;na&quot;&gt;theme&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;clean-blog&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Konfiguracja szablonu&lt;/p&gt;

    &lt;p&gt;Nowy temat pozwala na konfigurację. Wykorzystajmy to, aby dodać kilka
 interesujących rzeczy, takich jak:&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;nadpisanie domyślnego obrazka w tle&lt;/li&gt;
      &lt;li&gt;zdefiniowanie menu górnego&lt;/li&gt;
    &lt;/ul&gt;

    &lt;p&gt;Należy w tym celu w pliku &lt;code class=&quot;highlighter-rouge&quot;&gt;_config.yml&lt;/code&gt; zrobić nową sekcję
 &lt;code class=&quot;highlighter-rouge&quot;&gt;theme_config&lt;/code&gt; (polecam na samym dole), aby w niej definiować ustawienia
 szablonu.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;pokaż-mi-przykład-bo-inaczej-nie-zrozumiem&quot;&gt;Pokaż mi przykład, bo inaczej nie zrozumiem!&lt;/h2&gt;

&lt;p&gt;Przykład z mojej konfiguracji:&lt;/p&gt;

&lt;div class=&quot;language-yml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nn&quot;&gt;...&lt;/span&gt;
&lt;span class=&quot;na&quot;&gt;theme&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;clean-blog&lt;/span&gt;

&lt;span class=&quot;na&quot;&gt;theme_config&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;menu_title&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;Home&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;index_cover&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;/hexo-blog/images/IMG_3502.jpg&lt;/span&gt;

  &lt;span class=&quot;c1&quot;&gt;# Header&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;menu&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;Home&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;/&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;Contact&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;/contact/&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;Github&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;https://github.com/piecioshka/&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;icon&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;github&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;Twitter&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;https://twitter.com/piecioshka&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;icon&lt;/span&gt;&lt;span class=&quot;pi&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;twitter&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Moja rewizja z wdrożeniem tego tematu znajduje się tutaj:
&lt;a href=&quot;https://github.com/piecioshka/hexo-blog/commit/c216e0be14eee3e8889f3952fad3ed31fba35227&quot;&gt;github.com/piecioshka/hexo-blog/commit/c216e0be14eee3e8889f3952fad3ed31fba35227&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A jak teraz wygląda blog w przeglądarce?&lt;br /&gt;
&lt;a href=&quot;https://piecioshka.github.io/hexo-blog/&quot;&gt;piecioshka.github.io/hexo-blog/&lt;/a&gt;&lt;/p&gt;

&lt;h2 id=&quot;mój-wkład-w-rozwój-cleanblog&quot;&gt;Mój wkład w rozwój &lt;strong&gt;CleanBlog&lt;/strong&gt;&lt;/h2&gt;

&lt;p&gt;Ze względu, że użyłem tego tematu w swoim eksperymencie - pisania artykułów
&lt;em&gt;w języku angielskim&lt;/em&gt; - to udostępniając najnowszy &lt;a href=&quot;https://piecioshka.github.io/hexo-blog/2018/06/01/iife/&quot;&gt;artykuł o IIFE&lt;/a&gt;,
zauważyłem problem z brakiem obrazka w tweecie udostępniającym tenże artykuł.&lt;/p&gt;

&lt;p&gt;Wpadłem na pomysł, aby samemu dodać kilka pomocnych meta tagów.
Zrobiłem więc &lt;a href=&quot;https://github.com/klugjo/hexo-theme-clean-blog/pull/53&quot;&gt;Pull Request&lt;/a&gt;,
który został zmergowany! ⭐️&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;To już kolejny PR mojego autorstwa, który został wciągnięty do głównej gałęzi
projektu.&lt;/strong&gt; Jestem zadowolony z tego powodu - czuję, że mam wkład w rozwój
społeczności. Zrobienie czegoś dobrego dla drugiego człowieka daje mi mega
zastrzyk energii!&lt;/p&gt;

&lt;div id=&quot;promotion-hexo-articles&quot;&gt;
    &lt;h2&gt;Artykuły, dzięki którym stworzysz &lt;em&gt;bloga&lt;/em&gt; w 10 minut:&lt;/h2&gt;

    &lt;ul&gt;
        &lt;li&gt;
            &lt;a href=&quot;/blog/2018/05/28/jak-zalozyc-bloga-korzystajac-z-hexo.html&quot;&gt;
                &lt;img src=&quot;/assets/images/posts/post-banner-hexo-setup-blog.png&quot; alt=&quot;Jak założyć bloga korzystając z Hexo?&quot; /&gt;
            &lt;/a&gt;
        &lt;/li&gt;
        &lt;li&gt;
            &lt;a href=&quot;/blog/2018/06/04/hexo-jak-zmienic-domyslny-wyglad-bloga.html&quot;&gt;
                &lt;img src=&quot;/assets/images/posts/post-banner-hexo-change-theme.png&quot; alt=&quot;Jak zmienić domyślny wygląd bloga opartego na Hexo?&quot; /&gt;
            &lt;/a&gt;
        &lt;/li&gt;
        &lt;li&gt;
            &lt;a href=&quot;/blog/2018/06/07/hexo-integracja-z-disqus.html&quot;&gt;

                &lt;img src=&quot;/assets/images/posts/post-banner-hexo-integrate-disqus.png&quot; alt=&quot;Hexo: Integracja z Disqus&quot; /&gt;
            &lt;/a&gt;
        &lt;/li&gt;
        &lt;li&gt;
            &lt;a href=&quot;/blog/2018/06/30/hexo-integracja-google-analytics.html&quot;&gt;
                &lt;img src=&quot;/assets/images/posts/post-banner-hexo-integrate-google-analytics.png&quot; alt=&quot;Hexo: Integracja z Google Analytics&quot; /&gt;
            &lt;/a&gt;
        &lt;/li&gt;
    &lt;/ul&gt;
&lt;/div&gt;

&lt;!-- Resources --&gt;

</description>
            <pubDate>Mon, 04 Jun 2018 07:27:37 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2018/06/04/hexo-jak-zmienic-domyslny-wyglad-bloga.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2018/06/04/hexo-jak-zmienic-domyslny-wyglad-bloga.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/post-banner-hexo-change-theme.png</image>
        </item>
        
        <item>
            <title>Dlaczego warto używać Disqusa na swoim blogu?</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Masz swojego bloga. Starasz się pisać regularnie, aby utrzymać czytelników.
Zależy Ci na feedbacku ale go nie masz. Nikt nie chce pisać komentarzy.
Wiesz co może być przyczyną? Coś tak &lt;em&gt;błahego&lt;/em&gt;, że ciężko na to wpaść.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/post-banner-lifestyle-disqus-czy-warto.png&quot; itemprop=&quot;image&quot; alt=&quot;Baner promujący artykuł&quot; /&gt;
    &lt;figcaption&gt;
        Logo pobrałem ze strony:
        &lt;a href=&quot;https://disqus.com/brand/&quot;&gt;
            https://disqus.com/brand/
        &lt;/a&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Jeśli używasz własnej implementacji systemu komentarzy możesz być &lt;em&gt;ofiarą
ich braku&lt;/em&gt; z rożnych powodów. Zapraszam Cię do artykułu, gdzie przedstawię Ci
mój punkt widzenia. &lt;strong&gt;Rozmawiałem również z kilkoma autorami blogów&lt;/strong&gt;, aby
dowiedzieć się dlaczego oni używają &lt;a href=&quot;https://disqus.com&quot;&gt;Disqusa&lt;/a&gt; bądź dlaczego tego nie robią.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Zaznaczam, że artykuł nie jest sponsorowany przez żadną firmę.&lt;/strong&gt;&lt;/p&gt;

&lt;figure class=&quot;social-center-block&quot;&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;pl&quot; dir=&quot;ltr&quot;&gt;&lt;a href=&quot;https://twitter.com/hashtag/%C5%BCale?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#żale&lt;/a&gt; Kolega podesłał fajny artykuł. Chciałbym dać komentarz. Ale nie dam. Bo znowu jest customowa implementacja systemu komentarzy. Kurcze. W dzisiejszych czasach, kiedy jest Disqus i integracja z nim to max godzina, należy to wykorzystać. Chyba napiszę o tym artykuł... 🤔&lt;/p&gt;&amp;mdash; Piotr Kowalski (@piecioshka) &lt;a href=&quot;https://twitter.com/piecioshka/status/1001226012393426944?ref_src=twsrc%5Etfw&quot;&gt;May 28, 2018&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async=&quot;&quot; src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;

&lt;/figure&gt;

&lt;h2 id=&quot;powody-dla-których-nie-daję-komentarzy-w-customowych-implementacjach&quot;&gt;Powody dla których NIE DAJĘ komentarzy w customowych implementacjach&lt;/h2&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Wygląd&lt;/strong&gt;&lt;/p&gt;

    &lt;p&gt;Ludzie dokonują szybkiej oceny za pomocą narządu wzroku. Mój pierwszy
 szef powiedział:&lt;/p&gt;

    &lt;blockquote&gt;
      &lt;p&gt;Na stronach najważniejsze jest pierwsze wrażenie.&lt;/p&gt;
    &lt;/blockquote&gt;

    &lt;p&gt;Oznacza to tyle że jeśli strona (komponent) wygląda kiepsko to nie
 wzbudza zaufania wśród internautów. I mnie cechuje taka właściwość.
 Jeśli zrobiłeś własną implementację formularza z komentarzami a &lt;strong&gt;nie
 zadbałeś&lt;/strong&gt; o jego wygląd to licz się z brakiem komentarzy. Przynajmniej ode
 mnie.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Wolne działanie&lt;/strong&gt;&lt;/p&gt;

    &lt;p&gt;Tutaj ukłon w stronę pluginów &lt;a href=&quot;/blog/2011/08/27/jak-stworzyc-przyjazne-linki-w-wordpress.html&quot;&gt;WordPress&lt;/a&gt;-owych. Po dodaniu
 komentarza na stronie budowanej za pomocą tego najpopularniejszego CMF
 obok przycisku (albo zamiast niego) pojawia się loader. I czekasz,
 czekasz i czekasz i nie wiesz ile jeszcze będzie to trwało. Nie możesz
 zamknąć strony, bo:&lt;/p&gt;

    &lt;p class=&quot;center-text&quot;&gt;&lt;img src=&quot;/assets/images/loaders/2.gif&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

    &lt;p class=&quot;center-text&quot;&gt;&lt;img src=&quot;/assets/images/loaders/66.gif&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

    &lt;p class=&quot;center-text&quot;&gt;TRWA ŁADOWANIE…&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Refresh całej strony&lt;/strong&gt;&lt;/p&gt;

    &lt;blockquote&gt;
      &lt;p&gt;Świat poszedł do przodu. Pojawiły się komputery, amfetamina, samoloty.
&lt;small&gt;Cytat z filmu, pt. “Chłopaki nie płaczą”, rok 2000,
reżyser Olaf Lubaszenko.&lt;/small&gt;&lt;/p&gt;
    &lt;/blockquote&gt;

    &lt;p&gt;Jeśli po wysłaniu formularza z komentarzem strona jest &lt;em&gt;odświeżana&lt;/em&gt;
 to dziwi mnie to podobnie jak &lt;em&gt;majowe&lt;/em&gt; opady śniegu. W dzisiejszych czasach
 wystarczy napisać kilka linijek JavaScriptu, aby wysłać formularz &lt;em&gt;bez&lt;/em&gt;
 odświeżania całej strony.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Wpisywanie tych samych pól za każdym razem&lt;/strong&gt;&lt;/p&gt;

    &lt;p&gt;Kiedy chcę szybko napisać komentarz, zawsze muszę podawać takie rzeczy
 jak: imię, email, adres strony internetowej, captcha, albo jakaś inna
 weryfikacja poświadczająca, że jestem człowiekiem…&lt;/p&gt;

    &lt;p&gt;Szkoda mi na to czasu.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Brak centralizacji&lt;/strong&gt;&lt;/p&gt;

    &lt;p&gt;W ciągu tygodnia tworzę od kilku do kilkunastu komentarzy na łamach
 różnych blogów. Nie sposób jest zapamiętać wszystkie adresy.
 Miałem tak wiele razy, że chciałem coś jeszcze dodać do swojego
 już opublikowanego komentarza, albo zobaczyć czy ktoś jeszcze skomentować
 ten sam artykuł i wtedy jest &lt;em&gt;magiczny problem&lt;/em&gt; - NIE PAMIĘTAM gdzie
 wystawiałem dany komentarz. Nie będę teraz przeszukiwał historii ani
 &lt;a href=&quot;https://polskifrontend.pl&quot;&gt;Polskiego Front-endu&lt;/a&gt; w tym celu.&lt;/p&gt;

    &lt;p&gt;Po prostu odpuszczam.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Alternatywa?&lt;/strong&gt;&lt;/p&gt;

    &lt;p&gt;Najgorsze jest to, że kiedy już raz spróbowałem Disqusa, to się w zakochałem.
 Świetne narzędzie posiadające mnóstwo świetnych feature-ów. Przyzwyczaiłem
 się do niektórych featurów. Szkoda mi teraz wracać do komponentu z
 komentarzami, gdzie &lt;strong&gt;nie będzie widać mojego avatara&lt;/strong&gt; ani &lt;strong&gt;nie będę
 mógł osadzić zdjęcia&lt;/strong&gt;, ani innego media obiektu np. tweeta.&lt;/p&gt;

    &lt;p&gt;Komponent Disqusa jest dosyć rozbudowany.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;co-jest-takiego-w-disqus-że-chce-mi-się-skomentować&quot;&gt;Co jest takiego w Disqus, że chce mi się skomentować?&lt;/h2&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Centralizacja&lt;/strong&gt;&lt;/p&gt;

    &lt;p&gt;Scentralizowane miejsce, gdzie mam wszystkie swoje komentarze - wystarczy,
 że wejdę na swój profil na Disqus-ie i voilà!&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Edytowanie komentarzy&lt;/strong&gt;&lt;/p&gt;

    &lt;p&gt;Edycja komentarzy jest dla mnie zbawienna, szczególnie kiedy czasami o
 czymś zapomnę, popełnię literówkę lub źle sformatuję tekst.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Formatowanie wypowiedzi&lt;/strong&gt;&lt;/p&gt;

    &lt;p&gt;Jest mi wygodnie, kiedy mogę robić boldy, italici, osadzać kod i
 zdjęcia, a nawet wrzucać zdjęcia, bądź osadzać posty z fejsbuka.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://pl.wikipedia.org/wiki/Integralno%C5%9B%C4%87_danych&quot;&gt;Gwarancja integralności&lt;/a&gt;&lt;/p&gt;

    &lt;p&gt;Nikt poza mną nie jest w stanie zmodyfikować tego co wpisałem.&lt;/p&gt;

    &lt;blockquote&gt;
      &lt;p&gt;We reserve the right to remove User Content alleged to be infringing
without prior notice, at our sole discretion and without liability to you.
&lt;small&gt;&lt;a href=&quot;https://help.disqus.com/terms-and-policies/terms-of-service&quot;&gt;Term of Service&lt;/a&gt; @ Disqus&lt;/small&gt;&lt;/p&gt;
    &lt;/blockquote&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Głosowanie&lt;/strong&gt;&lt;/p&gt;

    &lt;p&gt;Głosowanie na komentarze motywuje celne i wartościowe komentarze.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Polecanie artykułów&lt;/strong&gt;&lt;/p&gt;

    &lt;p&gt;Polubienie artykułu poprzez kliknięcie w przycisk “Poleć” daje sygnał dla
 innych przeglądających Disqusa w poszukiwaniu ciekawych treści, że
 ten artykuł jest warty przeczytania.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Wątki&lt;/strong&gt;&lt;/p&gt;

    &lt;p&gt;Odpowiadanie na konkretne komentarze tworzy spójną historię.
 Czasami na blogach widzę, że struktura komentarzy jest płaska, ciężko
 wtedy o zabranie głosu tylko w jednej sprawie.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Udostępnienie komentarza&lt;/strong&gt;&lt;/p&gt;

    &lt;p&gt;Każdy komentarz posiada własny link, dzięki czemu mogę go komuś udostępnić.
 Po otworzeniu takiego linku wiesz, że nie chodzi o to abyś zapoznał się z
 całym wątkiem, tylko z wybranym komentarzem.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Wspominanie użytkowników&lt;/strong&gt; np. &lt;strong&gt;@piecioshka&lt;/strong&gt;&lt;/p&gt;

    &lt;p&gt;Kiedy zakładasz konto w Disqus, można Cię przywołać w dowolnym panelu
 z komentarzami. Ostatnio wykorzystują tą opcję, do tego, kiedy
 komentuje mniej popularne blogi tworzone przez nowych adeptów przywołuję
 znanych ludzi z branży, aby dowiedzieli się o ich istnieniu.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Nie trzeba podawać dodatkowych danych, aby móc oddać komentarz&lt;/strong&gt;&lt;/p&gt;

    &lt;p&gt;Autologowanie to wilki plus. Kiedy przeglądasz różne strony, na
niektórych jesteś pierwszy raz i kiedy chcesz skomentować to od razu
PISZESZ komentarz. Oszczędzasz czas związany z zakładaniem konta.
Trzymanie kont we wielu miejscach powoduje, że musisz pamiętać tyle haseł.
Oczywiście skorzystasz z &lt;a href=&quot;https://www.keepassx.org&quot;&gt;KeyPassX&lt;/a&gt;, ale IMO cały ten proces może
być wygodniejszy dzięki Disqus-owi.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/disqus/disqus-comment-tools-window.png&quot; alt=&quot;&quot; /&gt;
    &lt;figcaption&gt;
        Takie mam możliwości pojedynczego komentarza jako administrator.
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;z-punktu-widzenia-właściciela-bloga-po-co-jest-mieć-disqusa&quot;&gt;Z punktu widzenia właściciela bloga, po co jest mieć Disqusa?&lt;/h2&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;To nie Ty toczysz walkę ze spamem tylko Disqus&lt;/strong&gt;&lt;/p&gt;

    &lt;p&gt;Ze swojej strony mogę dodać, że przez kilka lat używania Disqusa nie
 spotkał mnie problem spamu. Sytuacja wyglądała inaczej kiedy miałem bloga
 postawionego na &lt;a href=&quot;/blog/2011/08/27/jak-stworzyc-przyjazne-linki-w-wordpress.html&quot;&gt;WordPress&lt;/a&gt;-ie.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Nie przechowujesz danych o użytkowniku&lt;/strong&gt;&lt;/p&gt;

    &lt;p&gt;Nie przechowując danych na temat usera, nie narażasz się na ich utratę
 danych. Eliminujesz w ten sposób podatności na zmianę danych przez kogoś,
 kto mógłby uzyskać &lt;strong&gt;nieautoryzowany&lt;/strong&gt; dostęp do bazy danych z komentarzami.&lt;/p&gt;

    &lt;p&gt;Domyślam się, że sami właściciele blogów nie byliby zainteresowani
 modyfikacją komentarzy swoich czytelników, jednak NIESTETY taka
 szansa istnieje.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Multi-platformowe konto&lt;/strong&gt;&lt;/p&gt;

    &lt;p&gt;Zakładając konto w Disqus masz swój profil, gdzie widzisz listę wszystkich
 swoich komentarzy na różnych stronach. Możesz ustawić avatar, który
 będzie identyfikował Twój komentarz.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Instalacja&lt;/strong&gt;&lt;/p&gt;

    &lt;p&gt;Integracja z systemem jest bardzo prosta. Wystarczy, że poświęcisz max
 godzinę, aby dodać dobrze wyglądający komponent komentarzy. Mnie to
 bardzo przekonało, do tego, aby korzystać z Disqusa.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;disqus-a-reklamy-problem-spiders-weba&quot;&gt;Disqus a reklamy. Problem &lt;code class=&quot;highlighter-rouge&quot;&gt;Spider’s Weba&lt;/code&gt;&lt;/h2&gt;

&lt;blockquote&gt;
  &lt;p&gt;W ostatni piątek przeżyliśmy na Spider’s Web niemały szok, gdy ni stąd ni
zowąd Disqus włączył swoje reklamy na naszej stronie.
&lt;small&gt;Początek artykułu pt. “O tym, jak Disqus postanowił nas załatwić
w piątek wieczór na szaro” opublikowany na &lt;a href=&quot;https://www.spidersweb.pl/2017/01/disqus-reklamy-problemy.html&quot;&gt;Spider’s Web&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Takimi słowami zaczyna się artykuł, w którym redaktorzy &lt;code class=&quot;highlighter-rouge&quot;&gt;Spider’s Weba&lt;/code&gt;
opowiedzieli przykrą dla nich historię, podczas której Disqus włączył im &lt;strong&gt;bez
ostrzeżenia&lt;/strong&gt; komponent reklamowy (który możecie zobaczyć poniżej).&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/disqus/spiders-web-disqus-promotion.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;figcaption&gt;
        Reklamy na Spider's Web.&lt;br /&gt;
        Źródło:
        &lt;a href=&quot;https://www.spidersweb.pl/2017/01/disqus-reklamy-problemy.html&quot;&gt;
            https://www.spidersweb.pl/2017/01/disqus-reklamy-problemy.html
        &lt;/a&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Głównym powodem tej przykrej sytuacji, było &lt;em&gt;niepoinformowanie&lt;/em&gt; redakcji
o włączeniu reklam, które można wyłączyć w wersji premium (płatne 10$ / miesiąc).&lt;/p&gt;

&lt;p&gt;Jestem przekonany, że taka firma jak Spider’s Web posiada środki, aby dokonywać
płatności za taką usługę, w końcu na podstawie komentarzy budowana
jest &lt;strong&gt;społeczność&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Zgadzam się z opinią redaktorów. Przed włączeniem reklam w serwisie, Disqus
powinien zapytać się o możliwość zakupu wersji płatnej, bo w przeciwnym
przypadku, ze względu na ruch, jaki wygenerowany przez &lt;strong&gt;Spider’s Web&lt;/strong&gt;, Disqus
musi włączyć reklamy. Dla mnie taka informacja to oczywista oczywistość.
Szkoda, że jej zabrakło. Czarny PR się rozlał.&lt;/p&gt;

&lt;p&gt;Ciekaw jestem, czy ktoś inny poza &lt;strong&gt;Spider’s Web&lt;/strong&gt;-em miał taki problem. Może to
była po prostu jednorazowa sytuacja, bo osoba odpowiedzialna za takie włączenie
spieszyła się na weekend, albo nawet przez myśl jej nie przeszło, że to, co chce
zrobić jest złą strategią. Każdy uczy się na błędach.&lt;/p&gt;

&lt;p&gt;W żaden sposób &lt;em&gt;nie będę bronił Disqusa&lt;/em&gt;, bo popełnił błąd, a za błędy się
płaci. Jednak jestem ciekaw czy taka sytuacja to wypadek przy pracy, czy aby
może stała praktyka.&lt;/p&gt;

&lt;p&gt;Znalazłem na &lt;a href=&quot;https://help.disqus.com/terms-and-policies/subscription-payments-faq&quot;&gt;stronie&lt;/a&gt; następującą informację:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;dl&gt;
      &lt;dt&gt;Why were ads activated on my site?&lt;/dt&gt;
      &lt;dd&gt;The free version of Disqus is supported by advertising. Commercial sites on
this version of Disqus will likely have some advertising. We email
publishers before activating advertising. If no one at your organization
received these emails, please reach out to us so that we can verify your
contact information.&lt;/dd&gt;
    &lt;/dl&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;W skrócie:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Disqus wysyła wcześniej informację o aktywowaniu reklam do serwisu na
którym jest osadzony.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Widocznie Spider’s Web uległ jakieś dziwnej sytuacji. Może cała ta zła opinia
o Disqusie pojawiła się przez &lt;strong&gt;niepoprawne działania filtrów antyspamowych&lt;/strong&gt;?&lt;/p&gt;

&lt;p&gt;Teraz to już za późno. Mleko wykipiało. Stracić zaufanie można szybko.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;Na &lt;a href=&quot;https://disqus.com/pricing/&quot;&gt;stronie&lt;/a&gt; znajduje się sekcja FAQ, na której można przeczytać:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;dl&gt;
      &lt;dt&gt;Are all sites required to run ads?&lt;/dt&gt;
      &lt;dd&gt;For personal blogs, .edu sites, nonprofits, and small sites that do not run
other advertising, Disqus advertising is optional. If you are a small,
non-commercial site, you can self identify for a free subscription to our
&lt;em&gt;Plus&lt;/em&gt; plan.&lt;/dd&gt;
    &lt;/dl&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;W skrócie:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Reklamy Disqusa są &lt;strong&gt;opcjonalne&lt;/strong&gt; dla blogów, stron edukacyjnych,
pozarządowych oraz małych stron, które nie mają żadnych innych reklam.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id=&quot;rodo-gdpr-czyli-o-bezpieczeństwie-danych&quot;&gt;RODO (GDPR), czyli o bezpieczeństwie danych&lt;/h2&gt;

&lt;p&gt;Jak opisać RODO w prostych słowach? To &lt;strong&gt;możliwość bycia zapomnianym&lt;/strong&gt;.
Dobrze to wyjaśniają panowie z HRejterzy:&lt;/p&gt;

&lt;div class=&quot;youtube-lazy&quot; data-youtube-id=&quot;KOpNBS3qwWI&quot;&gt;&lt;/div&gt;

&lt;p&gt;Jak sobie Disqus radzi RODO? Na &lt;a href=&quot;https://blog.disqus.com/update-on-privacy-and-gdpr-compliance&quot;&gt;stronie&lt;/a&gt; jest informacja, że:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Disqus already offers a strong Do Not Track (DNT) framework. This includes
both honoring DNT settings from browsers and allowing users to opt-out of
tracking within Disqus for targeted advertising and content recommendations.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Tutaj możesz zarządzać swoim śledzeniem: &lt;a href=&quot;https://disqus.com/data-sharing-settings/&quot;&gt;disqus.com/data-sharing-settings/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Kluczowa informacja:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;When a user is in Privacy Mode, Disqus will not collect or process any
personal data, as defined by GDPR.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Dalej można przeczytać, że jeśli chcesz, aby Disqus usunął wszystko co ma o
Tobie zapisane, powinieneś napisać maila na adres:
&lt;a href=&quot;mailto:privacy@disqus.com&quot;&gt;privacy@disqus.com&lt;/a&gt;&lt;/p&gt;

&lt;h2 id=&quot;wywiad-środowiskowy&quot;&gt;Wywiad środowiskowy&lt;/h2&gt;

&lt;p&gt;Porozmawiałem z kilkoma blogerami, którzy używają Disqusa lub też nie i nigdy
nie będą. Poniżej znajdziesz ich komentarz w tej sprawie. Kolejność
odpowiedzi jest przypadkowa.&lt;/p&gt;

&lt;blockquote class=&quot;block-good&quot;&gt;
  &lt;p&gt;Używam Disqus z dwóch powodów… Po pierwsze kiedyś, gdy blog stał jeszcze
na WordPress i nazywał się „burczu-programator”, miałem tam komentarze
WordPress-owe i było to jednak bolesne doświadczenie z &lt;strong&gt;powodu ilości spamu&lt;/strong&gt;,
który dostawałem. Niby były jakieś wtyczki, które całkiem dobrze
to filtrowały, ale jednak przy komentarzach Disqus ten problem znika zupełnie.
Drugi powód to obecna konfiguracja na jakiej oparty jest mój blog.
Stoi to na systemie Jekyll, a więc generatorze statycznych stron.
Siłą rzeczy więc nie ma tutaj back-endu, który by mógł posłużyć do obsługi
komentarzy, jestem więc zmuszony korzystać z rozwiązania zewnętrznego.
&lt;strong&gt;Ogólnie Disqus jest ok&lt;/strong&gt; - bodaj w zeszłym roku była afera dotycząca reklam
ale jak dotąd nie osiągnąłem jeszcze progu odwiedzin, który by te reklamy
aktywował. &lt;strong&gt;Poza tym Disqus dość dobrze się dopasowuje do layoutu strony&lt;/strong&gt;,
na której jest osadzony - to dla mnie też plus (konkurencyjne rozwiązanie -
komentarze od Facebooka - nie wygląda tak dobrze, a o innych nie słyszałem).
&lt;small&gt;&lt;a href=&quot;https://twitter.com/nafrontendzie&quot;&gt;Bartek Dybowski&lt;/a&gt; - &lt;a href=&quot;https://nafrontendzie.pl&quot;&gt;nafrontendzie.pl&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;blockquote class=&quot;block-poor&quot;&gt;
  &lt;p&gt;Disqus jest to produkt firmy trzeciej. Nie mam zielonego pojęcia co on robi
z danymi użytkownika. &lt;strong&gt;Nie mam żadnej gwarancji. że go nie zamkną “bo tak”.&lt;/strong&gt;
Jak mi działa blog nie mam gwarancji, że im działa system, albo że awaria
u providera nie wytnie nagle całego Disqus (potrafiła wyciąć wszystkie
zagraniczne serwery). Nie mam reklam i nikt nie będzie mi zmieniał sposobu
w jaki coś jest wyświetlane (coś darmowego nie stanie się płatne).
Mniej zależności do załadowania przez użytkownika podczas wchodzenia na
stronę.
&lt;small&gt;&lt;a href=&quot;https://twitter.com/gutek&quot;&gt;Jakub Gutkowski&lt;/a&gt; - &lt;a href=&quot;https://blog.gutek.pl&quot;&gt;blog.gutek.pl&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;blockquote class=&quot;block-good&quot;&gt;
  &lt;p&gt;Jestem bardzo zadowolony z używania Disqusa. &lt;strong&gt;Największym jego plusem jest
fakt, iż upraszcza flow dodawania komentarzy.&lt;/strong&gt; Jeśli ktoś jest w nim
zalogowany, to nie musi się przedzierać przez uzupełnianie całego formularza.
Kolejnym miłym, a zarazem użytecznym, dodatkiem jest generowanie ruchu przez
Disqusa. Jeśli zaś chodzi o kwestie ilości komentarzy, to trudno mi się
odnieść. Wpływa na to fakt, że zintegrowałem swojego bloga dość wcześnie.
Pluginu komentarzy od Facebooka nawet nie rozważałem do wprowadzenia. Nie
podoba mi się ilość danych jakie zbierają i co później z tym robią.
&lt;small&gt;&lt;a href=&quot;https://twitter.com/_bd_90&quot;&gt;Kamil Kiełbasa&lt;/a&gt; - &lt;a href=&quot;https://bd90.pl/&quot;&gt;bd90.pl&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;blockquote class=&quot;block-average&quot;&gt;
  &lt;p&gt;Dlaczego używasz Disqusa? Co Cię do niego skłoniło?&lt;br /&gt;
Używałem tego typu systemów w sumie od zawsze (wcześniej na innym blogu
Intense Debate, teraz Disqusa). Bez wątpienia jego ogromną zaletą jest to,
że jest niezależny od systemu blogowego — wszystkie komentarze przeniosły
się „same” z Ghosta na WordPress-a. A w przyszłości może jeszcze na coś
innego.&lt;br /&gt;
Czy miałeś wcześniej customową implementacją systemu komentarzy?&lt;br /&gt;
Na innym blogu, tak, przez pewien czas używałem własnej nakładki na system
komentarzy w WordPress-ie (nakładkę napisałem w jQuery, działała dobrze, jak
na rok 2008!) Potem używałem Intense Debate.&lt;br /&gt;
Czy Ci się podoba w Disqus?&lt;br /&gt;
Mogę powiedzieć co mi się nie podoba ;) Jednak dość mała elastyczność.
No i moralnie wątpliwe działania Disqusa odnośnie reklam na blogach… z tego
powodu wielu popularnych blogerów przesiadło się na alternatywy, np. Open
Source’owy wpDiscuz. Na plus jest łatwość ustawienia i bezobsługowe działanie.
&lt;small&gt;&lt;a href=&quot;https://twitter.com/MMiszy&quot;&gt;Michał Miszczyszyn&lt;/a&gt; - &lt;a href=&quot;https://typeofweb.com&quot;&gt;typeofweb.com&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;blockquote class=&quot;block-good&quot;&gt;
  &lt;p&gt;Dlaczego lubie Disqus? Podoba mi się jego łatwa integracja z WordPress-em.
Dodatkowo, Disqus jest zintegrowany z kilkoma systemami logowania, dzięki
czemu, nie muszę martwić się o tworzenie kont użytkowników na swoim blogu.
Ponadto, Disqus w obecnej postaci ułatwia też znajdowanie powiązanych
artykułów na innych blogach. Można też śledzić komentujących na swoim blogu,
co też może doprowadzić do nowych ciekawych źródeł tekstów.
to, co jednak mniej mi się podoba to wbudowane reklamy w wersji bezpłatnej.
Niestety, Disqus taki ma model biznesowy.
&lt;small&gt;&lt;a href=&quot;https://twitter.com/sunpietro&quot;&gt;Piotr Nalepa&lt;/a&gt; - &lt;a href=&quot;https://blog.piotrnalepa.pl&quot;&gt;blog.piotrnalepa.pl&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;p&gt;A Ty, co sądzisz na temat Disqusa?&lt;br /&gt;
Podziel się swoją opinią poniżej w panelu z komentarzami Disqusa.&lt;/p&gt;

&lt;p&gt;Cya! 👋&lt;/p&gt;

&lt;!-- Resources --&gt;

</description>
            <pubDate>Fri, 01 Jun 2018 07:34:04 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2018/06/01/dlaczego-warto-uzywac-disqusa-na-swoim-blogu.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2018/06/01/dlaczego-warto-uzywac-disqusa-na-swoim-blogu.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/post-banner-lifestyle-disqus-czy-warto.png</image>
        </item>
        
        <item>
            <title>Jak pokonałem Webpacka: Upgrade kilku wersji</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;npm&lt;/code&gt; postawił na bezpieczeństwo. I bardzo dobrze! Otwarty “sklep” niesie za sobą
sytuację, gdzie ktoś może wejść, wrzucić do reklamówki co chce i wyjść bez
płacenia. Jak sobie poradzić z milionami paczek jakie są w rejestrze &lt;code class=&quot;highlighter-rouge&quot;&gt;npm&lt;/code&gt;?&lt;/p&gt;

&lt;p&gt;W tak ogromnym rejestrze jakim jest &lt;code class=&quot;highlighter-rouge&quot;&gt;npm&lt;/code&gt; jest całe mnóstwo paczek, które nie
dbają o bezpieczeństwo, narażając tym samym korzystających, że ich aplikacje
będą posiadać rożne podatności na ataki.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/post-banner-webpack-upgrade-webpack-1-to-4.png&quot; itemprop=&quot;image&quot; alt=&quot;Baner promujący artykuł&quot; /&gt;
&lt;/figure&gt;

&lt;p&gt;Ten artykuł powstał z powodu otrzymania przeze mnie maila z następującą
wiadomością:&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/webpack/security-problem-of-deps.png&quot; alt=&quot;&quot; /&gt;
&lt;/figure&gt;

&lt;p&gt;Co to oznacza? Otóż to, że projekt, którego kiedyś rozwijałem, posiada
podatność z powodu korzystania z biblioteki w której taką
podatność wykryto.&lt;/p&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;blockquote class=&quot;block-good&quot;&gt;
  &lt;h3 id=&quot;-techniczne-detale&quot;&gt;&lt;i class=&quot;icon-good&quot;&gt;&lt;/i&gt; Techniczne detale&lt;/h3&gt;
  &lt;p&gt;Pracę będę prowadził w projekcie &lt;a href=&quot;https://github.com/javascript-ninjas/game-fastest-joby&quot;&gt;game-fastest-joby&lt;/a&gt;.&lt;br /&gt;
Podgląd gry można zobaczyć &lt;a href=&quot;http://javascript-ninjas.github.io/game-fastest-joby/&quot;&gt;tutaj&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;W takiej sytuacji sklonowałem projekt i zainstalowałem zależności po to aby
wykonać magiczne polecenie &lt;code class=&quot;highlighter-rouge&quot;&gt;npm-check -u&lt;/code&gt;, które zupgraduje mi zależności.&lt;/p&gt;

&lt;p&gt;Niestety, ale po instalacji zależności spotkałem się z takim komunikatem:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;~/projects/game-fastest-joby &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; npm i
added 206 packages from 228 contributors and audited 455 packages &lt;span class=&quot;k&quot;&gt;in &lt;/span&gt;7.416s
found 8 vulnerabilities &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;5 low, 1 moderate, 2 high&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
  run &lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;npm audit fix&lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt; to fix them, or &lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;npm audit&lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;for &lt;/span&gt;details
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Uruchomiłem więc:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;~/projects/game-fastest-joby &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; npm audit fix &lt;span class=&quot;nt&quot;&gt;--force&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;I się zaczęło…&lt;/p&gt;

&lt;p&gt;Wersja &lt;code class=&quot;highlighter-rouge&quot;&gt;webpacka&lt;/code&gt; została zaktualizowana:&lt;/p&gt;

&lt;div class=&quot;language-diff highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gd&quot;&gt;-    &quot;webpack&quot;: &quot;^1.3.7&quot;
&lt;/span&gt;&lt;span class=&quot;gi&quot;&gt;+    &quot;webpack&quot;: &quot;^4.10.0&quot;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Myślisz sobie, że będę musiał coś zmieniać w mojej konfiguracji?
Zobaczymy! Czas zbudować aplikację:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;~/projects/game-fastest-joby &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; npm run build
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;o-co-chodzi-z-tą-liczbą-webpacków&quot;&gt;O co chodzi z… tą liczbą &lt;code class=&quot;highlighter-rouge&quot;&gt;webpacków&lt;/code&gt;?&lt;/h2&gt;

&lt;p&gt;Po wykonaniu polecenia otrzymałem następujący komunikat:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; @ build /private~/projects/game-fastest-joby
&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; webpack &lt;span class=&quot;nt&quot;&gt;--profile&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-p&lt;/span&gt;

One CLI &lt;span class=&quot;k&quot;&gt;for &lt;/span&gt;webpack must be installed. These are recommended choices, delivered as separate packages:
 - webpack-cli &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;https://github.com/webpack/webpack-cli&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
   The original webpack full-featured CLI.
 - webpack-command &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;https://github.com/webpack-contrib/webpack-command&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;
   A lightweight, opinionated webpack CLI.
We will use &lt;span class=&quot;s2&quot;&gt;&quot;npm&quot;&lt;/span&gt; to &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;the CLI via &lt;span class=&quot;s2&quot;&gt;&quot;npm install -D&quot;&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;.&lt;/span&gt;
Which one &lt;span class=&quot;k&quot;&gt;do &lt;/span&gt;you like to &lt;span class=&quot;nb&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;webpack-cli/webpack-command&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;:
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;WTF? Co oni chcą ode mnie?&lt;/p&gt;

&lt;p&gt;Wpisałem &lt;code class=&quot;highlighter-rouge&quot;&gt;webpack-cli&lt;/code&gt; w zamian zostałem poczęstowany takim o to komunikatem:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;+ webpack-cli@2.1.4
added 399 packages from 213 contributors and audited 12499 packages &lt;span class=&quot;k&quot;&gt;in &lt;/span&gt;30.018s
found 1 moderate severity vulnerability
  run &lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;npm audit fix&lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt; to fix them, or &lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;npm audit&lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;for &lt;/span&gt;details
Invalid configuration object. Webpack has been initialised using a configuration object that does not match the API schema.
 - configuration.module has an unknown property &lt;span class=&quot;s1&quot;&gt;'loaders'&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;.&lt;/span&gt; These properties are valid:
   object &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt; exprContextCritical?, exprContextRecursive?, exprContextRegExp?, exprContextRequest?, noParse?, rules?, defaultRules?, unknownContextCritical?, unknownContextRecursive?, unknownContextRegExp?, unknownContextRequest?, unsafeCache?, wrappedContextCritical?, wrappedContextRecursive?, wrappedContextRegExp?, strictExportPresence?, strictThisContextOnImports? &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
   -&amp;gt; Options affecting the normal modules &lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;NormalModuleFactory&lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;.&lt;/span&gt;
 - configuration.resolve.extensions[2] should not be empty.
   -&amp;gt; A non-empty string
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Fajnie, czyli konfiguracja się zmieniła.&lt;br /&gt;
To teraz zmieńmy ją. Czekaj, ale na jaką?&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;Wchodzę na pierwszy &lt;a href=&quot;https://dev.to/flexdinesh/upgrade-to-webpack-4---5bc5&quot;&gt;link&lt;/a&gt; w Google, który podpowiada
jak zrobić upgrade do v4.&lt;/p&gt;

&lt;p&gt;Czytam czytam… W artykule, nie ma nic co bym nie interesowało. Widzę,
że są jakieś tryby pracy: &lt;code class=&quot;highlighter-rouge&quot;&gt;production&lt;/code&gt; / &lt;code class=&quot;highlighter-rouge&quot;&gt;development&lt;/code&gt;. No spoko, ale po co mi to?&lt;/p&gt;

&lt;p&gt;Ja chcę TYLKO zbudować aplikację aby działała oraz nie chcę aby przychodziły
mi maile z &lt;code class=&quot;highlighter-rouge&quot;&gt;security alert&lt;/code&gt;-ami. &lt;strong&gt;Boje się ich!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Zawsze po przeczytaniu artykuły zerkam na komentarze - może znajdę coś
ciekawego. W tym przypadku w komentarzach znalazłem coś co mnie ratuje:&lt;/p&gt;

&lt;figure&gt;
    &lt;a href=&quot;https://dev.to/mujaddadi/comment/3co1&quot;&gt;
        &lt;img src=&quot;/assets/images/posts/webpack/comment-change-loaders-to-rules.png&quot; alt=&quot;&quot; /&gt;
    &lt;/a&gt;
&lt;/figure&gt;

&lt;p&gt;Uruchamiam ponownie:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;~/projects/game-fastest-joby &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; npm run build

&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; @ build /Users/piecioshka/projects/game-fastest-joby
&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; webpack &lt;span class=&quot;nt&quot;&gt;-p&lt;/span&gt;

Hash: b5418d419295f52f43a8
Version: webpack 4.10.0
Time: 897ms
Built at: 2018-05-29 10:24:41
           Asset      Size  Chunks             Chunk Names
app/dist/main.js  6.54 KiB       0  &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;emitted]  main
Entrypoint main &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; app/dist/main.js
&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;0] ./app/scripts/main.js + 5 modules 11 KiB &lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;0&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;built]
    | ./app/scripts/main.js 150 bytes &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;built]
    | ./app/scripts/engine/game.js 7.77 KiB &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;built]
    | ./app/scripts/engine/loader.js 654 bytes &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;built]
    | ./app/scripts/engine/models/player.js 445 bytes &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;built]
    | ./app/scripts/engine/models/enemy.js 781 bytes &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;built]
    | ./app/scripts/engine/models/abstract-player.js 1.29 KiB &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;built]
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Heroldzie! Odtrąbić sukces&lt;/strong&gt; 🎉&lt;/p&gt;

&lt;p&gt;Zbudowałem aplikację, więc warto by ją uruchomić przetestować czy działa!&lt;/p&gt;

&lt;h2 id=&quot;o-co-chodzi-z-ścieżkami&quot;&gt;O co chodzi z… ścieżkami?&lt;/h2&gt;

&lt;p&gt;No właśnie. Nie mogę, bo plik &lt;code class=&quot;highlighter-rouge&quot;&gt;dist/bundle.js&lt;/code&gt;, zbudował się w kompletnie innym
katalogu niż chciałem.&lt;/p&gt;

&lt;p&gt;W konfiguracji &lt;code class=&quot;highlighter-rouge&quot;&gt;webpack.config.js&lt;/code&gt; miałem zapisane tak:&lt;/p&gt;

&lt;div class=&quot;language-js highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nx&quot;&gt;output&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;nl&quot;&gt;filename&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'app/dist/main.js'&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Musiałem zmienić na:&lt;/p&gt;

&lt;div class=&quot;language-js highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nx&quot;&gt;output&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;nl&quot;&gt;path&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;path&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;resolve&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'app/dist/'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;filename&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'main.js'&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Teraz struktura wygląda na taką jaka powinna być! ⭐️&lt;/p&gt;

&lt;p&gt;✅ Zbudowanie aplikacji!&lt;br /&gt;
✅ Aplikacja się uruchamia!&lt;br /&gt;
✅ Aplikacja działa ja powinna!&lt;/p&gt;

&lt;p&gt;Temat uznaję za zakończony.&lt;br /&gt;
Mogę się pochwalić, że mam już na produkcji &lt;code class=&quot;highlighter-rouge&quot;&gt;Webpacka v4.0&lt;/code&gt;.&lt;/p&gt;

&lt;h2 id=&quot;dedykacja&quot;&gt;Dedykacja&lt;/h2&gt;

&lt;p&gt;Post powstał z pomysłu &lt;a href=&quot;https://blog.piotrnalepa.pl/&quot;&gt;Piotra&lt;/a&gt;:&lt;/p&gt;

&lt;figure class=&quot;social-center-block&quot;&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;pl&quot; dir=&quot;ltr&quot;&gt;powodzenia i czekam na blog post odnośnie największych problemów przy migracji :)&lt;/p&gt;&amp;mdash; Piotr Nalepa (@sunpietro) &lt;a href=&quot;https://twitter.com/sunpietro/status/1001372033438179328?ref_src=twsrc%5Etfw&quot;&gt;May 29, 2018&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async=&quot;&quot; src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;

&lt;/figure&gt;

&lt;!-- Resources --&gt;

</description>
            <pubDate>Tue, 29 May 2018 09:23:53 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2018/05/29/jak-pokonalem-webpacka-upgrade-kilku-wersji.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2018/05/29/jak-pokonalem-webpacka-upgrade-kilku-wersji.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/post-banner-webpack-upgrade-webpack-1-to-4.png</image>
        </item>
        
        <item>
            <title>Jak założyć bloga korzystając z Hexo?</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Mam kolegę Czarka, który uczy się programowania. Spotykamy się czasami na Hangout,
aby pogadać o kodzie. Poleciłem Czarkowi, aby pisał &lt;strong&gt;daily raporty&lt;/strong&gt;
z przebiegu swojej nauki. Ważne jest, aby on sam widział po miesiącu (kiedy
przyjdą PIERWSZE chwile zwątpienia) ile już się nauczył i że nie może się
poddać!&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/post-banner-hexo-setup-blog.png&quot; itemprop=&quot;image&quot; alt=&quot;Baner promujący artykuł&quot; /&gt;
&lt;/figure&gt;

&lt;p&gt;Najlepszą formą jest tworzenie notatek i publikacja ich na łamach swojego bloga.
Łączy się wtedy dwie rzeczy:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;przyjemne - pisanie własnego bloga&lt;/li&gt;
  &lt;li&gt;pożyteczne - archiwizacja stanu nauki, np. dla potomnych / pracodawcy&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Teraz rodzi się pytanie: &lt;strong&gt;Jak szybko postawić bloga?&lt;/strong&gt;&lt;br /&gt;
Wordpress? Nie.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Wordpress to kobyła,&lt;/li&gt;
  &lt;li&gt;Wordpress wymaga bazy danych,&lt;/li&gt;
  &lt;li&gt;Wordpress to nie wersjonuje (np. za pomocą Gita) stanu artykułów,&lt;/li&gt;
  &lt;li&gt;Wordpress posiada panel administracyjny.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Alternatywa?&lt;br /&gt;
Jest ich mnóstwo: &lt;code class=&quot;highlighter-rouge&quot;&gt;Jekyll&lt;/code&gt;, &lt;code class=&quot;highlighter-rouge&quot;&gt;Gatsby&lt;/code&gt;, &lt;code class=&quot;highlighter-rouge&quot;&gt;Hugo&lt;/code&gt;, &lt;code class=&quot;highlighter-rouge&quot;&gt;Hexo&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Jekylla używam od 2-3 lat i jestem z niego bardzo zadowolony.&lt;/strong&gt;&lt;br /&gt;
Ten blog, który właśnie czytasz, jest oparty właśnie na Jekyllu.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Napisałem kiedyś bliźniaczy artykuł pt. “&lt;a href=&quot;/blog/2015/06/28/jak-zalozyc-bloga-korzystajac-z-jekyll.html&quot;&gt;Jak założyć bloga korzystając z Jekyll?&lt;/a&gt;”
o tym, jak zbudować bloga w oparciu o inny silnik - Jekyll.&lt;br /&gt;
Post pochodzi sprzed &lt;code class=&quot;highlighter-rouge&quot;&gt;3 lat&lt;/code&gt;. Zobacz jak przez ten czas rozwinąłem się
pod kątem literackim - budowanie zdań itp. Zmieniłem się w ogóle?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id=&quot;cel&quot;&gt;Cel&lt;/h2&gt;

&lt;p&gt;W tym artykule chciałbym przedstawić Ci jak szybko - praktycznie od zera -
postawić projekt z systemem blogowym (blogiem) oraz go opublikować
via &lt;code class=&quot;highlighter-rouge&quot;&gt;GitHub Pages&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Kod źródłowy powinien być dostępny pod adresem:&lt;br /&gt;
&lt;a href=&quot;https://github.com/piecioshka/hexo-blog/&quot;&gt;github.com/piecioshka/hexo-blog/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Strona powinna działać pod adresem:&lt;br /&gt;
&lt;a href=&quot;https://piecioshka.github.io/hexo-blog/&quot;&gt;piecioshka.github.io/hexo-blog/&lt;/a&gt;&lt;/p&gt;

&lt;h2 id=&quot;16-zbudowanie-projektu-w-oparciu-o-hexo&quot;&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;1/6&lt;/code&gt; Zbudowanie projektu (w oparciu o Hexo)&lt;/h2&gt;

&lt;p&gt;&lt;kbd&gt;Copy + Paste&lt;/kbd&gt;&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;npm &lt;span class=&quot;nb&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-g&lt;/span&gt; hexo-cli
hexo init hexo-blog
&lt;span class=&quot;nb&quot;&gt;cd &lt;/span&gt;hexo-blog
npm &lt;span class=&quot;nb&quot;&gt;install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Warto przerobić ten projekt na &lt;a href=&quot;/blog/2018/05/23/repozytorium-projekt-aplikacja.html&quot;&gt;repozytorium&lt;/a&gt; Git poprzez wykonanie
następujących poleceń:&lt;/p&gt;

&lt;p&gt;&lt;kbd&gt;Copy + Paste&lt;/kbd&gt;&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;git init
git add &lt;span class=&quot;nb&quot;&gt;.&lt;/span&gt;
git commit &lt;span class=&quot;nt&quot;&gt;-am&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;Initial import&quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;26-dodanie-posta&quot;&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;2/6&lt;/code&gt; Dodanie posta&lt;/h2&gt;

&lt;p&gt;Dodaj jakiś plik (albo edytuj plik &lt;code class=&quot;highlighter-rouge&quot;&gt;hello-world.md&lt;/code&gt;) w formacie Markdown
do katalogu &lt;code class=&quot;highlighter-rouge&quot;&gt;source/_posts&lt;/code&gt;.&lt;/p&gt;

&lt;blockquote class=&quot;block-average&quot;&gt;
  &lt;h3 id=&quot;-ważne&quot;&gt;&lt;i class=&quot;icon-average&quot;&gt;&lt;/i&gt; WAŻNE&lt;/h3&gt;
  &lt;p&gt;Nie zapomnij wpisać na górze nowo-stworzonego pliku preambuły:&lt;/p&gt;
  &lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;---
title: To jest tytuł mojego artykułu
---
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;  &lt;/div&gt;
&lt;/blockquote&gt;

&lt;h2 id=&quot;36-konfiguracja-projektu&quot;&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;3/6&lt;/code&gt; Konfiguracja projektu&lt;/h2&gt;

&lt;p&gt;Należy zmienić w pliku &lt;code class=&quot;highlighter-rouge&quot;&gt;_config.yml&lt;/code&gt;:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;title&lt;/code&gt;, np. &lt;code class=&quot;highlighter-rouge&quot;&gt;Blog programistyczny&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;author&lt;/code&gt;, np. &lt;code class=&quot;highlighter-rouge&quot;&gt;Piotr Kowalski&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;url&lt;/code&gt;, np. &lt;code class=&quot;highlighter-rouge&quot;&gt;https://piecioshka.github.io/&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;root&lt;/code&gt;, np. &lt;code class=&quot;highlighter-rouge&quot;&gt;/hexo-blog/&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Wypadałoby później utworzyć rewizję z tymi zmianami. Prawda?&lt;/p&gt;

&lt;p&gt;&lt;kbd&gt;Copy + Paste&lt;/kbd&gt;&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;git commit &lt;span class=&quot;nt&quot;&gt;-am&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;Setup settings&quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;46-github-konfiguracja-repozytorium&quot;&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;4/6&lt;/code&gt; GitHub: Konfiguracja repozytorium&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;Stworzenie repozytorium o nazwie np. &lt;code class=&quot;highlighter-rouge&quot;&gt;hexo-blog&lt;/code&gt; odwiedzając stronę
  &lt;a href=&quot;https://github.com/new&quot;&gt;github.com/new&lt;/a&gt;&lt;/p&gt;

    &lt;blockquote class=&quot;block-average&quot;&gt;
      &lt;h3 id=&quot;-ważne-1&quot;&gt;&lt;i class=&quot;icon-average&quot;&gt;&lt;/i&gt; Ważne!&lt;/h3&gt;
      &lt;p&gt;Nie wybieraj żadnego pliku z formatem pliku &lt;code class=&quot;highlighter-rouge&quot;&gt;.gitignore&lt;/code&gt; ani z licencją.&lt;/p&gt;
    &lt;/blockquote&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;“Wypchanie” kodu aplikacji na serwer:&lt;/p&gt;

    &lt;p&gt;&lt;kbd&gt;Copy + Paste&lt;/kbd&gt;&lt;/p&gt;

    &lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;  git remote add origin git@github.com:piecioshka/hexo-blog.git
  git push &lt;span class=&quot;nt&quot;&gt;-u&lt;/span&gt; origin main
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;56-przygotowanie-projektu-do-publikacji&quot;&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;5/6&lt;/code&gt; Przygotowanie projektu do publikacji&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;Instalacja paczki, która wrzuci katalog &lt;code class=&quot;highlighter-rouge&quot;&gt;public/&lt;/code&gt; do brancha &lt;code class=&quot;highlighter-rouge&quot;&gt;gh-pages&lt;/code&gt;:&lt;/p&gt;

    &lt;p&gt;&lt;kbd&gt;Copy + paste&lt;/kbd&gt;&lt;/p&gt;

    &lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;  npm i gh-pages &lt;span class=&quot;nt&quot;&gt;--save-dev&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Dodanie zadania do deploymentu do pliku &lt;code class=&quot;highlighter-rouge&quot;&gt;package.json&lt;/code&gt;:&lt;/p&gt;

    &lt;div class=&quot;language-json highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;w&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;scripts&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;deploy&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;gh-pages -d public/&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Stworzenie rewizji w Git (po dodaniu zadania do deploymentu):&lt;/p&gt;

    &lt;p&gt;&lt;kbd&gt;Copy + Paste&lt;/kbd&gt;&lt;/p&gt;

    &lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;  git commit &lt;span class=&quot;nt&quot;&gt;-am&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;Add deploy task&quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;66-publikacja-projektu-via-github-pages&quot;&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;6/6&lt;/code&gt; Publikacja projektu (via GitHub Pages)&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;“Wypchanie” wszystkich zmian na serwer:&lt;/p&gt;

    &lt;p&gt;&lt;kbd&gt;Copy + Paste&lt;/kbd&gt;&lt;/p&gt;

    &lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;  git push
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Zbudowanie STATYCZNEJ wersji bloga w katalogu &lt;code class=&quot;highlighter-rouge&quot;&gt;public/&lt;/code&gt;:&lt;/p&gt;

    &lt;blockquote class=&quot;block-average&quot;&gt;
      &lt;h3 id=&quot;-uwaga&quot;&gt;&lt;i class=&quot;icon-average&quot;&gt;&lt;/i&gt; Uwaga&lt;/h3&gt;
      &lt;p&gt;Aby wyeliminować wcześniejsze budowania należy uruchomić:
&lt;kbd&gt;Copy + Paste&lt;/kbd&gt;&lt;/p&gt;
      &lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;hexo clean
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;      &lt;/div&gt;
    &lt;/blockquote&gt;

    &lt;p&gt;Teraz można przejść do meritum, czyli do zbudowania statyczne struktury
  plików HTML, CSS, JavaScript wraz z obrazkami.&lt;/p&gt;

    &lt;p&gt;&lt;kbd&gt;Copy + Paste&lt;/kbd&gt;&lt;/p&gt;

    &lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;  hexo deploy
  npm run deploy
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;demo-&quot;&gt;Demo 🎉&lt;/h2&gt;

&lt;p&gt;Otwórz stronę &lt;a href=&quot;https://piecioshka.github.io/hexo-blog/&quot;&gt;piecioshka.github.io/hexo-blog/&lt;/a&gt;&lt;br /&gt;
Twoim oczom powinien ukazać się PUSTY blog wraz z listą artykułów.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;JEST TAK?&lt;/strong&gt; Napisz o tym w komentarzu.&lt;br /&gt;
&lt;strong&gt;NIE JEST TAK?&lt;/strong&gt; Napisz tym bardziej!&lt;/p&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;p&gt;&lt;mark&gt;Aktualizacja: 2018-06-03&lt;/mark&gt;&lt;/p&gt;

&lt;p&gt;W sieci znalazłem blog autora jednego z moich ulubionych tematów
do Hexo - &lt;a href=&quot;https://twitter.com/klug_jo&quot;&gt;Jonathan Klughertz&lt;/a&gt;, który w jednym swoim wpisie
pokazał inne podejście do publikacji bloga via GitHub Pages.&lt;/p&gt;

&lt;p&gt;Zapraszam do zapoznania się z artykułem pt.
&lt;a href=&quot;http://codeblocq.com/2015/12/Hexo-deploy-your-blog-to-github-pages-in-one-command/&quot;&gt;Hexo deploy your blog to github pages in one command&lt;/a&gt;.&lt;/p&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Post dedykuję Czarkowi. Powodzenia w blogowaniu!&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;PS. Zamieszczam link do bloga Cezarego: &lt;a href=&quot;https://ctworzewski.github.io/blog/&quot;&gt;ctworzewski.github.io/blog/&lt;/a&gt;&lt;/p&gt;

&lt;div id=&quot;promotion-hexo-articles&quot;&gt;
    &lt;h2&gt;Artykuły, dzięki którym stworzysz &lt;em&gt;bloga&lt;/em&gt; w 10 minut:&lt;/h2&gt;

    &lt;ul&gt;
        &lt;li&gt;
            &lt;a href=&quot;/blog/2018/05/28/jak-zalozyc-bloga-korzystajac-z-hexo.html&quot;&gt;
                &lt;img src=&quot;/assets/images/posts/post-banner-hexo-setup-blog.png&quot; alt=&quot;Jak założyć bloga korzystając z Hexo?&quot; /&gt;
            &lt;/a&gt;
        &lt;/li&gt;
        &lt;li&gt;
            &lt;a href=&quot;/blog/2018/06/04/hexo-jak-zmienic-domyslny-wyglad-bloga.html&quot;&gt;
                &lt;img src=&quot;/assets/images/posts/post-banner-hexo-change-theme.png&quot; alt=&quot;Jak zmienić domyślny wygląd bloga opartego na Hexo?&quot; /&gt;
            &lt;/a&gt;
        &lt;/li&gt;
        &lt;li&gt;
            &lt;a href=&quot;/blog/2018/06/07/hexo-integracja-z-disqus.html&quot;&gt;

                &lt;img src=&quot;/assets/images/posts/post-banner-hexo-integrate-disqus.png&quot; alt=&quot;Hexo: Integracja z Disqus&quot; /&gt;
            &lt;/a&gt;
        &lt;/li&gt;
        &lt;li&gt;
            &lt;a href=&quot;/blog/2018/06/30/hexo-integracja-google-analytics.html&quot;&gt;
                &lt;img src=&quot;/assets/images/posts/post-banner-hexo-integrate-google-analytics.png&quot; alt=&quot;Hexo: Integracja z Google Analytics&quot; /&gt;
            &lt;/a&gt;
        &lt;/li&gt;
    &lt;/ul&gt;
&lt;/div&gt;

&lt;!-- Resources --&gt;

</description>
            <pubDate>Mon, 28 May 2018 00:00:00 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2018/05/28/jak-zalozyc-bloga-korzystajac-z-hexo.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2018/05/28/jak-zalozyc-bloga-korzystajac-z-hexo.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/post-banner-hexo-setup-blog.png</image>
        </item>
        
        <item>
            <title>Repozytorium vs projekt vs aplikacja?</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Rozwiejmy nieporozumienia związane z mylnym pojęciem tytułowych terminów.&lt;/p&gt;

&lt;ul class=&quot;flos&quot;&gt;
  &lt;li&gt;
    &lt;h3 id=&quot;repozytorium&quot;&gt;Repozytorium&lt;/h3&gt;

    &lt;p&gt;Repozytorium to:&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;Wersjonowany katalog&lt;/li&gt;
      &lt;li&gt;Zwykle zawiera podkatalogi i pliki (kod źródłowy)&lt;/li&gt;
      &lt;li&gt;Jeśli używamy narzędzia Git, to w katalogu z repozytorium znajduje się
  katalog &lt;code class=&quot;highlighter-rouge&quot;&gt;.git&lt;/code&gt;, gdzie zapisana jest konfiguracja&lt;/li&gt;
      &lt;li&gt;Termin może być stosowany poza IT - możesz wersjonować dowolny katalog
  w celu śledzenia zmian, np. katalog z dokumentami firmowymi&lt;/li&gt;
      &lt;li&gt;Kto ma dostęp do repozytorium? &lt;em&gt;Zwykle programiści&lt;/em&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;h3 id=&quot;projekt&quot;&gt;Projekt&lt;/h3&gt;

    &lt;p&gt;Projekt to:&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;Katalog z plikami&lt;/li&gt;
      &lt;li&gt;Zawiera podkatalogi a jednym z nich jest katalog z &lt;a href=&quot;#aplikacja&quot;&gt;aplikacją&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;Zwykle to cały katalog z projektem jest wersjonowany, tym samym katalog
  staje się &lt;a href=&quot;#repozytorium&quot;&gt;repozytorium&lt;/a&gt;.&lt;/li&gt;
      &lt;li&gt;Kto ma dostęp do repozytorium? &lt;em&gt;Zespół projektowy&lt;/em&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;h3 id=&quot;aplikacja&quot;&gt;Aplikacja&lt;/h3&gt;

    &lt;p&gt;Aplikacja to:&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;Katalog w &lt;a href=&quot;#projekt&quot;&gt;projekcie&lt;/a&gt;, który przechowuje dowolną liczbę plików,
  potrzebnych do jej uruchomienia&lt;/li&gt;
      &lt;li&gt;Kto ma dostęp do repozytorium? &lt;em&gt;Klienci, internauci&lt;/em&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;!-- Resources --&gt;

</description>
            <pubDate>Wed, 23 May 2018 18:45:59 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2018/05/23/repozytorium-projekt-aplikacja.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2018/05/23/repozytorium-projekt-aplikacja.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/post-banner-repo-pro-app.png</image>
        </item>
        
        <item>
            <title>Jak stworzyć 3 pliki o różnych rozszerzeniach za pomocą 1 polecenia?</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Oczywiście można stworzyć pliki za pomocą swojego IDE, ale może zaistnieje
potrzeba stworzenie jakiegoś skryptu, albo może… dobra, wydaje mi się,
że nie muszę tłumaczyć więcej.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/post-banner-unix-1-command-to-create-3-files.png&quot; itemprop=&quot;image&quot; alt=&quot;Baner promujący artykuł&quot; /&gt;
&lt;/figure&gt;

&lt;p&gt;Magiczne polecenie to:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;touch &lt;/span&gt;index.&lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;html,css,js&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Polecenie przydatne kiedy w aplikacji korzystasz z idei komponentów,
a każdy komponent składa się np. z:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;*.html&lt;/code&gt; - markupu&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;*.js&lt;/code&gt; - kontrolera&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;*.css&lt;/code&gt; - definicji wyglądu&lt;/li&gt;
&lt;/ul&gt;

&lt;hr /&gt;

&lt;p&gt;Psst… polecenie nie działa na M$ Windows. Sorry.&lt;/p&gt;
</description>
            <pubDate>Mon, 21 May 2018 10:15:17 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2018/05/21/jak-stworzyc-3-pliki-o-roznych-rozszerzeniach.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2018/05/21/jak-stworzyc-3-pliki-o-roznych-rozszerzeniach.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/post-banner-unix-1-command-to-create-3-files.png</image>
        </item>
        
        <item>
            <title>Jaki mam stosunek do książek technicznych?</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Dawno nic nie pisałem. Można mieć wrażenie, że skoro &lt;a href=&quot;https://www.youtube.com/playlist?list=PLDTdlgCXlVhgzhCG_aJ2-eTJIbB2_7F8O&quot;&gt;vloguję&lt;/a&gt; to już nie mam
czasu na bloga. Nic bardziej mylnego.&lt;/p&gt;

&lt;p&gt;To znaczy… czasu mam mało. Natomiast dobra organizacja sprawia, że można
wszystko pogodzić i napisać opiniotwórczy artykuł. Zapraszam na PIERWSZY wpis tego typu!&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/post-banner-lifestyle-ksiazki-techniczne.png&quot; itemprop=&quot;image&quot; alt=&quot;Baner promujący artykuł&quot; /&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;-książki-te-złe&quot;&gt;&lt;i class=&quot;icon-poor&quot;&gt;&lt;/i&gt; Książki, te “złe”&lt;/h2&gt;

&lt;p&gt;Generalnie od czasów szkolnych nie byłem fanem książek - mało w nich było
interakcji. Czytanie mnie nudziło. Pewnie dlatego, że owe książki
to lektury, czyli książki czytane z obowiązku.&lt;/p&gt;

&lt;p&gt;Nie mogę powiedzieć, że wszystkie lektury to zło.
Zdarzały się takie, które mi się spodobały. Przykładem niech będzie powieść
“Kamienie na szaniec” autorstwa Aleksandra Kamińskiego.&lt;/p&gt;

&lt;h2 id=&quot;-książki-te-dobre&quot;&gt;&lt;i class=&quot;icon-good&quot;&gt;&lt;/i&gt; Książki, te “dobre”&lt;/h2&gt;

&lt;p&gt;Kiedy czytasz książki, które Cię interesują, to sprawa wygląda inaczej.&lt;/p&gt;

&lt;p&gt;Masz chęć je wertować! Lubię ten stan kiedy czytam. Nie chcę sobie myśli
zaprzątać jakimiś innymi rzeczami. Czytanie sprawia mi radość, bo dowiaduję
się z nich to, co mnie szczerze interesuje.&lt;/p&gt;

&lt;p&gt;Kiedy kupuję książki zw. z programowaniem i je czytam, to czuję taki spokój
ducha. Nic nie muszę nikomu udowadniać (ach te czasy
szkolne, kiedy odpowiadało się z lektury przy tablicy przed całą klasą).&lt;/p&gt;

&lt;p&gt;To prawda, że taka książka &lt;strong&gt;ma prawo się zdezaktualizować&lt;/strong&gt;.
Książka to serializacja stanu wiedzy autora z danego momentu czasu.
Wiadomo, że technologia się zmienia i świadomość autora również.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Książki raz wydrukowanej już nie zmienisz.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Mam w swoim zbiorze mnóstwo książek technicznych z zakresu programowania, sieci, baz danych, etc.
Jest z nimi jeden problem - NIE SĄ przeze mnie CZYTANE.&lt;/p&gt;

&lt;p&gt;Niestety obecnie pewnie ok 60% książek z moim prywatnym księgozbiorze
kilkudziesięciu nie została przeze mnie przeczytana. Mam nadzieję, że kiedyś
to nastąpi i będę wtedy narzekał, tak jak Ci, którzy obecnie narzekają,
że książki się przedawniają.&lt;/p&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;h2 id=&quot;film&quot;&gt;Film&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Mam coś na dokładkę!&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Zrób sobie popcorn i zajrzyj na mój kanał, gdzie opowiadam szerzej na temat
mojego doświadczenie z książkami oraz odpowiadam na pytanie, dlaczego nie
napiszę książki.&lt;/p&gt;

&lt;div class=&quot;youtube-lazy&quot; data-youtube-id=&quot;8pLuJ7ftiCs&quot;&gt;&lt;/div&gt;

&lt;p&gt;Cya! 👋&lt;/p&gt;

&lt;!-- Resources --&gt;

</description>
            <pubDate>Fri, 18 May 2018 19:28:04 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2018/05/18/jaki-mam-stosunek-do-ksiazek-technicznych.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2018/05/18/jaki-mam-stosunek-do-ksiazek-technicznych.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/post-banner-lifestyle-ksiazki-techniczne.png</image>
        </item>
        
        <item>
            <title>macOS: Pokaż ukryte pliki</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Już mam tego dość. Muszę napisać to na blogu bo inaczej nie zapamiętam tak
banalnego skrótu na pokazywanie ukrytych plików w systemie &lt;code class=&quot;highlighter-rouge&quot;&gt;macOS&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Domyślnie pliki, które zaczynają swoją nazwę od kropki, są ukryte.
Nie wiem dlaczego, ale tak już jest.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/post-banner-show-hidden-files.png&quot; itemprop=&quot;image&quot; alt=&quot;Baner promujący artykuł&quot; /&gt;
&lt;/figure&gt;

&lt;p&gt;Często muszę jednak upewnić się, że:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;w katalogu znajduje się &lt;a href=&quot;/blog/2017/02/06/globalna-konfiguracja-gita.html&quot;&gt;katalog &lt;code class=&quot;highlighter-rouge&quot;&gt;.idea&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;katalog jest repozytorium Git-owym i istnieje &lt;a href=&quot;/blog/2013/09/14/git-poczatki-w-najpopularniejszym-systemie-kontroli-wersji.html&quot;&gt;katalog &lt;code class=&quot;highlighter-rouge&quot;&gt;.git&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;katalog zawiera pliki konfiguracyjne np. &lt;code class=&quot;highlighter-rouge&quot;&gt;.bash_rc&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A najgorsze jest to, że podczas kopiowania całej zawartości katalogu,
ukryte pliki nie są kopiowane. Rozwiązaniem jest wejście na poziom wyżej
i przekopiowanie całego katalogu. Sprawa jest dla mnie również kłopotliwa
gdy chcę wyczyścić katalog.&lt;/p&gt;

&lt;p&gt;Do sedna!&lt;/p&gt;

&lt;blockquote class=&quot;block-good&quot;&gt;
  &lt;h3 id=&quot;-skrót-który-pokazuje-lub-chowa-ukryte-pliki&quot;&gt;&lt;i class=&quot;icon-good&quot;&gt;&lt;/i&gt; Skrót, który pokazuje (lub chowa) ukryte pliki&lt;/h3&gt;
  &lt;ol&gt;
    &lt;li&gt;Otwórz &lt;code class=&quot;highlighter-rouge&quot;&gt;Finder&lt;/code&gt;-a&lt;/li&gt;
    &lt;li&gt;Naciśnij jednocześnie następujące przyciski: &lt;kbd&gt;Cmd + Shift + .&lt;/kbd&gt;&lt;br /&gt;
 (&lt;code class=&quot;highlighter-rouge&quot;&gt;Command&lt;/code&gt; + &lt;code class=&quot;highlighter-rouge&quot;&gt;Shift&lt;/code&gt; + kropka)&lt;/li&gt;
  &lt;/ol&gt;
&lt;/blockquote&gt;

&lt;p&gt;Tyle wygrać 🕺&lt;/p&gt;

&lt;!-- Resources --&gt;

</description>
            <pubDate>Mon, 23 Apr 2018 11:09:42 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2018/04/23/macos-pokaz-ukryte-pliki.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2018/04/23/macos-pokaz-ukryte-pliki.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/post-banner-show-hidden-files.png</image>
        </item>
        
        <item>
            <title>Jak wykorzystać technikę "Man-in-the-middle" na własne potrzeby?</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Jak działa atak “Man in the middle”? Dlaczego jest on bardzo niebezpieczny?
Jak go wykorzystać w praktyce i rozwiązać problem bez modyfikacji aplikacji
produkcyjnej?&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/man-in-the-middle/mitm.jpg&quot; itemprop=&quot;image&quot; alt=&quot;Baner promujący artykuł&quot; /&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;problem&quot;&gt;Problem&lt;/h2&gt;

&lt;p&gt;W dniu dzisiejszym chciałem przedstawić Wam rozwiązanie do problemu, jaki mnie
ostatnio spotkał w pracy. Telewizorowa aplikacja SPA (produkcyjna) w
pewnym momencie ma problem z pobieraniem plików. Podczas uruchomienia pobiera
pliki z niepoprawnego adresu - nie ma sensu zapuszczać się w detale tego
problemu, bo to nie jest celem tego artykułu.&lt;/p&gt;

&lt;p&gt;Aby rozwiązać problem w celu debugowania chciałbym móc zaserwować kod
aplikacji z mojego komputera, a nie z produkcyjnej lokalizacji, ale jak to
mam zrobić, skoro aplikacja jest wgrana do telewizora i nie ma możliwości
jej podmiany, bez upgrade-u? Przecież nie mogę na produkcję wrzuć wersji
developerskiej!&lt;/p&gt;

&lt;h2 id=&quot;rozwiązanie&quot;&gt;Rozwiązanie&lt;/h2&gt;

&lt;p&gt;Rozwiązanie polega na wpięciu się w ruch między routerem, do którego
podłączony jest telewizor a samo urządzenie. Ze względu na fakt, że do tego
routera wpięte jest mnóstwo urządzeń, wolę delikatnie zmienić architekturę i
postawić swoje źródło dostępu do internetu (mój telefon).&lt;/p&gt;

&lt;p&gt;Dzięki temu będę mógł wpiąć się komputerem pomiędzy telewizor a telefon za
pomocą 2 portów jakie mam w komputerze:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;USB&lt;/code&gt; - do którego podłączę telefon&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;Thunderbolt-Ethernet&lt;/code&gt; (dongle) - do którego podłączę telewizor za pomocą
  kabla sieciowego&lt;/li&gt;
&lt;/ul&gt;

&lt;hr /&gt;

&lt;p&gt;W skrócie: &lt;strong&gt;Należy przechwycić ruch i móc go zmienić w locie.&lt;/strong&gt;&lt;/p&gt;

&lt;div class=&quot;youtube-lazy&quot; data-youtube-id=&quot;LyeUoDdJro4&quot;&gt;&lt;/div&gt;

&lt;h2 id=&quot;jak-działa-man-in-the-middle&quot;&gt;Jak działa &lt;code class=&quot;highlighter-rouge&quot;&gt;Man in the middle&lt;/code&gt;?&lt;/h2&gt;

&lt;p&gt;Technika &lt;abbr title=&quot;Man in the middle&quot;&gt;MITM&lt;/abbr&gt; polega na przechwyceniu
ruchu poprzez wpięcie urządzenia pomiędzy “ofiarę” (w moim przypadku telewizor),
a internet (w moim przypadku telefon).&lt;/p&gt;

&lt;p&gt;Ruch w obie strony możemy śledzić za pomocą narzędzia &lt;code class=&quot;highlighter-rouge&quot;&gt;Wireshark&lt;/code&gt;.
Niebezpieczne jest to, że response odpowiedzi może być modyfikowany.
Tym samym &lt;code class=&quot;highlighter-rouge&quot;&gt;OFIARA&lt;/code&gt; nie dostrzeże żadnej różnicy (jeśli ruch nie jest szyfrowany)
kiedy dostanie zmodyfikowaną odpowiedź.&lt;/p&gt;

&lt;blockquote class=&quot;block-average&quot;&gt;
  &lt;h3 id=&quot;-bądź-czujny&quot;&gt;&lt;i class=&quot;icon-average&quot;&gt;&lt;/i&gt; Bądź czujny!&lt;/h3&gt;
  &lt;p&gt;Nie podłączajcie się do niezabezpieczonych sieci Wi-Fi.
Istnieje potencjalne ryzyko, że ktoś może przechwytywać ruch (pakiety) i go
modyfikować, a Wy się o tym nie dowiecie.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id=&quot;konfiguracja&quot;&gt;Konfiguracja&lt;/h2&gt;

&lt;h3 id=&quot;1-telewizor-albo-inne-urządzenie-np-inny-telefon-ofiara&quot;&gt;1. Telewizor albo inne urządzenie, np. inny telefon &lt;code class=&quot;highlighter-rouge&quot;&gt;(OFIARA)&lt;/code&gt;&lt;/h3&gt;

&lt;p&gt;Podłączyć urządzenie kablem sieciowym (lub za pomocą Wi-Fi) do komputera.
Jeśli nie ma wejścia to skorzystaj z przejściówki np. &lt;code class=&quot;highlighter-rouge&quot;&gt;Thunderbolt → Ethernet&lt;/code&gt;&lt;/p&gt;

&lt;h3 id=&quot;2-telefon&quot;&gt;2. Telefon&lt;/h3&gt;

&lt;p&gt;Udostępnić internet z telefonu na jeden z trzech sposobów:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Podłączyć telefon do komputera za pomocą &lt;code class=&quot;highlighter-rouge&quot;&gt;kabla USB&lt;/code&gt;
    &lt;ul&gt;
      &lt;li&gt;Wyłącz Wi-Fi&lt;/li&gt;
      &lt;li&gt;Włącz Udostępnianie:
        &lt;ul&gt;
          &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;iPhone&lt;/code&gt;: &lt;code class=&quot;highlighter-rouge&quot;&gt;Hotspot osobisty&lt;/code&gt;&lt;/li&gt;
          &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;Android&lt;/code&gt;: &lt;code class=&quot;highlighter-rouge&quot;&gt;Przenośny hotspot Wi-Fi&lt;/code&gt;&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;albo za pomocą &lt;code class=&quot;highlighter-rouge&quot;&gt;Bluetooth&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;ostatecznie możesz spróbować za pomocą &lt;code class=&quot;highlighter-rouge&quot;&gt;Wi-Fi&lt;/code&gt;, ale ten typ połączenie nie
  jest rekomendowany przeze mnie&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote class=&quot;block-good&quot;&gt;
  &lt;h3 id=&quot;-przetestuj-stan&quot;&gt;&lt;i class=&quot;icon-good&quot;&gt;&lt;/i&gt; Przetestuj stan!&lt;/h3&gt;
  &lt;p&gt;Od teraz komputer powinien korzystać z telefonu jako źródła internetu.&lt;br /&gt;&lt;br /&gt;
Sprawdź, czy na komputerze, że możesz wejść na dowolny adres w przeglądarce.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3 id=&quot;3-komputer-atakujący&quot;&gt;3. Komputer &lt;code class=&quot;highlighter-rouge&quot;&gt;(ATAKUJĄCY)&lt;/code&gt;&lt;/h3&gt;

&lt;blockquote&gt;
  &lt;p&gt;Poniższy opis dotyczy komputera typu MacBook.&lt;br /&gt;
Na innych komputerach proces również jest możliwy, jednak oprogramowanie
trzeba inaczej skonfigurować.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
  &lt;li&gt;Jeśli &lt;mark&gt;nie używasz Wi-Fi to wyłącz je&lt;/mark&gt;, aby nie zaburzyć
  protokołu DNS.&lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Udostępnić połączenie:&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;
        &lt;p&gt;Udostępnić internet wchodząc do:&lt;/p&gt;

        &lt;ul&gt;
          &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;Preferencje systemowe&lt;/code&gt; → &lt;code class=&quot;highlighter-rouge&quot;&gt;Udostępnianie&lt;/code&gt;&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
      &lt;li&gt;
        &lt;p&gt;Przejść do sekcji &lt;code class=&quot;highlighter-rouge&quot;&gt;Udostępnianie internetu&lt;/code&gt;&lt;/p&gt;

        &lt;ul&gt;
          &lt;li&gt;W menu &lt;code class=&quot;highlighter-rouge&quot;&gt;Udostępniaj swoje połączenie&lt;/code&gt; → &lt;code class=&quot;highlighter-rouge&quot;&gt;iPhone USB&lt;/code&gt;&lt;/li&gt;
          &lt;li&gt;W menu &lt;code class=&quot;highlighter-rouge&quot;&gt;Komputerom przez&lt;/code&gt; → &lt;code class=&quot;highlighter-rouge&quot;&gt;Thunderbolt Ethernet&lt;/code&gt;&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
      &lt;li&gt;
        &lt;p&gt;Włączyć &lt;code class=&quot;highlighter-rouge&quot;&gt;Udostępnianie internetu&lt;/code&gt;&lt;/p&gt;

        &lt;figure&gt;
      &lt;img src=&quot;/assets/images/posts/man-in-the-middle/share-network-screen.png&quot; alt=&quot;&quot; /&gt;
      &lt;figcaption&gt;
          Przykład poprawnej konfiguracji udostępnienia połączenia.
      &lt;/figcaption&gt;
  &lt;/figure&gt;

        &lt;blockquote class=&quot;block-good&quot;&gt;
          &lt;h3 id=&quot;-przetestuj-stan-1&quot;&gt;&lt;i class=&quot;icon-good&quot;&gt;&lt;/i&gt; Przetestuj stan!&lt;/h3&gt;
          &lt;p&gt;Od teraz telewizor &lt;code class=&quot;highlighter-rouge&quot;&gt;OFIARA&lt;/code&gt; powinien korzystać z komputera
jako źródła internetu.&lt;br /&gt;&lt;br /&gt;
Sprawdź, czy na telewizorze, że możesz wejść na dowolny adres w
przeglądarce.&lt;/p&gt;
        &lt;/blockquote&gt;
      &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Przekierować ruch z &lt;code class=&quot;highlighter-rouge&quot;&gt;DOMENA.pl&lt;/code&gt; na komputer atakującego&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;Sprawdzenie jaki adres IP jest na interfejsie &lt;code class=&quot;highlighter-rouge&quot;&gt;Thunderbolt - Ethernet&lt;/code&gt;&lt;/li&gt;
      &lt;li&gt;
        &lt;p&gt;Wpisanie do pliku &lt;code class=&quot;highlighter-rouge&quot;&gt;/etc/hosts&lt;/code&gt; następujących rekordów&lt;/p&gt;

        &lt;div class=&quot;language-text highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;  192.168.2.1     DOMENA.pl
  192.168.2.1     www.DOMENA.pl
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;        &lt;/div&gt;

        &lt;p&gt;Aby edytować ten plik należy być administratorem.&lt;/p&gt;
      &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Przekierować ruch z &lt;code class=&quot;highlighter-rouge&quot;&gt;DOMENA.pl&lt;/code&gt; na customową usługę (wraz z portem)&lt;/p&gt;

    &lt;p&gt;Stworzyć nowy &lt;code class=&quot;highlighter-rouge&quot;&gt;vhost&lt;/code&gt; wpisując do pliku &lt;code class=&quot;highlighter-rouge&quot;&gt;/usr/local/etc/nginx/nginx.conf&lt;/code&gt;
  lub dodaje do katalogu &lt;code class=&quot;highlighter-rouge&quot;&gt;/usr/local/etc/nginx/servers/&lt;/code&gt;,
  plik np. &lt;code class=&quot;highlighter-rouge&quot;&gt;domena.pl.conf&lt;/code&gt;:&lt;/p&gt;

    &lt;div class=&quot;language-text highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;  server {
      listen 80;
      server_name DOMENA.pl www.DOMENA.pl;
      #rewrite ^/$ http://0.0.0.0:3000 redirect;

      location / {
          proxy_pass   http://0.0.0.0:3000;
      }
  }
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;

    &lt;blockquote class=&quot;block-average&quot;&gt;
      &lt;h3 id=&quot;-uwaga&quot;&gt;&lt;i class=&quot;icon-average&quot;&gt;&lt;/i&gt; Uwaga&lt;/h3&gt;
      &lt;p&gt;W pliku konfiguracyjnym dla &lt;code class=&quot;highlighter-rouge&quot;&gt;nginx&lt;/code&gt;, wcięciem jest &lt;strong&gt;tabulacja&lt;/strong&gt;.&lt;/p&gt;
    &lt;/blockquote&gt;

    &lt;p&gt;Zrestartować &lt;code class=&quot;highlighter-rouge&quot;&gt;nginx&lt;/code&gt; za pomocą polecenia&lt;/p&gt;

    &lt;p&gt;&lt;kbd&gt;Copy + Paste&lt;/kbd&gt;&lt;/p&gt;

    &lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;  &lt;span class=&quot;nb&quot;&gt;sudo &lt;/span&gt;nginx &lt;span class=&quot;nt&quot;&gt;-s&lt;/span&gt; reload
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;

    &lt;blockquote class=&quot;block-good&quot;&gt;
      &lt;h3 id=&quot;-przetestuj-stan-2&quot;&gt;&lt;i class=&quot;icon-good&quot;&gt;&lt;/i&gt; Przetestuj stan!&lt;/h3&gt;
      &lt;p&gt;Od teraz wchodząc na komputerze na adres &lt;code class=&quot;highlighter-rouge&quot;&gt;DOMENA.pl&lt;/code&gt; powinieneś stracić
możliwość wyświetlenia jej zawartości.&lt;/p&gt;
    &lt;/blockquote&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Zainstalować serwer DNS na komputerze atakującego, aby urządzenie ofiary
  rozwiązywało adres tak jak atakujący sobie tego zażyczy:&lt;/p&gt;

    &lt;p&gt;Aby zainstalować narzędzie &lt;code class=&quot;highlighter-rouge&quot;&gt;dnsmasq&lt;/code&gt; należy uruchomić polecenie:&lt;/p&gt;

    &lt;p&gt;&lt;kbd&gt;Copy + Paste&lt;/kbd&gt;&lt;/p&gt;

    &lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;  brew &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;dnsmasq
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;

    &lt;p&gt;Następnie należy uruchomić serwer z podniesionymi uprawnieniami:&lt;/p&gt;

    &lt;p&gt;&lt;kbd&gt;Copy + Paste&lt;/kbd&gt;&lt;/p&gt;

    &lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;  &lt;span class=&quot;nb&quot;&gt;sudo &lt;/span&gt;dnsmasq
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;

    &lt;p&gt;Następnie należy odświeżyć DNS-y:&lt;/p&gt;

    &lt;p&gt;&lt;kbd&gt;Copy + Paste&lt;/kbd&gt;&lt;/p&gt;

    &lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;  &lt;span class=&quot;nb&quot;&gt;sudo &lt;/span&gt;killall &lt;span class=&quot;nt&quot;&gt;-HUP&lt;/span&gt; mDNSResponder
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Stworzyć serwer w Node.js, aby mieć kontrolę nad ruchem HTTP.&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;
        &lt;p&gt;Stworzyć plik &lt;code class=&quot;highlighter-rouge&quot;&gt;server.js&lt;/code&gt; w dowolnym miejscu w systemie:&lt;/p&gt;

        &lt;div class=&quot;language-js highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;  &lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;express&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'express'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
  &lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;morgan&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'morgan'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
  &lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;app&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;express&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
  &lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;PORT&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;3000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;nx&quot;&gt;app&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;use&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;morgan&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'dev'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;));&lt;/span&gt;

  &lt;span class=&quot;nx&quot;&gt;app&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;all&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'*'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;req&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;res&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;nx&quot;&gt;res&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;json&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;({&lt;/span&gt;
          &lt;span class=&quot;na&quot;&gt;express&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;true&lt;/span&gt;
      &lt;span class=&quot;p&quot;&gt;});&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;});&lt;/span&gt;

  &lt;span class=&quot;nx&quot;&gt;app&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;listen&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;PORT&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;nx&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;`Server was started at http://0.0.0.0:&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;PORT&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;        &lt;/div&gt;
      &lt;/li&gt;
      &lt;li&gt;
        &lt;p&gt;Zainstalować zależności:&lt;/p&gt;

        &lt;p&gt;&lt;kbd&gt;Copy + Paste&lt;/kbd&gt;&lt;/p&gt;

        &lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;  npm &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;express morgan
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;        &lt;/div&gt;
      &lt;/li&gt;
      &lt;li&gt;
        &lt;p&gt;Uruchomić serwer za pomocą polecenia:&lt;/p&gt;

        &lt;p&gt;&lt;kbd&gt;Copy + Paste&lt;/kbd&gt;&lt;/p&gt;

        &lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;  node server.js
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;        &lt;/div&gt;
      &lt;/li&gt;
    &lt;/ul&gt;

    &lt;blockquote class=&quot;block-good&quot;&gt;
      &lt;h3 id=&quot;-przetestuj-stan-3&quot;&gt;&lt;i class=&quot;icon-good&quot;&gt;&lt;/i&gt; Przetestuj stan!&lt;/h3&gt;
      &lt;p&gt;Od teraz na komputerze wchodząc na adres &lt;code class=&quot;highlighter-rouge&quot;&gt;DOMENA.pl&lt;/code&gt; powinieneś otrzymać
odpowiedź &lt;code class=&quot;highlighter-rouge&quot;&gt;express: true&lt;/code&gt;.&lt;br /&gt;&lt;br /&gt;
Sprawdź stan wchodząc w przeglądarce na &lt;code class=&quot;highlighter-rouge&quot;&gt;DOMENA.pl&lt;/code&gt;&lt;/p&gt;
    &lt;/blockquote&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;-testy&quot;&gt;&lt;i class=&quot;icon-good&quot;&gt;&lt;/i&gt; Testy&lt;/h2&gt;

&lt;p&gt;Jak przetestować działanie?&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Zmienić adres &lt;code class=&quot;highlighter-rouge&quot;&gt;DOMENA.pl&lt;/code&gt; na nasz konkretny host (bez parametrów), który
 chcemy modyfikować ze swojego komputera.&lt;/li&gt;
  &lt;li&gt;Uruchomić telewizor i wejść do aplikacji.&lt;/li&gt;
  &lt;li&gt;Aplikacja uruchomiona z dowolnymi parametrami na wybranej domenie, będzie
 otrzymywać to, co zwraca serwer uruchomiony w &lt;code class=&quot;highlighter-rouge&quot;&gt;Node.js&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;troubleshooting&quot;&gt;Troubleshooting&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;i class=&quot;icon-average&quot;&gt;&lt;/i&gt; &lt;strong&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;-bash: dnsmasq: command not found&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;

    &lt;p&gt;Problem polega na tym, że powłoka nie znajduje takiego pliku w żadnym z
  katalogów zdefiniowanych w zmiennej środowiskowej &lt;code class=&quot;highlighter-rouge&quot;&gt;$PATH&lt;/code&gt;.&lt;/p&gt;

    &lt;p&gt;Aby rozwiązać problem uruchom:&lt;/p&gt;

    &lt;p&gt;&lt;kbd&gt;Copy + Paste&lt;/kbd&gt;&lt;/p&gt;

    &lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;  brew doctor
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;

    &lt;p&gt;a następnie uruchom:&lt;/p&gt;

    &lt;p&gt;&lt;kbd&gt;Copy + Paste&lt;/kbd&gt;&lt;/p&gt;

    &lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;  &lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'export PATH=&quot;/usr/local/sbin:$PATH&quot;'&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&amp;gt;&lt;/span&gt; ~/.bash_profile
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;

    &lt;p&gt;Zrestartować powłokę za pomocą polecenia:&lt;/p&gt;

    &lt;p&gt;&lt;kbd&gt;Copy + Paste&lt;/kbd&gt;&lt;/p&gt;

    &lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;  &lt;span class=&quot;nb&quot;&gt;source&lt;/span&gt; ~/.bash_profile
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;i class=&quot;icon-average&quot;&gt;&lt;/i&gt; &lt;strong&gt;Urządzenie (&lt;code class=&quot;highlighter-rouge&quot;&gt;OFIARA&lt;/code&gt;) nie potrafi rozwiązać adresu&lt;/strong&gt;&lt;/p&gt;

    &lt;p&gt;Jeśli na telewizorze występuje problem z komunikacją do nadpisywanego adresu,
  należy zrestartować &lt;code class=&quot;highlighter-rouge&quot;&gt;dnsmasq&lt;/code&gt;.&lt;/p&gt;

    &lt;p&gt;Znajdź &lt;code class=&quot;highlighter-rouge&quot;&gt;id&lt;/code&gt; procesu za pomocą polecenia:&lt;/p&gt;

    &lt;p&gt;&lt;kbd&gt;Copy + Paste&lt;/kbd&gt;&lt;/p&gt;

    &lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;  ps aux | &lt;span class=&quot;nb&quot;&gt;grep &lt;/span&gt;dnsmasq
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;

    &lt;p&gt;Zabij proces o &lt;code class=&quot;highlighter-rouge&quot;&gt;id&lt;/code&gt;, który pojawić się w poprzednim wyniku w drugiej kolumnie:&lt;/p&gt;

    &lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;  &lt;span class=&quot;nb&quot;&gt;kill&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-9&lt;/span&gt; NUMER
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;pytania&quot;&gt;Pytania?&lt;/h2&gt;

&lt;p&gt;Jeśli macie pytania odnośnie zastosowanej techniki napiszcie w komentarzu.&lt;br /&gt;
Z przyjemnością porozmawiam więcej na ten temat.&lt;/p&gt;
</description>
            <pubDate>Wed, 28 Mar 2018 12:14:14 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2018/03/28/jak-wykorzystac-technike-man-in-the-middle-na-wlasne-potrzeby.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2018/03/28/jak-wykorzystac-technike-man-in-the-middle-na-wlasne-potrzeby.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/man-in-the-middle/mitm.jpg</image>
        </item>
        
        <item>
            <title>TypeScript: Jak zacząć?</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Kojarzysz &lt;a href=&quot;https://www.typescriptlang.org/&quot;&gt;TypeScript&lt;/a&gt;? Nigdy nie używałeś? Chciałbyś spróbować?
Jeśli tak to w tym artykule przedstawię Ci szybki sposób wykorzystania.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/post-banner-typescript.png&quot; itemprop=&quot;image&quot; alt=&quot;Baner promujący artykuł&quot; /&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;po-co&quot;&gt;Po co?&lt;/h2&gt;

&lt;p&gt;No właśnie. Zawsze przed użyciem jakiegoś narzędzia warto odpowiedzieć sobie
na pytanie: &lt;code class=&quot;highlighter-rouge&quot;&gt;po co mi &amp;lt;nazwa technologii&amp;gt;&lt;/code&gt;? Jeśli już mamy argumenty “za” i
jest ich więcej niż tych “przeciw” to świetnie.&lt;/p&gt;

&lt;h3 id=&quot;jak-to-jest-z-typescriptem&quot;&gt;Jak to jest z TypeScriptem?&lt;/h3&gt;

&lt;p&gt;TypeScript mi pomaga w kilku aspektach. Może to nie jest zbyt dobre miejsce
na ten temat, ale w krótkich “żołnierskich” słowach przedstawię Wam
najważniejsze zalety &lt;code class=&quot;highlighter-rouge&quot;&gt;TypeScripta&lt;/code&gt; (IMO).&lt;/p&gt;

&lt;ul class=&quot;flos&quot;&gt;
  &lt;li&gt;
    &lt;h3 id=&quot;1-interfejsy&quot;&gt;1. Interfejsy&lt;/h3&gt;

    &lt;p&gt;W projektach w których biorę udział (i tam gdzie jest TS) każdy obiekt ma
  zdefiniowaną strukturę. Pomaga to wyeliminować błędy typu &lt;code class=&quot;highlighter-rouge&quot;&gt;undefined is not an
  object&lt;/code&gt; na poziomie kompilacji.&lt;/p&gt;

    &lt;blockquote&gt;
      &lt;p&gt;&lt;strong&gt;Kompilacja to proces, kiedy kod zamieniany jest na zrozumiały dla
programu, który go uruchomi&lt;/strong&gt; (w naszym przypadku będzie to przeglądarka).
Zachodzi on przed wykonaniem kodu przez przeglądarkę.
Przeglądarki internetowe &lt;strong&gt;interpretują kod&lt;/strong&gt;, tj. uruchamiają go linijka po
linijce. W skrajnej sytuacji błąd może nigdy nie wystąpić. W językach
“kompilowalnych” czyli w &lt;code class=&quot;highlighter-rouge&quot;&gt;TypeScript&lt;/code&gt;, kompilator w fazie “tłumaczenia”
krzyknie kiedy nie zrozumie jakiegoś kawałka kodu.&lt;/p&gt;
    &lt;/blockquote&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;h3 id=&quot;2-typy-wartości&quot;&gt;2. Typy wartości&lt;/h3&gt;

    &lt;p&gt;Era sprawdzania typu minęła. Dokładnie wiem z jakim typem wartości
  zmiennej mam do czynienia. Nie sprawdzam, czy jest &lt;code class=&quot;highlighter-rouge&quot;&gt;stringiem&lt;/code&gt;, czy
  &lt;code class=&quot;highlighter-rouge&quot;&gt;numberem&lt;/code&gt;. Po prostu ustalam podczas definicji jeden typ i do końca
  życia aplikacji będę miał ten typ zapewniony.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;h2 id=&quot;jak-napisać-prosty-projekt-w-typescript&quot;&gt;Jak napisać prosty projekt w &lt;code class=&quot;highlighter-rouge&quot;&gt;TypeScript&lt;/code&gt;?&lt;/h2&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Zmiana rozszerzenia głównego pliku&lt;/strong&gt;&lt;/p&gt;

    &lt;p&gt;Należy zaktualizować rozszerzenie głównego pliku &lt;code class=&quot;highlighter-rouge&quot;&gt;*.js&lt;/code&gt; na &lt;code class=&quot;highlighter-rouge&quot;&gt;*.ts&lt;/code&gt;.&lt;br /&gt;
 Zmiany dokonujemy w systemie plików.&lt;/p&gt;

    &lt;p&gt;Oczywiście trzeba jeszcze zmienić ścieżkę do tego pliku w &lt;code class=&quot;highlighter-rouge&quot;&gt;index.html&lt;/code&gt;.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Napisz kod w TypeScript&lt;/strong&gt;&lt;/p&gt;

    &lt;p&gt;Przykładowy kod wzięty z &lt;a href=&quot;https://github.com/piecioshka/test-typescript-parcel&quot;&gt;przykładowego projektu&lt;/a&gt;:&lt;/p&gt;

    &lt;div class=&quot;language-typescript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt; &lt;span class=&quot;c1&quot;&gt;// main.ts&lt;/span&gt;
 &lt;span class=&quot;k&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Lib&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'./lib'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
 &lt;span class=&quot;k&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;pure&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'./pure'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

 &lt;span class=&quot;nx&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;':: main ::'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
 &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Lib&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
 &lt;span class=&quot;nx&quot;&gt;pure&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Uruchomienie projektu&lt;/strong&gt; (w trybie &lt;code class=&quot;highlighter-rouge&quot;&gt;developerskim&lt;/code&gt;)&lt;/p&gt;

    &lt;p&gt;Jako narzędzie do uruchamiania projektu wykorzystamy &lt;a href=&quot;https://parceljs.org/&quot;&gt;parcel&lt;/a&gt;.
 Zainstalujmy go na początku.&lt;/p&gt;

    &lt;p&gt;&lt;kbd&gt;Copy + paste&lt;/kbd&gt;&lt;/p&gt;

    &lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt; npm &lt;span class=&quot;nb&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-g&lt;/span&gt; parcel-bundler
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;

    &lt;p&gt;Polecenie wykonujemy w katalogu projektu:&lt;/p&gt;

    &lt;p&gt;&lt;kbd&gt;Copy + paste&lt;/kbd&gt;&lt;/p&gt;

    &lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt; parcel index.html
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Od teraz aplikacja jest dostępna pod adresem &lt;a href=&quot;http://localhost:1234&quot;&gt;localhost:1234&lt;/a&gt;&lt;/strong&gt; 🚀&lt;/p&gt;

&lt;p&gt;Psst… Na &lt;a href=&quot;https://github.com/piecioshka/test-typescript-parcel&quot;&gt;moim GitHubie&lt;/a&gt; znajdziesz kod omawianej aplikacji.&lt;/p&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;h2 id=&quot;doświadczenie-z-typescriptem&quot;&gt;Doświadczenie z TypeScriptem&lt;/h2&gt;

&lt;p&gt;Na swoim &lt;a href=&quot;https://github.com/piecioshka?tab=repositories&amp;amp;q=typescript&quot;&gt;publicznym GitHubie&lt;/a&gt; mam kilka projektów w &lt;code class=&quot;highlighter-rouge&quot;&gt;TypeScript&lt;/code&gt;.
Opowiem Ci o dwóch testowych:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://github.com/piecioshka/test-jasmine-typescript&quot;&gt;test-jasmine-typescript&lt;/a&gt;&lt;/p&gt;

    &lt;p&gt;Projekt powstał aby dokonać konfiguracji projektu, gdzie wykorzystywana
  jest biblioteka &lt;code class=&quot;highlighter-rouge&quot;&gt;Jasmine&lt;/code&gt;, a testy jednostkowe pisane są w &lt;code class=&quot;highlighter-rouge&quot;&gt;TypeScript&lt;/code&gt;.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://github.com/piecioshka/test-typescript-webpack&quot;&gt;test-typescript-webpack&lt;/a&gt;&lt;/p&gt;

    &lt;p&gt;Super prosta konfiguracja &lt;code class=&quot;highlighter-rouge&quot;&gt;TypeScript&lt;/code&gt; + &lt;code class=&quot;highlighter-rouge&quot;&gt;Webpack&lt;/code&gt;.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Mam też kilka &lt;strong&gt;projektów prywatnych&lt;/strong&gt; o których nie za bardzo mogę opowiadać.
Mogę delikatnie uchylić “rąbka tajemnicy”, że od jakiegoś czasu pracujemy
z zespołem nad nowym projektem, który oparty jest na Angularze 5 - tym samym
używamy &lt;code class=&quot;highlighter-rouge&quot;&gt;TypeScripta&lt;/code&gt; i jest ❤️&lt;/p&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;blockquote class=&quot;block-average&quot;&gt;
  &lt;h3 id=&quot;-prośba&quot;&gt;&lt;i class=&quot;icon-average&quot;&gt;&lt;/i&gt; Prośba&lt;/h3&gt;
  &lt;p&gt;Drogi czytelniku, mam do Ciebie pytanie:&lt;br /&gt;
&lt;strong&gt;Odpowiedz mi proszę w komentarzu, dlaczego Ty używasz TypeScripta?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Z pozdrowieniami dla Aleksandra.&lt;/p&gt;

&lt;!-- Resources --&gt;

</description>
            <pubDate>Wed, 31 Jan 2018 07:20:00 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2018/01/31/typescript-jak-zaczac.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2018/01/31/typescript-jak-zaczac.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/post-banner-typescript.png</image>
        </item>
        
        <item>
            <title>Narzędzia Świata: npm-check</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Dziś chciałbym przedstawić Ci narzędzie, które często wykorzystuję.&lt;/p&gt;

&lt;p&gt;Wyobraź sobie projekt, nad którym pracujesz i dbasz o niego.
Zależy Ci na zawsze aktualnych zależnościach, bo z nową wersją spodziewasz
się, że:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;będą działały &lt;strong&gt;szybciej&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;będą &lt;strong&gt;bezpieczniejsze&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;będą bardziej &lt;strong&gt;elastyczne&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;będą zajmowały &lt;strong&gt;mniej przestrzeni dyskowej&lt;/strong&gt;?&lt;/li&gt;
&lt;/ul&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/post-banner-narzedzia-swiata-npm-check.png&quot; itemprop=&quot;image&quot; alt=&quot;Baner promujący artykuł&quot; /&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;interaktywna-aktualizacja-&quot;&gt;Interaktywna aktualizacja 📦&lt;/h2&gt;

&lt;p&gt;Narzędzie o którym dzisiaj mowa nazywa się &lt;a href=&quot;https://www.npmjs.com/package/npm-check&quot;&gt;npm-check&lt;/a&gt;.&lt;/p&gt;

&lt;blockquote class=&quot;block-good&quot;&gt;
  &lt;h3 id=&quot;-porada&quot;&gt;&lt;i class=&quot;icon-good&quot;&gt;&lt;/i&gt; Porada&lt;/h3&gt;
  &lt;p&gt;Proponuję instalację globalną, gdyż tego narzędzia będziesz używać w każdym
swoim projekcie, no i nie ma sensu trzymać różnych wersji.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Tak więc, na początku wykonaj to polecenie:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;npm &lt;span class=&quot;nb&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-g&lt;/span&gt; npm-check
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;A potem w katalogu projektu, którego chcesz zaktualizować zależności:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;npm-check &lt;span class=&quot;nt&quot;&gt;-u&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;demo-&quot;&gt;Demo 🎉&lt;/h2&gt;

&lt;p&gt;Myślę, że najlepszym opisem projektu będzie poniższa prezentacja działania,
na jednym z moim starych projektów:&lt;/p&gt;

&lt;div class=&quot;youtube-lazy&quot; data-youtube-id=&quot;ySL5WQ5y2do&quot;&gt;&lt;/div&gt;

&lt;!-- Resources --&gt;

</description>
            <pubDate>Tue, 30 Jan 2018 08:25:00 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2018/01/30/narzedzia-swiata-npm-check.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2018/01/30/narzedzia-swiata-npm-check.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/post-banner-narzedzia-swiata-npm-check.png</image>
        </item>
        
        <item>
            <title>Jak napisać 'Ź' w WebStorm na macOS?</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Skróty skróty, kto ich nie lubi? Skróty są świetne, do momentu kiedy nie
przysparzają problemów. Heh. Uwielbiam truizmy.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/post-banner-webstorm-task-management.png&quot; itemprop=&quot;image&quot; alt=&quot;Baner promujący artykuł&quot; /&gt;
&lt;/figure&gt;

&lt;blockquote&gt;
  &lt;h3 id=&quot;zadanie&quot;&gt;Zadanie&lt;/h3&gt;
  &lt;p&gt;Drogi czytelniku, mam zadanie dla Ciebie.&lt;br /&gt;
Otwórz WebStorma i w dowolnym pliku napisz dużą literkę &lt;strong&gt;Ź&lt;/strong&gt; [zi].&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;i class=&quot;icon-good&quot;&gt;&lt;/i&gt; Jeśli Ci się udało kliknij w serduszko pod artykułem.&lt;/p&gt;

&lt;p&gt;&lt;i class=&quot;icon-poor&quot;&gt;&lt;/i&gt; Jeśli nie to napisz komentarz z opisem co się stało 😄&lt;/p&gt;

&lt;h2 id=&quot;jak-napisać-ź-w-moim-ulubionym-edytorze&quot;&gt;Jak napisać “Ź” w moim ulubionym edytorze?&lt;/h2&gt;

&lt;p&gt;Zdecydowanie większa część z Was na pewno nie mogła poradzić sobie z zadaniem.&lt;/p&gt;

&lt;p&gt;“Ktoś” wykorzystał kombinację przycisków do zamknięcia okien w edytorze.&lt;/p&gt;

&lt;p&gt;Zapytacie, po co ktoś miałby podpinać skrót pod normalną literę alfabetu?&lt;br /&gt;
No tak, ale czyjego alfabetu?&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/webstorm/webstorm-task-management.png&quot; alt=&quot;WebStorm Keymap Task Management&quot; /&gt;
     &lt;figcaption&gt;
        Skrót &lt;kbd&gt;OPTION + SHIFT + X&lt;/kbd&gt; jest wykorzystany w pluginie
        &lt;code&gt;Task Management&lt;/code&gt;&lt;br /&gt; do czyszczenia kontekstu (Clear
        Context).
     &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Developerzy edytora &lt;u&gt;nie wiedzą&lt;/u&gt;, że w polskim alfabecie istnieje
tak “skomplikowana” litera jak “Ź”, stąd też wykorzystują ją do swoich
&lt;u&gt;niecnych celów&lt;/u&gt;.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Plugin &lt;code class=&quot;highlighter-rouge&quot;&gt;Task Management&lt;/code&gt; jest domyślnie zainstalowany w WebStormie na każdym
systemie, jednak tylko na &lt;strong&gt;macOS&lt;/strong&gt; przysparza problemów.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Aby wyłączyć domyślne zachowanie edytora wykonaj:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Wejdź do sekcji &lt;code class=&quot;highlighter-rouge&quot;&gt;WebStorm&lt;/code&gt; → &lt;code class=&quot;highlighter-rouge&quot;&gt;Settings&lt;/code&gt; → &lt;code class=&quot;highlighter-rouge&quot;&gt;Plug-ins&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;Wyłącz “checkbox” obok pluginu &lt;code class=&quot;highlighter-rouge&quot;&gt;Task Management&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Po restarcie WebStorma będziesz mógł wpisać opisywany znak&lt;/strong&gt;.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;Więcej informacji na &lt;a href=&quot;https://www.jetbrains.com/help/webstorm/managing-tasks-and-contexts.html&quot;&gt;jetbrains.com&lt;/a&gt;.&lt;/p&gt;

&lt;!-- Resources --&gt;

</description>
            <pubDate>Fri, 26 Jan 2018 08:00:38 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2018/01/26/jak-napisac-z-w-webstorm-na-macos.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2018/01/26/jak-napisac-z-w-webstorm-na-macos.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/post-banner-webstorm-task-management.png</image>
        </item>
        
        <item>
            <title>Jak usunąć zapytanie HTTP OPTIONS?</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Ahoy! Od jakiegoś czasu artykuły pojawiają się rzadziej. Znalazłem tego
przyczynę!&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Pisząc artykuł zawsze staram się opisać wszystko co wiem na dany temat.
Tym samym czas jaki muszę wygospodarować na taki artykuł wykracza poza moje
możliwości. Szkoda.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Rozwiązanie jest proste. Będę publikował częściej, ale kosztem długości
artykułu. Po prostu &lt;strong&gt;wpisy będą krótkie&lt;/strong&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Jestem ciekaw, czy ta forma przypadnie Wam do gustu.&lt;/em&gt;&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/post-banner-remove-http-options.png&quot; itemprop=&quot;image&quot; alt=&quot;Baner promujący artykuł&quot; /&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;-problem&quot;&gt;&lt;i class=&quot;icon-poor&quot;&gt;&lt;/i&gt; Problem&lt;/h2&gt;

&lt;p&gt;Piszę aplikację, która będzie hostowana na adresie &lt;a href=&quot;http://foo.com&quot;&gt;foo.com&lt;/a&gt;.
Aplikacja komunikuje się z backend-em, który jest dostępny pod adresem
&lt;a href=&quot;http://bar.com&quot;&gt;bar.com&lt;/a&gt;.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Kto nie wie, co to jest CORS, to zapraszam &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#Simple_requests&quot;&gt;tutaj&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Podczas komunikacji z backend-em za pomocą zapytania &lt;code class=&quot;highlighter-rouge&quot;&gt;HTTP&lt;/code&gt; typu &lt;code class=&quot;highlighter-rouge&quot;&gt;GET&lt;/code&gt;
albo &lt;code class=&quot;highlighter-rouge&quot;&gt;POST&lt;/code&gt;, przed faktycznym zapytaniem, wysyłany jest automatycznie
(inicjowany przez przeglądarkę) request typu &lt;code class=&quot;highlighter-rouge&quot;&gt;OPTIONS&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Chciałbym go wyeliminować, aby w &lt;code class=&quot;highlighter-rouge&quot;&gt;DevTools → Network&lt;/code&gt; nie widzieć
zdublowanych rekordów.&lt;/p&gt;

&lt;p&gt;Jak to osiągnąć?&lt;/p&gt;

&lt;h2 id=&quot;-rozwiązanie&quot;&gt;&lt;i class=&quot;icon-good&quot;&gt;&lt;/i&gt; Rozwiązanie&lt;/h2&gt;

&lt;p&gt;Jeśli w zapytaniu znajdują się nagłówki, które przeglądarka nie rozumie (np.
są to customowe nagłówki, które rozumie tylko serwer &lt;a href=&quot;http://bar.com&quot;&gt;bar.com&lt;/a&gt;), to takie
zapytanie zostaje uznane za zapytanie z &lt;abbr title=&quot;side effects&quot;&gt;efektami
ubocznymi&lt;/abbr&gt; i musi zostać SPRAWDZONE czy serwer poradzi sobie z jego obsługą.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Zapytanie &lt;code class=&quot;highlighter-rouge&quot;&gt;HTTP OPTIONS&lt;/code&gt; jest po to, aby przeglądarka zweryfikowała serwer.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Aby wyeliminować zapytanie &lt;code class=&quot;highlighter-rouge&quot;&gt;HTTP OPTIONS&lt;/code&gt; należy spełnić następujące warunki:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Nie używać customowych nagłówków, np. &lt;code class=&quot;highlighter-rouge&quot;&gt;X-USERNAME: root&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;Ustawić nagłówek &lt;code class=&quot;highlighter-rouge&quot;&gt;Content-Type&lt;/code&gt; na jeden z następujących:
    &lt;ul&gt;
      &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;multipart/form-data&lt;/code&gt;&lt;/li&gt;
      &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;application/x-www-form-urlencoded&lt;/code&gt;&lt;/li&gt;
      &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;text/plain&lt;/code&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;W moim przypadku pomogło ustawienie&lt;/strong&gt; &lt;code class=&quot;highlighter-rouge&quot;&gt;Content-Type: text/plain&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Przeglądarka domyślnie ustawiała nagłówek &lt;code class=&quot;highlighter-rouge&quot;&gt;Content-Type: application/json&lt;/code&gt;.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;Więcej informacji na &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#Simple_requests&quot;&gt;MDN&lt;/a&gt;.&lt;/p&gt;

&lt;!-- Resources --&gt;

</description>
            <pubDate>Thu, 25 Jan 2018 10:20:37 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2018/01/25/jak-pozbyc-sie-zapytania-http-options.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2018/01/25/jak-pozbyc-sie-zapytania-http-options.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/post-banner-remove-http-options.png</image>
        </item>
        
        <item>
            <title>Hackathon: Node Knockout #7 (2017)</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Nie ma to jak zacząć rok od postu, który miał się ukazać w zeszłym roku!
Przepraszam za to, jednak coś czuję, że mało kto będzie miał mi za złe,
bo najważniejsze jest to, że w końcu jest kolejny wpis!&lt;/p&gt;

&lt;p&gt;W listopadzie zeszłego roku brałem udział w hackathonie. Jak możecie się
domyśleć, nazwa tego wydarzenia to &lt;strong&gt;“Node Knockout 2017”&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Jak dobrze wicie nie jest to mój pierwszy hackathon w życiu. Poniżej lista
artykułów jakie napisałem na temat poprzednich wydarzeń tego typu:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;/blog/2015/01/28/hackathon-staticshowdown-2.html&quot;&gt;Static Showdown #2 (2015)&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;/blog/2015/11/09/hackathon-node-knockout-2015.html&quot;&gt;Node Knockout #5 (2015)&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;/blog/2016/11/15/hackathon-node-knockout-2016.html&quot;&gt;Node Knockout #5 (2016)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/nko-2017/nko-2017.png&quot; alt=&quot;Dumplings Team: Podsumowanie&quot; /&gt;
    &lt;figcaption&gt;
        Podsumowanie &lt;a href=&quot;http://dumplings.2017.nodeknockout.com/&quot;&gt;mojego projektu&lt;/a&gt;.
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;pomysł&quot;&gt;Pomysł&lt;/h2&gt;

&lt;p&gt;Tym razem nie była to gra… Już mam dość pisania gier. W sumie ostatnie
hackathony kojarzyły mi się już tylko z tworzeniem gier. A ja przecież &lt;strong&gt;nie
lubię grać w gry!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Tym razem chciałem zrobić coś co mi się przyda. Wpadłem na pomysł, aby
stworzyć aplikację, która rozwiąże wiele problemów w społeczności
&lt;a href=&quot;https://warsawjs.com&quot;&gt;WarsawJS&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Moim pomysłem była aplikacja do wypełniania (oraz ewentualnie tworzenia) quizów.
Dzięki temu mógłbym udostępnić quiz na meetupie albo workshopie i wybrać
osobę, która otrzyma od sponsorów / partnerów jakiś podarunek, np. bilet na
konferencję. Zawsze mamy z tym problem aby kogoś obdarować, no bo jakimi
kryteriami mamy się kierować w wyborze takiej osoby, aby było sprawiedliwie?&lt;/p&gt;

&lt;p&gt;No właśnie.&lt;/p&gt;

&lt;h2 id=&quot;aplikacja-milva-&quot;&gt;Aplikacja “Milva” 🚀&lt;/h2&gt;

&lt;p&gt;Dzięki Kasi (mojej &lt;abbr title=&quot;Towrzyszce Życia&quot;&gt;TŻ&lt;/abbr&gt;-tce) miałem nazwę
do aplikacji. “Milva” tak nazwałem projekt. Prawdopodobnie to jakaś postać z
Wiedźmina, ale nie mogę potwierdzić, że tak faktycznie jest ponieważ ani nie
czytałem książki, ani nie grałem w tą grę.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/nko-2017/banner-600x200.jpg&quot; alt=&quot;Milva&quot; /&gt;
&lt;/figure&gt;

&lt;p&gt;Na hacakthony zawsze (prawie zawsze) wybieram stack technologiczny, którego
jeszcze nie znam, aby nauczyć się nowych bibliotek / frameworków / wzorców.
Tym razem postanowiłem wybrać &lt;code class=&quot;highlighter-rouge&quot;&gt;Vue.js&lt;/code&gt; jako bibliotekę / framework do
tworzenia aplikacji. Oczywiści samo Vue.js nie wystarczyło, musiałem
również wykorzystać &lt;code class=&quot;highlighter-rouge&quot;&gt;Vuex&lt;/code&gt; oraz &lt;code class=&quot;highlighter-rouge&quot;&gt;vue-router&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Nie ma sensu opisywać aplikacji. Najlepiej będzie zobaczyć co udało mi się
zrobić w te 48 godzin (&lt;strong&gt;efektywnie 35 godzin&lt;/strong&gt; - musiałem trochę pospać).&lt;/p&gt;

&lt;p&gt;Link do aplikacji: &lt;a href=&quot;https://milva.herokuapp.com&quot;&gt;milva.herokuapp.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Btw. jeśli interesuje Cię opis projektu (po angielsku) jaki przygotowałem, aby
oddać aplikację do oceny to zajrzyj tutaj:
&lt;a href=&quot;http://dumplings.2017.nodeknockout.com&quot;&gt;dumplings.2017.nodeknockout.com&lt;/a&gt;&lt;/p&gt;

&lt;h2 id=&quot;hackathon-wnioski&quot;&gt;&lt;mark&gt;Hackathon&lt;/mark&gt; Wnioski&lt;/h2&gt;

&lt;p&gt;Chciałbym przedstawić Ci jakie wyciągnąłem wnioski z mojego
przygotowania do tego wydarzenia oraz co mocno pokrzyżowało moje plany
szybkiego zakończenia projektu.&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Wymyślenie celu projektu przed wydarzeniem&lt;/strong&gt;&lt;/p&gt;

    &lt;p&gt;Poświęciłem 2 pierwsze godziny aby wymyślić projekt. Zamiast pisać kod,
 to ja biłem się z myślami co by tutaj stworzyć.&lt;/p&gt;

    &lt;blockquote class=&quot;block-good&quot;&gt;
      &lt;h3 id=&quot;-porada-nr-1&quot;&gt;&lt;i class=&quot;icon-good&quot;&gt;&lt;/i&gt; Porada nr 1&lt;/h3&gt;
      &lt;p&gt;Poświęć dowolną ilość czasu na wymyślenie projektu &lt;strong&gt;przed wydarzeniem&lt;/strong&gt;.&lt;/p&gt;
    &lt;/blockquote&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Wybór technologii przed wydarzeniem&lt;/strong&gt;&lt;/p&gt;

    &lt;p&gt;Podobnie co wyżej. Nie wiedziałem jeszcze co wykorzystam do zrobienia tej
 aplikacji. Miałem wiele dróg, ale wybrałem Vue.js m.in. z tego
 powodu, że tydzień później byłem trenerem podczas warsztatów z tej
 technologii w ramach &lt;a href=&quot;https://web.facebook.com/events/1517425838348863&quot;&gt;WarsawJS Workshop&lt;/a&gt;.&lt;/p&gt;

    &lt;blockquote class=&quot;block-good&quot;&gt;
      &lt;h3 id=&quot;-porada-nr-2&quot;&gt;&lt;i class=&quot;icon-good&quot;&gt;&lt;/i&gt; Porada nr 2&lt;/h3&gt;
      &lt;p&gt;Taka sama jak wyżej. Przed wydarzeniem należy wybrać technologię.&lt;/p&gt;
    &lt;/blockquote&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Przetestowanie deploymentu wybranej technologii przed wydarzeniem&lt;/strong&gt;&lt;/p&gt;

    &lt;p&gt;Tutaj był jakiś dramat. Niby wszystko proste i &lt;a href=&quot;https://dashboard.heroku.com&quot;&gt;Heroku&lt;/a&gt; to najlepsze
 miejsce na deployment, ale nie szło. I to dość mocno. 4 godziny spędziłem
 na ogarnięcie tematu w jaki sposób mogę opublikować aplikację!&lt;/p&gt;

    &lt;p&gt;&lt;strong&gt;Wszystko sprowadziło się do tego, że aż musiałem spisać te swoje wyczyny,
 aby inni nie popełniali tych samych błędów co ja. I tak powstał o to
 artykuł pt. &lt;a href=&quot;2017-11-18-vue-js-na-heroku&quot;&gt;Vue.js na Heroku&lt;/a&gt;.&lt;/strong&gt;&lt;/p&gt;

    &lt;blockquote class=&quot;block-good&quot;&gt;
      &lt;h3 id=&quot;-porada-nr-3&quot;&gt;&lt;i class=&quot;icon-good&quot;&gt;&lt;/i&gt; Porada nr 3&lt;/h3&gt;
      &lt;p&gt;I to również trzeba było sprawdzić wcześniej!&lt;/p&gt;
    &lt;/blockquote&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Dużo czasu poświęciłem na layout&lt;/strong&gt;&lt;/p&gt;

    &lt;p&gt;Jestem estetą. Uwielbiam czysty i jasny layout. I kiedy tworzę go SAM, to
 w mojej głowie tworzy się ponad tysiąc myśli na temat “jak taki layout
 powinien wyglądać”. A czas leci…&lt;/p&gt;

    &lt;blockquote class=&quot;block-good&quot;&gt;
      &lt;h3 id=&quot;-porada-nr-4&quot;&gt;&lt;i class=&quot;icon-good&quot;&gt;&lt;/i&gt; Porada nr 4&lt;/h3&gt;
      &lt;p&gt;Stworzyć prosty layout i nie skupiać się przesadnie wyglądzie, kiedy
tworzy się aplikację. To przy grach można skupić się bardziej na designie.&lt;/p&gt;
    &lt;/blockquote&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Ostatnie dwie godziny na Socket.io&lt;/strong&gt;&lt;/p&gt;

    &lt;p&gt;Wpadłem na pomysł, aby dodać do projektu Socket.io. Nic w tym
 nadzwyczajnego. Zawsze na hackathonie je dodaję, aby projekt była bardziej
 interaktywny (multiplayer zawsze na propsie!).&lt;/p&gt;

    &lt;p&gt;Niestety na ten pomysł wpadłem 2 godziny przed końcem wydarzenia!
 Chciałbym tylko przypomnieć, że kilka godzin wcześniej spędziłem picując
 layout.&lt;/p&gt;

    &lt;p&gt;Nie ma co ukrywać, że &lt;strong&gt;tworzenie aplikacji klient-serwer jest bardziej
 złożone, niż CSS&lt;/strong&gt;.&lt;/p&gt;

    &lt;blockquote class=&quot;block-good&quot;&gt;
      &lt;h3 id=&quot;-porada-nr-5&quot;&gt;&lt;i class=&quot;icon-good&quot;&gt;&lt;/i&gt; Porada nr 5&lt;/h3&gt;
      &lt;p&gt;Nie tracić tyle czasu na inne pierdółki i zająć się bardziej
wymagającymi zadaniami!&lt;/p&gt;
    &lt;/blockquote&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Deploy Socket.io na Heroku&lt;/strong&gt;&lt;/p&gt;

    &lt;p&gt;Poległem. Nie potrafię uruchomić serwera z WebSocketami na tym środowisku.
 Przeczytałem jakieś tam artykuły opisujące jak to niby zrobić ale jednak
 “nie pykło”.&lt;/p&gt;

    &lt;blockquote class=&quot;block-average&quot;&gt;
      &lt;h3 id=&quot;-zadanie-do-zrobienia&quot;&gt;&lt;i class=&quot;icon-average&quot;&gt;&lt;/i&gt; Zadanie do zrobienia!&lt;/h3&gt;
      &lt;p&gt;Wymyślić / dowiedzieć się / shakować rozwiązanie jak uruchomić serwer
WebSocketowy na Heroku. Gdy już to zrobię napiszę o tym artykuł.
&lt;strong&gt;Jestem przekonany, że przyda się taki wpis dla społeczności.&lt;/strong&gt;&lt;/p&gt;
    &lt;/blockquote&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Wykorzystanie &lt;a href=&quot;https://bulma.io/&quot;&gt;Bulmy&lt;/a&gt; przyspieszyło development&lt;/strong&gt;&lt;/p&gt;

    &lt;p&gt;O tak! Wreszcie jakiś pozytyw! Nie ma sensu pisać wszystkiego od nowa.
 Po to są frameworki CSS, dzięki którym budowanie layoutu w oparciu o
 siatkę jest bardzo przyjemne!&lt;/p&gt;

    &lt;blockquote class=&quot;block-good&quot;&gt;
      &lt;h3 id=&quot;-porada-nr-6&quot;&gt;&lt;i class=&quot;icon-good&quot;&gt;&lt;/i&gt; Porada nr 6&lt;/h3&gt;
      &lt;p&gt;Polecam Bulmę jako framework CSS. Dobre nazewnictwo klas i świetne
możliwości w budowaniu kontrolek.&lt;/p&gt;
    &lt;/blockquote&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Wykorzystanie paczki &lt;code class=&quot;highlighter-rouge&quot;&gt;debug&lt;/code&gt; pomagało mi odnajdywanie się w logach&lt;/strong&gt;&lt;/p&gt;

    &lt;p&gt;Podczas hackathonu wykorzystałem jedną z moich ulubionych paczek.
 Jest nią paczka &lt;a href=&quot;https://www.npmjs.com/package/debug&quot;&gt;debug&lt;/a&gt;, która ulepsza prymitywnego &lt;code class=&quot;highlighter-rouge&quot;&gt;console.log&lt;/code&gt;-a.&lt;/p&gt;

    &lt;blockquote class=&quot;block-good&quot;&gt;
      &lt;h3 id=&quot;-porada-nr-7&quot;&gt;&lt;i class=&quot;icon-good&quot;&gt;&lt;/i&gt; Porada nr 7&lt;/h3&gt;
      &lt;p&gt;Kto jeszcze nie korzystał z tej biblioteki, to szczerze polecam.
W każdym produkcyjnym projekcie wykorzystuję tą paczkę!&lt;/p&gt;
    &lt;/blockquote&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;is-my-json-valid&lt;/code&gt; stała na straży spójności danych!&lt;/strong&gt;&lt;/p&gt;

    &lt;p&gt;Moja ulubiona biblioteka to &lt;a href=&quot;https://www.npmjs.com/package/is-my-json-valid&quot;&gt;is-my-json-valid&lt;/a&gt;
 (od nie dawna &lt;a href=&quot;https://www.npmjs.com/package/ajv&quot;&gt;ajv&lt;/a&gt;). Super szybka walidacja schemy to jest coś
 czego potrzebuję i ani &lt;code class=&quot;highlighter-rouge&quot;&gt;TypeScript&lt;/code&gt; ani &lt;code class=&quot;highlighter-rouge&quot;&gt;Flow&lt;/code&gt; tutaj by nie pomógł!
 Mówię to z pełną sympatią do TypeScript-a 😄&lt;/p&gt;

    &lt;p&gt;Po so mi &lt;code class=&quot;highlighter-rouge&quot;&gt;imjv&lt;/code&gt;? Walidacja JSONa po to, aby zweryfikować, czy faktycznie
 dostaję do czego oczekuję.&lt;/p&gt;

    &lt;blockquote class=&quot;block-good&quot;&gt;
      &lt;h3 id=&quot;-porada-nr-7-1&quot;&gt;&lt;i class=&quot;icon-good&quot;&gt;&lt;/i&gt; Porada nr 7&lt;/h3&gt;
      &lt;p&gt;Gorąco polecam tą bibliotekę do walidacji JSONów.&lt;br /&gt;
Kiedyś &lt;a href=&quot;https://www.youtube.com/watch?v=U6MICL37ju4&quot;&gt;opowiedziałem na jej temat lightning talka&lt;/a&gt;.&lt;/p&gt;
    &lt;/blockquote&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Literówka przy definiowaniu &lt;code class=&quot;highlighter-rouge&quot;&gt;schema&lt;/code&gt;-y&lt;/strong&gt;&lt;/p&gt;

    &lt;p&gt;Wspomniana literówka spowodowała stworzenie nowego formatu do
sprawdzenia “czy wartość nie jest pusta?”. Omawiana literówka to:&lt;/p&gt;

    &lt;div class=&quot;language-diff highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gd&quot;&gt;- require
&lt;/span&gt;&lt;span class=&quot;gi&quot;&gt;+ required
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;

    &lt;blockquote class=&quot;block-poor&quot;&gt;
      &lt;h3 id=&quot;-najważniejsza-porada&quot;&gt;&lt;i class=&quot;icon-poor&quot;&gt;&lt;/i&gt; Najważniejsza porada!&lt;/h3&gt;
      &lt;p&gt;Strzeżcie się literówek!&lt;br /&gt;
To one są zabierają nam (programistom) najwięcej czasu.&lt;/p&gt;
    &lt;/blockquote&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;h2 id=&quot;wideo&quot;&gt;Wideo&lt;/h2&gt;

&lt;p&gt;Kilka dni po hackathonie nagrałem film, w który opowiadam o projekcie “Milva”:&lt;/p&gt;

&lt;div class=&quot;youtube-lazy&quot; data-youtube-id=&quot;MSnmYQ_X9EQ&quot;&gt;&lt;/div&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;h2 id=&quot;-problem-z-vue-cli&quot;&gt;&lt;i class=&quot;icon-average&quot;&gt;&lt;/i&gt; Problem z &lt;mark&gt;Vue CLI&lt;/mark&gt;&lt;/h2&gt;

&lt;p&gt;Podczas deploymentu miałem spory problem z opublikowaniem aplikacji przez
domyślną konfigurację &lt;code class=&quot;highlighter-rouge&quot;&gt;package.json&lt;/code&gt;. Ten plik został wygenerowany w procesie
budowania aplikacji za pomocą &lt;code class=&quot;highlighter-rouge&quot;&gt;vue-cli&lt;/code&gt; z użyciem template &lt;code class=&quot;highlighter-rouge&quot;&gt;webpack&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Aplikacja posiada błąd dotyczący formatu wersji w &lt;code class=&quot;highlighter-rouge&quot;&gt;package.json&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&quot;language-diff highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;gd&quot;&gt;- &quot;node&quot;: &quot;&amp;gt;6.12.0&quot;,
- &quot;npm&quot;: &quot;&amp;gt;3.10.10&quot;
&lt;/span&gt;&lt;span class=&quot;gi&quot;&gt;+ &quot;node&quot;: &quot;8.x&quot;,
+ &quot;npm&quot;: &quot;5.x&quot;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Walczyłem z tym tematem dosyć długo. Szkoda. Mógłbym ten czas poświęcić na
ulepszanie aplikacji.&lt;/p&gt;

&lt;h2 id=&quot;-co-mi-się-spodobało-w-vuejs&quot;&gt;&lt;i class=&quot;icon-good&quot;&gt;&lt;/i&gt; Co mi się &lt;u&gt;spodobało&lt;/u&gt; w &lt;mark&gt;Vue.js&lt;/mark&gt;?&lt;/h2&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Bardzo prosta składnia&lt;/strong&gt;&lt;/p&gt;

    &lt;p&gt;Duży plus za prosty przepis na tworzenie komponentów. Połączenie markupu
 ze zdarzeniami UI to też prosta sprawa. A komunikacja między komponentami
  w obie strony (rodzic → dziecko i odwrotnie) to istna przyjemność!&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Czytelny kod&lt;/strong&gt;&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;warstwa prezentacji - &lt;strong&gt;Vue.js&lt;/strong&gt;&lt;/li&gt;
      &lt;li&gt;warstwa przetrzymywania stanu - &lt;strong&gt;Vuex&lt;/strong&gt;&lt;/li&gt;
      &lt;li&gt;warstwa routingu - &lt;strong&gt;vue-router&lt;/strong&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Definicja komponentu w jednym pliku&lt;/strong&gt;&lt;/p&gt;

    &lt;p&gt;Nie trzeba przełączać się po plikach. Ten punkt można traktować jako plus
 ale i pewnie takie rozwiązanie znajdzie swoich przeciwników.&lt;/p&gt;

    &lt;p&gt;Trudno. Dla mnie takie rozwiązanie to plus 👍&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Wsparcie do &lt;code class=&quot;highlighter-rouge&quot;&gt;Sass&lt;/code&gt;-a&lt;/strong&gt;&lt;/p&gt;

    &lt;p&gt;Wystarczy ustawić atrybut &lt;code class=&quot;highlighter-rouge&quot;&gt;&amp;lt;style lang=&quot;scss&quot;&amp;gt;&lt;/code&gt; oraz doinstalować:&lt;/p&gt;

    &lt;p&gt;&lt;kbd&gt;Copy + paste&lt;/kbd&gt;&lt;/p&gt;

    &lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt; npm &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;node-sass sass-loader
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;

    &lt;p&gt;aby korzystać z SCSS w stylach!&lt;/p&gt;

    &lt;p&gt;Zapomnijcie o &lt;a href=&quot;https://webpack.js.org&quot;&gt;Webpacku&lt;/a&gt; i jego “pięknej” konfiguracji.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Wsparcie WebStorma&lt;/strong&gt;&lt;/p&gt;

    &lt;p&gt;Dobry edytor to taki, który podpowiada programiście to, co chce on za
 moment napisać. Moim zdaniem WebStorm króluje w tej kategorii. Pomalutku
 goni do Visual Studio Code, ale to inna liga.&lt;/p&gt;

    &lt;p&gt;WebStorm zna dyrektywy m.in. &lt;code class=&quot;highlighter-rouge&quot;&gt;v-if&lt;/code&gt;, &lt;code class=&quot;highlighter-rouge&quot;&gt;v-for&lt;/code&gt;, dzięki czemu pisanie markupu
 to przyjemność!&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Ekstremalnie szybki development - &lt;code class=&quot;highlighter-rouge&quot;&gt;Hot Module Reloading&lt;/code&gt; robi robotę!&lt;/strong&gt;&lt;/p&gt;

    &lt;p&gt;Wreszcie przekonałem się do HMR. Wystarczy uruchomić:&lt;/p&gt;

    &lt;p&gt;&lt;kbd&gt;Copy + paste&lt;/kbd&gt;&lt;/p&gt;

    &lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt; npm run dev
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;

    &lt;p&gt;i cieszyć się pracą bez odświeżania strony!&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Świetne narzędzie developerski &lt;a href=&quot;https://github.com/vuejs/vue-devtools&quot;&gt;Vue.js Devtools&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

    &lt;p&gt;Gdy korzystać z SSoT (Redux, Vuex) to możesz cofać się w historii stanów,
 aby dowiedzieć się jak aplikacja wyglądała “kiedyś”.&lt;/p&gt;

    &lt;p&gt;Aby to robić musimy mieć odpowiednie narzędzie.&lt;br /&gt;
 React ma swoje. Vue nie jest gorsze.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;-co-mi-się-nie-spodobało-w-vuejs&quot;&gt;&lt;i class=&quot;icon-poor&quot;&gt;&lt;/i&gt; Co mi się &lt;u&gt;nie spodobało&lt;/u&gt; w &lt;mark&gt;Vue.js&lt;/mark&gt;?&lt;/h2&gt;

&lt;p&gt;Nie chciałbym kończyć tego artykułu negatywnie (w końcu to pierwszy wpis w tym
roku), więc wcale nie napiszę, że dokumentacja mogła by być lepsza, bo
ZAWSZE może być lepiej. Na pewno jest lepiej niż u konkurencji (patrz Angular).&lt;/p&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;p class=&quot;center-text&quot;&gt;&lt;strong&gt;Daj znać w komentarzu, czy lubisz brać udział w hackathonach?&lt;/strong&gt;&lt;/p&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;p&gt;Wiesz, że za miesiąc organizuję ze znajomymi hackathon? Jeśli nie, to zerknij
&lt;a href=&quot;https://web.facebook.com/events/1468638059901008&quot;&gt;tutaj&lt;/a&gt;.&lt;/p&gt;

&lt;!-- Resources --&gt;

</description>
            <pubDate>Wed, 17 Jan 2018 10:07:20 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2018/01/17/hackathon-node-knockout-2017.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2018/01/17/hackathon-node-knockout-2017.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/nko-2015/nko-logo-526x275.jpg</image>
        </item>
        
        <item>
            <title>Angular: Krótka historia o tym, jak złamałem system</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;&lt;strong&gt;Lubię krótkie wpisy.&lt;/strong&gt; Tylko nie umiem ich pisać. Stąd też rzadko publikuję,
bo wyobrażam sobie te wielogodzinne poświęcenie, aby napisać WSPANIAŁY,
a zaraz długi artykułu traktującego o zadanym temacie…&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Muszę nauczyć się pisać zwięźle i z mięsem.&lt;/strong&gt; Sam lubię czytać takie rzeczy,
więc czytelnicy tego bloga zapewne również. Do rzeczy.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/angular/angular-526x275.jpg&quot; itemprop=&quot;image&quot; alt=&quot;Baner promujący artykuł&quot; /&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;-problem&quot;&gt;&lt;i class=&quot;icon-poor&quot;&gt;&lt;/i&gt; Problem&lt;/h2&gt;

&lt;p&gt;Jest sobie taki serwis:&lt;/p&gt;

&lt;div class=&quot;language-typescript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;nd&quot;&gt;Injectable&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;UserPurchasesStateManagerService&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;

    &lt;span class=&quot;kr&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;purchasesState$&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;BehaviorSubject&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(...);&lt;/span&gt;

    &lt;span class=&quot;kr&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;setPurchasesState&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;state&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;number&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;purchasesState$&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;next&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;state&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;kr&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;getPurchasesState$&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;():&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;BehaviorSubject&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;number&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;purchasesState$&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Niby wszystko poprawnie, ale errrr…​&lt;br /&gt;&lt;/p&gt;

&lt;p&gt;Wystarczy, że po utworzeniu instancji serwisu (przypominam, że w Angularze
instancje serwisów są singletonami) zrobię tak:&lt;/p&gt;

&lt;div class=&quot;language-typescript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;// Sztuczne tworzenie, oczywiście Angular zrobi to niejawnie&lt;/span&gt;
&lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;stateManager&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;UserPurchasesStateManagerService&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;// Boom!!&lt;/span&gt;
&lt;span class=&quot;nx&quot;&gt;stateManager&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;getPurchasesState$&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;next&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kc&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;​&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;…i złamałem system ☹️&lt;/p&gt;

&lt;h2 id=&quot;solucja&quot;&gt;Solucja&lt;/h2&gt;

&lt;p&gt;Trzeba zmienić definicję (i sygnaturę) gettera na:&lt;/p&gt;

&lt;div class=&quot;language-typescript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;// ...&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;UserPurchasesStateManagerService&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;// ...&lt;/span&gt;

    &lt;span class=&quot;kr&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;getPurchasesState$&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;():&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Observable&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;number&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;purchasesState$&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;asObservable&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;A teraz krótka porada:&lt;/p&gt;

&lt;blockquote class=&quot;block-good&quot;&gt;
  &lt;h3 id=&quot;-porada&quot;&gt;&lt;i class=&quot;icon-good&quot;&gt;&lt;/i&gt; Porada&lt;/h3&gt;
  &lt;p&gt;Jeśli gdzieś chcemy zwrócić subject-a to lepiej zrobić tak:&lt;/p&gt;
  &lt;ul&gt;
    &lt;li&gt;ukryć do private-em&lt;/li&gt;
    &lt;li&gt;zrobić getter, który go zwróci ale przekształci za pomocą &lt;code class=&quot;highlighter-rouge&quot;&gt;.asObservable()&lt;/code&gt;
  w strumień &lt;code class=&quot;highlighter-rouge&quot;&gt;read-only&lt;/code&gt;
inaczej oddamy władzie zmiany stanu komuś innemu.&lt;/li&gt;
  &lt;/ul&gt;
&lt;/blockquote&gt;
</description>
            <pubDate>Fri, 08 Dec 2017 09:30:00 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2017/12/08/angular-krotka-historia-o-tym-jak-zlamalem-system.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2017/12/08/angular-krotka-historia-o-tym-jak-zlamalem-system.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/angular/angular-526x275.jpg</image>
        </item>
        
        <item>
            <title>Vue.js na Heroku</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Podczas hackathonu w jakim brałem udział tydzień temu - &lt;a href=&quot;https://www.nodeknockout.com/&quot;&gt;Node Knockout&lt;/a&gt;
&lt;a href=&quot;https://www.nodeknockout.com/entries/65-dumplings&quot;&gt;2017&lt;/a&gt;, budowałem aplikację, którą - zgodnie z regulaminem
wydarzenia - musiałem opublikować na &lt;strong&gt;Heroku&lt;/strong&gt;. Przyzwyczaiłem się już do
tego, że zawsze tam lądują moje aplikacje podczas wydarzeń takiego typu.&lt;/p&gt;

&lt;p&gt;Spotkały mnie pewne problemy, które rozwiązałem i chciałem się podzielić moim
rozwiązaniem. Nie uważam je za idealne. Jednak za wystarczające.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;mark&gt;Disclaimer&lt;/mark&gt; Zdaje sobie z tego sprawę, że wrzucanie katalogu
&lt;code class=&quot;highlighter-rouge&quot;&gt;dist&lt;/code&gt; do repozytorium jest bez sensowne, ponieważ Git nie powinien
wersjonować plików zbundlowanych jednak - jak zawsze - istnieją wyjątki.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/vue/vue-heroku-526x275.jpg&quot; itemprop=&quot;image&quot; alt=&quot;Baner promujący artykuł&quot; /&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;etap-0-heroku-zakładanie-konta&quot;&gt;&lt;mark&gt;Etap 0&lt;/mark&gt; Heroku: Zakładanie konta&lt;/h2&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;Zakładamy konto na: &lt;a href=&quot;http://heroku.com&quot;&gt;heroku.com&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Panel użytkownika: &lt;a href=&quot;http://dashboard.heroku.com&quot;&gt;dashboard.heroku.com&lt;/a&gt;&lt;/p&gt;

    &lt;p&gt;Heroku udostępnia panel dla użytkownika, gdzie można tworzyć nowe kontenery,
 gdzie uruchomiony jest system operacyjny Linux. Pojedynczy kontener
 w żargonie firmy nazywa się &lt;code class=&quot;highlighter-rouge&quot;&gt;Dyno&lt;/code&gt;&lt;/p&gt;

    &lt;p&gt;Więcej na ich temat w &lt;a href=&quot;https://devcenter.heroku.com/articles/dynos&quot;&gt;pomocy&lt;/a&gt;.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;etap-1-heroku-przygotowanie-środowiska&quot;&gt;&lt;mark&gt;Etap 1&lt;/mark&gt; Heroku: Przygotowanie środowiska&lt;/h2&gt;

&lt;ol&gt;
  &lt;li&gt;Tworzymy nową aplikację: &lt;code class=&quot;highlighter-rouge&quot;&gt;New&lt;/code&gt; → &lt;code class=&quot;highlighter-rouge&quot;&gt;Create new app&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Wpisujemy nazwę dla naszej aplikacji w pole &lt;code class=&quot;highlighter-rouge&quot;&gt;App name&lt;/code&gt;&lt;/p&gt;

    &lt;blockquote&gt;
      &lt;p&gt;Wpisana nazwa jest na sprawdzana “w locie” pod kątem dostępności.&lt;/p&gt;
    &lt;/blockquote&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;em&gt;Opcjonalnie: Wybieramy region: &lt;code class=&quot;highlighter-rouge&quot;&gt;Choose a region&lt;/code&gt; → &lt;code class=&quot;highlighter-rouge&quot;&gt;Europe&lt;/code&gt;&lt;/em&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;p class=&quot;center-text&quot;&gt;🎉 &lt;strong&gt;Aplikacja stworzona!&lt;/strong&gt; 🎉&lt;/p&gt;

&lt;p&gt;Możemy otworzyć aplikację w przeglądarce klikając w przycisk: &lt;code class=&quot;highlighter-rouge&quot;&gt;Open app&lt;/code&gt;
Naszym oczom powinien ukazać się komunikat:&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;Heroku | Welcome to your new app!&lt;/code&gt;&lt;/p&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;h2 id=&quot;etap-2-stworzenie-projektu-za-pomocą-vue-cli&quot;&gt;&lt;mark&gt;Etap 2&lt;/mark&gt; Stworzenie projektu za pomocą &lt;code class=&quot;highlighter-rouge&quot;&gt;Vue CLI&lt;/code&gt;&lt;/h2&gt;

&lt;h3 id=&quot;1-instalacja&quot;&gt;1. Instalacja&lt;/h3&gt;

&lt;p&gt;&lt;kbd&gt;Copy + paste&lt;/kbd&gt;&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;npm &lt;span class=&quot;nb&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-g&lt;/span&gt; vue-cli
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Po instalacji, w terminalu będzie dostępne polecenie &lt;code class=&quot;highlighter-rouge&quot;&gt;vue&lt;/code&gt;.&lt;/p&gt;

&lt;h3 id=&quot;2-wygenerowanie-projektu-za-pomocą-szablonu&quot;&gt;2. Wygenerowanie projektu za pomocą szablonu&lt;/h3&gt;

&lt;p&gt;&lt;kbd&gt;Copy + paste&lt;/kbd&gt;&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;vue init webpack NAZWA_PROJEKTU
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Wykorzystujemy jeden w predefiniowanej struktury aplikacji.&lt;br /&gt;
W projekcie &lt;a href=&quot;https://github.com/vuejs-templates&quot;&gt;vue-templates&lt;/a&gt; istnieje 6 różnych szablonów:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;webpack&lt;/li&gt;
  &lt;li&gt;webpack-simple&lt;/li&gt;
  &lt;li&gt;pwa&lt;/li&gt;
  &lt;li&gt;simple&lt;/li&gt;
  &lt;li&gt;browserify&lt;/li&gt;
  &lt;li&gt;browserify-simple&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;3--poprawienie-wersji&quot;&gt;3. &lt;i class=&quot;icon-poor&quot;&gt;&lt;/i&gt; Poprawienie wersji&lt;/h3&gt;

&lt;p&gt;&lt;mark&gt;Uwaga&lt;/mark&gt;: W &lt;code class=&quot;highlighter-rouge&quot;&gt;package.json&lt;/code&gt; należy poprawić wersję, z uwagi na
problem, który wystąpi podczas instalacji zależności na &lt;code class=&quot;highlighter-rouge&quot;&gt;Heroku&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&quot;language-diff highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;   &quot;engines&quot;: {
&lt;span class=&quot;gd&quot;&gt;-    &quot;node&quot;: &quot;&amp;gt;= 4.0.0&quot;,
-    &quot;npm&quot;: &quot;&amp;gt;= 3.0.0&quot;
&lt;/span&gt;&lt;span class=&quot;gi&quot;&gt;+    &quot;node&quot;: &quot;8.x&quot;,
+    &quot;npm&quot;: &quot;5.x&quot;
&lt;/span&gt;   },
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;4-instalacja-zależności&quot;&gt;4. Instalacja zależności&lt;/h3&gt;

&lt;p&gt;&lt;kbd&gt;Copy + paste&lt;/kbd&gt;&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;npm &lt;span class=&quot;nb&quot;&gt;install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;W głównym katalogu projektu stworzy się plik &lt;em&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;package-lock.json&lt;/code&gt;&lt;/em&gt;,
w którym zostaną zapisane wszystkie dane na temat zainstalowanych paczek wraz
z ich wersjami.&lt;/p&gt;

&lt;details&gt;
    &lt;summary&gt;Stacktrace z błędem&lt;/summary&gt;

    &lt;p&gt;
        Jeśli nie zaktualizujemy wersji to będziemy świadkami błędu:
    &lt;/p&gt;

    &lt;pre&gt;
remote: -----&amp;gt; Building dependencies
remote:        Installing node modules (package.json + package-lock)
remote:        WARNING: You are likely using a version of node-tar or npm that is incompatible with this version of Node.js.
remote:        Please use either the version of npm that is bundled with Node.js, or a version of npm (&amp;gt; 5.5.1 or &amp;lt; 5.4.0) or node-tar (&amp;gt; 4.0.1) that is compatible with Node.js 9 and above.
remote:        /tmp/build_ab1c9272aa348395c069d548da02c8c4/.heroku/node/bin/node[273]: ../src/node_zlib.cc:437:static void node::{anonymous}::ZCtx::Init(const v8::FunctionCallbackInfo&amp;lt;v8::Value&amp;gt;&amp;amp;): Assertion `args.Length() == 7 &amp;amp;&amp;amp; &quot;init(windowBits, level, memLevel, strategy, writeResult, writeCallback,&quot; &quot; dictionary)&quot;' failed.
remote:        1: node::Abort() [npm]
remote:        2: node::Assert(char const* const (*) [4]) [npm]
remote:        3: 0x1255aff [npm]
remote:        4: v8::internal::FunctionCallbackArguments::Call(void (*)(v8::FunctionCallbackInfo&amp;lt;v8::Value&amp;gt; const&amp;amp;)) [npm]
remote:        5: 0xb77f9c [npm]
remote:        6: v8::internal::Builtin_HandleApiCall(int, v8::internal::Object**, v8::internal::Isolate*) [npm]
remote:        7: 0x253e476842fd
remote: /app/tmp/buildpacks/19862b8792e84bd8421ded4660b92dfd1c41d92e19ac0b38c90301adc8ae3e0bd512fa01998af18fc2f0d31a157e9c82e8fdceba1a05e5d29adb8dc2bfaf08e1/lib/dependencies.sh: line 111:   273 Aborted                 npm install --unsafe-perm --userconfig $build_dir/.npmrc 2&amp;gt;&amp;amp;1
remote:
remote: -----&amp;gt; Build failed
remote:
remote:        We're sorry this build is failing! You can troubleshoot common issues here:
remote:        https://devcenter.heroku.com/articles/troubleshooting-node-deploys
remote:
remote:        Some possible problems:
remote:
remote:        - Dangerous semver range (&amp;gt;) in engines.node
remote:        https://devcenter.heroku.com/articles/nodejs-support#specifying-a-node-js-version
remote:
remote:        Love,
remote:        Heroku
    &lt;/pre&gt;
&lt;/details&gt;

&lt;h3 id=&quot;5-zamieniamy-projekt-w-repozytorium&quot;&gt;5. Zamieniamy projekt w repozytorium&lt;/h3&gt;

&lt;p&gt;&lt;kbd&gt;Copy + paste&lt;/kbd&gt;&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;git init
git add &lt;span class=&quot;nb&quot;&gt;.&lt;/span&gt;
git commit &lt;span class=&quot;nt&quot;&gt;-am&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;Initial import&quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Teraz mamy dwie opcje:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;i class=&quot;icon-average&quot;&gt;&lt;/i&gt; &lt;strong&gt;Dodajemy&lt;/strong&gt; katalog &lt;code class=&quot;highlighter-rouge&quot;&gt;dist/&lt;/code&gt; do repozytorium&lt;/li&gt;
  &lt;li&gt;&lt;i class=&quot;icon-good&quot;&gt;&lt;/i&gt; &lt;strong&gt;Nie dodajemy&lt;/strong&gt; katalogu &lt;code class=&quot;highlighter-rouge&quot;&gt;dist/&lt;/code&gt; (rekomendowana)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Zobaczmy jak wyglądają obie opcje w realu!&lt;/p&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;h2 id=&quot;etap-2--opcja-1-dodajemy-katalog-dist-do-repozytorium&quot;&gt;&lt;mark&gt;Etap 2&lt;/mark&gt; → &lt;mark&gt;Opcja 1&lt;/mark&gt; Dodajemy katalog &lt;code class=&quot;highlighter-rouge&quot;&gt;dist/&lt;/code&gt; do repozytorium&lt;/h2&gt;

&lt;h3 id=&quot;1-budujemy-produkcyjną-wersję-aplikacji-w-katalogu-dist&quot;&gt;1. Budujemy produkcyjną wersję aplikacji w katalogu &lt;code class=&quot;highlighter-rouge&quot;&gt;dist/&lt;/code&gt;&lt;/h3&gt;

&lt;p&gt;&lt;kbd&gt;Copy + paste&lt;/kbd&gt;&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;npm run build
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;2-wyłączamy-ignorowania-przez-git-a-katalog-dist&quot;&gt;2. Wyłączamy ignorowania przez &lt;code class=&quot;highlighter-rouge&quot;&gt;Git&lt;/code&gt;-a katalog &lt;code class=&quot;highlighter-rouge&quot;&gt;dist/&lt;/code&gt;&lt;/h3&gt;

&lt;p&gt;Usuwamy linijkę w pliku &lt;code class=&quot;highlighter-rouge&quot;&gt;.gitignore&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&quot;language-diff highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;  node_modules/
&lt;span class=&quot;gd&quot;&gt;- /dist/
&lt;/span&gt;  npm-debug.log*
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;3-dodajemy-katalog-dist-do-repozytorium&quot;&gt;3. Dodajemy katalog &lt;code class=&quot;highlighter-rouge&quot;&gt;dist/&lt;/code&gt; do repozytorium&lt;/h3&gt;

&lt;p&gt;&lt;kbd&gt;Copy + paste&lt;/kbd&gt;&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;git add &lt;span class=&quot;nb&quot;&gt;.&lt;/span&gt;
git commit &lt;span class=&quot;nt&quot;&gt;-am&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;Add distributed version&quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;4-instalacja-narzędzia-które-będzie-serwować-katalog-dist&quot;&gt;4. Instalacja narzędzia, które będzie serwować katalog &lt;code class=&quot;highlighter-rouge&quot;&gt;dist/&lt;/code&gt;&lt;/h3&gt;

&lt;p&gt;&lt;kbd&gt;Copy + paste&lt;/kbd&gt;&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;npm &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;serve &lt;span class=&quot;nt&quot;&gt;--save&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;5-tworzymy-zadanie-run-script-które-uruchomi-aplikację&quot;&gt;5. Tworzymy zadanie &lt;code class=&quot;highlighter-rouge&quot;&gt;run-script&lt;/code&gt;, które uruchomi aplikację&lt;/h3&gt;

&lt;div class=&quot;language-diff highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;   &quot;scripts&quot;: {
&lt;span class=&quot;gd&quot;&gt;-    &quot;start&quot;: &quot;npm run dev&quot;,
&lt;/span&gt;&lt;span class=&quot;gi&quot;&gt;+    &quot;start&quot;: &quot;serve dist/&quot;,
+    &quot;deploy&quot;: &quot;npm run build &amp;amp;&amp;amp; git add dist/ &amp;amp;&amp;amp; git commit -am 'Deploy' &amp;amp;&amp;amp; git push -f heroku master&quot;
&lt;/span&gt;   },
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Opiszę co robią dodane zadania:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;start&lt;/code&gt; - uruchomi paczkę &lt;code class=&quot;highlighter-rouge&quot;&gt;serve&lt;/code&gt;, która będzie serwować katalog &lt;code class=&quot;highlighter-rouge&quot;&gt;dist/&lt;/code&gt;,
  jako główny katalog aplikacji&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;deploy&lt;/code&gt; - aby przyspieszyć proces deploymentu warto zrobić takie zadanie,
  które wykona za nas wszelkie prace związanie ze zbudowaniem wersji
  produkcyjnej&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;6-zapisujemy-stan-projektu&quot;&gt;6. Zapisujemy stan projektu&lt;/h3&gt;

&lt;p&gt;&lt;kbd&gt;Copy + paste&lt;/kbd&gt;&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;git add &lt;span class=&quot;nb&quot;&gt;.&lt;/span&gt;
git commit &lt;span class=&quot;nt&quot;&gt;-am&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;Serve static files&quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Aplikacja jest gotowa do pierwszego release-u!&lt;/strong&gt; 🏆&lt;/p&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;h2 id=&quot;etap-2--opcja-2-nie-dodajemy-katalogu-dist-do-repozytorium-rekomendowana&quot;&gt;&lt;mark&gt;Etap 2&lt;/mark&gt; → &lt;mark&gt;Opcja 2&lt;/mark&gt; Nie dodajemy katalogu &lt;code class=&quot;highlighter-rouge&quot;&gt;dist/&lt;/code&gt; do repozytorium (rekomendowana)&lt;/h2&gt;

&lt;h3 id=&quot;1-instalujemy-paczkę-która-będzie-serwowała-katalog-dist&quot;&gt;1. Instalujemy paczkę, która będzie serwowała katalog &lt;code class=&quot;highlighter-rouge&quot;&gt;dist/&lt;/code&gt;&lt;/h3&gt;

&lt;p&gt;Dla odmiany wykorzystajmy inną paczkę.&lt;br /&gt;
Tym razem niech to będzie &lt;code class=&quot;highlighter-rouge&quot;&gt;http-server&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;kbd&gt;Copy + paste&lt;/kbd&gt;&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;npm &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;http-server &lt;span class=&quot;nt&quot;&gt;--save&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;2-dodajemy-nowe-zadania&quot;&gt;2. Dodajemy nowe zadania&lt;/h3&gt;

&lt;div class=&quot;language-diff highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;    &quot;scripts&quot;: {
        &quot;dev&quot;: &quot;webpack-dev-server --inline --progress --config build/webpack.dev.conf.js&quot;,
        &quot;build&quot;: &quot;node build/build.js&quot;,
&lt;span class=&quot;gi&quot;&gt;+       &quot;deploy&quot;: &quot;git push -f heroku master&quot;,
+       &quot;heroku-postbuild&quot;: &quot;npm run build&quot;,
+       &quot;start&quot;: &quot;http-server dist/ -d false -g&quot;
&lt;/span&gt;    },
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Opiszę nowo dodane polecenia:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;deploy&lt;/code&gt; - zadanie dzięki, któremu zaktualizujemy branch &lt;code class=&quot;highlighter-rouge&quot;&gt;master&lt;/code&gt; w Heroku,
  przez co zostanie zaktualizowany projekt w serwerowni.&lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;heroku-postbuild&lt;/code&gt; - jest to hook (event handler), który zostanie
  uruchomiony przez Heroku w celu zbudowania aplikacji.&lt;/p&gt;

    &lt;p&gt;Zadanie zostanie uruchomione po instalacji wszystkich zależności.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;start&lt;/code&gt; - uruchamia serwer HTTP, który będzie serwował katalog &lt;code class=&quot;highlighter-rouge&quot;&gt;dist/&lt;/code&gt; jako
  &lt;code class=&quot;highlighter-rouge&quot;&gt;directoryRoot&lt;/code&gt;, czy główny katalog aplikacji&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;3-ustawmy-zmienną-środowiskową-na-heroku&quot;&gt;3. Ustawmy zmienną środowiskową na Heroku&lt;/h3&gt;

&lt;p&gt;W panelu Heroku, w zakładce &lt;code class=&quot;highlighter-rouge&quot;&gt;Settings&lt;/code&gt; → &lt;code class=&quot;highlighter-rouge&quot;&gt;Config Variables&lt;/code&gt;.
Należy w niej ustawić zmienną:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;NPM_CONFIG_PRODUCTION &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;false&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Zmienna jest ustawiona po to, aby podczas procesu budowania projektu Heroku
pobrało również zależności developerskie, które są potrzebne do zbudowania
aplikacji do katalogu &lt;code class=&quot;highlighter-rouge&quot;&gt;dist/&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Aplikacja jest gotowa do pierwszego release-u!&lt;/strong&gt; 🏆&lt;/p&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;h2 id=&quot;etap-3-deployment&quot;&gt;&lt;mark&gt;Etap 3&lt;/mark&gt; Deployment&lt;/h2&gt;

&lt;p&gt;Czas najwyższy, aby opublikować aplikację. Mamy kilka możliwości na
deployment aplikacji. Dla mnie interesujące są 2 pierwsze:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Automatyczny deployment z brancha na GitHubie&lt;/li&gt;
  &lt;li&gt;Manualny deployment po wrzuceniu projektu do zdalnego repozytorium Git,
 trzymanego na Heroku.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Wybieram opcję numer 2&lt;/strong&gt; ponieważ pierwsza jest mniej elastyczna. Chciałbym
 coś wrzucić na Heroku, ale nie chciałbym publikować tych zmian na GitHuba.&lt;/p&gt;

&lt;h3 id=&quot;1-logujemy-się-do-heroku-cli&quot;&gt;1. Logujemy się do Heroku CLI&lt;/h3&gt;

&lt;p&gt;&lt;kbd&gt;Copy + paste&lt;/kbd&gt;&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;heroku login
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;2-łączymy-repozytorium-lokalne-ze-zdalnym-na-heroku&quot;&gt;2. Łączymy repozytorium lokalne ze zdalnym na Heroku&lt;/h3&gt;

&lt;p&gt;&lt;kbd&gt;Copy + paste&lt;/kbd&gt;&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;heroku git:remote &lt;span class=&quot;nt&quot;&gt;-a&lt;/span&gt; NAZWA_PROJEKTU
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;3-wypychamy-zmiany-na-serwer-&quot;&gt;3. Wypychamy zmiany na serwer 🚀&lt;/h3&gt;

&lt;p&gt;Wyślijmy nasze repozytorium na Heroku, aby zainicjować proces deploymentu:&lt;/p&gt;

&lt;p&gt;&lt;kbd&gt;Copy + paste&lt;/kbd&gt;&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;git push &lt;span class=&quot;nt&quot;&gt;-f&lt;/span&gt; heroku master
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Odśwież w przeglądarce wcześniej otworzoną stronę, aby zobaczyć:&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/vue/vue-default-page.png&quot; alt=&quot;&quot; /&gt;
    &lt;figcaption&gt;
        Domyślny template aplikacji
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;p class=&quot;center-text&quot;&gt;🎊 &lt;strong&gt;Aplikacja opublikowana!&lt;/strong&gt; 🎊&lt;/p&gt;

&lt;p&gt;Więcej na temat deploymentu przeczytasz &lt;a href=&quot;https://devcenter.heroku.com/articles/git&quot;&gt;w pomocy&lt;/a&gt;.&lt;br /&gt;
Aby później deployować aplikację za pomocą jednego polecenia:&lt;/p&gt;

&lt;p&gt;&lt;kbd&gt;Copy + paste&lt;/kbd&gt;&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;npm run deploy
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;p&gt;Jeśli znasz lepszy sposób na deployment napisz komentarz!&lt;/p&gt;

&lt;!-- Resources --&gt;

</description>
            <pubDate>Sat, 18 Nov 2017 16:17:17 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2017/11/18/vue-js-na-heroku.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2017/11/18/vue-js-na-heroku.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/vue/vue-heroku-526x275.jpg</image>
        </item>
        
        <item>
            <title>WebStorm: Jak być mistrzem wyszukiwania?</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Od wielu lat korzystam z WebStorma. Nie jest to zwykły edytor, lecz IDE.&lt;/p&gt;

&lt;blockquote class=&quot;block-good&quot;&gt;
  &lt;p&gt;Ten kto nie wie jak jest różnica, to zapraszam &lt;a href=&quot;https://www.nettecode.com/ide-vs-edytory-krotki-przeglad/&quot;&gt;tutaj&lt;/a&gt;.&lt;br /&gt;
Żaneta w przystępny sposób opisuje różnice.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/webstorm/webstorm-526x275.jpg&quot; itemprop=&quot;image&quot; alt=&quot;Baner promujący artykuł&quot; /&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;proces-wyszukiwania&quot;&gt;Proces wyszukiwania&lt;/h2&gt;

&lt;p&gt;Coś dlaczego nie mogę w 100% przerzucić się na VIM-a jest możliwość
przeszukiwania projektu pod kątem mojego wyrażenia (proces grep-owania).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Moją tajną bronią w programowaniu jest mechanizm “wyszukiwania”.&lt;/strong&gt;&lt;br /&gt;
Opowiem o nim kiedyś.&lt;/p&gt;

&lt;p&gt;W tym wpisie chciałem pokazać czego dzisiaj się nauczyłem, aby korzystanie
z WebStorma było jeszcze bardziej efektywniejsze. Wykorzystajmy &lt;code class=&quot;highlighter-rouge&quot;&gt;Find in Path&lt;/code&gt;!&lt;/p&gt;

&lt;h2 id=&quot;file-mask---wzorzec-nazwy-pliku&quot;&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;File mask&lt;/code&gt; - wzorzec nazwy pliku&lt;/h2&gt;

&lt;p&gt;W polu wyszukiwarki wpisujemy frazę i już możemy skorzystać z możliwość
przeszukiwania zawartości projektu pod katem danego ciągu znaków.&lt;/p&gt;

&lt;p&gt;Panel wyszukiwania daje więcej możliwości. Jedną z nich jest &lt;code class=&quot;highlighter-rouge&quot;&gt;File mask&lt;/code&gt; - czyli
zawężenie przeszukiwania projektów do plików, których nazwa spełnia zdefiniowany
wzorzec (&lt;em&gt;nr 4 na poniższym screenshocie&lt;/em&gt;).&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/webstorm/search-panel.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;figcaption&gt;
        Panel wyszukiwania w WebStorm IDE.
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;zadanie-tylko-pliki-html&quot;&gt;Zadanie: Tylko pliki HTML&lt;/h2&gt;

&lt;p&gt;I tak jeśli chcielibyśmy szukać określonej frazy np. tylko w plikach HTML
wystarczy, że w polu oznaczonym &lt;code class=&quot;highlighter-rouge&quot;&gt;File mask&lt;/code&gt; wpiszemy:&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;*.html
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Jak widać, nie jest to &lt;a href=&quot;https://regexr.com/&quot;&gt;wyrażenie regularne&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;negacja&quot;&gt;Negacja&lt;/h2&gt;

&lt;p&gt;Jeśli nie chcemy szukać w plikach z np. testami to wpisujemy w &lt;code class=&quot;highlighter-rouge&quot;&gt;File mask&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;!*.spec.ts
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;kilka-warunków&quot;&gt;Kilka warunków&lt;/h2&gt;

&lt;p&gt;Oczywiście możliwe jest łączenie wzorców (masek). Aby to wykonać, wystarczy
oddzielić je przecinkiem:&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;!*.spec.ts,!*.module.ts
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Źródło: &lt;a href=&quot;https://www.jetbrains.com/help/idea/find-and-replace-in-path.html&quot;&gt;jetbrains.com/help/idea/find-and-replace-in-path.html&lt;/a&gt;&lt;/p&gt;

&lt;!-- Resources --&gt;

</description>
            <pubDate>Mon, 06 Nov 2017 09:30:27 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2017/11/06/webstorm-jak-byc-mistrzem-wyszukiwania.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2017/11/06/webstorm-jak-byc-mistrzem-wyszukiwania.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/webstorm/webstorm-526x275.jpg</image>
        </item>
        
        <item>
            <title>Konferencja: FrontEnd Connect 2017</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Dziś konferencja w miejscu, gdzie jeszcze nigdy nie byłem a
mianowicie w &lt;em&gt;Warszawskim Centrum EXPO XXI&lt;/em&gt;. To tutaj codziennie mają
miejsce różnego rodzaju targi, koncerty itp. wydarzenia z dużą liczbą
uczestników.&lt;/p&gt;

&lt;p&gt;Aby dojechać do miejsca konferencji musiałbym wykorzystać wszystkie środki
komunikacji miejskiej (sic!), stąd też zainwestowałem 20zł i pojechałem
taxi! 🚕&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/conference-frontend-connect-2017/logo-526x276.jpg&quot; itemprop=&quot;image&quot; alt=&quot;Baner promujący artykuł&quot; /&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;frekwencja&quot;&gt;Frekwencja&lt;/h2&gt;

&lt;p&gt;Na stronie konferencji można przeczytać:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;v1.000 participants including over 30 world renowned speakers in the field
of front-end development will meet at the heart of Warsaw, Poland for two
days…&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Niestety, ale więcej niż 300 osób to obie sale nie pomieściły. Ile to już razy
organizatorzy konferencji się zawodzą i ogłaszają, że przyjdzie 2-3x więcej
uczestników niż faktycznie przychodzi.&lt;/p&gt;

&lt;figure class=&quot;social-center-block&quot;&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;it&quot; dir=&quot;ltr&quot;&gt;Attendeeeeeee, fiu fiu! &lt;a href=&quot;https://t.co/609nzvf9Tr&quot;&gt;pic.twitter.com/609nzvf9Tr&lt;/a&gt;&lt;/p&gt;&amp;mdash; Piotr Kowalski (@piecioshka) &lt;a href=&quot;https://twitter.com/piecioshka/status/911142307570864129?ref_src=twsrc%5Etfw&quot;&gt;September 22, 2017&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async=&quot;&quot; src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;

&lt;/figure&gt;

&lt;h2 id=&quot;miejsce&quot;&gt;Miejsce&lt;/h2&gt;

&lt;p&gt;Budynek na starcie zrobił na mnie spore wrażenie. Strasznie duży z zewnątrz
więc i w wewnątrz było sporo przestrzeni - przykładem niech będą najszersze
schody (wewnątrz budynku) jakie w życiu widziałem (przepraszam, ale nie zrobiłem
im zdjęcia) 😁&lt;/p&gt;

&lt;figure class=&quot;social-center-block&quot;&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;und&quot; dir=&quot;ltr&quot;&gt;Obecny na &lt;a href=&quot;https://twitter.com/hashtag/frontendcon?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#frontendcon&lt;/a&gt; z ramienia &lt;a href=&quot;https://twitter.com/warsawjs?ref_src=twsrc%5Etfw&quot;&gt;@warsawjs&lt;/a&gt; // &lt;a href=&quot;https://twitter.com/FrontEndConnect?ref_src=twsrc%5Etfw&quot;&gt;@FrontEndConnect&lt;/a&gt; &lt;a href=&quot;https://t.co/VFuAoDMr7W&quot;&gt;pic.twitter.com/VFuAoDMr7W&lt;/a&gt;&lt;/p&gt;&amp;mdash; Piotr Kowalski (@piecioshka) &lt;a href=&quot;https://twitter.com/piecioshka/status/911141989185413120?ref_src=twsrc%5Etfw&quot;&gt;September 22, 2017&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async=&quot;&quot; src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;

&lt;/figure&gt;

&lt;h2 id=&quot;powitanie&quot;&gt;Powitanie&lt;/h2&gt;

&lt;p&gt;Na starcie zostałem powitany przez “zespół rejestracyjny”, który wiedział
że przychodzę z ramienia &lt;a href=&quot;http://warsawjs.com/&quot;&gt;WarsawJS&lt;/a&gt;. Cieszę się, że ludzie rozpoznają
moją twarz. Oznacza to, że &lt;a href=&quot;/blog/2017/07/12/warsawjs-meetup-34.html&quot;&gt;wydarzenia które organizuje są coraz bardziej
popularne&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Po rejestracji, wśród stoisk sponsorskich spotkałem &lt;a href=&quot;https://www.linkedin.com/in/urszulakalinowska/&quot;&gt;Ulę&lt;/a&gt; z którą
zamieniłem kilka słów.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ciekawostka!&lt;/strong&gt; Wiecie, że firma Uli - &lt;a href=&quot;https://evojam.com/&quot;&gt;Evojam&lt;/a&gt; - jest najnowszym
sponsorem wydarzeń &lt;a href=&quot;https://evojam.com/news/2017/9/7/evojam-is-a-partner-of-warsawjs-meetjs-summit&quot;&gt;WarsawJS Workshop&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Moje bystre oko zauważyło na stoisku firmy Evojam &lt;em&gt;słoiki&lt;/em&gt;.
Zdziwiłem się dosyć, bo po co komu słoiki na konferencji?
Małe słoiczki stojące na wydzielonym stoliku miały w sobie &lt;strong&gt;dżem&lt;/strong&gt;.
To chyba oczywiste, ale co to ma wspólnego z konferencją?&lt;/p&gt;

&lt;p&gt;Przeczytajcie jeszcze raz nazwę firmy…&lt;/p&gt;

&lt;pre&gt;
e w o d ż e m
&lt;/pre&gt;

&lt;p&gt;Zagadka rozwiązana.&lt;/p&gt;

&lt;figure class=&quot;social-center-block&quot;&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;Best gift at &lt;a href=&quot;https://twitter.com/FrontEndConnect?ref_src=twsrc%5Etfw&quot;&gt;@FrontEndConnect&lt;/a&gt; conference! 🚀 by &lt;a href=&quot;https://twitter.com/evojamcom?ref_src=twsrc%5Etfw&quot;&gt;@evojamcom&lt;/a&gt; company ✨ &lt;a href=&quot;https://t.co/bXCnuYWpEk&quot;&gt;pic.twitter.com/bXCnuYWpEk&lt;/a&gt;&lt;/p&gt;&amp;mdash; Piotr Kowalski (@piecioshka) &lt;a href=&quot;https://twitter.com/piecioshka/status/911162849292152832?ref_src=twsrc%5Etfw&quot;&gt;September 22, 2017&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async=&quot;&quot; src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;

&lt;/figure&gt;

&lt;h2 id=&quot;prelekcje&quot;&gt;Prelekcje&lt;/h2&gt;

&lt;p&gt;Jak to &lt;a href=&quot;/blog/2017/05/25/konferencja-code-europe-2017.html&quot;&gt;zwykle bywa&lt;/a&gt;, na pierwszej prelekcji nie jestem
obecny z powodu &lt;strong&gt;spóźnialstwa&lt;/strong&gt;, które &lt;a href=&quot;/blog/2017/08/30/angular-warsaw-13.html&quot;&gt;nagminnie uprawiam&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Czasami już tak jest, że się spóźnię, bo np. za późno wstanę, ale nie tym
razem. Dzisiaj dzień zacząłem o 8:30. Umówiłem się z moim masażystą, aby
naprostował mi kręgosłup, który cierpi na co dzień, kiedy pracuje się tak
ciężko:&lt;/p&gt;

&lt;figure class=&quot;full-width&quot;&gt;
    &lt;img src=&quot;/assets/images/posts/conference-frontend-connect-2017/pushups.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;figcaption&gt;
        Źródło: http://www.habitbull.com/2014/11/04/these-three-mini-habits-will-make-your-day-infinitely-better/
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Wracając do konferencji. Pierwsza prelekcja (zwana zwykle
&lt;a href=&quot;https://en.wikipedia.org/wiki/Keynote&quot;&gt;keynote&lt;/a&gt;-em - czyli prelekcją obfitującą w wiedzę, inspirującą
oraz nakreślającą główną tematykę wydarzenia) została poprowadzona przez &lt;a href=&quot;http://lea.verou.me/&quot;&gt;Lea
Verou&lt;/a&gt;, która opowiadała o zmiennych w CSS.&lt;/p&gt;

&lt;p&gt;Jak możecie się domyśleć przeczytałem to z agendy
spotkania, wydrukowaną i przyklejoną na drzwiach do sal wykładowych.&lt;/p&gt;

&lt;p&gt;Temat dosyć stary (2015), ale dopiero od niedawna przeglądarki zaimplementowały
specyfikację. Jeśli chciałbyś poczytać więcej na temat zmiennych w CSS,
&lt;a href=&quot;https://www.w3.org/TR/css-variables/&quot;&gt;zerknij do specyfikacji CSS Variables&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id=&quot;druga-prelekcja--henri-bergius&quot;&gt;Druga prelekcja (&lt;small&gt;@ Henri Bergius&lt;/small&gt;)&lt;/h3&gt;

&lt;blockquote&gt;
  &lt;p&gt;Flow-Based Programming for JavaScript&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Zaczynajmy wreszcie omawiać prelekcje konkretniej!&lt;/p&gt;

&lt;p&gt;Pierwszy talk (na której byłem obecny w 100%) był na temat podejścia
flow-based w programowaniu.&lt;/p&gt;

&lt;p&gt;Chyba popełniłem błąd, że wybrałem tego tracka… prelegent w bardzo nudny
sposób opowiadał o tym podejściu w programowaniu.&lt;/p&gt;

&lt;p&gt;W drugiej sali prelekcja była o TypeScripcie i nie wiem, czy nie lepiej było
udać się do konkurencyjnej sali. No trudno.&lt;/p&gt;

&lt;p&gt;Z trzeciej strony, znam TypeScript na tyle że ciężko by było zaskoczyć
mnie czymś, dlatego nie wybrałem tamtej sali. Chciałem usłyszeć coś nowego.&lt;/p&gt;

&lt;p&gt;No niestety, ani prelekcja, ani temat mnie nie zainteresował.
Kilka linków od autora:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://app.flowhub.io&quot;&gt;app.flowhub.io&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://noflojs.org&quot;&gt;noflojs.org&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;przerwa&quot;&gt;Przerwa!&lt;/h3&gt;

&lt;p&gt;Co ciekawe, po 2 prelekcjach odbyła się &lt;strong&gt;30 minutowa przerwa&lt;/strong&gt;.
Bardzo ciekawe dlaczego organizatorzy zaplanowali tak długą przerwę na
początku konferencji?&lt;/p&gt;

&lt;figure class=&quot;social-center-block&quot;&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;pl&quot; dir=&quot;ltr&quot;&gt;Zobaczcie kogo spotkałem! To &lt;a href=&quot;https://twitter.com/lpawelczak_dev?ref_src=twsrc%5Etfw&quot;&gt;@lpawelczak_dev&lt;/a&gt; we własnej osobie! 👍&lt;a href=&quot;https://twitter.com/hashtag/FrontendCon?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#FrontendCon&lt;/a&gt; &lt;a href=&quot;https://t.co/5Yb8BjVJHE&quot;&gt;pic.twitter.com/5Yb8BjVJHE&lt;/a&gt;&lt;/p&gt;&amp;mdash; Piotr Kowalski (@piecioshka) &lt;a href=&quot;https://twitter.com/piecioshka/status/911166358754349056?ref_src=twsrc%5Etfw&quot;&gt;September 22, 2017&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async=&quot;&quot; src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;

&lt;/figure&gt;

&lt;p&gt;Zobaczymy co będzie się dalej działo po przerwie. Stay tuned!&lt;/p&gt;

&lt;h3 id=&quot;trzecia-prelekcja--kacper-sokołowski&quot;&gt;Trzecia prelekcja (&lt;small&gt;@ Kacper Sokołowski&lt;/small&gt;)&lt;/h3&gt;

&lt;blockquote&gt;
  &lt;p&gt;You use Content Security Policy, don’t you?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;…na temat bezpieczeństwa! &lt;a href=&quot;https://blog.piotrnalepa.pl/2017/08/06/wywiad-z-piotrem-kowalskim-blogerem-youtuberem-i-organizatorem-warsawjs/&quot;&gt;Uwielbiam ten temat&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://twitter.com/kaapa_s&quot;&gt;Kacper&lt;/a&gt; (z &lt;a href=&quot;https://codewise.com/&quot;&gt;CodeWise&lt;/a&gt;), znany prelegent
warszawskich konferencji, opowiedział o atakach na strony internetowe.
Zaczęło się od &lt;a href=&quot;https://sekurak.pl/czym-jest-xss/&quot;&gt;XSS&lt;/a&gt;.&lt;/p&gt;

&lt;blockquote class=&quot;block-average&quot;&gt;
  &lt;p&gt;Nie wiesz co to jest XSS? Zerknij &lt;a href=&quot;https://www.youtube.com/watch?v=ASqS3qposwM&quot;&gt;tutaj&lt;/a&gt; albo &lt;a href=&quot;https://niebezpiecznik.pl/post/10-najpopularniejszych-bledow-w-webaplikacjach/&quot;&gt;tutaj&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;figure class=&quot;social-center-block&quot;&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;Thanks &lt;a href=&quot;https://twitter.com/kaapa_s?ref_src=twsrc%5Etfw&quot;&gt;@kaapa_s&lt;/a&gt; for your talk about security! I like that area of IT 😘 &lt;a href=&quot;https://twitter.com/hashtag/FrontendCon?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#FrontendCon&lt;/a&gt; &lt;a href=&quot;https://t.co/ah2DkJl2fK&quot;&gt;pic.twitter.com/ah2DkJl2fK&lt;/a&gt;&lt;/p&gt;&amp;mdash; Piotr Kowalski (@piecioshka) &lt;a href=&quot;https://twitter.com/piecioshka/status/911178538388262913?ref_src=twsrc%5Etfw&quot;&gt;September 22, 2017&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async=&quot;&quot; src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;

&lt;/figure&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;h2 id=&quot;pytanie-do-czytelników&quot;&gt;Pytanie do czytelników?&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Czy chcielibyście, abym zrobił na blogu kurs na temat XSS?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Poruszył bym takie tematy:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Jak zbadać podatność na ataki XSS?&lt;/li&gt;
  &lt;li&gt;Jak zabezpieczyć aplikację webową na ataki XSS?&lt;/li&gt;
&lt;/ul&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;p&gt;Pierwsza aplikacja jaka padła ofiarą ataku, była zwykłym systemem blogowym.
Prelegent podjął się ataku &lt;code class=&quot;highlighter-rouge&quot;&gt;Session Hijacking&lt;/code&gt; poprzez &lt;code class=&quot;highlighter-rouge&quot;&gt;Cookie Stealing&lt;/code&gt;.
Oczywiście misja zakończyła się sukcesem.&lt;/p&gt;

&lt;p&gt;Z prelekcji można było się sporo dowiedzieć na temat &lt;a href=&quot;https://sekurak.pl/czym-jest-content-security-policy/&quot;&gt;CSP&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;Content Security Policy&lt;/code&gt; opiera się na nagłówkach HTTP. Kiedy tworzymy nowy
projekt to warto zdefiniować listę adresów z których pliki JavaScript będę
ściągane i uruchamiane. Warto zdefiniować także sposób ich wykonywania. Jedyny
minus CSP jest taki, że jest on wspierany przez małą liczbę providerów
“hostingowych”.&lt;/p&gt;

&lt;p&gt;Kacper polecił stronę &lt;a href=&quot;https://www.owasp.org/&quot;&gt;owasp.org&lt;/a&gt;, na której opisane są popularne
błędy w webaplikacjach.&lt;/p&gt;

&lt;h3 id=&quot;czwarta-prelekcja--vitalii-bobrov-glenn-reyes&quot;&gt;Czwarta prelekcja (&lt;small&gt;@ &lt;s&gt;Vitalii Bobrov&lt;/s&gt; Glenn Reyes&lt;/small&gt;)&lt;/h3&gt;

&lt;blockquote&gt;
  &lt;p&gt;Leveraging code-splitting in React apps&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Na początku poszedłem na prelekcje Vitaliia na temat &lt;a href=&quot;https://github.com/angular/angular-cli&quot;&gt;Angular CLI&lt;/a&gt;.
Po kilku zdaniach zrozumiałem, że muszę zmienić track i pójść na drugi na
którym Glenn opowiadał o &lt;code class=&quot;highlighter-rouge&quot;&gt;Code Spliting&lt;/code&gt; w aplikacji opartej na
&lt;a href=&quot;https://www.youtube.com/watch?v=-WDh7l58TVg&quot;&gt;React.js&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;CS to bardzo ważny feature w dzisiejszych aplikacjach. Wchodząc na dowolną
stronę, nie trzeba pobierać i uruchamiać modułów / komponentów, które nie są
na niej potrzebne.&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;Code Splinting&lt;/code&gt;:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;ładuje kod asynchroniczne&lt;/li&gt;
  &lt;li&gt;ładuje kod na żądanie&lt;/li&gt;
  &lt;li&gt;ładuje kod kiedy potrzeba&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Wskazówki od prelegenta:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;zbudowanie bundli:
    &lt;ul&gt;
      &lt;li&gt;1 plik na biblioteki (&lt;code class=&quot;highlighter-rouge&quot;&gt;vendor.js&lt;/code&gt;) - bardzo rzadko się zmienia (można
  cache-ować)&lt;/li&gt;
      &lt;li&gt;1 plik na źródła aplikacji (&lt;code class=&quot;highlighter-rouge&quot;&gt;app.js&lt;/code&gt;) - bardzo często się zmienia&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;podział kodu “per route”&lt;/li&gt;
  &lt;li&gt;podział kodu “per component”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Źródła polecane przez Glenna:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/glennreyes/code-splitting-example&quot;&gt;https://github.com/glennreyes/code-splitting-example&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/tc39/proposal-dynamic-import&quot;&gt;https://github.com/tc39/proposal-dynamic-import&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://babeljs.io/docs/plugins/syntax-dynamic-import/&quot;&gt;https://babeljs.io/docs/plugins/syntax-dynamic-import/&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/thejameskyle/react-loadable&quot;&gt;https://github.com/thejameskyle/react-loadable&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/zeit/next.js/&quot;&gt;https://github.com/zeit/next.js/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;kolejna-długa-przerwa&quot;&gt;Kolejna długa przerwa?&lt;/h3&gt;

&lt;p&gt;Pamiętacie &lt;a href=&quot;/blog/2017/04/19/wygraj-bilet-na-konferencje-js-poland-2017.html&quot;&gt;Mary&lt;/a&gt;, która wygrała pierwszy konkurs uruchomiony na łamach
tego bloga? Dla przypomnienia Mary wygrała bilet na konferencję
&lt;a href=&quot;https://www.facebook.com/events/1455674864463020/&quot;&gt;JS Poland 2017&lt;/a&gt;, jednak podczas tamtej konferencji nie
spotkaliśmy się oko w oko. Spotkaliśmy się za to podczas konferencji &lt;strong&gt;FrontEnd
Connect 2017&lt;/strong&gt;!&lt;/p&gt;

&lt;p&gt;Tym razem przerwa trwała godzinę zegarową. Podczas niej na uczestników czekał
smakowity lunch! Także i ja razem z &lt;a href=&quot;https://www.facebook.com/daniel.siwekk&quot;&gt;Danielem&lt;/a&gt; - mentorem &lt;a href=&quot;https://www.meetup.com/WarsawJS/events/243141164/&quot;&gt;10
edycji WarsawJS Workshop&lt;/a&gt; - zjedliśmy porcję kremu
pomidorowego.&lt;/p&gt;

&lt;blockquote class=&quot;block-good&quot;&gt;
  &lt;p&gt;Mary - jeśli to czytasz - miło było przybić z Tobą piąteczkę!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3 id=&quot;piąta-prelekcja--ferran-negre-pizarro&quot;&gt;Piąta prelekcja (&lt;small&gt;@ Ferran Negre Pizarro&lt;/small&gt;)&lt;/h3&gt;

&lt;blockquote&gt;
  &lt;p&gt;Testing React &amp;amp; Redux applications with the &lt;em&gt;new&lt;/em&gt; Jest:
Snapshots come into play!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href=&quot;https://twitter.com/ferrannp&quot;&gt;Ferran&lt;/a&gt; wygłosił prelekcję na temat testowania z wykorzystaniem
narzędzia &lt;a href=&quot;https://facebook.github.io/jest/&quot;&gt;Jest&lt;/a&gt; oraz mechanizmu &lt;code class=&quot;highlighter-rouge&quot;&gt;Snapshot Testing&lt;/code&gt;.&lt;/p&gt;

&lt;figure class=&quot;social-center-block&quot;&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;Thanks &lt;a href=&quot;https://twitter.com/glnnrys?ref_src=twsrc%5Etfw&quot;&gt;@glnnrys&lt;/a&gt; and &lt;a href=&quot;https://twitter.com/ferrannp?ref_src=twsrc%5Etfw&quot;&gt;@ferrannp&lt;/a&gt; for your talks about &lt;a href=&quot;https://twitter.com/hashtag/react?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#react&lt;/a&gt;! ⚛️ I see that this tool is good idea to build awesome apps &lt;a href=&quot;https://twitter.com/FrontEndConnect?ref_src=twsrc%5Etfw&quot;&gt;@FrontEndConnect&lt;/a&gt; ✨ &lt;a href=&quot;https://t.co/Z8s0FdmFl0&quot;&gt;pic.twitter.com/Z8s0FdmFl0&lt;/a&gt;&lt;/p&gt;&amp;mdash; Piotr Kowalski (@piecioshka) &lt;a href=&quot;https://twitter.com/piecioshka/status/911212146901553153?ref_src=twsrc%5Etfw&quot;&gt;September 22, 2017&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async=&quot;&quot; src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;

&lt;/figure&gt;

&lt;h3 id=&quot;szósta-prelekcja--simona-cotin--artur-daschevici&quot;&gt;Szósta prelekcja (&lt;small&gt;@ Simona Cotin &amp;amp; Artur Daschevici&lt;/small&gt;)&lt;/h3&gt;

&lt;blockquote&gt;
  &lt;p&gt;There and Back again - Angular and React&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Kolejne wprowadzenie do Angulara i Reacta.&lt;/p&gt;

&lt;p&gt;Nie mam dzisiaj ochoty słuchać o tym, jak zacząć nowy projekt
w oparciu o te technologie. Człowiek tyle razy zaczynał projekt
i tutaj nie ma jakiegoś “rocket science” - wchodzisz na pierwszy
lepszy tutorial i kopiujesz polecenia. Tyle.&lt;/p&gt;

&lt;p&gt;Podczas prelekcji było porównanie stworzenia tego samego komponentu
w React-cie oraz Angularze. Prelegenci porównywali liczbę linijek
i wyszło, że React potrzebuje więcej linijek, aby wygenerować komponent, więc
jest lepszy.&lt;/p&gt;

&lt;p&gt;Matko, co za bzdury… od kiedy to liczba linijek kodu developerskiego
jest jakimkolwiek wyznacznikiem, że dana technologia jest lepsza albo gorsza?&lt;/p&gt;

&lt;p&gt;Prelekcja była prowadzona przez dwie osoby, ale i tak całe przemówienie było
według mnie dosyć nudne (chociaż &lt;a href=&quot;https://twitter.com/simona_cotin&quot;&gt;Simona&lt;/a&gt; ładnie się
uśmiechała) i mało wnoszące dla developera, który już posiada doświadczenie
w dowolnych frameworkach (nawet niewielkie).&lt;/p&gt;

&lt;p&gt;Prelegenci porównywali jak przetrzymywany jest stan w aplikacjach zbudowanych
w oparciu o Angulara oraz Reacta (+Reduxa).&lt;/p&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;p&gt;Czy tylko ja uważam, że taka prelekcja jest ZAWSZE na każdej konferencji?
Czy w dzisiejszych czasach, kiedy te dwie technologie są na rynku już dość
długo, potrzebujemy jeszcze prelekcji w stylu “jak zacząć”?&lt;/p&gt;

&lt;p&gt;Dajcie znać w komentarzu, czy zgadzacie się ze mną, czy może posiadacie
jednak inne zdanie w sprawie prelekcji dla początkujących.&lt;/p&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;p&gt;Kolejny omówiony temat to przekazywanie danych pomiędzy komponentami.&lt;/p&gt;

&lt;p&gt;Jak przekazać dane od “dziecka” do “rodzica”? A no dzięki
następującym narzędziom &lt;a href=&quot;https://github.com/mobxjs/mobx&quot;&gt;MobX&lt;/a&gt; lub &lt;a href=&quot;https://github.com/reactjs/redux&quot;&gt;Redux&lt;/a&gt;. Mało tego!
Dzięki ww. narzędziom możliwe jest przekazanie danych z dowolnego miejsca w
aplikacji do innego. Wspaniałe!&lt;/p&gt;

&lt;blockquote class=&quot;block-average&quot;&gt;
  &lt;h3 id=&quot;zatrzymaj-się&quot;&gt;Zatrzymaj się!&lt;/h3&gt;
  &lt;p&gt;Drogi developerze Angulara, może lepiej wykorzystać &lt;code class=&quot;highlighter-rouge&quot;&gt;@ngx-store&lt;/code&gt; do
przekazywania danych między komponentami, zamiast “Outputować” i “Inputować”?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3 id=&quot;siódma-prelekcja--andrey-okonetchnikov&quot;&gt;Siódma prelekcja (&lt;small&gt;@ Andrey Okonetchnikov&lt;/small&gt;)&lt;/h3&gt;

&lt;blockquote&gt;
  &lt;p&gt;Modular CSS&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Druga prelekcja na temat CSS. Tym razem poprowadzona przez
autora &lt;a href=&quot;https://colorsnapper.com/&quot;&gt;Color Snapper&lt;/a&gt; - narzędzia do pobierania koloru z
ekranu.&lt;/p&gt;

&lt;p&gt;Według prelegenta:&lt;/p&gt;

&lt;p&gt;W dzisiejszych czasach wszystkie elementy na stronie są pewnego rodzaju
komponentami, które prezentują stan aplikacji. Tym samym można zapisać
następujące równanie:&lt;/p&gt;

&lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nx&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;state&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;UI&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Następnie Andrey opowiedział o BEM-ie.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Znasz tą technologię? Jeśli nie, &lt;a href=&quot;/blog/2017/05/11/czym-jest-dla-mnie-bem.html&quot;&gt;przeczytaj mój artykuł na ten temat&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/conference-frontend-connect-2017/debugging-with-panda.gif&quot; alt=&quot;3 Pandas&quot; /&gt;
    &lt;figcaption&gt;
        Źródło: &lt;a href=&quot;https://www.reddit.com/r/ProgrammerHumor/comments/4930p8/when_debugging_code/&quot;&gt;Reddit&lt;/a&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Natura BEM-a powoduje, że praca z nim wymaga dużo czasu. Z pomocą przychodzą
nam moduły! Technologia &lt;code class=&quot;highlighter-rouge&quot;&gt;CSS Modules&lt;/code&gt; świetnie się sprawdza razem z BEMem.&lt;/p&gt;

&lt;figure class=&quot;social-center-block&quot;&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;Great talk by Andrey &lt;a href=&quot;https://twitter.com/okonetchnikov?ref_src=twsrc%5Etfw&quot;&gt;@okonetchnikov&lt;/a&gt; about &lt;a href=&quot;https://twitter.com/hashtag/css?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#css&lt;/a&gt; in &lt;a href=&quot;https://twitter.com/hashtag/js?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#js&lt;/a&gt; at &lt;a href=&quot;https://twitter.com/FrontEndConnect?ref_src=twsrc%5Etfw&quot;&gt;@FrontEndConnect&lt;/a&gt; 💪🏻🌟 &lt;a href=&quot;https://t.co/kCrGWv8fvs&quot;&gt;pic.twitter.com/kCrGWv8fvs&lt;/a&gt;&lt;/p&gt;&amp;mdash; Piotr Kowalski (@piecioshka) &lt;a href=&quot;https://twitter.com/piecioshka/status/911249664132907014?ref_src=twsrc%5Etfw&quot;&gt;September 22, 2017&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async=&quot;&quot; src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;

&lt;/figure&gt;

&lt;p&gt;JSS (&lt;a href=&quot;http://cssinjs.org&quot;&gt;cssinjs.org&lt;/a&gt;)&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Niepotrzebny jest proces budowania aplikacji&lt;/li&gt;
  &lt;li&gt;Usuwa jest nieużywany kod&lt;/li&gt;
  &lt;li&gt;Automatycznie dodawane są prefixy do podmiotów zewnętrznych (bibliotek)&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
  &lt;p&gt;Generalnie warto przetestować w swoim projekcie!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3 id=&quot;ósma-prelekcja-pierwszego-dnia-konferencji&quot;&gt;Ósma prelekcja pierwszego dnia konferencji&lt;/h3&gt;

&lt;p&gt;Prelekcja poświęcona miękkim skillom, m.in. zaufaniu managera dla
zespołu developerskiemu.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/conference-frontend-connect-2017/scrum-what-should-be-current-state.gif&quot; alt=&quot;&quot; /&gt;
    &lt;figcaption&gt;
        Scrum Daily Meeting: Jak powinno wyglądać? A jak jest u nas.
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h3 id=&quot;dziewiąta-ostatnia-pierwszego-dnia-prelekcja---ruth-john&quot;&gt;Dziewiąta (ostatnia pierwszego dnia) prelekcja  (&lt;small&gt;@ Ruth John&lt;/small&gt;)&lt;/h3&gt;

&lt;blockquote&gt;
  &lt;p&gt;How To Be a Web AV Artist&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Podczas prelekcji &lt;a href=&quot;https://twitter.com/rumyra&quot;&gt;Ruth&lt;/a&gt; pokazała jak za pomocą JavaScript stworzyć
muzykę a co najciekawsze, jak pod tą muzykę stworzyć wizualizacje!&lt;/p&gt;

&lt;p&gt;Dzięki udostępnieniu mikrofonu możemy w locie tworzyć bardzo ciekawe
wizualizacje. Temat bardzo mi się spodobał, szczególnie ze względu na sposób
poprowadzenia prelekcji. No i te piękne slajdy… Good job Ruth!&lt;/p&gt;

&lt;figure class=&quot;social-center-block&quot;&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;Wow! Beautiful slides by &lt;a href=&quot;https://twitter.com/Rumyra?ref_src=twsrc%5Etfw&quot;&gt;@Rumyra&lt;/a&gt; at &lt;a href=&quot;https://twitter.com/hashtag/FrontendCon?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#FrontendCon&lt;/a&gt; conference 🌇 Great talk ‼️ &lt;a href=&quot;https://t.co/oeDvFlvg1o&quot;&gt;pic.twitter.com/oeDvFlvg1o&lt;/a&gt;&lt;/p&gt;&amp;mdash; Piotr Kowalski (@piecioshka) &lt;a href=&quot;https://twitter.com/piecioshka/status/911262843449827329?ref_src=twsrc%5Etfw&quot;&gt;September 22, 2017&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async=&quot;&quot; src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;

&lt;/figure&gt;

&lt;p&gt;Na swoim profilu na &lt;a href=&quot;https://codepen.io/Rumyra/&quot;&gt;Codepen&lt;/a&gt;, Ruth posiada ogromną ilość
wizualizacji dźwięku. Polecam zerknąć!&lt;/p&gt;

&lt;p&gt;Prace Ruth można także zobaczyć w organizacji &lt;a href=&quot;https://github.com/livejs&quot;&gt;livejs na GitHubie&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;heroes-party--evojam--&quot;&gt;HEROES PARTY (&lt;small&gt;@ Evojam&lt;/small&gt;) 🎊 🍻&lt;/h2&gt;

&lt;p&gt;Po prelekcjach organizatorzy zorganizowali imprezkę. Raczej to taki
networking z lemoniadą, chipsami i karaoke. Obecny był także DJ oraz foto budka.
&lt;strong&gt;Świetny pomysł!&lt;/strong&gt;&lt;/p&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;p&gt;Nie byłem obecny drugiego dnia konferencji więc nie wiem co się podczas tego
dnia działo. Warto zerknąć na hashtag: &lt;a href=&quot;twitter.com/hashtag/FrontendCon2017&quot;&gt;#FrontendCon2017&lt;/a&gt;&lt;/p&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;h2 id=&quot;-wskazówki-dla-organizatorów&quot;&gt;&lt;i class=&quot;icon-average&quot;&gt;&lt;/i&gt; Wskazówki dla organizatorów&lt;/h2&gt;

&lt;p&gt;…aby kolejna edycja konferencji była jeszcze lepsza!&lt;/p&gt;

&lt;h3 id=&quot;1-wolne-działanie-strony-internetowej&quot;&gt;1. Wolne działanie strony internetowej&lt;/h3&gt;

&lt;p&gt;I to nie jest jakieś moje widzi-misie, ale kilkadziesiąt sekund aż się
strona załaduje spowoduje, że dowolny internauta tego nie zaakceptuje.&lt;/p&gt;

&lt;p&gt;Podczas konferencji strona bardzo często zwracała następujący komunikat&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/conference-frontend-connect-2017/504.png&quot; alt=&quot;504&quot; /&gt;
    &lt;figcaption&gt;
        HTTP Status 504
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h3 id=&quot;2-wersja-mobilna-strony-konferencji-pozostawiała-wiele-do-życzenia&quot;&gt;2. Wersja mobilna strony konferencji pozostawiała wiele do życzenia&lt;/h3&gt;

&lt;p&gt;Nie mogłem zobaczyć jak jest agenda spotkania! Na to będę mocno narzekał.
Podczas konferencji uczestnicy muszą wiedzieć jaki jest plan. Od tego
jest strona internetowa aby INFORMOWAŁA.&lt;/p&gt;

&lt;h3 id=&quot;3-niewykorzystana-przestrzeń-na-identyfikatorze&quot;&gt;3. Niewykorzystana przestrzeń na identyfikatorze&lt;/h3&gt;

&lt;p&gt;Każdy przy rejestracji dostaje identyfikator, na którym jest nasze imię
i nazwisko, oraz na odwrocie… agenda spotkania! Tak bardzo ważna
informacja, której zabrakło.&lt;/p&gt;

&lt;p&gt;Jeśli organizatorzy nie chcieli wrzucać agendy (nie wiadomo jakiego
powodu) to chociaż mogli oddać to miejsca dla sponsorów. Wyobrażam sobie,
że taki &lt;strong&gt;Gold Sponsor&lt;/strong&gt;, mógłby wrzucić tutaj swoje logo, albo
ogłoszenie o pracę. A tutaj “tabula rasa”. Smutne.&lt;/p&gt;

&lt;h2 id=&quot;-za-co-chciałbym-pochwalić-tegoroczną-edycję&quot;&gt;&lt;i class=&quot;icon-good&quot;&gt;&lt;/i&gt; Za co chciałbym pochwalić tegoroczną edycję?&lt;/h2&gt;

&lt;h3 id=&quot;1-uśmiech-osób-w-rejestracji&quot;&gt;1. Uśmiech osób w rejestracji&lt;/h3&gt;

&lt;p&gt;Kiedyś mój kolega powiedział mi pewne zdanie, które ciągle pamiętam i
powtarzam je sobie pod nosem. Nie przytoczę go tutaj dokładnie bo nie
chcę używać wulgaryzmów w swojej publikacji, ale główny sens na pewno
będzie dla Was jasny:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;“Najważniejsze jest pierwsze wrażenie”
&lt;small&gt;Zdzisław Sondej (2009)&lt;/small&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3 id=&quot;2-panele-dyskusyjne-podczas-przerw&quot;&gt;2. Panele dyskusyjne podczas przerw&lt;/h3&gt;

&lt;p&gt;Długie przerwy miały swój plus. Można było porozmawiać z prelegentami,
którzy wyszli wcześniej na scenę ze swoją prelekcją, i zadać dowolne
pytanie.&lt;/p&gt;

&lt;figure class=&quot;social-center-block&quot;&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;At conference we have a chance to speak with speakers on small discussion panels 😀Good idea &lt;a href=&quot;https://twitter.com/FrontEndConnect?ref_src=twsrc%5Etfw&quot;&gt;@FrontEndConnect&lt;/a&gt; 👍 &lt;a href=&quot;https://t.co/a9EtmncHY0&quot;&gt;pic.twitter.com/a9EtmncHY0&lt;/a&gt;&lt;/p&gt;&amp;mdash; Piotr Kowalski (@piecioshka) &lt;a href=&quot;https://twitter.com/piecioshka/status/911175066481827840?ref_src=twsrc%5Etfw&quot;&gt;September 22, 2017&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async=&quot;&quot; src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;

&lt;/figure&gt;

&lt;h3 id=&quot;3-stoliki-technologiczne&quot;&gt;3. Stoliki technologiczne&lt;/h3&gt;

&lt;p&gt;Podczas konferencji na stolikach “barowych” stały tabliczki z nazwami
technologi o których się rozmawiało. Można było porozmawiać o takich
technologiach jak: React.js, HTML5, Angular, RxJS czy Vue.js które
ściągnęło największą liczbę chętnych do rozmowy.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/conference-frontend-connect-2017/tech-tables.gif&quot; alt=&quot;&quot; /&gt;
&lt;/figure&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;h2 id=&quot;podsumowanie&quot;&gt;Podsumowanie&lt;/h2&gt;

&lt;p&gt;Serdecznie dziękuję organizatorom za zaproszenie ❤️&lt;/p&gt;

&lt;p&gt;Cieszę się, że zobaczyłem kolejny raz jak zorganizowana jest
konferencja. FrontEnd Connect 2017 ma trochę rzeczy na sumieniu, ale i tak
warto było przyjść i posłuchać o nowościach w branży.&lt;/p&gt;

&lt;p&gt;Do zobaczenia na kolejnej konferencji czyli &lt;a href=&quot;https://www.facebook.com/events/1606726552692010/&quot;&gt;NG Poland 2017&lt;/a&gt;
21 listopada.&lt;/p&gt;

&lt;!-- Resources --&gt;

</description>
            <pubDate>Sun, 24 Sep 2017 09:22:10 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2017/09/24/konferencja-frontend-connect-2017.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2017/09/24/konferencja-frontend-connect-2017.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/conference-frontend-connect-2017/logo-526x276.jpg</image>
        </item>
        
        <item>
            <title>Angular Warsaw #13 + Moja prelekcja</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Dziś opowiem Wam trochę o moich doświadczeniach z Angularową sceną, czyli
kilka słów o &lt;strong&gt;mojej ostatniej prelekcji&lt;/strong&gt; podczas Angular&lt;s&gt;JS&lt;/s&gt;
Warsaw #13.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/angular-warsaw/logo/logo-400x400.png&quot; alt=&quot;&quot; /&gt;
    &lt;figcaption&gt;
        Nowe logo organizacji &lt;a href=&quot;https://www.meetup.com/Angular-Warsaw/&quot;&gt;Angular Warsaw&lt;/a&gt;.
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;zmiana-nazwy-organizacji&quot;&gt;Zmiana nazwy organizacji&lt;/h2&gt;

&lt;p&gt;Pierwsze o czym należy wspomnieć (poza aktualizacją loga - &lt;a href=&quot;/tag/angularjs-warsaw/&quot;&gt;zobacz
poprzednie&lt;/a&gt; artykuły na temat Angularowych meetupów) to zmiana nazwy
organizacji:&lt;/p&gt;

&lt;hr /&gt;

&lt;p class=&quot;center-text&quot;&gt;&lt;strong&gt;AngularJS Warsaw&lt;/strong&gt; &lt;small&gt;➜&lt;/small&gt; &lt;strong&gt;Angular Warsaw&lt;/strong&gt;&lt;/p&gt;

&lt;hr /&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/angular-warsaw/meetup-13/ng-13-banner-meetup.png&quot; alt=&quot;&quot; /&gt;
    &lt;figcaption&gt;
        Banner promujący wydarzenie. Źródło &lt;a href=&quot;https://www.meetup.com/preview/Angular-Warsaw/events/242530230&quot;&gt;Meetup.com&lt;/a&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;bycie-prelegentem&quot;&gt;Bycie prelegentem&lt;/h2&gt;

&lt;p&gt;To już drugi raz kiedy byłem prelegentem podczas tej serii meetupów. Co
ciekawe pierwszy raz na Angularowej scenie zawitałem podczas 3-ej edycji
AngularJS Warsaw, &lt;strong&gt;równo 2 lata temu&lt;/strong&gt;, tj: 26-08-2015.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bardzo dziękuję &lt;a href=&quot;https://twitter.com/ngKalbarczyk&quot;&gt;Darkowi&lt;/a&gt;&lt;/strong&gt;, które mnie zaprosił do bycia speakerem
podczas kolejnej edycji spotkania fanów Angulara.&lt;/p&gt;

&lt;p&gt;Mogłem coś powiedzieć o Angularze jak i o bibliotece, która jest mocno
wykorzystywana tj. &lt;a href=&quot;reactivex.io/rxjs/&quot;&gt;RxJS&lt;/a&gt;. Kto jeszcze nie zna niech wpadnie
&lt;a href=&quot;http://rxmarbles.com/&quot;&gt;tutaj&lt;/a&gt;.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/angular-warsaw/meetup-13/ng-13-banner-twitter.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;figcaption&gt;
        Banner promujący wydarzenie. Źródło &lt;a href=&quot;https://twitter.com/ngKalbarczyk/status/899540884206833665&quot;&gt;Twitter.com&lt;/a&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;przygotowania&quot;&gt;Przygotowania&lt;/h2&gt;

&lt;p&gt;Do czasu jaki trzeba zawsze poświęcić przygotowując się do prelekcji
chciałbym doliczyć czas jaki przygotowywałem się do szkolenia &lt;a href=&quot;https://www.facebook.com/events/319531535165812/&quot;&gt;WarsawJS
Workshop #9&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Na potrzeby szkolenia stworzyłem następujące projekty:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/piecioshka/warsawjs-workshop-9-rxjs-try&quot;&gt;github.com/piecioshka/warsawjs-workshop-9-rxjs-try&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/piecioshka/mutable-vs-immutable&quot;&gt;github.com/piecioshka/mutable-vs-immutable&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;które bardzo pomogły mi podczas zrozumienia zasad panujących w bibliotece
RxJS oraz generalnie w programowaniu reaktywnym.&lt;/p&gt;

&lt;h2 id=&quot;talk-1-tdd-angularjs-application-pl-wojtek-przechodzeń&quot;&gt;Talk #1: TDD AngularJS application [PL] &lt;small&gt;Wojtek Przechodzeń&lt;/small&gt;&lt;/h2&gt;

&lt;p&gt;Niestety nie wiem o czym Wojtek opowiadał, ponieważ na spotkanie przyszedłem
delikatnie spóźniony i usłyszałem tylko brawa kończące prelekcję.&lt;/p&gt;

&lt;p&gt;Wojciech przygotował 3 projekty, które pomogły mu przedstawić omawiany problem.
&lt;strong&gt;Jeśli jesteś zainteresowany autorskim projektem&lt;/strong&gt;, który jest
wykorzystywany w Wojtka firmie do pisania testów w Angular.js to zerknij na
następujące linki:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/woprzech/angular-warsaw-angular-test-runner&quot;&gt;github.com/woprzech/angular-warsaw-angular-test-runner&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/woprzech/angular-test-runner-es6&quot;&gt;github.com/woprzech/angular-test-runner-es6&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/Pragmatists/angular-test-runner&quot;&gt;github.com/Pragmatists/angular-test-runner&lt;/a&gt; - autorski
  projekt Wojtka i jego kolegów z pracy&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Po prelekcji zrobiłem delikatny wywiad z uczestnikami, z którego wynikało, że
&lt;strong&gt;prelekcja była bardzo interesująca&lt;/strong&gt;. Tym samym z tego miejsca chciałem
pogratulować wystąpienia 🏆&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Slajdy: &lt;a href=&quot;https://www.slideshare.net/WojciechPrzechodze/tdd-angularjs-application&quot;&gt;slideshare.net/WojciechPrzechodze/tdd-angularjs-application&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Kontakt do prelegenta: &lt;a href=&quot;https://twitter.com/wprzechodzen&quot;&gt;@wprzechodzen&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;h2 id=&quot;talk-2-angular-pierwsze-kroki-pl-dariusz-kalbarczyk&quot;&gt;Talk #2: Angular pierwsze kroki [PL] &lt;small&gt;Dariusz Kalbarczyk&lt;/small&gt;&lt;/h2&gt;

&lt;p&gt;Druga prelekcja spotkania - &lt;strong&gt;którą po prowadził organizator&lt;/strong&gt; - była na temat
zapoznania się z nowym światem Angulara w wersji 4.&lt;/p&gt;

&lt;p&gt;Znakomita większość ludzi &lt;strong&gt;programuje jeszcze w Angular.js&lt;/strong&gt;, jednak wiele z
nich chciałoby się przesiąść na nową wersję (a raczej na nowy framework).&lt;/p&gt;

&lt;p&gt;Podczas prelekcji mogliśmy się dowiedzieć co nowego pojawiło się w
nowym Angularze.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Slajdy: &lt;a href=&quot;https://issuu.com/dariuszkalbarczyk/docs/angularwarsaw13.pptx&quot;&gt;issuu.com/dariuszkalbarczyk/docs/angularwarsaw13.pptx&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Link do prelekcji: &lt;a href=&quot;https://www.youtube.com/watch?v=RhrxDynq8hI&quot;&gt;youtube.com/watch?v=RhrxDynq8hI&lt;/a&gt;
    &lt;ul&gt;
      &lt;li&gt;Jak myślicie kto nagrywał i zmontował film?&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Kontakt do prelegenta: &lt;a href=&quot;https://twitter.com/ngKalbarczyk&quot;&gt;@ngKalbarczyk&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;h2 id=&quot;talk-3-rxjs-okiem-doświadczonego-inżyniera-pl-piotr-kowalski&quot;&gt;Talk #3: RxJS okiem doświadczonego inżyniera [PL] &lt;small&gt;Piotr Kowalski&lt;/small&gt;&lt;/h2&gt;

&lt;p&gt;Moja pierwsza prelekcja podczas AngularJS Warsaw &lt;strong&gt;nie była nagrywana&lt;/strong&gt;. A
szkoda, bo pamiętam, że &lt;strong&gt;wielu ludziom się podobała&lt;/strong&gt;. Tym razem
&lt;strong&gt;przechytrzyłem system&lt;/strong&gt; i nagrałem ją swoim aparatem.&lt;/p&gt;

&lt;p&gt;Nie będę się dłużej rozpisywał (co by sztucznie nie przeciągać). Jeśli masz 20
kilka minut to zapraszam do oglądania “chachłackiej” prelekcji (albo nawet do
wysłuchania, bo nie ma szczególnie na co patrzeć - lepiej otworzyć slajdy).&lt;/p&gt;

&lt;div class=&quot;youtube-lazy&quot; data-youtube-id=&quot;HYuoB9qNqMI&quot;&gt;&lt;/div&gt;

&lt;p&gt;W przygotowaniach do prelekcji stworzyłem &lt;strong&gt;jeszcze jeden projekt&lt;/strong&gt;, który to
obrazuje &lt;strong&gt;najpopularniejszy problem z programowaniu sieciowym&lt;/strong&gt;, tj. &lt;strong&gt;Race
Condition&lt;/strong&gt; - czyli tzw. wyścigi. Nie ma nic bardziej frustrującego jak
niedeterministyczny problem - czyli taki, która raz się pojawia raz nie.&lt;/p&gt;

&lt;p&gt;Zainteresowanych odsyłam do &lt;a href=&quot;https://github.com/piecioshka/angular-rxjs-race-condition-problem&quot;&gt;projektu na GitHubie&lt;/a&gt;.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Slajdy: &lt;a href=&quot;https://piecioshka.github.io/slides-rxjs-look-behind/&quot;&gt;piecioshka.github.io/slides-rxjs-look-behind/&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Link do prelekcji: &lt;a href=&quot;https://www.youtube.com/watch?v=HYuoB9qNqMI&quot;&gt;youtube.com/watch?v=HYuoB9qNqMI&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Kontakt do prelegenta: &lt;a href=&quot;https://twitter.com/piecioshka&quot;&gt;@piecioshka&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;h2 id=&quot;sponsorzy-spotkania&quot;&gt;Sponsorzy spotkania&lt;/h2&gt;

&lt;p&gt;Podziękowania należą się sponsorowi, tj. firmie &lt;a href=&quot;http://www.7n.com/&quot;&gt;7N&lt;/a&gt;, w
której pracuje organizator spotkań - &lt;a href=&quot;https://twitter.com/ngKalbarczyk&quot;&gt;Dariusz&lt;/a&gt;.
Firma szuka pracowników, więc jeśli szukasz pracy to uderz do nich.&lt;/p&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;p&gt;Kolejna prelekcja jaką wygłoszę odbędzie się podczas &lt;strong&gt;3 urodzin WarsawJS&lt;/strong&gt;.
Wydarzenie odbędzie się 13 września w restauracji
&lt;a href=&quot;http://bit.ly/warsawjs-the-place&quot;&gt;“The Place”&lt;/a&gt; w Warsaw Spire.&lt;/p&gt;

&lt;!-- Resources --&gt;

</description>
            <pubDate>Wed, 30 Aug 2017 22:02:10 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2017/08/30/angular-warsaw-13.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2017/08/30/angular-warsaw-13.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/angular-warsaw/logo/logo-526x275.jpg</image>
        </item>
        
        <item>
            <title>Widziałeś kiedyś pliki *.swp? Kilka słów o plikach tymczasowych w Vimie</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Jeśli nie jesteś użytkownikiem edytora &lt;strong&gt;Vim&lt;/strong&gt;, to ten artykuł może nie być dla
Ciebie. Jeśli jednak ciekawi Cię co chciałbym Ci dziś pokazać to zapraszam do
niniejszego artykułu.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/vim-backup-directory/vim-temp-files.jpg&quot; itemprop=&quot;image&quot; alt=&quot;Baner promujący artykuł&quot; /&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;vim&quot;&gt;Vim&lt;/h2&gt;

&lt;p&gt;Nie będę w tym artykule rozpisywał się dlaczego jestem użytkownikiem tego
edytora. Nie chcę też pisać o jego korzyściach (&lt;a href=&quot;/blog/2015/01/23/vimium-plugin-do-twojej-przegladarki.html&quot;&gt;pomimo tego, że jest to
pierwszy artykuł na jego temat&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;Chcę Ci powiedzieć jak przyjemnie zaczęło mi się korzystać z edytora, kiedy
ustawiłem w konfiguracji pewną opcję. &lt;strong&gt;Dzięki jednej linijce konfiguracji
dałem sobie kolejny zastrzyk empatii dla tego edytora.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Przechodząc do sedna.&lt;/p&gt;

&lt;p&gt;Jestem przekonany, że wiele razy wpadałeś w konsternację kiedy
widziałeś / widziałaś (oczywiście nie piszę artykułów tylko do mężczyzn, jednak
nie będę za każdym razem pisał obu form) sytuację podobną do tej:&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/vim-backup-directory/vim-stress-situation.png&quot; alt=&quot;&quot; /&gt;
    &lt;figcaption&gt;
        Mnogość plików tymczasowych powala.
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;po-co-są-pliki-swp&quot;&gt;Po co są pliki &lt;code class=&quot;highlighter-rouge&quot;&gt;*.swp&lt;/code&gt;?&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;http://www.vim.org/&quot;&gt;Edytor Vim&lt;/a&gt; w domyślnej konfiguracji tworzy pliki kopii zapasowej w tym
samym katalogu co plik źródłowy. &lt;strong&gt;Po to, aby móc przywrócić oryginalną wersję
pliku, kiedy np. komputer się wyłączy (np. z powodu braku amunicji w baterii).&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Z jednej strony jest to sympatyczne, bo wiesz gdzie jest taki plik z kopią.
Jednak z drugiej strony widzisz “prawie”&lt;sup id=&quot;fnref:1&quot;&gt;&lt;a href=&quot;#fn:1&quot; class=&quot;footnote&quot;&gt;1&lt;/a&gt;&lt;/sup&gt; zawsze zdublowaną strukturę
plików, kiedy otworzysz np. kilka instancji edytora.&lt;/p&gt;

&lt;h2 id=&quot;jak-sobie-poradzić&quot;&gt;Jak sobie poradzić?&lt;/h2&gt;

&lt;p&gt;Możemy ustawić, aby &lt;strong&gt;edytor zapisywał pliki z backupami gdzieś indziej&lt;/strong&gt;,
np. w katalogu z konfiguracjami edytora - w katalogu domowym użytkownika
tj. &lt;code class=&quot;highlighter-rouge&quot;&gt;~/.vim/swp/&lt;/code&gt;.&lt;/p&gt;

&lt;blockquote class=&quot;block-good&quot;&gt;
  &lt;h3 id=&quot;-wskazówka&quot;&gt;&lt;i class=&quot;icon-good&quot;&gt;&lt;/i&gt; Wskazówka&lt;/h3&gt;
  &lt;p&gt;Przed dodaniem magicznej linijki, zobacz co aktualnie kryje się
pod zmienną &lt;code class=&quot;highlighter-rouge&quot;&gt;directory&lt;/code&gt; wydając polecenie (w otworzonym edytorze):&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;set &lt;/span&gt;directory

&lt;span class=&quot;c&quot;&gt;# albo&lt;/span&gt;

&lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &amp;amp;directory
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Dla przykładu mój wynik:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;directory&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;.,~/tmp,/var/tmp,/tmp
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Jeśli chciałbyś dopisać katalog na początek listy to możesz to zrobić za pomocą
polecenia:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;set &lt;/span&gt;directory^&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$HOME&lt;/span&gt;/.vim/swp/

&lt;span class=&quot;c&quot;&gt;# Poskutkuje to zmianą wartości w zmiennej &quot;directory&quot; na:&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;directory&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$HOME&lt;/span&gt;/.vim/swp/,.,~/tmp,/var/tmp,/tmp
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Aby dopisać na koniec listy, wykorzystaj operator &lt;code class=&quot;highlighter-rouge&quot;&gt;+=&lt;/code&gt;, np.&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;set &lt;/span&gt;directory+&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$HOME&lt;/span&gt;/.vim/swp/

&lt;span class=&quot;c&quot;&gt;# Poskutkuje to zmianą wartości w zmiennej &quot;directory&quot; na:&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;directory&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;.,~/tmp,/var/tmp,/tmp,&lt;span class=&quot;nv&quot;&gt;$HOME&lt;/span&gt;/.vim/swp/
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;i class=&quot;icon-poor&quot;&gt;&lt;/i&gt; &lt;strong&gt;Druga opcja nie rozwiąże problemu.&lt;/strong&gt; Edytor
będzie sprawdzał, czy może zapisać pliki tymczasowe w kolejnych katalogach.
Zacznie od &lt;code class=&quot;highlighter-rouge&quot;&gt;.&lt;/code&gt;, czyli od katalogu w którym edytowany jest plik.&lt;/p&gt;

&lt;h2 id=&quot;czy-mogę-wyświetlić-moje-pliki-tymczasowe&quot;&gt;Czy mogę wyświetlić moje pliki tymczasowe?&lt;/h2&gt;

&lt;p&gt;Oczywiście. Uruchom narzędzie, które jest schowane pod przełącznikiem &lt;code class=&quot;highlighter-rouge&quot;&gt;-r&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;&lt;kbd&gt;Copy + paste&lt;/kbd&gt;&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;vim &lt;span class=&quot;nt&quot;&gt;-r&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Polecenie przeszukuje katalogi (ustawione w zmiennej &lt;code class=&quot;highlighter-rouge&quot;&gt;directory&lt;/code&gt;)
oraz prezentuje stan plików o rozszerzeniu &lt;code class=&quot;highlighter-rouge&quot;&gt;.swp&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Kiedy narzędzie nie znajdzie nic, zwróci coś w tym stylu:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;Swap files found:
   In directory ~/.vim/swp/:
      &lt;span class=&quot;nt&quot;&gt;--&lt;/span&gt; none &lt;span class=&quot;nt&quot;&gt;--&lt;/span&gt;
   In current directory:
      &lt;span class=&quot;nt&quot;&gt;--&lt;/span&gt; none &lt;span class=&quot;nt&quot;&gt;--&lt;/span&gt;
   In directory ~/tmp:
      &lt;span class=&quot;nt&quot;&gt;--&lt;/span&gt; none &lt;span class=&quot;nt&quot;&gt;--&lt;/span&gt;
   In directory /var/tmp:
      &lt;span class=&quot;nt&quot;&gt;--&lt;/span&gt; none &lt;span class=&quot;nt&quot;&gt;--&lt;/span&gt;
   In directory /tmp:
      &lt;span class=&quot;nt&quot;&gt;--&lt;/span&gt; none &lt;span class=&quot;nt&quot;&gt;--&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;ups-mamy-problem&quot;&gt;Ups… mamy problem&lt;/h2&gt;

&lt;p&gt;W tej sytuacji w katalogu &lt;code class=&quot;highlighter-rouge&quot;&gt;~/.vim/swp/&lt;/code&gt; edytor będzie tworzyły pliki z
prefiksem kropki (&lt;code class=&quot;highlighter-rouge&quot;&gt;.&lt;/code&gt;) oraz z rozszerzeniem &lt;code class=&quot;highlighter-rouge&quot;&gt;.swp&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Gdy głębiej się zastanowisz, to &lt;strong&gt;sytuacja nie przewiduje pewnego przypadku.&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Co jeśli będę chciał edytować dwa pliki &lt;code class=&quot;highlighter-rouge&quot;&gt;index.html&lt;/code&gt;?&lt;br /&gt;
Czy utworzą się wtedy dwa pliki &lt;code class=&quot;highlighter-rouge&quot;&gt;.index.html.swp&lt;/code&gt;?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Nie. No bo &lt;strong&gt;jakim cudem mogły by istnieć dwa pliki o tej samej nazwie w tym
samym katalogu?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Naszym oczom ukaże się błąd w stylu:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;E325: ATTENTION
Found a swap file by the name &lt;span class=&quot;s2&quot;&gt;&quot;~/.vim/swp/index.html.swp&quot;&lt;/span&gt;
    ...
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Edytor da nam możliwość przywrócenia poprzedniej wersji pliku - tej przed
otworzeniem.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Więcej na temat błędu znajdziesz w pomocy &lt;code class=&quot;highlighter-rouge&quot;&gt;:h e325&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Co teraz? Czy nie będę mógł edytować dwóch plików &lt;code class=&quot;highlighter-rouge&quot;&gt;index.html&lt;/code&gt;?&lt;/p&gt;

&lt;p&gt;Spokojnie. Wystarczy drobna poprawka i &lt;strong&gt;będzie śmigać.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Dodaj “slesza” (&lt;code class=&quot;highlighter-rouge&quot;&gt;/&lt;/code&gt;) do Twojej ścieżki. &lt;strong&gt;Vim rozpozna, że chcesz by pliki
tymczasowe posiadały w nazwie strukturę katalogów w której się znajdują.&lt;/strong&gt; Tym
samym unikniesz kolizji!&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Poprawne ustawienie katalogu z plikami tymczasowymi:&lt;/em&gt;&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;set &lt;/span&gt;directory^&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$HOME&lt;/span&gt;/.vim/swp//
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;Dodaj powyższą linijkę do pliku &lt;code class=&quot;highlighter-rouge&quot;&gt;~/.vimrc&lt;/code&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/vim-backup-directory/vim-custom-temp-files.png&quot; alt=&quot;&quot; /&gt;
    &lt;figcaption&gt;
        Przykład jak wyglądają pliki tymczasowe, kiedy otwarte są dwa pliki
        &lt;code&gt;index.html&lt;/code&gt;. &lt;strong&gt;Problem solved!&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;droga-na-skróty&quot;&gt;Droga na skróty&lt;/h2&gt;

&lt;p&gt;Jeśli chcesz mieć święty spokój to najlepiej jest uruchomić Vima z opcją
&lt;code class=&quot;highlighter-rouge&quot;&gt;-n&lt;/code&gt;. &lt;strong&gt;Opcja ta powoduje, że plik tymczasowy nigdy nie zostanie stworzony
przez uruchomioną instancję programu.&lt;/strong&gt; Tym samym nigdy nie będziesz mieć
możliwości przywrócenie stanu pliku do poprzedniego. Coś za coś.&lt;/p&gt;

&lt;p&gt;&lt;kbd&gt;Copy + paste&lt;/kbd&gt;&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;vim &lt;span class=&quot;nt&quot;&gt;-n&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Albo!&lt;/p&gt;

&lt;p&gt;Podczas uruchomionego edytora możesz zmienić opcję &lt;code class=&quot;highlighter-rouge&quot;&gt;updatecount&lt;/code&gt; na &lt;code class=&quot;highlighter-rouge&quot;&gt;0&lt;/code&gt;, co
daje podobny efekt, tzn. nie są rejestrowane zmiany w pliku. &lt;strong&gt;Co ciekawe,
już stworzony plik &lt;code class=&quot;highlighter-rouge&quot;&gt;.swp&lt;/code&gt; nie zostanie usunięty.&lt;/strong&gt;&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;set &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;uc&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;0
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Albo…&lt;/p&gt;

&lt;p&gt;Możesz zastosować nową opcję w konfiguracji, aby nie tworzyć tego rodzaju
plików tymczasowych. Dodaj następującą linijkę w pliku &lt;code class=&quot;highlighter-rouge&quot;&gt;.vimrc&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;set &lt;/span&gt;noswapfile
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Teraz będziesz mieć &lt;a href=&quot;http://www.filmweb.pl/serial/%C5%9Awi%C4%99ty-1962-103187&quot;&gt;święty spokój&lt;/a&gt;.&lt;/p&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;h2 id=&quot;podsumowanie&quot;&gt;Podsumowanie&lt;/h2&gt;

&lt;p&gt;Aby wydzielić pliki &lt;code class=&quot;highlighter-rouge&quot;&gt;*.swp&lt;/code&gt; do zewnętrznego katalogu:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1) Stwórz katalog na pliki tymczasowe:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;kbd&gt;Copy + paste&lt;/kbd&gt;&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;mkdir&lt;/span&gt; ~/.vim/swp/
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;2) Dopisz do pliku &lt;code class=&quot;highlighter-rouge&quot;&gt;.vimrc&lt;/code&gt;:&lt;/strong&gt;&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;set &lt;/span&gt;directory^&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;$HOME&lt;/span&gt;/.vim/swp//
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;bibliografia&quot;&gt;Bibliografia&lt;/h2&gt;

&lt;p&gt;Wersja angielska artykułu dostępna jest tutaj: &lt;a href=&quot;https://vi.stackexchange.com/a/179/13884&quot;&gt;vi.stackexchange.com/a/179/13884&lt;/a&gt;&lt;/p&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;!-- Resources --&gt;

&lt;div class=&quot;footnotes&quot;&gt;
  &lt;ol&gt;
    &lt;li id=&quot;fn:1&quot;&gt;
      &lt;p&gt;Dla przypomnienia: “&lt;a href=&quot;https://www.youtube.com/watch?v=HMIv9ebiAt0&quot;&gt;prawie&lt;/a&gt; robi wielką różnicę”. &lt;a href=&quot;#fnref:1&quot; class=&quot;reversefootnote&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
  &lt;/ol&gt;
&lt;/div&gt;
</description>
            <pubDate>Wed, 16 Aug 2017 22:46:26 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2017/08/16/vim-porzadek-z-plikami-tymczasowymi.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2017/08/16/vim-porzadek-z-plikami-tymczasowymi.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/vim-backup-directory/vim-temp-files.jpg</image>
        </item>
        
        <item>
            <title>Jak napisać testy end-to-end? Nightwatch.js &amp; Chrome Headless?</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Podczas tego weekendu poznałem Mateusza - testera oprogramowania, który chce
się przebranżowić. Wiecie kim chce zostać? No nie uwierzycie. Chce zostać
Front-end Developerem. To już kolejna osoba, której podoba się wytwarzanie
oprogramowania klienckiego. Świetnie!&lt;/p&gt;

&lt;p&gt;Bardzo się cieszę, że kolejna osoba się przebranżawia. Wymaga to od niej dużo
odwagi, cierpliwości no i najważniejsze - samozaparcia.&lt;/p&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;p class=&quot;center-text&quot;&gt;&lt;strong&gt;Artykuł został &lt;a href=&quot;https://piecioshka.pl/blog/2019/05/14/nightwatchjs-travis-chromedriver.html&quot;&gt;zaktualizowany&lt;/a&gt; 🏆&lt;/strong&gt;&lt;/p&gt;

&lt;figure class=&quot;social-center-block&quot;&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;pl&quot; dir=&quot;ltr&quot;&gt;🎉Nowy artykuł: Testy end-to-end w Continuous Integration &lt;a href=&quot;https://t.co/wJrJK8Jbk9&quot;&gt;https://t.co/wJrJK8Jbk9&lt;/a&gt; &lt;a href=&quot;https://twitter.com/hashtag/Travis?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#Travis&lt;/a&gt; &lt;a href=&quot;https://twitter.com/hashtag/NightwatchJS?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#NightwatchJS&lt;/a&gt;&lt;/p&gt;&amp;mdash; Piotr Kowalski (@piecioshka) &lt;a href=&quot;https://twitter.com/piecioshka/status/1128353186627108867?ref_src=twsrc%5Etfw&quot;&gt;May 14, 2019&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async=&quot;&quot; src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;

&lt;/figure&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Post skierowany jest do testerów oprogramowania, którzy znają składnię JavaScript.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/nightwatch/nightwatch-chrome-headless.jpg&quot; itemprop=&quot;image&quot; alt=&quot;Baner promujący artykuł&quot; /&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;historia-mateusza&quot;&gt;Historia Mateusza&lt;/h2&gt;

&lt;p&gt;Mati opowiedział mi o swoim doświadczeniu z poprzedniej pracy, w której to
był testerem aplikacji webowych. &lt;strong&gt;Nudziło go klikanie non stop w tą samą
aplikację&lt;/strong&gt; za każdym razem, kiedy developerzy chcą wypuścić nową wersję
aplikacji. Nie dziwi mnie to.&lt;/p&gt;

&lt;p&gt;W mojej pracy też mamy zespół testerów, którzy muszą mieć &lt;strong&gt;mega silną
psychikę&lt;/strong&gt; powtarzać te same czynności non stop. &lt;strong&gt;Panowie jeśli to czytacie
to szacun oraz 🏆 dla każdego z Was.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Zastanawiam się, jak ja bym sobie poradził w takiej roli. Nie wiem, czy nie
denerwowałbym się, ponieważ:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;jeśli nie znajdę błędu&lt;/strong&gt; bo np. nie przetestuje jakiegoś przypadku, bo
  na przykład mam zły dzień, albo nie mogę się skupić bo wczoraj był grill
  z kolegami&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;jeśli znajdę błąd&lt;/strong&gt; to developerzy są na mnie źli, bo pokazałem im, że
  się gdzieś pomylili, a przecież ja wykonuję tylko swoją pracę i jeśli
  znajdę błąd to chyba dobrze, bo oznacza to, że gdy zostanie on poprawiony
  to aplikacja będzie stabilniejsza.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tak źle i tak nie dobrze.&lt;/p&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;h2 id=&quot;jak-przechytrzyć-programistę&quot;&gt;Jak przechytrzyć programistę?&lt;/h2&gt;

&lt;p&gt;Uwielbiam pisać testy. Nie ma znaczenia jakie. Jestem wychowany tak, że gdy
mam napisany test to czuję pewność napisanej przeze mnie implementacji, bo
przecież &lt;strong&gt;nieważne jak ją napiszę, jeśli testy świecą się ciągle na zielono&lt;/strong&gt;.&lt;/p&gt;

&lt;blockquote class=&quot;block-average&quot;&gt;
  &lt;p&gt;Pytanie 1: &lt;strong&gt;Czy można napisać testy, które zastąpią manualne klikanie
testera?&lt;/strong&gt;&lt;br /&gt;&lt;/p&gt;

  &lt;p&gt;&lt;em&gt;Śmiem twierdzić, że tak.&lt;/em&gt;&lt;/p&gt;

  &lt;p&gt;Pytanie 2: &lt;strong&gt;Czy mógłbym zdefiniować kroki scenariusza testowego gdzieś w
aplikacji, aby uruchamiać te kroki za każdym razem, aby zbadać czy nie ma
regresu?&lt;/strong&gt;&lt;br /&gt;&lt;/p&gt;

  &lt;p&gt;&lt;em&gt;Pewnie!&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Jednak wcale nie potrzebujesz dostępu do projektu. Możesz takie testy trzymać
na swoim komputerze (&lt;em&gt;oczywiście najlepiej źródła wypchnąć do prywatnego
repozytorium na GitHubie&lt;/em&gt;), dzięki czemu żaden developer nawet nie będzie
wiedział o Twoim pomyśle.&lt;/p&gt;

&lt;h2 id=&quot;walka-z-selenium-jeśli-znasz-to-pomiń-ten-akapit&quot;&gt;Walka z Selenium (jeśli znasz, to pomiń ten akapit)&lt;/h2&gt;

&lt;p&gt;Każdy developer kiedyś słyszał o &lt;code class=&quot;highlighter-rouge&quot;&gt;Selenium&lt;/code&gt;. Jest to dość skomplikowane
narzędzie do ogarnięcia. Pisanie testów odbywa się z wykorzystywaniem
składni zdefiniowanej w &lt;code class=&quot;highlighter-rouge&quot;&gt;Selenium&lt;/code&gt;. Wg mnie jest to średni pomysł, ale jest na
to sposób!&lt;/p&gt;

&lt;blockquote&gt;
  &lt;h2 id=&quot;nie-wiesz-co-to-jest-selenium&quot;&gt;Nie wiesz co to jest Selenium?&lt;/h2&gt;
  &lt;p&gt;Nie będę teraz tego wyjaśniał. Powstało sporo artykułów na ten temat.&lt;br /&gt;
Zobacz &lt;a href=&quot;https://www.kainos.pl/blog/pierwsze-kroki-z-selenium-selenium-ide/&quot;&gt;tutaj&lt;/a&gt; albo &lt;a href=&quot;https://sii.pl/blog/selenium-ide-czyli-jak-zarobic-wiecej-robiac-mniej/&quot;&gt;tutaj&lt;/a&gt; albo w Wikipedii.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Na ten moment chciałbym przedstawić Ci na obrazku jak cały mechanizm.
&lt;strong&gt;Moim zdaniem jeden rysunek jest wart “tysiąc słów”.&lt;/strong&gt;&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/nightwatch/how-selenium-works.png&quot; alt=&quot;Komunikacja Selenium serwera ze stroną internetową&quot; /&gt;
    &lt;figcaption&gt;
        Schemat działania &lt;code&gt;Selenium&lt;/code&gt;.&lt;br /&gt;
        &lt;em&gt;Diagram stworzony z użyciem narzędzia:
        &lt;a href=&quot;https://draw.io&quot;&gt;draw.io&lt;/a&gt;.
        &lt;/em&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;straż-nocna&quot;&gt;Straż nocna&lt;/h2&gt;

&lt;p&gt;Napiszemy &lt;a href=&quot;/blog/2016/04/16/definicje-testow.html&quot;&gt;testy end-to-end&lt;/a&gt;, które będę realizowały 2 scenariusze:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;badanie czy po załadowaniu strony, zawiera ona pewien tekst,&lt;/li&gt;
  &lt;li&gt;czy strona prezentuje odpowiednią liczbę elementów w menu,&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;…oraz &lt;strong&gt;zrobimy screenshot testowanej strony internetowej&lt;/strong&gt;, po to, aby móc
np. pokazać developerowi jak wygląda błąd “zauważony przez testera”.&lt;/p&gt;

&lt;blockquote class=&quot;block-good&quot;&gt;
  &lt;h3 id=&quot;-yay&quot;&gt;&lt;i class=&quot;icon-good&quot;&gt;&lt;/i&gt; Yay&lt;/h3&gt;
  &lt;p&gt;Piękna sprawa. Nie trzeba będzie powtarzać błędnego flow.&lt;br /&gt;
Narzędzie za nas zrobi zrzut ekranu.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Testy będziemy pisać korzystając z narzędzia &lt;code class=&quot;highlighter-rouge&quot;&gt;Nightwatch.js&lt;/code&gt;.&lt;br /&gt;
Nie znasz? Strona domowa projektu dostępna jest &lt;a href=&quot;http://nightwatchjs.org/gettingstarted&quot;&gt;tutaj&lt;/a&gt;.&lt;/p&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;p&gt;Tylko dodam, że w narzędziu &lt;code class=&quot;highlighter-rouge&quot;&gt;Nightwatch.js&lt;/code&gt; można pisać również testy
jednostkowe. Więcej na ten temat dowiesz się z &lt;a href=&quot;http://nightwatchjs.org/guide#writing-unit-tests&quot;&gt;tego miejsca&lt;/a&gt;.&lt;/p&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;h2 id=&quot;krok-po-kroku-&quot;&gt;Krok po kroku 👣&lt;/h2&gt;

&lt;blockquote class=&quot;block-average&quot;&gt;
  &lt;p&gt;Stworzyłem projekt na &lt;a href=&quot;https://github.com/piecioshka/test-nightwatch-chrome-headless&quot;&gt;GitHubie&lt;/a&gt;, który posiada gotową (opisywaną w tym
artykule) konfigurację &lt;code class=&quot;highlighter-rouge&quot;&gt;Nightwatch.js&lt;/code&gt; (&lt;code class=&quot;highlighter-rouge&quot;&gt;Selenium&lt;/code&gt;) + &lt;code class=&quot;highlighter-rouge&quot;&gt;Chrome Headless&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;1) Stworzenie pustego katalog (na projektu).&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;To chyba jasne i nie muszę tego pisać, jednak napiszę, aby rozwiać wszelkie
wątpliwości.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2) Stworzenie pliku &lt;code class=&quot;highlighter-rouge&quot;&gt;package.json&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Masz dwie opcje aby posiadać taki plik:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;manualna - ręcznie tworzysz taki plik i wpisuje odpowiednie pola&lt;/li&gt;
  &lt;li&gt;albo generujesz plik za pomocą polecenia &lt;code class=&quot;highlighter-rouge&quot;&gt;npm init&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ze swojej strony polecam drugą opcję. Jest szybsza.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3) Instalacja narzędzi&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;kbd&gt;Copy + paste&lt;/kbd&gt;&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;npm &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;nightwatch selenium-standalone
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Ważne aby, te dwie zależności znalazły się pliku &lt;code class=&quot;highlighter-rouge&quot;&gt;package.json&lt;/code&gt;. Tym samym
dasz możliwość uruchomienia przez innego testera Twojego projektu z testami,
(albo &lt;strong&gt;nawet&lt;/strong&gt; przez programistę).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4) Dodanie odpowiednich zadań do &lt;code class=&quot;highlighter-rouge&quot;&gt;package.json&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Proponuję dodać 2 następujące zadania:&lt;/p&gt;

&lt;div class=&quot;language-json highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;scripts&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;selenium:start&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;selenium-standalone install &amp;amp;&amp;amp; selenium-standalone start&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;test:e2e&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;nightwatch&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Pierwsze skonfiguruje i uruchomi serwer &lt;code class=&quot;highlighter-rouge&quot;&gt;Selenium&lt;/code&gt;. Drugie natomiast uruchomi
skrypty testujące napisane w JavaScript korzystające z API biblioteki
&lt;code class=&quot;highlighter-rouge&quot;&gt;Nightwatch.js&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5) Konfiguracja narzędzia &lt;code class=&quot;highlighter-rouge&quot;&gt;Nightwatch.js&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Testowanie tak samo jak aplikacja, może być bardzo skomplikowane, stąd też
należy wykorzystać plik konfiguracyjny, gdzie zdefiniujemy jak ma działać
narzędzie do uruchamiania testów end-to-end (&lt;code class=&quot;highlighter-rouge&quot;&gt;Nightwatch.js&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;Przedstawiam podstawową konfigurację, jaka powinna się znaleźć
w pliku &lt;code class=&quot;highlighter-rouge&quot;&gt;nightwatch.json&lt;/code&gt; - w katalogu głównym projektu. Nie będę opisywał pól,
tylko zapraszam do &lt;a href=&quot;http://nightwatchjs.org/gettingstarted#basic-settings&quot;&gt;dokumentacji&lt;/a&gt;.&lt;/p&gt;

&lt;div class=&quot;language-json highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;src_folders&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;test/e2e/&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;

    &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;output_folder&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;reports&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;

    &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;test_settings&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;default&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
            &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;silent&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;kc&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;

            &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;desiredCapabilities&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;browserName&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;chrome&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;chromeOptions&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                    &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;args&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                        &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;--headless&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                    &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;binary&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;/Applications/Google Chrome Canary.app/Contents/MacOS/Google Chrome Canary&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
                &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
            &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;blockquote&gt;
  &lt;p&gt;Pod klucze &lt;code class=&quot;highlighter-rouge&quot;&gt;binary&lt;/code&gt; znajduje się ścieżka do programu, który ma być
uruchamiany na potrzeby weryfikacji scenariuszy. Na systemach Windows, należy
wkleić ścieżkę zmieniając &lt;code class=&quot;highlighter-rouge&quot;&gt;backslashe&lt;/code&gt; (domyślna forma rozdzielenia katalogów)
na &lt;code class=&quot;highlighter-rouge&quot;&gt;slashe&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Na uwagę zasługuje wykorzystanie argumentu &lt;code class=&quot;highlighter-rouge&quot;&gt;&quot;--headless&quot;&lt;/code&gt;, z którym będzie
uruchamiana przeglądarka &lt;a href=&quot;https://www.google.pl/chrome/browser/canary.html&quot;&gt;Google Chrome Canary&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;Headless&lt;/code&gt; to nowy feature w tej przeglądarce, który pozwala na uruchomienie
przeglądarki bez GUI. Zainteresowany jak działa ten feature?
&lt;a href=&quot;https://developers.google.com/web/updates/2017/04/headless-chrome&quot;&gt;Przeczytaj tutaj&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Na stronie opisujące ten feature jest ostrzeżenie (w języku angielskim):&lt;/p&gt;

&lt;div class=&quot;language-text highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;Caution: Headless mode is available on Mac and Linux in Chrome 59.
Windows support is coming in Chrome 60.
To check what version of Chrome you have, open chrome://version.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;W skrócie, testy polegające na otwieraniu strony i analizowaniu jej treści
mogą przebiegać bez otworzenia przeglądarki. Jaki jest tego plus? Ja widzę
jeden podstawowy - wydajność, tj. skrócenie czasu potrzebnego na uruchomienie
testów.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;h3 id=&quot;a-co-powiesz-na-temat-phantomjs&quot;&gt;A co powiesz na temat PhantomJS?&lt;/h3&gt;
  &lt;p&gt;Wykorzystanie &lt;code class=&quot;highlighter-rouge&quot;&gt;Headless&lt;/code&gt; to nie jedyny sposób, aby uruchomić takie testy.
Można wykorzystać narzędzie PhantomJS. Nie polecam jednak tego narzędzia z
uwagi na to, że wykorzystuje ono stary silnik Chrome-a do
renderowanie - &lt;strong&gt;Webkit&lt;/strong&gt;, gdzie &lt;code class=&quot;highlighter-rouge&quot;&gt;Headless&lt;/code&gt; korzysta z najnowszego - &lt;strong&gt;Blink&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;6) Pierwszy test: &lt;em&gt;Czy strona posiada tekst?&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Testy musisz zdefiniować w pliku stworzonym w katalogu z definiowanym w
konfiguracji pod kluczem &lt;code class=&quot;highlighter-rouge&quot;&gt;src_folders&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;I tak na przykład stwórz plik: &lt;code class=&quot;highlighter-rouge&quot;&gt;test.example.js&lt;/code&gt;, który będzie wykorzystywał
składnię &lt;em&gt;CommonJS&lt;/em&gt;, aby wyeksportować obiekt jako moduł.&lt;/p&gt;

&lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;TARGET_PAGE_URL&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'https://piecioshka.pl/blog/'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;nx&quot;&gt;module&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;exports&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;s1&quot;&gt;'Is header contains correct text?'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;browser&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;nx&quot;&gt;browser&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;TARGET_PAGE_URL&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;nx&quot;&gt;browser&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;waitForElementVisible&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'body'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;3000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;nx&quot;&gt;browser&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;assert&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;containsText&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'h2'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'Piotr Kowalski'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;nx&quot;&gt;browser&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;end&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Co tutaj się dzieje? Generalnie każda para klucz-wartość to pewien scenariusz.
Jego nazwa zapisana jest w kluczu, a kroku w definicji funkcji.&lt;/p&gt;

&lt;p&gt;Pełne API, czyli definicja akcji, które możesz zrobić na stronie dostępna
jest &lt;a href=&quot;http://nightwatchjs.org/api&quot;&gt;tutaj&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Wskazówki, na temat jak pisać poprawnie testy end-to-end są opisane na
stronie projektu. Link do przewodnika jest &lt;a href=&quot;http://nightwatchjs.org/guide&quot;&gt;tutaj&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;7) Drugi test: &lt;em&gt;Czy strona zawiera odpowiednią ilość elementów?&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;// ...&lt;/span&gt;
&lt;span class=&quot;nx&quot;&gt;module&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;exports&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;// ...&lt;/span&gt;
    &lt;span class=&quot;s1&quot;&gt;'Is main part of app contains proper number of elements?'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;browser&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;nx&quot;&gt;browser&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;TARGET_PAGE_URL&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;nx&quot;&gt;browser&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;waitForElementVisible&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'body'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;3000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;nx&quot;&gt;browser&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;elements&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'css selector'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'#menu li'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;result&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;result&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;length&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;!==&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
                &lt;span class=&quot;nx&quot;&gt;browser&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;assert&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;fail&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'Number of elements is not correct'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
            &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;});&lt;/span&gt;
        &lt;span class=&quot;nx&quot;&gt;browser&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;end&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;8) Trzecia opcja: &lt;em&gt;Zrzut ekranu&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;// ...&lt;/span&gt;
&lt;span class=&quot;nx&quot;&gt;module&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;exports&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;// ...&lt;/span&gt;
    &lt;span class=&quot;s1&quot;&gt;'Capture screenshot to see manually that page looks correct'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;browser&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;nx&quot;&gt;browser&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;TARGET_PAGE_URL&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;nx&quot;&gt;browser&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;waitForElementVisible&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'body'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;kd&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;filename&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'./screenshots/screenshot-'&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;Date&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;toISOString&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'.png'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;nx&quot;&gt;browser&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;saveScreenshot&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;filename&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;nx&quot;&gt;browser&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;end&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;9) Uruchomienie testów end-to-end, które właśnie napisaliśmy&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Teraz wystarczy, że otworzysz &lt;strong&gt;2 okna terminala&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;w jednym uruchomisz serwer &lt;code class=&quot;highlighter-rouge&quot;&gt;Selenium&lt;/code&gt;, za pomocą polecenia
  &lt;code class=&quot;highlighter-rouge&quot;&gt;npm run selenium:start&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;w drugim oknie uruchomisz &lt;code class=&quot;highlighter-rouge&quot;&gt;Nightwatch.js&lt;/code&gt;, aby uruchomić napisane testy,
  za pomocą polecenia: &lt;code class=&quot;highlighter-rouge&quot;&gt;npm run test:e2e&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
  &lt;h3 id=&quot;java&quot;&gt;Java&lt;/h3&gt;
  &lt;p&gt;Selenium wymaga zainstalowanego środowiska do uruchomiania programów
napisanych w języku Java. Środowisko to nazywa się JRE - Java Runtime
Environment.&lt;br /&gt;
Pobierz najnowszą wersję z http://java.com/&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Poniżej przedstawiam Ci jak wygląda drugi terminal w którym uruchamiam testy:&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/nightwatch/nightwatch-launching.gif&quot; alt=&quot;&quot; /&gt;
&lt;/figure&gt;

&lt;p&gt;&lt;em&gt;Serwera nie ma co pokazywać. Tam się dzieje magia, na którą nie wolno patrzeć.&lt;/em&gt;&lt;/p&gt;

&lt;h2 id=&quot;pytania&quot;&gt;Pytania&lt;/h2&gt;

&lt;p&gt;Pozwolisz, że zadam Ci teraz kilka pytań. Swoje odpowiedzi umieść proszę w
komentarzu:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Jak Ci się podoba takie podejście do testowania?&lt;/li&gt;
  &lt;li&gt;Czy jako tester pokazałabyś programiście kod, który testuje jego aplikację,
 czy jednak wolałbyś zostawić go dla siebie, aby developer nie miał wpływu
 na definicję scenariuszy?&lt;/li&gt;
  &lt;li&gt;Czy przetestowałeś, jak &lt;code class=&quot;highlighter-rouge&quot;&gt;Nightwatch.js&lt;/code&gt; oraz &lt;code class=&quot;highlighter-rouge&quot;&gt;Chrome Headless&lt;/code&gt; sprawują się
 w projekcie, który jest wykorzystywany w Twojej pracy?&lt;/li&gt;
  &lt;li&gt;Czy takie testy powinny być tworzone przez programistów, czy raczej przez
 testerów oprogramowania?&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;strong&gt;Będę wdzięczny za odpowiedzi.&lt;/strong&gt;&lt;br /&gt;
Pamiętaj, że komentarze są po to, aby prowadzić w nich dyskusje.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;PS Mateusz, mam nadzieję, że pomogłem. Piona!&lt;/p&gt;

&lt;!-- Resources --&gt;

</description>
            <pubDate>Wed, 09 Aug 2017 06:02:12 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2017/08/09/jak-napisac-testy-end-to-end-nightwatch-oraz-chrome-headless.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2017/08/09/jak-napisac-testy-end-to-end-nightwatch-oraz-chrome-headless.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/nightwatch/nightwatch-chrome-headless.jpg</image>
        </item>
        
        <item>
            <title>WarsawJS Meetup #34</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Już 34. spotkanie warszawskich programistów JavaScript. Cieszę się, że
takie wydarzenia cieszą się dużą popularnością. &lt;strong&gt;Sala zawsze jest pełna.&lt;/strong&gt;
To cieszy i napawa optymizmem.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Całe wydarzenie jest darmowe.&lt;/strong&gt; Pozbawione jest wcześniejszej rejestracji.
Po prostu przychodzisz i słuchasz, a po prelekcjach “networkingujesz”.&lt;/p&gt;

&lt;!-- &lt;figure&gt;
    &lt;a href=&quot;https://www.meetup.com/WarsawJS/&quot;&gt;
        &lt;img src=&quot;/assets/images/posts/post-banner-warsawjs.jpg&quot;
             alt=&quot;WarsawJS&quot;/&gt;
    &lt;/a&gt;
&lt;/figure&gt; --&gt;

&lt;h2 id=&quot;invitation&quot;&gt;Invitation&lt;/h2&gt;

&lt;p&gt;Kolejna zapowiedź “na sportowo”. Zwykle w poniedziałki gramy w nogę na pobliskim
(blisko szklanego wieżowca - Blue Point - w którym pracuję) boisku. Nie jest to
poziom profesjonalny… hmm amatorski to chyba też nie jest. Po prostu kopiemy
pomalutku w piłę.&lt;/p&gt;

&lt;div class=&quot;youtube-lazy&quot; data-youtube-id=&quot;_l46dsjpluQ&quot;&gt;&lt;/div&gt;

&lt;p&gt;Na filmie wystąpił jeden z &lt;strong&gt;moich kolegów z pracy - Marek&lt;/strong&gt;, z którym bardzo
często rozgrywamy mecze. Zwykle to jest tak jak w pierwszych minutach
filmu - kopiemy na pustą bramkę a i tak często nie wpada!&lt;/p&gt;

&lt;p&gt;Chciałbyś popykać w piłę. &lt;a href=&quot;/kontakt/&quot;&gt;Napisz do mnie&lt;/a&gt;. Ustawimy się
na jakiś sparing na Pradze.&lt;/p&gt;

&lt;p class=&quot;chapter-break&quot;&gt;&amp;bull;&lt;/p&gt;

&lt;h2 id=&quot;talk-1-need-for-speed---optimizing-react-pl-kamil-grabek&quot;&gt;Talk #1: Need for Speed - optimizing React [PL] &lt;small&gt;Kamil Grabek&lt;/small&gt;&lt;/h2&gt;

&lt;p&gt;Kamil - doświadczony developer, fanatyk performance-u. Wygłosił prelekcję na
temat optymalizacja aplikacji React-owej.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Siła Reacta nie leży po stronie budowania UI.
Leży po stronie jego aktualizacji.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3 id=&quot;kilka-wskazówek-optymalizacyjnych&quot;&gt;Kilka wskazówek optymalizacyjnych&lt;/h3&gt;

&lt;ul class=&quot;flos&quot;&gt;
  &lt;li&gt;
    &lt;h3 id=&quot;1-komponenty&quot;&gt;1. Komponenty&lt;/h3&gt;

    &lt;p&gt;Tworzenie komponentów, które renderują treść w pętli. Przy każdej iteracji
  zostanie wykonane sprawdzenie, czy faktycznie powinien się przerenderować.
  Jeśli jego właściwości nie uległy zmianie, to &lt;strong&gt;nie zostanie on
  przerenderowany&lt;/strong&gt;, oszczędzając tym samym zasoby.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;h3 id=&quot;2-immutability&quot;&gt;2. Immutability&lt;/h3&gt;

    &lt;p&gt;Dane w trybie &lt;strong&gt;read-only&lt;/strong&gt; pozwalają na szybsze porównywanie.
  Pożyteczna paczka (w npm): &lt;a href=&quot;https://www.npmjs.com/package/immutable-helper&quot;&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;immutable-helper&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;h3 id=&quot;3-memoizacja&quot;&gt;3. Memoizacja&lt;/h3&gt;

    &lt;p&gt;Oszczędność wykonywania tych samych operacji. Zapamiętywany jest wynik
  operacji. Pożyteczna paczka (w npm): &lt;a href=&quot;https://www.npmjs.com/package/moize&quot;&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;moize&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;h3 id=&quot;4-produkcja&quot;&gt;4. Produkcja&lt;/h3&gt;

    &lt;p&gt;Wersja produkcyjna pozbawiona jest kilku sprawdzeń, oszczędzając zasoby.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;h3 id=&quot;5-pure-functions&quot;&gt;5. Pure functions&lt;/h3&gt;

    &lt;p&gt;Funkcje, które nie modyfikują stanu, tylko zwracają nowy.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;h3 id=&quot;6-alternatywy&quot;&gt;6. Alternatywy&lt;/h3&gt;

    &lt;p&gt;Przykładowa alternatywa: &lt;code class=&quot;highlighter-rouge&quot;&gt;preact&lt;/code&gt;. Podczas budowania aplikacji
  produkcyjnej można podmienić główną bibliotekę (React.js) na lżejszą.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote class=&quot;block-average&quot;&gt;
  &lt;h4 id=&quot;-złota-myśl&quot;&gt;🏆 Złota myśl&lt;/h4&gt;
  &lt;p&gt;Pamiętaj, że nie wykonuj optymalizacji za wcześniej.&lt;br /&gt;
Na początku budowania aplikacji nie ma co optymalizować.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
  &lt;li&gt;Link do prelekcji: &lt;a href=&quot;https://www.youtube.com/watch?v=6Onxb4gij0s&quot;&gt;youtube.com/watch?v=6Onxb4gij0s&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Kontakt do prelegenta: &lt;a href=&quot;https://www.linkedin.com/in/kamil-grabek-240872140/&quot;&gt;LinkedIn&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;h2 id=&quot;talk-2-trening-na-redukcję-jak-spalić-kilobajty-pl-paweł-kondraciuk&quot;&gt;Talk #2: Trening na redukcję: jak spalić kilobajty? [PL] &lt;small&gt;Paweł Kondraciuk&lt;/small&gt;&lt;/h2&gt;

&lt;p&gt;Druga prelekcja o wydajności. Cóż za performance-owy meetup! Lubię takie. Sam
jestem fanem optymalizacji.&lt;/p&gt;

&lt;p&gt;Wiecie, że Google nie lubi wolnych aplikacji? &lt;a href=&quot;https://productforums.google.com/forum/#!topic/webmasters/x-tAmtvK9iA/discussion&quot;&gt;Na potwierdzenie artykuł&lt;/a&gt;.&lt;/p&gt;

&lt;ul class=&quot;flos&quot;&gt;
  &lt;li&gt;
    &lt;h3 id=&quot;1-pozbycie-się-dead-code&quot;&gt;1. Pozbycie się Dead Code&lt;/h3&gt;

    &lt;p&gt;Wykorzystanie narzędzia: &lt;a href=&quot;https://closure-compiler.appspot.com/&quot;&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;closure-compiler&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;h3 id=&quot;2-wielkości-plików&quot;&gt;2. Wielkości plików&lt;/h3&gt;

    &lt;p&gt;Weryfikacja, które pliki są wykorzystywane w projekcie:&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;&lt;a href=&quot;http://webpack.github.io/analyse/&quot;&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;analyze&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=7aY9BoMEpG8&quot;&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;source-map-explorer&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;

    &lt;p&gt;Wydzielenie vendorów do osobnego pliku, aby go móc skeszować.&lt;br /&gt;
  Wykorzystana narzędzie: &lt;a href=&quot;https://webpack.js.org/plugins/commons-chunk-plugin/&quot;&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;CommonsChunkPlugin&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;h3 id=&quot;3-tree-shaking--minifikacja&quot;&gt;3. Tree Shaking + Minifikacja&lt;/h3&gt;

    &lt;p&gt;&lt;strong&gt;Tree shaking&lt;/strong&gt; usuwana z eksportowania nieużywane funkcje.
  &lt;strong&gt;Minifikacja&lt;/strong&gt; usuwa kod, który nie jest używany.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;h3 id=&quot;4-jit-vs-aot&quot;&gt;4. JIT vs AOT&lt;/h3&gt;

    &lt;p&gt;JIT - Just In Time compilation &lt;i class=&quot;icon-poor&quot;&gt;&lt;/i&gt;&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;kompilacja szablonów w locie&lt;/li&gt;
      &lt;li&gt;wolne bootstrap aplikacji, jednak szybsze budowanie, jakże pomocne w
  devloperce&lt;/li&gt;
    &lt;/ul&gt;

    &lt;p&gt;AOT - Ahead Of Time compilation &lt;i class=&quot;icon-good&quot;&gt;&lt;/i&gt;&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;wycięty &lt;code class=&quot;highlighter-rouge&quot;&gt;@angular/compiler&lt;/code&gt; - duża redukcja wielkości pliku &lt;code class=&quot;highlighter-rouge&quot;&gt;vendors.js&lt;/code&gt;&lt;/li&gt;
      &lt;li&gt;szablony są już skompilowane&lt;/li&gt;
      &lt;li&gt;błędy w szablonie są wykryte na tym poziomie&lt;/li&gt;
      &lt;li&gt;większe bezpieczeństwo - brak ewaluacji kodu&lt;/li&gt;
      &lt;li&gt;włączenie &lt;strong&gt;tree shaking&lt;/strong&gt; pozwala wyciąć nieużywane dyrektywy np. &lt;code class=&quot;highlighter-rouge&quot;&gt;ngIf&lt;/code&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;h3 id=&quot;5-lazy-loading&quot;&gt;5. Lazy loading&lt;/h3&gt;

    &lt;p&gt;Dołączanie wykorzystywanych modułów w sposób leniwy.
  Bardzo szybki czas prezentacji pierwszej strony
  Istnieją 2 strategie:&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;pobieranie chunków dopiero wtedy kiedy faktycznie powinny być używane&lt;/li&gt;
      &lt;li&gt;pobieranie wszystkich chunków od razu, ale po wyświetleniu pierwszej
  strony&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;h3 id=&quot;6-kompresja-gzip&quot;&gt;6. Kompresja GZIP&lt;/h3&gt;

    &lt;p&gt;Optymalizacja plików CSS np. &lt;code class=&quot;highlighter-rouge&quot;&gt;bootstrap.css&lt;/code&gt; na &lt;strong&gt;poziomie 84%&lt;/strong&gt;.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pierwotnie aplikacja &lt;strong&gt;ważyła 4 MB&lt;/strong&gt;. Po realizacji wyżej wymienionych zabiegów
wielkość plików ściąganych przez przeglądarkę &lt;strong&gt;zmalała do 140 KB&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Link do prelekcji: &lt;a href=&quot;https://www.youtube.com/watch?v=KSOVxW0lz7c&quot;&gt;youtube.com/watch?v=KSOVxW0lz7c&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Kontakt do prelegenta: &lt;a href=&quot;https://twitter.com/pawelkondraciuk&quot;&gt;@pawelkondraciuk&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;h2 id=&quot;talk-3-dlaczego-twój-administrator-cię-nienawidzi-pl-maciej-maciejewski&quot;&gt;Talk #3: Dlaczego Twój administrator Cię nienawidzi? [PL] &lt;small&gt;Maciej Maciejewski&lt;/small&gt;&lt;/h2&gt;

&lt;p&gt;Miękka prezentacja. Czasami i takie są potrzebne, bo przecież sami developerzy
nie wystarczą, aby zbudować projekt. Równie ważni są także devopsi / admini.&lt;/p&gt;

&lt;p&gt;Administrator też chce dobrze dla projektu. Tylko patrzy na niego z innej strony.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Jeśli jesteś programistą, to jesteś użytkownikiem zaawansowanym.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3 id=&quot;kilka-wskazówek-podczas-współpracy&quot;&gt;Kilka wskazówek podczas współpracy&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;trzeba być konkretny w komunikacji z administratorami, nie można powiedzieć
  “strona nie działa”&lt;/li&gt;
  &lt;li&gt;nie można być gamoniem 😄 bo zostanie się zaszufladkowanym&lt;/li&gt;
  &lt;li&gt;nie prosić o deploy w piątek, generuje to duży kłopot jeśli deploy się nie
  powiedzie&lt;/li&gt;
  &lt;li&gt;trzeba &lt;strong&gt;znać podstawy działania internetu&lt;/strong&gt; oraz protokół HTTP&lt;/li&gt;
  &lt;li&gt;podstawowe kody odpowiedzi HTTP powinny być w głowach programistów, albo
  chociaż odróżniać 400-setki od 500-setek&lt;/li&gt;
  &lt;li&gt;developerzy &lt;strong&gt;powinni znać stack projektu&lt;/strong&gt; w którym biorą udział&lt;/li&gt;
  &lt;li&gt;nie hardkodować w kodzie adresów IP, co jeśli takie adres się zmieni w tzw.
  międzyczasie?&lt;/li&gt;
  &lt;li&gt;napisać &lt;strong&gt;prostą dokumentację w README.md&lt;/strong&gt; zawierającą wymagania projektu&lt;/li&gt;
  &lt;li&gt;nie testuj sam swojego kodu!&lt;/li&gt;
  &lt;li&gt;pisz testy jednostkowe oraz integracyjne, podniosą one komfort pracy z
  aplikacją&lt;/li&gt;
  &lt;li&gt;nazywaj &lt;code class=&quot;highlighter-rouge&quot;&gt;commit message&lt;/code&gt;-e dokładnie, np. &lt;code class=&quot;highlighter-rouge&quot;&gt;&quot;poprawa nawigacji&quot;&lt;/code&gt; niewiele mówi&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;zakazy-dla-developera&quot;&gt;Zakazy dla developera&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;nie dostaniesz &lt;code class=&quot;highlighter-rouge&quot;&gt;root&lt;/code&gt;-a na produkcji&lt;/li&gt;
  &lt;li&gt;nie będzie wdrożeń małych zmian - wszystko musi przejść odpowiednią
  procedurę na wypadek gdyby mała zmiana rozwaliła system&lt;/li&gt;
  &lt;li&gt;nie będziesz zmieniał konfiguracji serwerów - &lt;strong&gt;administratorzy potrafią to
  zwykle zrobić lepiej&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote class=&quot;block-good&quot;&gt;
  &lt;h3 id=&quot;-najważniejsza-zasada&quot;&gt;&lt;i class=&quot;icon-good&quot;&gt;&lt;/i&gt; Najważniejsza zasada&lt;/h3&gt;
  &lt;p&gt;Nie używaj zwrotu: &lt;strong&gt;“u mnie działa”&lt;/strong&gt;. Wypowiedzenie tego przy adminach
spowoduje tylko niepotrzebne przypływ adrenaliny.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Wszelkie problemy z wydajnością można rozwiązać wspólnie.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;h3 id=&quot;hint-odnośnie-skalowania-aplikacji&quot;&gt;Hint odnośnie skalowania aplikacji&lt;/h3&gt;
  &lt;p&gt;Łatwiej jest postawić 500 kopii tego samego kodu, niż sprawić, aby jedna kopia
działała 500 razy szybciej.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3 id=&quot;ale-dlaczego-się-nie-da&quot;&gt;Ale dlaczego się nie da?&lt;/h3&gt;

&lt;p&gt;Nie zawsze administrator może coś zrobić. Stoi za nim kilka argumentów:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;stack technologicznych zdefiniowany w umowach&lt;/li&gt;
  &lt;li&gt;istnieją problemy licencyjne&lt;/li&gt;
  &lt;li&gt;wymogi bezpieczeństwa&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote class=&quot;block-average&quot;&gt;
  &lt;p&gt;Administratorzy i developerzy mają ten sam cel. Widzą go natomiast z innych
perspektyw. Jeśli admini ufają programistom to dużo łatwiej i szybciej uda
się zrealizować cele.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3 id=&quot;dla-przypomnienia&quot;&gt;Dla przypomnienia&lt;/h3&gt;

&lt;p&gt;Pracujemy w eksperckich zawodach, nie musimy więc się na siebie obrażać.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Link do prelekcji: &lt;a href=&quot;https://www.youtube.com/watch?v=BSp6Bzz5Ndc&quot;&gt;youtube.com/watch?v=BSp6Bzz5Ndc&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Kontakt do prelegenta: &lt;a href=&quot;https://www.facebook.com/maciek.maciejewski.50&quot;&gt;Facebook&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;h2 id=&quot;panel-dyskusyjny&quot;&gt;Panel dyskusyjny&lt;/h2&gt;

&lt;p&gt;Podczas panelu dyskusyjnego poruszone zostały 3 pytania:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;em&gt;Nowa składnia: Czy jest warta uwagi? Jaki jest najlepszy feature?&lt;/em&gt;&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;Asynchronous JavaScript: Jak sobie z nim poradzić?&lt;/em&gt;&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;Node.js: Dla kogo? Po co? Jak?&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A na pytania odpowiadali:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.linkedin.com/in/mhagmajer&quot;&gt;Marcin Hagmajer&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.linkedin.com/in/lukasz-jagodzinski-37342362/&quot;&gt;Łukasz Jagodziński&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/rkaw92&quot;&gt;Robert Kawecki&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;h2 id=&quot;sponsorzy-spotkania&quot;&gt;Sponsorzy spotkania&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.facebook.com/10Clouds/&quot;&gt;10Clouds&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.facebook.com/artificialio/&quot;&gt;Artificial Labs&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.facebook.com/cyfrowypolsat/&quot;&gt;Cyfrowy Polsat&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.facebook.com/Daftcode/&quot;&gt;DaftCode&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.facebook.com/elpassion/&quot;&gt;EL Passion&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.facebook.com/softwarely/&quot;&gt;Softwarely&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;h2 id=&quot;podsumowanie&quot;&gt;Podsumowanie&lt;/h2&gt;

&lt;p&gt;Świetny meetup. Lubię wykłady o optymalizacji, a tym bardziej jeśli dotyczą
one stacka którego używamy na co dzień (Angular 4). Prelekcja Maćka również
świetna. &lt;strong&gt;Przypomniała mi trochę stare czasy, kiedy to ja byłem tym
raczkującym developerem i czułem się jak dziecko we mgle.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Do zobaczenia w kolejnej relacji ze spotkania!&lt;br /&gt;
Tym razem z dzisiejszego wydarzenia - &lt;a href=&quot;https://www.facebook.com/events/307908942999775/&quot;&gt;WarsawJS Meetup #35&lt;/a&gt;&lt;/p&gt;

&lt;!-- Resources --&gt;

</description>
            <pubDate>Wed, 12 Jul 2017 08:54:28 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2017/07/12/warsawjs-meetup-34.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2017/07/12/warsawjs-meetup-34.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/post-banner-warsawjs.jpg</image>
        </item>
        
        <item>
            <title>Konferencja: JS Poland 2017. Kilka słów o tym, jak na takie wydarzenia patrzą inni organizatorzy</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Kilka dni temu byłem na kolejnej konferencji. Tym razem byłem uczestnikiem
na pierwszej edycji &lt;a href=&quot;http://www.js-poland.pl/&quot;&gt;JS Poland&lt;/a&gt;. W kolejnych akapitach przybliżę Ci, jak na
takie wydarzenia patrzy kilkuletni organizator meetupów i workshopów.&lt;/p&gt;

&lt;figure class=&quot;full-width&quot;&gt;
    &lt;img src=&quot;/assets/images/posts/conference-js-poland-2017/warsawjs-organisers.jpg&quot; alt=&quot;Dwóch mężczyzn stojących na scenie&quot; /&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;bonusowe-bilety&quot;&gt;Bonusowe bilety&lt;/h2&gt;

&lt;p&gt;Kilka miesięcy temu ogłaszałem &lt;a href=&quot;/blog/2017/04/19/wygraj-bilet-na-konferencje-js-poland-2017.html&quot;&gt;na blogu&lt;/a&gt; konkurs, gdzie do wygrania
był bilet na omawianą konferencję. Należało napisać post na Facebook-u albo
Twitterze z hashtagiem &lt;code class=&quot;highlighter-rouge&quot;&gt;#piecioshkablog&lt;/code&gt; i zebrać jak największą liczbę lajków.&lt;/p&gt;

&lt;p&gt;Konkurs wygrała &lt;a href=&quot;https://www.facebook.com/mary.pieroszkiewicz/posts/10209099831242126?comment_id=10209113138174791&quot;&gt;Mary&lt;/a&gt;, która potwierdziła swój
udział w konferencji w social mediach. Niestety nie spotkaliśmy się podczas
wydarzenia.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/conference-js-poland-2017/js-poland-300x300.png&quot; alt=&quot;Figura wzorowana na mapie polski w kolorze pomarańczowym&quot; /&gt;
    &lt;figcaption&gt;
        Oficjalne logo konferencji JS Poland 2017
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Organizacja &lt;a href=&quot;/blog/2014/06/15/warsawjs-nowa-organizacja-w-warszawie.html&quot;&gt;WarsawJS&lt;/a&gt; również miała do rozdania bilety.
Otrzymało je 3 chłopaków, którzy wyróżnili się swoją aktywnością:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://rock-it.pl/&quot;&gt;Jakub Skałecki&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/robreczarek/wjs-animation&quot;&gt;Robert Obręczarek&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://twitter.com/danielkarski&quot;&gt;Daniel Karski&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;figure class=&quot;with-border-image&quot;&gt;
    &lt;img src=&quot;/assets/images/posts/conference-js-poland-2017/warsawjs-communicty.jpeg&quot; alt=&quot;&quot; /&gt;
    &lt;figcaption&gt;
        Społeczność WarsawJS na konferencji JS Poland 2017
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;prelekcje&quot;&gt;Prelekcje&lt;/h2&gt;

&lt;p&gt;Byłem obecny na połowie prelekcji i z tego miejsca polecam następujące:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Christian Heilmann: &lt;strong&gt;“Progressive Web Apps”&lt;/strong&gt; - &lt;a href=&quot;https://www.youtube.com/watch?v=QOKWDAQSS_w&quot;&gt;Wideo&lt;/a&gt; z
  prelekcji dostępne na kanale &lt;a href=&quot;http://www.js-poland.pl/&quot;&gt;JS Poland&lt;/a&gt; na YouTube.&lt;/li&gt;
&lt;/ul&gt;

&lt;figure class=&quot;social-center-block&quot;&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;Next talk about &lt;a href=&quot;https://twitter.com/hashtag/pwa?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#pwa&lt;/a&gt; by &lt;a href=&quot;https://twitter.com/codepo8?ref_src=twsrc%5Etfw&quot;&gt;@codepo8&lt;/a&gt; // Chris which tool you use to create slides!? It&amp;#39;s great! &lt;a href=&quot;https://t.co/OJX3NYviuC&quot;&gt;pic.twitter.com/OJX3NYviuC&lt;/a&gt;&lt;/p&gt;&amp;mdash; Piotr Kowalski (@piecioshka) &lt;a href=&quot;https://twitter.com/piecioshka/status/876747215074721794?ref_src=twsrc%5Etfw&quot;&gt;June 19, 2017&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async=&quot;&quot; src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;

&lt;/figure&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;Tomasz Ducin: &lt;strong&gt;“Async Functions Awaiting You”&lt;/strong&gt;&lt;/p&gt;

    &lt;p&gt;&lt;a href=&quot;https://twitter.com/tomasz_ducin&quot;&gt;Tomasz&lt;/a&gt; - jeden z najpopularniejszych prelegentów na WarsawJS
  Meetup - podczas swojej prelekcji opowiadał o tym dlaczego
  &lt;code class=&quot;highlighter-rouge&quot;&gt;async/await&lt;/code&gt; weszły do języka.&lt;/p&gt;

    &lt;p&gt;&lt;em&gt;tl;dr: taka kolej rzeczy, kiedy ma się już generatory w specyfikacji&lt;/em&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Luca Mezzalira: &lt;strong&gt;“Functional Reactive Programming with Cycle.js”&lt;/strong&gt;&lt;/p&gt;

    &lt;p&gt;Prelegent przedstawił sposób na reaktywne programowanie z użyciem
  biblioteki Cycle.js.&lt;/p&gt;

    &lt;p&gt;&lt;em&gt;Czas spróbować takiego stylu pisania!&lt;/em&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Nir Kaufman: &lt;strong&gt;“Demystified Angular Directives”&lt;/strong&gt;&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;figure class=&quot;social-center-block&quot;&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;pl&quot; dir=&quot;ltr&quot;&gt;Magia na scenie! Tego jeszcze bie grali... 😁 &lt;a href=&quot;https://twitter.com/hashtag/jspolandconf?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#jspolandconf&lt;/a&gt; &lt;a href=&quot;https://t.co/MOJ0xFtDES&quot;&gt;pic.twitter.com/MOJ0xFtDES&lt;/a&gt;&lt;/p&gt;&amp;mdash; Piotr Kowalski (@piecioshka) &lt;a href=&quot;https://twitter.com/piecioshka/status/876750019726114816?ref_src=twsrc%5Etfw&quot;&gt;June 19, 2017&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async=&quot;&quot; src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;

&lt;/figure&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;Gabor Wnuk: &lt;strong&gt;“React Native - Success case study”&lt;/strong&gt;&lt;/p&gt;

    &lt;p&gt;Developer z Wirtualnej Polski, opowiadał o plusach aplikacji opartej
  na React Native w której brał czynny udział developerski.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Shmuela Jacobs: &lt;strong&gt;“Angular is on Fire(base)!”&lt;/strong&gt;&lt;/p&gt;

    &lt;p&gt;Świetna prelegentka. Shmuela świetnie rozbawiała uczestników swoją naturą
  opowiadając o Firebase. &lt;mark&gt;Oby więcej takich uśmiechniętych
  speakerów!&lt;/mark&gt;&lt;/p&gt;

    &lt;p&gt;&lt;em&gt;Była to jedyna prelekcja, na której ciągle się uśmiechałem!&lt;/em&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Phil Nash: &lt;strong&gt;“JWT, WTF?”&lt;/strong&gt;&lt;/p&gt;

    &lt;p&gt;Świetna prelekcja wygłoszona przez świetnego speakera. Phil omawiał temat
  bezpiecznej wymiany tokenów, czyli jak działa &lt;a href=&quot;https://jwt.io/&quot;&gt;JSON Web Tokens&lt;/a&gt;.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;nowe-znajomości&quot;&gt;Nowe znajomości&lt;/h2&gt;

&lt;p&gt;Jednym z wielu plusów uczestnictwa w konferencjach jest możliwość poznania
wielu osób. Tym razem razem z Piotrkiem zapoznaliśmy się z &lt;a href=&quot;https://twitter.com/lucamezzalira&quot;&gt;Lucą
Mezzalira&lt;/a&gt; - organizatorem społeczności &lt;a href=&quot;https://www.meetup.com/London-JavaScript-Community/&quot;&gt;LondonJS&lt;/a&gt;. Organizacja ta posiada
ponad 5k członków na Meetupie. Jest to ponad 2x więcej niż społeczność
&lt;a href=&quot;/blog/2014/06/15/warsawjs-nowa-organizacja-w-warszawie.html&quot;&gt;WarsawJS&lt;/a&gt;. Mamy do czego dążyć!&lt;/p&gt;

&lt;figure class=&quot;social-center-block&quot;&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;Patrons of &lt;a href=&quot;https://twitter.com/london_JS?ref_src=twsrc%5Etfw&quot;&gt;@london_JS&lt;/a&gt; and &lt;a href=&quot;https://twitter.com/warsawjs?ref_src=twsrc%5Etfw&quot;&gt;@warsawjs&lt;/a&gt; was meet on &lt;a href=&quot;https://twitter.com/hashtag/jspolandconf?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#jspolandconf&lt;/a&gt; &lt;a href=&quot;https://t.co/FUA2dghrPx&quot;&gt;pic.twitter.com/FUA2dghrPx&lt;/a&gt;&lt;/p&gt;&amp;mdash; Piotr Kowalski (@piecioshka) &lt;a href=&quot;https://twitter.com/piecioshka/status/876742858660884480?ref_src=twsrc%5Etfw&quot;&gt;June 19, 2017&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async=&quot;&quot; src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;

&lt;/figure&gt;

&lt;blockquote class=&quot;block-average&quot;&gt;
  &lt;h3 id=&quot;congratulations-&quot;&gt;Congratulations! 🏆&lt;/h3&gt;
  &lt;p&gt;Luca wiem, że i tak tego nie przeczytasz, ale może jeśli, to chciałem Ci
powiedzieć, że robisz FANTASTYCZNĄ robotę. &lt;strong&gt;Szacunek dla Ciebie!&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id=&quot;-plusy&quot;&gt;&lt;i class=&quot;icon-good icon-plus&quot;&gt;&lt;/i&gt; Plusy&lt;/h2&gt;

&lt;p&gt;Jesteś ciekaw mojej opinii na temat konferencji? Proszę bardzo. Zacznijmy od
plusów. Kolejność nie ma większego znaczenia.&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Strona internetowa&lt;/strong&gt; wydarzenia: &lt;a href=&quot;http://www.js-poland.pl/&quot;&gt;js-poland.pl&lt;/a&gt;&lt;/p&gt;

    &lt;p&gt;Podczas wydarzenia ludzie szukają informacji na stronie wydarzenia,
 dlatego ważne jest umieszczenie tam wszystkich danych jakie mogę przydać
 się uczestnikom konferencji.&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;Nowoczesny design.&lt;/li&gt;
      &lt;li&gt;Podział na ważne sekcje, takie jak agenda czy lokalizacja.&lt;/li&gt;
    &lt;/ul&gt;

    &lt;p&gt;Responsywność strony internetowej to już standard.&lt;/p&gt;

    &lt;p&gt;&lt;em&gt;Jeśli jakaś strona niekorzystnie wygląda na urządzeniu mobilnym, to
 tracimy do niej zaufanie.&lt;/em&gt;&lt;/p&gt;

    &lt;p&gt;&lt;strong&gt;Sprawdź jak wygląda ten blog na urządzeniu mobilnym!&lt;/strong&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Jedna ścieżka z prelekcjami&lt;/strong&gt;&lt;/p&gt;

    &lt;p&gt;Taki styl przeprowadzenia konferencji nie generuje problemów.
 Nie istnieje sytuacja, że w tym samym czasie odbywają się interesujące
 nas prelekcje.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Konkurs z nagrodami&lt;/strong&gt;&lt;/p&gt;

    &lt;p&gt;Bardzo dobrym pomysłem było zorganizowanie konkursu z nagrodami. Zawsze
 takie inicjatywy pobudzają społeczność do tworzenia nowej treści w social
 mediach, która służy… popularyzacji wydarzenia!&lt;/p&gt;

    &lt;p&gt;Tym samym można powiedzieć, że organizatorzy mają darmową reklamę 😄&lt;/p&gt;

    &lt;p&gt;&lt;em&gt;Tylko dlaczego nie było internetu??? Ale o tym za chwilę w minusach.&lt;/em&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Prelegenci&lt;/strong&gt;&lt;/p&gt;

    &lt;p&gt;Podstawowym celem udziału w konferencji jest wysłuchanie co mają do
 powiedzenia jej prelegenci. Podczas JS Poland prelegenci byli
 z - dobrej - górnej półki.&lt;/p&gt;

    &lt;p&gt;&lt;em&gt;Taka śmietanka jak Heilmann czy Kaufman przyciągają uczestników.&lt;/em&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Dobór miejsca adekwatnie do frekwencji&lt;/strong&gt;&lt;/p&gt;

    &lt;p&gt;Często się zdarza, że jestem świadkiem problemu z “pomieszczeniem”
 uczestników konferencji. Organizatorzy źle wykalkulowali i sala wykładowa
 albo jest za mała (&lt;a href=&quot;/blog/2017/05/25/konferencja-code-europe-2017.html&quot;&gt;Code Europe 2017&lt;/a&gt;) albo za duża (&lt;a href=&quot;/blog/2016/08/28/konferencja-frontend-union-conf-2016.html&quot;&gt;Frontend Union
 2016&lt;/a&gt;) i ludzie siedzieli na sali w połowie pustej co daje wrażenie, że
 wiele osób nie przyjechało.&lt;/p&gt;

    &lt;figure&gt;
     &lt;img src=&quot;/assets/images/posts/conference-js-poland-2017/conference-community.jpeg&quot; alt=&quot;Ludzie siedzący w sali kinowej&quot; /&gt;
     &lt;figcaption&gt;
         Uczestnicy konferencji JS Poland 2017
     &lt;/figcaption&gt;
 &lt;/figure&gt;

    &lt;p&gt;Na sali nie było dużo wolnej przestrzeni, aż do samego końca wydarzenia.
 Z moich źródeł wiem, że frekwencja wynosiła lekko ponad 200 osób.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Pomocna rejestracja&lt;/strong&gt;&lt;/p&gt;

    &lt;p&gt;Pierwsze osoby z którymi mamy kontakt na konferencji to ludzie z
 rejestracji. Dlatego ważne jest - od strony organizatora - dobre
 przywitanie gości. Stąd też &lt;strong&gt;uśmiech na starcie to ważna rzecz&lt;/strong&gt;.&lt;/p&gt;

    &lt;p&gt;Szybka rejestracja, gdzie otrzymałem jakieś gadżety już daje +10 w
 odbiorze konferencji.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Certyfikaty obecności&lt;/strong&gt;&lt;/p&gt;

    &lt;p&gt;Jak już jesteśmy przy gadżetach, to każdy z uczestników, otrzymał
 certyfikat obecności w wydarzeniu. Miły to gest. Można sobie powiesić nad
 łóżkiem albo za zanieść do pracy i powiesić na ścianie &lt;strong&gt;wall of fame&lt;/strong&gt;&lt;/p&gt;

    &lt;figure class=&quot;full-width&quot;&gt;
     &lt;img src=&quot;https://upload.wikimedia.org/wikipedia/commons/a/af/Finnish_hockey_wall_of_fame.jpg&quot; alt=&quot;Ściana z obrazkami&quot; /&gt;
     &lt;figcaption&gt;
         Źródło: &lt;a href=&quot;https://commons.wikimedia.org/wiki/File:Finnish_hockey_wall_of_fame.jpg&quot;&gt;Wikipedia&lt;/a&gt;
     &lt;/figcaption&gt;
 &lt;/figure&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Gadgety Sponsorskie&lt;/strong&gt;&lt;/p&gt;

    &lt;p&gt;Kończąc temat gażdetów trzeba jeszcze spojrzeć w kierunku sponsorów.
 To de facto dzięki nim takie wydarzenie jest w stanie się odbyć. Firmy
 płacą kupę kasy, aby zostać patronami wydarzenia. Dla nich jest to
 idealny moment za rekrutację przy swoim wystawionym “straganie”.&lt;/p&gt;

    &lt;p&gt;Podczas tej konferencji można było dostać od sponsorów:&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;zasłonki do kamery w laptopie&lt;/li&gt;
      &lt;li&gt;futerał na komputer&lt;/li&gt;
      &lt;li&gt;książkę Angular.js autorstwa Arka Kalbarczyka oraz Darka Kalbarczyka,
  którą serdecznie polecam jeśli zaczynasz swoją przygodę z tym
  frameworkiem.&lt;/li&gt;
      &lt;li&gt;.. i wiele innych, których nie ma sensu wymieniać.&lt;/li&gt;
    &lt;/ul&gt;

    &lt;p&gt;&lt;em&gt;Chciałem tylko podkreślić fakt, że sponsorzy mają często ciekawe pomysły
 jak zwabić do siebie pracownika.&lt;/em&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Prowadzący&lt;/strong&gt;&lt;/p&gt;

    &lt;p&gt;Konferencja odbywająca się w Złotych Tarasach w sali kinowej musiała być
 obrandowana jakimś filmem! Kilka tygodni temu do kin wszedł nowy film
 “Piraci z Karaibów”, stąd też całą konferencję poprowadził JACK SPARROW!&lt;/p&gt;

    &lt;figure&gt;
     &lt;img src=&quot;/assets/images/posts/conference-js-poland-2017/jack-sparrow.jpeg&quot; alt=&quot;&quot; /&gt;
     &lt;figcaption&gt;
         Prowadzący był przebrany w kostium, po to, aby upodobnić się do Jacka
         Sparrowa z filmu Piraci z Karaibów
     &lt;/figcaption&gt;
 &lt;/figure&gt;

    &lt;p&gt;Oczywiście, nie był to odtwórca roli kapitana Sparrowa, tylko Przemek
 nasz rodowity polak, który przebrał się i w mega zabawny sposób
 zapowiadał kolejne prelekcje.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Projekcja filmu&lt;/strong&gt;&lt;/p&gt;

    &lt;p&gt;Po wygłoszeniu wszystkich prelekcji uczestnicy konferencji mogli
uczestniczyć w darmowym seansie filmowym. Wyświetlany był film: “Piraci z
Karaibów: Zemsta Salazara”.&lt;/p&gt;

    &lt;p&gt;Takie są plusy organizowania wydarzeń w kinie.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;-minusy&quot;&gt;&lt;i class=&quot;icon-poor icon-minus&quot;&gt;&lt;/i&gt; Minusy&lt;/h2&gt;

&lt;p&gt;Aby nie było tak kolorowo, to przedstawię teraz problemy jakie zauważyłem
podczas wydarzenia. Niestety nie była to idealna konferencja.&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Brak internetu w głównej sali&lt;/strong&gt;&lt;/p&gt;

    &lt;p&gt;Największy minus, to zdecydowanie brak internetu dla uczestników. My ludzie
 internetu, nie potrafimy egzystować bez niego.&lt;/p&gt;

    &lt;p&gt;Organizatorzy zorganizowali konkurs, który polegał na uploadzie zdjęć w
 social mediach z hashtagiem &lt;code class=&quot;highlighter-rouge&quot;&gt;#jspolandconf&lt;/code&gt;.&lt;/p&gt;

    &lt;blockquote class=&quot;block-good&quot;&gt;
      &lt;p&gt;Kiepsko wysyła się zdjęcie, kiedy iPhone ma problem z zasięgiem GSM oraz
nie jest podłączony do żadnego Wi-Fi.&lt;/p&gt;
    &lt;/blockquote&gt;

    &lt;p&gt;Ciekaw jestem, jak sobie radzili uczestnicy Androidów? Czy Wy też
 mieliście problem z zasięgiem?&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Miejsce&lt;/strong&gt;&lt;/p&gt;

    &lt;p&gt;Samo miejsce nie sprzyjało konferencji. Człowiek czuł się jak na filmie.
 Podczas konferencji kręcili się ludzie, którzy nie byli zainteresowani
 konferencją, tylko filmami.&lt;/p&gt;

    &lt;p&gt;Sala kinowa może i jest dobrym miejscem na organizację takiego
 wydarzenia, jednak nie w multipleksie.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Lunch&lt;/strong&gt;&lt;/p&gt;

    &lt;p&gt;Jeden stół z jedzeniem dla tak dużej konferencji to &lt;strong&gt;zdecydowanie za
 mało&lt;/strong&gt;. Na szczęście w galerii jest całe piętro z jedzeniem.&lt;/p&gt;

    &lt;p&gt;Tym samym jakiś tajski posiłek wylądował na moim talerzu, za którego
 zapłaciłem ze swojego portfela.&lt;/p&gt;

    &lt;p&gt;&lt;em&gt;Ewidentnie organizatorzy nie przemyśleli tego tematu.&lt;/em&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Powtarzające się prelekcje&lt;/strong&gt; na przykładzie Firebase&lt;/p&gt;

    &lt;p&gt;Rozumiem, że firma Google była sponsorem imprezy, ale 2 prelekcje o tym,
 jak świetny jest Firebase to przesada. Rozumiem reklamę swojego produktu,
 ale zbyt duży marketing szkodzi.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Jeden dzień prelekcji to za krótko&lt;/strong&gt; (subiektywnie)&lt;/p&gt;

    &lt;p&gt;Zwykle konferencje trwają 2-3 dni. Wiele osób nie mogło punktualnie
 uczestniczyć w wydarzeniu. Gdy był tylko jeden dzień na wysłuchanie
 prelekcji, a akurat podczas tego dnia przychodzi ekipa wymieniająca
 licznik prąd to jest delikatne smutno.&lt;/p&gt;

    &lt;p&gt;&lt;em&gt;Nie jestem przekonany do jednodniowych konferencji. Z drugiej
 strony, wolę jednodniową konferencję, niż jej brak.&lt;/em&gt;&lt;/p&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;konkurs&quot;&gt;Konkurs&lt;/h2&gt;

&lt;p&gt;Na zakończenie konferencji wylosowane były osoby, które wygrały upominki za
najlepsze tweety. &lt;strong&gt;Wiecie kto wybierał zwycięzców? Organizatorzy WarsawJS!&lt;/strong&gt;&lt;/p&gt;

&lt;figure class=&quot;social-center-block&quot;&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;pl&quot; dir=&quot;ltr&quot;&gt;Za kilka minut wychodźmy na scenę &lt;a href=&quot;https://twitter.com/hashtag/jspolandconf?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#jspolandconf&lt;/a&gt; ogłosić wyniki konkursu 😁 &lt;a href=&quot;https://t.co/yuwr6yZytS&quot;&gt;pic.twitter.com/yuwr6yZytS&lt;/a&gt;&lt;/p&gt;&amp;mdash; Piotr Kowalski (@piecioshka) &lt;a href=&quot;https://twitter.com/piecioshka/status/876830123202359296?ref_src=twsrc%5Etfw&quot;&gt;June 19, 2017&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async=&quot;&quot; src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;

&lt;/figure&gt;

&lt;h2 id=&quot;podsumowanie&quot;&gt;Podsumowanie&lt;/h2&gt;

&lt;p&gt;Jestem bardzo zadowolony, że takie wydarzenie miało miejsce.&lt;/p&gt;

&lt;p&gt;Zawsze będę czerpał radość z konferencji - lubię w nich brać udział.
Nie wiem, czy dałbym radę być odpowiedzialny za organizację takiego
przedsięwzięcia, ze względu na ogrom pracy jak trzeba wykonać przed
wydarzeniem. O tym najwięcej może powiedzieć &lt;a href=&quot;/blog/2016/06/30/konferencja-polyconf-2016.html&quot;&gt;Zaiste, który ponad 10 lat
organizuje konferencje&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Cieszę się, że frekwencja była tak duża. Nie była większa niż na
&lt;a href=&quot;/blog/2016/11/25/konferencja-ng-poland-2016.html&quot;&gt;ngPoland 2016&lt;/a&gt;, ale obecność ok. 200 osób motywuje do bycia jeszcze lepszym!&lt;/p&gt;

&lt;h2 id=&quot;podziękowanie&quot;&gt;Podziękowanie&lt;/h2&gt;

&lt;p&gt;Z tego miejsca chciałem podziękować &lt;a href=&quot;https://twitter.com/ngkalbarczyk&quot;&gt;Darkowi Kalbarczykowi&lt;/a&gt; -
organizatorowi konferencji, za:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;możliwość wzięcia udziału&lt;/li&gt;
  &lt;li&gt;pomysł konferencji oraz jej sprawne przeprowadzenie&lt;/li&gt;
  &lt;li&gt;podarowanie kilku biletów dla:
    &lt;ul&gt;
      &lt;li&gt;organizatorów WarsawJS&lt;/li&gt;
      &lt;li&gt;społeczności WarsawJS&lt;/li&gt;
      &lt;li&gt;czytelnika mojego bloga&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;oraz za możliwość wybrania zwycięzców konkursu!&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Darek&lt;/strong&gt;, wielkie &lt;em&gt;kudos&lt;/em&gt; dla Ciebie!&lt;/p&gt;

&lt;h2 id=&quot;inne-artykuły-o-konferencji&quot;&gt;Inne artykuły o konferencji&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://hackernoon.com/js-poland-2017-takeaways-aa32554c838a&quot;&gt;Piotr Lewandowski&lt;/a&gt; - 7 minutowe streszczenie prelekcji w języku angielskim.&lt;/li&gt;
&lt;/ul&gt;

&lt;!-- Resources --&gt;

</description>
            <pubDate>Wed, 28 Jun 2017 09:07:37 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2017/06/28/konferencja-js-poland-2017.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2017/06/28/konferencja-js-poland-2017.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/conference-js-poland-2017/js-poland-2017.jpg</image>
        </item>
        
        <item>
            <title>Jak zbudować licznik czasu?</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Dziś kolejny post z serii “Kodowanie na ekranie”. Na warsztat wrzucamy
stworzenie zegarka odmierzającego czas!&lt;/p&gt;

&lt;div class=&quot;youtube-lazy&quot; data-youtube-id=&quot;i5ogB2UaeJg&quot;&gt;&lt;/div&gt;

&lt;p&gt;Taki licznik pomaga mi podczas panelu dyskusyjnego, który prowadzę
podczas każdej edycji &lt;a href=&quot;/blog/2017/06/08/warsawjs-meetup-33.html&quot;&gt;WarsawJS Meetup&lt;/a&gt;. Jeśli chciałbyś np. odmierzać
czas ugotowania jajka, to taki widget na pewno Ci się przyda.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/coding-countdown/countdown.png&quot; itemprop=&quot;image&quot; alt=&quot;Baner promujący artykuł&quot; /&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;krok-po-kroku-&quot;&gt;Krok po kroku 👣&lt;/h2&gt;

&lt;p&gt;A teraz przedstawię w kilku krokach jak zrobić taki prosty widget:&lt;/p&gt;

&lt;h3 id=&quot;krok-1-fundament&quot;&gt;Krok 1. Fundament&lt;/h3&gt;

&lt;p&gt;Dodam plik ze skryptem (&lt;code class=&quot;highlighter-rouge&quot;&gt;main.js&lt;/code&gt;) oraz plik (&lt;code class=&quot;highlighter-rouge&quot;&gt;main.css&lt;/code&gt;) odpowiedzialny za
wygląd. W markupie stworzę kontener &lt;code class=&quot;highlighter-rouge&quot;&gt;h1&lt;/code&gt;, który będzie prezentował czas zegarka.&lt;/p&gt;

&lt;div class=&quot;language-html highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;script &lt;/span&gt;&lt;span class=&quot;na&quot;&gt;src=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;main.js&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;link&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;rel=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;stylesheet&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;href=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;main.css&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;h1&amp;gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;krok-2-uruchomienie-pierwszego-skryptu&quot;&gt;Krok 2. Uruchomienie pierwszego skryptu&lt;/h3&gt;

&lt;p&gt;W pliku &lt;code class=&quot;highlighter-rouge&quot;&gt;main.js&lt;/code&gt; stworzyłem funkcję, która uruchomi kod, dopiero po
załadowaniu strony. Funkcja będzie wrzucała do wcześniej stworzonego
znacznika &lt;code class=&quot;highlighter-rouge&quot;&gt;h1&lt;/code&gt; przypadkowy tekst.&lt;/p&gt;

&lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;setup&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;$clock&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;document&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;querySelector&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'h1'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;$clock&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;textContent&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'12312'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;nb&quot;&gt;window&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;addEventListener&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'DOMContentLoaded'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;setup&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;krok-3-stworzenie-klasy-w-javascript&quot;&gt;Krok 3. Stworzenie klasy w JavaScript&lt;/h3&gt;

&lt;p&gt;W dziedzinie problemu jest rzeczownik “zegarek”. Warto stworzyć taką klasę,
aby nadawać jej zachowania i przechowywać stan.&lt;/p&gt;

&lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Clock&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;constructor&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;$clock&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;document&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;querySelector&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'h1'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;nx&quot;&gt;render&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;$clock&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;textContent&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;setup&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;clock1&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Clock&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;clock1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;render&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;przykładowy tekst&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;krok-4-stworzenie-funkcji-która-uruchomi-odliczanie-zegarka&quot;&gt;Krok 4. Stworzenie funkcji, która uruchomi odliczanie zegarka&lt;/h3&gt;

&lt;p&gt;Każdy proces ma swój początek. W naszym przypadku, odliczanie musiało się
kiedyś zacząć. Z tego powodu dobrze jest mieć jedną funkcję, która wszystko
rozpoczyna - funkcja &lt;code class=&quot;highlighter-rouge&quot;&gt;start()&lt;/code&gt;.&lt;/p&gt;

&lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Clock&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;// ...&lt;/span&gt;

    &lt;span class=&quot;nx&quot;&gt;start&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;render&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;przykładowy tekst&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;setup&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;clock1&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Clock&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;clock1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;start&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;krok-5-parsowanie-czasu&quot;&gt;Krok 5. Parsowanie czasu&lt;/h3&gt;

&lt;p&gt;Stworzyłem funkcję &lt;code class=&quot;highlighter-rouge&quot;&gt;parseSeconds()&lt;/code&gt;, która będzie przyjmować czas w stylu
&lt;code class=&quot;highlighter-rouge&quot;&gt;&quot;10:00&quot;&lt;/code&gt;, a zwracać liczbę milisekund.&lt;/p&gt;

&lt;p&gt;Dlaczego funkcja jest statyczna? Ponieważ nie wymaga ona instancji klasy
(nie ma w niej odwołania do &lt;code class=&quot;highlighter-rouge&quot;&gt;this&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;Ciekawym aspektem jest konwersja tablicy stringów na tablicę liczb.
Wykorzystałem do tego funkcję &lt;code class=&quot;highlighter-rouge&quot;&gt;map()&lt;/code&gt; oraz konstruktor &lt;code class=&quot;highlighter-rouge&quot;&gt;Number&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;W stałej &lt;code class=&quot;highlighter-rouge&quot;&gt;ONE_SECOND&lt;/code&gt; jest liczba milisekund w sekundzie. Przydaje się ona we
operacjach matematycznych.&lt;/p&gt;

&lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;ONE_SECOND&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;kd&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Clock&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;constructor&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;limitTime&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;c1&quot;&gt;// ...&lt;/span&gt;

    &lt;span class=&quot;nx&quot;&gt;start&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;formattedTime&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;limitTime&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Clock&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;parseSeconds&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;formattedTime&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;nx&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;formattedTime&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;kr&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;parseSeconds&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;time&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;kd&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;minutes&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;seconds&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;time&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;split&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;':'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;Number&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;minutes&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;60&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;ONE_SECOND&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;seconds&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;ONE_SECOND&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;setup&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;clock1&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Clock&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;clock1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;start&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'10:00'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;krok-6-renderowanie-czasu&quot;&gt;Krok 6. Renderowanie czasu&lt;/h2&gt;

&lt;p&gt;Podstawowym zadaniem jest wyświetlanie czasu, który zbudowany jest na
podstawie zdefiniowanego na starcie limitu oraz czasu, który rośnie co sekundę.&lt;/p&gt;

&lt;p&gt;Wykorzystując te 2 stany mamy możliwość stworzenie rożnicy (ang. diff),
dzięki czemu uzyskamy efekt, że czas się odlicza do zera.&lt;/p&gt;

&lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;ONE_SECOND&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;kd&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Clock&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;constructor&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;c1&quot;&gt;// ...&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;currentTime&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;c1&quot;&gt;// ...&lt;/span&gt;

    &lt;span class=&quot;nx&quot;&gt;start&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;formattedTime&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;limitTime&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Clock&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;parseSeconds&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;formattedTime&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;kd&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;diff&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;limitTime&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;currentTime&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;render&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;diff&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;krok-7-wykorzystanie-interwału&quot;&gt;Krok 7. Wykorzystanie interwału&lt;/h2&gt;

&lt;p&gt;Na początku, w konstruktorze tworzę nową właściwość obiektu, która będzie
przechowywała numer kolejnego interwału (to zwraca funkcją &lt;code class=&quot;highlighter-rouge&quot;&gt;setInterval()&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;Kiedy proces odliczania będzie się zaczynał to aby mógł on trwać w czasie,
wykorzystałem funkcję tworzącą interwał.&lt;/p&gt;

&lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Clock&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;constructor&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;c1&quot;&gt;// ...&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;clock&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;c1&quot;&gt;// ...&lt;/span&gt;

    &lt;span class=&quot;nx&quot;&gt;start&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;formattedTime&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;limitTime&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Clock&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;parseSeconds&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;formattedTime&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;clock&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;setInterval&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;currentTime&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;ONE_SECOND&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
            &lt;span class=&quot;kd&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;diff&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;limitTime&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;currentTime&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;render&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;diff&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;},&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;ONE_SECOND&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;krok-8-zatrzymanie-zegarka&quot;&gt;Krok 8. Zatrzymanie zegarka&lt;/h2&gt;

&lt;p&gt;Wykorzystałem funkcję &lt;code class=&quot;highlighter-rouge&quot;&gt;clearInterval()&lt;/code&gt;, po to, aby zatrzymać obecny interwał.&lt;/p&gt;

&lt;blockquote class=&quot;block-good&quot;&gt;
  &lt;h3 id=&quot;-wskazówka&quot;&gt;&lt;i class=&quot;icon-good&quot;&gt;&lt;/i&gt; Wskazówka&lt;/h3&gt;
  &lt;p&gt;Nie ma możliwość wznawiania interwału. Możesz stworzyć kolejny.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Clock&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;// ...&lt;/span&gt;

    &lt;span class=&quot;nx&quot;&gt;start&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;formattedTime&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;c1&quot;&gt;// ...&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;clock&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;setInterval&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;c1&quot;&gt;// ...&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;isFinished&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;())&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
                &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;stop&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
            &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;},&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;ONE_SECOND&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;nx&quot;&gt;stop&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;nx&quot;&gt;clearInterval&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;clock&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;nx&quot;&gt;isFinished&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;currentTime&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;limitTime&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;krok-9-problem-brak-prezentacji-początkowego-czasu&quot;&gt;Krok 9. Problem: brak prezentacji początkowego czasu&lt;/h2&gt;

&lt;p&gt;Aby poradzić sobie z tym problemem, musisz przed uruchomieniem odmierzania
czasu przez zegarek wyrenderować obecny czas. Stąd też funkcja &lt;code class=&quot;highlighter-rouge&quot;&gt;update()&lt;/code&gt;
jest uruchomiona przez &lt;code class=&quot;highlighter-rouge&quot;&gt;setInterval()&lt;/code&gt;, ale też i w nim.&lt;/p&gt;

&lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Clock&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;// ...&lt;/span&gt;

    &lt;span class=&quot;nx&quot;&gt;start&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;formattedTime&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;c1&quot;&gt;// ...&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;update&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;clock&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;setInterval&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;c1&quot;&gt;// ...&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;update&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
            &lt;span class=&quot;c1&quot;&gt;// ...&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;},&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;ONE_SECOND&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;nx&quot;&gt;update&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;kd&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;remain&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;getRemainingTime&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
        &lt;span class=&quot;kd&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;time&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Clock&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;formattedTime&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;remain&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;render&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;time&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;nx&quot;&gt;getRemainingTime&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;limitTime&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;currentTime&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;c1&quot;&gt;// ...&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;krok-10-prezentacja-sformatowanego-czasu&quot;&gt;Krok 10. Prezentacja sformatowanego czasu&lt;/h2&gt;

&lt;p&gt;Zegarek obecnie wyświetla milisekundy. W takim stanie nie przyda się on wielu
osobom. Należy sformatować czas do postaci czytelnej, tj. &lt;code class=&quot;highlighter-rouge&quot;&gt;MM:SS&lt;/code&gt; (minuty i
sekundy).&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Ważne jest zrzutowanie liczby minut do postaci integera (w dół), stąd też
wykorzystuję funkcję &lt;code class=&quot;highlighter-rouge&quot;&gt;Math.floor()&lt;/code&gt;. Nie ma sensu pokazywać niewymiernych
liczb.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Clock&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;// ...&lt;/span&gt;

    &lt;span class=&quot;nx&quot;&gt;update&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;kd&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;remain&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;getRemainingTime&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
        &lt;span class=&quot;kd&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;time&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Clock&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;formattedTime&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;remain&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;render&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;time&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;c1&quot;&gt;// ...&lt;/span&gt;

    &lt;span class=&quot;kr&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;formattedTime&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;milliseconds&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;kd&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;minutes&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;Math&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;floor&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;milliseconds&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;ONE_SECOND&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;60&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;kd&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;seconds&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;milliseconds&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;ONE_SECOND&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;60&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;minutes&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;seconds&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;krok-11-prezentacja-minut-i-sekund-jako-grupa-2-cyfr&quot;&gt;Krok 11. Prezentacja minut i sekund jako grupa 2 cyfr&lt;/h2&gt;

&lt;p&gt;Wykorzystałem najnowsze (ES2017) możliwości łańcucha znaków, jakim jest
dynamiczne dodawanie znaków przed nim, ale też i po.&lt;/p&gt;

&lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Clock&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;// ...&lt;/span&gt;

    &lt;span class=&quot;kr&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;formattedTime&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;milliseconds&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;kd&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;minutes&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;Math&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;floor&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;milliseconds&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;ONE_SECOND&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;60&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;kd&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;seconds&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;milliseconds&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;ONE_SECOND&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;60&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;nx&quot;&gt;minutes&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;minutes&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;padStart&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'0'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;nx&quot;&gt;seconds&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;seconds&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;padStart&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'0'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;minutes&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;seconds&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;krok-12-centrowanie-tekstu&quot;&gt;Krok 12. Centrowanie tekstu&lt;/h2&gt;

&lt;p&gt;Nigdy nie przypuszczałem, że centrowanie tekstu w przyszłości będzie skupiało
się tylko na 3 linijkach 😄&lt;/p&gt;

&lt;div class=&quot;language-css highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nt&quot;&gt;body&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;nl&quot;&gt;display&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;flex&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;nl&quot;&gt;align-items&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;center&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;nl&quot;&gt;justify-content&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;center&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;krok-13-kolorowanie-tekstu-kiedy-czas-się-skończy&quot;&gt;Krok 13. Kolorowanie tekstu kiedy czas się skończy&lt;/h2&gt;

&lt;p&gt;Niesamowicie potrzebny feature, który poinformuje bardzo szybko, że czas się
skończył kolorując go na czerwono.&lt;/p&gt;

&lt;p&gt;Plik: &lt;code class=&quot;highlighter-rouge&quot;&gt;main.css&lt;/code&gt;&lt;/p&gt;

&lt;div class=&quot;language-css highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;/* ... */&lt;/span&gt;
&lt;span class=&quot;nc&quot;&gt;.red-color&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;nl&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;red&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;nl&quot;&gt;text-shadow&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;1px&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;1px&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;3px&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;#000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Plik: &lt;code class=&quot;highlighter-rouge&quot;&gt;main.js&lt;/code&gt;&lt;/p&gt;

&lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Clock&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;// ....&lt;/span&gt;

    &lt;span class=&quot;nx&quot;&gt;stop&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;nx&quot;&gt;clearInterval&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;clock&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;$clock&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;classList&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;add&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'red-color'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;c1&quot;&gt;// ....&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;krok-14-dodanie-muzyki&quot;&gt;Krok 14. Dodanie muzyki&lt;/h2&gt;

&lt;p&gt;Wykorzystuję konstruktor &lt;code class=&quot;highlighter-rouge&quot;&gt;Audio&lt;/code&gt;, do stworzenia obiektu, który to załaduje i
odtworzy dowolnie wskazany plik muzyczny.&lt;/p&gt;

&lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Clock&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;// ...&lt;/span&gt;

    &lt;span class=&quot;nx&quot;&gt;stop&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;nx&quot;&gt;clearInterval&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;clock&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;$clock&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;classList&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;add&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'red-color'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;nx&quot;&gt;playAudio&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'alarm.mp3'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;c1&quot;&gt;// ...&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;playAudio&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;audio&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Audio&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;audio&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;load&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;audio&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;play&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;// ...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;krok-15-pobieranie-czasu-z-urla&quot;&gt;Krok 15. Pobieranie czasu z URLa&lt;/h2&gt;

&lt;p&gt;Czas umieszczę w &lt;code class=&quot;highlighter-rouge&quot;&gt;hash&lt;/code&gt;u URLa. Aby go pobrać, wykorzystałem właściwość
&lt;code class=&quot;highlighter-rouge&quot;&gt;hash&lt;/code&gt; w obiekcie &lt;code class=&quot;highlighter-rouge&quot;&gt;window.location&lt;/code&gt;. Dodałem też feature, że jeśli
chcesz zmienić hasha, to przeładowuję stronę, aby uruchomić od nowa zegarek.
Wszystko po to, aby wchodząć na stronę np.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;dl&gt;
      &lt;dt&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;http://localhost/countdown/#10:00&lt;/code&gt;&lt;/dt&gt;
      &lt;dd&gt;odliczało się 10 minut&lt;/dd&gt;
    &lt;/dl&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;dl&gt;
      &lt;dt&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;http://localhost/countdown/#05:00&lt;/code&gt;&lt;/dt&gt;
      &lt;dd&gt;odliczało się 5 minut&lt;/dd&gt;
    &lt;/dl&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;dl&gt;
      &lt;dt&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;http://localhost/countdown/#03:15&lt;/code&gt;&lt;/dt&gt;
      &lt;dd&gt;odliczało się 3 minut i 15 sekund&lt;/dd&gt;
    &lt;/dl&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;// ...&lt;/span&gt;

&lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;setup&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;clock1&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Clock&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;clock1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;start&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;location&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;hash&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;slice&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;));&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;// ...&lt;/span&gt;

&lt;span class=&quot;nb&quot;&gt;window&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;addEventListener&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'hashchange'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;nb&quot;&gt;window&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;location&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;reload&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;});&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;The end 🎉&lt;/strong&gt;&lt;/p&gt;

&lt;h2 id=&quot;podsumowanie&quot;&gt;Podsumowanie&lt;/h2&gt;

&lt;p&gt;Chcesz zobaczyć &lt;mark&gt;countdown&lt;/mark&gt; w praktyce?&lt;/p&gt;

&lt;p data-embed-version=&quot;2&quot; data-height=&quot;300&quot; data-preview=&quot;true&quot; data-theme-id=&quot;11473&quot; data-default-tab=&quot;result&quot; data-theme=&quot;11473&quot; data-user=&quot;piecioshka&quot; data-slug-hash=&quot;awZmme&quot; class=&quot;codepen&quot;&gt;See the &lt;a href=&quot;https://codepen.io/piecioshka/pen/awZmme/&quot;&gt;pen&lt;/a&gt; on &lt;a href=&quot;//codepen.io&quot;&gt;CodePen&lt;/a&gt;.&lt;/p&gt;
&lt;script async=&quot;&quot; src=&quot;https://production-assets.codepen.io/assets/embed/ei.js&quot;&gt;&lt;/script&gt;

&lt;!-- Resources --&gt;

</description>
            <pubDate>Mon, 12 Jun 2017 21:54:51 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2017/06/12/jak-zbudowac-licznik-czasu.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2017/06/12/jak-zbudowac-licznik-czasu.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/coding-countdown/countdown.png</image>
        </item>
        
        <item>
            <title>Kilka wskazówek SEO</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Kilka dni temu, kolega zapytał się mnie czy pomogę mu wypozycjonować stronę?
Istnieją specjalne stanowiska w branży IT, które zajmują się tym aspektem,
jednak jako programista Front-end znam kilka elementów, które mogą pomóc w
pozycjonowaniu. Dlatego też postanowiłem, że odpowiem Bartkowi pisząc ten
artykuł, po to, aby to nie tylko on mógł skorzystać z tego co ja wiem.&lt;/p&gt;

&lt;p&gt;Dlaczego tylko “mogą pomóc”? Ponieważ proces pozycjonowania jest złożonym
zagadnieniem nie posiadającym jednego słusznego rozwiązania. Istnieje wiele
aspektów, na które trzeba zwrócić uwagę, aby strona była wyżej w wynikach
wyszukiwania. &lt;strong&gt;Najpopularniejsze dla Google to wartościowa i niepowielana
treść.&lt;/strong&gt;&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/seo/seo.png&quot; itemprop=&quot;image&quot; alt=&quot;Baner promujący artykuł&quot; /&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;ludzka-świadomość&quot;&gt;Ludzka świadomość&lt;/h2&gt;

&lt;p&gt;Coraz więcej ludzi poznaje świat internetu od strony “pozycjonowania”.
Kiedy wkraczasz w życie dorosłe i zakładasz swój biznes, to chcesz się wybić
na rynku tworząc stronę “wizytówkę”, ale zauważasz, że w wynikach
wyszukiwania Twoja strona jest gdzieś na 5 stronie.&lt;/p&gt;

&lt;p&gt;Rodzi się w Twojej głowie pytanie: &lt;strong&gt;co muszę zrobić, aby pojawić się na
pierwszej stronie z wynikami wyszukiwania po wpisaniu frazy XXX?&lt;/strong&gt;&lt;/p&gt;

&lt;h2 id=&quot;pozycjonowanie-vs-seo-vs-roboty&quot;&gt;Pozycjonowanie vs SEO vs. Roboty&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;dl&gt;
      &lt;dt&gt;Pozycjonowanie&lt;/dt&gt;
      &lt;dd&gt;Sztuka “pozycjonowania” polega na tym, że strona pojawia się wyżej w wynikach
wyszukiwania po wpisaniu odpowiedniej frazy. Aby spowodować, że strona jest
lepiej wypozycjonowana warto poddać ją procesowi SEO.&lt;/dd&gt;
    &lt;/dl&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
  &lt;p&gt;Znane są przypadki, że ktoś wypozycjonował stronę niezwiązaną z
faktycznym słowem kluczowym, a jednak wyświetlała się ona wyżej w wynikach
wyszukiwania. Więcej do poczytania o takim przypadku &lt;a href=&quot;https://www.pcformat.pl/News-Stanie-przed-sadem-za-pozycjonowanie-strony-prezydenta,n,2236&quot;&gt;tutaj&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;dl&gt;
      &lt;dt&gt;SEO&lt;/dt&gt;
      &lt;dd&gt;Akronim słów &lt;strong&gt;Search Engine Optimization&lt;/strong&gt;, czyli
procesu, który polega na modyfikacji strony internetowej tak, aby wyświetlała
się ona wyżej w wynikach wyszukiwania.&lt;/dd&gt;
    &lt;/dl&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;dl&gt;
      &lt;dt&gt;Roboty&lt;/dt&gt;
      &lt;dd&gt;Aplikacje serwerowe, które ciągle przeszukują internet pod kątem
aktualizacji treści i analizy słów kluczowych. Proces ten nazywa się
“indeksacją”. W tym miejscu narzuca się pierwsza porada, tj. im więcej będziecie
mieć treści na stronie, tym będzie ona wyżej w wynikach wyszukiwania.
Więcej porad na liście poniżej.

        &lt;p&gt;Inne nazwy to: “crawler”, “agent” albo “spider”.&lt;/p&gt;

        &lt;p&gt;Przykładem jest &lt;strong&gt;Googlebot&lt;/strong&gt; - najpopularniejszy taki skaner.&lt;/p&gt;
      &lt;/dd&gt;
    &lt;/dl&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;dl&gt;
      &lt;dt&gt;SERP&lt;/dt&gt;
      &lt;dd&gt;Akronim słów &lt;strong&gt;Search Engine Results Page&lt;/strong&gt;, czyli listy
wyników wyszukiwania, która pojawi się jako efekt pracy wyszukiwarki do której
wpiszesz frazę. Lista jest posortowana pod kątem stron, które są dla Ciebie
i Twojego zapytania najtrafniejsze.&lt;/dd&gt;
    &lt;/dl&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/seo/googlebot.jpg&quot; alt=&quot;Robot trzymający w lewym ręku kolorowe kwiatki&quot; /&gt;
    &lt;figcaption&gt;
        Nieoficjalne logo Googlebot-a.
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;-wskazówki&quot;&gt;&lt;i class=&quot;icon-good&quot;&gt;&lt;/i&gt; Wskazówki&lt;/h2&gt;

&lt;p&gt;Poniżej przedstawiam Ci listę moich porad, które na pewno poprawią ranking
Twojej strony. Jednak tak jak już wspomniałem wcześniej, &lt;strong&gt;nie gwarantują, że
strona osiągnie szczyt&lt;/strong&gt;. W sumie to nawet mogę się założyć, że bez
dodatkowego wsparcia - płatnej reklamy - nie będziesz mógł konkurować na
popularne hasła. Firmy płacą odpowiednim instytucjom, aby ich strony były
wysoko. Aby ich przeskoczyć trzeba… no właśnie, trzeba jeszcze więcej
zainwestować w SEO. Nierealne dla zwykłego śmiertelnika.&lt;/p&gt;

&lt;p&gt;Poniższa lista uporządkowana w kolejności w jakiej trzeba dbać, aby strona
była wyżej w wyszukiwarce. Zaznaczam, że kolejność pochodzi z mojego
doświadczenia.&lt;/p&gt;

&lt;h3 id=&quot;1-artykuły-czyli-blog-na-stronie&quot;&gt;1. Artykuły, czyli blog na stronie&lt;/h3&gt;

&lt;p&gt;Im więcej treści bogatych w kluczowy kontent (kontent zawierający
odpowiednie słowa kluczowe) tym więcej możliwości dotarcia do strona.
Dlatego ważne jest aby Twoja strona posiadała sekcję “blog”, albo coś w
tym stylu. W tym miejscu mógłbyś wpisywać jakieś artykuły związane z Twoim
produktem albo usługą, którą chcesz sprzedać.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Słowa kluczowe mogą być odmieniane. Googlebot sobie z tym poradzi.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Taka forma promocji nazywa się &lt;code class=&quot;highlighter-rouge&quot;&gt;Content Marketing&lt;/code&gt;.&lt;/p&gt;

&lt;h3 id=&quot;2-linki&quot;&gt;2. Linki&lt;/h3&gt;

&lt;p&gt;Im więcej stron zawiera odnośniki do Twojej witryny, tym większy posiada ona
PageRank. Jest to taki ranking wymyślony przez założycieli Google-a, który
pomaga określić poziom strony w wynikach wyszukiwania.&lt;/p&gt;

&lt;p&gt;PageRank jest brany pod uwagę pozycji w wynikach wyszukiwania, jednak od
jakiegoś czasu nie jest to najmocniejszy argument stojący za wyższą pozycją
na liście wyników wyszukiwarki.&lt;/p&gt;

&lt;h4 id=&quot;aktualizacja&quot;&gt;&lt;mark&gt;Aktualizacja&lt;/mark&gt;&lt;/h4&gt;

&lt;p&gt;W komentarzach pojawiała się informacja, że PageRank nie jest już w ogóle
brany pod uwagę w procesie pozycjonowania.&lt;/p&gt;

&lt;h3 id=&quot;3-walidacja-html&quot;&gt;3. &lt;del&gt;Walidacja HTML&lt;/del&gt;&lt;/h3&gt;

&lt;p&gt;&lt;del&gt;Jednym z podstaw SEO jest wdrożenie semantyki języka HTML.
Semantyka, to wykorzystywanie znaczników HTML zgodnie z ich przeznaczeniem,
tylko po aby Twoja strona została dobrze przeskanowana przez roboty.&lt;/del&gt;&lt;/p&gt;

&lt;p&gt;Semantyka strony nie ma znaczenia dla robotów skanujących Twoją stronę.
Jednak to nie znaczy, że nie musisz o nią dbać.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Trzeba dbać o to, aby wykorzystywać język HTML zgodnie z zasadami.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3 id=&quot;4-wykorzystanie-specjalnych-atrybutów-schema&quot;&gt;4. Wykorzystanie specjalnych atrybutów &lt;code class=&quot;highlighter-rouge&quot;&gt;Schema&lt;/code&gt;&lt;/h3&gt;

&lt;p&gt;Treść w internecie została skategoryzowana po to, aby wyszukiwarkom łatwo
było parsować dane, które wyświetlane są użytkownikowi. I tak jeśli chcesz
wyświetlić zdjęcie z opisem to wykorzystujesz odpowiednie atrybuty w użytych
znacznikach, aby opisać ten fragment strony. Wszystko po to, aby silniki
wyszukiwarek mogły sobie lepiej poradzić wyłuskując odpowiednie dane.&lt;/p&gt;

&lt;p&gt;Zasady zdefiniowane są pod adresem: &lt;a href=&quot;http://schema.org/&quot;&gt;schema.org&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Aby zweryfikować czy dobrze (albo źle) zaimplementowałeś specyfikację Schema
skorzystaj z &lt;a href=&quot;https://search.google.com/structured-data/testing-tool&quot;&gt;tego&lt;/a&gt; narzędzia firmy Google.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/seo/schema-results.png&quot; alt=&quot;&quot; /&gt;
    &lt;figcaption&gt;
        Wynik analizy narzędzia weryfikującego poprawność użycia atrybutów
        Scheme dla strony &lt;strong&gt;https://piecioshka.pl/blog/&lt;/strong&gt;.
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h3 id=&quot;5-plik-robotstxt&quot;&gt;5. Plik &lt;code class=&quot;highlighter-rouge&quot;&gt;robots.txt&lt;/code&gt;&lt;/h3&gt;

&lt;p&gt;Idea tego pliku jest prosta, zdefiniować adresy, które nie będą analizowane
przez roboty. W telegraficznym skrócie, działa to tak, że wpisujesz w pliku
ścieżki do katalogów, które chcesz aby robot ignorował i nie zaglądał tam.&lt;/p&gt;

&lt;blockquote class=&quot;block-poor&quot;&gt;
  &lt;h3 id=&quot;-uwaga&quot;&gt;&lt;i class=&quot;icon-poor&quot;&gt;&lt;/i&gt; Uwaga&lt;/h3&gt;
  &lt;p&gt;Pamiętaj, że to, co robot nie widzi, może zobaczyć człowiek.
&lt;strong&gt;Cokolwiek wpiszesz do pliku &lt;code class=&quot;highlighter-rouge&quot;&gt;robots.txt&lt;/code&gt; może zostać podejrzane przez
dowolnego użytkownika internetu.&lt;/strong&gt; Miej to na uwadze.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Przykładowy plik pochodzi z głównej strony największej korporacji w świecie IT,
czyli Google - &lt;a href=&quot;https://www.google.com/robots.txt&quot;&gt;www.google.com/robots.txt&lt;/a&gt;&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;PS Proponuję dopisać na koniec pliku &lt;code class=&quot;highlighter-rouge&quot;&gt;robots.txt&lt;/code&gt; osadzenie sajtmapy:&lt;/p&gt;

&lt;div class=&quot;language-html highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;Sitemap: https://piecioshka.pl/sitemap.xml
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;6-mapa-strony-sitemap&quot;&gt;6. Mapa strony (&lt;code class=&quot;highlighter-rouge&quot;&gt;sitemap&lt;/code&gt;)&lt;/h3&gt;

&lt;p&gt;Kiedy tworzysz serwis i chcesz mieć pewność, że robot przeskanuje wymienione
przez Ciebie URL-e możesz zdefiniować je w specjalnej mapie.&lt;/p&gt;

&lt;p&gt;Rekomendowana nazwa dla pliku będącego mapą to &lt;code class=&quot;highlighter-rouge&quot;&gt;sitemap.xml&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Jeśli chciałby zgłosić mapę witryny w dwóch najpopularniejszych robotach, to
wystarczy, że wejdziesz na poniższe adresy. Oczywiście zamień XXX na adres do
Twojej strony:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Bing: &lt;code class=&quot;highlighter-rouge&quot;&gt;http://www.bing.com/webmaster/ping.aspx?siteMap=XXX&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;Google: &lt;code class=&quot;highlighter-rouge&quot;&gt;http://www.google.com/webmasters/tools/ping?sitemap=XXX&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;7-google-webmaster-tools-search-console&quot;&gt;7. Google &lt;s&gt;Webmaster Tools&lt;/s&gt; Search Console&lt;/h3&gt;

&lt;p&gt;Bardzo ważne jest zgłoszenie strony do tego narzędzia. Google je stworzyło
po to  abyś mógł obserwować jak Googlebot radzi sobie z indeksowaniem Twojej
witryny.&lt;/p&gt;

&lt;p&gt;Link do &lt;a href=&quot;https://www.google.com/webmasters/tools/home&quot;&gt;narzędzia&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id=&quot;8-social-media&quot;&gt;8. Social media&lt;/h3&gt;

&lt;p&gt;Facebook stworzył pewien zapis definiujący wyświetlaną stronę i nazwał go:
&lt;mark&gt;The Open Graph&lt;/mark&gt;.&lt;/p&gt;

&lt;p&gt;OGP to nic innego jak customowe meta tagi. Przykład:&lt;/p&gt;

&lt;div class=&quot;language-html highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;meta&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;property=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;og:image&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;content=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;https://piecioshka.pl/assets/images/posts/seo/seo.png&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Istnieje pewne narzędzie, które weryfikuje, czy OGP jest dobrze użyte na
stronie. Nazywa się &lt;a href=&quot;https://developers.facebook.com/tools/debug/og/object/&quot;&gt;Facebook Debugger&lt;/a&gt;.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/seo/facebook-sharing.png&quot; alt=&quot;&quot; /&gt;
    &lt;figcaption&gt;
        Wynik testu narzędzia &quot;Facebook Debugger&quot; na stronie
        &lt;strong&gt;https://piecioshka.pl/blog/&lt;/strong&gt;.
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;hr /&gt;

&lt;p&gt;Mniej popularny w Polsce jest z kolei Twitter-owy pomysł na prezentację
dynamicznych danych, czyli &lt;mark&gt;Twitter Card&lt;/mark&gt;.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/seo/twitter-card.png&quot; alt=&quot;&quot; /&gt;
    &lt;figcaption&gt;
        Wynik testu narzędzia &quot;Twitter Card&quot; na stronie
        &lt;strong&gt;https://piecioshka.pl/blog/&lt;/strong&gt;.
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h3 id=&quot;9-metadane&quot;&gt;9. Metadane&lt;/h3&gt;

&lt;p&gt;Poprzez metadane, mam na myśli takie elementy strony, które zawarte są w
następujących znacznikach:&lt;/p&gt;

&lt;h4 id=&quot;91-tytuł-strony&quot;&gt;9.1. Tytuł strony&lt;/h4&gt;

&lt;p&gt;Znacznik &lt;code class=&quot;highlighter-rouge&quot;&gt;&amp;lt;title&amp;gt;&lt;/code&gt; służy do definicji tytułu strony. Oczywiści tak samo jak
nazwa pliku może być tylko jedna, tak i tytuł strony może być tylko jeden.&lt;/p&gt;

&lt;p&gt;Tytuł strony to maksymalnie 70 znaków.&lt;/p&gt;

&lt;h4 id=&quot;92-opis-strony&quot;&gt;9.2. Opis strony&lt;/h4&gt;

&lt;p&gt;À propos znacznika z opisem strony, czyli:&lt;/p&gt;

&lt;div class=&quot;language-html highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;meta&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;description&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;content=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;XXX&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;to zapraszam do obejrzenia tego krótkiego wystąpienia:&lt;/p&gt;

&lt;div class=&quot;youtube-lazy&quot; data-youtube-id=&quot;vS1Mw1Adrk0&quot;&gt;&lt;/div&gt;

&lt;p&gt;Jeśli nie chce Ci się oglądać to w skrócie:&lt;/p&gt;

&lt;p&gt;Pole “description” nie jest brane pod uwagę ustawiając ranking dla strony
na której się znajduje. Jest wykorzystywane tylko do prezentacji w wynikach
wyszukiwania.&lt;/p&gt;

&lt;h4 id=&quot;93-słowa-kluczowe-strony&quot;&gt;9.3. Słowa kluczowe strony&lt;/h4&gt;

&lt;p&gt;Ideą znacznika &lt;code class=&quot;highlighter-rouge&quot;&gt;&amp;lt;meta name=&quot;keywords&quot; content=&quot;XXX&quot;/&amp;gt;&lt;/code&gt; miało być
zdefiniowanie słów kluczowych pod jakimi Twoja strona byłaby dostępna dla
użytkowników internetu.&lt;/p&gt;

&lt;blockquote class=&quot;block-average&quot;&gt;
  &lt;h3 id=&quot;-uwaga-na-słowa-kluczowe&quot;&gt;&lt;i class=&quot;icon-average&quot;&gt;&lt;/i&gt; Uwaga na słowa kluczowe!&lt;/h3&gt;
  &lt;p&gt;Ludzie przez wiele lat przesadzali i wpisywali
zbyt dużą liczbę słów, które nie były powiązane ze stroną.
Została wprowadzona poprawka do algorytmu Googlebot-a, aby zaczął ignorować
wartość tego pola.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3 id=&quot;10-korzystać-z-nagłówków-h1-h2-itd&quot;&gt;10. &lt;del&gt;Korzystać z nagłówków &lt;code class=&quot;highlighter-rouge&quot;&gt;&amp;lt;h1&amp;gt;&lt;/code&gt;, &lt;code class=&quot;highlighter-rouge&quot;&gt;&amp;lt;h2&amp;gt;&lt;/code&gt;, itd&lt;/del&gt;&lt;/h3&gt;

&lt;blockquote class=&quot;block-good&quot;&gt;
  &lt;p&gt;&lt;a href=&quot;https://comandeer.github.io/blog/html-css/a11y/2017/07/04/o-naglowkach-slow-kilka.html&quot;&gt;Comandeer&lt;/a&gt; pięknie opisał, że nie korzystaniem z semantyki
podczas budowania markupu nie wpływa na SEO.&lt;/p&gt;

  &lt;p&gt;Aby przeczytać pełny raport wejdź na &lt;a href=&quot;https://comandeer.github.io/blog/html-css/a11y/2017/07/04/o-naglowkach-slow-kilka.html&quot;&gt;ten&lt;/a&gt; artykuł.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3 id=&quot;11-definiowanie-tekstu-alternatywnego-dla-obrazków&quot;&gt;11. Definiowanie tekstu alternatywnego dla obrazków&lt;/h3&gt;

&lt;p&gt;Jeśli osadzasz obrazek, to zadbaj o to, aby atrybut &lt;code class=&quot;highlighter-rouge&quot;&gt;alt&lt;/code&gt; zawsze posiadał
tekst, który będzie zawierał opis tego co znajduje się na obrazku. Przykład:&lt;/p&gt;

&lt;div class=&quot;language-html highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;img&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;src=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;iphone-5-spring.jpg&quot;&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;alt=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Telefon iPhone 5, leży na zielonych liściach&quot;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;PS Obrazki osadzone znacznikiem &lt;code class=&quot;highlighter-rouge&quot;&gt;&amp;lt;img&amp;gt;&lt;/code&gt; będą indeksowane przez roboty.
Jeśli chcesz wyświetlić obrazek, który nie zostanie zindeksowany to
skorzystaj z reguły CSS &lt;code class=&quot;highlighter-rouge&quot;&gt;background-image&lt;/code&gt;.&lt;/p&gt;

&lt;h3 id=&quot;12-nie-korzystać-z-hashy-na-stronach&quot;&gt;12. Nie korzystać z hashy na stronach&lt;/h3&gt;

&lt;p&gt;Lepiej wykorzystać:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;History API (Push state)&lt;/li&gt;
  &lt;li&gt;lub &lt;code class=&quot;highlighter-rouge&quot;&gt;#!&lt;/code&gt; jako łącznika strony z domeną. Przykładem jest aplikacja
  SPA mojego autorstwa napisana w Backbonie: https://grabowska.org&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;13-ładnie-wyglądające-adresy-url&quot;&gt;13. “Ładnie wyglądające” adresy URL&lt;/h3&gt;

&lt;p&gt;Co mam na myśli pisząc ładne URLe? Chodzi mi o to, że w URLu jest np. treść
artykułu poddana procesowi “slugowania”.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Wypróbuj to narzędzie: &lt;a href=&quot;https://you.tools/slugify/&quot;&gt;https://you.tools/slugify/&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Wyżej wymienione narzędzie zamienia wszelkie białe znaki na myślniki, duże
literki na małe oraz polskie litery na te z alfabetu angielskiego. Przykład:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;na wejściu: &lt;code class=&quot;highlighter-rouge&quot;&gt;Kilka wskazówek SEO&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;na wyjściu: &lt;code class=&quot;highlighter-rouge&quot;&gt;kilka-wskazowek-seo&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Inaczej czyta się taki URL:&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;http://example.org/kilka-wskazowek-seo.html
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;aniżeli&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;http://example.org/98345.html
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;gdzie &lt;code class=&quot;highlighter-rouge&quot;&gt;98345&lt;/code&gt; jest identyfikatorem artykułu w bazie danych.&lt;/p&gt;

&lt;h3 id=&quot;14-https&quot;&gt;14. HTTPS&lt;/h3&gt;

&lt;p&gt;Od jakiegoś czasu (prawdopodobnie od wejścia PWA) Google postanowiło, że
strony nie wykorzystujące bezpiecznego protokołu HTTPS będą miały redukowane
rankingi spadając tym samym w SERP-ie.&lt;/p&gt;

&lt;blockquote class=&quot;block-good&quot;&gt;
  &lt;h3 id=&quot;-czas-na-zmiany&quot;&gt;&lt;i class=&quot;icon-good&quot;&gt;&lt;/i&gt; Czas na zmiany&lt;/h3&gt;
  &lt;p&gt;Google zmienia internet na bezpieczniejszy. Ma taką siłę i może to robić.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;W pełni popieram takie stanowisko. W dzisiejszych czasach konfiguracja SSLa
po stronie serwera to prosta sprawa.&lt;/p&gt;

&lt;h3 id=&quot;15-pwa---progressive-web-app&quot;&gt;15. PWA - Progressive Web App&lt;/h3&gt;

&lt;p&gt;Nowy typ aplikacji ma zrewolucjonizować rynek aplikacji mobilnych. Zamiast
tworzyć aplikację mobilną dla swojego serwisu, wystarczy że przerobisz stronę
WWW na aplikację progresywną i użytkownicy telefonów będą mogli z niej tak
samo korzystać jak z aplikacji mobilnej, którą muszą pobrać i zainstalować.&lt;/p&gt;

&lt;p&gt;Aplikacja PWA będzie ważyła maksymalnie kilka MB (w zależności od
wykorzystanej przestrzeni na cache).&lt;/p&gt;

&lt;p&gt;Więcej na ten temat znajdziesz w &lt;a href=&quot;/blog/2017/05/07/jak-przerobic-strone-na-pwa.html&quot;&gt;tym&lt;/a&gt; artykule na blogu.&lt;/p&gt;

&lt;h3 id=&quot;16-amp---accelerated-mobile-pages&quot;&gt;16. AMP - Accelerated Mobile Pages&lt;/h3&gt;

&lt;p&gt;Google wpadło na pomysł, aby strony internetowe wyświetlane na urządzeniach
mobilnych były szybciej wyświetlane, dzięki temu, że urządzenia nie będą
ściągały całą treść strony.&lt;/p&gt;

&lt;p&gt;Więcej o tym projekcie &lt;a href=&quot;https://www.ampproject.org/pl/&quot;&gt;tutaj&lt;/a&gt;.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/seo/amp-search-results.png&quot; alt=&quot;&quot; /&gt;
    &lt;figcaption&gt;
        Wyniki wyszukiwania dla frazy &lt;em&gt;&quot;revolution tv show&quot;&lt;/em&gt; na iPhone 5.
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;h2 id=&quot;-black-seo&quot;&gt;&lt;i class=&quot;icon-poor&quot;&gt;&lt;/i&gt; Black SEO&lt;/h2&gt;

&lt;p&gt;Jest też druga strona medalu, tj. czego nie możesz robić na stronie, jeśli
nie chcesz spaść z rankingu Google-a. Pamiętaj, że jest to najpopularniejsza
wyszukiwarka, więc jeśli z niej znikniesz to prawie tak jakbyś przestał
posiadać stronę WWW.&lt;/p&gt;

&lt;h3 id=&quot;1-nie-możesz-robić-tej-samej-treści-pod-rożnymi-url-ami&quot;&gt;1. Nie możesz robić tej samej treści pod rożnymi URL-ami&lt;/h3&gt;

&lt;blockquote class=&quot;block-good&quot;&gt;
  &lt;h3 id=&quot;-zasada&quot;&gt;&lt;i class=&quot;icon-good&quot;&gt;&lt;/i&gt; Zasada&lt;/h3&gt;
  &lt;p&gt;Jedna treść = jeden URL.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Oznacza to, nic innego, że jeśli serwujesz użytkownikowi tą samą treść dla
rożnych URLi to jesteś potraktowany przez roboty jako oszust. Dlatego nie
próbuj kopiować całego serwisu i “wklejać” pod inną domeną. Google Cię dopadnie.&lt;/p&gt;

&lt;h3 id=&quot;2-umieszczanie-na-dole-strony-dużej-ilości-słów-kluczowych-pisanych-małym-fontem&quot;&gt;2. Umieszczanie na dole strony dużej ilości słów kluczowych pisanych małym fontem&lt;/h3&gt;

&lt;p&gt;Kolejny przykład, aby nałapać większej ilości słów kluczowych. Pomysł
interesujący, ale nie fer. Dlatego gdy zrobisz taki numer i Googlebot to
odkryje to znikasz z internetu.&lt;/p&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;h2 id=&quot;czy-wyniki-wyszukiwania-różnią-się-na-mobile-vs-desktop&quot;&gt;Czy wyniki wyszukiwania różnią się na “mobile” vs “desktop”?&lt;/h2&gt;

&lt;p&gt;Oczywiście. Jako użytkownik telefonu udostępniasz firmie swoje położenie, na
podstawie którego Google może ustawić wyniki pod kątem Twojej lokalizacji.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Sprawdź &lt;a href=&quot;https://search.google.com/test/mobile-friendly&quot;&gt;tym&lt;/a&gt; narzędziem, czy Twoja strona jest
przyjazna dla urządzeń mobilnych.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Algorytmy Google-a korzystając z narzędzi weryfikujących, czy Twoja strona
dobrze wygląda na urządzeniu mobilnym albo pokazują ją w wynikach
wyszukiwania wysoko (jeśli jest dostępna) albo nisko (kiedy nie spełnia ona
podstawowych zasad serwowania treści na urządzenia mobilne).&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/icons/smartphone.png&quot; alt=&quot;&quot; /&gt;
&lt;/figure&gt;

&lt;p&gt;Zapraszam Cię do przetestowania jak Twoja strona wygląda w &lt;a href=&quot;https://testmysite.thinkwithgoogle.com/intl/en-us&quot;&gt;tym&lt;/a&gt;
narzędziu. Opisywane przeze mnie narzędzie weryfikuje jak witryna radzi sobie
w różnych środowiskach oraz podpowiada co możesz zrobić, aby było lepiej.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Opcja jest dostępna dopiero wtedy gdy podasz adres e-mail.&lt;/em&gt;&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/seo/test-my-site-results.png&quot; alt=&quot;99/100, 65/100, 78/100&quot; /&gt;
    &lt;figcaption&gt;
        Wyniki działania narzędzia dla strony
        &lt;strong&gt;https://piecioshka.pl/blog/&lt;/strong&gt;.
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;co-zrobić-aby-wyłączyć-linki-z-indeksowania&quot;&gt;Co zrobić, aby wyłączyć linki z indeksowania?&lt;/h2&gt;

&lt;p&gt;Aby poinformować Googlebot, żeby nie indeksował strony do której kierujesz
dodaj w linku atrybut &lt;code class=&quot;highlighter-rouge&quot;&gt;noindex&lt;/code&gt;, który to poinformuje o takim zamiarze.&lt;/p&gt;

&lt;p&gt;Pamiętaj, że wpisanie strony w &lt;code class=&quot;highlighter-rouge&quot;&gt;robots.txt&lt;/code&gt; zabroni robotowi wchodzenia na
stronę, ale nie zabroni go zindeksować, np. jeśli ktoś inny pokieruje do
Twojego artykułu.&lt;/p&gt;

&lt;p&gt;Jeśli chcesz zabronić robotowi przejścia na konkretną stroną (której link
jest np. wygenerowany dynamicznie dlatego też nie możesz zdefiniować go
w pliku &lt;code class=&quot;highlighter-rouge&quot;&gt;robots.txt&lt;/code&gt;) to możesz w budowie linku posłużyć się atrybutem
&lt;code class=&quot;highlighter-rouge&quot;&gt;rel=&quot;nofollow&quot;&lt;/code&gt;, np.&lt;/p&gt;

&lt;div class=&quot;language-html highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;a&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;href=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;/hidden-part&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;rel=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;nofollow&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;Ukryta treść&lt;span class=&quot;nt&quot;&gt;&amp;lt;/a&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;czy-aplikacje-spa-są-gorzej-indeksowane-od-mpa&quot;&gt;Czy aplikacje SPA są gorzej indeksowane od MPA?&lt;/h2&gt;

&lt;p&gt;Na początku wyjaśnijmy skróty:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;dl&gt;
      &lt;dt&gt;SPA - Single Page Application&lt;/dt&gt;
      &lt;dd&gt;Nowy (kilkuletni) sposób tworzenia stron internetowych, których działanie
jest zbliżone do aplikacji natywnych. Użytkownikowi aktualizuje się tylko ta
treść, która jest zmieniana.&lt;/dd&gt;
    &lt;/dl&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;dl&gt;
      &lt;dt&gt;MPA - Multi Page Application&lt;/dt&gt;
      &lt;dd&gt;Typowa strona internetowa, gdzie kliknięcie w dowolny adres wewnętrzny
(który kieruje na podstronę serwisu) powoduje odświeżenie całej zawartości
przeglądarki (do takiego stopnia, że możesz zobaczyć przez ułamek sekundy białą
stronę).

        &lt;p&gt;Standardowe rozwiązanie stosowane na dużych serwisach.&lt;/p&gt;
      &lt;/dd&gt;
    &lt;/dl&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nie uważam, że strony typu SPA źle się indeksują. Ważne jest, aby były
tworzone zgodnie w wymienionymi wyżej zasadami.&lt;/p&gt;

&lt;h3 id=&quot;ssr&quot;&gt;SSR&lt;/h3&gt;

&lt;p&gt;Mega pomysłem, jest realizacja &lt;strong&gt;Server Side Rendering-u&lt;/strong&gt; (SSR) - dzięki,
któremu treść jest renderowana (tworzona) po stronie serwera, a nie jak ma
to miejsce we wszystkich aplikacjach SPA po stronie klienta (przeglądarki).
Tym samym roboty indeksujące stronę będą w stanie przeanalizować treść tak
samo, jakby miały do czynienia z MPA.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/icons/server.png&quot; alt=&quot;&quot; /&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;jak-powiedzieć-googlebot-owi-aby-zaczął-indeksować-moją-stronę&quot;&gt;Jak powiedzieć Googlebot-owi, aby zaczął indeksować moją stronę?&lt;/h2&gt;

&lt;p&gt;Skorzystaj z &lt;a href=&quot;https://www.google.com/webmasters/tools/submit-url?hl=pl&quot;&gt;tego&lt;/a&gt; narzędzia do zgłaszania witryn,
które zostaną wpisane na listę strona do przeskanowania.&lt;/p&gt;

&lt;p&gt;Tą samą ścieżkę możesz wykonać kiedy chcesz odświeżyć informacje jakie posiada
Googlebot na temat danej strony.&lt;/p&gt;

&lt;h2 id=&quot;udało-się-jestem-na-samej-górze&quot;&gt;Udało się! Jestem na samej górze!&lt;/h2&gt;

&lt;p&gt;Spokojnie. Jeśli jesteś zalogowany w Google-ach na użytkownika, na
kocie którego dodałeś strony w &lt;code class=&quot;highlighter-rouge&quot;&gt;Google Search Console&lt;/code&gt;, to możesz mieć
zaburzone wyniki na temat tychże stron - tzn. że mogą być one ustawione wyżej w
wynikach wyszukiwania. Taka sytuacja będzie tylko dla Ciebie. Cały świat tak
na prawdę będzie widział inną listę SERP.&lt;/p&gt;

&lt;p&gt;Drugi aspekt, to że jesteś na samej górze dziś, wcale nie znaczy, że zawsze
tak będzie. &lt;strong&gt;Stąd też pozycjonowanie to proces, który nie ma końca. Musisz
ciągle dbać o strona, aby była wysoko.&lt;/strong&gt;&lt;/p&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;h2 id=&quot;-specjalne-wskazówki-dla-wordpress-a-&quot;&gt;✨ Specjalne wskazówki dla Wordpress-a ✨&lt;/h2&gt;

&lt;p&gt;Poniżej króciutka lista rzeczy, które możesz wykonać, kiedy Twoja strona
jest postawiona na najpopularniejszym systemie CMS - &lt;strong&gt;Content Management
System&lt;/strong&gt; - czyli Wordpress-ie.&lt;/p&gt;

&lt;h3 id=&quot;1-wpisz-w-plik-robotstxt-katalog-wp-admin&quot;&gt;1. Wpisz w plik &lt;code class=&quot;highlighter-rouge&quot;&gt;robots.txt&lt;/code&gt; katalog &lt;code class=&quot;highlighter-rouge&quot;&gt;wp-admin&lt;/code&gt;.&lt;/h3&gt;

&lt;p&gt;Nie ma potrzeby, aby wyszukiwarki męczyły się nad indeksowaniem czegoś co nie
będzie wnosiło żadnej korzyści dla Twojego serwisu, czyli panelu
administracyjnego. Dlatego też w pliku &lt;code class=&quot;highlighter-rouge&quot;&gt;robots.txt&lt;/code&gt; powinieneś mieć
następującą treść:&lt;/p&gt;

&lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nx&quot;&gt;User&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;Agent&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;
&lt;span class=&quot;nx&quot;&gt;Disallow&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;wp&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;admin&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;h2 id=&quot;polecane-narzędzia&quot;&gt;Polecane narzędzia&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;dl&gt;
      &lt;dt&gt;&lt;strong&gt;Google Adwords: Analiza słów kluczowych&lt;/strong&gt;&lt;/dt&gt;
      &lt;dd&gt;&lt;a href=&quot;https://adwords.google.com/ko/KeywordPlanner&quot;&gt;adwords.google.com/ko/KeywordPlanner&lt;/a&gt;&lt;/dd&gt;
    &lt;/dl&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;dl&gt;
      &lt;dt&gt;&lt;strong&gt;Google Chrome Plugin: SEO Toolbox&lt;/strong&gt;&lt;/dt&gt;
      &lt;dd&gt;&lt;a href=&quot;https://www.seoquake.com/&quot;&gt;www.seoquake.com&lt;/a&gt;

        &lt;p&gt;Darmowe narzędzie, które instalujesz w swojej przeglądarce, aby
prezentowało jak strona na której jesteś prezentuje się w rankingach
najpopularniejszych wyszukiwarek.&lt;/p&gt;
      &lt;/dd&gt;
    &lt;/dl&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;dl&gt;
      &lt;dt&gt;&lt;strong&gt;Open Site Explorer&lt;/strong&gt;&lt;/dt&gt;
      &lt;dd&gt;&lt;a href=&quot;https://moz.com/researchtools/ose&quot;&gt;moz.com/researchtools/ose&lt;/a&gt;

        &lt;p&gt;Narzędzie, które prezentuje różne metryki, takie jak:&lt;/p&gt;

        &lt;ul&gt;
          &lt;li&gt;DOMAIN AUTHORITY&lt;/li&gt;
          &lt;li&gt;PAGE AUTHORITY&lt;/li&gt;
          &lt;li&gt;SPAM SCORE&lt;/li&gt;
        &lt;/ul&gt;

        &lt;p&gt;które dają pogląd na to, z czym mogą mieć problem wyszukiwarki.&lt;/p&gt;
      &lt;/dd&gt;
    &lt;/dl&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;bibliografia&quot;&gt;Bibliografia&lt;/h2&gt;

&lt;p&gt;Lista stron, z których czerpałem detale na temat SEO:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://support.google.com/webmasters/answer/96569?hl=pl&quot;&gt;support.google.com/webmasters/answer/96569?hl=pl&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://support.google.com/webmasters/answer/35769?hl=pl&quot;&gt;support.google.com/webmasters/answer/35769?hl=pl&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.nakiedy.pl/blog/skuteczne-pozycjonowanie.html&quot;&gt;www.nakiedy.pl/blog/skuteczne-pozycjonowanie.html&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://sprawnymarketing.pl/robots-txt-czego-nie-robic-steruj-googlebotem-jak-chcesz/&quot;&gt;sprawnymarketing.pl/robots-txt-czego-nie-robic-steruj-googlebotem-jak-chcesz/&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://redseo.pl/blog/5-najczestszych-bledow-seo-w-robots-txt/&quot;&gt;redseo.pl/blog/5-najczestszych-bledow-seo-w-robots-txt/&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://blog.clearsense.pl/blog/list-otwarty-do-pozycjonerow-od-googlebota/&quot;&gt;blog.clearsense.pl/blog/list-otwarty-do-pozycjonerow-od-googlebota/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;h2 id=&quot;to-nie-koniec&quot;&gt;To nie koniec!&lt;/h2&gt;

&lt;p&gt;Na ten moment, wypstrykałem się, ze wszystkiego, co wiem na temat SEO.&lt;/p&gt;

&lt;p&gt;Jestem jednak przekonany, że nie jest to cała wiedza na temat SEO.
Stąd też artykuł ten będzie regularnie poddawany modyfikacjom, tak aby
coraz bardziej wartościowy.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Psst… Jeśli znasz dobre praktyki SEO, daj znać o nich w komentarzu!&lt;/strong&gt;&lt;/p&gt;

&lt;!-- Resources --&gt;

</description>
            <pubDate>Sat, 10 Jun 2017 21:53:55 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2017/06/10/kilka-wskazowek-seo.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2017/06/10/kilka-wskazowek-seo.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/seo/seo.png</image>
        </item>
        
        <item>
            <title>WarsawJS Meetup #33: Mój punkt widzenia</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Przyszedł czas, na kolejną opowieść o warszawskim święcie programistów
JavaScript, czyli WarsawJS Meetup. Dziś przedstawię Ci mój punkt widzenia z
prelekcji podczas ostatniego spotkania.&lt;/p&gt;

&lt;p&gt;Oficjalny profil wydarzenia dostępny na &lt;a href=&quot;https://www.meetup.com/WarsawJS/events/239636224/&quot;&gt;Meetup&lt;/a&gt;.
Dostępna jest też zajawka &lt;a href=&quot;https://www.facebook.com/events/133216780553568/&quot;&gt;fejsbukowa&lt;/a&gt;.&lt;/p&gt;

&lt;!-- &lt;figure&gt;
    &lt;a href=&quot;https://www.meetup.com/WarsawJS/&quot;&gt;
        &lt;img src=&quot;/assets/images/posts/post-banner-warsawjs.jpg&quot;
             alt=&quot;WarsawJS&quot;/&gt;
    &lt;/a&gt;
&lt;/figure&gt; --&gt;

&lt;h2 id=&quot;invitation&quot;&gt;Invitation&lt;/h2&gt;

&lt;p&gt;Piotr jest bokserem. Dowiedziałem się kilka godzin przed
zdjęciami do kolejnej produkcji wideo, czyli &lt;strong&gt;zapowiedzi na WarsawJS Meetup&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Cała nasza trójka (razem z Kasią) pojechaliśmy do warszawskiego Anina,
gdzie istnieje klub - &lt;strong&gt;Uniq Fight Club&lt;/strong&gt;, w którym Piotr trenuje swoje
zdolności bokserskie.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Podczas nagrywania pomimo tego, że miałem mikrofon podpięty (widoczne np. w
30 sekundzie filmu) to nie zbierał on dźwięku. Dlaczego? Bo nie docisnąłem
wtyczki kabla do rejestratora audio. Porażka. Stąd też na zapowiedzi
słychać dźwięki tła. Przepraszam. Mój błąd, ale jakoś wybrnąłem przy
montażu 😄&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Podczas nagrywania popróbowałem wykonywać uderzania w rękawicy
bokserskiej - świetna sprawa! Polecam. Można się odstresować.&lt;/p&gt;

&lt;div class=&quot;youtube-lazy&quot; data-youtube-id=&quot;jOjMOapoj5Y&quot;&gt;&lt;/div&gt;

&lt;p class=&quot;chapter-break&quot;&gt;&amp;bull;&lt;/p&gt;

&lt;h2 id=&quot;talk-1-how-to-make-frankensteins-monster-or-how-to-combine-nextjs-and-react-native-pl-jędrzej-majko&quot;&gt;Talk #1: How to make Frankenstein’s monster or how to combine Next.js and React Native [PL] &lt;small&gt;Jędrzej Majko&lt;/small&gt;&lt;/h2&gt;

&lt;p&gt;Moim zdaniem prelekcja dla osób z bogatym doświadczeniem Reactowym, a nawet
React Native-owym. Jędrzej opowiedział o 2 sposobach na pożenienie React
Native oraz Next.js. Pierwszy sposób sfailował z wielu powodów.
Druga koncepcja już była bardziej przemyślana, jednak i tak zawierała
problemy jak chociażby brak jednego kodu dla projektu.&lt;/p&gt;

&lt;figure class=&quot;social-center-block&quot;&gt;
    &lt;iframe src=&quot;https://www.facebook.com/plugins/post.php?href=https%3A%2F%2Fwww.facebook.com%2Fwarsawjs%2Fposts%2F2119997594893239&amp;amp;width=500&quot; width=&quot;500&quot; height=&quot;597&quot; style=&quot;border:none;overflow:hidden&quot; scrolling=&quot;no&quot; frameborder=&quot;0&quot; allowtransparency=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;/figure&gt;

&lt;p&gt;Uważam, że prelegent świetnie poradził sobie z przedstawieniem swojej
perspektywy na tworzenie aplikacji z użyciem React-a. Podkreślił nawet, że
aplikacje napisane w Angularze są wolne. Rozumiem to niezadowolenie. Mam
nadzieje, że autorzy frameworkowa Googla, wezmą sobie do serca
polepszenie w nim performance-u.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Link do prelekcji: &lt;a href=&quot;https://www.youtube.com/watch?v=_a9TwCHiE_A&quot;&gt;youtube.com/watch?v=_a9TwCHiE_A&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Kontakt do prelegenta: &lt;a href=&quot;https://www.facebook.com/jmajko&quot;&gt;@jmajko&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;h2 id=&quot;talk-2-jak-pracować-zdalnie-i-nie-zwariować-pl-tomasz-marciszewski&quot;&gt;Talk #2: Jak pracować zdalnie i nie zwariować [PL] &lt;small&gt;Tomasz Marciszewski&lt;/small&gt;&lt;/h2&gt;

&lt;p&gt;Mój komentarz na gorąco: “będę oglądał tą prelekcję przed snem”. Dlaczego?
Ze względu na ten luz prelegenta oraz miękką tematykę prelekcji.&lt;/p&gt;

&lt;p&gt;Tomek, jest wieloletnim developerem, który pracuje zdalnie już od ponad 7
lat, czyli na temat pracy zdalnej może swoje powiedzieć.&lt;/p&gt;

&lt;figure class=&quot;social-center-block&quot;&gt;
    &lt;iframe src=&quot;https://www.facebook.com/plugins/post.php?href=https%3A%2F%2Fwww.facebook.com%2Fwarsawjs%2Fphotos%2Fa.2119997398226592.1073741843.1578130679079936%2F2119997538226578%2F%3Ftype%3D3&amp;amp;width=500&quot; width=&quot;500&quot; height=&quot;423&quot; style=&quot;border:none;overflow:hidden&quot; scrolling=&quot;no&quot; frameborder=&quot;0&quot; allowtransparency=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;/figure&gt;

&lt;h3 id=&quot;-plusy-pracy-zdalnej&quot;&gt;&lt;i class=&quot;icon-good icon-plus&quot;&gt;&lt;/i&gt; Plusy pracy zdalnej&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Nie trzeba chodzić do pracy (nie trzeba kupować biletu, więc kasa w kieszeni)&lt;/li&gt;
  &lt;li&gt;Można nosić co się chce (można pracować w dowolnym stroju)&lt;/li&gt;
  &lt;li&gt;Samemu wyznaczasz godziny swojej pracy&lt;/li&gt;
  &lt;li&gt;Nikt nie zagląda przez ramię&lt;/li&gt;
  &lt;li&gt;Można się skupić (nie trzeba słuchać innych)&lt;/li&gt;
  &lt;li&gt;Więcej czasu dla swojej rodziny&lt;/li&gt;
  &lt;li&gt;Nie trzeba spotykać się z ludźmi, których się nie lubi&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;-minusy-pracy-zdalnej&quot;&gt;&lt;i class=&quot;icon-poor icon-minus&quot;&gt;&lt;/i&gt; Minusy pracy zdalnej&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Nie ma się czasu na słuchanie podcastów, czytanie książek podczas dojazdów&lt;/li&gt;
  &lt;li&gt;Nie ma dress code-u&lt;/li&gt;
  &lt;li&gt;Nie ma organizacji pracy&lt;/li&gt;
  &lt;li&gt;Nie ma szefa, który popchnie do pracy&lt;/li&gt;
  &lt;li&gt;Nie ma szans z kim pogadać (czasami robi się smutno)&lt;/li&gt;
  &lt;li&gt;Rodzina nie pomaga się skupić podczas pracy w domu&lt;/li&gt;
  &lt;li&gt;Nie możesz liczyć na pomoc kolegów&lt;/li&gt;
  &lt;li&gt;Nie ma rywalizacji z innymi developerami&lt;/li&gt;
  &lt;li&gt;Nikt nie zaprosi na obiad&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Podczas tej prelekcji każdy może usłyszeć kilka słów &lt;del&gt;goryczy&lt;/del&gt; prawdy aby
obalić mity, te które krążą o takim stylu pracy zarobkowej.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Link do prelekcji: &lt;a href=&quot;https://www.youtube.com/watch?v=3C_XCFqoMiY&quot;&gt;youtube.com/watch?v=3C_XCFqoMiY&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Kontakt do prelegenta: &lt;a href=&quot;https://twitter.com/Koori_&quot;&gt;@Koori_&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;h2 id=&quot;talk-3-komunikacja-w-świecie-it-pl-adrian-soja&quot;&gt;Talk #3: Komunikacja w świecie IT [PL] &lt;small&gt;Adrian Soja&lt;/small&gt;&lt;/h2&gt;

&lt;p&gt;Adrian jako Team Leader oraz Scrum Master podzielił się swoim doświadczeniem w
sprawie poprawnego posługiwania się językiem w komunikacji w projektach
informatycznych.&lt;/p&gt;

&lt;p&gt;Sukces projektu jest bardzo powiązany z poprawną komunikacją w zespołach
projektowych.&lt;/p&gt;

&lt;blockquote class=&quot;block-good&quot;&gt;
  &lt;h3 id=&quot;-wujek-dobra-rada&quot;&gt;&lt;i class=&quot;icon-good&quot;&gt;&lt;/i&gt; Wujek “Dobra Rada”&lt;/h3&gt;
  &lt;p&gt;Drogi programisto, jeśli masz problem komunikacyjny w zespole, zgłoś to
przełożonemu. Im szybciej wyeliminujecie problem tym szybciej będzie Wam
się lepiej współpracowało.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Świetna prelekcja, którą powinien zobaczyć każdy developer pracujący w
grupie osób. Prelegent opisał od podstaw jak wygląda proces komunikacji
między dwoma osobami. Jakie mogą być zagrożenia oraz jak je rozwiązać.&lt;/p&gt;

&lt;blockquote class=&quot;block-average&quot;&gt;
  &lt;h3 id=&quot;-złota-myśl&quot;&gt;&lt;i class=&quot;icon-average&quot;&gt;&lt;/i&gt; Złota myśl&lt;/h3&gt;
  &lt;p&gt;Jeśli prowadzisz kłótnię to bicie Twojego serca na poziomie ponad 95
uderzeń na minutę powoduje, że nie przyjmujesz żadnych argumentów strony
przeciwnej. Dlatego powinieneś odpocząć na 15 minut i do kończyć rozmowę.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
  &lt;li&gt;Link do prelekcji: &lt;a href=&quot;https://www.youtube.com/watch?v=AHv6t5rK6vU&quot;&gt;youtube.com/watch?v=AHv6t5rK6vU&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Kontakt do prelegenta: &lt;a href=&quot;https://www.facebook.com/saldrian&quot;&gt;@saldrian&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;h2 id=&quot;sponsorzy-spotkania&quot;&gt;Sponsorzy spotkania&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.facebook.com/10Clouds/&quot;&gt;10Clouds&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.facebook.com/artificialio/&quot;&gt;Artificial Labs&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.facebook.com/cyfrowypolsat/&quot;&gt;Cyfrowy Polsat&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.facebook.com/Daftcode/&quot;&gt;DaftCode&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.facebook.com/elpassion/&quot;&gt;EL Passion&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.facebook.com/softwarely/&quot;&gt;Softwarely&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;figure class=&quot;social-center-block&quot;&gt;
    &lt;iframe src=&quot;https://www.facebook.com/plugins/post.php?href=https%3A%2F%2Fwww.facebook.com%2Fwarsawjs%2Fphotos%2Fa.2119997398226592.1073741843.1578130679079936%2F2119998194893179%2F%3Ftype%3D3&amp;amp;width=500&quot; width=&quot;500&quot; height=&quot;423&quot; style=&quot;border:none;overflow:hidden&quot; scrolling=&quot;no&quot; frameborder=&quot;0&quot; allowtransparency=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;/figure&gt;

&lt;!-- Resources --&gt;

</description>
            <pubDate>Thu, 08 Jun 2017 21:50:00 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2017/06/08/warsawjs-meetup-33.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2017/06/08/warsawjs-meetup-33.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/post-banner-warsawjs.jpg</image>
        </item>
        
        <item>
            <title>Po co mi UML?</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Wielu z Was - programistów Front-end - na pewno słyszało o UML-u. Część,
która miała już tą przyjemność korzystania z możliwości zamodelowania dowolnego
scenariusza pewnie ma już wyrobione zdanie na temat tego języka. W tym artykule
przedstawię Ci, &lt;strong&gt;czym dla mnie jest UML&lt;/strong&gt;.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Jest to &lt;strong&gt;pierwszy post&lt;/strong&gt; z serii o UML. Mam w planach napisanie kilku artykułów
na temat konkretnych diagramów UML, które wykorzystuję w codziennej pracy.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
    
        
    
        
    
        
    
        
        &lt;li&gt;
            &lt;time&gt;2023-11-28&lt;/time&gt; - &lt;a href=&quot;/blog/2023/11/28/uml-diagram-sekwencji.html&quot;&gt;Diagram Sekwencji w UML (przykłady w JavaScript)&lt;/a&gt;
        &lt;/li&gt;
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
        &lt;li&gt;
            &lt;time&gt;2020-06-26&lt;/time&gt; - &lt;a href=&quot;/blog/2020/06/26/uml-diagram-klas.html&quot;&gt;Diagram Klas w UML (przykłady w JavaScript)&lt;/a&gt;
        &lt;/li&gt;
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
        &lt;li&gt;
            &lt;time&gt;2017-06-06&lt;/time&gt; - &lt;a href=&quot;/blog/2017/06/06/po-co-mi-uml.html&quot;&gt;Po co mi UML?&lt;/a&gt;
        &lt;/li&gt;
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
        
    
&lt;/ul&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/uml/uml-logo.png&quot; itemprop=&quot;image&quot; alt=&quot;Baner promujący artykuł&quot; /&gt;
    &lt;figcaption&gt;
        Oficjalne logo &lt;a href=&quot;https://en.wikipedia.org/wiki/Unified_Modeling_Language&quot;&gt;UML&lt;/a&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;co-to-jest-uml&quot;&gt;Co to jest UML?&lt;/h2&gt;

&lt;p&gt;Drogi czytelniku, jeśli jeszcze nie wiesz co to jest UML, to pozwól, że w
telegraficznym skrócie Ci wytłumaczę.&lt;/p&gt;

&lt;p&gt;Czy czasami, kiedy masz problem ze zrozumiem czegoś, jakiegoś problemu, czy
nie korzystasz wtedy z długopisu i kartki? Jeśli tak to na pewno starasz się
narysować na kartce papieru pewne elementy, takie jak np. użytkownik,
serwer, przycisk albo okno przeglądarki.&lt;/p&gt;

&lt;p&gt;Każdy kto rysuje na kartce papieru tworzy coś na swój sposób. Co jeśli
wystąpi konflikt? W mojej głowie użytkownika będzie reprezentował kwadrat, a u
Ciebie to będzie okrąg? Co wtedy No właśnie. &lt;strong&gt;UML to umowny zapis jak powinno
się rysować elementy ze świata inżynierii oprogramowania.&lt;/strong&gt;&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/uml/class-diagram/class-diagram-castle.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;figcaption&gt;
        Diagram Klas mojego autorstwa. Temat - Zamek. 2010 rok.
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;po-co&quot;&gt;Po co?&lt;/h2&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Przedstawienie innemu programiście implementacji za pomocą obrazka.&lt;/strong&gt;&lt;/p&gt;

    &lt;p&gt;Ile razy słyszałeś “a weź mi to narysuj”? Jeśli masz komuś coś
 wytłumaczyć, to bardzo często lepiej jest to po prostu narysować.&lt;/p&gt;

    &lt;figure&gt;
     &lt;img src=&quot;/assets/images/icons/contract.png&quot; alt=&quot;&quot; /&gt;
 &lt;/figure&gt;

    &lt;p&gt;Przedstawienie czegoś na obrazku lepiej obrazuje omawiane zagadnienie.
 Ilu programistów tyle różnych rysunków. Dlaczego więc nie rysować zgodnie
 z jakimiś zasadami?&lt;/p&gt;

    &lt;figure&gt;
     &lt;img src=&quot;/assets/images/posts/uml/class-diagram/class-diagram-school.jpg&quot; alt=&quot;&quot; /&gt;
     &lt;figcaption&gt;
         Diagram Klas mojego autorstwa. Temat - Szkoła. 2012 rok.
     &lt;/figcaption&gt;
 &lt;/figure&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Świetne na spotkania z biznesem, aby pokazać jak wygląda implementacja.&lt;/strong&gt;&lt;/p&gt;

    &lt;p&gt;Za poprawną implementację odpowiedzialni są programiści. Tylko oni znają
 się na programowaniu. Biznes nie rozumie o co chodzi w tych krzaczkach,
 które wyświetlają się całymi dniami na komputerach developerów.&lt;/p&gt;

    &lt;figure&gt;
     &lt;img src=&quot;/assets/images/icons/workflow.png&quot; alt=&quot;&quot; /&gt;
     &lt;figcaption&gt;
         Przykład diagramu czynności.
     &lt;/figcaption&gt;
 &lt;/figure&gt;

    &lt;p&gt;&lt;strong&gt;To, że biznes nie potrafi programować, to nie znaczy, że nie potrafi
 myśleć.&lt;/strong&gt; Dlatego też, jeśli chciałbyś - developerze - pokazać np. jak
 wygląda flow, które zaimplementowałeś to pokaż biznesowi &lt;a href=&quot;https://pl.wikipedia.org/wiki/Diagram_czynno%C5%9Bci&quot;&gt;diagram
 czynności&lt;/a&gt;, na którym będzie rozrysowane krok po kroku jak wygląda np.
 rejestracja użytkownika w projekcie opartym na React-cie 😄&lt;/p&gt;

    &lt;figure&gt;
     &lt;img src=&quot;/assets/images/icons/teacher-question-to-the-class.png&quot; alt=&quot;&quot; /&gt;
     &lt;figcaption&gt;
         Stoisz na spotkaniu i nikt Cię nie rozumie gdy tłumaczysz
         implementację?&lt;br /&gt;&lt;strong&gt;NARYSUJ JĄ!&lt;/strong&gt;
     &lt;/figcaption&gt;
 &lt;/figure&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Planowanie implementacji.&lt;/strong&gt;&lt;/p&gt;

    &lt;blockquote class=&quot;block-poor&quot;&gt;
      &lt;h3 id=&quot;-ważna-zasada&quot;&gt;&lt;i class=&quot;icon-poor&quot;&gt;&lt;/i&gt; Ważna zasada&lt;/h3&gt;
      &lt;p&gt;Najważniejszą rzeczą poprzedzającą implementację jest &lt;strong&gt;analiza&lt;/strong&gt;!&lt;/p&gt;
    &lt;/blockquote&gt;

    &lt;p&gt;Ile razy drogi programisto gryzłeś się w język, że napisałeś kod bez
 wcześniejszego namysłu i teraz niestety musisz go się pozbyć, bo ktoś
 zwrócił Ci uwagę, że brniesz w złą stronę. &lt;strong&gt;Najbardziej boli, kiedy to
 Ty sam zauważasz, że po kilku godzinach zabrnąłeś zupełnie nie tam gdzie
 powinieneś.&lt;/strong&gt; No właśnie!&lt;/p&gt;

    &lt;blockquote&gt;
      &lt;p&gt;Analiza (z angielskiego “design”) to projektowanie rozwiązania.&lt;/p&gt;
    &lt;/blockquote&gt;

    &lt;p&gt;W tym przypadku problemem jest brak etapu projektowania. Wszystkie
 szkoły wytwórców oprogramowania mówią, że pierwszą fazą (w &lt;a href=&quot;https://pl.wikipedia.org/wiki/Model_kaskadowy&quot;&gt;modelu
 kaskadowym&lt;/a&gt;) jest specyfikacja, czyli określenie wymagań projektu, ale
 tuż za nim jest &lt;strong&gt;faza projektowania systemu&lt;/strong&gt; na którą powinno poświęcić
 się &lt;strong&gt;do 30-40% całości trwania projektu&lt;/strong&gt; (&lt;a href=&quot;http://math.uni.lodz.pl/~mmisiak/zpi/studenci/modele_implementacji.pdf&quot;&gt;źródło 1&lt;/a&gt;,
 &lt;a href=&quot;https://www.michalwolski.pl/2007/07/cykl-tworzenia-oprogramowania-w-rational-unified-process/&quot;&gt;źródło 2&lt;/a&gt;).&lt;/p&gt;

    &lt;blockquote&gt;
      &lt;p&gt;Poprzez “projekt” mam też na myśli dowolne “zadanie”.&lt;/p&gt;
    &lt;/blockquote&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/uml/model-kaskadowy.png&quot; alt=&quot;Planowanie, Analiza, Projekt, Implementacja, Testowanie, Pielęgnacja&quot; /&gt;
    &lt;figcaption&gt;
        Prezentacja jak NAJCZĘŚCIEJ przebiega realizacja projektu.
        &lt;a href=&quot;https://pl.wikipedia.org/wiki/Model_kaskadowy&quot;&gt;Źródło&lt;/a&gt;.
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;nuda&quot;&gt;Nuda?&lt;/h2&gt;

&lt;p&gt;Wiele osób może uważać, że tworzenie diagramów to nuda. Dlatego też, nie chce
się im ich rysować. Nie rozumiem dlaczego w głowach developerów pojawia się
takie myślenie. Jestem w stanie zrozumieć, że Ci młodzi “zapaleńcy”, którzy by
tylko klepali w klawiaturę - &lt;strong&gt;nie ważne co, ważne że klepią&lt;/strong&gt; - mogą nie
zakochać się w diagramach, bo tutaj nie ma kodowania.&lt;/p&gt;

&lt;p&gt;Jednak kiedy &lt;strong&gt;młody developer&lt;/strong&gt; staje się coraz bardziej odpowiedzialny za
system, to zastawia się jak tutaj sobie pomóc i nie pisząc kodu, móc
określić jego potencjalne działanie.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Architekci&lt;/strong&gt;, czyli tacy developerzy, którzy na pewnym etapie swojej kariery
postanowili zająć się na dobre projektowaniem, wiedzą, że bez odpowiednich
modeli (czytaj diagramów) ich praca nie byłaby efektywna. Zaprezentowanie
swojego pomysłu dla zespołu projektowego wiąże się z tym, że jeśli zostanie
on źle zrozumiany to ponosi za to konsekwencje.&lt;/p&gt;

&lt;h2 id=&quot;diagramy-to-dokumentacja&quot;&gt;Diagramy to dokumentacja&lt;/h2&gt;

&lt;p&gt;Pliki z diagramami to typowa, zaraz po słownej, dokumentacja.
Wszyscy wiemy, że nieaktualizowana dokumentacja nadaje się tylko do śmietnika.
Trzeba aktualizować dokumentację słowną, ale też i rysunkową.&lt;/p&gt;

&lt;blockquote class=&quot;block-good&quot;&gt;
  &lt;h3 id=&quot;-moja-prośba&quot;&gt;&lt;i class=&quot;icon-good&quot;&gt;&lt;/i&gt; Moja prośba&lt;/h3&gt;
  &lt;p&gt;Mam do Ciebie drogi developerze serdeczną prośbę.&lt;br /&gt;
Dbaj o dokumentację. Uratuje Ci ona kiedyś skórę. Mówię Ci ze swojego
doświadczenia.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id=&quot;teza-diagramy-są-trudne&quot;&gt;Teza: diagramy są trudne!&lt;/h2&gt;

&lt;p&gt;W świecie front-endu jest wiele frameworków, narzędzi, systemów.
Utarło się, że osoby bez znajomości dowolnego z nich stwierdzają, że jest on
“trudny”. Nie mam pojęcia dlaczego pojawia się takie myślenie.&lt;/p&gt;

&lt;blockquote class=&quot;block-average&quot;&gt;
  &lt;h3 id=&quot;-złota-myśl&quot;&gt;&lt;i class=&quot;icon-average&quot;&gt;&lt;/i&gt; Złota myśl&lt;/h3&gt;
  &lt;p&gt;Wychodzę z założenia, że &lt;strong&gt;nie ma rzeczy trudnych, są rzeczy których
po prostu jeszcze się nie poznało.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Drogi czytelniku, jeśli nie znasz jeszcze UML to poczytaj o dowolnym
diagramie i rysuj go. Naucz się wszystkiego, co z nim związane i rysuj tyle
tych diagramów ile wlezie. Taką praktyką dojdziesz do momentu, że już nawet
nie poczujesz, że musisz narysować diagram. Stanie się to po prostu łatwe i
przyjemne. Dlaczego? Bo już poznałeś na wylot zasady jakie w nim panują.&lt;/p&gt;

&lt;p&gt;Ze swojej strony proponują naukę dowolnego z poniższych:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;/blog/2020/06/26/uml-diagram-klas.html&quot;&gt;Diagram Klas&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;/blog/2023/11/28/uml-diagram-sekwencji.html&quot;&gt;Diagram Sekwencji&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Diagram Czynności&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Teza obalona 🎉&lt;/strong&gt;&lt;/p&gt;

&lt;h2 id=&quot;kto-go-używa&quot;&gt;Kto go używa?&lt;/h2&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Programiści back-end&lt;/strong&gt;&lt;/p&gt;

    &lt;p&gt;Ci programiści wykorzystują diagramy do modelowania swoich usług
 wystawionych w świat.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;DevOps, czyli administratorzy systemów&lt;/strong&gt;&lt;/p&gt;

    &lt;p&gt;Ci, natomiast mogą prezentować swoją architekturę serwerową, wszelkie
 sieci szkieletowe i inne.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Programiści front-end&lt;/strong&gt;&lt;/p&gt;

    &lt;p&gt;Ci mają bardzo łatwo, bo liczba procesów które mogą zostać narysowane w
 diagramach jest przeogromna, zaczynając od komunikacji sieciowej z
 back-endem, skończywszy na definicji zachowania kontrolek po interakcji
 użytkownika.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Inni&lt;/p&gt;

    &lt;p&gt;Istnieje wiele stanowisk, które również wykorzystują takie diagramy i nie
 sposób jest ich tutaj wszystkich wymienić.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;kto-powinien-znać-uml&quot;&gt;Kto powinien znać UML?&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Każdy developer sieciowy.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Kto jest takim developerem? Każdy kto wytwarza oprogramowanie, do którego
dostęp możliwy jest za pomocą sieci, czy to wewnętrznej (intranet) czy to
zewnętrznej (internet).&lt;/p&gt;

&lt;h2 id=&quot;jak-mi-jako-programiście-pomagają-diagramy&quot;&gt;Jak mi “jako programiście” pomagają diagramy?&lt;/h2&gt;

&lt;p&gt;Z mojego doświadczenie &lt;strong&gt;najlepszym diagramem dla programistów front-end jest
Diagram Sekwencji&lt;/strong&gt;, który obrazuje jak wygląda ich kod w stosunku do
innych systemów, np. back-endu lub też inter-obiektowy w aplikacji.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Inter-obiektowy&lt;/em&gt;, to taki który określa połączenia między obiektami, klasami w
architekturze aplikacji. Np. jak wygląda komunikacja między &lt;code class=&quot;highlighter-rouge&quot;&gt;DataService&lt;/code&gt; a
modelem &lt;code class=&quot;highlighter-rouge&quot;&gt;UserModel&lt;/code&gt;.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/uml/sequence-diagram/sequence-diagram-change-patient-name.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;figcaption&gt;
        Diagram Sekwencji mojego autorstwa. Temat - Zmiana nazwiska pacjenta. 2013 rok.
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;jak-mi-jako-kierownikowi-pomagają-diagramy&quot;&gt;Jak mi “jako kierownikowi” pomagają diagramy?&lt;/h2&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Nie muszę patrzeć na implementację aby zweryfikować poprawną architekturę.&lt;/strong&gt;&lt;/p&gt;

    &lt;p&gt;&lt;strong&gt;Code Review to świetna sprawa - uwielbiam to robić.&lt;/strong&gt; Jednak jest pewien
 case, kiedy robienie CR to droga przez męką. Zastanów się kiedy tak jest?&lt;/p&gt;

    &lt;p&gt;W moim przypadku, ciężko mi się przegląda Pull Request, który
 zawiera ogromną liczbą zmian. Kiedy w PR liczba dodanych linijek przekracza
 ponad 1000 (1 tysiąc) linijek kodu, to jest kiepsko.&lt;/p&gt;

    &lt;p&gt;Gdybym miał diagram opisujący jak wygląda implementacja, to nie musiałbym
 mocno zwracać uwagę na zmienione linijki, ponieważ niektóre błędy
 mógłbym z niego wyczytać.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Oszczędność czasu.&lt;/strong&gt;&lt;/p&gt;

    &lt;p&gt;Jako kierownik wieloosobowego zespołu nie mam za dużo czasu, aby weryfikować
 każdą implementację. Każda godzina jest ważna, dlatego staram się
 najefektywniej je wykorzystywać. A ślęczenie nad czyimś kodem aby
 zapoznać się co zrobił developer nie jest mega efektywnym zajęciem.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;Prezentacja implementacji mojego zespołu przed biznesem.&lt;/strong&gt;&lt;/p&gt;

    &lt;p&gt;Często jest tak, że biznes wyraża chęć poznania w jaki sposób została
 zrealizowana dana funkcjonalność. Ma do tego pełne prawo. Posiadając
 odpowiednie typy diagramów jest w stanie bardzo szybko udzielić
 odpowiedzi nie produkując się za każdym razem gdy takie pytanie będzie
 miało miejsce.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;przykład-z-życia-wzięty&quot;&gt;Przykład (z życia wzięty)&lt;/h2&gt;

&lt;p&gt;Jestem przekonany, że gdy tworzysz stronę, czy to budując API RESTowe,
czy &lt;abbr title=&quot;User Interface&quot;&gt;UI&lt;/abbr&gt; myślisz o &lt;strong&gt;użytkowniku&lt;/strong&gt;,
który &lt;strong&gt;będzie korzystał&lt;/strong&gt; z tego co zrobisz.&lt;/p&gt;

&lt;p&gt;W UML istnieje taki diagram, na którym możesz rysować to, co użytkownik może
zrobić z Twoim “systemem”&lt;sup id=&quot;fnref:1&quot;&gt;&lt;a href=&quot;#fn:1&quot; class=&quot;footnote&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;. Taki diagram nazywa się &lt;strong&gt;Diagram Przypadków
Użycia&lt;/strong&gt; (en. &lt;strong&gt;Use Case Diagram&lt;/strong&gt;).&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/uml/use-case-diagram/use-case-diagram-restaurant.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;figcaption&gt;
        Diagram Przypadków Użycia mojego autorstwa. Temat - Restauracja.
        2011 rok.
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Niech przykładem będzie sytuacja z użytkownikiem portalu wideo.
Na takim diagramie możemy zapisać, jakie możliwości posiada użytkownik.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/uml/use-case-diagram/use-case-diagram-example.png&quot; alt=&quot;Głowa batmana, Wyświetl listę filmów, Dokonaj płatności za film, Odtwórz film&quot; /&gt;
    &lt;figcaption&gt;
        Przykład diagramu przypadków użycia użytkownika w portalu wideo.
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;!-- Resources --&gt;

&lt;div class=&quot;footnotes&quot;&gt;
  &lt;ol&gt;
    &lt;li id=&quot;fn:1&quot;&gt;
      &lt;p&gt;&lt;strong&gt;Anegdotka.&lt;/strong&gt; Od kilku dni moja partnerka życiowa zwraca się do mnie
“System”, przez wzgląd na to, że ciągle pracuję 😄 Pisanie
artykułów na bloga co drugi dzień oraz nagrywanie i montowania filmów na
kanał &lt;a href=&quot;https://www.youtube.com/warsawjs/&quot;&gt;WarsawJS&lt;/a&gt; oraz &lt;a href=&quot;https://www.youtube.com/piecioshka&quot;&gt;swój&lt;/a&gt;, to dużo pracy. &lt;a href=&quot;#fnref:1&quot; class=&quot;reversefootnote&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
  &lt;/ol&gt;
&lt;/div&gt;
</description>
            <pubDate>Tue, 06 Jun 2017 21:56:06 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2017/06/06/po-co-mi-uml.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2017/06/06/po-co-mi-uml.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/uml/uml-logo.png</image>
        </item>
        
        <item>
            <title>Jak zbudować widget prezentujący testimoniale?</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Ciekawi Cię jak stworzyć widget prezentujący testimoniale, które coraz
częściej są prezentowane na stronach? Przedstawiam Ci jak za pomocą HTML, CSS
oraz trochę JavaScript stworzyć odpowiednie komponent. Czas na pracę z kodem!&lt;/p&gt;

&lt;div class=&quot;youtube-lazy&quot; data-youtube-id=&quot;vivW6IZHrrw&quot;&gt;&lt;/div&gt;

&lt;h2 id=&quot;co-to-jest-testimonial&quot;&gt;Co to jest &lt;code class=&quot;highlighter-rouge&quot;&gt;testimonial&lt;/code&gt;?&lt;/h2&gt;

&lt;p&gt;Gwoli ścisłości, aby wyrównać wiedzę, testimonial to taka rekomendacja
usługobiorcy usługi, które prezentowana jest na stronie usługodawcy.&lt;/p&gt;

&lt;p&gt;Np. ja piszę testimonial dla OVH, bo tworzą świetne rozwiązania. Taka
rekomendacja zostaje wyświetlona na stronie OVH.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/coding-testimonials/testimonial-widget.png&quot; alt=&quot;Widget z testimonialem&quot; /&gt;
    &lt;figcaption&gt;
        Jak wygląda testimonial? Właśnie tak!
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;co-to-jest-widget&quot;&gt;Co to jest &lt;code class=&quot;highlighter-rouge&quot;&gt;widget&lt;/code&gt;?&lt;/h2&gt;

&lt;p&gt;No tutaj to chyba nie trzeba tłumaczyć, ale może w jednym zdaniu. Widget to
taki jednolity zestaw markupu styli oraz skryptów, który realizuje daną
funkcjonalność i jest “przenaszalny”, tj. można go wykorzystać w innych
miejscach na stronie, niż to pierwotne.&lt;/p&gt;

&lt;h2 id=&quot;kodowanie&quot;&gt;Kodowanie!&lt;/h2&gt;

&lt;p&gt;Kolejne kroki będą polegały na przejściu przez kilka warstw kodu, aby
stworzyć prosty widget. Jeśli nie interesuje Cię kod, to na dole strony jest
GIF prezentujący jak wygląda widget w pełnej okazałości.&lt;/p&gt;

&lt;h3 id=&quot;krok-1&quot;&gt;Krok 1.&lt;/h3&gt;

&lt;p&gt;Potrzebujemy plików: HTML (np. index.html), CSS (np. main.css) oraz
JavaScript (np. main.js)&lt;/p&gt;

&lt;h3 id=&quot;krok-2&quot;&gt;Krok 2.&lt;/h3&gt;

&lt;p&gt;W HTMLu tworzę prosty markup, np. taki:&lt;/p&gt;

&lt;div class=&quot;language-html highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;div&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;class=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;testimonial&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;img&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;class=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;testimonial__image&quot;&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;src=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;http://placeskull.com/50/50&quot;&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;alt=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Thumbnail&quot;&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;p&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;class=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;testimonial__text&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;XXXXXX&lt;span class=&quot;nt&quot;&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;krok-3&quot;&gt;Krok 3.&lt;/h3&gt;

&lt;p&gt;Dodam trochę CSS-ów, aby komponent lekko ubarwić. Stosuję konwencję
&lt;a href=&quot;/blog/2017/05/11/czym-jest-dla-mnie-bem.html&quot;&gt;BEM&lt;/a&gt; pomimo tak prostego projektu i tak uważam, że warto ją stosować.&lt;/p&gt;

&lt;div class=&quot;language-css highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nc&quot;&gt;.testimonial&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;nl&quot;&gt;width&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;300px&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;nl&quot;&gt;height&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;50px&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;nl&quot;&gt;background&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;#34495e&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;nl&quot;&gt;border-radius&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;3px&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;nl&quot;&gt;border&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;5px&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;solid&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;#2980b9&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;nl&quot;&gt;box-shadow&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;3px&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;black&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;inset&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;nl&quot;&gt;padding&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;5px&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;nl&quot;&gt;overflow&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;hidden&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;nc&quot;&gt;.testimonial__image&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;nl&quot;&gt;display&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;inline-block&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;nl&quot;&gt;vertical-align&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;middle&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;nl&quot;&gt;margin&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;10px&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;nc&quot;&gt;.testimonial__text&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;nl&quot;&gt;width&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;200px&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;nl&quot;&gt;display&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;inline-block&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;nl&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;white&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;nl&quot;&gt;margin&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Na tym etapie powinien wyświetlać się komponent prezentujący ten sztywno
zdefiniowany testimonial. Zabierzmy się za coś dynamicznego!&lt;/p&gt;

&lt;h3 id=&quot;krok-4&quot;&gt;Krok 4.&lt;/h3&gt;

&lt;p&gt;Dodaję zachowanie (JavaScript)&lt;/p&gt;

&lt;h4 id=&quot;krok-41&quot;&gt;Krok 4.1:&lt;/h4&gt;

&lt;p&gt;Lista testimoniali (tablica obiektów):&lt;/p&gt;

&lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;testimonialList&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;image&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;http://placeskull.com/50/50/ff00ff&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;text&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;Lorem ipsum dolor sit amet.&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;image&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;http://placeskull.com/50/50/ffff00&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;text&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;Consectetur adipisicing elit.&quot;&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;image&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;http://placeskull.com/50/50/00ffff&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;text&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;Sed do eiusmod tempor incididunt.&quot;&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;];&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h4 id=&quot;krok-42&quot;&gt;Krok 4.2.&lt;/h4&gt;

&lt;p&gt;Bootstrap aplikacji&lt;/p&gt;

&lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;$image&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;kd&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;$text&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;setup&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;$image&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;document&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;querySelector&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'.testimonial__image'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;$text&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;document&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;querySelector&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'.testimonial__text'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;nb&quot;&gt;window&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;addEventListener&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'DOMContentLoaded'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;setup&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h4 id=&quot;krok-43&quot;&gt;Krok 4.3.&lt;/h4&gt;

&lt;p&gt;Prezentacja dynamicznego testimoniala&lt;/p&gt;

&lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;displayTestimonial&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;testimonialIndex&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;testimonial&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;testimonialList&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;testimonialIndex&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;];&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;$image&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;setAttribute&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'src'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;testimonial&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;image&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;$text&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;textContent&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;testimonial&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;text&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h4 id=&quot;krok-44&quot;&gt;Krok 4.4.&lt;/h4&gt;

&lt;p&gt;Zegar, rotujący testimoniale:&lt;/p&gt;

&lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;ONE_SECOND&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;TIME_INTERVAL&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;ONE_SECOND&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;displayTestimonial&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;testimonialIndex&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;testimonial&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;testimonialList&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;testimonialIndex&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;];&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;$image&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;setAttribute&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'src'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;testimonial&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;image&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;$text&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;textContent&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;testimonial&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;text&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;rotateTestimonial&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;index&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;displayTestimonial&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;index&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

    &lt;span class=&quot;nx&quot;&gt;setInterval&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;nx&quot;&gt;index&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;++&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

        &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;index&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;testimonialList&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;length&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;  &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;nx&quot;&gt;index&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

        &lt;span class=&quot;nx&quot;&gt;displayTestimonial&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;index&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;},&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;TIME_INTERVAL&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;setup&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;// ...&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;rotateTestimonial&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;krok-5&quot;&gt;Krok 5.&lt;/h3&gt;

&lt;p&gt;Dodanie animacji w CSS3. W kwestii optymalizacji warto dodać regułę
&lt;code class=&quot;highlighter-rouge&quot;&gt;will-change&lt;/code&gt;, ale o tym wkrótce na blogu.&lt;/p&gt;

&lt;div class=&quot;language-css highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nc&quot;&gt;.testimonial__image&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;c&quot;&gt;/* ... */&lt;/span&gt;
    &lt;span class=&quot;nl&quot;&gt;animation&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;displayTestimonial&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;--time&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;infinite&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;nc&quot;&gt;.testimonial__text&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;c&quot;&gt;/* ... */&lt;/span&gt;
    &lt;span class=&quot;nl&quot;&gt;animation&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;displayTestimonial&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;--time&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;infinite&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;@keyframes&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;displayTestimonial&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;transform&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;translateY&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;80px&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;40&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;transform&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;translateY&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;60&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;transform&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;translateY&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;100&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;%&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;nl&quot;&gt;transform&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;translateY&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;-80px&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;krok-6&quot;&gt;Krok 6.&lt;/h3&gt;

&lt;p&gt;Od jakiegoś czasu można w przeglądarkach korzystać ze zmiennych w CSS-ach.
Oczywiście nie wszystkie już supportują ten feature, ale świat idzie do
przodu i im szybciej nauczymy się nowinek tym będzie łatwiej.&lt;/p&gt;

&lt;div class=&quot;language-css highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nt&quot;&gt;body&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;c&quot;&gt;/* ... */&lt;/span&gt;
    &lt;span class=&quot;py&quot;&gt;--time&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;3s&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;nc&quot;&gt;.testimonial__image&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;c&quot;&gt;/* ... */&lt;/span&gt;
    &lt;span class=&quot;nl&quot;&gt;animation&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;displayTestimonial&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;--time&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;infinite&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;nc&quot;&gt;.testimonial__text&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;c&quot;&gt;/* ... */&lt;/span&gt;
    &lt;span class=&quot;nl&quot;&gt;animation&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;displayTestimonial&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;--time&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;infinite&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;hr /&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/coding-testimonials/testimonial-widget.gif&quot; alt=&quot;Widget z testimonialem&quot; /&gt;
    &lt;figcaption&gt;
        Prezentacja widgetu w pełnej okazałości. Widget gotowy! 🎉
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;podsumowanie&quot;&gt;Podsumowanie&lt;/h2&gt;

&lt;p&gt;Stworzenie komponentu nie jest wcale ani trudne ani czasochłonne, ale daje za
to ciekawy efekt na stronie.&lt;/p&gt;

&lt;p&gt;PS. Jutro pojawi się film z live coding opisywanego widgetu.&lt;br /&gt;
Zapraszam na mój kanał na platformie &lt;a href=&quot;https://www.youtube.com/piecioshka&quot;&gt;YouTube&lt;/a&gt;, gdzie regularnie wrzucam
filmy o programowaniu.&lt;/p&gt;

&lt;!-- Resources --&gt;

</description>
            <pubDate>Sun, 04 Jun 2017 21:56:08 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2017/06/04/jak-zbudowac-widget-prezentujacy-testimoniale.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2017/06/04/jak-zbudowac-widget-prezentujacy-testimoniale.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/coding-testimonials/testimonial-widget.png</image>
        </item>
        
        <item>
            <title>WarsawJS Meetup #32: Moje wrażenia</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;32-edycja comiesięcznych spotkań dla programistów była owocna w świetne tematy.
Na scenie pojawili się wspaniali prelegenci Monika i Damian. Zapraszam do
zapoznania się jakie były moje odczucia z prelekcji.&lt;/p&gt;

&lt;p&gt;Wydarzenie było jak zwykle dostępne na &lt;a href=&quot;https://www.facebook.com/events/1888442038094062/&quot;&gt;fejsbuku&lt;/a&gt; oraz na
&lt;a href=&quot;https://www.meetup.com/WarsawJS/events/238920652/&quot;&gt;meetupie&lt;/a&gt;.&lt;/p&gt;

&lt;!-- &lt;figure&gt;
    &lt;a href=&quot;https://www.meetup.com/WarsawJS/&quot;&gt;
        &lt;img src=&quot;/assets/images/posts/post-banner-warsawjs.jpg&quot;
             alt=&quot;WarsawJS&quot;/&gt;
    &lt;/a&gt;
&lt;/figure&gt; --&gt;

&lt;h2 id=&quot;invitation&quot;&gt;Invitation&lt;/h2&gt;

&lt;p&gt;Dzięki znajomościom Piotra mogliśmy nagrywać zapowiedź nie - jak ma
to zwykle miejsce - sprzed obiektu ale z wewnątrz. Ekipa WarsawJS wylądowała
w klubie tenisowym WTS Orzeł na warszawskiej Pradze.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Chcesz zobaczyć jak jeden z organizatorów WarsawJS skacze w dal?&lt;/strong&gt;&lt;br /&gt;
Zerknij na poniższe wideo.&lt;/p&gt;

&lt;div class=&quot;youtube-lazy&quot; data-youtube-id=&quot;ZjBhJTeQwIA&quot;&gt;&lt;/div&gt;

&lt;p class=&quot;chapter-break&quot;&gt;&amp;bull;&lt;/p&gt;

&lt;h2 id=&quot;talk-1-solid-i-dry-w-javascript--praktyczne-przykłady-pl-damian-wielgosik&quot;&gt;Talk #1: SOLID i DRY w JavaScript- praktyczne przykłady [PL] &lt;small&gt;Damian Wielgosik&lt;/small&gt;&lt;/h2&gt;

&lt;p&gt;40 minutowa prelekcja założyciela &lt;a href=&quot;https://www.facebook.com/meetjspl/&quot;&gt;meet.js&lt;/a&gt;
oraz &lt;a href=&quot;http://functionite.com/&quot;&gt;Functionate&lt;/a&gt; - Damiana - nie była standardowym wyjściem
na scenę i opowieścią o frameworku.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prelegent zamienił się w programistę i na oczach ponad 100 osób&lt;/strong&gt; programował
koszyk dla aplikacji typu sklep internetowy.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Targetem live coding byli programiści na poziomie początkującym
i średnio zaawansowanych.&lt;/em&gt;&lt;/p&gt;

&lt;figure class=&quot;social-center-block&quot;&gt;
    &lt;iframe src=&quot;https://www.facebook.com/plugins/post.php?href=https%3A%2F%2Fwww.facebook.com%2Fwarsawjs%2Fphotos%2Fa.2103415206551478.1073741841.1578130679079936%2F2103415213218144%2F%3Ftype%3D3&amp;amp;width=500&quot; width=&quot;500&quot; height=&quot;443&quot; style=&quot;border:none;overflow:hidden&quot; scrolling=&quot;no&quot; frameborder=&quot;0&quot; allowtransparency=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;/figure&gt;

&lt;p&gt;Damian podczas kodowania przedstawiał po kolei wszystkie 5 zasad (a tak
naprawdę cztery, bo jednej zabrakło), które składają się na jedną o nazwie
&lt;a href=&quot;https://pl.wikipedia.org/wiki/SOLID_(programowanie_obiektowe)&quot;&gt;SOLID&lt;/a&gt;. Wymieńmy sobie po kolei te zasady:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;#pattern-srp&quot;&gt;Single responsibility principle - S&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Open/closed principle - O&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#pattern-lsp&quot;&gt;Liskov substitution principle - L&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#pattern-isp&quot;&gt;Interface segregation principle - I&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#pattern-dip&quot;&gt;Dependency inversion principle - D&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;pattern-dip&quot;&gt;D - DIP&lt;/h3&gt;

&lt;p&gt;Jako pierwsza została pokazana zasada rozdzielenia zależności, czyli D.
Obiekt koszyka - &lt;code class=&quot;highlighter-rouge&quot;&gt;Cart&lt;/code&gt; - znał definicję budowania obiektu &lt;code class=&quot;highlighter-rouge&quot;&gt;Product&lt;/code&gt;.
Nie jest to dobre podejście, ponieważ gdy zmieni się API klasy &lt;code class=&quot;highlighter-rouge&quot;&gt;Product&lt;/code&gt;, to
trzeba aktualizować zupełnie inną encję - &lt;code class=&quot;highlighter-rouge&quot;&gt;Cart&lt;/code&gt;.&lt;/p&gt;

&lt;blockquote class=&quot;block-good&quot;&gt;
  &lt;h3 id=&quot;-zasada-hollywoodzka&quot;&gt;&lt;i class=&quot;icon-good&quot;&gt;&lt;/i&gt; Zasada Hollywoodzka&lt;/h3&gt;
  &lt;p&gt;“Jest takie powiedzenie: Nie wołaj nas, my zawołamy Ciebie.”&lt;br /&gt;
— &lt;a href=&quot;https://en.wikipedia.org/wiki/Inversion_of_control&quot;&gt;Hollywood Principle: Don’t call us, we’ll call you”&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Rozwiązanie?&lt;/strong&gt; Odwrócić zależność! Przenieść tworzenie produktu linijkę przed
wykorzystaniem funkcji dodającej produkt.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;Damian w okolicach 12 minuty użył słowa “zdikaplowaliśmy”. Coś mi mówi, że
prelegent miał na myśli - wykorzystanie wzorca &lt;a href=&quot;http://gameprogrammingpatterns.com/decoupling-patterns.html&quot;&gt;Decoupling
Pattern&lt;/a&gt;. Już spieszę z wyjaśnieniem.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Wzorzec polega na rozdzieleniu obiektów ze sobą jak najbardziej to możliwe,
po to aby zmiana jednego nie powodowała modyfikację drugiego. W świecie gier,
sprawa wygląda tak, że jak dodajesz jakiś feature do gry, to w im mniejszej
liczbie klas musisz coś zmienić tym lepiej.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;✨ Nie wiedziałem, że te podejście posiada taką nazwę. Pierwsze słowa
uznania dla prelegenta.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;“Jeśli z wielu miejscach musisz nanieść poprawki to wiedz, że coś się dzieje.”
&lt;br /&gt; — Damian “Ferrante” Wielgosik&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3 id=&quot;pattern-srp&quot;&gt;S - SRP&lt;/h3&gt;

&lt;p&gt;Kolejna zasada jaka została przedstawiona to zasada minimalnej
odpowiedzialności. W przykładowej aplikacji &lt;code class=&quot;highlighter-rouge&quot;&gt;Product&lt;/code&gt; wiedział, że znajduje
się w &lt;code class=&quot;highlighter-rouge&quot;&gt;Cart&lt;/code&gt; - trzymał o tym informację w swojej logice. &lt;strong&gt;Po co produkt ma
wiedzieć, że jest coś takiego jak koszyk?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Rozwiązanie?&lt;/strong&gt; To koszyk musi wiedzieć, czy produkt w nim jest.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;✨ W okolicach 15 minuty zostało wypowiedziane przez prelegenta DDD.
Nie znam tego terminu.&lt;/p&gt;

&lt;p&gt;Poczytałem trochę o tym i nie będę się starał w krótkich słowach pisać co to
jest. Za jakiś czas napiszę artykuł na temat tego podejścia do programowania.&lt;/p&gt;

&lt;p&gt;Kupiłem już nawet kiedyś książki na temat DDD aby pogłębić temat. Gdy je
przeczytam na pewno pojawi się o tym artykuł.&lt;/p&gt;

&lt;figure class=&quot;social-center-block&quot;&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;I just bought several books about &lt;a href=&quot;https://twitter.com/hashtag/ddd?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#ddd&lt;/a&gt; &lt;a href=&quot;https://twitter.com/hashtag/tdd?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#tdd&lt;/a&gt; &amp;amp; &lt;a href=&quot;https://twitter.com/hashtag/bdd?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#bdd&lt;/a&gt; and other stuff. Thanks &lt;a href=&quot;https://twitter.com/HelionPL?ref_src=twsrc%5Etfw&quot;&gt;@HelionPL&lt;/a&gt; 🤓 &lt;a href=&quot;https://t.co/HC5Kh7BK2A&quot;&gt;pic.twitter.com/HC5Kh7BK2A&lt;/a&gt;&lt;/p&gt;&amp;mdash; Piotr Kowalski (@piecioshka) &lt;a href=&quot;https://twitter.com/piecioshka/status/779362297621934080?ref_src=twsrc%5Etfw&quot;&gt;September 23, 2016&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async=&quot;&quot; src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;

&lt;/figure&gt;

&lt;h3 id=&quot;pattern-isp&quot;&gt;I - ISP&lt;/h3&gt;

&lt;p&gt;Po kilku minutach Damian rzucił przykładem, że koszyk chciałby wiedzieć jak
się zapisuje. Ten proces może się odbywać za pomocą HTTP, LocalStorage albo
cokolwiek innego. Funkcja zapisująca będzie posiadała wszystkie możliwe
rozwiązania do zapisu, tym samym będzie to strasznie długa funkcja.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Rozwiązanie?&lt;/strong&gt; Podział na mniejsze interfejsy, które będą realizowały jak
najmniej rzeczy. Jeśli chcielibyśmy zapisywać koszyk do LocalStorage, to
trzeba zrobić nową klasę, która będzie realizowała tylko tą rzecz.
&lt;strong&gt;Rozwiązanie zaczerpnięte z DDD: stworzenie modułu typu “repozytorium”.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;✨ Nie znałem takiego typu modułów. Kolejna rzecz, która mnie czegoś
nauczyła.&lt;/p&gt;

&lt;p&gt;Damian porównał koszyk do listu. List nie wie jak jest przenoszony, czy to
InPostem, czy listonoszem itd. Koszyk też nie wie jak jest zapisywany.
Bardzo ciekawa analogia.&lt;/p&gt;

&lt;p&gt;Koszyk nie może mieć funkcji typu: save, load. Utarło się, że jest to domena
repozytoriów, które mogą dane załadować, dostarczyć i zapisują.&lt;/p&gt;

&lt;blockquote class=&quot;block-average&quot;&gt;
  &lt;p&gt;“Nie wolno używać generalnego interfejsu. Należy rozbijać funkcje na jak
najmniejsze, tak aby realizowały jeden (określony w nazwie) task.”
&lt;br /&gt; — Damian “Ferrante” Wielgosik&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3 id=&quot;pattern-lsp&quot;&gt;L - LSP&lt;/h3&gt;

&lt;p&gt;Zasada ta została stworzona po to, aby tworzyć podklasy danego problemu.
Jeśli chcielibyśmy dodać do koszyka grę, która miałaby dodatkowe parametry,
takie jak np. ograniczenie wiekowe, to trzeba by rozszerzyć klasę &lt;code class=&quot;highlighter-rouge&quot;&gt;Product&lt;/code&gt;.
Jednak nie jest to dobra droga, ponieważ wtedy wszystkie produkty, nie ważne
jakiego typu by były, dostały informację o ograniczeniu wiekowym.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Rozwiązanie?&lt;/strong&gt; Bardzo proste. Stworzenie klasy pochodnej &lt;code class=&quot;highlighter-rouge&quot;&gt;GameProduct&lt;/code&gt;, która
dziedziczy po klasie &lt;code class=&quot;highlighter-rouge&quot;&gt;Product&lt;/code&gt; i rozszerza obiekt o parametr &lt;code class=&quot;highlighter-rouge&quot;&gt;limitAge&lt;/code&gt;.&lt;/p&gt;

&lt;h3 id=&quot;o---ocp&quot;&gt;O - OCP&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Niestety&lt;/em&gt;, ale zabrakło czasu na pokazanie tej zasady. No chyba że była
omawiana, ale to musiało mnie wtedy zabraknąć.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Damian, jeśli to czytasz, to daj proszę znać, jak w omawiamy przez Ciebie
przykładzie omówiłbyś tą zasadę.&lt;/strong&gt;&lt;/p&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;podsumowując-30-minutową-prelekcję&quot;&gt;Podsumowując 30 minutową prelekcję.&lt;/h3&gt;

&lt;p&gt;Jestem zadowolony, że na scenie gościliśmy pioniera spotkań programistów
JavaScript w Polsce. Przygotowanie prelegenta było na wysokim poziomie.
Dobrze mi się go słuchało. &lt;strong&gt;Uwielbiam rozmawiać o wzorcach projektowych,
dlatego też taka prelekcja jak najbardziej przypadła mi do gustu.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Link do prelekcji: &lt;a href=&quot;https://www.youtube.com/watch?v=iDEXJsigXUY&quot;&gt;youtube.com/watch?v=iDEXJsigXUY&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Kontakt do prelegenta: &lt;a href=&quot;https://twitter.com/varjs&quot;&gt;@varjs&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;h2 id=&quot;talk-2-handling-asynchronous-actions-in-react-redux-apps-en-monika-glier&quot;&gt;Talk #2: Handling Asynchronous Actions in React-Redux Apps [EN] &lt;small&gt;Monika Glier&lt;/small&gt;&lt;/h2&gt;

&lt;p&gt;Monika jako druga prelegentka w historii WarsawJS opowiadała o obsłudze akcji
asynchronicznych w aplikacjach Reactowych opartych na Reduxie.&lt;/p&gt;

&lt;p&gt;Prelegentka zmieniła swoją ścieżkę kariery 2-3 lata temu. Wcześniej była
prawnikiem.&lt;/p&gt;

&lt;figure class=&quot;social-center-block&quot;&gt;
    &lt;iframe src=&quot;https://www.facebook.com/plugins/post.php?href=https%3A%2F%2Fwww.facebook.com%2Fwarsawjs%2Fphotos%2Fa.2103415206551478.1073741841.1578130679079936%2F2103415219884810%2F%3Ftype%3D3&amp;amp;width=500&quot; width=&quot;500&quot; height=&quot;443&quot; style=&quot;border:none;overflow:hidden&quot; scrolling=&quot;no&quot; frameborder=&quot;0&quot; allowtransparency=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;/figure&gt;

&lt;p&gt;Prelekcja zaczęła się od wprowadzenia w świat asynchroniczności. Jak
definicja asynchroniczności została potraktowane powiedzenie:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Asynchroniczne akcje to akcje, które zostaną kiedyś wywołane.
&lt;br /&gt; — Monika Glier&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Śmieszne wytłumaczenie, ale prawdziwe.&lt;/strong&gt; Nie ma żadnej kontroli, kiedy
funkcje asynchroniczne zostaną wykonane.&lt;/p&gt;

&lt;p&gt;Kolejnym krokiem było wytłumaczenie przez Monikę w krótkich słowach czym jest
Redux. W dzisiejszych czasach już chyba wszyscy wiedzą co to za biblioteka.&lt;/p&gt;

&lt;p&gt;Prosta architektura Reduxa:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;użytkownik wykonuje akcje (&lt;code class=&quot;highlighter-rouge&quot;&gt;dispatch action&lt;/code&gt;),&lt;/li&gt;
  &lt;li&gt;ona uruchamia &lt;code class=&quot;highlighter-rouge&quot;&gt;reducer&lt;/code&gt;, który zmienia &lt;code class=&quot;highlighter-rouge&quot;&gt;store&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;a następnie przerenderowany jest &lt;code class=&quot;highlighter-rouge&quot;&gt;component&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tyle. Prosta architektura, ale jakże pomocna. &lt;strong&gt;Prawdę mówiąc korzystałem z
takiej architektury kilka lat temu, kiedy pracowałem przy projekcie opartym
na frameworku Backbone.&lt;/strong&gt; W dzisiejszych czasach ten framework to już trochę
przeżytek, ale ja mocno go chwalę. Można powiedzieć, że “programistycznie”
się na nim wychowałem.&lt;/p&gt;

&lt;figure class=&quot;social-center-block&quot;&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;pl&quot; dir=&quot;ltr&quot;&gt;Film prosto ze spotkania WarsawJS Meetup 32 &lt;a href=&quot;https://twitter.com/hashtag/warsawjs?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#warsawjs&lt;/a&gt; 🎬 &lt;a href=&quot;https://twitter.com/MonikaGlier?ref_src=twsrc%5Etfw&quot;&gt;@MonikaGlier&lt;/a&gt; na scenie! &lt;a href=&quot;https://t.co/hZNvtIup2d&quot;&gt;pic.twitter.com/hZNvtIup2d&lt;/a&gt;&lt;/p&gt;&amp;mdash; Piotr Kowalski (@piecioshka) &lt;a href=&quot;https://twitter.com/piecioshka/status/852211008919789569?ref_src=twsrc%5Etfw&quot;&gt;April 12, 2017&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async=&quot;&quot; src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;

&lt;/figure&gt;

&lt;p&gt;Do aplikacji opartych na Reduxie, Monika poleca kilka bibliotek:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/gaearon/redux-thunk&quot;&gt;redux-thunk&lt;/a&gt; - popularność biblioteki spowodowana jest
  występowaniem woficjalnej dokumentacji Reduxa&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/redux-saga/redux-saga&quot;&gt;redux-saga&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pod koniec prezentacji dowiedzieliśmy się co nieco o testach z użyciem sagi.
A na zakończenie Monika porównała wyżej wymienione biblioteki.&lt;/p&gt;

&lt;p&gt;Świetna prelekcja, która “zajawiała” tematykę asynchroniczności w Redux-owym
świecie tworzenia aplikacji. Thanks Monia!&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Link do prelekcji: &lt;a href=&quot;https://www.youtube.com/watch?v=XVCNeUle7ro&quot;&gt;youtube.com/watch?v=XVCNeUle7ro&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Kontakt do prelegenta: &lt;a href=&quot;https://twitter.com/MonikaGlier&quot;&gt;@MonikaGlier&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;h2 id=&quot;panel-dyskusyjny&quot;&gt;Panel dyskusyjny&lt;/h2&gt;

&lt;p&gt;Podczas tego wydarzenia miał miejsce &lt;strong&gt;pierwszy w historii WarsawJS panel
dyskusyjny&lt;/strong&gt; podczas którego zadawaliśmy pytania ekspertom,
aby wygenerować dyskusję na popularne tematy ze świata JavaScript-u.&lt;/p&gt;

&lt;p&gt;Zrezygnowaliśmy z trzeciej prelekcji, aby zobaczyć jak wydarzenie będzie
wyglądało razem z panelem. Rozwialiśmy wszelkie wątpliwości, m.in że
wydarzenie przerodzi się w kilkugodzinny maraton.&lt;/p&gt;

&lt;p&gt;Świetny odbiór ludzi dał mi potwierdzenie, że warto robić takie panele.&lt;/p&gt;

&lt;p&gt;Nagranie z panelu jest dostępne w naszych archiwach, jednak z powodu słabej
perspektywy (publiczność przysłania ekspertów), materiał nie zostanie
opublikowany.&lt;/p&gt;

&lt;p&gt;Zastanawiamy się, czy aby nie opublikować samej ścieżki audio.&lt;br /&gt;
&lt;strong&gt;Jak myślisz, będzie to dobry pomysł?&lt;/strong&gt;&lt;/p&gt;

&lt;figure class=&quot;social-center-block&quot;&gt;
    &lt;iframe src=&quot;https://www.facebook.com/plugins/post.php?href=https%3A%2F%2Fwww.facebook.com%2Fwarsawjs%2Fposts%2F2103415423218123&amp;amp;width=500&quot; width=&quot;500&quot; height=&quot;626&quot; style=&quot;border:none;overflow:hidden&quot; scrolling=&quot;no&quot; frameborder=&quot;0&quot; allowtransparency=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;/figure&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;h2 id=&quot;sponsorzy-spotkania&quot;&gt;Sponsorzy spotkania&lt;/h2&gt;

&lt;p&gt;Podziękowania dla firm sponsorskich, które szukają pracowników z obszaru
Front-end. Jeśli szukasz pracy napisz do nich, albo do mnie - a ja skieruję
Cię do odpowiedniej osoby.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.facebook.com/10Clouds/&quot;&gt;10Clouds&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.facebook.com/artificialio/&quot;&gt;Artificial Labs&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.facebook.com/cyfrowypolsat/&quot;&gt;Cyfrowy Polsat&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.facebook.com/Daftcode/&quot;&gt;DaftCode&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.facebook.com/elpassion/&quot;&gt;EL Passion&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.facebook.com/softwarely/&quot;&gt;Softwarely&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;!-- Resources --&gt;

</description>
            <pubDate>Fri, 02 Jun 2017 21:55:58 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2017/06/02/warsawjs-meetup-32.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2017/06/02/warsawjs-meetup-32.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/post-banner-warsawjs.jpg</image>
        </item>
        
        <item>
            <title>Angular: Jak zamockować dane do usługi HTTP?</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Mokowałeś kiedyś dane w projekcie Angularowym na wypadek braku komunikacji z
back-endem? Jeśli nie to zapraszam Cię do lektury. W kilku krótkich krokach
pokazuje Ci jak dodać do aplikacji (od samego początku) możliwość przepięcia
zapytań HTTP na odpowiedzi ze statycznych plików JSON.&lt;/p&gt;

&lt;h2 id=&quot;zbudowanie-projektu&quot;&gt;Zbudowanie projektu&lt;/h2&gt;

&lt;blockquote&gt;
  &lt;p&gt;Projekt, który będziemy budować dostępny jest na GitHubie:
&lt;a href=&quot;https://github.com/piecioshka/test-angular-mocks&quot;&gt;github.com/piecioshka/test-angular-mocks&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;kbd&gt;Copy + paste&lt;/kbd&gt;&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;ng new test-angular-mocks
&lt;span class=&quot;nb&quot;&gt;cd &lt;/span&gt;test-angular-mocks
&lt;span class=&quot;c&quot;&gt;# jeśli używasz npm v5+ to warto wykonać:&lt;/span&gt;
git add &lt;span class=&quot;nb&quot;&gt;.&lt;/span&gt;
git commit package-lock.json &lt;span class=&quot;nt&quot;&gt;-m&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;Add pkg lock file&quot;&lt;/span&gt;
ng serve
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Dzięki temu poleceniu, aplikacja zostanie zbudowana i wystawiona do
przeglądania za pomocą przeglądarki na adresie: &lt;a href=&quot;http://localhost:4200/&quot;&gt;localhost:4200/&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Polecenie uruchamia narzędzie typu “server + watcher”, czyli:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;dl&gt;
      &lt;dt&gt;server&lt;/dt&gt;
      &lt;dd&gt;daje to, że aplikacja ciągle jest dostępna za pomocą browsera&lt;/dd&gt;
    &lt;/dl&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;dl&gt;
      &lt;dt&gt;watcher&lt;/dt&gt;
      &lt;dd&gt;narzędzie nasłuchuje na zmiany w dowolnym pliku w projekcie&lt;/dd&gt;
    &lt;/dl&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Niech ciągle będzie włączone non stop. Nie będzie to nam przeszkadzać, a
tylko pomagać, ponieważ zawsze będziemy mieli dostęp do aplikacji
zaserwowanej dla klienta końcowego.&lt;/p&gt;

&lt;blockquote class=&quot;block-average&quot;&gt;
  &lt;h3 id=&quot;-uwaga&quot;&gt;&lt;i class=&quot;icon-average&quot;&gt;&lt;/i&gt; Uwaga&lt;/h3&gt;
  &lt;p&gt;Pamiętajcie, żeby dać CLI czas na zbudowanie aplikacji.
Tym samym, po zapisaniu pliku i odczekaniu niewystarczającej liczby sekund,
możesz mieć ciągle starą wersję aplikacji!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id=&quot;krok-1-nakreślenie-architektury-komunikacji-z-back-endem&quot;&gt;Krok 1: Nakreślenie architektury komunikacji z back-endem&lt;/h2&gt;

&lt;figure id=&quot;scheme-1&quot;&gt;
    &lt;img src=&quot;/assets/images/posts/angular-mocks/scheme-1.png&quot; alt=&quot;&quot; /&gt;
    &lt;figcaption&gt;
        Schemat 1.
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;krok-2-implementacja-komunikacji-między-obiektami&quot;&gt;Krok 2: Implementacja komunikacji między obiektami&lt;/h2&gt;

&lt;p&gt;&lt;kbd&gt;Copy + paste&lt;/kbd&gt;&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;ng g service services/data
git commit &lt;span class=&quot;nt&quot;&gt;-am&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'Create directory for services'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Nie chcę od razu w nowym serwisie komunikować się z back-end.&lt;/p&gt;

&lt;p&gt;Jeśli bym to zrobił, to nie mam możliwości stworzenia middleware-u, takim
jakim jest np. proxy. Dlatego też stworzę nowy serwis który będzie
odpowiedzialny za realizację zapytania HTTP.&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;DataService&lt;/code&gt; jest odpowiedzialny za pobranie danych. Jednak nie jest jasno
powiedziane skąd te dane powinny pochodzić.&lt;/p&gt;

&lt;p&gt;Uważam jest to kwestią samego DataService-u skąd będzie pobierał sobie dane.
Może będzie pobierał je z kilku miejsce? Np. może sprawdzić na początku
LocalStorage i jeśli w nim nie znajdzie to fallbackiem będzie request HTTP.&lt;/p&gt;

&lt;p&gt;Stworzenie nowego serwisu, który będzie odpowiedzialny za komunikację z
zewnętrznym API:&lt;/p&gt;

&lt;p&gt;&lt;kbd&gt;Copy + paste&lt;/kbd&gt;&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;ng g service services/rest
git add &lt;span class=&quot;nb&quot;&gt;.&lt;/span&gt;
git commit &lt;span class=&quot;nt&quot;&gt;-am&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'Add RestService'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;krok-21-łączenie-serwisów&quot;&gt;Krok 2.1: Łączenie serwisów&lt;/h3&gt;

&lt;p&gt;W projekcie istnieją 2 serwisy - należy je połączyć w taki sposób jak na
&lt;a href=&quot;#scheme-1&quot;&gt;pierwszym schemacie&lt;/a&gt;. Do &lt;code class=&quot;highlighter-rouge&quot;&gt;DataService&lt;/code&gt; jest wstrzyknięty
&lt;code class=&quot;highlighter-rouge&quot;&gt;RestService&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Aby to zrobić należy w konstruktorze &lt;code class=&quot;highlighter-rouge&quot;&gt;DataService&lt;/code&gt; zdefiniować zmienną
prywatną &lt;code class=&quot;highlighter-rouge&quot;&gt;restService&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&quot;language-typescript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Injectable&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'@angular/core'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;RestService&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'./rest.service'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;p&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;nd&quot;&gt;Injectable&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;DataService&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;constructor&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kr&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;restService&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;RestService&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;krok-22-łączenie-komponentu-z-serwisem&quot;&gt;Krok 2.2: Łączenie komponentu z serwisem&lt;/h3&gt;

&lt;p&gt;Podobnie jak w przypadku łączenia serwisów i w tym przypadku trzeba
zdefiniować w konstruktorze klasy “oczekiwanie” na wybrany serwis.&lt;/p&gt;

&lt;p&gt;Chcę doprowadzić do sytuacji nakreślonej w &lt;a href=&quot;#scheme-1&quot;&gt;pierwszym schemacie&lt;/a&gt;,
czyli komponent (w tym przypadku jedyny komponent czyli &lt;code class=&quot;highlighter-rouge&quot;&gt;AppComponent&lt;/code&gt;)
komunikuje się z &lt;code class=&quot;highlighter-rouge&quot;&gt;DataService&lt;/code&gt;, który do dopiero wewnętrznie będzie
komunikował się z &lt;code class=&quot;highlighter-rouge&quot;&gt;RestService&lt;/code&gt;. Jednak ze względu na to, że &lt;code class=&quot;highlighter-rouge&quot;&gt;DataService&lt;/code&gt;
sam posiada zależność, to tą zależność trzeba zdefiniować w providerach
komponentu &lt;code class=&quot;highlighter-rouge&quot;&gt;AppComponent&lt;/code&gt;. W przeciwnym przypadku na stronie pojawi się
komunikat&lt;/p&gt;

&lt;blockquote class=&quot;block-poor&quot;&gt;
  &lt;h3 id=&quot;-error&quot;&gt;&lt;i class=&quot;icon-poor&quot;&gt;&lt;/i&gt; ERROR&lt;/h3&gt;
  &lt;p&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;ERROR Error: No provider for RestService!&lt;/code&gt;&lt;br /&gt;
Taki komunikat będzie się pojawiał w DevToolsach (zakładka Console) w
aplikacji (&lt;a href=&quot;http://localhost:4200/&quot;&gt;localhost:4200/&lt;/a&gt;) albo w testach jednostkowych
(&lt;a href=&quot;http://localhost:9876/&quot;&gt;localhost:9876/&lt;/a&gt;) jeśli nie zdefiniujesz wszystkich zależności
modułu.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class=&quot;language-typescript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Component&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'@angular/core'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;DataService&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'./services/data.service'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;RestService&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'./services/rest.service'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;p&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;nd&quot;&gt;Component&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;({&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;selector&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'app-root'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;templateUrl&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'./app.component.html'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;styleUrls&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'./app.component.css'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;providers&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;DataService&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;RestService&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;})&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;AppComponent&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;nx&quot;&gt;title&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'app works!'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;kd&quot;&gt;constructor&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kr&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;dataService&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;DataService&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;dataService&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;fetch&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;W zakładce Console okna w którym uruchomiona jest aplikacja powinieneś
zobaczyć:&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/angular-mocks/printed-rest-service.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;figcaption&gt;
        Pusty obiekt stworzony na podstawie klasy `RestService`.
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;blockquote&gt;
  &lt;p&gt;Jeśli jest inaczej, to gdzieś popełniłeś błąd.&lt;br /&gt;
Daj mi znać w komentarzu to &lt;strong&gt;z chęcią Ci pomogę&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;h2 id=&quot;krok-3-stworzenie-zapytania-http&quot;&gt;Krok 3: Stworzenie zapytania HTTP&lt;/h2&gt;

&lt;p&gt;Definicja zapytania HTTP będzie w serwisie &lt;code class=&quot;highlighter-rouge&quot;&gt;RestService&lt;/code&gt;. Takie też było jego
przeznaczenie.&lt;/p&gt;

&lt;div class=&quot;language-typescript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Injectable&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'@angular/core'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Http&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Response&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'@angular/http'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Observable&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'rxjs/Rx'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;p&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;nd&quot;&gt;Injectable&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;RestService&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;

  &lt;span class=&quot;kd&quot;&gt;constructor&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kr&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;http&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Http&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

  &lt;span class=&quot;nx&quot;&gt;makeRequest&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Observable&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;Response&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;http&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;kd&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
      &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;catch&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;err&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;nx&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'Request to &quot;%s&quot; failed'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Observable&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;throw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;err&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
      &lt;span class=&quot;p&quot;&gt;});&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Teraz aby wykorzystać nowo stworzoną funkcję to w &lt;code class=&quot;highlighter-rouge&quot;&gt;DataService&lt;/code&gt; należy ją użyć:&lt;/p&gt;

&lt;div class=&quot;language-typescript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Injectable&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'@angular/core'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;RestService&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'./rest.service'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;p&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;nd&quot;&gt;Injectable&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;DataService&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;

  &lt;span class=&quot;kd&quot;&gt;constructor&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kr&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;restService&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;RestService&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

  &lt;span class=&quot;nx&quot;&gt;fetch&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;restService&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;makeRequest&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Ostatni krok to uruchomić funkcję &lt;code class=&quot;highlighter-rouge&quot;&gt;DataService#fetch&lt;/code&gt;, aby pobrać dane.&lt;/p&gt;

&lt;div class=&quot;language-typescript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;// ...&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;AppComponent&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;nx&quot;&gt;title&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'app works!'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;kd&quot;&gt;constructor&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kr&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;dataService&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;DataService&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;dataService&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;fetch&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'/'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
      &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;subscribe&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;response&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;nx&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;response&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
      &lt;span class=&quot;p&quot;&gt;});&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Psst… W plikach z testami (&lt;code class=&quot;highlighter-rouge&quot;&gt;*.spec.ts&lt;/code&gt;) należy zaimportować moduł &lt;code class=&quot;highlighter-rouge&quot;&gt;Http&lt;/code&gt;, aby
testy jednostkowe nie generowały błędów:&lt;/p&gt;

&lt;div class=&quot;language-typescript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;// ...&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;HttpModule&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'@angular/http'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;// ...&lt;/span&gt;

&lt;span class=&quot;nx&quot;&gt;TestBed&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;configureTestingModule&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;({&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;imports&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;HttpModule&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;],&lt;/span&gt;
  &lt;span class=&quot;c1&quot;&gt;// ...&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}).&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;compileComponents&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;// ...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;krok-4-pobranie-realnych-danych&quot;&gt;Krok 4: Pobranie realnych danych&lt;/h2&gt;

&lt;p&gt;Posłużymy się portalem dla programistów tj. GitHub-em i jego publicznym API
skąd pobierzemy wszelkie publiczne dane na temat dowolnego użytkownika&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Zgłaszam się na ochotnika!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;W takim razie zaktualizujmy URLa do zasobu z którego pobieramy odpowiedź na
następujący: &lt;a href=&quot;https://api.github.com/users/piecioshka&quot;&gt;api.github.com/users/piecioshka&lt;/a&gt;.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/angular-mocks/printed-response-text.png&quot; alt=&quot;&quot; /&gt;
    &lt;figcaption&gt;
        Wyświetlony obiekt zawiera odpowiedź z zapytania o publiczne dane nt.
        mojego konta na GitHubie. Treść (body) jest w formie tekstowej.
        Lepiej by było, gdyby to była forma JSONa. Trzeba zatem sparsować!
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Od teraz będziemy posługiwali się tylko URL-ami do zasobów, które będę zwracać
dane w formacie JSON, warto więc wykorzystać natywną funkcję &lt;code class=&quot;highlighter-rouge&quot;&gt;Response#json()&lt;/code&gt;.
Proponuję, aby w serwisie &lt;code class=&quot;highlighter-rouge&quot;&gt;RestService&lt;/code&gt; dodać sparsowanie zwracanego obiektu
typu &lt;code class=&quot;highlighter-rouge&quot;&gt;Response&lt;/code&gt; na obiekt JavaScript-owy. Wszystko to da się zrealizować za
pomocą kilku linijek:&lt;/p&gt;

&lt;div class=&quot;language-typescript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;// ...&lt;/span&gt;

&lt;span class=&quot;p&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;nd&quot;&gt;Injectable&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;RestService&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;c1&quot;&gt;// ...&lt;/span&gt;

  &lt;span class=&quot;nx&quot;&gt;makeRequest&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Observable&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;Response&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;http&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;kd&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
      &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;res&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;res&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;json&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
      &lt;span class=&quot;p&quot;&gt;})&lt;/span&gt;
      &lt;span class=&quot;c1&quot;&gt;// ...&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;krok-5-prezentacja-danych&quot;&gt;Krok 5: Prezentacja danych&lt;/h2&gt;

&lt;p&gt;Prezentacja to &lt;strong&gt;najprzyjemniejsza część w Angularze&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Na podstawie danych w komponencie za pomocą interpolacji albo
dynamicznych atrybutów definiujesz w markupie co ma się wyświetlić
użytkownikowi.&lt;/p&gt;

&lt;p&gt;I tak plik: &lt;code class=&quot;highlighter-rouge&quot;&gt;app.component.html&lt;/code&gt; zmienił się na taki:&lt;/p&gt;

&lt;div class=&quot;language-html highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;h1&amp;gt;&lt;/span&gt;
  { { title }}
&lt;span class=&quot;nt&quot;&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;

&lt;span class=&quot;nt&quot;&gt;&amp;lt;img&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;]=&quot;&lt;/span&gt;&lt;span class=&quot;na&quot;&gt;avatar_url&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;alt=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Atrybut &lt;code class=&quot;highlighter-rouge&quot;&gt;[src]&lt;/code&gt; jest w nawiasach kwadratowych ze względu na to,
aby przeglądarka nie robiła request-u po obrazek, kiedy jeszcze właściwość
komponentu (&lt;code class=&quot;highlighter-rouge&quot;&gt;avatar_url&lt;/code&gt;) nie jest ustawiona.&lt;/p&gt;

&lt;p&gt;Czas na główny plik, tj. komponent &lt;code class=&quot;highlighter-rouge&quot;&gt;AppComponent&lt;/code&gt; - plik &lt;code class=&quot;highlighter-rouge&quot;&gt;app.component.ts&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Na początku przechwytujemy podstawowe klucze, czyli: &lt;code class=&quot;highlighter-rouge&quot;&gt;name&lt;/code&gt; i &lt;code class=&quot;highlighter-rouge&quot;&gt;avatar_url&lt;/code&gt;.
Podczas pobrania tych danych z obiektu &lt;code class=&quot;highlighter-rouge&quot;&gt;response&lt;/code&gt; WebStorm podświetli, że w
obiekcie tym nie znajdują się takie properties-y.&lt;/p&gt;

&lt;p&gt;Aby rozwiązać problem z typami stworzyłem interfejs o nazwie np.
&lt;code class=&quot;highlighter-rouge&quot;&gt;GitHubProfileResponse&lt;/code&gt;. W którym zdefiniowałem 2 używane przeze mnie pola.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Oczywiście GitHub API zwraca nie tylko te pola, ale na ten moment nie ma
sensu wypisywać wszystkich.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Hint:&lt;/strong&gt; Nowy interfejs musi rozszerzać obiekt &lt;code class=&quot;highlighter-rouge&quot;&gt;Response&lt;/code&gt;, ale uwaga! Nie
natywny obiekt &lt;code class=&quot;highlighter-rouge&quot;&gt;window.Response&lt;/code&gt;, tylko Angularowy. Stąd też importuje w
pierwszej linijce obiekt &lt;code class=&quot;highlighter-rouge&quot;&gt;Response&lt;/code&gt;.&lt;/p&gt;

&lt;div class=&quot;language-typescript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Response&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'@angular/http'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;// ...&lt;/span&gt;

&lt;span class=&quot;kr&quot;&gt;interface&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;GitHubProfileResponse&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;extends&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Response&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;nl&quot;&gt;avatar_url&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;nl&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;// ...&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;AppComponent&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;nx&quot;&gt;title&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;''&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;nx&quot;&gt;avatar_url&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;''&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;kd&quot;&gt;constructor&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kr&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;dataService&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;DataService&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;dataService&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;fetch&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'https://api.github.com/users/piecioshka'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
      &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;subscribe&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;response&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;GitHubProfileResponse&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;title&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;response&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;avatar_url&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;response&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;avatar_url&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;nx&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;response&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
      &lt;span class=&quot;p&quot;&gt;});&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;To tyle z aplikacji. Kiedy przeładujesz stronę (albo automat zrobi to za
Ciebie, gdy będzie gotowy) to ujrzysz minimalistyczny mój profil GitHub-owy.&lt;/p&gt;

&lt;p&gt;Z testów trzeba (plik &lt;code class=&quot;highlighter-rouge&quot;&gt;app.component.spec.ts&lt;/code&gt;) trzeba usunąć 2 ostatnie
testy, które sprawdzają istnienie stringa “app works!”. Ten ciąg znaków
został usunięty z komponentu, aby nie pokazywał się na starcie przez ułamek
sekundy (odpowiedź z GitHub API napisze właściwość &lt;code class=&quot;highlighter-rouge&quot;&gt;title&lt;/code&gt;).&lt;/p&gt;

&lt;h2 id=&quot;krok-6-mockowanie&quot;&gt;Krok 6: Mockowanie!&lt;/h2&gt;

&lt;p&gt;Wszystko pięknie działa. Z połączeniem do internetu. Teraz chciałbym ostylować
mój komponent z kartą profilu. &lt;strong&gt;Ups… coś się stało… GitHub padł…&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Tak, wiem. To rzadki przypadek ale może tak być. Co teraz? Nie mam danych,
aby zasilić komponent więc nie wiem jak będzie wyglądał tekst i jak będzie
komponował się przy nim obrazek! &lt;strong&gt;Wtopa&lt;/strong&gt;.&lt;/p&gt;

&lt;blockquote class=&quot;block-average&quot;&gt;
  &lt;h3 id=&quot;-co-należało-zrobić-kilka-kroków-wcześniej&quot;&gt;&lt;i class=&quot;icon-average&quot;&gt;&lt;/i&gt; Co należało zrobić kilka kroków wcześniej?&lt;/h3&gt;
  &lt;p&gt;Warto było zapisać odpowiedź z GitHub API, aby teraz kontynuować pracę na
poprawnym formacie danych.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;figure id=&quot;scheme-2&quot;&gt;
    &lt;img src=&quot;/assets/images/posts/angular-mocks/scheme-2.png&quot; alt=&quot;&quot; /&gt;
    &lt;figcaption&gt;
        Schemat 2.
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h3 id=&quot;krok-61-stworzenie-pliku-z-poprawną-odpowiedzią-z-github-api&quot;&gt;Krok 6.1: Stworzenie pliku z poprawną odpowiedzią z GitHub API&lt;/h3&gt;

&lt;p&gt;Cofnijmy się do tego momentu, kiedy GitHub API jeszcze działał i zapiszmy z
niego odpowiedź. Na początku stworzę plik &lt;code class=&quot;highlighter-rouge&quot;&gt;src/app/mocks/piecioshka.json&lt;/code&gt; i
wkleję do niego odpowiedź z GitHub API.&lt;/p&gt;

&lt;h3 id=&quot;krok-62-nowe-narzędzie-angular-in-memory-web-api&quot;&gt;Krok 6.2. Nowe narzędzie: &lt;code class=&quot;highlighter-rouge&quot;&gt;angular-in-memory-web-api&lt;/code&gt;&lt;/h3&gt;

&lt;p&gt;Zainstaluję narzędzie &lt;a href=&quot;https://github.com/angular/in-memory-web-api&quot;&gt;angular-in-memory-web-api&lt;/a&gt;. Oczywiście
proces instalacji doda informację o paczce do dwóch plików:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;package.json&lt;/li&gt;
  &lt;li&gt;package-lock.json&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Warto stworzyć z tego rewizję.&lt;/p&gt;

&lt;h3 id=&quot;krok-63-stworzenie-serwisu-który-będzie-emulował-zapytania-http&quot;&gt;Krok 6.3: Stworzenie serwisu, który będzie emulował zapytania HTTP&lt;/h3&gt;

&lt;p&gt;Za pomocą poniższego polecenia stworzę plik
&lt;code class=&quot;highlighter-rouge&quot;&gt;src/app/services/mock.service.ts&lt;/code&gt;, który będzie bratem serwisu
&lt;code class=&quot;highlighter-rouge&quot;&gt;RestService&lt;/code&gt;. Zgodnie z tym co jest zdefiniowane na
&lt;a href=&quot;#scheme-2&quot;&gt;drugiem schemacie&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;kbd&gt;Copy + paste&lt;/kbd&gt;&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;ng g service services/mock
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;W pliku (tak samo jak &lt;code class=&quot;highlighter-rouge&quot;&gt;RestService&lt;/code&gt;) musi istnieć funkcja &lt;code class=&quot;highlighter-rouge&quot;&gt;makeRequest&lt;/code&gt;,
która będzie zwracała obiekt &lt;code class=&quot;highlighter-rouge&quot;&gt;Observable&lt;/code&gt;.&lt;/p&gt;

&lt;div class=&quot;language-typescript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Injectable&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'@angular/core'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Http&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Response&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;ResponseOptions&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'@angular/http'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Observable&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'rxjs/Rx'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;p&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;nd&quot;&gt;Injectable&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;MockService&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;

  &lt;span class=&quot;kd&quot;&gt;constructor&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kr&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;http&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Http&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

  &lt;span class=&quot;nx&quot;&gt;makeRequest&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Observable&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;Response&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'◉ Mock finished loading: GET &quot;%s&quot;'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;http&lt;/span&gt;
      &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;kd&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
      &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;res&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;res&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;json&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
      &lt;span class=&quot;p&quot;&gt;})&lt;/span&gt;
      &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;catch&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;err&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;nx&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'[Mock] Request to &quot;%s&quot; failed'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Observable&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;throw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;err&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
      &lt;span class=&quot;p&quot;&gt;});&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;krok-64-wykorzystanie-serwisu-mockservice&quot;&gt;Krok 6.4: Wykorzystanie serwisu &lt;code class=&quot;highlighter-rouge&quot;&gt;MockService&lt;/code&gt;&lt;/h3&gt;

&lt;p&gt;Teraz kiedy już mamy możliwość podmiany &lt;code class=&quot;highlighter-rouge&quot;&gt;RestService&lt;/code&gt; na tzw. zaślepkowy to
dodajmy możliwość podmiany w serwisie wraperze, czyli &lt;code class=&quot;highlighter-rouge&quot;&gt;DataService&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&quot;language-typescript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Injectable&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'@angular/core'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;RestService&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'./rest.service'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;MockService&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'./mock.service'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;p&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;nd&quot;&gt;Injectable&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;DataService&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;

  &lt;span class=&quot;nl&quot;&gt;requestService&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;RestService&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;MockService&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;kd&quot;&gt;constructor&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kr&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;restService&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;RestService&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
              &lt;span class=&quot;kr&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;mockService&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;MockService&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;// this.useRestService();&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;useMockService&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

  &lt;span class=&quot;kr&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;useRestService&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;requestService&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;restService&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

  &lt;span class=&quot;kr&quot;&gt;private&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;useMockService&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;requestService&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;mockService&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

  &lt;span class=&quot;nx&quot;&gt;fetch&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;requestService&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;makeRequest&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;krok-65-stworzenie-serwisu-do-zarządzania-pamięcią-in-memory&quot;&gt;Krok 6.5: Stworzenie serwisu do zarządzania pamięcią (in-memory)&lt;/h3&gt;

&lt;p&gt;W katalogu z mockami należy stworzyć plik &lt;code class=&quot;highlighter-rouge&quot;&gt;src/app/mocks/in-memory.service.ts&lt;/code&gt;,
w którym będzie definicja wszystkich mockowanych requestów.&lt;/p&gt;

&lt;p&gt;Na ten moment jest tylko jeden, który kieruje do pliku obok
z rozszerzeniem *.json.&lt;/p&gt;

&lt;div class=&quot;language-typescript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;InMemoryDbService&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'angular-in-memory-web-api'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;InMemoryService&lt;/span&gt; &lt;span class=&quot;kr&quot;&gt;implements&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;InMemoryDbService&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;nx&quot;&gt;createDb&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;piecioshka&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'./piecioshka.json'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;};&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;krok-66-routing&quot;&gt;Krok 6.6: Routing&lt;/h3&gt;

&lt;p&gt;Wszystko fajnie, ale aplikacja dalej nie ma pojęcia o mockach. Należy
połączyć główny moduł aplikacji.&lt;/p&gt;

&lt;div class=&quot;language-typescript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;BrowserModule&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'@angular/platform-browser'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;NgModule&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'@angular/core'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;FormsModule&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'@angular/forms'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;HttpModule&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'@angular/http'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;AppComponent&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'./app.component'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;InMemoryService&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;from&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'./mocks/in-memory.service'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;// Paczka, generuje problemy podczas importowania, dlatego zmieniamy ma require.&lt;/span&gt;
&lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;mem&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'angular-in-memory-web-api'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;InMemoryWebApiModule&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;mem&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;InMemoryWebApiModule&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;p&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;nd&quot;&gt;NgModule&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;({&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;declarations&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;AppComponent&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;],&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;imports&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;BrowserModule&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;FormsModule&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;HttpModule&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;

    &lt;span class=&quot;c1&quot;&gt;// INFO(piecioshka): routing dla mocków&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;InMemoryWebApiModule&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;forRoot&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;InMemoryService&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;c1&quot;&gt;// Flaga powoduje, że pomimo tego, że są włączone mocki, to&lt;/span&gt;
      &lt;span class=&quot;c1&quot;&gt;// kiedy routing nie znajdzie URLa w swojej mapie&lt;/span&gt;
      &lt;span class=&quot;c1&quot;&gt;// zmokowanych URLi to wyśle zwykły request HTTP.&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;passThruUnknownUrl&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;true&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;})&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;],&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;providers&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[],&lt;/span&gt;
  &lt;span class=&quot;na&quot;&gt;bootstrap&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;AppComponent&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;})&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;AppModule&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;krok-67-problem-z-data&quot;&gt;Krok 6.7: Problem z &lt;code class=&quot;highlighter-rouge&quot;&gt;data&lt;/code&gt;&lt;/h3&gt;

&lt;p&gt;Odpowiedź z mocka jest w kluczu &lt;code class=&quot;highlighter-rouge&quot;&gt;data&lt;/code&gt;. Należy to oczyścić!
W pliku &lt;code class=&quot;highlighter-rouge&quot;&gt;mock.service.ts&lt;/code&gt; należy wpiąć się w chaining:&lt;/p&gt;

&lt;div class=&quot;language-typescript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;    &lt;span class=&quot;c1&quot;&gt;// ...&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;http&lt;/span&gt;
      &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;kd&quot;&gt;get&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
      &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;res&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;original&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;res&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;json&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;().&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Response&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;ResponseOptions&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;({&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;body&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;original&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;}));&lt;/span&gt;
      &lt;span class=&quot;p&quot;&gt;})&lt;/span&gt;
      &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;res&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;res&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;json&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
      &lt;span class=&quot;p&quot;&gt;})&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;// ...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;krok-68-problem-z-require&quot;&gt;Krok 6.8: Problem z &lt;code class=&quot;highlighter-rouge&quot;&gt;require&lt;/code&gt;&lt;/h3&gt;

&lt;p&gt;Ze względu na to, że domyślna konfiguracja projektu nie pozwala na
korzystanie z funkcji &lt;code class=&quot;highlighter-rouge&quot;&gt;require&lt;/code&gt; (nie jest znany taki typ, tym samym
kompilacja TypeScripta krzyczy) należy dodać do pliku z konfiguracją, tj.
&lt;code class=&quot;highlighter-rouge&quot;&gt;src/tsconfig.app.json&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&quot;language-json highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;err&quot;&gt;//&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;err&quot;&gt;...&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;types&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;node&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;//&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;err&quot;&gt;...&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;krok-69-problem-z-testami&quot;&gt;Krok 6.9: Problem z testami&lt;/h3&gt;

&lt;p&gt;Na zakończenie rozwiążę problem: &lt;code class=&quot;highlighter-rouge&quot;&gt;Cannot get name of null&lt;/code&gt;, który pojawia się
po uruchomieniu testów jednostkowych.&lt;/p&gt;

&lt;p&gt;W pliku &lt;code class=&quot;highlighter-rouge&quot;&gt;app.component.ts&lt;/code&gt; należy przenieść wywołanie zapytania z konstruktora
do nowej funkcji &lt;code class=&quot;highlighter-rouge&quot;&gt;ngOnInit&lt;/code&gt;. Jest to funkcja w interfejsie &lt;code class=&quot;highlighter-rouge&quot;&gt;OnInit&lt;/code&gt;. Funkcja
ta zostanie uruchomiona w odpowiednim czasie.&lt;/p&gt;

&lt;blockquote class=&quot;block-good&quot;&gt;
  &lt;h3 id=&quot;-wskazówka&quot;&gt;&lt;i class=&quot;icon-good&quot;&gt;&lt;/i&gt; Wskazówka&lt;/h3&gt;
  &lt;p&gt;Wszystkie funkcje z prefiksem &lt;code class=&quot;highlighter-rouge&quot;&gt;ng*&lt;/code&gt; jest to wewnętrzna nomenklatura Angulara
dzięki której w szybki sposób wiemy po co jest dana funkcja.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Funkcja &lt;code class=&quot;highlighter-rouge&quot;&gt;ngOnInit&lt;/code&gt; uruchomi się kiedy komponent będzie gotowy. W tym momencie
uruchomi się hook (&lt;a href=&quot;https://git-scm.com/book/gr/v2/Customizing-Git-Git-Hooks&quot;&gt;zdarzenie znane z Gita&lt;/a&gt;), który wywoła funkcję
&lt;code class=&quot;highlighter-rouge&quot;&gt;ngOnInit&lt;/code&gt; zdefiniowaną w komponencie.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/angular-mocks/printed-mock-response.png&quot; alt=&quot;&quot; /&gt;
    &lt;figcaption&gt;
        Prezentacja komponentu, który jest zasilany mockiem.
        &lt;strong&gt;Cel osiągnięty&lt;/strong&gt; 🎉
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;h2 id=&quot;zakończenie&quot;&gt;Zakończenie&lt;/h2&gt;

&lt;p&gt;Na zakończenie dodam trochę słów kluczowych, dzięki którym developerzy
szukający w zakamarkach internetu przewodnika jak dodać mockowanie
odpowiedzi dla usługi HTTP powinni przyjść do tego artykułu. Sam szukałem
kilkadziesiąt minut jak poradzić sobie z tym zagadnieniem i nie znalazłem
instrukcji mówiącej wprost jak należy sobie poradzić z mockowaniem.&lt;/p&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;h2 id=&quot;porady-dla-programistów-webstorma&quot;&gt;Porady, dla programistów WebStorma&lt;/h2&gt;

&lt;p&gt;Jak Ci dobrze wiadomo WebStorm indeksuje pliki projektu w celu łatwego i
szybkiego nawigowania po plikach. &lt;strong&gt;Nie ma żadnego powodu, aby WebStorm
indeksował katalog node_modules/&lt;/strong&gt;. Z tego powodu wyklucz ten katalog
klikając na niego prawym przyciskiem myszy i wybierz opcję: &lt;mark&gt;Mark
Directory as → Excluded&lt;/mark&gt;.&lt;/p&gt;

&lt;p&gt;Katalog &lt;code class=&quot;highlighter-rouge&quot;&gt;node_modules/&lt;/code&gt; powinien zaświecić się na czerwono.
Jeśli nie zmienił swojego koloru to prawdopodobnie
jest on uznany przez WebStorma za katalog z bibliotekami. Oznacza to, że
została przyznana mu dodatkowa rola, która nie pozwala na to, aby
stał się excludowany z procesu indeksowania.&lt;/p&gt;

&lt;p&gt;Aby wyłączyć dodatkową rolę katalogu &lt;code class=&quot;highlighter-rouge&quot;&gt;node_modules/&lt;/code&gt; należy wejść do ustawień
projektu: &lt;mark&gt;Preferences → Languages &amp;amp; Frameworks → JavaScript →
Libraries&lt;/mark&gt;, a następnie odznaczyć katalog &lt;code class=&quot;highlighter-rouge&quot;&gt;node_modules/&lt;/code&gt;. Teraz na pewno
wymieniony przeze mnie katalog będzie określony czerwonym kolorem.
Świadczy to o tym, że ten katalog nie będzie brał udziału w indeksowaniu.&lt;/p&gt;

&lt;p&gt;Coś za coś. WebStorm działa szybciej (nie ma tylu plików w pamięci), ale za
to nie podkreśla znanej składni. I tak:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;dl&gt;
      &lt;dt&gt;Koloruje na czerwono nazwy funkcji: &lt;code class=&quot;highlighter-rouge&quot;&gt;expect&lt;/code&gt;, &lt;code class=&quot;highlighter-rouge&quot;&gt;it&lt;/code&gt;, &lt;code class=&quot;highlighter-rouge&quot;&gt;describe&lt;/code&gt; w plikach &lt;code class=&quot;highlighter-rouge&quot;&gt;*.spec.ts&lt;/code&gt;:&lt;/dt&gt;
      &lt;dd&gt;Aby wyeliminować ten problem kliknij prawym przyciskiem myszy na katalog
&lt;code class=&quot;highlighter-rouge&quot;&gt;node_modules/@types&lt;/code&gt; a następnie wybierz opcję &lt;mark&gt;Mark Directory As → Not
Excluded&lt;/mark&gt;. Tym samym WebStorm przeindeksuje pliki z definicjami typów.
Słowa kluczowe w spec-ach powinny po chwili posiadać kolor typowy dla nich.&lt;/dd&gt;
    &lt;/dl&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;dl&gt;
      &lt;dt&gt;Koloruje na czerwono nazwy funkcji: &lt;code class=&quot;highlighter-rouge&quot;&gt;catch&lt;/code&gt; i &lt;code class=&quot;highlighter-rouge&quot;&gt;map&lt;/code&gt; podczas korzystania z &lt;code class=&quot;highlighter-rouge&quot;&gt;Observable&lt;/code&gt;:&lt;/dt&gt;
      &lt;dd&gt;Przy zapytaniu HTTP będziemy korzystali z funkcji, które zwracają
&lt;code class=&quot;highlighter-rouge&quot;&gt;Observable&lt;/code&gt;. Dlatego też trzeba dołączyć odpowiednie definicje typów aby
WebStorm zaskoczył, że funkcja &lt;code class=&quot;highlighter-rouge&quot;&gt;catch&lt;/code&gt;, czy &lt;code class=&quot;highlighter-rouge&quot;&gt;map&lt;/code&gt; pochodzą z tego obiektu.
Aby to zrobić trzeba ponowić takie same kroki jak przy pierwszym punkcie,
tylko jako katalog trzeba wybrać &lt;code class=&quot;highlighter-rouge&quot;&gt;node_modules/rxjs&lt;/code&gt;.&lt;/dd&gt;
    &lt;/dl&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;rekomendacja&quot;&gt;Rekomendacja&lt;/h2&gt;

&lt;p&gt;Jeśli szukasz jakiegoś publicznego API, które zwraca dowolne dane (z dowolnej
kategorii tematycznej, np. filmy, finanse) to polecam skorzystać z
repozytorium autorstwa Todda Motto -
&lt;a href=&quot;https://github.com/toddmotto/public-apis&quot;&gt;github.com/toddmotto/public-apis&lt;/a&gt;.&lt;/p&gt;

&lt;!-- Resources --&gt;

</description>
            <pubDate>Wed, 31 May 2017 21:56:34 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2017/05/31/angular-jak-zamockowac-dane-do-uslugi-http.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2017/05/31/angular-jak-zamockowac-dane-do-uslugi-http.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/angular-mocks/scheme-2.png</image>
        </item>
        
        <item>
            <title>10 powodów dla których warto chodzić na meetupy</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Dziś przedstawię Wam kilka argumentów (z mojej perspektywy) stojących po
stronie dlaczego warto chodzić ne meetupy. Jeśli nie chce Ci się czytać, to
zapraszam Cię na 5-minutowy film:&lt;/p&gt;

&lt;div class=&quot;youtube-lazy&quot; data-youtube-id=&quot;acCfis8E6Ck&quot;&gt;&lt;/div&gt;

&lt;h2 id=&quot;co-to-jest-meetup&quot;&gt;Co to jest meetup?&lt;/h2&gt;

&lt;p&gt;To po prostu spotkanie osób zainteresowanych danym tematem. Bardzo często
organizowane są takie spotkania dla osób których łączy wspólna pasja.
Przykładem niech będzie ten sam język programowania.&lt;/p&gt;

&lt;p&gt;Zwykle meetupy, organizowane są co miesiąc. Społeczność tego potrzebuje.&lt;/p&gt;

&lt;p&gt;Wydarzenie takie składa się z kilku prelekcji na scenie, gdzie speakerzy mają
po 30 minut na wypowiedzenie się na wcześniej zdefiniowany przez siebie temat.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/meetups/meetups.png&quot; itemprop=&quot;image&quot; alt=&quot;Baner promujący artykuł&quot; /&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;czy-opłaca-się-chodzić-na-meetupy-kiedy-dopiero-zaczynam&quot;&gt;Czy opłaca się chodzić na meetupy, kiedy dopiero zaczynam?&lt;/h2&gt;

&lt;p&gt;OCZYWIŚCIE! To jest w sumie jedna z podstawowych rzeczy jakie powinieneś
zrobić kiedy jesteś na początku swojej kariery jako developer.&lt;/p&gt;

&lt;p&gt;Na takich spotkaniach jesteś w stanie poznać community danej technologi /
języka. Autorzy bibliotek - którzy pojawiają się często na meetupach - to
normalni ludzie, którym zrobi się miło kiedy zbijesz z nimi piątkę i
podziękujesz im za trud włożony pracy w stworzenie narzędzia Open Source.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/icons/coffee-cup.png&quot; alt=&quot;&quot; /&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;czy-muszę-chodzić-na-meetupy-gdy-już-pracuje-kilka-lat-w-branży&quot;&gt;Czy muszę chodzić na meetupy, gdy już pracuje kilka lat w branży?&lt;/h2&gt;

&lt;p&gt;Praca pracą, ale znajomi i starzy koledzy mają swoją ścieżkę kariery którą
warto poznać. Warto czasem wpaść na meetup i dowiedzieć się co tam u nich
słychać. Czy może się już przebranżowili i rzygają językiem który Was
połączył. &lt;em&gt;Matko, jak to brzmi…&lt;/em&gt;&lt;/p&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;h2 id=&quot;lista-10-powodów-dla-których-powinieneś-uczęszczać-na-meetupy&quot;&gt;Lista 10 powodów dla których powinieneś uczęszczać na meetupy&lt;/h2&gt;

&lt;h3 id=&quot;1-można-poznać-nowe-miejsca-w-mieście&quot;&gt;1. Można… poznać nowe miejsca w mieście&lt;/h3&gt;

&lt;p&gt;Spotkania organizowane są w różnych miejscach w mieście. Dlatego warto
uczęszczać na dowolne meetupy, aby je poznać. Bardzo często każde wydarzenie
jest organizowane w innym miejscu, tak aby wybrać najlepsze dla przychodzącej
publiczności.&lt;/p&gt;

&lt;h3 id=&quot;2-można-coś-zjeść-i-się-napić&quot;&gt;2. Można… coś zjeść i się napić&lt;/h3&gt;

&lt;p&gt;Wydarzenie nie może odbyć się bez sponsorów. To oni wykładają hajs, aby móc
ogłosić swoje oferty pracy. Tym samym firmy fundują catering, aby ludzie
mogli zostać dłużej i porozmawiać z potencjalnymi przyszłymi pracodawcami.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/icons/pizza.png&quot; alt=&quot;&quot; /&gt;
&lt;/figure&gt;

&lt;h3 id=&quot;3-można-poznać-ludzi-o-podobnym-zainteresowaniu&quot;&gt;3. Można… poznać ludzi o podobnym zainteresowaniu&lt;/h3&gt;

&lt;p&gt;Jak już wspomniałem na początku, na spotkania przychodzą ludzie, których
kręci to samo co Ciebie, dlatego jesteście obecni na tym samym wydarzeniu 😄&lt;/p&gt;

&lt;p&gt;To podobieństwo jest świetne z tego powodu że możesz porozmawiać z obcymi
ludzi o tym co i Ciebie interesuje. W domu z rodziną nie zawsze tak jest.&lt;/p&gt;

&lt;h3 id=&quot;4-można-coś-wygrać-np-bilet-na-konferencję&quot;&gt;4. Można… coś wygrać, np. bilet na konferencję&lt;/h3&gt;

&lt;p&gt;Aktywni uczestnicy spotkań mogą zyskać coś “materialnego” podczas takich
wydarzeń. Bardzo często na meetupach można coś wygrać. Jakąś zniżkę na
usługę albo produkt albo np. bilet na konferencję (pozdrowienia dla
&lt;a href=&quot;https://www.facebook.com/michal.zalecki&quot;&gt;Michała&lt;/a&gt;).&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/icons/giftbox.png&quot; alt=&quot;&quot; /&gt;
&lt;/figure&gt;

&lt;h3 id=&quot;5-można-pośmieszkować&quot;&gt;5. Można… “pośmieszkować”&lt;/h3&gt;

&lt;p&gt;Stare dobre przysłowie mówi, że:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Żarty informatyków są śmieszne tylko dla informatyków.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Zgadzam się.&lt;/strong&gt; Moja partnerka ni w ząb nie rozumie o co chodzi z tymi
domknięciami i “aroł fankszonami”. Niech tak będzie. Nie każdy musi się znać
na programowaniu.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/icons/joke.png&quot; alt=&quot;&quot; /&gt;
&lt;/figure&gt;

&lt;h3 id=&quot;6-można-nauczyć-się-czegoś-zdobyć-wiedzę&quot;&gt;6. Można… nauczyć się czegoś (zdobyć wiedzę)&lt;/h3&gt;

&lt;p&gt;Tematy prelekcji bardzo często poruszają nowości ze
świata danej dziedziny programistycznej. Ile to razy dowiedziałem się czegoś
nowego podczas meetupu i gdy przyszedłem do domu to wieczór poświęciłem na
zapoznanie się z tą nowinką.&lt;/p&gt;

&lt;p&gt;Nie tylko prelekcje uczą, ale i ludzie którzy uczęszczają na takie wydarzenie
w roli uczestników. Podczas rozmów kuluarowych (tj. po części oficjalnej)
wychodzi najwięcej istotnych rzeczy zw. z językiem albo technologią. Takie
smaczki, które są wynikiem czyjegoś wielogodzinnego zmagania się z tematem.&lt;/p&gt;

&lt;h3 id=&quot;7-można-poczuć-się-jak-wśród-swoich&quot;&gt;7. Można… poczuć się jak wśród swoich&lt;/h3&gt;

&lt;p&gt;Chyba coś mi się pomyliło… w sumie ten punkt można podciągnąć pod “poznanie
osób o podobnym zainteresowaniu”. Faux pas 😄&lt;/p&gt;

&lt;h3 id=&quot;8-można-znaleźć-pracodawcę&quot;&gt;8. Można… znaleźć pracodawcę&lt;/h3&gt;

&lt;p&gt;Sponsorzy spotkań szukają pracowników, dlatego jeśli chcesz odbyć rozmowę
rekrutacyjną nie umawiając się na nią, to śmiało wpadaj na meetupy gdzie
znajdziesz kierowników działów do których prowadzona jest rekrutacja.&lt;/p&gt;

&lt;p&gt;Bez wcześniejszych zapowiedzi możesz porozmawiać z kilkoma firmami i wybrać
tą która Ci pasuje. Podczas takich rozmów kuluarowych nie musisz się wcale
spinać. W końcu to nieformalna rozmowa przy lemoniadzie.&lt;/p&gt;

&lt;blockquote class=&quot;block-poor&quot;&gt;
  &lt;h3 id=&quot;-nie-lubię-stresu&quot;&gt;&lt;i class=&quot;icon-poor&quot;&gt;&lt;/i&gt; NIE LUBIĘ STRESU&lt;/h3&gt;
  &lt;p&gt;Osobiście strasznie nie lubię, kiedy podczas rekrutacji moi rozmówcy się
stresują. Ze swojego doświadczenia wiem, że często wtedy nie pokazuje się
faktycznie tego jacy jesteśmy &lt;abbr title=&quot;Pozdrowienia dla mojej pani nauczycielki języka polskiego&quot;&gt;fajni&lt;/abbr&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3 id=&quot;9-można-znaleźć-kolegę-do-projektu&quot;&gt;9. Można… znaleźć kolegę do projektu&lt;/h3&gt;

&lt;p&gt;Masz swój startup? Chcesz go rozwijać? Wpadaj na meetup i szukaj fanatyków
podobnych do Ciebie, którzy pomogą Ci w zarabianiu kasy.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/icons/human-resources.png&quot; alt=&quot;&quot; /&gt;
&lt;/figure&gt;

&lt;h3 id=&quot;10-można-pokazać-swoją-wiedzę-jako-prelegent&quot;&gt;10. Można… pokazać swoją wiedzę jako prelegent&lt;/h3&gt;

&lt;p&gt;Bycie prelegentem to świetna rola. Co prawda musisz przygotować się do takiej
roli. Bardzo często potrzebujesz kilkadziesiąt godzin przed prelekcją aby
stworzyć super slajdy, które odwzorują to, co masz do przekazania publiczności
w sposób jasny i przejrzysty.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/icons/teacher-question-to-the-class.png&quot; alt=&quot;&quot; /&gt;
&lt;/figure&gt;

&lt;h3 id=&quot;-11-bonus&quot;&gt;* 11. BONUS&lt;/h3&gt;

&lt;p&gt;Jako bonus sprzedam Wam jeszcze jeden argument. Podczas meetupów można
znaleźć swoją drugą połówkę - swoją towarzyszkę albo towarzysza życia.&lt;/p&gt;

&lt;p&gt;To niesamowite, ile argumentów przemawia, za tym, aby udać się na meetup.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Wybierz się i Ty.&lt;/strong&gt; Na dowolny meetup, albo na taki, który spotyka się z
Twoimi zainteresowaniami. Na portalu &lt;a href=&quot;https://meetup.com/&quot;&gt;Meetup.com&lt;/a&gt; jest ogromnie długa lista
organizacji, które tworzą meetupy.&lt;/p&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;h2 id=&quot;śledztwo-trwa&quot;&gt;Śledztwo trwa!&lt;/h2&gt;

&lt;p&gt;Podczas twitterowej rozmowy z moim przyjacielem Tomkiem, uświadomiłem sobie,
że lista argumentów “za” jest o wiele większa. Dziękuję &lt;a href=&quot;https://twitter.com/Koori_&quot;&gt;@Koori_&lt;/a&gt;.&lt;/p&gt;

&lt;figure class=&quot;social-center-block&quot;&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;pl&quot; dir=&quot;ltr&quot;&gt;Piwo, nowi znajomi, starzy znajomi, nowe horyzonty, podróżowanie, kobiety 😍, ciekawe pomysły, dziwne zdarzenia poczucie samozajebistosci 🤘&lt;/p&gt;&amp;mdash; Tomasz Marciszewski (@Koori_) &lt;a href=&quot;https://twitter.com/Koori_/status/869219315052154880?ref_src=twsrc%5Etfw&quot;&gt;May 29, 2017&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async=&quot;&quot; src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;

&lt;/figure&gt;

&lt;!-- Resources --&gt;

</description>
            <pubDate>Mon, 29 May 2017 19:46:06 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2017/05/29/10-powodow-dla-ktorych-warto-chodzic-na-meetup-y.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2017/05/29/10-powodow-dla-ktorych-warto-chodzic-na-meetup-y.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/meetups/meetups.png</image>
        </item>
        
        <item>
            <title>WarsawJS Meetup #31</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Rozpoczynamy kolejną dziesiątkę spotkań dla programistów języka JavaScript.
Tym razem mieliśmy 2 prelekcje o React + Redux a trzecim tematem były
mikroserwisy. Zapraszam do zapoznania się z moimi przemyśleniami na temat
prelekcji i całego wydarzenia.&lt;/p&gt;

&lt;!-- &lt;figure&gt;
    &lt;a href=&quot;https://www.meetup.com/WarsawJS/&quot;&gt;
        &lt;img src=&quot;/assets/images/posts/post-banner-warsawjs.jpg&quot;
             alt=&quot;WarsawJS&quot;/&gt;
    &lt;/a&gt;
&lt;/figure&gt; --&gt;

&lt;h2 id=&quot;invitation&quot;&gt;Invitation&lt;/h2&gt;

&lt;p&gt;Tym razem nagrywaliśmy zapowiedź w miejscu, gdzie przeprowadzaliśmy warsztaty.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;h3 id=&quot;informacja&quot;&gt;Informacja&lt;/h3&gt;
  &lt;p&gt;Przypominam, że organizacja WarsawJS od grudnia 2016 uruchomiła nową
inicjatywę, tj. &lt;strong&gt;WarsawJS Workshop&lt;/strong&gt;, czyli comiesięczne szkolenia
praktyczne z języka JavaScript (wliczając biblioteki i frameworki).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Niestety, nie byłem w najlepszej kondycji psychofizycznej tego dnia i zabrakło
mnie na filmie. Zamiast mnie pojawiła się prelegentka - Martyna, która była
trzecią dziewczyną speakerką na warszawskiej scenie.&lt;/p&gt;

&lt;p&gt;Zapraszam w imieniu organizatorów WarsawJS.&lt;/p&gt;

&lt;div class=&quot;youtube-lazy&quot; data-youtube-id=&quot;tKICme9UEno&quot;&gt;&lt;/div&gt;

&lt;p&gt;Po obejrzeniu zapowiedzi, zapraszam Cię do zapoznania się z moimi
przemyśleniami na temat prelekcji, które miały miejsce podczas tego wydarzenia.&lt;/p&gt;

&lt;p class=&quot;chapter-break&quot;&gt;&amp;bull;&lt;/p&gt;

&lt;h2 id=&quot;talk-1-react-na-start---informacje-w-pigułce-dla-zainteresowanych-rozpoczęciem-zabawy-z-reactjs-pl-martyna-nowocień&quot;&gt;Talk #1: React na start - informacje w pigułce dla zainteresowanych rozpoczęciem zabawy z ReactJS [PL] &lt;small&gt;Martyna Nowocień&lt;/small&gt;&lt;/h2&gt;

&lt;p&gt;Prelekcja była skierowana dla osób, które chcą rozpocząć naukę biblioteki
React.js. Martyna przekazała kilka wskazówek:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;nie używać biblioteki jQuery w projektach react-owych&lt;/strong&gt;&lt;/p&gt;

    &lt;blockquote&gt;
      &lt;p&gt;Ma to sens, ponieważ to React.js jest warstwą, która ogarnia View w
architekturze MVC.&lt;/p&gt;
    &lt;/blockquote&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;dla początkujących developerów &lt;strong&gt;lepszym wyborem będzie nauka prostej
  biblioteki jaką jest React.js a nie kobyły jakim jest Angular&lt;/strong&gt;&lt;/p&gt;

    &lt;blockquote&gt;
      &lt;p&gt;&lt;strong&gt;Tutaj ciężko mi się zgodzić&lt;/strong&gt;. To wszystko uzależnione jest od tego w
jaki sposób osoba się uczy. Jeśli np. początkujący developer posiadałby
mentora, który wytłumaczyłby Angulara to nie ma znaczenia, że jest to
ogromny framework.&lt;/p&gt;
    &lt;/blockquote&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Angular (v4.x) jest szybszy od React.js zwłaszcza na urządzeniach mobilnych,
ale Angular.js (v1.x) już jest wolniejszy podczas renderowania dużej ilości
elementów.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Więcej ofert pracy jest na developerów ze znajomością Angulara niż
React.js&lt;/strong&gt;&lt;br /&gt;Martyna podkreśliła, że około 2 / 3 wszystkich ofert to Angular.&lt;/p&gt;

&lt;p&gt;Aby dowiedzieć się najnowszych rzeczach warto obserwować &lt;a href=&quot;https://twitter.com/dan_abramov&quot;&gt;profil twitterowy Dana
Abramova&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Prelegentka poleca &lt;a href=&quot;https://code-cartoons.com/a-cartoon-intro-to-redux-3afb775501a6&quot;&gt;Code Cartoon&lt;/a&gt;, w celu zapoznania się z architekturą
&lt;strong&gt;Reacta i Reduxa&lt;/strong&gt;.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;h3 id=&quot;moim-zdaniem&quot;&gt;Moim zdaniem&lt;/h3&gt;
  &lt;p&gt;Świetna prelekcja. Oby częściej zdarzały się takie z uśmiechem na twarzy
speakera!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
  &lt;li&gt;Link do prelekcji: &lt;a href=&quot;https://www.youtube.com/watch?v=-WDh7l58TVg&quot;&gt;youtube.com/watch?v=-WDh7l58TVg&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Kontakt do prelegenta: &lt;a href=&quot;https://twitter.com/Geekchick_Marty&quot;&gt;@Geekchick_Marty&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;h2 id=&quot;talk-2-redux---a-practical-example-en-illarion-koperski&quot;&gt;Talk #2: Redux - a practical example [EN] &lt;small&gt;Illarion Koperski&lt;/small&gt;&lt;/h2&gt;

&lt;p&gt;Zalecenia wynikające z prelekcji&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Nie istnieje domyślna konfiguracja dla Reduxa.&lt;/li&gt;
  &lt;li&gt;Wykorzystać Immutable.js.&lt;/li&gt;
  &lt;li&gt;Użyć propozycji rozwiązań zdefiniowanych w &lt;a href=&quot;https://github.com/erikras/ducks-modular-redux&quot;&gt;Ducks&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
  &lt;p&gt;Prelekcja niezrozumiała dla developerów bez doświadczenia. Jeśli jednak
posiadasz minimalne obycie z Reduxem to idealnie wpasowujesz się w
target prelekcji.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Illarion polecał rozszerzenie do przeglądarki Google Chrome - &lt;a href=&quot;http://extension.remotedev.io/&quot;&gt;Redux
DevTools&lt;/a&gt;.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Redux + RsJS = Epics&lt;br /&gt;
&lt;strong&gt;Don’t use Sagas, use Epics.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
  &lt;li&gt;Link do prelekcji: &lt;a href=&quot;https://www.youtube.com/watch?v=QmI-zH8pi5M&quot;&gt;youtube.com/watch?v=QmI-zH8pi5M&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Kontakt do prelegenta: &lt;a href=&quot;https://twitter.com/illarionvk&quot;&gt;@illarionvk&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;h2 id=&quot;talk-3-microservices-on-the-frontend-en-tomasz-wiszniewski&quot;&gt;Talk #3: Microservices on the frontend [EN] &lt;small&gt;Tomasz Wiszniewski&lt;/small&gt;&lt;/h2&gt;

&lt;p&gt;Tomasz przedstawił aplikację &lt;a href=&quot;https://present.now.sh/&quot;&gt;present.now.sh&lt;/a&gt;, która jest zegarkiem
odmierzającym czas. W miarę upływu czasu kolor tła się aktualizuje.&lt;/p&gt;

&lt;p&gt;Aplikacja jest napisana z wykorzystaniem WebComponent-ów.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Link do prelekcji: &lt;a href=&quot;https://www.youtube.com/watch?v=u53ov_Jm4uo&quot;&gt;youtube.com/watch?v=u53ov_Jm4uo&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Kontakt do prelegenta: &lt;a href=&quot;https://twitter.com/thetomekwi&quot;&gt;@thetomekwi&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;h2 id=&quot;sponsorzy-spotkania&quot;&gt;Sponsorzy spotkania&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.facebook.com/10Clouds/&quot;&gt;10Clouds&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.facebook.com/artificialio/&quot;&gt;Artificial Labs&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.facebook.com/cyfrowypolsat/&quot;&gt;Cyfrowy Polsat&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.facebook.com/Daftcode/&quot;&gt;DaftCode&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.facebook.com/elpassion/&quot;&gt;EL Passion&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.facebook.com/softwarely/&quot;&gt;Softwarely&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;!-- Resources --&gt;

</description>
            <pubDate>Sat, 27 May 2017 17:28:39 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2017/05/27/warsawjs-meetup-31.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2017/05/27/warsawjs-meetup-31.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/post-banner-warsawjs.jpg</image>
        </item>
        
        <item>
            <title>Konferencja: Code Europe 2017</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;&lt;strong&gt;Sezon na konferencje czas rozpocząć!&lt;/strong&gt; Chciałem Ci dziś przedstawić moje
wrażenia z pierwszej (w tym roku) konferencji w której uczestniczyłem.&lt;/p&gt;

&lt;p&gt;Mowa tutaj o konferencji wymienionej w tytule, czyli &lt;a href=&quot;https://www.codeeurope.pl/pl&quot;&gt;Code Europe&lt;/a&gt; ‘17.
&lt;strong&gt;Na początku zaznaczę, że post nie jest sponsorowany&lt;/strong&gt;, aby nie było
wątpliwości. Na blogu przekazuję moją i tylko moją opinię.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/conference-code-europe-2017/code-europe-logo-2017.jpg&quot; itemprop=&quot;image&quot; alt=&quot;Baner promujący artykuł&quot; /&gt;
    &lt;figcaption&gt;
        Oficjalne logo konferencji &lt;a href=&quot;https://www.codeeurope.pl/pl&quot;&gt;Code Europe 2017&lt;/a&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Z różnych źródeł dowiedziałem się, że konferencja miała miejsce już w tym roku
w dwóch innych miastach: Kraków (26 kwietnia, ICE Kraków) i Wrocław (23 maja,
Hala Stulecia).&lt;/p&gt;

&lt;p&gt;Konferencja Code Europe, ma swoją drugą edycję, tzw. wiosenną. W zeszłym roku
odbyła się pierwsza edycja. I była to edycja jesienna.&lt;/p&gt;

&lt;figure class=&quot;social-center-block&quot;&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;und&quot; dir=&quot;ltr&quot;&gt;Yo &lt;a href=&quot;https://twitter.com/hashtag/codeEurope?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#codeEurope&lt;/a&gt; 🤓 &lt;a href=&quot;https://t.co/x0xaIitM6W&quot;&gt;pic.twitter.com/x0xaIitM6W&lt;/a&gt;&lt;/p&gt;&amp;mdash; Piotr Kowalski (@piecioshka) &lt;a href=&quot;https://twitter.com/piecioshka/status/867634856666300416?ref_src=twsrc%5Etfw&quot;&gt;May 25, 2017&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async=&quot;&quot; src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;

&lt;/figure&gt;

&lt;h2 id=&quot;prelekcje-na-których-byłem-obecny&quot;&gt;Prelekcje na których byłem obecny&lt;/h2&gt;

&lt;p&gt;Jak każda konferencja i ta chwali się, że posiada NAJLEPSZYCH prelegentów
i że jest NAJWIĘKSZA i w ogóle “the best”. Oczywiście, nie są to cechy w
żaden sposób mierzalne, więc każda posiada prawo aby tak pisać 😄&lt;/p&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;p&gt;Poniżej przedstawiam Ci moje komentarze w sprawie co poniektórych prelekcji
na których dane mi było uczestniczyć. Ogólnie podczas jednego dnia prelekcji
odbyło się prawie 50 prezentacji.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Jak rozwiązać tak dużą liczbę speech-y w tak krótkim czasie? Zrównoleglenie.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Tutaj pojawia się problem, bo co jeśli pochodzisz z takiego środowiska,
że interesują Cię &amp;gt;2 prelekcje, a Ty możesz być obecny tylko na jednej?&lt;/p&gt;

&lt;h3 id=&quot;1-going-offline-with-append-only-logs-en-mathias-buus&quot;&gt;1. Going offline with append-only logs [EN] &lt;small&gt;Mathias Buus&lt;/small&gt;&lt;/h3&gt;

&lt;p&gt;Pierwsza prelekcja. Byłem spóźniony i niewiele zrozumiałem. Przepraszam!&lt;/p&gt;

&lt;h3 id=&quot;2-programming-healthcare-well-en-harold-thimbleby&quot;&gt;2. Programming healthcare well [EN] &lt;small&gt;Harold Thimbleby&lt;/small&gt;&lt;/h3&gt;

&lt;p&gt;Prelekcja, która nie podnosiła na duchu. Podczas niej dowiedziałem się,
że bardzo często przyczyną śmierci pacjentów są bugi w oprogramowaniu
zainstalowanym na specjalistycznych urządzeniach medycznych.&lt;/p&gt;

&lt;p&gt;Bardzo często winą za te bugi obarczane są pielęgniarki.
Znany jest przypadek, kiedy pielęgniarka została wyrzucona z pracy z powodu
śmierci pacjenta. Nie wytrzymała takiego napięcia i popełniła samobójstwo.&lt;/p&gt;

&lt;p&gt;Smutne.&lt;/p&gt;

&lt;h3 id=&quot;3-ramda-js---first-step-pl-karol-rogowski&quot;&gt;3. Ramda JS - First Step [PL] &lt;small&gt;Karol Rogowski&lt;/small&gt;&lt;/h3&gt;

&lt;p&gt;Karol opowiadał o programowaniu funkcyjnym na prostych przykładach, gdzie
taki styl programowania ma jakiś sens.&lt;/p&gt;

&lt;p&gt;Sam język JavaScript idealnie nadaje się do pisania w stylu funkcyjnym, ze
względu na występowanie tzw. domknięć. Co to jest domknięcie? O tym będzie
osobny wpis na blogu. Kiedy? za kilka tygodni.&lt;/p&gt;

&lt;p&gt;Prelegent wykorzystywał bibliotekę “ramba” do tego, aby móc składać funkcje w
prosty sposób, aby zachwycić publikę.&lt;/p&gt;

&lt;figure class=&quot;social-center-block&quot;&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;pl&quot; dir=&quot;ltr&quot;&gt;Programowanie funkcyjne by &lt;a href=&quot;https://twitter.com/KarolRogowski?ref_src=twsrc%5Etfw&quot;&gt;@KarolRogowski&lt;/a&gt; a to wszystko na &lt;a href=&quot;https://twitter.com/hashtag/codeEurope?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#codeEurope&lt;/a&gt; &lt;a href=&quot;https://t.co/oVK1YC4joD&quot;&gt;pic.twitter.com/oVK1YC4joD&lt;/a&gt;&lt;/p&gt;&amp;mdash; Piotr Kowalski (@piecioshka) &lt;a href=&quot;https://twitter.com/piecioshka/status/867677090614833156?ref_src=twsrc%5Etfw&quot;&gt;May 25, 2017&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async=&quot;&quot; src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;

&lt;/figure&gt;

&lt;h3 id=&quot;4-the-things-git-can-do-that-none-of-the-guis-have-ever-told-you-about-en-enrico-campidoglio&quot;&gt;4. The Things Git Can Do (that none of the GUIs have ever told you about) [EN] &lt;small&gt;Enrico Campidoglio&lt;/small&gt;&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Uwielbiam Gita&lt;/strong&gt; ❤️ Napisałem już o nim kilka artykułów. Moją
pierwszą w życiu wygłoszoną prelekcją był speech o tym właśnie narzędziu.&lt;/p&gt;

&lt;p&gt;Enrico pokazał niskopoziomowe polecenia jakie występują w Gicie. Świetna
prelekcja!&lt;/p&gt;

&lt;h3 id=&quot;5-introduction-to-frontendless-ui-as-a-service-pl-tomasz-skowroński&quot;&gt;5. Introduction to frontendless: UI as a service [PL] &lt;small&gt;Tomasz Skowroński&lt;/small&gt;&lt;/h3&gt;

&lt;p&gt;Tomasz, nasz warszawski speaker, który na podstawie komunikatora Slack
opowiadał o plusach i minusach rozwiązań wypracowanych w tym komunikatorze.&lt;/p&gt;

&lt;p&gt;Bardzo konkretna prelekcja. Samo mięcho. IYKWIM.&lt;/p&gt;

&lt;h3 id=&quot;6-pwassembleinstant-and-customized-progressive-web-app-demos-because-only-seeing-is-believing-en-thomas-steiner&quot;&gt;6. PWAssemble—Instant and Customized Progressive Web App Demos, Because Only Seeing is Believing [EN] &lt;small&gt;Thomas Steiner&lt;/small&gt;&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Jedna z moich ulubionych prelekcji&lt;/strong&gt; na tegorocznej edycji Code Europe,
była o Progressive Web App.&lt;/p&gt;

&lt;p&gt;Tematyka dla mnie dość mocno znana. Opisywałem na swoim blogu moją przygodę
związaną z PWA. Artykuł dostępny &lt;a href=&quot;/blog/2017/05/07/jak-przerobic-strone-na-pwa.html&quot;&gt;tutaj&lt;/a&gt;.&lt;/p&gt;

&lt;figure class=&quot;social-center-block&quot;&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;Thanks &lt;a href=&quot;https://twitter.com/tomayac?ref_src=twsrc%5Etfw&quot;&gt;@tomayac&lt;/a&gt; for great talk about &lt;a href=&quot;https://twitter.com/hashtag/pwa?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#pwa&lt;/a&gt; Try read my blog post (in polish) about PWA &lt;a href=&quot;https://t.co/E1FEdIzPOI&quot;&gt;https://t.co/E1FEdIzPOI&lt;/a&gt; 🤽‍♂️ &lt;a href=&quot;https://t.co/swHhVf5tuB&quot;&gt;pic.twitter.com/swHhVf5tuB&lt;/a&gt;&lt;/p&gt;&amp;mdash; Piotr Kowalski (@piecioshka) &lt;a href=&quot;https://twitter.com/piecioshka/status/867763228427907072?ref_src=twsrc%5Etfw&quot;&gt;May 25, 2017&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async=&quot;&quot; src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;

&lt;/figure&gt;

&lt;p&gt;Chciałem pomóc zwiększyć font, a okazało się że niektórzy mnie nagrywają.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Człowiek w dzisiejszych czasach, nie może komuś pomóc, bo już zostanie
nagrany. Dzięki &lt;a href=&quot;https://twitter.com/ckyambitny&quot;&gt;@ckyambitny&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;figure class=&quot;social-center-block&quot;&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;&lt;a href=&quot;https://twitter.com/piecioshka?ref_src=twsrc%5Etfw&quot;&gt;@piecioshka&lt;/a&gt; always find a way to get on the stage &lt;a href=&quot;https://twitter.com/hashtag/codeEurope?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#codeEurope&lt;/a&gt; &lt;a href=&quot;https://t.co/KMWDCHdSuo&quot;&gt;pic.twitter.com/KMWDCHdSuo&lt;/a&gt;&lt;/p&gt;&amp;mdash; Bartłomiej Sobczuk (@ckyambitny) &lt;a href=&quot;https://twitter.com/ckyambitny/status/867756675821862912?ref_src=twsrc%5Etfw&quot;&gt;May 25, 2017&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async=&quot;&quot; src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;

&lt;/figure&gt;

&lt;h3 id=&quot;7-design-systems-engineering-scaling-user-interfaces-en-christoph-reinartz&quot;&gt;7. Design Systems Engineering: Scaling User Interfaces [EN] &lt;small&gt;Christoph Reinartz&lt;/small&gt;&lt;/h3&gt;

&lt;p&gt;Bardzo interesująca prelekcja na temat strony internetowej TRIVAGO. Kris
opisywał kroki jakie jego zespół wykonał, do tego, aby wyjść z roku 2000 do 2017.&lt;/p&gt;

&lt;h2 id=&quot;podsumowanie&quot;&gt;Podsumowanie&lt;/h2&gt;

&lt;p&gt;Jak zawsze jestem pozytywnie nastawiony do wszelkiego rodzaju wydarzeń,
podczas których mogę poszerzyć swoją wiedzę o front-endzie oraz móc porozmawiać
z innymi fanatykami języka JS.&lt;/p&gt;

&lt;p&gt;Podczas konferencji ekipa WarsawJS wysłała swojego przedstawiciela, aby
godnie reprezentował organizację.&lt;/p&gt;

&lt;figure class=&quot;social-center-block&quot;&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;und&quot; dir=&quot;ltr&quot;&gt;Ekipa &lt;a href=&quot;https://twitter.com/hashtag/warsawjs?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#warsawjs&lt;/a&gt; obecna na &lt;a href=&quot;https://twitter.com/hashtag/codeEurope?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#codeEurope&lt;/a&gt; 🚀 &lt;a href=&quot;https://t.co/SgsQyNhNxd&quot;&gt;pic.twitter.com/SgsQyNhNxd&lt;/a&gt;&lt;/p&gt;&amp;mdash; WarsawJS (@warsawjs) &lt;a href=&quot;https://twitter.com/warsawjs/status/867748088512905217?ref_src=twsrc%5Etfw&quot;&gt;May 25, 2017&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async=&quot;&quot; src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;

&lt;/figure&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;h2 id=&quot;after&quot;&gt;After&lt;/h2&gt;

&lt;p&gt;Przyjęło się, że po konferencji organizowany jest “after”. Dla tych, którzy nie
wiedzą co to jest, to mówię, że to takie nieformalne spotkanie przy
“lemoniadzie” już poza venue konferencyjnym, tylko gdzieś indziej, gdzie będą
odpowiednie warunki do biesiadowania.&lt;/p&gt;

&lt;p&gt;Ten “after” był dla mnie pod pewnym względem niesamowity. Poznałem na żywo
legendę polskiej sceny blogerskiej - &lt;a href=&quot;https://twitter.com/sunpietro&quot;&gt;Piotra Nalepę&lt;/a&gt;, który przyjechał
z Katowic do stolicy na konferencję &lt;a href=&quot;https://2017.front-trends.com/&quot;&gt;FrontTrends 2017&lt;/a&gt; - odbywała się ona
w tym samym czasie co omawiana dziś przeze mnie “Code Europe 2017”.&lt;/p&gt;

&lt;!-- Resources --&gt;

</description>
            <pubDate>Thu, 25 May 2017 21:55:47 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2017/05/25/konferencja-code-europe-2017.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2017/05/25/konferencja-code-europe-2017.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/conference-code-europe-2017/code-europe-logo-2017.jpg</image>
        </item>
        
        <item>
            <title>Zobacz, jak "overflow-wrap" może Cię uratować!</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Tekst wychodzi poza kontener? Nie martw się. Jest na to lekarstwo. Znajduje się
ono w apteczce w napisem “CSS3”. Poznajmy dziś czym jest &lt;code class=&quot;highlighter-rouge&quot;&gt;overflow-wrap&lt;/code&gt;.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Kiedyś (w CSS2) reguła ta nazywała się &lt;code class=&quot;highlighter-rouge&quot;&gt;word-wrap&lt;/code&gt;, jednak przyszły czasy
nowej specyfikacji i powstał pomysł zmiany nazwy. Czy słusznie?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/post-banner-css-overflow-wrap.png&quot; itemprop=&quot;image&quot; alt=&quot;Baner promujący artykuł&quot; /&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;jak-działa-reguła-overflow-wrap&quot;&gt;Jak działa reguła “overflow-wrap”?&lt;/h2&gt;

&lt;p&gt;Najlepiej będzie jak sam zobaczysz.&lt;/p&gt;

&lt;p data-embed-version=&quot;2&quot; data-height=&quot;300&quot; data-preview=&quot;true&quot; data-theme-id=&quot;11473&quot; data-default-tab=&quot;result&quot; data-theme=&quot;11473&quot; data-user=&quot;impressivewebs&quot; data-slug-hash=&quot;ZLBvav&quot; class=&quot;codepen&quot;&gt;See the &lt;a href=&quot;https://codepen.io/impressivewebs/pen/ZLBvav/&quot;&gt;pen&lt;/a&gt; on &lt;a href=&quot;//codepen.io&quot;&gt;CodePen&lt;/a&gt;.&lt;/p&gt;
&lt;script async=&quot;&quot; src=&quot;https://production-assets.codepen.io/assets/embed/ei.js&quot;&gt;&lt;/script&gt;

&lt;h2 id=&quot;jakie-są-jej-możliwości&quot;&gt;Jakie są jej możliwości?&lt;/h2&gt;

&lt;p&gt;Występują dwie opcje:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;zwykła prezentacja liter, znak po znaku, wiersz zostanie złamany po
  wystąpieniu białego znaku&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;language-css highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;SELECTOR&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;nl&quot;&gt;overflow-wrap&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;normal&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;c&quot;&gt;/* domyślnie */&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;ul&gt;
  &lt;li&gt;łamanie wiersza przed znakiem, który miałby być wyświetlony poza kontenerem&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;language-css highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;SELECTOR&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;nl&quot;&gt;overflow-wrap&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;break-word&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Więcej do przeczytania na &lt;a href=&quot;http://cssreference.io/property/overflow-wrap/&quot;&gt;stronie&lt;/a&gt;.&lt;/p&gt;

&lt;blockquote class=&quot;block-good&quot;&gt;
  &lt;h3 id=&quot;-wskazówka&quot;&gt;&lt;i class=&quot;icon-good&quot;&gt;&lt;/i&gt; Wskazówka&lt;/h3&gt;
  &lt;p&gt;Opisywaną regułę świetnie używa się z inną, tj. z &lt;code class=&quot;highlighter-rouge&quot;&gt;hyphens: auto;&lt;/code&gt;, która
troszczy się o to, aby po zawinięciu wiersza dostawić znak myślnika,
oznaczającego przeniesienie wyrazu. Efekt, którego zostaliśmy nauczeni
w podstawówce jest zrealizowany!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id=&quot;czy-mogę-używać&quot;&gt;Czy mogę używać?&lt;/h2&gt;

&lt;p&gt;Wsparcie jest szerokie. Można powiedzieć, że każda przeglądarka wspiera
łamanie wiersza, bo jeśli nie działa &lt;code class=&quot;highlighter-rouge&quot;&gt;overflow-wrap: break-word&lt;/code&gt; (może używamy
wersji przeglądarki z poprzedniej epoki), to zawsze możemy użyć
&lt;code class=&quot;highlighter-rouge&quot;&gt;word-wrap: break-word&lt;/code&gt; i uniknąć ewentualnych nieprzyjemności.&lt;/p&gt;

&lt;p&gt;Na potwierdzenie wkleję tutaj oryginalny tekst ze &lt;a href=&quot;https://drafts.csswg.org/css-text-3/#propdef-overflow-wrap&quot;&gt;specyfikacji&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;For legacy reasons, UAs must treat word-wrap as an alternate name for the
overflow-wrap property, as if it were a shorthand of overflow-wrap.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id=&quot;specyfikacja&quot;&gt;Specyfikacja&lt;/h2&gt;

&lt;p&gt;Jeśli chciałbyś poczytać specyfikację tej reguły, to jest ona opisana w
standardzie CSS3. Btw. wiesz, że to ostatnia wersja CSS?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Nie będzie CSS4.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Konsorcjum W3C przyjęło zasadę, że feature-y w CSS będą rozwijały się
samodzielnie. Tym samym, nie powstanie nowa wersja CSS, która mogłaby je
agregować.&lt;/p&gt;

&lt;p&gt;W sumie to ciekawy zabieg. Interesujące jest to, że ścieżka rozwoju CSS jest
taka jak przed chwilą opisałem, a ścieżka rozwoju JavaScript taka, że co roku
musi powstać nowa wersja.&lt;/p&gt;

&lt;p&gt;Ciekawe co z HTMLem? 😄 (Na te pytanie odpowiedział Commander
&lt;a href=&quot;http://disq.us/p/1ixrp7f&quot;&gt;w komentarzu&lt;/a&gt; pod tym artykułem. Thanks man!)&lt;/p&gt;

&lt;h2 id=&quot;performance&quot;&gt;Performance&lt;/h2&gt;

&lt;p&gt;Jeśli martwisz się wydajnością, bo może chcesz ustawić tą regułę w locie, to
masz problem. Generuje ona wszystkie 3 zachowania:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Layout&lt;/li&gt;
  &lt;li&gt;Paint&lt;/li&gt;
  &lt;li&gt;Composite&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Więcej na ten temat na stronie &lt;a href=&quot;https://csstriggers.com/word-wrap&quot;&gt;CSS Triggers&lt;/a&gt; autorstwa &lt;a href=&quot;https://twitter.com/aerotwist&quot;&gt;Paula Lewisa&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;historia&quot;&gt;Historia&lt;/h2&gt;

&lt;p&gt;Tym razem odpuszczam historię na temat tej reguły. Jednak, jeśli jesteś
zainteresowany to zapraszam na &lt;a href=&quot;https://css-tricks.com/almanac/properties/o/overflow-wrap/&quot;&gt;tą stronę&lt;/a&gt;, gdzie możesz poczytać na ten
temat.&lt;/p&gt;

&lt;!-- Resources --&gt;

</description>
            <pubDate>Tue, 23 May 2017 21:57:49 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2017/05/23/zobacz-jak-overflow-wrap-moze-cie-uratowac.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2017/05/23/zobacz-jak-overflow-wrap-moze-cie-uratowac.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/post-banner-css-overflow-wrap.png</image>
        </item>
        
        <item>
            <title>Jak wyświetlić liczbę osób lajkujących nasz fanpage?</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Dziś, podczas &lt;a href=&quot;https://www.meetup.com/WarsawJS/events/239670280/&quot;&gt;kolejnych warsztatów z programowania w JavaScript&lt;/a&gt;
organizacji &lt;strong&gt;WarsawJS&lt;/strong&gt;, wpadłem na pomysł, aby wyświetlać podczas
całego dnia liczbę lajków, którymi obdarzony jest profil organizacji WarsawJS.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Obecnie jest &lt;strong&gt;blisko okrągłej liczby 1500 lajków&lt;/strong&gt;. Może podczas warsztatów
magiczna liczba zostanie przekroczona?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/facebook/display-likes-of-warsawjs-fanpage.gif&quot; alt=&quot;1493, 1494, 1495, 1496, 1497&quot; /&gt;
&lt;/figure&gt;

&lt;p&gt;Moim zdaniem &lt;strong&gt;pomysł jest interesujący&lt;/strong&gt;. Jeśli chcesz się dowiedzieć jak
poszła mi implementacja takiego aplikacji, to zapraszam do lektury.&lt;/p&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;h2 id=&quot;misja&quot;&gt;Misja&lt;/h2&gt;

&lt;p&gt;Cel był prosty:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Zaprezentować w formie dynamicznej liczbę lajków fanpage-a WarsawJS&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Dodam, że aby zrealizować takie zadanie, trzeba być administratorem
fanpage-a, bo inaczej nie zna się parametru &lt;code class=&quot;highlighter-rouge&quot;&gt;appId&lt;/code&gt; oraz &lt;code class=&quot;highlighter-rouge&quot;&gt;appSecret&lt;/code&gt;.&lt;/p&gt;

&lt;h2 id=&quot;co-musiałem-zrobić-aby-osiągnąć-cel&quot;&gt;Co musiałem zrobić, aby osiągnąć cel?&lt;/h2&gt;

&lt;ul class=&quot;flos&quot;&gt;
  &lt;li&gt;
    &lt;h3 id=&quot;1-facebook-dla-programistów&quot;&gt;1. Facebook dla programistów&lt;/h3&gt;

    &lt;p&gt;Wpisałem jakieś programistyczne frazy do Google-a, aby podpowiedział
  jak mam osiągnąć cel. Wyszukiwarka nakierowała mnie na stronę
  &lt;a href=&quot;http://developers.google.com&quot;&gt;developers.google.com&lt;/a&gt;.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;h3 id=&quot;2-zignorowanie-dokumentacji&quot;&gt;2. Zignorowanie dokumentacji&lt;/h3&gt;

    &lt;p&gt;Zaznaczam, że olałem &lt;strong&gt;Getting Started&lt;/strong&gt;, tylko szukałem
  jakiegoś kodu, bo szkoda mi było inwestować więcej czasu na ten “szybki” i
  “prosty projekt”.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;h3 id=&quot;3-stworzenie-aplikacji-na-facebook-u&quot;&gt;3. Stworzenie aplikacji na Facebook-u&lt;/h3&gt;

    &lt;p&gt;Przeczytałem pobieżnie kilka artykułów. Na wszystkich było napisane, że
  pierwsze co musisz zrobić to stworzyć aplikację fejsbukową. Stworzyłem
  więc taką. Oczywiście nazwa nie ma żadnego znaczenia.&lt;/p&gt;

    &lt;figure&gt;
      &lt;img src=&quot;/assets/images/posts/facebook/create-new-app-button.jpg&quot; alt=&quot;Menu do zakładania aplikacji&quot; /&gt;
      &lt;figcaption&gt;
          Na stronie developers.google.com, klikasz w prawy górny róg.
      &lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;h3 id=&quot;4-credentiale&quot;&gt;4. Credentiale&lt;/h3&gt;

    &lt;p&gt;Po rejestracji aplikacji, w głównym panelu aplikacji jesteś w stanie
  dostrzec następujących parametrów:&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;App ID&lt;/code&gt;&lt;/li&gt;
      &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;App Secret&lt;/code&gt;&lt;/li&gt;
    &lt;/ul&gt;

    &lt;figure&gt;
      &lt;img src=&quot;/assets/images/posts/facebook/create-new-app-id.jpg&quot; alt=&quot;Formularz rejestracji aplikacji&quot; /&gt;
      &lt;figcaption&gt;
          Aby uzyskać App ID, musisz wpisać nazwę aplikacji.
      &lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;h3 id=&quot;5-osadzenie-kodu-fejsbukowego&quot;&gt;5. Osadzenie kodu fejsbukowego&lt;/h3&gt;

    &lt;p&gt;W projekcie, gdzie chcesz zaprezentować liczbę lajków, bo osadź na
  początku kod Facebook-owy. Stwórz plik: &lt;code class=&quot;highlighter-rouge&quot;&gt;facebook-setup.js&lt;/code&gt;:&lt;/p&gt;

    &lt;blockquote&gt;
      &lt;p&gt;W sekcji poniżej jest ciekawostka zw. z osadzeniem.&lt;/p&gt;
    &lt;/blockquote&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;js&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;fjs&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;getElementsByTagName&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;];&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;getElementById&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;))&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;js&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;createElement&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;js&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;id&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;js&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;src&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;//connect.facebook.net/en_US/sdk.js&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;// js.src = &quot;//connect.facebook.net/en_US/sdk/debug.js&quot;;&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;fjs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;parentNode&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;insertBefore&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;js&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;fjs&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;document&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'script'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'facebook-jssdk'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;ul class=&quot;flos&quot;&gt;
  &lt;li&gt;
    &lt;h3 id=&quot;6-zaczynamy-kodować&quot;&gt;6. Zaczynamy kodować!&lt;/h3&gt;

    &lt;p&gt;Stwórz plik: &lt;code class=&quot;highlighter-rouge&quot;&gt;main.js&lt;/code&gt;, gdzie zdefiniujesz stałe:&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;appId&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'XXX'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;appSecret&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'XXX'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;getOAuthAccessTokenURI&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;`https://graph.facebook.com/oauth/access_token?client_id=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;appId&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;amp;client_secret=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;appSecret&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&amp;amp;grant_type=client_credentials&amp;amp;debug=all`&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;pageId&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'warsawjs'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;getEngagementURI&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;`https://graph.facebook.com/&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;${&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;pageId&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;/?fields=engagement&amp;amp;debug=all`&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;ul class=&quot;flos&quot;&gt;
  &lt;li&gt;
    &lt;h3 id=&quot;7-pierwsza-komunikacja&quot;&gt;7. Pierwsza komunikacja&lt;/h3&gt;

    &lt;p&gt;Tworzysz funkcję &lt;code class=&quot;highlighter-rouge&quot;&gt;fbAsyncInit&lt;/code&gt;, w której inicjalizujesz Facebook API
  za pomocą &lt;code class=&quot;highlighter-rouge&quot;&gt;FB.init&lt;/code&gt;&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;window&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;fbAsyncInit&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;FB&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;init&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;({&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;appId&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;appId&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;autoLogAppEvents&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;xfbml&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;version&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'v2.9'&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;});&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;ul class=&quot;flos&quot;&gt;
  &lt;li&gt;
    &lt;h3 id=&quot;8-zdobycie-access-token&quot;&gt;8. Zdobycie &lt;code class=&quot;highlighter-rouge&quot;&gt;Access Token&lt;/code&gt;&lt;/h3&gt;

    &lt;p&gt;Aby zdobyć klucz należy wykonać proste zapytanie HTTP. Bycie w posiadaniu
  takiego klucza, umożliwi Ci większy dostęp do Facebook API.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;window&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;fbAsyncInit&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;// ...&lt;/span&gt;
    &lt;span class=&quot;nb&quot;&gt;Promise&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;resolve&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;then&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;window&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;fetch&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;getOAuthAccessTokenURI&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;})&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;then&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;response&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;response&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;json&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;})&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;catch&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;err&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;nx&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;err&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;});&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;ul class=&quot;flos&quot;&gt;
  &lt;li&gt;
    &lt;h3 id=&quot;9-zdobycie-zaangażowanie&quot;&gt;9. Zdobycie &lt;code class=&quot;highlighter-rouge&quot;&gt;Zaangażowanie&lt;/code&gt;&lt;/h3&gt;

    &lt;p&gt;O co chodzi z “zaangażowaniem” (eng. &lt;code class=&quot;highlighter-rouge&quot;&gt;engagement&lt;/code&gt;)? Nie wiem dlaczego taka
  nazwa, ale ta właściwość definiuje liczbę lajków fanpage-a. Interesujące.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;cm&quot;&gt;/**
* Funkcja, do komunikacji z Facebook API.
*
* @author Piotr Kowalski
* @param {string} url
* @param {Object} opts
*/&lt;/span&gt;
&lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;fetchFacebookService&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;opts&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{})&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;Promise&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;resolve&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;reject&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;nx&quot;&gt;FB&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;api&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;opts&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;response&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;response&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;reject&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;response&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;nx&quot;&gt;resolve&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;response&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;});&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;});&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;nb&quot;&gt;window&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;fbAsyncInit&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;// ...&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;then&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;response&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;fetchFacebookService&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;getEngagementURI&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;response&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;})&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;then&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;response&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;response&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;engagement&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;count&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;})&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;then&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;likes&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;nx&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;likes&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// 1497 # mamy to!!!&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;})&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;// ...&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;ul class=&quot;flos&quot;&gt;
  &lt;li&gt;
    &lt;h3 id=&quot;10-the-end&quot;&gt;10. The END&lt;/h3&gt;

    &lt;p&gt;Posiadasz już liczbę lajków do swojego fanpage. Wykorzystaj to w dobrych celach!&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote class=&quot;block-good&quot;&gt;
  &lt;h3 id=&quot;-wskazówki&quot;&gt;&lt;i class=&quot;icon-good&quot;&gt;&lt;/i&gt; Wskazówki&lt;/h3&gt;
  &lt;ul&gt;
    &lt;li&gt;Czytaj &lt;strong&gt;Getting Started&lt;/strong&gt; od razu!&lt;/li&gt;
    &lt;li&gt;Nie sugeruj się odpowiedziami ludzi na forum odnośnie tego jak coś zrobić z
Facebook API. Informacje te są zwykle przestarzałe.&lt;/li&gt;
    &lt;li&gt;Większość usług wymyga podania &lt;strong&gt;Access Tokenu&lt;/strong&gt;.&lt;/li&gt;
  &lt;/ul&gt;
&lt;/blockquote&gt;

&lt;h2 id=&quot;developerskie-usprawnienia&quot;&gt;Developerskie usprawnienia&lt;/h2&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;Flaga w URLach, zwiększa delikatnie możliwości programistyczne &lt;code class=&quot;highlighter-rouge&quot;&gt;debug=all&lt;/code&gt;&lt;/p&gt;

    &lt;p&gt;Co robi ten parametr? Nie wiem, ale jest developerski to go używam.
 Dajcie znać w komentarzach po co on jest. Osobiście takiej informacji nie
 znalazłem.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Dołączanie głównego pliku w procesie osadzenia Facebook API:&lt;br /&gt;
 &lt;code class=&quot;highlighter-rouge&quot;&gt;js.src = &quot;//connect.facebook.net/en_US/sdk/debug.js&quot;;&lt;/code&gt;&lt;/p&gt;

    &lt;p&gt;Od razu w DevToolsach widzę &lt;strong&gt;jak działa Facebook API&lt;/strong&gt;. Super!&lt;/p&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;-pomysły&quot;&gt;&lt;i class=&quot;icon-average&quot;&gt;&lt;/i&gt; Pomysły&lt;/h2&gt;

&lt;p&gt;Spróbuję zrobić paczkę w npm-ie, która by potrzebowała credientiali,
a zwracała liczbę lajków strony, której jest się właścicielem.&lt;/p&gt;

&lt;!-- Resources --&gt;

</description>
            <pubDate>Sun, 21 May 2017 21:38:45 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2017/05/21/jak-wyswietlic-liczbe-osob-lajkujacych-nasz-fanpage.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2017/05/21/jak-wyswietlic-liczbe-osob-lajkujacych-nasz-fanpage.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/facebook/display-likes-of-warsawjs-fanpage-1497.jpg</image>
        </item>
        
        <item>
            <title>Dlaczego User-Agent zaczyna się od "Mozilla 5.0..."?</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Czy zastanawiałeś się kiedyś, dlaczego User-Agent w każdej przeglądarce
rozpoczyna się od &lt;mark&gt;Mozilla/5.0 ...&lt;/mark&gt;? Jaki związek ma program
Internet Explorer z Firefoxem? Może ktoś tutaj współpracuje? Zaraz
wszystkiego się dowiesz.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/user-agent/user-agent-mozilla.jpg&quot; itemprop=&quot;image&quot; alt=&quot;Baner promujący artykuł&quot; /&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;historia&quot;&gt;Historia&lt;/h2&gt;

&lt;p&gt;Jeśli znasz historię języka JavaScript, to na pewno kojarzysz taką nazwę
jak Mosaic. Jeśli nie, to zapraszam Cię do &lt;a href=&quot;/blog/2016/12/02/historia-jezyka-javascript.html&quot;&gt;zapoznania się z nią&lt;/a&gt; w
artykule, którego napisałem kilka tygodni temu.&lt;/p&gt;

&lt;p&gt;W skrócie.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;W 1993 roku&lt;/strong&gt; została opublikowana pierwsza na rynku przeglądarka
wyświetlająca obrazki. Aplikacja nosiła nazwę &lt;mark&gt;NCSA Mosaic&lt;/mark&gt;
i została opublikowana przez bardzo ważny organ, który mocno przyczynił się
do rozwoju IT, czyli National Center for Supercomputing Applications (NCSA).&lt;/p&gt;

&lt;p&gt;Jej User-Agent zaczynał się od “Mosaic/0.9”.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;“Mosaic” - nazwa aplikacji&lt;/li&gt;
  &lt;li&gt;“0.9” to oczywiście wersja&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Rok później, tj. &lt;strong&gt;w 1994&lt;/strong&gt;, powstała nowa przeglądarka, której nazwa kodowa
to “Mozilla”, czyli “&lt;strong&gt;Mo&lt;/strong&gt;saic Killer God&lt;strong&gt;zilla&lt;/strong&gt;”. Nazwa została wymyślona
przez jednego z programistów zespołu projektowego przeglądarki, &lt;strong&gt;Jamiego
Zawińskiego&lt;/strong&gt;, który był fanem Godzilli.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;O tym wszystkim informuje w komentarzu na portalu Quora, &lt;a href=&quot;https://www.quora.com/Why-do-non-Mozilla-browsers-include-Mozilla-in-their-user-agent-strings/answer/Lou-Montulli&quot;&gt;jeden z
założycieli&lt;/a&gt; firmy Netscape - &lt;a href=&quot;https://en.wikipedia.org/wiki/Lou_Montulli&quot;&gt;Lou Montulli&lt;/a&gt;. Lou był odpowiedzialny za
multi-platformowy kod sieciowy i to on zmienić User-Agent z “Mosaic”
na “Mozilla”.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Nowa przeglądarka miała za zadanie zdeklasować obecnego lidera i podbić rynek
przeglądarek.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Rok później weszła ona na czołową pozycję wśród programów, dzięki którym
można serfować po internecie.&lt;/p&gt;

&lt;p&gt;Po drodze nazwa została zmieniona na &lt;mark&gt;Netscape Navigator&lt;/mark&gt;, aby
uniknąć podobieństwa do &lt;mark&gt;NCSA Mosaic&lt;/mark&gt;. I słusznie. Lepiej rozwiać
wszelkie wątpliwości, co by użytkownicy nie byli zmieszani.&lt;/p&gt;

&lt;blockquote class=&quot;block-good&quot;&gt;
  &lt;h3 id=&quot;-ważna-informacja&quot;&gt;&lt;i class=&quot;icon-good&quot;&gt;&lt;/i&gt; Ważna informacja&lt;/h3&gt;
  &lt;p&gt;Nazwa programu się zmieniała, jednak User-Agent pozostał.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Z tego powodu User-Agent pierwszej publicznej wersji &lt;mark&gt;Netscape
Navigator&lt;/mark&gt; zaczynał się od “Mozilla/2.02”.&lt;/p&gt;

&lt;h2 id=&quot;dlaczego-prefix-się-nie-zmienił&quot;&gt;Dlaczego prefix się nie zmienił?&lt;/h2&gt;

&lt;p&gt;Gdy rynek został podbity przez jedną przeglądarkę, a Ty chcesz zrobić nową,
to masz dwie drogi w zdefiniowaniu User-Agenta:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;stworzyć zupełnie nowy format, tworząc tym samym zamieszanie&lt;/li&gt;
  &lt;li&gt;albo skopiować od aktualnego lidera i lekko zmodyfikować “pod siebie”&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Wszyscy kolejni producenci nowych aplikacji do przeglądania internetu
stwierdzili, że &lt;strong&gt;nie ma sensu tworzyć zupełnie nowej składni&lt;/strong&gt; i tak
wykorzystywali UA obecnie najpopularniejszej przeglądarki.&lt;/p&gt;

&lt;p&gt;Wykorzystanie wówczas najpopularniejszego User-Agenta, niosło za sobą pewną
korzyść. &lt;strong&gt;Właściciele stron serwowali dla nie-Mozillowych klientów okrojoną
wersję strony&lt;/strong&gt;. To jest kolejny argument, dla którego lepiej podszyć się pod
najpopularniejszą przeglądarkę i prezentować użytkownikom normalną wersję.&lt;/p&gt;

&lt;h2 id=&quot;rozwiązanie-microsoftu&quot;&gt;Rozwiązanie Microsoftu&lt;/h2&gt;

&lt;p&gt;Niektóre przeglądarki np. Internet Explorer dodawały do User-Agenta
wyraz “compatible”, po to, aby zasygnalizować, że przeglądarka jest
kompatybilna z obecnie najlepszą, ale nią de facto nie jest.&lt;/p&gt;

&lt;p&gt;Ciekawy pomysł 😄&lt;/p&gt;

&lt;p&gt;I tak pierwsza publiczna wersja Internet Explorer 3 uruchomiona na Windows 95,
miała User-Agent-a w postaci: &lt;code class=&quot;highlighter-rouge&quot;&gt;Mozilla/2.0 (compatible; MSIE 3.02; Windows 95)&lt;/code&gt;.&lt;/p&gt;

&lt;blockquote class=&quot;block-good&quot;&gt;
  &lt;h3 id=&quot;-ciekawostka&quot;&gt;&lt;i class=&quot;icon-good&quot;&gt;&lt;/i&gt; Ciekawostka&lt;/h3&gt;
  &lt;p&gt;Internet Explorer w wersji 4.5 były opublikowany tylko na Mac-i.&lt;br /&gt;
Jego User-Agent to: &lt;code class=&quot;highlighter-rouge&quot;&gt;Mozilla/4.0 (compatible; MSIE 4.5; Mac_PowerPC)&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id=&quot;ale-dlaczego-akurat-50&quot;&gt;Ale dlaczego akurat “5.0”?&lt;/h2&gt;

&lt;p&gt;Po drodze nazwa przeglądarki &lt;mark&gt;Netscape Navigator&lt;/mark&gt; zmieniła się
dwukrotnie. Na początku &lt;mark&gt;Netscape Communicator&lt;/mark&gt;, a potem na
po prostu &lt;mark&gt;Netscape&lt;/mark&gt;.&lt;/p&gt;

&lt;p&gt;Firma Netscape Communications, autorzy wtenczas najpopularniejszej
przeglądarki, &lt;strong&gt;stworzyła silnik do renderowania stron o nazwie Gecko&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Zaimplementowali ten silnik do kolejnej wersji przeglądarki w wersji 5.0.
Silnik ewoluował, przeglądarka też, jednak ta pierwsza liczba w User-Agent
już nie.&lt;/p&gt;

&lt;p&gt;Następnie nazwa przeglądarki została zmieniona na Firefox.
Wersjonowanie przeglądarki było zapisywane jako osobna (dodatkowa) liczba.&lt;/p&gt;

&lt;h3 id=&quot;przykład&quot;&gt;Przykład&lt;/h3&gt;

&lt;p&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;Mozilla/5.0 (Windows NT 5.1; rv:15.0) Gecko/20100101 Firefox/15.0.1&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;W tym konkretnym przypadku, wersja przeglądarki to “15.0.1”.&lt;/p&gt;

&lt;p&gt;Nie ma sensu zmieniać teraz budowy User-Agenta, ponieważ trzeba by było
zaktualizować cały software sieciowy, który analizuje ten string.
Dlatego też prefix &lt;strong&gt;“Mozilla/5.0” zostanie już z nami na zawsze.&lt;/strong&gt;&lt;/p&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;h2 id=&quot;bibliografia&quot;&gt;Bibliografia&lt;/h2&gt;

&lt;p&gt;Więcej na temat historii User-Agentów możecie przeczytać na
&lt;a href=&quot;https://www.nczonline.net/blog/2010/01/12/history-of-the-user-agent-string/&quot;&gt;blogu Nicolasa Zakasa&lt;/a&gt;. Polecam również poczytać historię User-Agent–w
&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/User-Agent/Firefox&quot;&gt;przeglądarki Firefox&lt;/a&gt;. Kolejną interesującą lekturą jest historii
User-Agentów przedstawiona w &lt;a href=&quot;http://webaim.org/blog/user-agent-string-history/&quot;&gt;zabawny sposób&lt;/a&gt; przez jednego z nas -
programistów webowych.&lt;/p&gt;

&lt;!-- Resources --&gt;

</description>
            <pubDate>Fri, 19 May 2017 07:56:47 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2017/05/19/dlaczego-user-agent-zaczyna-sie-od-slowa-mozilla.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2017/05/19/dlaczego-user-agent-zaczyna-sie-od-slowa-mozilla.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/user-agent/user-agent-mozilla.jpg</image>
        </item>
        
        <item>
            <title>WarsawJS Meetup #30</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Zgodnie z opisem w &lt;a href=&quot;/blog/2017/05/09/warsawjs-meetup-29.html&quot;&gt;tym&lt;/a&gt; poście, dziś kolejny wpis, na temat spotkania
warszawskich programistów JavaScript, czyli WarsawJS Meetup!&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://www.meetup.com/WarsawJS/events/237134262/&quot;&gt;Tutaj&lt;/a&gt; znajdziesz link do profilu wydarzenia na Meetup, gdzie możesz
dowiedzieć się więcej szczegółów na temat organizacji. &lt;strong&gt;Warto również zapoznać
się komentarzami&lt;/strong&gt;, w których uczestnicy spotkania często prowadzą interesujące
dyskusje.&lt;/p&gt;

&lt;!-- &lt;figure&gt;
    &lt;a href=&quot;https://www.meetup.com/WarsawJS/&quot;&gt;
        &lt;img src=&quot;/assets/images/posts/post-banner-warsawjs.jpg&quot;
             alt=&quot;WarsawJS&quot;/&gt;
    &lt;/a&gt;
&lt;/figure&gt; --&gt;

&lt;h2 id=&quot;invitation&quot;&gt;Invitation&lt;/h2&gt;

&lt;p&gt;Kolejna zapowiedź nagrywana w domu na greenboxie. Zastosowałem się do uwagi
którą dostałem po poprzedniej zapowiedzi, aby czasami zejść z kadru i pokazać
jakąś przebitkę. Faktycznie, kiedy ciągle widoczna jest “gadająca głowa”, to
film może okazać się nudny.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Jak Ci się podoba montaż?&lt;/strong&gt; Jest akceptowalne, prawda? 😄&lt;/p&gt;

&lt;div class=&quot;youtube-lazy&quot; data-youtube-id=&quot;FR0UvfEIUnI&quot;&gt;&lt;/div&gt;

&lt;p class=&quot;chapter-break&quot;&gt;&amp;bull;&lt;/p&gt;

&lt;h2 id=&quot;talk-1-pogromcy-mitów-http2-i-wydajność-stron-www-pl-piotr-stapp&quot;&gt;Talk #1: Pogromcy mitów: HTTP/2 i wydajność stron WWW [PL] &lt;small&gt;Piotr Stapp&lt;/small&gt;&lt;/h2&gt;

&lt;p&gt;Piotr, jako prelegent dał mi niesamowitą zagwozdkę. Jako pierwsza osoba,
która wyszła na scenę w ogóle się nie stresował. Absolutnie nic nie było po
nim widać, że obserwuje go tyle ludzi w sali oraz że jest nagrywany a przekaz
jest transmitowany na cały świat.&lt;/p&gt;

&lt;p&gt;Odnośnie części merytorycznej, mogę powiedzieć, że prelekcja jest obowiązkowa
dla wszystkich developerów sieciowych. Nieważne kim jesteś front-endowcem czy
back-endowcem, powinieneś obejrzeć co czeka nas w przyszłości (w sumie to już
co jest obecnie standardem) tj. HTTP/2. Technologia Server Pushy znacznie
przyspiesza ładowanie strony, co nakłada się na odbiór prze użytkownika.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Link do prelekcji: &lt;a href=&quot;https://www.youtube.com/watch?v=tkjPCuuLhtc&quot;&gt;youtube.com/watch?v=tkjPCuuLhtc&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Kontakt do prelegenta: &lt;a href=&quot;https://twitter.com/ptrstpp950&quot;&gt;@ptrstpp950&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;h2 id=&quot;talk-2-firebase---store-and-sync-data-with-nosql-cloud-database-pl-robert-gurgul&quot;&gt;Talk #2: Firebase - store and sync data with NoSQL cloud database [PL] &lt;small&gt;Robert Gurgul&lt;/small&gt;&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Jedna z krótszych prelekcji jakie miały miejsce podczas WarsawJS Meetup.&lt;/strong&gt;
Robert w kilkanaście minut przedstawił swój projekt, który stworzył w
połączeniu z bazą danych Firebase.&lt;/p&gt;

&lt;p&gt;Ze swojej strony polecam wykorzystanie Firebase podczas hackathonów, albo
innych tego typu imprez, gdzie mocno liczy się czas realizacji.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Link do prelekcji: &lt;a href=&quot;https://www.youtube.com/watch?v=A2_VwBpofYY&quot;&gt;youtube.com/watch?v=A2_VwBpofYY&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Kontakt do prelegenta: &lt;a href=&quot;https://twitter.com/rgurgul&quot;&gt;@rgurgul&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;h2 id=&quot;talk-3-retro-js-talk-modern-browser-communications-en-robert-kawecki&quot;&gt;Talk #3: Retro JS talk: modern browser communications [EN] &lt;small&gt;Robert Kawecki&lt;/small&gt;&lt;/h2&gt;

&lt;p&gt;Podczas prelekcji mogliśmy się dowiedzieć, że akronim &lt;code class=&quot;highlighter-rouge&quot;&gt;PHP&lt;/code&gt; bierze się od
słów &lt;code class=&quot;highlighter-rouge&quot;&gt;PHP HyperText Preprocesor&lt;/code&gt;. Mamy tutaj do czynienia z rekursywnym skrótem.
Wskazuje to jasno, że kiedy &lt;code class=&quot;highlighter-rouge&quot;&gt;PHP&lt;/code&gt; oznaczało co innego. Wiecie co?&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;PHP - Personal Home Page&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Podczas prelekcji mogliśmy dowiedzieć się o kolejnych etapach
nawiązywania komunikacji między klientem a serwerem w świecie webowym.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Link do prelekcji: &lt;a href=&quot;https://www.youtube.com/watch?v=yyhnNJNKhng&quot;&gt;youtube.com/watch?v=yyhnNJNKhng&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Kontakt do prelegenta: &lt;a href=&quot;https://twitter.com/rkaw92&quot;&gt;@rkaw92&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;h2 id=&quot;sponsorzy-spotkania&quot;&gt;Sponsorzy spotkania&lt;/h2&gt;

&lt;p&gt;Szukasz pracy? Napisz do następujących firm. One ciągle prowadzą rekrutację
programistów, różnych języków programowania w różnym stopniu.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.facebook.com/10Clouds/&quot;&gt;10Clouds&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.facebook.com/artificialio/&quot;&gt;Artificial Labs&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.facebook.com/cyfrowypolsat/&quot;&gt;Cyfrowy Polsat&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.facebook.com/Daftcode/&quot;&gt;DaftCode&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.facebook.com/elpassion/&quot;&gt;EL Passion&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.facebook.com/softwarely/&quot;&gt;Softwarely&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;h2 id=&quot;podsumowanie&quot;&gt;Podsumowanie&lt;/h2&gt;

&lt;p&gt;Jako organizator WarsawJS Meetup, serdecznie dziękuję wszystkim za przybycie.&lt;/p&gt;

&lt;p&gt;Jako bloger serdecznie dziękuję za przeczytanie tego wpisu.&lt;br /&gt;
Za 2 dni &lt;strong&gt;wracamy do regularnego pogłębiania naszej wiedzy merytorycznej&lt;/strong&gt;.&lt;/p&gt;

&lt;!-- Resources --&gt;

</description>
            <pubDate>Wed, 17 May 2017 21:31:19 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2017/05/17/warsawjs-meetup-30.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2017/05/17/warsawjs-meetup-30.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/post-banner-warsawjs.jpg</image>
        </item>
        
        <item>
            <title>DeviceLightEvent w ogóle i w szczególe</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Pierwsze moje zetknięcie z tym API wywołało u mnie szok! &lt;strong&gt;Mogę korzystać z
kamery w sposób niezauważalny dla użytkownika!&lt;/strong&gt; Jak się później okazało nie
korzystam z kamery, a jedynie z czujnika, który jest zamontowany obok kamery.&lt;/p&gt;

&lt;p&gt;Kamień z serca. Odetchnąłem z ulgą i pozbierałem zęby z podłogi.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/device-light-event/device-light-event.jpg&quot; itemprop=&quot;image&quot; alt=&quot;Baner promujący artykuł&quot; /&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;film&quot;&gt;Film&lt;/h2&gt;

&lt;p&gt;Nie chce Ci się czytać? Spoko. Rozumiem to. Specjalnie dla Ciebie nagrałem film,
na którym opowiadam przez &lt;strong&gt;niecałe 5 minut&lt;/strong&gt;, jak dzisiejszy feature może
pomóc Ci w tworzeniu lepszego User Experience w Twoich aplikacjach webowych!&lt;/p&gt;

&lt;div class=&quot;youtube-lazy&quot; data-youtube-id=&quot;FUKLlelmHO8&quot;&gt;&lt;/div&gt;

&lt;h2 id=&quot;co-to-jest-devicelightevent&quot;&gt;Co to jest DeviceLightEvent?&lt;/h2&gt;

&lt;p&gt;Kilka lat temu pojawiła się specyfikacja - &lt;a href=&quot;https://www.w3.org/TR/2013/CR-ambient-light-20131001/&quot;&gt;Ambient Light Events&lt;/a&gt;, która
opisała jak może polegać komunikacja z czujnikiem natężenia światła, który
znajduje się obok kamery w laptopach.&lt;/p&gt;

&lt;blockquote class=&quot;block-average&quot;&gt;
  &lt;h3 id=&quot;-pytanie-do-publiczności&quot;&gt;&lt;i class=&quot;icon-average&quot;&gt;&lt;/i&gt; Pytanie do publiczności&lt;/h3&gt;
  &lt;p&gt;Zastanawiam się, czy event będzie działał na komputerach PC (jednostki
centralne). Jeśli czytelniku korzystasz z takiego sprzętu i posiadasz
przeglądarkę wymienioną w sekcji &lt;a href=&quot;#wsparcie&quot;&gt;wsparcie&lt;/a&gt;, to daj znać w
komentarzu, czy Twoja zewnętrzna kamera posiada taki czujnik generując tym
samym omawiany event.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id=&quot;przykładowy-kod&quot;&gt;Przykładowy kod&lt;/h2&gt;

&lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;window&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;addEventListener&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'devicelight'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;evt&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;evt&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Komunikacja wygląda następująco.&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Zapisujesz się na event &lt;code class=&quot;highlighter-rouge&quot;&gt;devicelight&lt;/code&gt; na obiekcie &lt;code class=&quot;highlighter-rouge&quot;&gt;window&lt;/code&gt;.&lt;/li&gt;
  &lt;li&gt;Czekasz aż zmienić się poziom natężenie światła - warto zakryć kamerę
 palcem, albo poświecić w niego latarką z telefonu.&lt;/li&gt;
  &lt;li&gt;W handlerze eventu dostaniesz payload będący obiektem zdarzenia
 &lt;code class=&quot;highlighter-rouge&quot;&gt;DeviceLightEvent&lt;/code&gt;, który będzie posiadał wartość &lt;code class=&quot;highlighter-rouge&quot;&gt;value&lt;/code&gt;, pod którym
 będzie kryła się liczba luksów.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3 id=&quot;bracie-a-co-to-jest-ten-lukx-lux&quot;&gt;Bracie, a co to jest ten &lt;code class=&quot;highlighter-rouge&quot;&gt;lukx&lt;/code&gt; (&lt;code class=&quot;highlighter-rouge&quot;&gt;lux&lt;/code&gt;)?&lt;/h3&gt;

&lt;p&gt;W układzie SI, czyli “Międzynarodowym Układzie Jednostek Miar”, znajduje się
definicja &lt;a href=&quot;https://pl.wikipedia.org/wiki/Luks_(fotometria)&quot;&gt;luksa&lt;/a&gt;, który to jest &lt;strong&gt;jednostką natężenia oświetlenia&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Nazwa “luks” pochodzi od łacińskiego słowa “lux” oznaczającego “światło”.&lt;/p&gt;

&lt;h3 id=&quot;jak-ja-bym-obsługiwał-dane-które-dostanę-ze-zdarzenia&quot;&gt;Jak ja bym obsługiwał dane, które dostanę ze zdarzenia&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;0 (zero) lux&lt;/strong&gt; - czarno - layout powinien być maksymalnie ciemny, aby nie
  psuć komfortu pracy bez oświetlenia&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;&amp;lt; 50 lux&lt;/strong&gt; - ciemno w pomieszczeniu, warto więc przepiąć się na ciemniejszy
  layout&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;50+ lux&lt;/strong&gt; - jasno, śmiało możesz przepinać layout w styl dzienny&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;3000+ lux&lt;/strong&gt; - tak jasno, że można oślepnąć, gdy będzie się dłużej patrzeć
  na taki obiekt, który świeci światłem o takim natężeniu. Rzadko kiedy
  spotkasz takich użytkowników.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;przykłady-z-życia-wzięte&quot;&gt;Przykłady z życia wzięte&lt;/h3&gt;

&lt;p&gt;Ile lux-ów ma światło na co dzień?&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;50 lux&lt;/strong&gt; - Natężenie światła w pokoju dziennym&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;80 lux&lt;/strong&gt; - Natężenie światła w biurowym korytarzu / toalecie&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;320–500 lux&lt;/strong&gt; - Naświetlenie w biurze&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;1000 lux&lt;/strong&gt; - Natężenie światła w typowym studiu TV&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;10000 - 25000 lux&lt;/strong&gt; - Światło dzienne (lecz nie bezpośrednie światło słoneczne)&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;32000 - 100000 lux&lt;/strong&gt; - Promieniowanie słoneczne&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Dane pobrane z &lt;a href=&quot;https://pl.wikipedia.org/wiki/Luks_(fotometria)&quot;&gt;Wikipedia&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;h2 id=&quot;wsparcie&quot;&gt;Wsparcie&lt;/h2&gt;

&lt;p&gt;Korzystając z serwisu &lt;a href=&quot;http://caniuse.com/#feat=ambient-light&quot;&gt;caniuse.com&lt;/a&gt; można dowiedzieć się,
że &lt;code class=&quot;highlighter-rouge&quot;&gt;Ambient Light API&lt;/code&gt; wspierane jest przez następujące przeglądarki:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;dl&gt;
      &lt;dt&gt;Edge&lt;/dt&gt;
      &lt;dd&gt;wsparcie na poziomie 100% (pełne wsparcie)&lt;/dd&gt;
    &lt;/dl&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;dl&gt;
      &lt;dt&gt;Firefox 22+&lt;/dt&gt;
      &lt;dd&gt;tylko macOS&lt;/dd&gt;
    &lt;/dl&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;dl&gt;
      &lt;dt&gt;Firefox For Android 52+&lt;/dt&gt;
      &lt;dd&gt;wsparcie na poziomie 100% (pełne wsparcie)&lt;/dd&gt;
    &lt;/dl&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Jak widać, jest to technologia, której dziś możemy zobaczyć swego rodzaju
&lt;strong&gt;embrion&lt;/strong&gt;. Malutkie wsparcie nie pozwala cieszyć się z tego feature-a.
Szczególnie, kiedy najpopularniejszy browser, tj. &lt;strong&gt;Google Chrome, nie
zaimplementował&lt;/strong&gt; specyfikacji czujnika światła.&lt;/p&gt;

&lt;h2 id=&quot;po-co-mi-to&quot;&gt;Po co mi to?&lt;/h2&gt;

&lt;p&gt;Ten event otwiera drogę na kolejne doznania użytkownika polepszające odbiór
Twojej strony internetowej. Jeśli layout Twojej strony jest jasny (podobnie
jak mój), to użytkownicy nocni dostaną “po gałach”, kiedy będą przeglądać
internet o tej porze dnia.&lt;/p&gt;

&lt;p&gt;Myślę, że świetnym podejściem jest wygaszenie jaskrawego białego i
wykorzystania innych kolorów ze skali szarości, aby wyeliminować ten problem,
że gdy w nocy wejdzie się na YouTube-a to nagle cały pokój się świeci.&lt;/p&gt;

&lt;h2 id=&quot;demo-&quot;&gt;Demo 🎉&lt;/h2&gt;

&lt;blockquote&gt;
  &lt;h3 id=&quot;instrukcja&quot;&gt;Instrukcja&lt;/h3&gt;
  &lt;p&gt;Jak możesz zobaczyć na samym dole strony w sekcji “Ostatnie projekty”,
pojawił się nowy projekt, który posiada obsługę zdarzenia &lt;code class=&quot;highlighter-rouge&quot;&gt;devicelight&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Jeśli jesteś użytkownikiem korzystającym z dowolnej przeglądarki opisanej w
sekcji &lt;a href=&quot;#wsparcie&quot;&gt;wsparcie&lt;/a&gt; to zapraszam Cie do skorzystania ze specjalnie
&lt;a href=&quot;http://piecioshka.github.io/test-device-light-event/&quot;&gt;przygotowanej aplikacji&lt;/a&gt;, która na podstawie odczytów z czujnika
natężenia światła zmienia kolory teksty i tła.&lt;/p&gt;

&lt;!-- Resources --&gt;

</description>
            <pubDate>Mon, 15 May 2017 21:57:29 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2017/05/15/device-light-event.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2017/05/15/device-light-event.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/device-light-event/device-light-event.jpg</image>
        </item>
        
        <item>
            <title>EOL w prostych słowach</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Każdy plik tekstowy składa się z linii. Każda linia kiedyś się kończy.
Ale skąd system wie, że linia się skończyła? Istnieje &lt;a href=&quot;https://pl.wikipedia.org/wiki/Koniec_linii&quot;&gt;ZNAK specjalny&lt;/a&gt;,
który informuje system, że znaki w linii właśnie się skończyły.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/eol/eol.jpg&quot; itemprop=&quot;image&quot; alt=&quot;Baner promujący artykuł&quot; /&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;-problem&quot;&gt;&lt;i class=&quot;icon-poor&quot;&gt;&lt;/i&gt; Problem&lt;/h2&gt;

&lt;p&gt;I tym znakiem jest… no właśnie. &lt;strong&gt;Nie ma jednego znaku cross-platformowego,
który by informował, że linia została “zakończona”&lt;/strong&gt;. Wszystko ze względu na
problem ze zróżnicowaniem poglądów na to, co to jest zakończenie linii.&lt;/p&gt;

&lt;p&gt;Wyróżniamy 3 tryby EOL (end-of-line):&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;dl&gt;
      &lt;dt&gt;CR - &lt;strong&gt;C&lt;/strong&gt;arriage &lt;strong&gt;R&lt;/strong&gt;eturn&lt;/dt&gt;
      &lt;dd&gt;znak końca linii m.in. na systemie: &lt;strong&gt;macOS&lt;/strong&gt; (do wersji 9)&lt;/dd&gt;
      &lt;dd&gt;reprezentacja w tablicy ASCII: &lt;strong&gt;\r&lt;/strong&gt;&lt;/dd&gt;
    &lt;/dl&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;dl&gt;
      &lt;dt&gt;LF - &lt;strong&gt;L&lt;/strong&gt;ine &lt;strong&gt;F&lt;/strong&gt;eed&lt;/dt&gt;
      &lt;dd&gt;znak końca linii m.in. na systemach: &lt;strong&gt;Linux&lt;/strong&gt; oraz &lt;strong&gt;macOS&lt;/strong&gt; (od wersji 10)&lt;/dd&gt;
      &lt;dd&gt;reprezentacja w tablicy ASCII: &lt;strong&gt;\n&lt;/strong&gt;&lt;/dd&gt;
    &lt;/dl&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;dl&gt;
      &lt;dt&gt;CR LF - &lt;strong&gt;C&lt;/strong&gt;arriage &lt;strong&gt;R&lt;/strong&gt;eturn &lt;strong&gt;L&lt;/strong&gt;ine &lt;strong&gt;F&lt;/strong&gt;eed&lt;/dt&gt;
      &lt;dd&gt;znak końca linii m.in. na systemach: &lt;strong&gt;MS-DOS&lt;/strong&gt; oraz &lt;strong&gt;MS Windows&lt;/strong&gt;&lt;/dd&gt;
      &lt;dd&gt;reprezentacja w tablicy ASCII: &lt;strong&gt;\r\n&lt;/strong&gt;&lt;/dd&gt;
    &lt;/dl&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Istnieje standard opisujący znaki w systemach komputerowych.
Nazywa się &lt;abbr title=&quot;American Standard Code for Information Interchange&quot;&gt;ASCII&lt;/abbr&gt;.&lt;br /&gt;
To w nim zdefiniowane jest mapowanie znaków na liczby (7 bitowe).&lt;/p&gt;

&lt;blockquote class=&quot;block-good&quot;&gt;
  &lt;h3 id=&quot;-specyfikacja-znaku-końca-wiersza&quot;&gt;&lt;i class=&quot;icon-good&quot;&gt;&lt;/i&gt; Specyfikacja znaku końca wiersza&lt;/h3&gt;
  &lt;p&gt;Niestety, ale w standardzie ASCII nie ma opisanego znaku końca linii w
systemach plików. Jest za to opisany &lt;strong&gt;standard znaku końca linii
w komunikacji sieciowej.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;W ubiegłym wieku, kiedy były ustalane protokoły sieciowe, przyjęto że
&lt;strong&gt;wszystkie komunikaty sieciowe będą kończyły się sekwencją znakową CR LF&lt;/strong&gt;.
I bardzo dobrze! Tzn. nie jestem zwolennikiem tej sekwencji, ale cieszę się z
powodu przyjętego standardu.&lt;/p&gt;

&lt;h2 id=&quot;jak-podejrzeć-jakie-jest-zakończenie-linii&quot;&gt;Jak podejrzeć jakie jest zakończenie linii?&lt;/h2&gt;

&lt;h3 id=&quot;ms-windows&quot;&gt;MS Windows&lt;/h3&gt;

&lt;p&gt;Świetnym sposobem na pogląd znaków specjalnych w pliku jest wykorzystanie
sposobu opisanego &lt;a href=&quot;http://dr-palaniraja.blogspot.com/2011/06/how-to-view-windows-line-ending.html&quot;&gt;tutaj&lt;/a&gt;, czyli posłużenie się narzędziem &lt;a href=&quot;https://notepad-plus-plus.org/&quot;&gt;Notepad++&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;W edytorze dostępna jest opcja &lt;code class=&quot;highlighter-rouge&quot;&gt;View all characters&lt;/code&gt; dzięki której wszystkie
(również te specjalne) znaki zostaną wyświetlone.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/eol/notepad++.png&quot; alt=&quot;Zrzut ekranu z programu Notepad++&quot; /&gt;
    &lt;figcaption&gt;
        &lt;a href=&quot;http://dr-palaniraja.blogspot.com/2011/06/how-to-view-windows-line-ending.html&quot;&gt;
            Dr. Palaniraja
        &lt;/a&gt; Copyright @ 2017
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h3 id=&quot;linux--macos&quot;&gt;Linux &amp;amp; macOS&lt;/h3&gt;

&lt;p&gt;Na systemach unix-owych podglądanie zakończenia linii odbywa się za pomocą
narzędzia &lt;code class=&quot;highlighter-rouge&quot;&gt;od&lt;/code&gt; (&lt;a href=&quot;https://pl.wikipedia.org/wiki/Man_(Unix)&quot;&gt;man pages&lt;/a&gt;):&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;OD&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;1&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;                   BSD General Commands Manual                  OD&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;1&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt;

NAME
    &lt;span class=&quot;nb&quot;&gt;od&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--&lt;/span&gt; octal, decimal, hex, ASCII dump
SYNOPSIS
...
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Aby przeczytać plik znak po znaku, wywołaj następujące polecenie:&lt;/p&gt;

&lt;p&gt;&lt;kbd&gt;Copy + paste&lt;/kbd&gt;&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;od&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-c&lt;/span&gt; .gitignore
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Oczywiście zamiast pliku &lt;code class=&quot;highlighter-rouge&quot;&gt;.gitignore&lt;/code&gt; wpisz ścieżkę do pliku jaki chcesz
przeczytać. Narzędzie wyświetli KAŻDY ZNAK osobno (będą spore przerwy
między znakami).&lt;/p&gt;

&lt;p&gt;Wynik wywołania powyższego polecania załączam poniżej:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;0000000    n   o   d   e   _   m   o   d   u   l   e   s   /  &lt;span class=&quot;se&quot;&gt;\n&lt;/span&gt;   n   p
0000020    m   -   d   e   b   u   g   &lt;span class=&quot;nb&quot;&gt;.&lt;/span&gt;   l   o   g  &lt;span class=&quot;se&quot;&gt;\n&lt;/span&gt;
0000034
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Jak widać w listingu, znaki specjalne zakończenia linii zostały zastąpione na
reprezentację czytelniejszą dla użytkownika, czyli &lt;code class=&quot;highlighter-rouge&quot;&gt;\n&lt;/code&gt;.&lt;/p&gt;

&lt;h2 id=&quot;różnica-w-git-cie&quot;&gt;Różnica w Git-cie&lt;/h2&gt;

&lt;p&gt;Różne znaki końca linii powodują - poza niespójnością - też inne problemy.
Osobiście uważam, że największy problem polega na wyświetlaniu różnic w
systemach kontroli wersji, które źle skonfigurowane potrafią wyświetlić, że
linijka została zmieniona, podczas gdy nie została.&lt;/p&gt;

&lt;p&gt;Wszystko to się dzieje, z tego powodu, że pliki w systemie kontroli wersji
zapisane są w formacie &lt;code class=&quot;highlighter-rouge&quot;&gt;LF&lt;/code&gt;. Edytory na systemie &lt;strong&gt;MS Windows&lt;/strong&gt;,
podczas dowolnej zmiany automatycznie konwertują znaki końca linii na &lt;code class=&quot;highlighter-rouge&quot;&gt;CRLF&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;…czyli de facto nastąpiła pewna zmiana, dlatego też system kontroli wersji
wyświetlił rożnicę.&lt;/p&gt;

&lt;h3 id=&quot;ignorowanie-zakończenia-linii-w-git&quot;&gt;Ignorowanie zakończenia linii w Git&lt;/h3&gt;

&lt;p&gt;Jak się ustrzec wyżej opisanego problemu? Bardzo łatwo!&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;/blog/2013/09/14/git-poczatki-w-najpopularniejszym-systemie-kontroli-wersji.html&quot;&gt;Najpopularniejszy&lt;/a&gt; system kontroli wersji &lt;a href=&quot;https://help.github.com/articles/dealing-with-line-endings/&quot;&gt;posiada opcję konfiguracyjną&lt;/a&gt;
odnośnie znaków końca linii: &lt;code class=&quot;highlighter-rouge&quot;&gt;core.autocrlf&lt;/code&gt;.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;Opcja &lt;code class=&quot;highlighter-rouge&quot;&gt;core.autocrlf&lt;/code&gt; ustawiona na &lt;code class=&quot;highlighter-rouge&quot;&gt;true&lt;/code&gt; oznacza, że wszystkie pliki w
  powinny mieć zakończenie linii w stylu &lt;code class=&quot;highlighter-rouge&quot;&gt;CRLF&lt;/code&gt;. Jeśli nie mają, odbędzie się
  konwersja znaków końca linii.&lt;/p&gt;

    &lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;  git config &lt;span class=&quot;nt&quot;&gt;--global&lt;/span&gt; core.autocrlf &lt;span class=&quot;nb&quot;&gt;true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote class=&quot;block-average&quot;&gt;
  &lt;h3 id=&quot;-uwaga&quot;&gt;&lt;i class=&quot;icon-average&quot;&gt;&lt;/i&gt; Uwaga&lt;/h3&gt;
  &lt;p&gt;Po ustawieniu tej opcji na systemie &lt;strong&gt;macOS&lt;/strong&gt; (domyślny jest &lt;code class=&quot;highlighter-rouge&quot;&gt;LF&lt;/code&gt;) a następnie
edycji dowolnego pliku, przed wyświetleniem różnicy otrzymamy komunikat:&lt;/p&gt;
  &lt;div class=&quot;language-text highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;warning: LF will be replaced by CRLF in README.md.
The file will have its original line endings in your working directory.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;  &lt;/div&gt;
  &lt;p&gt;Spowodowane jest to konwersją znaku końca linii z &lt;code class=&quot;highlighter-rouge&quot;&gt;LF&lt;/code&gt; na &lt;code class=&quot;highlighter-rouge&quot;&gt;CRLF&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;Gdy ustawimy &lt;code class=&quot;highlighter-rouge&quot;&gt;core.autocrlf&lt;/code&gt; na &lt;code class=&quot;highlighter-rouge&quot;&gt;input&lt;/code&gt; to żadna konwersja nie zostanie
  dokonana. Jest to domyślne ustawienie.&lt;/p&gt;

    &lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;  git config &lt;span class=&quot;nt&quot;&gt;--global&lt;/span&gt; core.autocrlf input
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;hr /&gt;

&lt;p&gt;Istnieją dwie drogi normalizacji zakończenia linii:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;dl&gt;
      &lt;dt&gt;systemowa&lt;/dt&gt;
      &lt;dd&gt;ustawienie per użytkownik komputera (tylko w jednym pliku)&lt;/dd&gt;
      &lt;dd&gt;albo konfiguracja zapisana w pliku &lt;code class=&quot;highlighter-rouge&quot;&gt;~/.gitconfig&lt;/code&gt; albo &lt;code class=&quot;highlighter-rouge&quot;&gt;~/.gitattributes&lt;/code&gt;&lt;/dd&gt;
    &lt;/dl&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;dl&gt;
      &lt;dt&gt;projektowa&lt;/dt&gt;
      &lt;dd&gt;ustawienie per projekt (liczba plików z konfiguracją == liczbie projektów)&lt;/dd&gt;
      &lt;dd&gt;albo konfiguracja zapisana w pliku &lt;code class=&quot;highlighter-rouge&quot;&gt;.gitattributes&lt;/code&gt; w katalogu projektu&lt;/dd&gt;
    &lt;/dl&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Polecana przeze mnie ścieżka to “systemowa”.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Nie ma sensu konfigurować per projekt. Nie widzę żadnych profitów z tego powodu,
a tylko minus, że w każdym projekcie musi znaleźć się plik &lt;code class=&quot;highlighter-rouge&quot;&gt;.gitattributes&lt;/code&gt;.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;Istnieją jeszcze inne opcje konfiguracyjne:&lt;/p&gt;

&lt;p&gt;&lt;kbd&gt;Copy + paste&lt;/kbd&gt;&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;git config &lt;span class=&quot;nt&quot;&gt;--global&lt;/span&gt; core.eol lf|crlf|native
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;git config &lt;span class=&quot;nt&quot;&gt;--global&lt;/span&gt; core.safecrlf &lt;span class=&quot;nb&quot;&gt;true&lt;/span&gt;|false|warn
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Nie będę się tutaj nad nimi pochylał. Chętnych zapraszam do manuala;&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;git &lt;span class=&quot;nb&quot;&gt;help &lt;/span&gt;config
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;h2 id=&quot;normalizacja-za-pomocą-odpowiednich-narzędzi&quot;&gt;Normalizacja za pomocą odpowiednich narzędzi&lt;/h2&gt;

&lt;p&gt;Czy istnieję możliwość konwersji między &lt;code class=&quot;highlighter-rouge&quot;&gt;CRLF&lt;/code&gt; a &lt;code class=&quot;highlighter-rouge&quot;&gt;LF&lt;/code&gt;? Oczywiście!
Poniżej przedstawiam jak poradzić sobie z konwersją między tymi końcami linii
na dwóch systemach: &lt;strong&gt;macOS&lt;/strong&gt; oraz &lt;strong&gt;Linux&lt;/strong&gt;.&lt;/p&gt;

&lt;h3 id=&quot;macos&quot;&gt;macOS&lt;/h3&gt;

&lt;p&gt;Poniższe polecenia będą dostępne na systemie &lt;code class=&quot;highlighter-rouge&quot;&gt;macOS&lt;/code&gt; po instalacji
odpowiedniego narzędzia za pomocą polecenia: &lt;code class=&quot;highlighter-rouge&quot;&gt;brew install dos2unix&lt;/code&gt;.&lt;/p&gt;

&lt;h4 id=&quot;z-crlf-na-lf-macos&quot;&gt;Z &lt;code class=&quot;highlighter-rouge&quot;&gt;CRLF&lt;/code&gt; na &lt;code class=&quot;highlighter-rouge&quot;&gt;LF&lt;/code&gt; (macOS)&lt;/h4&gt;

&lt;p&gt;Konwersja z trybu &lt;strong&gt;Windows&lt;/strong&gt; na tryb &lt;strong&gt;unix-owy&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;&lt;kbd&gt;Copy + paste&lt;/kbd&gt;&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;dos2unix README.md
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h4 id=&quot;z-lf-na-crlf-macos&quot;&gt;Z &lt;code class=&quot;highlighter-rouge&quot;&gt;LF&lt;/code&gt; na &lt;code class=&quot;highlighter-rouge&quot;&gt;CRLF&lt;/code&gt; (macOS)&lt;/h4&gt;

&lt;p&gt;Konwersja z trybu &lt;strong&gt;unix-owego&lt;/strong&gt; na tryb &lt;strong&gt;Windows&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;&lt;kbd&gt;Copy + paste&lt;/kbd&gt;&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;unix2dos README.md
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;linux&quot;&gt;Linux&lt;/h3&gt;

&lt;p&gt;Na systemie &lt;strong&gt;Linux&lt;/strong&gt; aby skonwertować plik można wykorzystać narzędzie &lt;code class=&quot;highlighter-rouge&quot;&gt;sed&lt;/code&gt;:&lt;/p&gt;

&lt;h4 id=&quot;z-crlf-na-lf-linux&quot;&gt;Z &lt;code class=&quot;highlighter-rouge&quot;&gt;CRLF&lt;/code&gt; na &lt;code class=&quot;highlighter-rouge&quot;&gt;LF&lt;/code&gt; (linux)&lt;/h4&gt;

&lt;p&gt;&lt;kbd&gt;Copy + paste&lt;/kbd&gt;&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;sed&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-e&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'s/\r$//'&lt;/span&gt; inputfile &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; outputfile
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h4 id=&quot;z-lf-na-crlf-linux&quot;&gt;Z &lt;code class=&quot;highlighter-rouge&quot;&gt;LF&lt;/code&gt; na &lt;code class=&quot;highlighter-rouge&quot;&gt;CRLF&lt;/code&gt; (linux)&lt;/h4&gt;

&lt;p&gt;&lt;kbd&gt;Copy + paste&lt;/kbd&gt;&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;sed&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-e&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'s/$/\r/'&lt;/span&gt; inputfile &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; outputfile
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Więcej przykładów jak skonwertować pliki znajduje się &lt;a href=&quot;http://stackoverflow.com/questions/6373888/converting-newline-formatting-from-mac-to-windows&quot;&gt;tutaj&lt;/a&gt;&lt;/p&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;h2 id=&quot;historia-end-of-line&quot;&gt;Historia end-of-line&lt;/h2&gt;

&lt;p&gt;W archiwum &lt;abbr title=&quot;Request For Comments&quot;&gt;RFC&lt;/abbr&gt; opisana jest
historia ustalania znaku zakończenia linii.&lt;/p&gt;

&lt;p&gt;Jeśli chciałbyś poczytać to wejdź &lt;a href=&quot;http://www.rfc-editor.org/old/EOLstory.txt&quot;&gt;tutaj&lt;/a&gt;.&lt;/p&gt;

&lt;!-- Resources --&gt;

</description>
            <pubDate>Fri, 12 May 2017 23:50:06 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2017/05/12/end-of-line-w-prostych-slowach.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2017/05/12/end-of-line-w-prostych-slowach.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/eol/eol.jpg</image>
        </item>
        
        <item>
            <title>Czym jest dla mnie BEM?</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Dziś miałem przyjemność rozmawiania z kilkoma osobami na temat techniki
definiowania klas w CSS. Rozważanie polegało na wyborze, który sposób na
tworzenie ich jest lepszy.&lt;/p&gt;

&lt;p&gt;Do wyboru były dwa:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.miejski.pl/slowo-Rympa%C5%82&quot;&gt;na rympał&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;albo metodologia BEM&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Który jest lepszy według mnie?&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/bem/bem.jpg&quot; itemprop=&quot;image&quot; alt=&quot;Baner promujący artykuł&quot; /&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;jak-wygląda-sposób-na-rympał&quot;&gt;Jak wygląda sposób “na rympał”?&lt;/h2&gt;

&lt;p&gt;Ten styl tworzenia klas CSS polega na tzw. zasadach w stylu “tak mi się wydaje”.
Nie ma tutaj żadnej konwencji nazewnictwa ani specjalnie żadnych reguł.
W zespole projektowym, który przyjął taką strategię tworzenie layoutów może
okazać się nie lada wyzwaniem z tego powodu, że każdy pisze po swojemu,
dlatego też developer nie czuje większej potrzeby oceniania kodu CSS
kolegi z zespołu.&lt;/p&gt;

&lt;blockquote class=&quot;block-good&quot;&gt;
  &lt;h3 id=&quot;-wskazówka&quot;&gt;&lt;i class=&quot;icon-good&quot;&gt;&lt;/i&gt; Wskazówka&lt;/h3&gt;
  &lt;p&gt;&lt;strong&gt;dash-case&lt;/strong&gt; (kebab-case) to “jedyna” słuszna konwencja nazywania
elementów w CSS. Przykład: &lt;code class=&quot;highlighter-rouge&quot;&gt;menuItemActive&lt;/code&gt; → &lt;code class=&quot;highlighter-rouge&quot;&gt;menu-item-active&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Tworzenie layoutów w ten sposób ma swoje wady i zalety. Przedstawię Ci te,
które pojawiły się w mojej głowie podczas dzisiejszych pogawędek.&lt;/p&gt;

&lt;h3 id=&quot;-zalety&quot;&gt;&lt;i class=&quot;icon-good&quot;&gt;&lt;/i&gt; Zalety&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;pełna dowolność w nazewnictwie&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;-wady&quot;&gt;&lt;i class=&quot;icon-poor&quot;&gt;&lt;/i&gt; Wady&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;nieskończona ilość zagłębień w preprocesorach, np. SASS&lt;/li&gt;
  &lt;li&gt;brak konwencji nazewnictwa klas (&lt;code class=&quot;highlighter-rouge&quot;&gt;menu-active-item&lt;/code&gt; vs &lt;code class=&quot;highlighter-rouge&quot;&gt;menu-item-active&lt;/code&gt;)&lt;/li&gt;
  &lt;li&gt;można się zgubić w kodzie dużego projektu&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;

&lt;hr /&gt;

&lt;h3 id=&quot;-dlaczego-kod-css-oraz-html-jest-pomijany-podczas-code-review&quot;&gt;&lt;i class=&quot;icon-average&quot;&gt;&lt;/i&gt; Dlaczego kod CSS oraz HTML jest pomijany podczas Code Review?&lt;/h3&gt;

&lt;hr /&gt;

&lt;p&gt;&lt;br /&gt;
&lt;br /&gt;&lt;/p&gt;

&lt;h2 id=&quot;zasady-w-css&quot;&gt;Zasady w CSS?&lt;/h2&gt;

&lt;p&gt;Oh tak! To nie jest tak, że ten język jest na tyle nieważny, że nie warto
stosować, żadnych zasad. W komplikowanych layotowo aplikacjach liczba kodu w
plikach ze stylami jest ogromna.&lt;/p&gt;

&lt;p&gt;Jak można zapanować na tym &lt;strong&gt;chaosem&lt;/strong&gt; który powstaje w kodzie?
Odpowiedź jest prosta. Można skorzystać w dowolnej techniki, np. &lt;strong&gt;BEM&lt;/strong&gt;.&lt;/p&gt;

&lt;h3 id=&quot;co-to-jest-bem&quot;&gt;Co to jest BEM?&lt;/h3&gt;

&lt;p&gt;Technika to metodyka, która charakteryzuje się tym trzema warstwami.
Jej nazwa pochodzi od słów: Block, Element, Modifier.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Block&lt;/strong&gt; - dla mnie jest to komponent - taki byt, który można wydzielić do
  osobnego pliku i używać w wielu miejscach. Przykład: &lt;code class=&quot;highlighter-rouge&quot;&gt;.person&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Element&lt;/strong&gt; - to dziecko komponentu. Przykład: &lt;code class=&quot;highlighter-rouge&quot;&gt;.person__title&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Modifier&lt;/strong&gt; - to po prostu cecha elementu, informująca o jego obecnym
  stanie. Przykład: &lt;code class=&quot;highlighter-rouge&quot;&gt;.person__title--active&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;-zalety-1&quot;&gt;&lt;i class=&quot;icon-good&quot;&gt;&lt;/i&gt; Zalety&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;ograniczona ilość zagłębień w preprocesorach, np. SASS - kod staje się
  dłuższy zamiast szerszy&lt;/li&gt;
  &lt;li&gt;istnieje konwencja nazewnictwa klas&lt;/li&gt;
  &lt;li&gt;rzadko kiedy można pogubić się w kodzie dużego projektu&lt;/li&gt;
  &lt;li&gt;kiedy spoglądam na klasę to wiem - na podstawie jej budowy - z czym mam do
  czynienia&lt;/li&gt;
  &lt;li&gt;zapewniony namespacing, tj. każdy “block” jest osobnym komponentem
  chyba, że używasz Angular-a, to nie jest to duży plus ze względu na
  &lt;a href=&quot;https://angular.io/docs/ts/latest/guide/component-styles.html&quot;&gt;Components Styles&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;-wady-1&quot;&gt;&lt;i class=&quot;icon-poor&quot;&gt;&lt;/i&gt; Wady&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;nie ma pełnej dowolność w nazewnictwie&lt;/li&gt;
  &lt;li&gt;liczba wartości w atrybucie &lt;code class=&quot;highlighter-rouge&quot;&gt;class&lt;/code&gt; w elementach HTML jest dosyć duża
  chyba, że używasz Angular-a i pluginu &lt;a href=&quot;https://github.com/tenphi/angular-bem&quot;&gt;angular-bem&lt;/a&gt;, który skróca zapis&lt;/li&gt;
&lt;/ul&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;h2 id=&quot;nie-samym-bemem-żyje-człowiek&quot;&gt;Nie samym BEMem żyje człowiek!&lt;/h2&gt;

&lt;p&gt;Nie jestem fanem BEMa. Szczerze, to napisałem w nim jeden projekt (góra dwa).
&lt;strong&gt;Zachęcam jednak do wykorzystania go&lt;/strong&gt;, aby na własnej skórze przekonać się
jak przedstawia się tworzenie layoutu.&lt;/p&gt;

&lt;p&gt;Przy nazewnictwie masz zestaw kilku reguł, które musisz przestrzegać. Czasami
zasady tylko przeszkadzają w wytwarzaniu oprogramowanie, ale w większości
dają on więcej plusów. Ważne jest, aby wybrać sobie dowolne reguły i ich
przestrzegać, co by się nie zaskakiwać 😄&lt;/p&gt;

&lt;p&gt;Inne znane metodyki wspomagające tworzenie CSS:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;OOCSS - &lt;strong&gt;O&lt;/strong&gt;bject &lt;strong&gt;O&lt;/strong&gt;riented &lt;strong&gt;CSS&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;ACSS - &lt;strong&gt;A&lt;/strong&gt;tomic &lt;strong&gt;CSS&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;oCSS - &lt;strong&gt;o&lt;/strong&gt;rganic &lt;strong&gt;C&lt;/strong&gt;ascade &lt;strong&gt;S&lt;/strong&gt;tyle &lt;strong&gt;S&lt;/strong&gt;heet&lt;/li&gt;
  &lt;li&gt;SMACSS - &lt;strong&gt;S&lt;/strong&gt;calable and &lt;strong&gt;M&lt;/strong&gt;odular &lt;strong&gt;A&lt;/strong&gt;rchitecture for &lt;strong&gt;CSS&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;!-- Resources --&gt;

</description>
            <pubDate>Thu, 11 May 2017 21:58:56 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2017/05/11/czym-jest-dla-mnie-bem.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2017/05/11/czym-jest-dla-mnie-bem.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/bem/bem.jpg</image>
        </item>
        
        <item>
            <title>WarsawJS Meetup #29</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Pierwsze w tym roku spotkanie WarsawJS! Fiu fiu! Ostatnio miałem przerwę w
pisaniu podsumowań ze spotkań warszawskiej społeczności JavaScript-owej.
Czas to nadrobić! Jestem w plecy o 5 spotkań, a żeby nadgonić to, co 4
artykuł będzie podsumowaniem ze spotkania. I tak, aż do wyrównania.
Potem pozwolę sobie na publikację raz na miesiąc, czyli z każdym tego typu
spotkaniem.&lt;/p&gt;

&lt;!-- &lt;figure&gt;
    &lt;a href=&quot;https://www.meetup.com/WarsawJS/&quot;&gt;
        &lt;img src=&quot;/assets/images/posts/post-banner-warsawjs.jpg&quot;
             alt=&quot;WarsawJS&quot;/&gt;
    &lt;/a&gt;
&lt;/figure&gt; --&gt;

&lt;h2 id=&quot;invitation&quot;&gt;Invitation&lt;/h2&gt;

&lt;p&gt;Jesteście świadkami mojego pierwszego nagrania zapowiedzi w zaciszu domowego
ogniska! Tak, dokładnie. Pomimo tego, że tło mi się zmienia, to materiał
nagrany był nocą (widać delikatne zmęczenie na twarzy).&lt;/p&gt;

&lt;p&gt;Zapowiedz zaczyna się podsumowaniem jak wyglądały spotkania (a raczej
prelegenci) z minionego roku. Kolejny rok comiesięcznych spotkań za nami. To
już kolejny rok. Czas leci. Fajnie!&lt;/p&gt;

&lt;p&gt;W materiale podziękowałem restauracji Państwomiasto za ponad 2-letnie
goszczenie nas w swojej lokalizacji. Będziemy zawsze ciepło wspominać naszą
pierwszą lokalizację. Dziękujemy 🎉&lt;/p&gt;

&lt;p&gt;Zapraszam w imieniu organizatorów WarsawJS.&lt;/p&gt;

&lt;div class=&quot;youtube-lazy&quot; data-youtube-id=&quot;_yAHR0siPQo&quot;&gt;&lt;/div&gt;

&lt;p class=&quot;chapter-break&quot;&gt;&amp;bull;&lt;/p&gt;

&lt;h2 id=&quot;talk-1-jak-stworzyć-prostą-grę-html5-w-4-lata-pl-andrzej-mazur&quot;&gt;Talk #1: Jak stworzyć prostą grę HTML5 w 4 lata [PL] &lt;small&gt;Andrzej Mazur&lt;/small&gt;&lt;/h2&gt;

&lt;p&gt;Podczas prelekcji Andrzeja mogliśmy dowiedzieć się jak wygląda jego historia
z tworzeniem gier w HTML5. Kilka lat temu powstał pomysł na grę Wizard Quest.
Pierwsze realizacje nei były udane i dopiero 4 lata później udało się
Andrzejowi skończyć. Po drodze zrealizował on 8 innych gier, które nauczyło
go lepszej tworzenie gier od strony developera, ale jak i od strony wydawcy.&lt;/p&gt;

&lt;p&gt;Na zakończenie dowiedzieliśmy o jednej ważnej zasadzie podczas tworzenia gier:
&lt;strong&gt;KISS (Keep It Simple, Stupid)&lt;/strong&gt;. Frazes oznacza, aby redukować liczbę
funkcjonalności gry do jak najmniejszym fragmentów.&lt;/p&gt;

&lt;p&gt;Andrzej jest założycielem meetupu &lt;a href=&quot;http://gamedevjs.com&quot;&gt;Gamedevjs&lt;/a&gt;,
na który - jako fan tworzenia gier - serdecznie zapraszam!&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Link do prelekcji: &lt;a href=&quot;https://www.youtube.com/watch?v=98jOICWu2Gw&quot;&gt;youtube.com/watch?v=98jOICWu2Gw&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;h2 id=&quot;talk-2-kontraktowanie-api-ze-swaggerem---korzyści-pl-piotr-błaszczak&quot;&gt;Talk #2: Kontraktowanie API ze Swagger’em - korzyści [PL] &lt;small&gt;Piotr Błaszczak&lt;/small&gt;&lt;/h2&gt;

&lt;p&gt;Swagger, czyli uzgadnianie API między front-endem oraz back-endem w
najpopularniejszym formacie definicji danych tj. w JSON.
Opisujemy zasoby HTTP wraz ze wspieranymi metodami np. GET, POST, PUT.&lt;/p&gt;

&lt;p&gt;Tematyka bardzo przyjemna, w sytuacji dużej aplikacji. Moim zdaniem to
jest jedyny typ aplikacji (tj. jego wielkość), ponieważ w mały projekcie
po prostu szkoda czasu na uzgadnianie z uwagi na szybką modyfikację kodu.&lt;/p&gt;

&lt;p&gt;Polecane przez Piotrka narzędzia:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://editor.swagger.io/&quot;&gt;swagger-editor&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/swagger-api/swagger-js&quot;&gt;swagger-js&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/swagger-api/swagger-ui&quot;&gt;swagger-ui&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/swagger-api/swagger-node&quot;&gt;swagger-node&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/swagger-api/swagger-parser&quot;&gt;swagger-parser&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/swagger-api/swagger-codegen&quot;&gt;swagger-codegen&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Świetne narzędzie do pracy, aby móc rozwijać back-end albo front-end
samodzielnie, tj. jedna strona nie musi czekać na drugą. Wystarczy stworzyć
plik z mockami.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Link do prelekcji: &lt;a href=&quot;https://www.youtube.com/watch?v=ZvLC-_VwxAg&quot;&gt;youtube.com/watch?v=ZvLC-_VwxAg&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;h2 id=&quot;talk-3-graficzny-edytor-grafu-z-wykorzystaniem-typescript--svg--d3js-en-marcin-pieciukiewicz&quot;&gt;Talk #3: Graficzny Edytor Grafu z wykorzystaniem TypeScript + SVG + D3.js [EN] &lt;small&gt;Marcin Pieciukiewicz&lt;/small&gt;&lt;/h2&gt;

&lt;p&gt;Podczas prelekcji dowiedzieliśmy jakich technologii Marcin użył do zbudowania
prostego edytora grafu. Zostały wymienione następujące technologie:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;TypeScript&lt;/li&gt;
  &lt;li&gt;D3.js&lt;/li&gt;
  &lt;li&gt;SVG&lt;/li&gt;
  &lt;li&gt;SCSS - jako preprocesor do CSS&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Aplikacja działająca dostępna jest tutaj: &lt;a href=&quot;http://marpiec.github.io/GraphEditor/&quot;&gt;marpiec.github.io/GraphEditor/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Największym plusem w tworzeniu takiej aplikacji było wykorzystanie
biblioteki D3.js, która zarządzała warstwą prezentacji.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Link do prelekcji: &lt;a href=&quot;https://www.youtube.com/watch?v=vHewTfzlGfo&quot;&gt;youtube.com/watch?v=vHewTfzlGfo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;h2 id=&quot;sponsorzy-spotkania&quot;&gt;Sponsorzy spotkania&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.facebook.com/10Clouds/&quot;&gt;10Clouds&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.facebook.com/artificialio/&quot;&gt;Artificial Labs&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.facebook.com/cyfrowypolsat/&quot;&gt;Cyfrowy Polsat&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.facebook.com/Daftcode/&quot;&gt;DaftCode&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.facebook.com/elpassion/&quot;&gt;EL Passion&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.facebook.com/softwarely/&quot;&gt;Softwarely&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;h2 id=&quot;podsumowanie&quot;&gt;Podsumowanie&lt;/h2&gt;

&lt;p&gt;Event oceniam bardzo dobrze. Cieszę się, że w taki sposób zaczęliśmy ten nowy
rok spotkań w nowej lokalizacji i w nowym - większym pomieszczeniu.&lt;/p&gt;

&lt;p&gt;Do zobaczenia na kolejnych spotkaniach WarsawJS Meetup!&lt;/p&gt;
</description>
            <pubDate>Tue, 09 May 2017 21:41:26 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2017/05/09/warsawjs-meetup-29.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2017/05/09/warsawjs-meetup-29.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/post-banner-warsawjs.jpg</image>
        </item>
        
        <item>
            <title>Jak przerobić stronę na Progressive Web App?</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Kilka dni temu postanowiłem, że spróbuję przerobić tego bloga na aplikacje typu
PWA (&lt;strong&gt;Progressive Web App&lt;/strong&gt;). Chciałbym w tym artykule opowiedzieć Ci co to
jest za typ aplikacji, opisać jego wady i zalety oraz przedstawić Ci jaką drogę
przeszedłem, aby ten blog stał się właśnie taką aplikacją.&lt;/p&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;h2 id=&quot;co-to-jest-pwa&quot;&gt;Co to jest PWA?&lt;/h2&gt;

&lt;p&gt;Aplikacja typu PWA charakteryzuje się tym, że spełnia zasady dostępności
oraz bezpieczeństwa oraz cechuje się takimi głównymi warunkami:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Wykorzystywanie &lt;strong&gt;protokółu HTTPS&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Serwowanie treści bez połączenia do sieci, tzw. &lt;strong&gt;obsługa trybu Offline&lt;/strong&gt;&lt;/p&gt;

    &lt;blockquote class=&quot;block-good&quot;&gt;
      &lt;h3 id=&quot;-wskazówka&quot;&gt;&lt;i class=&quot;icon-good&quot;&gt;&lt;/i&gt; Wskazówka&lt;/h3&gt;
      &lt;p&gt;Aby mieć “co” wyświetlać w trybie offline, trzeba na początku “to” mieć,
dlatego też aplikacja musiała być wcześniej uruchomiona normalnie,
aby pobrać treść.&lt;/p&gt;
    &lt;/blockquote&gt;
  &lt;/li&gt;
  &lt;li&gt;Dostosowanie się do szerokości urządzenia, tj. &lt;strong&gt;obsługa responsywności&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;div class=&quot;youtube-lazy&quot; data-youtube-id=&quot;uRCCcae6BdM&quot;&gt;&lt;/div&gt;

&lt;h3 id=&quot;pełna-checklista&quot;&gt;Pełna checklista&lt;/h3&gt;

&lt;p&gt;Aby zakwalifikować aplikację jako PWA, musi ona spełnić większość punktów
z  &lt;a href=&quot;https://developers.google.com/web/progressive-web-apps/checklist&quot;&gt;checklisty&lt;/a&gt;. Poprzez większość, mam na myśli spełnienie
warunków na &lt;strong&gt;poziomie 75%&lt;/strong&gt;. Liczba ta, zdefiniowana jest w specyfikacji
narzędzia &lt;a href=&quot;https://github.com/GoogleChrome/lighthouse&quot;&gt;Lighthouse&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;lighthouse&quot;&gt;Lighthouse&lt;/h2&gt;

&lt;p&gt;Lighthouse to narzędzie stworzone przez Google przeznaczone do audytu strony
internetowej, sprawdzając kilkadziesiąt warunków które musi ona spełniać
aby być zakwalifikowana jako aplikacja PWA.&lt;/p&gt;

&lt;p&gt;Kategorie audytu:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;i class=&quot;icon-good&quot;&gt;&lt;/i&gt; “Good” - Wynik zawiera się w przedziale &lt;strong&gt;75-100&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;&lt;i class=&quot;icon-average&quot;&gt;&lt;/i&gt; “Average” - Wynik zawiera się w przedziale &lt;strong&gt;45-74&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;&lt;i class=&quot;icon-poor&quot;&gt;&lt;/i&gt; “Poor” - Wynik poniżej &lt;strong&gt;&amp;lt; 45&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;przykładowe-aplikacje&quot;&gt;Przykładowe aplikacje&lt;/h2&gt;

&lt;p&gt;Lista przykładowych aplikacji PWA znajduje się &lt;a href=&quot;https://pwa.rocks/&quot;&gt;tutaj&lt;/a&gt;. Na szczególne
wyróżnienie zasługują:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.pokedex.org/&quot;&gt;pokedex.org/&lt;/a&gt; - &lt;a href=&quot;/blog/2015/01/19/narzedzia-swiata-pokemon-picker.html&quot;&gt;nie wiesz dlaczego?&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://m.aliexpress.com/&quot;&gt;m.aliexpress.com/&lt;/a&gt; - mobilna wersja popularnego sklepu&lt;/p&gt;

    &lt;p&gt;Efekt przejścia na PWA możesz zobaczyć &lt;a href=&quot;https://developers.google.com/web/showcase/2016/aliexpress&quot;&gt;tutaj&lt;/a&gt;. W krótkich słowach
  sklep zanotował wzrost o 104% tzw. współczynnika konwersji, badającego
  ile osób się zarejestrowało po kliknięciu w reklamę. Imponujące!&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://guitar-tuner.appspot.com/&quot;&gt;guitar-tuner.appspot.com/&lt;/a&gt; - nastrojenie gitary&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://2048-opera-pwa.surge.sh/&quot;&gt;2048-opera-pwa.surge.sh/&lt;/a&gt; - tej gry chyba nie trzeba przedstawiać&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote class=&quot;block-good&quot;&gt;
  &lt;h3 id=&quot;-wskazówka-1&quot;&gt;&lt;i class=&quot;icon-good&quot;&gt;&lt;/i&gt; Wskazówka&lt;/h3&gt;
  &lt;p&gt;Jak przerobisz swoją stronę na PWA to możesz zgłosić ją do tej listy tworząc
Pull Request w &lt;a href=&quot;https://github.com/pwarocks/pwa.rocks&quot;&gt;tym&lt;/a&gt; projekcie.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id=&quot;zaczynamy&quot;&gt;Zaczynamy!&lt;/h2&gt;

&lt;p&gt;Dobra, dosyć tej teorii!&lt;br /&gt;
Zacznijmy wreszcie przerabiać stronę internetową na aplikację PWA!&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/pwa/logo-pwa.jpg&quot; alt=&quot;Nieoficjalne logo PWA&quot; /&gt;
    &lt;figcaption&gt;
        Nieoficjalne
        &lt;a href=&quot;https://github.com/webmaxru/progressive-web-apps-logo&quot;&gt;
            logo
        &lt;/a&gt;
        Progressive Web Apps
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Wynik audytu mojego bloga przed zmianami wygląda następująco. Nie jest źle,
ale nie można powiedzieć, że strona w takim stanie jest aplikacją typu PWA.&lt;/p&gt;

&lt;figure class=&quot;with-border-image&quot;&gt;
    &lt;img src=&quot;/assets/images/posts/pwa/blog-50-on-100.png&quot; alt=&quot;Lighthouse: 50/100&quot; /&gt;
    &lt;figcaption&gt;
        Tak wygląda wynik pracy Lighthouse bez żadnych modyfikacji bloga.
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;krok-1-instalacja-wtyczki-lighthouse&quot;&gt;Krok 1. Instalacja wtyczki Lighthouse&lt;/h2&gt;

&lt;p&gt;Korzystając z Google Chrome zainstaluj wtyczkę &lt;mark&gt;Lighthouse&lt;/mark&gt;.&lt;br /&gt;
Możesz to zrobić na 2 sposoby:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;wejść stronę główną narzędzia, tj: &lt;a href=&quot;https://developers.google.com/web/tools/lighthouse/&quot;&gt;developers.google.com/web/tools/lighthouse/&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;albo wejść do &lt;a href=&quot;https://chrome.google.com/webstore/detail/lighthouse/blipmdconlkpinefehnmjammfjpmpbjk?hl=pl&quot;&gt;sklepu&lt;/a&gt; i ją zainstalować.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Rekomenduję pierwszy sposób z uwagi na to, że na stronie domowej tego
narzędzia jest o nim wiele ciekawych informacji.&lt;/em&gt;&lt;/p&gt;

&lt;h2 id=&quot;krok-2-zapoznanie-się-z-przewodnikiem&quot;&gt;Krok 2. Zapoznanie się z przewodnikiem&lt;/h2&gt;

&lt;p&gt;Google jako autorzy pomysłu aplikacji PWA przygotowali pewnego rodzaju
zadanie - przewodnik, które pokazuje jak krok po kroku dodać do prościutkiej
aplikacji podstawowe elementy tak, aby stała się ona &lt;a href=&quot;https://en.wikipedia.org/wiki/Progressive_web_app&quot;&gt;Progressive Web App&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Zanim zabierzesz się za modyfikacje swojej aplikacji spróbuj przejść przez
&lt;a href=&quot;https://codelabs.developers.google.com/codelabs/add-to-home-screen/&quot;&gt;ten przewodnik&lt;/a&gt;. Masz na to 30 minut. &lt;strong&gt;Czas start!&lt;/strong&gt;&lt;/p&gt;

&lt;h2 id=&quot;krok-3-dodanie-manifest-u&quot;&gt;Krok 3. Dodanie manifest-u&lt;/h2&gt;

&lt;p&gt;Kolejne kroki opierają się na modyfikacji kodu źródłowego aplikacji.&lt;/p&gt;

&lt;h3 id=&quot;krok-31-stworzenie-pliku-manifestjson&quot;&gt;Krok 3.1. Stworzenie pliku &lt;code class=&quot;highlighter-rouge&quot;&gt;/manifest.json&lt;/code&gt;&lt;/h3&gt;

&lt;p&gt;Pierwszą rzeczą jaką trzeba dodać do projektu jest &lt;code class=&quot;highlighter-rouge&quot;&gt;manifest.json&lt;/code&gt;.
Plik ten opisuje aplikację poprzez definicję m.in. jej nazwy oraz ikonek w
różnych rozmiarach.&lt;/p&gt;

&lt;blockquote class=&quot;block-good&quot;&gt;
  &lt;h3 id=&quot;-dobra-rada&quot;&gt;&lt;i class=&quot;icon-good&quot;&gt;&lt;/i&gt; Dobra rada&lt;/h3&gt;
  &lt;p&gt;Dobrą praktyką jest, aby ten plik był w katalogu głównym projektu (&lt;code class=&quot;highlighter-rouge&quot;&gt;/&lt;/code&gt;).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Zawartość pliku &lt;code class=&quot;highlighter-rouge&quot;&gt;manifest.json&lt;/code&gt; przed uzupełnieniem. Skopiuj ten kawałek
kodu i uzupełnij wpisując dane odpowiednie dla Twojej aplikacji.&lt;/p&gt;

&lt;div class=&quot;language-json highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;short_name&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;icons&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
            &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;src&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
            &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;sizes&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;144x144&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
            &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;image/png&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
            &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;src&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
            &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;sizes&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;192x192&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
            &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;image/png&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;],&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;start_url&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;/?utm_source=homescreen&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;background_color&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;theme_color&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;display&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;fullscreen&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Zobacz jak wygląda &lt;a href=&quot;https://piecioshka.pl/manifest.json&quot;&gt;manifest.json&lt;/a&gt;
dla tego bloga.&lt;/p&gt;

&lt;h3 id=&quot;krok-32-wskazanie-ścieżki-w-pliku-indexhtml&quot;&gt;Krok 3.2. Wskazanie ścieżki w pliku &lt;code class=&quot;highlighter-rouge&quot;&gt;/index.html&lt;/code&gt;&lt;/h3&gt;

&lt;p&gt;Po tym jak plik został stworzony, musisz poinformować przeglądarkę, gdzie
on się znajduje. Mówiłem, że nie musi to być katalog główny,
jednak dla spójności warto aby był.&lt;/p&gt;

&lt;p&gt;Poniższą linijkę dodaj w sekcji &lt;code class=&quot;highlighter-rouge&quot;&gt;&amp;lt;head&amp;gt;&lt;/code&gt; aktualizując ścieżkę do manifestu.&lt;/p&gt;

&lt;div class=&quot;language-html highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;link&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;rel=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;manifest&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;href=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;/manifest.json&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;krok-4-dodanie-service-workera&quot;&gt;Krok 4. Dodanie Service Workera&lt;/h2&gt;

&lt;p&gt;Drugim bardzo ważnym składnikiem aplikacji PWA jest &lt;a href=&quot;https://developers.google.com/web/fundamentals/getting-started/primers/service-workers&quot;&gt;Service Worker&lt;/a&gt;, który
odpowiedzialny jest za zapisywanie plików aplikacji do &lt;code class=&quot;highlighter-rouge&quot;&gt;Cache Storage&lt;/code&gt;-a.&lt;/p&gt;

&lt;p&gt;Kiedy plik został pobrany przez przeglądarkę, to Service Worker zapisuje go do
cache-a, aby w przyszłości wykorzystać, kiedy użytkownik nie będzie miał
połączenia z siecią.&lt;/p&gt;

&lt;p&gt;Przyjęta przeze mnie strategia nazywa się &lt;mark&gt;Network falling back to
cache&lt;/mark&gt;, która zdefiniowana jest &lt;a href=&quot;https://developers.google.com/web/fundamentals/instant-and-offline/offline-cookbook/#network-falling-back-to-cache&quot;&gt;tutaj&lt;/a&gt;. Strategia ta polecana jest
przez autora posta - &lt;a href=&quot;https://twitter.com/jaffathecake&quot;&gt;Jake&lt;/a&gt;-a - jako najlepsza do stron zawierających
artykuły, czyli pięknie pasuje do aplikacji blogowej.&lt;/p&gt;

&lt;h3 id=&quot;zasady-strategii-network-falling-back-to-cache&quot;&gt;Zasady strategii &lt;code class=&quot;highlighter-rouge&quot;&gt;Network falling back to cache&lt;/code&gt;&lt;/h3&gt;

&lt;ol&gt;
  &lt;li&gt;Pobierz plik z serwera i jeśli się uda to zapisz do cache-a.&lt;/li&gt;
  &lt;li&gt;Jeśli próba pobrania pliku się nie powiedzie to spróbuj pobrać go z cache-a.&lt;/li&gt;
  &lt;li&gt;Jeśli i ta próba się nie powiedzie, to dopiero wtedy użytkownik nie
 dostanie żądanej treści.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3 id=&quot;-plusy&quot;&gt;&lt;i class=&quot;icon-good icon-plus&quot;&gt;&lt;/i&gt; Plusy&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;użytkownik ma większą szansę, że otrzyma to o co prosi ponieważ jest
  stworzony fallback zapytania HTTP na cache&lt;/li&gt;
  &lt;li&gt;użytkownik zawsze dostaje najnowsze wersje plików (prosto z serwera) jeśli
  ma połączenie z internetem&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;-minusy&quot;&gt;&lt;i class=&quot;icon-poor icon-minus&quot;&gt;&lt;/i&gt; Minusy&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;na początku zawsze jest zapytanie do serwera, które może trwać kilka sekund&lt;/li&gt;
  &lt;li&gt;użytkownik nie dostaje treści zapisane w cache-u pomimo tego, że ją posiada&lt;/li&gt;
&lt;/ul&gt;

&lt;figure class=&quot;with-border-image&quot;&gt;
    &lt;img src=&quot;/assets/images/posts/pwa/network-falling-back-to-cache.png&quot; alt=&quot;Diagram prezentujący przedstawione rozwiązanie z cache-em&quot; /&gt;
    &lt;figcaption&gt;
        Jak wygląda działania Service Workera w połączeniu z CacheStorage-em?&lt;br /&gt;
        Copyright by Google @ 2017
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h3 id=&quot;do-kiedy-ważne-są-pliki-w-cache-u&quot;&gt;Do kiedy ważne są pliki w cache-u?&lt;/h3&gt;

&lt;p&gt;Nie zdefiniowałem, żadnego limitu cache-a. Traktuję go jako fallback, czyli
takie dobro, które benefitem dla czytelników bloga.&lt;/p&gt;

&lt;h3 id=&quot;ile-jest-miejsca-w-cache-u&quot;&gt;Ile jest miejsca w cache-u?&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Chrome - &amp;lt; 6% wolnego miejsca na dysku&lt;/li&gt;
  &lt;li&gt;Firefox - &amp;lt; 10% wolnego miejsca na dysku&lt;/li&gt;
  &lt;li&gt;Safari - &amp;lt; 50MB&lt;/li&gt;
  &lt;li&gt;IE10 - &amp;lt; 250MB&lt;/li&gt;
  &lt;li&gt;Edge - &lt;a href=&quot;https://docs.microsoft.com/en-us/microsoft-edge/dev-guide/storage/IndexedDB&quot;&gt;w zależności od dysku&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;krok-41-stworzenie-pliku-service-workerjs&quot;&gt;Krok 4.1. Stworzenie pliku &lt;code class=&quot;highlighter-rouge&quot;&gt;/service-worker.js&lt;/code&gt;&lt;/h3&gt;

&lt;p&gt;Stwórz plik &lt;code class=&quot;highlighter-rouge&quot;&gt;service-worker.js&lt;/code&gt; o następującej treści. Oczywiście zaktualizuj
listę plików, które chcesz aby były zapamiętane przez przeglądarkę użytkownika.&lt;/p&gt;

&lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;CACHE_NAME&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'wpisz-tutaj-dowolny-string'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;// List of files which are store in cache.&lt;/span&gt;
&lt;span class=&quot;kd&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;filesToCache&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;
    &lt;span class=&quot;s1&quot;&gt;'/'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;s1&quot;&gt;'/styles/main.css'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;s1&quot;&gt;'/images/logo.png'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;s1&quot;&gt;'/scripts/main.js'&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;];&lt;/span&gt;

&lt;span class=&quot;nb&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;addEventListener&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'install'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;evt&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;evt&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;waitUntil&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
        &lt;span class=&quot;nx&quot;&gt;caches&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;open&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;CACHE_NAME&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;then&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;cache&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;cache&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;addAll&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;filesToCache&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;}).&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;catch&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;err&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;c1&quot;&gt;// Snooze errors...&lt;/span&gt;
            &lt;span class=&quot;c1&quot;&gt;// console.error(err);&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;})&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;});&lt;/span&gt;

&lt;span class=&quot;nb&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;addEventListener&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'fetch'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;evt&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;// Snooze logs...&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;// console.log(event.request.url);&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;evt&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;respondWith&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
        &lt;span class=&quot;c1&quot;&gt;// Firstly, send request..&lt;/span&gt;
        &lt;span class=&quot;nx&quot;&gt;fetch&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;evt&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;catch&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;c1&quot;&gt;// When request failed, return file from cache...&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;caches&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;match&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;evt&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;})&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Zobacz jak plik &lt;a href=&quot;https://piecioshka.pl/service-worker.js&quot;&gt;service-worker.js&lt;/a&gt;
wygląda na blogu.&lt;/p&gt;

&lt;h3 id=&quot;krok-42-dołączenie-go-w-indexhtml&quot;&gt;Krok 4.2. Dołączenie go w &lt;code class=&quot;highlighter-rouge&quot;&gt;/index.html&lt;/code&gt;&lt;/h3&gt;

&lt;p&gt;Proponuję dodać go do pliku głównego pliku, który na pewno będzie w cache-u
więc pomimo tego, że nie będzie połączenia to i tak Service Worker uruchomi się.&lt;/p&gt;

&lt;div class=&quot;language-html highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
&lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;PATH&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'/service-worker.js'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;kd&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;isServiceWorkersSupport&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'serviceWorker'&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;navigator&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;isServiceWorkersSupport&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'Will service worker register?'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;nb&quot;&gt;navigator&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;serviceWorker&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;register&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;PATH&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;then&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;nx&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;Yes it did.&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}).&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;catch&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;err&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;nx&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;No it didn't. This happened: &quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;err&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;});&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Po dodaniu manifestu oraz Service Workera uruchomiłem Lighthouse, aby
zobaczyć o ile procent blog stał się bardziej aplikacją typu PWA.
Zaskoczyłem się pozytywnie. Wystarczy dodanie dwóch prostych plików
i już &lt;strong&gt;moja strona internetowa stała się aplikacją typu PWA&lt;/strong&gt;!&lt;/p&gt;

&lt;figure class=&quot;with-border-image&quot;&gt;
    &lt;img src=&quot;/assets/images/posts/pwa/blog-86-on-100.png&quot; alt=&quot;Lighthouse: 86/100&quot; /&gt;
    &lt;figcaption&gt;
        Tak wygląda wynik pracy Lighthouse po dodaniu manifestu oraz Service
        Workera.
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;krok-5-inne-opcje&quot;&gt;Krok 5. Inne opcje&lt;/h2&gt;

&lt;p&gt;Dodanie manifestu oraz Service Workera nie spowodowało, że blog osiągnął
wynik 100/100 w audycie przeprowadzonym przez narzędzie Lighthouse.&lt;/p&gt;

&lt;p&gt;Musiałem jeszcze zrobić kilka rzeczy.&lt;/p&gt;

&lt;h3 id=&quot;krok-51-kolor-górnego-paska&quot;&gt;Krok 5.1. Kolor górnego paska&lt;/h3&gt;

&lt;p&gt;Lighthouse wymienił, że w aplikacji brakuje zdefiniowanego koloru paska z
adresem do strony. Nie mam żadnego telefonu z Androidem, aby sprawdzić jak
strona wygląda na tym systemie. Wybrałem kolor górnego kontenera i użyłem go
do definicji tego parametru.&lt;/p&gt;

&lt;div class=&quot;language-html highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;meta&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;theme-color&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;content=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;#96b3bc&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;krok-52-kolor-tekstu---odpowiedni-kontrast&quot;&gt;Krok 5.2. Kolor tekstu - odpowiedni kontrast&lt;/h3&gt;

&lt;p&gt;Kolejnym problemem, był niepoprawny kontrast między kolorem tła a kolorem
tekstu. Wiadomo, że szary tekst na białym tle wygląda strasznie. Całe
szczęście znam ten problem i staram się, aby tekst zawsze dobrze się prezentował.&lt;/p&gt;

&lt;p&gt;Jednak nie wszystkie elementy strony były przystosowane i współczynnik
kolorystyczny nie był akceptowalny.&lt;/p&gt;

&lt;p&gt;Lighthouse korzysta z algorytmu zdefiniowanego przez &lt;a href=&quot;https://twitter.com/LeaVerou&quot;&gt;Lea Verou&lt;/a&gt; w projekcie
&lt;a href=&quot;http://leaverou.github.io/contrast-ratio/&quot;&gt;contrast-ratio&lt;/a&gt;. Świetny projekt, który pokazuje jaki jest stosunek
kolorystyczny tła oraz fontu.&lt;/p&gt;

&lt;blockquote class=&quot;block-good&quot;&gt;
  &lt;h3 id=&quot;-dobra-rada-1&quot;&gt;&lt;i class=&quot;icon-good&quot;&gt;&lt;/i&gt; Dobra rada&lt;/h3&gt;
  &lt;p&gt;Na filmie poniżej znajdziesz więcej informacji na temat &lt;mark&gt;Web Content
Accessibility Guidelines (WCAG) 2.0&lt;/mark&gt;. Film opublikowany w piątek, 5 maja.&lt;/p&gt;
  &lt;div class=&quot;youtube-lazy&quot; data-youtube-id=&quot;LBmLspdAtxM&quot;&gt;&lt;/div&gt;
&lt;/blockquote&gt;

&lt;p&gt;Lighthouse zakłada, że kontrast między tłem i kolorem tekstu musi być większy
od przyjętej normy przez “contrast-ratio”, czyli 4.5. Niestety więc, musiałem
zmienić błękit tła kontenera nagłówkowego na ciemniejszy niebieski.&lt;/p&gt;

&lt;p&gt;Zdefiniowałem kolor tła na &lt;code class=&quot;highlighter-rouge&quot;&gt;#2A7DB3&lt;/code&gt; oraz tekstu &lt;code class=&quot;highlighter-rouge&quot;&gt;white&lt;/code&gt;.
Aplikacja “contrast-ratio” pokazała, że wynik takiej pary to 4.5,
jednak Lighthouse dalej krzyczało.&lt;/p&gt;

&lt;figure class=&quot;with-border-image&quot;&gt;
    &lt;img src=&quot;/assets/images/posts/pwa/color-contrast-good-rate-4.5.png&quot; alt=&quot;Ocena 4.5 w badaniu kontrastu&quot; /&gt;
    &lt;figcaption&gt;
        Wynik narzędzia doa badania kontrastu.
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Ustawiłem więc jeszcze ciemniejszy background. Tym razem na &lt;code class=&quot;highlighter-rouge&quot;&gt;#2a6fa5&lt;/code&gt;.
Koloru fontu nie zmieniałem, czyli dalej jest &lt;code class=&quot;highlighter-rouge&quot;&gt;white&lt;/code&gt;.
Tym razem ocena 5.4 &lt;i class=&quot;icon-good&quot;&gt;&lt;/i&gt;&lt;/p&gt;

&lt;p&gt;To było na tyle, jeśli chodzi o kolory. Lighthouse zaakceptował taki stan
rzeczy!&lt;/p&gt;

&lt;h3 id=&quot;krok-53-opóźnij-ładowanie-skryptów&quot;&gt;Krok 5.3. Opóźnij ładowanie skryptów&lt;/h3&gt;

&lt;p&gt;Wykorzystałem atrybut &lt;code class=&quot;highlighter-rouge&quot;&gt;async&lt;/code&gt; w tagu &lt;code class=&quot;highlighter-rouge&quot;&gt;&amp;lt;script&amp;gt;&lt;/code&gt; to tego, aby nie blokować
rysowania layoutu poprzez ładowane skrypty, które i tak nie inicjowały żadnej
zmiany w DOM-ie.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Czas na testy!&lt;/strong&gt;&lt;/p&gt;

&lt;figure class=&quot;with-border-image&quot;&gt;
    &lt;img src=&quot;/assets/images/posts/pwa/blog-98-on-100.png&quot; alt=&quot;Lighthouse: 98/100&quot; /&gt;
    &lt;figcaption&gt;
        Tak wygląda wynik pracy Lighthouse po wprowadzeniu wszystkich
        opisanych ulepszeń.
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;dlaczego-nie-100100&quot;&gt;Dlaczego nie 100/100?&lt;/h2&gt;

&lt;p&gt;Brak paginacji, czego efektem jest długa lista postów na stronie głównej.
Nie chcę robić paginacji, z tego powodu, że na 1 stronie mogę znaleźć
wszystkie napisane przeze mnie artykuły. Uważam to za duży plus mojego bloga.&lt;/p&gt;

&lt;figure class=&quot;with-border-image&quot;&gt;
    &lt;img src=&quot;/assets/images/posts/pwa/blog-main-problem.png&quot; alt=&quot;Największy problem&quot; /&gt;
    &lt;figcaption&gt;
        Problem, który nie został jeszcze rozwiązany.
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;To, że strona nie jest dostępna po upływie 50ms tylko po 120ms nie wydaje mi
się dużym problemem. Może na komórkach czeka się trochę dłużej na załadowanie
tej długiej listy, ale trudno.&lt;/p&gt;

&lt;p&gt;Profil wybranego przeze mnie losowego postu jest oceniany przez Lighthouse
100/100, więc &lt;strong&gt;misję uważam za zakończoną z pełnym sukcesem&lt;/strong&gt; 🎉&lt;/p&gt;

&lt;figure class=&quot;with-border-image&quot;&gt;
    &lt;img src=&quot;/assets/images/posts/pwa/blog-post-100-on-100.png&quot; alt=&quot;Lighthouse: 100/100&quot; /&gt;
    &lt;figcaption&gt;
        Profil pierwszego lepszego postu jest oceniony przez Lighthouse-a
        maksymalną oceną, co mnie osobiście niezmiernie cieszy.
        Człowiek, zawsze czuje się spełniony, kiedy widzi, że osiągnął szczyt!
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;a-co-ze-stroną-domową&quot;&gt;A co ze stroną domową?&lt;/h2&gt;

&lt;p&gt;Przerabiając bloga na aplikację typu PWA postanowiłem, że i moja strona domowa,
również powinna być progresywna. &lt;strong&gt;Jej też się coś od życia należy&lt;/strong&gt; 😄&lt;/p&gt;

&lt;p&gt;Wykorzystując moje obecne doświadczenie, to po kilkudziesięciu minutowej
pracy, strona domowa jest w 100% &lt;a href=&quot;https://twitter.com/search?f=tweets&amp;amp;q=%23pwa&amp;amp;src=typd&quot;&gt;#PWA&lt;/a&gt;. Efekt możesz zobaczyć na obrazku
poniżej.&lt;/p&gt;

&lt;figure class=&quot;with-border-image&quot;&gt;
    &lt;img src=&quot;/assets/images/posts/pwa/homepage-100-on-100.png&quot; alt=&quot;Lighthouse: 100/100&quot; /&gt;
    &lt;figcaption&gt;
        Najlepszy możliwy wynik - 100%.
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;h2 id=&quot;jak-wyświetlić-aplikacje-pwa-które-już-odwiedziłem&quot;&gt;Jak wyświetlić aplikacje PWA które już odwiedziłem?&lt;/h2&gt;

&lt;p&gt;Na zakończenie pokażę Ci jak wyświetlić wszystkie strony które odwiedziłeś,
a który korzystają z Service Worker-ów. Prawdopodobnie te strony są
aplikacjami typu &lt;strong&gt;PWA&lt;/strong&gt;.&lt;/p&gt;

&lt;div class=&quot;youtube-lazy&quot; data-youtube-id=&quot;HuYSvcPY5HQ&quot;&gt;&lt;/div&gt;

&lt;h2 id=&quot;źródła&quot;&gt;Źródła&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.udacity.com/course/intro-to-progressive-web-apps--ud811&quot;&gt;udacity.com/course/intro-to-progressive-web-apps–ud811&lt;/a&gt; -
  darmowy kurs pt. “Intro to Progressive Web Apps” by Google&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://jakearchibald.com/2014/offline-cookbook/&quot;&gt;jakearchibald.com/2014/offline-cookbook/&lt;/a&gt; - olbrzymi artykuł o
  trybie Offline, pt: “The offline cookbook” (oryginał &lt;a href=&quot;https://developers.google.com/web/fundamentals/instant-and-offline/offline-cookbook/#network-falling-back-to-cache&quot;&gt;tego&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://medium.com/@addyosmani/progressive-web-apps-with-react-js-part-i-introduction-50679aef2b12&quot;&gt;medium.com/@addyosmani/progressive-web-apps-with-react-js-part-i-introduction-50679aef2b12&lt;/a&gt; -
  artykuł o PWA by &lt;a href=&quot;https://twitter.com/addyosmani&quot;&gt;Addy Osmani&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/webpack/webpack-pwa&quot;&gt;github.com/webpack/webpack-pwa&lt;/a&gt; - plugin do Webpacka, który
  dodaje 2 wymagane pliki (manifest oraz Service Worker) do aplikacji
  na nim opartej&lt;/li&gt;
&lt;/ul&gt;

&lt;!-- Resources --&gt;

</description>
            <pubDate>Sun, 07 May 2017 10:00:00 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2017/05/07/jak-przerobic-strone-na-pwa.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2017/05/07/jak-przerobic-strone-na-pwa.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/pwa/logo-pwa.jpg</image>
        </item>
        
        <item>
            <title>Narzędzia Świata: webpack-unused</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Kilka miesięcy temu, nagrałem film o takim narzędziu, które pokazuje listę
plików nieużywanych w projekcie opartym na Webpacku.  Przyszła pora,
aby opisać to narzędzie w serii &lt;a href=&quot;/tag/narzedzia-swiata/&quot;&gt;“Narzędzia Świata”&lt;/a&gt;.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/post-banner-narzedzia-swiata-webpack-unused.png&quot; itemprop=&quot;image&quot; alt=&quot;Baner promujący artykuł&quot; /&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;webpack---a-co-to&quot;&gt;&lt;a href=&quot;https://webpack.js.org/&quot;&gt;Webpack&lt;/a&gt; - a co to?&lt;/h2&gt;

&lt;p&gt;W erze zmieniających się co kilka tygodni narzędzi JavaScript-owych od kilku
miesięcy pojawił się lider w kategorii budowania aplikacji.&lt;/p&gt;

&lt;p&gt;Webpack to narzędzie, które buduje pliki “produkcyjne” na podstawie plików
developerskich. Jego podstawowe cechy to:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;minifikacja kodu&lt;/strong&gt;, tj. usuwanie komentarzy (w trybie produkcyjnym)&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;obfuskacja zmiennych&lt;/strong&gt;, tj. skracanie nazw do literowych (w trybie
  produkcyjnym)&lt;/li&gt;
  &lt;li&gt;daje możliwość &lt;strong&gt;łatwej transpilacji kodu&lt;/strong&gt;, np. z kody pisanego w TypeScript
  do prostego JavaScript-u w standardzie ECMAScript 5&lt;/li&gt;
  &lt;li&gt;daje możliwość &lt;strong&gt;łatwej konfiguracji preprocesorów&lt;/strong&gt; do CSS-ów.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;moje-projekty&quot;&gt;Moje projekty&lt;/h2&gt;

&lt;p&gt;Jestem autorem kilku projektów pomocniczych:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/piecioshka/boilerplate-babel-webpack&quot;&gt;github.com/piecioshka/boilerplate-babel-webpack&lt;/a&gt; - jeśli chcesz
  zacząć kodować w ES2015 bez spędzania czasu na konfiguracji zerknij na
  ten projekt&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/piecioshka/test-typescript-webpack&quot;&gt;github.com/piecioshka/test-typescript-webpack&lt;/a&gt; - projekt, w
  którym skonfigurowałem Webpacka do tego, aby pisać aplikację w TypeScript&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/piecioshka/test-flowtype-webpack&quot;&gt;github.com/piecioshka/test-flowtype-webpack&lt;/a&gt; - testowy projekt,
  w którym został skonfigurowany &lt;a href=&quot;https://flow.org/&quot;&gt;FlowType&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/piecioshka/training-resolve-webpack-build-error&quot;&gt;github.com/piecioshka/training-resolve-webpack-build-error&lt;/a&gt; -
  zagadka do rozwiązania&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;nudny-artykuł-zobacz-film&quot;&gt;Nudny artykuł, zobacz film!&lt;/h2&gt;

&lt;p&gt;Jeśli nie chce Ci się czytać, ani testować nowego narzędzia, możesz poświęcić
&lt;strong&gt;niecałe 4 minuty&lt;/strong&gt; zobaczyć jak ja wykorzystuję “webpack-unused” w nowo
stworzonym projekcie.&lt;/p&gt;

&lt;div class=&quot;youtube-lazy&quot; data-youtube-id=&quot;8nCz0bHS980&quot;&gt;&lt;/div&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;h2 id=&quot;jak-działa-webpack-unused&quot;&gt;Jak działa &lt;a href=&quot;https://github.com/latentflip/webpack-unused&quot;&gt;webpack-unused&lt;/a&gt;?&lt;/h2&gt;

&lt;h3 id=&quot;krok-1-stworzenie-projektu&quot;&gt;Krok 1. Stworzenie projektu&lt;/h3&gt;

&lt;p&gt;&lt;kbd&gt;Copy + paste&lt;/kbd&gt;&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;mkdir &lt;/span&gt;test-project
&lt;span class=&quot;nb&quot;&gt;cd&lt;/span&gt; &lt;span class=&quot;nv&quot;&gt;$_&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;mkdir &lt;/span&gt;src/
&lt;span class=&quot;nb&quot;&gt;touch &lt;/span&gt;src/main.js
&lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;console.log('main.js')&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; src/main.js
&lt;span class=&quot;nb&quot;&gt;touch &lt;/span&gt;src/unused.js
&lt;span class=&quot;nb&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;console.log('unused.js')&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt; src/main.js
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;krok-2-budowanie-projektu&quot;&gt;Krok 2. Budowanie projektu&lt;/h3&gt;

&lt;p&gt;&lt;kbd&gt;Copy + paste&lt;/kbd&gt;&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;touch &lt;/span&gt;package.json
vi package.json
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Zawartość pliku &lt;code class=&quot;highlighter-rouge&quot;&gt;package.json&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&quot;language-json highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;test-project&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;scripts&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;build&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;webpack&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;krok-3-konfiguracja-webpacka&quot;&gt;Krok 3. Konfiguracja Webpacka&lt;/h3&gt;

&lt;p&gt;&lt;kbd&gt;Copy + paste&lt;/kbd&gt;&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;touch &lt;/span&gt;webpack.config.js
vi webpack.config.js
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Zawartość pliku &lt;code class=&quot;highlighter-rouge&quot;&gt;webpack.config.js&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nx&quot;&gt;module&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;exports&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;entry&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;./src/main.js&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;output&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;filename&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;./bundle.js&quot;&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;krok-4-instalacja-i-uruchomienie-webpacka&quot;&gt;Krok 4. Instalacja i uruchomienie Webpacka&lt;/h3&gt;

&lt;p&gt;&lt;kbd&gt;Copy + paste&lt;/kbd&gt;&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;npm &lt;span class=&quot;nb&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--save-dev&lt;/span&gt; webpack
npm run build
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Aplikacja powinna zostać pomyślnie zbudowana, tj. powinien powstać plik
&lt;code class=&quot;highlighter-rouge&quot;&gt;bundle.js&lt;/code&gt; w głównym katalogu.&lt;/p&gt;

&lt;h3 id=&quot;krok-5-instalacja-i-uruchomienie-webpacka-unused&quot;&gt;Krok 5. Instalacja i uruchomienie &lt;code class=&quot;highlighter-rouge&quot;&gt;webpacka-unused&lt;/code&gt;&lt;/h3&gt;

&lt;p&gt;Zainstaluj globalnie &lt;code class=&quot;highlighter-rouge&quot;&gt;webpack-unused&lt;/code&gt;, ponieważ nie jest to narzędzie
związane z żadnym projektem, więc nie ma argumentu, aby tego nie zrobić.&lt;/p&gt;

&lt;p&gt;&lt;kbd&gt;Copy + paste&lt;/kbd&gt;&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;npm &lt;span class=&quot;nb&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-g&lt;/span&gt; webpack-unused
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Dodaj zadanie, które będzie budowało aplikację i uruchamiać dzisiejsze
narzędzie:&lt;/p&gt;

&lt;p&gt;&lt;kbd&gt;Copy + paste&lt;/kbd&gt;&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;vi package.json
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class=&quot;language-json highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;name&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;test-project&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;scripts&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;build&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;webpack&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;build:display-unused-files&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;w&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s2&quot;&gt;&quot;webpack --json | webpack-unused&quot;&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;w&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Uruchom polecenie, które zbuduje aplikację, a wynik z procesu budowania
przekaże do omawianego narzędzia:&lt;/p&gt;

&lt;p&gt;&lt;kbd&gt;Copy + paste&lt;/kbd&gt;&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;npm run build:display-unused-files
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Polecenie wyświetli &lt;strong&gt;listę plików, które nie są używane&lt;/strong&gt;:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;./src/unused.js
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;!-- Resources --&gt;

</description>
            <pubDate>Fri, 05 May 2017 21:58:35 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2017/05/05/narzedzia-swiata-webpack-unused.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2017/05/05/narzedzia-swiata-webpack-unused.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/post-banner-narzedzia-swiata-webpack-unused.png</image>
        </item>
        
        <item>
            <title>Chroń pliki konfiguracyjne projektu</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Chciałem dać Ci dziś poradę, która jest wynikiem mojego wczorajszego
rekonesansu tego bloga za pomocą najpopularniejszego narzędzia w
dobie wszechogarniającego internetu tj. przeglądarki.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/protect-your-configs/protect-your-configs-526x275.jpg&quot; itemprop=&quot;image&quot; alt=&quot;Baner promujący artykuł&quot; /&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;rekonesans&quot;&gt;Rekonesans&lt;/h2&gt;

&lt;p&gt;…czyli rozpoznanie. Po przeczytaniu &lt;a href=&quot;https://sekurak.pl/nmap-w-akcji-przykladowy-test-bezpieczenstwa/&quot;&gt;pewnego&lt;/a&gt; artykułu o bezpieczeństwie,
postanowiłem sprawdzić jak wygląda na tym tle &lt;strong&gt;moja najpopularniejsza
aplikacja&lt;/strong&gt;.&lt;/p&gt;

&lt;h2 id=&quot;testy&quot;&gt;Testy&lt;/h2&gt;

&lt;p&gt;Rekonesans polega na zebraniu jak największej liczby informacji, które
aplikacja (albo server) udostępnia. Dlatego bardzo ważne jest, aby wysyłać
użytkownikom, czyli de facto &lt;em&gt;światu zewnętrznemu&lt;/em&gt; jak najmniej informacji, co
by nie informować wszystkich o podatnościach &lt;a href=&quot;https://pl.wikipedia.org/wiki/System_informatyczny&quot;&gt;systemu informatycznego&lt;/a&gt;.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;h3 id=&quot;definicja&quot;&gt;Definicja&lt;/h3&gt;
  &lt;p&gt;Metoda określająca zbieranie danych na temat “celu” na podstawie
udostępnianych informacji nazywa się &lt;em&gt;banner grabbing&lt;/em&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Zadałem sobie pytanie: &lt;strong&gt;co ja udostępniam światu? czy nie za dużo?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Pierwsze testy wykazały, że popełniłem niesamowity błąd, do którego chcę
Ci się przyznać, abyś to wykorzystał i nauczył się na moim błędzie.&lt;/p&gt;

&lt;h2 id=&quot;zagrożenie&quot;&gt;Zagrożenie&lt;/h2&gt;

&lt;p&gt;W lutych &lt;a href=&quot;/blog/2017/02/15/struktura-katalogow-w-projekcie-front-endowym.html&quot;&gt;napisałem&lt;/a&gt;, że projekt nie równa się aplikacji. Miałem rację.
Nic się w tym aspekcie nie zmieniło, ale chyba dopiero do mnie coś dotarło…&lt;/p&gt;

&lt;p class=&quot;center-text&quot;&gt;
    &lt;strong&gt;
        Czy wrażliwe pliki projektu nie są &quot;przypadkiem&quot; widoczne w aplikacji
        udostępnionej na świat?
    &lt;/strong&gt;
&lt;/p&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;h2 id=&quot;jekyll-i-jego-zasady&quot;&gt;Jekyll i jego zasady&lt;/h2&gt;

&lt;p&gt;Jeśli używasz tego popularnego systemu do blogowania &lt;a href=&quot;/blog/2015/06/28/jak-zalozyc-bloga-korzystajac-z-jekyll.html&quot;&gt;tak jak ja&lt;/a&gt;, to
świetnie, tylko &lt;strong&gt;pamiętaj o wykluczeniu listy plików&lt;/strong&gt; z budowania
katalogu &lt;code class=&quot;highlighter-rouge&quot;&gt;_site&lt;/code&gt;, który zostanie wystawiony na zewnątrz!&lt;/p&gt;

&lt;blockquote class=&quot;block-good&quot;&gt;
  &lt;h3 id=&quot;-wskazówka&quot;&gt;&lt;i class=&quot;icon-good&quot;&gt;&lt;/i&gt; Wskazówka&lt;/h3&gt;
  &lt;p&gt;&lt;a href=&quot;https://jekyllrb.com/docs/configuration/&quot;&gt;Tutaj&lt;/a&gt; możesz poczytać o opcji &lt;code class=&quot;highlighter-rouge&quot;&gt;exclude&lt;/code&gt;.&lt;br /&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;W konfiguracji, ista wykluczonych plików z budowania paczki zawierała tylko
jedną pozycję - &lt;strong&gt;katalog &lt;code class=&quot;highlighter-rouge&quot;&gt;node_modules/&lt;/code&gt;&lt;/strong&gt;. A co z resztą?&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://piecioshka.pl/webpack.config.js&quot;&gt;webpack.config.js&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://piecioshka.pl/package.json&quot;&gt;package.json&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://piecioshka.pl/README.md&quot;&gt;README.md&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;itd&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Wyżej wymienione pliki (oraz inne) były udostępnione na zewnątrz, były
dostępne dla internetu.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Na ten moment, opublikowane wrażliwe pliki już nie istnieją i zwracają kod
&lt;a href=&quot;https://http-codes.pl/404&quot;&gt;HTTP 404&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;kbd&gt;Copy + paste&lt;/kbd&gt;&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;curl &lt;span class=&quot;nt&quot;&gt;-I&lt;/span&gt; https://piecioshka.pl/webpack.config.js
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class=&quot;language-text highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;HTTP/1.1 404 Not Found
Date: Wed, 03 May 2017 21:04:06 GMT
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;niby-nic-strasznego-ale&quot;&gt;Niby nic strasznego, ale…&lt;/h2&gt;

&lt;p&gt;Tworząc projekt bloga, specjalnie nie chciałem upubliczniać jego kodu
źródłowego z powodów bezpieczeństwa, tj. mam w tym projekcie pliki, które nie
powinny być publicznie dostępne. Jakie to pliki? Nie ważne.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Sądziłem, że prywatne repo na GitHubie załatwia sprawę. Myliłem się.&lt;br /&gt;
Ważna jest również dystrybucja projektu z &lt;a href=&quot;https://pl.wikipedia.org/wiki/Zamkni%C4%99te_oprogramowanie&quot;&gt;zamkniętymi źródłami&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;h2 id=&quot;metoda-głębokiego-ukrycia&quot;&gt;Metoda &lt;a href=&quot;https://pl.wikipedia.org/wiki/G%C5%82%C4%99bokie_ukrycie&quot;&gt;głębokiego ukrycia&lt;/a&gt;&lt;/h2&gt;

&lt;p&gt;Istnieje pewna metoda, która &lt;a href=&quot;https://niebezpiecznik.pl/post/glebokie-ukrycie-danych-w-pko-bp/&quot;&gt;niby zabezpiecza&lt;/a&gt; dostęp do Twoim plików,
tj. metoda “głębokiego ukrycia”, czyli stworzenia skomplikowanej struktury
katalogów, aby istniejące w nich pliki, nie były dostępne poprzez przypadkowe
wpisanie adresu URL.&lt;/p&gt;

&lt;p&gt;W moim przypadku technika ta, powinna nazywać się “płytkie ukrycie”, bo na
samym wierzchu &lt;strong&gt;udostępniałem konfigurację aplikacji&lt;/strong&gt;.&lt;/p&gt;

&lt;h2 id=&quot;co-chronić&quot;&gt;Co chronić?&lt;/h2&gt;

&lt;p&gt;Zamieszczam przykładową listę plików, które nie powinny ujrzeć świata
dziennego w projekcie, którego źródła nie są otwarte:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;.angular-cli.json&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;.babelrc&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;.gitignore&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;.gitattributes&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;.npmignore&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;.eslintignore&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;.travis.yml&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;.editorconfig&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;Gemfile&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;Gemfile.lock&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;app.json&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;nodemon.json&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;jasmine.json&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;bower.json&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;package.json&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;yarn.lock&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;tsconfig.json&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;tslint.json&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;typings.json&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;CHANGELOG.md&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;README.md&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;protractor.conf.js&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;karma.conf.js&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;webpack.config.js&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;wallaby.js&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Oraz katalogów:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;.git/&lt;/code&gt; - udostępnienie tego katalogu równoznaczne jest z pokazaniem całych
  źródeł aplikacji
    &lt;ul&gt;
      &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;.git/index&lt;/code&gt; - aby sprawdzić, czy katalog &lt;code class=&quot;highlighter-rouge&quot;&gt;.git&lt;/code&gt; faktycznie jest
  widoczny, weryfikacja, czy katalog istnieje, może skończyć
  niepowodzeniem, z powodu wyłączonego listowania katalogu.&lt;/li&gt;
    &lt;/ul&gt;

    &lt;p&gt;Na potrzeby testów sklonowałem projekt &lt;a href=&quot;https://github.com/piecioshka/warsawjs-workshop-2-blog&quot;&gt;warsawjs-workshop-2-blog&lt;/a&gt; do
  głównego katalogu. Sprawdź, co się kryje pod tym URLem:
  &lt;a href=&quot;https://piecioshka.pl/warsawjs-workshop-2-blog/.git/index&quot;&gt;piecioshka.pl/warsawjs-workshop-2-blog/.git/index&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;node_modules/&lt;/code&gt; - zależności projektu&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;test/&lt;/code&gt; - testy jednostkowe, integracyjne etc&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ze swojego doświadczenie dodam, że gdy “bundlujesz” pliki CSS i JavaScript do
jednego (kilku?) master plików, to nie ma sensu udostępniać źródeł dla
publiczności, dlatego warto np. dopisać do listy plików wykluczonych np.
takie ścieżki:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;assets/scripts/&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;assets/styles/&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;!-- Resources --&gt;

</description>
            <pubDate>Wed, 03 May 2017 21:57:59 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2017/05/03/chron-pliki-konfiguracyjne-projektu.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2017/05/03/chron-pliki-konfiguracyjne-projektu.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/protect-your-configs/protect-your-configs-526x275.jpg</image>
        </item>
        
        <item>
            <title>Dlaczego wybrałem VPS?</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Zawsze chciałem mieć pełną kontrolę nad serwerami na których trzymałem swoje
projekty. Niestety, ale hostingi których używałem “od zawsze” nie dają takiej
możliwości.&lt;/p&gt;

&lt;p&gt;Zwykły hosting daje warstwę abstrakcji nad usługami, które serwują pliki.
Mamy już preinstalowany web-serwer, interpreter PHP, bazę MySQL i inne (narzędzia
mało przydatne dla Frontend Developera). &lt;strong&gt;Tym samym nie mamy dużych możliwości
konfiguracyjnych, ze względu na brak uprawnień.&lt;/strong&gt;&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/ovh-vps/scheme.png&quot; alt=&quot;&quot; /&gt;
    &lt;figcaption&gt;
        Relacja między internautą, a VPS-em wraz z przykładową konfiguracją
        domeny wykupionej w Nazwa oraz serwera w OVH.
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;żegnaj-nazwa-witaj-ovh&quot;&gt;Żegnaj &lt;mark&gt;Nazwa&lt;/mark&gt;, witaj &lt;mark&gt;OVH&lt;/mark&gt;!&lt;/h2&gt;

&lt;p&gt;Na &lt;a href=&quot;https://www.nazwa.pl/&quot;&gt;nazwa.pl&lt;/a&gt; miałem wykupiony hosting, którego przedłużenie liczyło się
z dużymi kosztami. Postanowiłem zrezygnować z tej usługi na rzecz innego
providera. &lt;strong&gt;Polska firma straciła wieloletniego klienta.&lt;/strong&gt; Niestety, ale
moja świadomość urosła do tego, że wcale nie muszę korzystać z tego &lt;a href=&quot;http://www.wirtualnemedia.pl/artykul/wielka-awaria-nazwa-pl-wscieklosc-klientow-i-reklamy-home-pl&quot;&gt;jakże
reklamowanego hostingu&lt;/a&gt;, aby być tak samo (a nawet bardziej) zadowolony.&lt;/p&gt;

&lt;p&gt;Słyszałem od obecnych użytkowników OVH, że za tyle pieniędzy ile płaciłem za
hosting w Nazwa.pl, mogę sobie kupić usługę VPS.&lt;/p&gt;

&lt;blockquote class=&quot;block-good&quot; id=&quot;testimonial&quot;&gt;
  &lt;h3 id=&quot;-testimonial&quot;&gt;&lt;i class=&quot;icon-good&quot;&gt;&lt;/i&gt; Testimonial&lt;/h3&gt;
  &lt;p&gt;Dzięki OVH mam swój serwer, na którym mogę zrobić to, co na lokalnej maszynie.
Prosta konfiguracja serwera VPS sprawiła, że już &lt;strong&gt;nigdy nie wrócę do
hostingu&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id=&quot;czym-jest-usługa-vps&quot;&gt;Czym jest usługa &lt;code class=&quot;highlighter-rouge&quot;&gt;VPS&lt;/code&gt;?&lt;/h2&gt;

&lt;p&gt;&lt;a href=&quot;https://pl.wikipedia.org/wiki/Virtual_Private_Server&quot;&gt;VPS&lt;/a&gt; (&lt;strong&gt;Virtual Private Server&lt;/strong&gt;) to maszyna typu serwer,
która podzielona jest na kilka mniejszych środowisk. Do każdego środowiska
możemy przypisać inne dane dostępowe. Tym samym, na jednej maszynie jest
możliwość obsługi kilku klientów (właścicieli wirtualnych maszyn).&lt;/p&gt;

&lt;p&gt;I ja jestem jednym z tych właścicieli. Mam możliwość instalacji dowolnego
systemu operacyjnego (z predefiniowanej listy). Po jego instalacji mogę
zrobić z systemem co zechcę, ponieważ jestem w posiadaniu konta &lt;a href=&quot;https://pl.wikipedia.org/wiki/Root&quot;&gt;root&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;zaparkowanie-domeny&quot;&gt;Zaparkowanie domeny&lt;/h2&gt;

&lt;p&gt;Aby internauci nie musieli wpisywać adresu IP naszego serwera wykorzystuje
się łatwe do zapamiętania nazwy, czyli “domeny”.&lt;/p&gt;

&lt;p&gt;Co zrobić, aby użytkownicy mogli wykorzystywać dobrodziejstwa domen?&lt;/p&gt;

&lt;p&gt;Posiadacze domen muszą “zaparkować”, ją na jakimś serwerze typu &lt;a href=&quot;https://en.wikipedia.org/wiki/Name_server&quot;&gt;Name Server&lt;/a&gt;
za pomocą protokołu &lt;a href=&quot;https://pl.wikipedia.org/wiki/Domain_Name_System&quot;&gt;DNS&lt;/a&gt; (&lt;strong&gt;Domain Name Server&lt;/strong&gt;).&lt;/p&gt;

&lt;p&gt;Korzystając z Nazwa miałem domeny zaparkowane na ich serwerze.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Termin “zaparkowanie domeny” w skrócie oznacza skonfigurowanie dla domeny
dwóch serwerów, które troszczą się o przekierowanie użytkownika na właściwy
webserwer.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Pierwszy z nich jest właściwy, drugi zapasowy i wykorzystany w
sytuacji, gdyby ten pierwszy nie był w stanie spełniać swojej roli.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/ovh-vps/dns-advanced.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;figcaption&gt;
        Konfiguracja domeny &lt;strong&gt;piecioshka.pl&lt;/strong&gt;, której przypisane
        są serwery DNS. W moim przypadku wykorzystuję usługę
        &lt;a href=&quot;https://www.cloudflare.com/&quot;&gt;CloudFlare&lt;/a&gt;, aby
        wytrzymać ruch generowany przez czytelników mojego bloga.
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;instalacja-środowiska&quot;&gt;Instalacja środowiska&lt;/h2&gt;

&lt;p&gt;Aby wydłużyć trochę artykuł dodam jeszcze parę zdań o tym, jak odnaleźć się w
tej nowej rzeczywistości.&lt;/p&gt;

&lt;h3 id=&quot;system-operacyjny&quot;&gt;System operacyjny&lt;/h3&gt;

&lt;p&gt;OVH daje możliwość zdefiniowania jakiego systemu operacyjnego będziemy używali.
Polecam wybór &lt;a href=&quot;https://pl.wikipedia.org/wiki/Ubuntu&quot;&gt;Ubuntu&lt;/a&gt; ze względu na:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;największą liczbę paczek możliwych do instalacji&lt;/li&gt;
  &lt;li&gt;niezliczoną liczbę artykułów i tutoriali jak coś zrobić&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Po instalacji zalecam aktualizację paczek, ze względu:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;dodanie łatek bezpieczeństwa&lt;/li&gt;
  &lt;li&gt;nowości w programach&lt;/li&gt;
  &lt;li&gt;wdrożenie optymalizacji wydajnościowych&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Aby to zrobić należy wykonać polecenia:&lt;/p&gt;

&lt;p&gt;&lt;kbd&gt;Copy + paste&lt;/kbd&gt;&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;apt-get update
apt-get upgrade
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;nowy-użytkownik&quot;&gt;Nowy użytkownik&lt;/h3&gt;

&lt;p&gt;Nowy system nie posiada użytkownika domowego (ma tylko &lt;code class=&quot;highlighter-rouge&quot;&gt;root&lt;/code&gt;-a).
Dlatego też trzeba stworzyć konto z którego będziemy korzystali na co dzień.
Aby to zrobić należy wydać polecenie:&lt;/p&gt;

&lt;p&gt;&lt;kbd&gt;Copy + paste&lt;/kbd&gt;&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;adduser &lt;span class=&quot;nt&quot;&gt;--home&lt;/span&gt; /home/piecioshka piecioshka
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;gdzie:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;--home&lt;/code&gt; to opcja określająca katalog domowy dla nowo stworzonego użytkownika&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;/home/piecioshka&lt;/code&gt; to ścieżka do katalogu domowego&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;piecioshka&lt;/code&gt; określa nazwę użytkownika&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;konfiguracja&quot;&gt;Konfiguracja&lt;/h3&gt;

&lt;p&gt;Nie chcę opisywać tutaj konfiguracji podstawowych narzędzi zainstalowanych
na nowych systemie (choćby z uwagi na bezpieczeństwo).&lt;/p&gt;

&lt;p&gt;Jako użytkownika linux-a poradzisz sobie bez problemu z instalacją.
Masz teraz po prostu czysty system, który konfigurujesz według
własnych wymagań.&lt;/p&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;h2 id=&quot;ejj-czytelniku&quot;&gt;Ejj czytelniku!&lt;/h2&gt;

&lt;p&gt;Jak Ci się podoba taki DevOps-owy temat? To, że jesteśmy front-endowcami, to
wcale nie znaczy, że “klepiemy stronki” i nie potrafimy zbudować środowiska
do naszych projektów!&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Uważam, że każdy developer (na odpowiednim poziomie) powinien wiedzieć jak
działa internet, aby móc pokazywać aplikacje których jest autorem swoim
klientom.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;!-- Resources --&gt;

</description>
            <pubDate>Mon, 01 May 2017 20:39:18 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2017/05/01/dlaczego-wybralem-vps.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2017/05/01/dlaczego-wybralem-vps.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/ovh-vps/vps-526x275.jpg</image>
        </item>
        
        <item>
            <title>Dziewczyny też piszą w JavaScript! O girls.js słów kilka</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Jakiś czas temu, na &lt;a href=&quot;http://warsawjs.com/&quot;&gt;warszawskiej scenie&lt;/a&gt; pojawiła się nowa organizacja
&lt;a href=&quot;http://www.girlsjs.pl/&quot;&gt;girls.js&lt;/a&gt;,  której przyświeca jeden cel - &lt;strong&gt;zmotywować dziewczyny, aby
nauczyły się języka JavaScript&lt;/strong&gt;. Jako organizator &lt;a href=&quot;/blog/2017/04/23/warsawjs-workshop-5.html&quot;&gt;WarsawJS&lt;/a&gt; jestem
zwolennikiem tworzenia organizacji mających na celu aktywizację wszelkiej
społeczności programistycznej. Tym bardziej jeśli ta organizacja mieści się
w stolicy naszego kraju!&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/girlsjs/girlsjs-300x300.png&quot; alt=&quot;&quot; /&gt;
    &lt;figcaption&gt;
        Logiem organizacji girls.js jest kaczuszka! Ale dlaczego?
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;o-co-chodzi&quot;&gt;O co chodzi&lt;/h2&gt;

&lt;p&gt;Sprawa wygląda następująco. Chciałabyś spróbować swoich sił z programowaniem?
Jeśli tak, to zapisujesz się na warsztaty. Przychodzisz na wydarzenie.
Organizatorzy zadbają o to, żebyś czuła się komfortowo. Trenerzy spróbują
nauczyć Cię programowania w JavaScript opierając się na
przygotowanych &lt;a href=&quot;https://girlsjs.github.io/kurs/slides/&quot;&gt;slajdach&lt;/a&gt;.&lt;/p&gt;

&lt;iframe src=&quot;https://player.vimeo.com/video/196253981?byline=0&amp;amp;portrait=0&quot; width=&quot;700&quot; height=&quot;394&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;

&lt;h2 id=&quot;jak-się-zapisać&quot;&gt;Jak się zapisać?&lt;/h2&gt;

&lt;p&gt;Zapisać się może każda dziewczyna, która chciałaby się nauczyć programowania.
Kolejna (już druga) edycja będzie miała miejsce 9-10 czerwca (tego roku).&lt;/p&gt;

&lt;p&gt;Zapisy potrwają do 14 maja, także droga czytelniczko &lt;strong&gt;spiesz się!&lt;/strong&gt;
Aby się zapisywać wystarczy wypełnić &lt;a href=&quot;https://docs.google.com/forms/d/e/1FAIpQLScHCQTU6fST2JKLv7lidPcmoOqWufcvp9grEfIXOjdBCNpBZg/viewform&quot;&gt;ten&lt;/a&gt; formularz. Tym samym wysyłasz
swoje zgłoszenie, które kilka dni przed wydarzeniem będzie brało u dział w
selekcji. Oznacza to, że pomimo tego, że wypełnisz formularz możesz się nie
dostać, bo liczba miejsc jest ograniczona.&lt;/p&gt;

&lt;h2 id=&quot;ile-trzeba-zapłacić&quot;&gt;Ile trzeba zapłacić?&lt;/h2&gt;

&lt;p&gt;Szkolenia są darmowe. Organizatorzy dają szansę uczestniczkom na SPRÓBOWANIE,
czy programowanie ich pociąga, czy się w nim odnajdują.&lt;/p&gt;

&lt;p&gt;Więc kto ponosi koszty za salę, ewentualny katering i inne?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;girls.js&lt;/strong&gt; współpracują z kilkoma firmami, które zajmują się tym tematem.
Organizatorzy nic nie muszą “wykładać” ze swojej kieszeni. Firmy partnerskie
mają za to możliwość prezentacji swoich ofert pracy itp.&lt;/p&gt;

&lt;h2 id=&quot;kto-jest-za-to-odpowiedzialny&quot;&gt;Kto jest za to odpowiedzialny?&lt;/h2&gt;

&lt;p&gt;Ósemka organizatorów, którzy też są trenerami.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Panie Maria, Magda, Daria, Basia, Ola oraz panowie Michał, Kacper, Paweł,
Piotr i Artur. Robicie dobrą robotę - mam nadzieje, że warsztaty będą
częściej!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;W imieniu organizatorów, zapraszam na &lt;a href=&quot;https://www.facebook.com/girlsjs/&quot;&gt;fanpage&lt;/a&gt;-a, na którym bardzo często
pojawia się aktualizacja o tym co słychać w organizacji itd.&lt;/p&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;h2 id=&quot;dlaczego-logiem-girlsjs-jest-kaczuszka&quot;&gt;Dlaczego logiem &lt;code class=&quot;highlighter-rouge&quot;&gt;girls.js&lt;/code&gt; jest kaczuszka?&lt;/h2&gt;

&lt;p&gt;To dobre pytanie! Podczas programowania, często przychodzi taki moment, że
nie wiemy jak poradzić sobie z problemem. Należy wtedy odpocząć i wrócić do
problemu za jakiś czas. Dlaczego?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mózg nie jest kreatywny - “zafiksowaliśmy się” na problemie.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Trzeba dać trochę odpocząć naszym szarym komórkom. Jest jeszcze jeden pomysł,
na rozwiązanie tej sytuacji, tzn. &lt;a href=&quot;https://www.zenhub.com/blog/why-rubber-duck-debugging-is-the-best-way-to-debug-your-code/&quot;&gt;metoda żółtej kaczuszki&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;Praktyka ta polega na wykorzystaniu dowolnego przedmiotu (np. kaczuszki) albo
obcej osoby, której opowiesz o problemie. Podczas tego opowiadania, będziesz
mieć możliwość przyjrzenia się problemowi z innej strony. Od strony tzw.
odbiorcy.&lt;/p&gt;

&lt;p&gt;Często taka sytuacja daje do myślenia: dlaczego taki problem chcę rozwiązać w
ten sposób, a nie w zupełnie inny? Tutaj pojawia się białe światło w tunelu,
które naprowadza nas na wyjście z problemu. Extra!&lt;/p&gt;

&lt;!-- Resources --&gt;

</description>
            <pubDate>Sat, 29 Apr 2017 15:36:20 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2017/04/29/girlsjs.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2017/04/29/girlsjs.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/girlsjs/girlsjs-526x275.png</image>
        </item>
        
        <item>
            <title>Słownik do WebStorma</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Korzystam z WebStorm już około &lt;code class=&quot;highlighter-rouge&quot;&gt;3 lata&lt;/code&gt;. Jestem MEGA zadowolony z tej decyzji
którą podjąłem kilka lat temu aby podziękować Eclipse-owi za wiele lat
współpracy.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/webstorm/webstorm-526x275.jpg&quot; itemprop=&quot;image&quot; alt=&quot;Baner promujący artykuł&quot; /&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;błędy&quot;&gt;Błędy?&lt;/h2&gt;

&lt;p&gt;Cenię sobie WebStorm-a za to, że zawsze (kiedy to tylko możliwe) podpowiada
mi, że zastosowana konstrukcja w kodzie jest nieprawidłowa.&lt;/p&gt;

&lt;p&gt;Wydaje się, że wtedy programista staje się lepszy, bo pisze kod wolny od
prostych błędów składniowych “and so on”. Gdyby ktoś nie wiedział, że
przesiadłem się na WebStorma mógłby w ten sposób sądzić. Czy jestem teraz
lepszym programistą?&lt;/p&gt;

&lt;p&gt;Nie. Jestem bardziej dokładny (nie popełniasz literówek).&lt;/p&gt;

&lt;p&gt;Ale to zasługa edytora WebStorm, który na każdym kroku daje znać, że coś nie
halo. Kolejny krok jest po stronie programisty, który musi podjąć wyzwania i
nauczyć się tych sygnałów, aby nie zignorować cennego komunikatu.&lt;/p&gt;

&lt;h2 id=&quot;błąd-który-jest-w-każdym-polskim-projekcie&quot;&gt;Błąd, który jest w każdym polskim projekcie&lt;/h2&gt;

&lt;p&gt;Co łączy wszystkie projekty pisane przez polaków? Polskie wyrazy.
To jest pierwsze miejsce, na które WebStorm zwraca uwagę.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/webstorm/underline.png&quot; alt=&quot;&quot; /&gt;
    &lt;figcaption&gt;
        Nieznajomość polskich słów przyczyną najpopularniejszych błędów.
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Niby nic, zwykły kod, a jednak jak przyjrzyj się dobrze. Zobaczysz, że
edytor podkreślił niezrozumiałe słowa. Jak się pozbyć takiego problemu?&lt;/p&gt;

&lt;h2 id=&quot;słowniki&quot;&gt;Słowniki&lt;/h2&gt;

&lt;p&gt;Jakiś czas temu poprosiłem mojego kolegę o wygenerowanie słownika polskich
wyrazów. Nie pamiętam dokładnie jak on to zrobił, ale prawdopodobnie
wykorzystał do tego celu narzędzie &lt;code class=&quot;highlighter-rouge&quot;&gt;aspell&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Zbudowany słownik zajmuje około &lt;strong&gt;50MB&lt;/strong&gt;. Zawiera ogromną liczbę wyrazów,
która wynosi dokładnie &lt;strong&gt;3 669 299&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Jakiś czas temu sam zrobiłem słownik, ale języka angielskiego. Ze względu na
to, że nie wiem jak wygenerować słownik podobnego rozmiaru co polski to nowy
słownik waży około &lt;strong&gt;1.1 MB&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Niestety ale wygenerowany przeze mnie słownik nie zawiera wielu wyrazów, bo
zawiera tylko &lt;strong&gt;123 093&lt;/strong&gt; linijek. Każda linijka to jeden wyraz.&lt;/p&gt;

&lt;p&gt;Przynajmniej mam teraz słownik języka angielskiego.&lt;/p&gt;

&lt;h2 id=&quot;pobieramy-słowniki&quot;&gt;Pobieramy słowniki&lt;/h2&gt;

&lt;p&gt;Stworzyłem projekt na &lt;a href=&quot;https://github.com/piecioshka/dicts&quot;&gt;GitHubie&lt;/a&gt;, aby każdy mógł skorzystać z tychże
słowników ile tylko chce. Link do projektu:
&lt;a href=&quot;https://github.com/piecioshka/dicts&quot;&gt;github.com/piecioshka/dicts&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Oczywiście jednym z powodów dla których opublikowałem ten słownik jest
community, które może dorzucić od siebie swoje trzy grosze, czyli np. kolejny
słownik.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Rekomenduję sklonować repozytorium do swojego workspace-a. Katalog zostanie
wykorzystany podczas dodawania katalogu ze słownikami do WebStorma.&lt;/p&gt;

&lt;h2 id=&quot;nauczmy-webstorma-czegoś-nowego&quot;&gt;Nauczmy WebStorma czegoś nowego!&lt;/h2&gt;

&lt;p&gt;Omawiany przeze mnie edytor jest super elastyczny. Jednym z ciekawych rzeczy
jest nauczenie edytora rozumienia słów z języka obcego.&lt;/p&gt;

&lt;p&gt;Aby nauczyć WebStorma języka polskiego należy wejść w:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;File&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;Settings&lt;/code&gt; (a najlepiej &lt;code class=&quot;highlighter-rouge&quot;&gt;Default Settings&lt;/code&gt;)&lt;/li&gt;
  &lt;li&gt;Po lewej stronie wybieramy &lt;code class=&quot;highlighter-rouge&quot;&gt;Editor&lt;/code&gt;.&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;Spelling&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;Przechodzimy na zakładkę &lt;code class=&quot;highlighter-rouge&quot;&gt;Dictionaries&lt;/code&gt;.&lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Wybieramy katalog, który będzie zawierał pliki z rozszerzeniem &lt;code class=&quot;highlighter-rouge&quot;&gt;*.dic&lt;/code&gt;.&lt;/p&gt;

    &lt;p&gt;Jeśli zastosowałeś się do mojej rekomendacji, to wybierz katalog
 &lt;code class=&quot;highlighter-rouge&quot;&gt;~/workspace/dics&lt;/code&gt;.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;Zatwierdzamy wybór kolejno &lt;code class=&quot;highlighter-rouge&quot;&gt;Apply&lt;/code&gt; i &lt;code class=&quot;highlighter-rouge&quot;&gt;OK&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Teraz w zależności od wielkości projektu (liczby plików), WebStorm będzie
potrzebował chwilkę czasu, aby zweryfikować pliki jeszcze raz, ponieważ
może edytor teraz zrozumiał już nieznane słowo i nie musi już go podkreślać.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/webstorm/not-underline.png&quot; alt=&quot;&quot; /&gt;
    &lt;figcaption&gt;
        Nieznajomość polskich słów została usunięta.
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;p&gt;Po publikacji tego artykułu, zgłosił się do mnie kolega, który podesłał mi
link do opisu &lt;mark&gt;jak wygenerować słownik&lt;/mark&gt;. Jeśli drogi czytelniku
byłbyś zainteresowany, jak zbudować słownik, np. języka rosyjskiego to
kliknij &lt;a href=&quot;http://stackoverflow.com/questions/1949976/where-to-find-dictionaries-for-other-languages-for-intellij&quot;&gt;tutaj&lt;/a&gt;.&lt;/p&gt;

&lt;!-- Resources --&gt;

</description>
            <pubDate>Thu, 27 Apr 2017 21:13:16 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2017/04/27/slownik-do-webstorma.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2017/04/27/slownik-do-webstorma.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/webstorm/webstorm-526x275.jpg</image>
        </item>
        
        <item>
            <title>Jak zbudować plik PDF na podstawie pliku tekstowego w formacie Markdown?</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Chciałbym w tym artykule przedstawić Ci w jaki sposób przetworzyć plik w
formacie Markdown do formatu PDF. Wykorzystamy do tego paczkę w &lt;a href=&quot;https://www.npmjs.com/&quot;&gt;npm&lt;/a&gt;
&lt;a href=&quot;https://www.npmjs.com/package/markdown-pdf&quot;&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;markdown-pdf&lt;/code&gt;&lt;/a&gt;, która wykona za nas “czarną robotę”.&lt;/p&gt;

&lt;h2 id=&quot;co-jest-markdown&quot;&gt;Co jest “Markdown”?&lt;/h2&gt;

&lt;p&gt;Markdown to sposób formatowania pliku tekstowego. Każdy tekst, czy to
notatka, czy książka, jest w jakiś sposób “sformatowana” (ułożona).&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/markdown/markdown.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;figcaption&gt;
        Oficjalne logo. Źródło:
        &lt;a href=&quot;https://pl.wikipedia.org/wiki/Markdown&quot;&gt;
            https://pl.wikipedia.org/wiki/Markdown
        &lt;/a&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Można zdefiniować kilka typów wyróżnień tekstu:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;nagłówek&lt;/li&gt;
  &lt;li&gt;paragraf&lt;/li&gt;
  &lt;li&gt;link&lt;/li&gt;
  &lt;li&gt;pogrubiony tekst&lt;/li&gt;
  &lt;li&gt;kod źródłowy&lt;/li&gt;
  &lt;li&gt;itd.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Za pomocą składni Markdown-a zdefiniowanie powyższych (jak i innych)
wyróżnień jest bardzo proste i intuicyjne. Przykład:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;## To jest nagłówek&lt;/code&gt; - nagłówek&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;Dowolny ciąg literek&lt;/code&gt; - paragraf&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;[tekst](http://example.org/)&lt;/code&gt; - link&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;to jest **pogrubiony** tekst&lt;/code&gt; - pogrubiony tekst&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;Definicja zmiennej &quot;a&quot;: `let a = 2`&lt;/code&gt; - kod źródłowy (tryb: inline)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Obecnie jest to najpopularniejszy format do tworzenia dokumentacji tekstowej.
Rozszerzenie plików w formacie Markdown to &lt;code class=&quot;highlighter-rouge&quot;&gt;*.md&lt;/code&gt;. Więcej o składni możesz
przeczytać &lt;a href=&quot;http://daringfireball.net/projects/markdown/&quot;&gt;tutaj&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id=&quot;-zalety&quot;&gt;&lt;i class=&quot;icon-good&quot;&gt;&lt;/i&gt; Zalety&lt;/h3&gt;

&lt;p&gt;Przedstawię kilka zalet tego formatu:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Notatki lub też inne dokumenty są szybciej przeze wytwarzane w sposób
 nadający się do prezentacji innym osobom, ze względu na zachowanie
 formatowania.&lt;/li&gt;
  &lt;li&gt;Tworzenie artykułów nie jest uciążliwe. Przykładem niech będzie ten post,
 który stworzony jest w formacie Markdown. Pisanie w HTMLu wymuszało na
 mnie pisanie znaczników, które często były przeze mnie modyfikowane. Tym
 samym zabierało mi to czas, który mogłem poświęcić na części merytorycznej.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3 id=&quot;-wady&quot;&gt;&lt;i class=&quot;icon-poor&quot;&gt;&lt;/i&gt; Wady&lt;/h3&gt;

&lt;p&gt;Nie znam żadnych wad. Dla mnie jest to format &lt;strong&gt;idealny&lt;/strong&gt; ✨&lt;/p&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;h2 id=&quot;krok-po-kroku-&quot;&gt;Krok po kroku 👣&lt;/h2&gt;

&lt;p&gt;A teraz postaram się pokazać Ci co po kolei należy zrobić, aby móc szybko
budować pliki PDF.&lt;/p&gt;

&lt;h3 id=&quot;1-instalacja-narzędzia-markdown-pdf&quot;&gt;1. Instalacja narzędzia &lt;code class=&quot;highlighter-rouge&quot;&gt;markdown-pdf&lt;/code&gt;&lt;/h3&gt;

&lt;p&gt;Zainstaluj narzędzie w projekcie, w którym chcesz budować pliki PDF na
podstawie plików w formacie Markdown. Możesz to zrobić za pomocą polecenia:&lt;/p&gt;

&lt;p&gt;&lt;kbd&gt;Copy + paste&lt;/kbd&gt;&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;npm &lt;span class=&quot;nb&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;--save-dev&lt;/span&gt; markdown-pdf
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Chyba, że chcesz wykorzystywać narzędzie bez powiązania z konkretnym
projektem, wtedy należy zainstalować narzędzie globalnie:&lt;/p&gt;

&lt;p&gt;&lt;kbd&gt;Copy + paste&lt;/kbd&gt;&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;npm &lt;span class=&quot;nb&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-g&lt;/span&gt; markdown-pdf
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;2-stworzenie-skryptu&quot;&gt;2. Stworzenie skryptu&lt;/h3&gt;

&lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;// build.js&lt;/span&gt;
&lt;span class=&quot;kd&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;markdownpdf&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'markdown-pdf'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

&lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;INPUT&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'path/to/file.md'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;OUTPUT&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'path/to/file.pdf'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;nx&quot;&gt;markdownpdf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;concat&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;paths&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;([&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;INPUT&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;to&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;OUTPUT&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;nx&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'Created'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;OUTPUT&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;3-stworzenie-pliku-filemd&quot;&gt;3. Stworzenie pliku &lt;code class=&quot;highlighter-rouge&quot;&gt;file.md&lt;/code&gt;&lt;/h3&gt;

&lt;p&gt;Teraz wystarczy stworzyć plik w formacie Markdown, aby móc go przekonwertować
do PDF. Jeśli w projekcie istnieje plik &lt;code class=&quot;highlighter-rouge&quot;&gt;README.md&lt;/code&gt;, to wystarczy
zaktualizować ścieżkę do tego pliku w powyższym skrypcie.&lt;/p&gt;

&lt;h3 id=&quot;4-zbudowanie-pliku-pdf&quot;&gt;4. Zbudowanie pliku PDF&lt;/h3&gt;

&lt;p&gt;Jeśli ścieżka do plików jest ustawiona poprawnie, to wystarczy wydać polecenie:&lt;/p&gt;

&lt;p&gt;&lt;kbd&gt;Copy + paste&lt;/kbd&gt;&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;node build.js
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;h2 id=&quot;co-to-jest-cli&quot;&gt;Co to jest “CLI”?&lt;/h2&gt;

&lt;p&gt;CLI, czyli &lt;code class=&quot;highlighter-rouge&quot;&gt;Command Line Interface&lt;/code&gt; - jest to interfejs aplikacji, dzięki
któremu możliwe jest uruchomienie programu za pomocą polecenia w terminalu.&lt;/p&gt;

&lt;h3 id=&quot;wbudowany-cli&quot;&gt;Wbudowany CLI&lt;/h3&gt;

&lt;p&gt;Opisywane narzędzie posiada już wbudowany interfejs CLI.&lt;br /&gt;
Więcej informacji na ten temat znajdziesz w &lt;a href=&quot;https://www.npmjs.com/package/markdown-pdf#cli-interface&quot;&gt;dokumentacji&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id=&quot;własne-cli&quot;&gt;Własne CLI&lt;/h3&gt;

&lt;p&gt;Co jeśli chciałbyś sam stworzyć plik, który będzie działał nieco inaczej niż
wbudowany CLI? Zbudujmy coś takiego!&lt;/p&gt;

&lt;h3 id=&quot;zbieramy-wymagania&quot;&gt;Zbieramy wymagania&lt;/h3&gt;

&lt;p&gt;Chcielibyśmy napisać skrypt w taki sposób, aby móc mu
przekazywać następujące parametry:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;INPUT&lt;/code&gt; - ścieżka do pliku wejściowy w formacie Markdown&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;OUTPUT&lt;/code&gt; - ścieżka do pliku wyjściowego w formacie PDF&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;po to aby, móc uruchamiać skrypt budujący w następujący sposób:&lt;/p&gt;

&lt;p&gt;&lt;kbd&gt;Copy + paste&lt;/kbd&gt;&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;node build.js INPUT OUTPUT
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h4 id=&quot;skrypt-budujący&quot;&gt;Skrypt budujący&lt;/h4&gt;

&lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;// build.js&lt;/span&gt;
&lt;span class=&quot;kd&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;markdownpdf&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'markdown-pdf'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

&lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;INPUT&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;process&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;argv&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;];&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// ex. README.md&lt;/span&gt;
&lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;OUTPUT&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;process&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;argv&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;];&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// ex. file.pdf&lt;/span&gt;

&lt;span class=&quot;nx&quot;&gt;markdownpdf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;concat&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;paths&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;([&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;INPUT&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;to&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;OUTPUT&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;nx&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'Created'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;OUTPUT&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;customowe-style---zmiana-domyślnego-wyglądu&quot;&gt;Customowe style - zmiana domyślnego wyglądu&lt;/h2&gt;

&lt;p&gt;Aby móc dodać swoją definicję wyglądu do wygenerowanego dokumentu PDF wystarczy
zdefiniować odpowiednią właściwość w opcjach, według przykładu:&lt;/p&gt;

&lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;OPTIONS&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;cssPath&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'path/to/file.css'&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;};&lt;/span&gt;

&lt;span class=&quot;nx&quot;&gt;markdownpdf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;OPTIONS&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;jak-wykorzystać-css-do-ulepszenia-wyglądu-pliku-pdf&quot;&gt;Jak wykorzystać CSS do ulepszenia wyglądu pliku PDF?&lt;/h3&gt;

&lt;p&gt;Poniżej lista selektorów, które ja proponuję wykorzystać, aby nadpisać
domyślny wygląd wygenerowanego pliku PDF:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;body&lt;/strong&gt; - wygląd całego dokumentu, np. zmiana domyślnego fontu&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;h1, h2, h3, h4, h5, h6&lt;/strong&gt; - nagłówki.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;a[href]&lt;/strong&gt; - linki&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;strong&lt;/strong&gt; - pogrubiony tekst&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;blockquote&lt;/strong&gt; - cytowanie&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;code&lt;/strong&gt; - kod źródłowy (jednolinijkowy)&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;pre code&lt;/strong&gt; - kod źródłowy (wielolinijkowy)&lt;/li&gt;
&lt;/ul&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;h2 id=&quot;problem-podwojony-link-w-wygenerowanym-pliku-pdf&quot;&gt;Problem: Podwojony link w wygenerowanym pliku PDF&lt;/h2&gt;

&lt;p&gt;Podczas wygenerowania dokumentu z osadzonym linkiem będziesz w stanie
dostrzec, że linki są “podwojone”. Aby poradzić sobie z tym problem
rekomenduję dodać do customowych styli następujący blok kodu:&lt;/p&gt;

&lt;div class=&quot;language-css highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nt&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;href&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;nd&quot;&gt;:after&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;nl&quot;&gt;content&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&quot;&quot;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h2 id=&quot;wskazówka-1-zmiana-domyślnego-fontu&quot;&gt;Wskazówka #1: Zmiana domyślnego fontu&lt;/h2&gt;

&lt;p&gt;Jeśli chcesz w wygenerowanym dokumencie użyć innego niż domyślny font,
proponuję wykorzystać funkcję &lt;code class=&quot;highlighter-rouge&quot;&gt;@import&lt;/code&gt; (w CSS-ach):&lt;/p&gt;

&lt;div class=&quot;language-css highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;@import&lt;/span&gt; &lt;span class=&quot;sx&quot;&gt;url('https://fonts.googleapis.com/css?family=Lato')&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Teraz w pliku ze stylami można śmiało używać:&lt;/p&gt;

&lt;div class=&quot;language-css highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nt&quot;&gt;font-family&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;&quot;Lato&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;serif&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h2 id=&quot;wskazówka-2-ustawienie-pliku-wykonywalnego&quot;&gt;Wskazówka #2: Ustawienie pliku wykonywalnego&lt;/h2&gt;

&lt;p&gt;Obecnie skrypt jest uruchamiany następująco:&lt;/p&gt;

&lt;p&gt;&lt;kbd&gt;Copy + paste&lt;/kbd&gt;&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;node build.js INPUT OUTPUT
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Co jeśli chcielibyśmy, uruchamiać skrypt w ten sposób:&lt;/p&gt;

&lt;p&gt;&lt;kbd&gt;Copy + paste&lt;/kbd&gt;&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;./build.js INPUT OUTPUT
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Wystarczy wykonać 2 rzeczy:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;W pierwszej linijce pliku &lt;code class=&quot;highlighter-rouge&quot;&gt;build.js&lt;/code&gt; dodać preambułę &lt;code class=&quot;highlighter-rouge&quot;&gt;#/usr/bin/env node&lt;/code&gt;.&lt;/p&gt;

    &lt;p&gt;&lt;strong&gt;Uwaga: Przed tą linijką nie może być innych znaków.&lt;/strong&gt;&lt;/p&gt;

    &lt;p&gt;Linijka ta, wymusza na powłoce (np. bash) wykorzystanie narzędzia &lt;code class=&quot;highlighter-rouge&quot;&gt;node&lt;/code&gt;
 do uruchomienia pliku.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Dodać uprawnienia do pliku &lt;code class=&quot;highlighter-rouge&quot;&gt;chmod +x build.js&lt;/code&gt;.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;aktualizacja-2023-09-08-moje-narzędzie&quot;&gt;&lt;mark&gt;[Aktualizacja: 2023-09-08]&lt;/mark&gt; Moje narzędzie&lt;/h2&gt;

&lt;p&gt;Tego dnia pracowałem nad upublicznieniem repozytorium oraz opublikowania
narzędzia do konwersji plików Markdown do PDF. Dziś powstała paczka:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.npmjs.com/package/convert-md-to-pdf&quot;&gt;https://www.npmjs.com/package/convert-md-to-pdf&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Zapraszam Was do repozytorium z kodem źródłowym:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/piecioshka/convert-md-to-pdf&quot;&gt;https://github.com/piecioshka/convert-md-to-pdf&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;!-- Resources --&gt;

</description>
            <pubDate>Tue, 25 Apr 2017 08:59:16 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2017/04/25/jak-zbudowac-pdf-na-podstawie-markdown.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2017/04/25/jak-zbudowac-pdf-na-podstawie-markdown.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/markdown/markdown.jpg</image>
        </item>
        
        <item>
            <title>WarsawJS Workshop #5: Relacja ze spotkania</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;To już piąta edycja nowej inicjatywy &lt;a href=&quot;http://warsawjs.com/&quot;&gt;WarsawJS&lt;/a&gt;, która skupia się na nauce
języka JavaScript w sposób praktyczny. Tym razem uczyliśmy się narzędzia
&lt;strong&gt;Node.js&lt;/strong&gt;. To wydarzenie było dość szczególne dla mnie, ze względu na to, że
pierwszy raz nie byłem &lt;strong&gt;mentorem&lt;/strong&gt;.&lt;/p&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;p class=&quot;center-text&quot;&gt;&lt;strong&gt;Artykuł zwyciężył w konkursie &lt;a href=&quot;http://crossweb.pl/blog/rozstrzygniecie-konkursu-napisz-relacje-z-wydarzenia-i-wygraj-czytnik-kindle/&quot;&gt;Crossweb.pl&lt;/a&gt; 🏆&lt;/strong&gt;&lt;/p&gt;

&lt;figure class=&quot;social-center-block&quot;&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;pl&quot; dir=&quot;ltr&quot;&gt;🎉✨ Wygrałem konkurs na najlepszą relację!  🎉✨&lt;a href=&quot;https://t.co/bpJmPtufFI&quot;&gt;https://t.co/bpJmPtufFI&lt;/a&gt; Dzięki &lt;a href=&quot;https://twitter.com/Crossweb_pl?ref_src=twsrc%5Etfw&quot;&gt;@Crossweb_pl&lt;/a&gt; za organizację konkursu!👍🏻&lt;/p&gt;&amp;mdash; Piotr Kowalski (@piecioshka) &lt;a href=&quot;https://twitter.com/piecioshka/status/872131668991234050?ref_src=twsrc%5Etfw&quot;&gt;June 6, 2017&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async=&quot;&quot; src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;

&lt;/figure&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Zapraszam Cię do obejrzenia krótkiego wywiadu z jednym z organizatorów.&lt;/p&gt;
  &lt;figure&gt;
   &lt;div class=&quot;youtube-lazy&quot; data-youtube-id=&quot;IGbjms2ZAcE&quot;&gt;&lt;/div&gt;
   &lt;figcaption&gt;
       Rozmowa ze współorganizatorem podczas WarsawJS Workshop #5
   &lt;/figcaption&gt;
&lt;/figure&gt;

  &lt;p&gt;Gdzie znajdziesz odpowiedzi na następujące pytania:&lt;/p&gt;
  &lt;ul&gt;
    &lt;li&gt;Jak oceniasz dzisiejsze workshopy?&lt;/li&gt;
    &lt;li&gt;Jak Ci się podoba nowa sala i nowe miejsce?&lt;/li&gt;
    &lt;li&gt;Jakie są plusy uczenia się w grupie?&lt;/li&gt;
  &lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;Podczas wszystkich poprzednich edycji &lt;strong&gt;&lt;a href=&quot;http://warsawjs.com/&quot;&gt;WarsawJS&lt;/a&gt; Workshop&lt;/strong&gt; byłem w roli
mentora i wiązało to się z tym, że &lt;strong&gt;liczba godzin&lt;/strong&gt;, które musiałem poświęcić
przed spotkaniem, aby się do niego przygotować rzecz jasna, &lt;strong&gt;była ogromna&lt;/strong&gt;.
Liczyło to się z zadaniami jakie mentor musi zrealizować przed i podczas
workshopu. O nich opowiem później.&lt;/p&gt;

&lt;figure&gt;
    &lt;a href=&quot;https://www.meetup.com/WarsawJS/&quot;&gt;
        &lt;img src=&quot;/assets/images/posts/post-banner-warsawjs.jpg&quot; alt=&quot;WarsawJS&quot; /&gt;
    &lt;/a&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;początek-spotkania&quot;&gt;Początek spotkania&lt;/h2&gt;

&lt;p&gt;23 kwietnia to szczególny dzień (i nie mam na myśli, że to dzień warsztatów).
W tym samym dniu w stolicy organizowany jest &lt;a href=&quot;https://www.orlenmarathon.pl/&quot;&gt;Orlen Warsaw Marathon&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Dzięki temu, że trasa maratonu jest dosyć długa, to liczba ulic zamkniętych
jest proporcjonalnie duża. Ze względu na to warsztat musiał rozpocząć się z
kilkuminutowym opóźnieniem. Uważam, że to nie problem.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;h3 id=&quot;dygresja&quot;&gt;Dygresja&lt;/h3&gt;
  &lt;p&gt;Nie popieram spóźniania. Sam zwykle, gdy jest obawa, że gdzieś się mam
spóźnić, to robię wszystko aby tylko nie tego nie dopuścić.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;figure class=&quot;social-center-block&quot;&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;&lt;a href=&quot;https://twitter.com/hashtag/warsawjs?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#warsawjs&lt;/a&gt; Workshop #5 is ready to begin! We&amp;#39;re learning and teaching Node.js &lt;a href=&quot;https://twitter.com/hashtag/nodejs?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#nodejs&lt;/a&gt; &lt;a href=&quot;https://t.co/4zTinbQtD6&quot;&gt;pic.twitter.com/4zTinbQtD6&lt;/a&gt;&lt;/p&gt;&amp;mdash; Piotr_Zientara (@Piotr_Zientara) &lt;a href=&quot;https://twitter.com/Piotr_Zientara/status/856048685934927873?ref_src=twsrc%5Etfw&quot;&gt;April 23, 2017&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async=&quot;&quot; src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;

&lt;/figure&gt;

&lt;h2 id=&quot;zaczynamy&quot;&gt;Zaczynamy!&lt;/h2&gt;

&lt;p&gt;Spotkanie jak zawsze rozpoczęło się serdecznym przywitaniem przez organizatorów.
Podczas tego kilkuminutowego wystąpienia, definiowane są zasady współpracy
oraz przedstawiani są trenerzy, którzy będą pomagali uczestnikom wykonać w
pełni działającą aplikacje.&lt;/p&gt;

&lt;figure&gt;
    &lt;div class=&quot;youtube-lazy&quot; data-youtube-id=&quot;NY2mvJ578tY&quot;&gt;&lt;/div&gt;
    &lt;figcaption&gt;
        Rozpoczęcie WarsawJS Workshop #5
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;mentor-a-kto-to&quot;&gt;Mentor, a kto to?&lt;/h2&gt;

&lt;p&gt;Warsztaty to wydarzenie, podczas którego spotykają się 2 strony medalu:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;uczestnicy, którzy &lt;strong&gt;chcą się czegoś nauczyć&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;trenerzy, którzy &lt;strong&gt;chcą kogoś nauczyć&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Podczas warsztatów &lt;a href=&quot;http://warsawjs.com/&quot;&gt;WarsawJS&lt;/a&gt; trenerzy (zwykle pięciu), wykorzystuje swoje
doświadczenie i pomaga uczestnikom zrealizować projekt.&lt;/p&gt;

&lt;p&gt;Osobą, która go wymyśla jest &lt;strong&gt;mentor&lt;/strong&gt;. Jest on również jednym z trenerów.
Mentor jest zwykle najbardziej doświadczony w technologii, której uczestnicy
uczą się podczas warsztatów. Cel projektu to zwykle lista zadań, która jest
do zrobienia.&lt;/p&gt;

&lt;figure&gt;
    &lt;div class=&quot;youtube-lazy&quot; data-youtube-id=&quot;PfvgR3I9rkA&quot;&gt;&lt;/div&gt;
    &lt;figcaption&gt;
        Prezentacja aplikacji docelowej przez mentora podczas WarsawJS
        Workshop #5
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Drugim “obowiązkiem” mentora (w moim odczuciu przywilejem) jest wyście na scenę
podczas rozpoczęcia wydarzenia (zaraz po organizatorach) w celu prezentacji
projektu jaki będzie realizowany przez uczestników podczas dnia warsztatu.&lt;/p&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;p&gt;Z tego wywiadu dowiesz się jaka grupą zajmował się mentor dzisiejszego
workshopu, Marek Święcicki i czy selekcja zrobiona przed warsztatami zdała
egzamin.&lt;/p&gt;

&lt;figure&gt;
    &lt;div class=&quot;youtube-lazy&quot; data-youtube-id=&quot;j0xHF-td9DA&quot;&gt;&lt;/div&gt;
    &lt;figcaption&gt;
        Rozmowa z mentorem WarsawJS Workshop #5
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;kim-byli-trenerzy-sylwetki&quot;&gt;Kim byli trenerzy? Sylwetki&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Marek Święcicki&lt;/strong&gt;: Młody chłopak, który już wie co chce robić w życiu -
  pisać kod! Marek posiada świetny kunszt programistyczny.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Kamil Grabek&lt;/strong&gt;: Developer z 3 letnim stażem, posiadający niesamowite
  umiejętności front-endowe, ale odnajduje się również po stronie serwera.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Tomasz Marciszewski&lt;/strong&gt;: Programista i architekt systemów. Aspirujący
  developer gier. Obecnie zajmuje się głównie tworzeniem rozwiązań
  backendowych w Node.js&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Konrad Kowalski&lt;/strong&gt;: Wieloletni developer Node.js. Autor wielu
  projektów na GitHubie. Aspirujący snookerzysta.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Robert Kawecki&lt;/strong&gt;: Pisze w Node.js od 2012. Buduje systemy CQRS z użyciem
  Event Sourcing. Unika front-endu.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Poniżej wywiad z dwójką trenerów:&lt;/p&gt;

&lt;figure&gt;
    &lt;div class=&quot;youtube-lazy&quot; data-youtube-id=&quot;h2Yyr6Xy5aI&quot;&gt;&lt;/div&gt;
    &lt;figcaption&gt;
        Rozmowa z trenerami WarsawJS Workshop #5
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Z tego wywiadu poznasz odpowiedzi na pytania:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Jak poziom był w innych grupach?&lt;/li&gt;
  &lt;li&gt;Jaki projekt był realizowany podczas workshopów?&lt;/li&gt;
  &lt;li&gt;Czy wielkość grup jest akceptowalna dla trenerów?&lt;/li&gt;
  &lt;li&gt;Czy poziom całej grupy jest równomierny?&lt;/li&gt;
  &lt;li&gt;Co można jeszcze poprawić od strony organizacyjnej?&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;zasady&quot;&gt;Zasady?&lt;/h2&gt;

&lt;p&gt;Jako organizatorzy nakreśliliśmy pewne zasady współpracy, aby uczestnicy jak
i trenerzy czuli się komfortowo:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Podział na grupy pod kątem zaawansowania podczas selekcji&lt;/li&gt;
  &lt;li&gt;To nie są indywidualne zajęcia&lt;/li&gt;
  &lt;li&gt;Odnosimy się do siebie po koleżeńsku (na Ty)&lt;/li&gt;
  &lt;li&gt;Trener decyduje o prędkości realizacji projektu&lt;/li&gt;
  &lt;li&gt;Każdy z uczestników wyraża zgodę na publikację wizerunku w social mediach&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;oraz najważniejsza reguła:&lt;/p&gt;

&lt;p class=&quot;center-text&quot;&gt;&lt;strong&gt;Żadne pytanie nie jest głupie!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Z której wynika, że uczestnicy mogą zadawać dowolne pytania do trenera,
odnośnie dowolnej rzeczy z którą sobie nie radzą podczas tworzenia aplikacji.&lt;/p&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;figure&gt;
    &lt;div class=&quot;youtube-lazy&quot; data-youtube-id=&quot;9b21X7d_vkw&quot;&gt;&lt;/div&gt;
    &lt;figcaption&gt;
        Rozmowa z uczestnikami podczas WarsawJS Workshop #5
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Mój pierwszy wywiad, przeprowadzony z uczestnikami z którego dowiesz się:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Co nieco o obecnym podczas całych warsztatów kateringu&lt;/li&gt;
  &lt;li&gt;Czy nowa lokalizacja jest lepsza od starej?&lt;/li&gt;
  &lt;li&gt;Liczba osób w sali nie przeszkadza w realizacji projektu&lt;/li&gt;
  &lt;li&gt;Od uczestnika, który był pierwszy raz na warsztatach, że tempo było
  dostosowane do poziomu uczestników (plus dla trenera)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;przerwy&quot;&gt;Przerwy&lt;/h2&gt;

&lt;p&gt;Warsztaty trwają 8 godzin. To za długi czas, aby być podczas niego w 100%
skoncentrowany, dlatego w planie wydarzenia zdefiniowane są przerwy:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;2 kawowe&lt;/li&gt;
  &lt;li&gt;1 obiadowa&lt;/li&gt;
  &lt;li&gt;oraz ewentualne przerwy, za które odpowiedzialny jest trener spotkania&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;czy-podczas-warsztatu-będzie-obiad&quot;&gt;“Czy podczas warsztatu będzie obiad?”&lt;/h2&gt;

&lt;p&gt;To często zadawane pytanie. Nie dziwie się. Nie wyobrażam sobie spędzenia
całego dnia na kodowaniu bez obiadu w środku dnia.&lt;/p&gt;

&lt;p&gt;A więc, czy będzie jakieś jedzonko?&lt;/p&gt;

&lt;figure class=&quot;social-center-block&quot;&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;Hard work ❤️ workshop &lt;a href=&quot;https://twitter.com/hashtag/nodejs?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#nodejs&lt;/a&gt; &lt;a href=&quot;https://twitter.com/hashtag/warsawjs?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#warsawjs&lt;/a&gt; &lt;a href=&quot;https://t.co/Ydf4dVFF7B&quot;&gt;pic.twitter.com/Ydf4dVFF7B&lt;/a&gt;&lt;/p&gt;&amp;mdash; Joanna Wierzbicka (@WillowAsia) &lt;a href=&quot;https://twitter.com/WillowAsia/status/856171287999328256?ref_src=twsrc%5Etfw&quot;&gt;April 23, 2017&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async=&quot;&quot; src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;

&lt;/figure&gt;

&lt;p&gt;Tak! Organizatorzy &lt;strong&gt;zapewniają posiłek dla każdego uczestnika&lt;/strong&gt; oraz trenera.
Podczas rejestracji uczestnik wybiera danie z karty menu. Następnie
organizatorzy kontaktują się z restauracją, która przywozi zamówienie w
okolicach godzin południowych.&lt;/p&gt;

&lt;p&gt;W okolicy godziny 13 następuje przerwa obiadowa, podczas której wydawane
są posiłki przez organizatorów.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/photos/warsawjs/workshop-5/IMG_1005.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;figcaption&gt;
        Jemy!
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;prezentacja-swoich-prac&quot;&gt;Prezentacja swoich prac&lt;/h2&gt;

&lt;p&gt;Bardzo ważnym aspektem tworzenia projektu jest możliwość pokazania go światu.
Dlatego też wymyśliłem, że po zakończeniu warsztatu chciałbym, aby kilka osób
wyszło na scenę i pokazało światu swoje projekty.&lt;/p&gt;

&lt;p&gt;Wyjście na scenę wiąże się z tym, że trzeba pokonać tą barierę lęku, która
dla osób niedoświadczonych w wyjściach scenicznych może być bardzo duża.&lt;/p&gt;

&lt;p&gt;Osobiście, zachęcam do spróbowania, aby mieć już te pierwsze “koty za płoty”.
Nic strasznego się nie zadzieje, gdy wyjdzie się na scenę i pochwali
całodniową pracą.&lt;/p&gt;

&lt;h2 id=&quot;konkurs-wręczenie-koszulki&quot;&gt;Konkurs: Wręczenie koszulki&lt;/h2&gt;

&lt;p&gt;Wpadłem na pomysł, aby osoby, które będą aktywne w social mediach, były przez
organizatorów jakoś wyróżnione. Tym samym wylosowaliśmy (pomocą funkcji
&lt;code class=&quot;highlighter-rouge&quot;&gt;Math.random() * 7&lt;/code&gt;) koszulkę dla jednej osoby, która na Twitterze
opublikowała zdjęcie z hashtagiem &lt;code class=&quot;highlighter-rouge&quot;&gt;#warsawjs&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Dlaczego 7? Ponieważ tyle osób brało udział w konkursie! 😄&lt;/p&gt;

&lt;figure class=&quot;social-center-block&quot;&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;&lt;a href=&quot;https://twitter.com/hashtag/WarsawJS?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#WarsawJS&lt;/a&gt; workshop 5 at Google Campus &lt;a href=&quot;https://t.co/ST2kwMDBAy&quot;&gt;pic.twitter.com/ST2kwMDBAy&lt;/a&gt;&lt;/p&gt;&amp;mdash; Pawel Idczak (@pawel_id) &lt;a href=&quot;https://twitter.com/pawel_id/status/856175034456563713?ref_src=twsrc%5Etfw&quot;&gt;April 23, 2017&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async=&quot;&quot; src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;

&lt;/figure&gt;

&lt;p&gt;Wylosowaną cyfra była 3-ka. Powyższy tweet autorstwa Pawła Idczaka wygrał w
konkursie - autor zdjęcia, który był pierwszy raz na warsztatach.&lt;/p&gt;

&lt;p&gt;Paweł otrzymał od organizatorów upominek w formie koszulki 😄&lt;/p&gt;

&lt;figure&gt;
    &lt;div class=&quot;youtube-lazy&quot; data-youtube-id=&quot;YjO4wb-F3o8&quot;&gt;&lt;/div&gt;
    &lt;figcaption&gt;
        Rozstrzygnięcie konkursu podczas WarsawJS Workshop #5
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;ankiety&quot;&gt;Ankiety&lt;/h2&gt;

&lt;p&gt;Organizatorom, zawsze mocno zależy na feedbacku od uczestników spotkania. Nie
większego znaczenia jaki jest to typ spotkanie. Wiadomość zwrotna, czy się
podobało, czy nie, zawsze jest pożyteczna. Jeśli uczestnikom coś nie
podpasowało, to mają szansę anonimowo zgłosić do przez odpowiedni formularz.&lt;/p&gt;

&lt;p&gt;Link do ankiety: &lt;a href=&quot;http://bit.ly/warsawjs-workshop-5-ankieta&quot;&gt;bit.ly/warsawjs-workshop-5-ankieta&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Oczywiście najsympatyczniej, kiedy organizatorzy dostają pochwały, ale jestem
tego zdania, że na pochwały trzeba sobie zapracować.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;h3 id=&quot;ogłoszenie&quot;&gt;Ogłoszenie&lt;/h3&gt;
  &lt;p&gt;Jeśli byłeś uczestnikiem spotkania to wypełnij ankietę.&lt;br /&gt;
Będziesz miał wtedy realny wpływ na kierunek WarsawJS.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id=&quot;dyplomy&quot;&gt;Dyplomy&lt;/h2&gt;

&lt;p&gt;Zdradzę Wam sekret trzymany głęboko w tajemnicy przez organizatorów. Po
zakończeniu &lt;strong&gt;WarsawJS Workshop&lt;/strong&gt;, organizatorzy zawsze wręczają poprzez ręce
trenerów dyplomy potwierdzające uczestnictwo w wydarzeniu!&lt;/p&gt;

&lt;p&gt;Super sprawa, aby móc później pochwalić się, żonie, mamie albo
pracodawcy, że odbyło się szkolenie.&lt;/p&gt;

&lt;p&gt;Aby zobaczyć jak one wyglądają kliknij np. &lt;a href=&quot;https://www.meetup.com/WarsawJS/photos/27481355/456773869/&quot;&gt;tu&lt;/a&gt;.&lt;/p&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;figure class=&quot;social-center-block&quot;&gt;
    &lt;iframe src=&quot;https://www.facebook.com/plugins/post.php?href=https%3A%2F%2Fwww.facebook.com%2Fphoto.php%3Ffbid%3D1674714799220255%26set%3Da.556335884391491.126222.100000452544337%26type%3D3&amp;amp;width=500&quot; width=&quot;500&quot; height=&quot;389&quot; style=&quot;border:none;overflow:hidden&quot; scrolling=&quot;no&quot; frameborder=&quot;0&quot; allowtransparency=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;a-sponsorami-spotkania-byli&quot;&gt;A sponsorami spotkania byli…&lt;/h2&gt;

&lt;p&gt;Od zawsze… czyli od 5 spotkań liczba sponsorów jest taka sama. Na dodatek
jest to króciutka lista, bo liczy jedynie 2 pozycje. A mianowicie:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.facebook.com/artificialio/&quot;&gt;Artificial Labs&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.softwareplant.com/&quot;&gt;Software Plant&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Dwie świetne firmy, które pomagają organizatorom w tym, aby wydarzenie odbyło
się na takim poziomie na jakim się odbywa. Jeśli szukasz pracy jako
&lt;strong&gt;JavaScript Developer&lt;/strong&gt; warto wysłać do nich swoją kandydaturę. Firmy
zatrudniają ekspertów w dziedzinie &lt;a href=&quot;/blog/2017/04/21/front-end-vs-frontend.html&quot;&gt;front-end&lt;/a&gt;-u.&lt;/p&gt;

&lt;h2 id=&quot;co-dalej&quot;&gt;Co dalej?&lt;/h2&gt;

&lt;p&gt;Kolejne warsztaty odbędą się z frameworka &lt;code class=&quot;highlighter-rouge&quot;&gt;Meteor.js&lt;/code&gt;. Jeśli więc, drogi
czytelniku jesteś developerem tego narzędzia to zgłoś się do organizatorów
pisząc wiadomość na adres: &lt;code class=&quot;highlighter-rouge&quot;&gt;contact [at] warsawjs.com&lt;/code&gt; albo w social mediach.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Zobaczysz, ile jest frajdy w byciu trenerem.&lt;/strong&gt; Najwięcej o tym może powiedzieć
dzisiejszy trenerem Kamil, który był &lt;strong&gt;pierwszy raz w tej roli&lt;/strong&gt; podczas
WarsawJS Workshop.&lt;/p&gt;

&lt;figure&gt;
    &lt;div class=&quot;youtube-lazy&quot; data-youtube-id=&quot;TLOBo7rYsRI&quot;&gt;&lt;/div&gt;
    &lt;figcaption&gt;
        Podsumowanie wydarzenia przez trenera WarsawJS Workshop #5
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;!-- Resources --&gt;

</description>
            <pubDate>Sun, 23 Apr 2017 21:59:28 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2017/04/23/warsawjs-workshop-5.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2017/04/23/warsawjs-workshop-5.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/post-banner-warsawjs.jpg</image>
        </item>
        
        <item>
            <title>"Front-end" vs "Frontend"</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Czy kiedykolwiek zastanawiałeś się nad tym, która nazwa jest poprawna? Bo ja tak. A że nie lubię takiego stanu niewiedzy, dlatego postanowiłem, że odkryję prawdę! Rozwiążę raz na zawsze ten problem i odpowiem Ci na główne pytanie: &lt;strong&gt;która z tych form jest właściwa&lt;/strong&gt;?&lt;/p&gt;

&lt;p&gt;Postanowiłem, że zrobię research i dowiem się prawdy!&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/front-end/front-end-526x275.jpg&quot; itemprop=&quot;image&quot; alt=&quot;Baner promujący artykuł&quot; /&gt;
&lt;/figure&gt;

&lt;p&gt;Na wstępie zaznaczam, że przeszukiwałem TYLKO zbiory internetowe. Nie zaglądałem do żadnych książek (może to źle? trudno powiedzieć).&lt;/p&gt;

&lt;p&gt;Ograniczyłem się także tylko do słowników internetowych, choć widziałem, że jest mnóstwo dyskusji na temat sytuacji stosowania poprawnej formy.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/front-end/logo-front-end.png&quot; alt=&quot;Front-end&quot; /&gt;

    &lt;figcaption&gt;
        Logo Front-endu (&lt;a href=&quot;https://en.wikipedia.org/wiki/Front-end_web_development&quot;&gt;https://en.wikipedia.org/wiki/Front-end_web_development&lt;/a&gt;).
        Ups... zdradziłem wynik analizy, ale mam nadzieje, że nikt tego nie
        zauważy.
    &lt;/figcaption&gt;

&lt;/figure&gt;

&lt;h2 id=&quot;misja-translator&quot;&gt;Misja Translator&lt;/h2&gt;

&lt;p&gt;Skorzystałem z pomocy kilku tłumaczy internetowych. O to wynik mojej pracy.&lt;/p&gt;

&lt;h3 id=&quot;1-google-translate&quot;&gt;1. &lt;a href=&quot;https://translate.google.com/&quot;&gt;Google Translate&lt;/a&gt;&lt;/h3&gt;

&lt;p&gt;Pierwsze co wpisałem to słowo &lt;a href=&quot;https://translate.google.com/#en/pl/frontend&quot;&gt;frontend&lt;/a&gt;. Słownik nie przetłumaczył tego słowa, ale za to podpowiedział, że może warto zobaczyć inne frazy: &lt;em&gt;front end&lt;/em&gt; oraz &lt;em&gt;front-end&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Gdy kliknąłem we &lt;a href=&quot;https://translate.google.com/#en/pl/front-end&quot;&gt;front-end&lt;/a&gt; słowo zostało przetłumaczone na “czołowy” oraz był dodany przykład wyjaśniający znaczenie słowa &lt;em&gt;front-end&lt;/em&gt;.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Wynik: front-end 1:0 frontend&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3 id=&quot;2-translatica&quot;&gt;2. &lt;a href=&quot;http://translatica.pl/&quot;&gt;Translatica&lt;/a&gt;&lt;/h3&gt;

&lt;p&gt;Kolejny translator, którego użyłem nie poradził sobie ze słowem &lt;em&gt;frontend&lt;/em&gt;, ale za to przetłumaczyć &lt;strong&gt;front-end&lt;/strong&gt; jako &lt;em&gt;procesor czołowy&lt;/em&gt;&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Wynik: front-end 2:0 frontend&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3 id=&quot;3-cambridge-dictionary&quot;&gt;3. &lt;a href=&quot;http://dictionary.cambridge.org/&quot;&gt;Cambridge Dictionary&lt;/a&gt;&lt;/h3&gt;

&lt;p&gt;Po wpisaniu frazy &lt;a href=&quot;http://dictionary.cambridge.org/spellcheck/english-polish/?q=frontend&quot;&gt;frontend&lt;/a&gt; otrzymałem sugestię odnośnie wpisanego słowa, że może mam na myśli inne wyrazy.&lt;/p&gt;

&lt;p&gt;Jeśli jednak wpiszę &lt;a href=&quot;http://dictionary.cambridge.org/dictionary/english/front-end&quot;&gt;front-end&lt;/a&gt; przez myślnik to otrzymuję opis, który zawiera takie informacje jak:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;em&gt;front-end&lt;/em&gt; jest przymiotnikiem&lt;/li&gt;
  &lt;li&gt;oraz wyjaśnienie, że &lt;em&gt;słowo te jest używane do opisania, że inwestorzy płacą opłatę w momencie kiedy włożyli pieniądze do niektórych rodzajów inwestycji&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Co to ma wspólnego z programowaniem? Nic, ale przynajmniej jest w słowniku.&lt;/p&gt;

&lt;p&gt;Przy tym słowniku warto się na chwilę jeszcze zatrzymać i spojrzeć na znaczenie wyrażenie &lt;a href=&quot;http://dictionary.cambridge.org/dictionary/english/back-end&quot;&gt;back-end&lt;/a&gt;. Ponieważ, znalazło się wytłumaczenie z dziedziny IT.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;em&gt;back-end&lt;/em&gt; jest przymiotnikiem&lt;/li&gt;
  &lt;li&gt;oraz odnosi się do części programu komputerowego lub systemu, której użytkownik nie widzi lub nie używa&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
  &lt;p&gt;Wynik: front-end 3:0 frontend&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3 id=&quot;4-english-oxford-living-dictionaries&quot;&gt;4. &lt;a href=&quot;https://en.oxforddictionaries.com/&quot;&gt;English Oxford Living Dictionaries&lt;/a&gt;&lt;/h3&gt;

&lt;p&gt;Interesujący jest fakt wpisania w tej wyszukiwarce frazy &lt;a href=&quot;https://en.oxforddictionaries.com/definition/frontend&quot;&gt;frontend&lt;/a&gt;. Jakkolwiek by się nie wpisywało, czy to bez myślnika, czy ze &lt;a href=&quot;https://en.oxforddictionaries.com/definition/front%20end&quot;&gt;spacją&lt;/a&gt;, czy z &lt;a href=&quot;https://en.oxforddictionaries.com/definition/front-end&quot;&gt;myślnikiem&lt;/a&gt; zostaniemy i tak przekierowani na wersję “front end” - pisane ze spacją w środku.&lt;/p&gt;

&lt;p&gt;Fraza zostanie przetłumaczona na: &lt;em&gt;Część systemu komputerowego lub aplikacji, z którym użytkownik komunikuje się bezpośrednio&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Może nie wygrała dokładnie wersja przez myślnik, ale na pewno nie wygrała wersja pisana razem.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Wynik: front-end 4:0 frontend&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3 id=&quot;5-wwwdictionarycom&quot;&gt;5. &lt;a href=&quot;http://www.dictionary.com&quot;&gt;www.dictionary.com&lt;/a&gt;&lt;/h3&gt;

&lt;p&gt;Standardowo. Po wpisaniu &lt;a href=&quot;http://www.dictionary.com/misspelling?term=frontend&quot;&gt;frontend&lt;/a&gt; dostałem informację, że: nie ma takiego słowa oraz listę proponowanych.&lt;/p&gt;

&lt;p&gt;Po wpisaniu &lt;a href=&quot;http://www.dictionary.com/browse/front-end&quot;&gt;front-end&lt;/a&gt; otrzymałem informację, że słowo jest przymiotnikiem, ale opis dotyczył finansów.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Wynik: front-end 5:0 frontend&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3 id=&quot;6-longman-dictionary-of-contemporary-english-online&quot;&gt;6. &lt;a href=&quot;http://www.ldoceonline.com/&quot;&gt;Longman Dictionary of Contemporary English Online&lt;/a&gt;&lt;/h3&gt;

&lt;p&gt;Kolejny słownik, który podpowiada mi, że nie ma słowa &lt;a href=&quot;http://www.ldoceonline.com/spellcheck/english/?q=frontend&quot;&gt;frontend&lt;/a&gt;. Po wpisaniu poprawnej nazwy &lt;a href=&quot;http://www.ldoceonline.com/dictionary/front-end&quot;&gt;front-end&lt;/a&gt; dostaję informację o rzeczowniku w dziedzinie handlu.&lt;/p&gt;

&lt;p&gt;Szkoda, że nie ma wyjaśnienia, ale jak widać słowa &lt;em&gt;frontend&lt;/em&gt; po prostu nie ma.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Wynik: front-end 6:0 frontend&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3 id=&quot;7-collins-dictionary&quot;&gt;7. &lt;a href=&quot;http://www.collinsdictionary.com/&quot;&gt;Collins Dictionary&lt;/a&gt;&lt;/h3&gt;

&lt;p&gt;Po wpisaniu &lt;a href=&quot;http://www.collinsdictionary.com/dictionary/english/front-end&quot;&gt;frontend&lt;/a&gt; zostałem przekierowany na wersję z myślnikiem i wyjaśnieniem z dziedziny finansów.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Wynik: front-end 7:0 frontend&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3 id=&quot;8-word-reference&quot;&gt;8. &lt;a href=&quot;http://www.wordreference.com/&quot;&gt;Word reference&lt;/a&gt;&lt;/h3&gt;

&lt;p&gt;Taka sama sytuacja tutaj: &lt;a href=&quot;http://www.wordreference.com/definition/front-end&quot;&gt;frontend&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Wynik: front-end 8:0 frontend&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3 id=&quot;9-babla-dictionary&quot;&gt;9. &lt;a href=&quot;http://en.bab.la/&quot;&gt;bab.la Dictionary&lt;/a&gt;&lt;/h3&gt;

&lt;p&gt;Kolejny tłumacz online nie znajduje słowa &lt;a href=&quot;http://en.bab.la/dictionary/english-polish/frontend&quot;&gt;frontend&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Znajduje za to wersję z myślnikiem i tłumaczy ją jako: &lt;em&gt;część interfejsowa&lt;/em&gt;.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Wynik: front-end 9:0 frontend&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id=&quot;obecne-frazy-w-słownikach&quot;&gt;Obecne frazy w słownikach&lt;/h2&gt;

&lt;p&gt;Jeśli kogoś zainteresuję &lt;em&gt;front-end&lt;/em&gt; to prędzej czy później będzie googlował o tym i natrafi na stronę w Wikipedii - &lt;a href=&quot;https://en.wikipedia.org/wiki/Front-end_web_development&quot;&gt;https://en.wikipedia.org/wiki/Front-end_web_development&lt;/a&gt; gdzie w samym tytule jest przyjęta konwencja “front-end”.&lt;/p&gt;

&lt;h2 id=&quot;podsumowanie&quot;&gt;Podsumowanie&lt;/h2&gt;

&lt;p&gt;Po mozolnej weryfikacji wśród 9 różnych słowników internetowych mogę przychylić się bardziej do tego, że określenie warstwy aplikacji którą obsługuje użytkownik pisze się &lt;strong&gt;&lt;em&gt;Front-end&lt;/em&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Wiadomo, że czasami pisanie przez myślnik może prowadzić do niepotrzebnych problemów, ale chciałbym aby moi czytelnicy wiedzieli, jak pisze się poprawnie.&lt;/p&gt;
</description>
            <pubDate>Fri, 21 Apr 2017 07:07:57 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2017/04/21/front-end-vs-frontend.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2017/04/21/front-end-vs-frontend.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/front-end/front-end-526x275.jpg</image>
        </item>
        
        <item>
            <title>Wygraj bilet na konferencję JS Poland 2017</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Śmigasz po konferencjach? Jeśli tak, to ten wpis powinien Cię zainteresować.&lt;/p&gt;

&lt;h2 id=&quot;konferencja-kolejna&quot;&gt;Konferencja, kolejna?&lt;/h2&gt;

&lt;p&gt;Tak. Czy ktoś ma dosyć konferencji? Wydaje mi się, że nie. Podczas takich
wydarzeń uczestnicy mają możliwość dowiedzenia się w pierwszej ręki co
słychać w ich ulubionej technologii.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;h3 id=&quot;zapamiętaj&quot;&gt;Zapamiętaj&lt;/h3&gt;
  &lt;p&gt;Konferencje rozwijają Twoje umiejętności.
Podczas konferencji:&lt;/p&gt;
  &lt;ul&gt;
    &lt;li&gt;poznajesz nowe osoby z branży, z którymi później np. współtworzysz
projektu Open Source&lt;/li&gt;
    &lt;li&gt;dowiadujesz się o nowościach w swoim obszarze zainteresowań&lt;/li&gt;
  &lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;Konferencję mają to do siebie, że można spotkać developerów popularnych w
branży. Jeśli na scenie występuje człowiek, który stworzył projekt jakiego
używasz na co dzień, to warto podczas eventu podejść do niego i podziękować
mu za jego pracę, która ułatwia Tobie życie, albo utrudnia 😄&lt;/p&gt;

&lt;figure&gt;
    &lt;a href=&quot;http://js-poland.pl/&quot;&gt;
        &lt;img src=&quot;/assets/images/posts/conference-js-poland-2017/js-poland-300x300.png&quot; alt=&quot;Logo JS Poland&quot; /&gt;
    &lt;/a&gt;
    &lt;figcaption&gt;
        Logo konferencji JS Poland 2017.
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;konkrety&quot;&gt;Konkrety&lt;/h2&gt;

&lt;p&gt;JS Poland to: &lt;strong&gt;1 dzień konferencji&lt;/strong&gt; oraz &lt;strong&gt;3 dni warsztatów&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Konferencja odbędzie się &lt;strong&gt;19 czerwca&lt;/strong&gt; tego roku
w &lt;a href=&quot;https://multikino.pl/&quot;&gt;Multikinie Złote Tarasy&lt;/a&gt; w &lt;strong&gt;Warszawie&lt;/strong&gt;. Warsztaty będą odbywać się w
kolejnych dniach.&lt;/p&gt;

&lt;p&gt;Podczas konferencji będziesz w stanie posłuchać kilkunastu prelekcji na temat
języka JavaScript. Ze swojej strony mogę polecić prelekcje takich sław jak:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.js-poland.pl/#Christian-Heilmann&quot;&gt;Christian Heilmann&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.js-poland.pl/#Luca-Mezzalira&quot;&gt;Luca Mezzalira&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.js-poland.pl/#Nir-Kaufman&quot;&gt;Nir Kaufman&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;którzy zawsze wychodzą na scenę prezentując interesujące tematy w ciekawy
sposób.&lt;/p&gt;

&lt;h2 id=&quot;1--darmowy-bilet&quot;&gt;1) ✨ Darmowy bilet&lt;/h2&gt;

&lt;p&gt;Jestem w posiadaniu jednego biletu, który chciałbym przeznaczyć Wam, tj.
czytelnikom mojego bloga. Bilet jest wart &lt;strong&gt;ponad 400 złotych&lt;/strong&gt;.&lt;/p&gt;

&lt;h3 id=&quot;aby-wygrać-bilet&quot;&gt;Aby wygrać bilet…&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;udostępnij ten post na Facebooku albo Twitterze&lt;/li&gt;
  &lt;li&gt;w treści wpisz hashtag &lt;code class=&quot;highlighter-rouge&quot;&gt;#piecioshkablog&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;osoba, której post posiada największą liczbę lajków otrzyma ode mnie bilet&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Konkurs potrwa przez kilka dni. Ogłoszenie osoby, która wygrała bilet odbędzie
się w &lt;strong&gt;sobotę, 29 kwietnia&lt;/strong&gt;, kiedy to &lt;strong&gt;przeszukam cały internet&lt;/strong&gt; pod kątem
wymienionego przez ze mnie wcześniej hashtaga.&lt;/p&gt;

&lt;p&gt;Wynik ogłoszę tu na blogu. Prawdopodobnie modyfikując ten artykuł.&lt;/p&gt;

&lt;h2 id=&quot;2--rabat-10&quot;&gt;2) ✨ Rabat 10%&lt;/h2&gt;

&lt;p&gt;Jeśli nie wygrasz swojego biletu w konkursie powyżej, to masz możliwość
redukcji ceny biletu o 10%. Nie jest to duża zniżka, jednak dlaczego miałbyś
z niej nie skorzystać podczas zakupu biletu?&lt;/p&gt;

&lt;h3 id=&quot;aby-skorzystać-z-promocji&quot;&gt;Aby skorzystać z promocji…&lt;/h3&gt;

&lt;p&gt;W formularzu &lt;a href=&quot;http://www.js-poland.pl/#tickets&quot;&gt;zakupu biletu&lt;/a&gt; wpisz kod: &lt;code class=&quot;highlighter-rouge&quot;&gt;piecioshkablog&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Kod jest ważny do &lt;strong&gt;2 maja&lt;/strong&gt; (zostało Ci jeszcze 14 dni).&lt;/p&gt;

&lt;blockquote class=&quot;block-good&quot;&gt;
  &lt;h3 id=&quot;-wskazówka&quot;&gt;&lt;i class=&quot;icon-good&quot;&gt;&lt;/i&gt; Wskazówka&lt;/h3&gt;
  &lt;p&gt;Ze swojej strony proponuję zakup biletu typu &lt;strong&gt;SUPER EARLY BIRD OPTION - 2
CONFERENCES&lt;/strong&gt;, który to, upoważnia do wejścia na 2 konferencje:&lt;/p&gt;
  &lt;ul&gt;
    &lt;li&gt;czerwcową &lt;a href=&quot;http://www.js-poland.pl/&quot;&gt;www.js-poland.pl&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;oraz listopadową &lt;a href=&quot;http://www.ng-poland.pl/&quot;&gt;www.ng-poland.pl&lt;/a&gt;&lt;/li&gt;
  &lt;/ul&gt;

  &lt;h3 id=&quot;-uwaga&quot;&gt;&lt;i class=&quot;icon-average&quot;&gt;&lt;/i&gt; Uwaga&lt;/h3&gt;
  &lt;p&gt;Ze względu na dużą promocję, &lt;strong&gt;liczba tych biletów jest ograniczona!&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Organizatorem jest &lt;a href=&quot;https://twitter.com/ngkalbarczyk&quot;&gt;Darek Kalbarczyk&lt;/a&gt;, który już kiedyś pokazał, że potrafi
organizować tego typu wydarzenia. Mowa tutaj o konferencji &lt;a href=&quot;http://www.ng-poland.pl/&quot;&gt;NG Poland 2016&lt;/a&gt;
o której &lt;a href=&quot;/blog/2016/11/25/konferencja-ng-poland-2016.html&quot;&gt;pisałem na blogu&lt;/a&gt;.&lt;/p&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;h2 id=&quot;--2017-04-29--ogłoszenie-wyników&quot;&gt;✨ &lt;mark&gt;[ 2017-04-29 ]&lt;/mark&gt; Ogłoszenie wyników&lt;/h2&gt;

&lt;p&gt;Liczba osób biorących udział w konkursie nie jest oszałamiająca - co mnie
osobiście dziwi. W końcu otrzymanie biletu, którego koszt na rynku wynosi ponad
&lt;strong&gt;400 ziko&lt;/strong&gt; nie jest zjawiskiem popularnym.&lt;/p&gt;

&lt;p&gt;Może to przez to, że ludzie nie biorą udziału w konkursach bo myślą, ża to
jakaś ściema, a przecież jeśli konkurs robi osoba (albo organizacja), która
ma jakąś renomę, to konkurs musi być &lt;em&gt;prawdziwy&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;No trudno. Przejdźmy do konkretów.&lt;/p&gt;

&lt;h3 id=&quot;zobaczmy-co-się-działo-na-portalu-twitter&quot;&gt;Zobaczmy, co się działo na portalu &lt;code class=&quot;highlighter-rouge&quot;&gt;Twitter&lt;/code&gt;&lt;/h3&gt;

&lt;p&gt;Zapytanie pod jakim szukałem zgłoszeń:
&lt;a href=&quot;https://twitter.com/hashtag/piecioshkablog?src=hash&quot;&gt;twitter.com/hashtag/piecioshkablog?src=hash&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Liczba uczestników:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://twitter.com/Kamil_Piskorz/status/856200380467867648&quot;&gt;Kamil Piskorz&lt;/a&gt; - Liczba lajków: 0&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://twitter.com/sciborrudnicki/status/854689195201363968&quot;&gt;Ścibor Rudnicki&lt;/a&gt; - Liczba lajków: 1&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://twitter.com/mpieroszkiewicz/status/856373747158310912&quot;&gt;Mary Pieroszkiewicz&lt;/a&gt; - Liczba lajków: 3&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Coś malutko tych lajków, może na fejsbuku będzie więcej…&lt;/p&gt;

&lt;h3 id=&quot;czas-na-facebook-a-może-tutaj-posty-są-popularniejsze&quot;&gt;Czas na &lt;code class=&quot;highlighter-rouge&quot;&gt;Facebook&lt;/code&gt;-a, może tutaj posty są popularniejsze?&lt;/h3&gt;

&lt;p&gt;Zapytanie pod jakim szukałem:
&lt;a href=&quot;https://www.facebook.com/hashtag/piecioshkablog?source=feed_text&amp;amp;story_id=10211261089175716&quot;&gt;facebook.com/hashtag/piecioshkablog?source=feed_text&amp;amp;story_id=10211261089175716&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Liczba uczestników:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.facebook.com/michal.kwasniewski.7/posts/1379290745488575?match=I3BpZWNpb3Noa2FibG9nLHBpZWNpb3Noa2FibG9n&quot;&gt;Michał Kwaśniewski&lt;/a&gt; - Liczba lajków: 11&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.facebook.com/ka.piskorz/posts/10211261089175716?match=I3BpZWNpb3Noa2FibG9nLHBpZWNpb3Noa2FibG9n&quot;&gt;Kamil Piskorz&lt;/a&gt; - Liczba lajków: 19&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.facebook.com/photo.php?fbid=10208659835042496&amp;amp;set=a.3853373262028.2136601.1509207220&amp;amp;type=3&quot;&gt;Mary Pieroszkiewicz&lt;/a&gt; - &lt;strong&gt;Liczba lajków: 32&lt;/strong&gt;!&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Wszystko jasne!&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Zwyciężczynią konkursu jest &lt;strong&gt;Mary Pieroszkiewicz&lt;/strong&gt; 🎉&lt;/p&gt;

&lt;p&gt;Serdeczne gratulacje! W ciągu kilku dni organizator konferencji skontaktuje
się z Tobą, w celu wygenerowania biletu. Do zobaczenia na konferencji!&lt;/p&gt;

&lt;p class=&quot;chapter-break&quot;&gt;•&lt;/p&gt;

&lt;p&gt;PS Największym zaskoczeniem dla mnie była dyskusja na jednej z grup
fejsbukowych, gdzie &lt;code class=&quot;highlighter-rouge&quot;&gt;Kamil Piskorz&lt;/code&gt; udostępnił &lt;a href=&quot;https://www.facebook.com/groups/257881290932879/permalink/1323753447678986/?match=cGllY2lvc2hrYS5wbCwjcGllY2lvc2hrYQ%3D%3D&quot;&gt;post&lt;/a&gt; (aby zobaczyć treść
pod tym linkiem nie musisz przynależeć do żadnej grupy). Dziękuję Kamilowi,
za zaangażowanie tylu ludzi lajkujących przerobione zdjęcie autorstwa
&lt;code class=&quot;highlighter-rouge&quot;&gt;Marka Pietrzaka&lt;/code&gt;.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/conference-js-poland-2017/remake.jpg&quot; alt=&quot;Przeróbka zdjęcia&quot; /&gt;
    &lt;figcaption&gt;
        &lt;a href=&quot;https://www.facebook.com/photo.php?fbid=1499539523403531&amp;amp;set=p.1499539523403531&amp;amp;type=3&amp;amp;theater&quot;&gt;Przeróbka&lt;/a&gt;
        mojego zdjęcia. Prawda, że lepiej?
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;!-- Resources --&gt;

</description>
            <pubDate>Wed, 19 Apr 2017 11:34:28 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2017/04/19/wygraj-bilet-na-konferencje-js-poland-2017.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2017/04/19/wygraj-bilet-na-konferencje-js-poland-2017.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/conference-js-poland-2017/js-poland-526x275.png</image>
        </item>
        
        <item>
            <title>Midnight Commander — narzędzie odporne na czas</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Czy pamiętasz to narzędzie? Stare czasy, kiedy nie było popularnych
graficznych rozwiązań tego typu. W sumie, kiedy zobaczyłem profil &lt;code class=&quot;highlighter-rouge&quot;&gt;mc&lt;/code&gt; na
Wikipedii to widzę, że ten fantastyczny projekt powstał 5 lat po moich
urodzinach, czyli na &lt;abbr title=&quot;2017 rok&quot;&gt;tą&lt;/abbr&gt; chwilę 23 lata temu.&lt;/p&gt;

&lt;p&gt;W tym momencie powinny pojawić się w Twojej głowie pytania:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;co to jest &lt;code class=&quot;highlighter-rouge&quot;&gt;mc&lt;/code&gt;?&lt;/li&gt;
  &lt;li&gt;po co zajmować się tak starym narzędziem?&lt;/li&gt;
  &lt;li&gt;oraz jak mi się przydaje?&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;co-to-jest-mc&quot;&gt;Co to jest &lt;code class=&quot;highlighter-rouge&quot;&gt;mc&lt;/code&gt;?&lt;/h2&gt;

&lt;p&gt;Midnight Commander, w skrócie &lt;code class=&quot;highlighter-rouge&quot;&gt;mc&lt;/code&gt; - to prosty lecz wielofunkcyjny manager
plików i katalogów, znany z czasów kiedy nie było Total Commandera, a jego
protoplasta Norton Commander dopiero raczkował.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;h3 id=&quot;gwoli-ścisłości&quot;&gt;Gwoli ścisłości&lt;/h3&gt;
  &lt;p&gt;Starszym programem tego typu jest &lt;code class=&quot;highlighter-rouge&quot;&gt;Norton Commander&lt;/code&gt;, który był przeznaczony
dla systemu MS-DOS. Program &lt;code class=&quot;highlighter-rouge&quot;&gt;Midnight Commander&lt;/code&gt; to rozwiązania
multi-platformowe.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id=&quot;instalacja&quot;&gt;Instalacja&lt;/h2&gt;

&lt;p&gt;W mojej obecnej konfiguracji sprzętowo-software-owej (używam &lt;strong&gt;macOS Sierra&lt;/strong&gt;),
najszybsza instalacja &lt;code class=&quot;highlighter-rouge&quot;&gt;mc&lt;/code&gt; polega na uruchomieniu polecenia:&lt;/p&gt;

&lt;p&gt;&lt;kbd&gt;Copy + paste&lt;/kbd&gt;&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;brew &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;mc
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;konfiguracja&quot;&gt;Konfiguracja&lt;/h2&gt;

&lt;p&gt;W systemach &lt;strong&gt;macOS&lt;/strong&gt;, plik konfiguracyjny narzędzia dostępny jest w
następującej lokalizacji:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;~/.config/mc/ini
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;blockquote&gt;
  &lt;h3 id=&quot;dla-przypomnienia&quot;&gt;Dla przypomnienia&lt;/h3&gt;
  &lt;p&gt;~ (tylda) znak ten odnosi się do katalogu domowego użytkownika&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3 id=&quot;katalog-ze-skórkami&quot;&gt;Katalog ze skórkami&lt;/h3&gt;

&lt;p&gt;Po instalacji za pomocą narzędzia &lt;code class=&quot;highlighter-rouge&quot;&gt;brew&lt;/code&gt; (Homebrew), które instaluje paczki w
katalogu:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;/usr/local/Cellar/
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;katalog ze skórkami aplikacji znajduje się tutaj:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;/usr/local/Cellar/midnight-commander/4.8.18/share/mc/skins
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Po co to piszę? Ponieważ nigdzie nie jest powiedziane, że Twój &lt;code class=&quot;highlighter-rouge&quot;&gt;file manager&lt;/code&gt;
musi tak wyglądać:&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/mc/mc-1.png&quot; alt=&quot;&quot; /&gt;
    &lt;figcaption&gt;
        Zrzut ekranu z głównego okna programu Midnight Commander wraz z
        domyślnym wyglądem.
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h3 id=&quot;zmiana-języka&quot;&gt;Zmiana języka&lt;/h3&gt;

&lt;p&gt;Kto nie miał problemów z wyświetlaniem polskich znaków w programach
unix-owych niech podniesie rękę.&lt;/p&gt;

&lt;p&gt;Nie widzę żadnej, w takim razie poradźmy sobie z tym odwiecznym problemem raz
na zawsze uruchamiając w taki sposób Midnight Commandera:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nv&quot;&gt;LANG&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;en_EN.UTF-8 mc
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Oczywiście, nikt nie chce uruchamiać narzędzia wpisując tyle znaków z
klawiatury, ale od czego są aliasy? Jeśli korzystasz z &lt;code class=&quot;highlighter-rouge&quot;&gt;bash&lt;/code&gt;a albo &lt;code class=&quot;highlighter-rouge&quot;&gt;zsh&lt;/code&gt;
to dodaj poniższą definicję do pliku z aliasami, np. &lt;code class=&quot;highlighter-rouge&quot;&gt;.bash_aliases&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;&lt;kbd&gt;Copy + paste&lt;/kbd&gt;&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;alias &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;mc&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'LANG=en_EN.UTF-8 mc'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Od teraz wystarczy w terminalu wydać polecenie:&lt;/p&gt;

&lt;p&gt;&lt;kbd&gt;Copy + paste&lt;/kbd&gt;&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;mc
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;aby uruchomić opisywane narzędzie.&lt;/p&gt;

&lt;blockquote class=&quot;block-good&quot;&gt;
  &lt;h3 id=&quot;-wskazówka&quot;&gt;&lt;i class=&quot;icon-good&quot;&gt;&lt;/i&gt; Wskazówka&lt;/h3&gt;
  &lt;p&gt;Psst… Jeśli alias nie zadziałał należy przeładować shella. Z tym
problemem można sobie poradzić na 2 sposoby:&lt;/p&gt;
  &lt;ol&gt;
    &lt;li&gt;Otworzyć nowy terminal, np. skrót &lt;kbd&gt;cmd + t&lt;/kbd&gt;&lt;/li&gt;
    &lt;li&gt;Załadować plik konfiguracyjny dzięki poleceniu: &lt;code class=&quot;highlighter-rouge&quot;&gt;source ~/.bash_aliases&lt;/code&gt;&lt;/li&gt;
  &lt;/ol&gt;
&lt;/blockquote&gt;

&lt;h2 id=&quot;popularne-operacje-w-mc&quot;&gt;Popularne operacje w &lt;code class=&quot;highlighter-rouge&quot;&gt;mc&lt;/code&gt;&lt;/h2&gt;

&lt;h3 id=&quot;1-kompresowanie-katalogu&quot;&gt;1) Kompresowanie katalogu&lt;/h3&gt;

&lt;ol&gt;
  &lt;li&gt;Wejdź do katalogu, który chcesz kompresować.&lt;/li&gt;
  &lt;li&gt;Ustaw się wewnątrz katalogu na wskaźniku wyżej, tj: &lt;code class=&quot;highlighter-rouge&quot;&gt;..&lt;/code&gt;.&lt;/li&gt;
  &lt;li&gt;Naciśnij klawisz &lt;kbd&gt;F2&lt;/kbd&gt;, a potem wybierz tryb kompresji:
    &lt;ul&gt;
      &lt;li&gt;&lt;kbd&gt;3&lt;/kbd&gt;, jeśli chcesz stworzyć archiwum typu: &lt;code class=&quot;highlighter-rouge&quot;&gt;tar.gz&lt;/code&gt;&lt;/li&gt;
      &lt;li&gt;&lt;kbd&gt;4&lt;/kbd&gt;, jeśli chcesz stworzyć archiwum typu: &lt;code class=&quot;highlighter-rouge&quot;&gt;tar.bz2&lt;/code&gt;&lt;/li&gt;
      &lt;li&gt;&lt;kbd&gt;5&lt;/kbd&gt;, jeśli chcesz stworzyć archiwum typu: &lt;code class=&quot;highlighter-rouge&quot;&gt;tar.7z&lt;/code&gt;&lt;/li&gt;
      &lt;li&gt;&lt;kbd&gt;6&lt;/kbd&gt;, jeśli chcesz stworzyć archiwum typu: &lt;code class=&quot;highlighter-rouge&quot;&gt;tar.xz&lt;/code&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Po zakończeniu pakowania, archiwum zostanie stworzone w katalogu, który w
 strukturze katalogów znajduje się wyżej.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3 id=&quot;2-zaznaczanie-plików&quot;&gt;2) Zaznaczanie plików&lt;/h3&gt;

&lt;p&gt;Zaznaczanie odbywa się za pomocą klawisza &lt;kbd&gt;ins&lt;/kbd&gt; (insert).&lt;/p&gt;

&lt;p&gt;Jeśli brakuje takiego klawisza na klawiaturze (i używasz systemu &lt;strong&gt;macOS&lt;/strong&gt;)
to skorzystaj ze skrótu &lt;kbd&gt;ctrl + t&lt;/kbd&gt;.&lt;/p&gt;

&lt;p&gt;Interesujące może być też zaznaczanie według wzorca (np. chcesz zaznaczyć
wszystkie pliki w folderze) w takim wypadku wykorzystaj skrót &lt;kbd&gt;+&lt;/kbd&gt;
(plus), aby wyświetlić dialog ze wzorcem.&lt;/p&gt;

&lt;p&gt;Odznaczanie polega na wybraniu znaku &lt;kbd&gt;-&lt;/kbd&gt; (minus), gdzie wyświetli się
dialog ze wzorcem plików, które zostaną odznaczone.&lt;/p&gt;

&lt;p&gt;Aby odznaczyć (albo zaznaczyć) całą zawartość katalogu wpisz &lt;code class=&quot;highlighter-rouge&quot;&gt;*&lt;/code&gt;.&lt;/p&gt;

&lt;h3 id=&quot;3-kopiowanie-plików-na-serwer&quot;&gt;3) Kopiowanie plików na serwer&lt;/h3&gt;

&lt;p&gt;Gdy chcesz skopiować swoje pliki na serwer połącz się do niego wykorzystując
protokół &lt;code class=&quot;highlighter-rouge&quot;&gt;SSH&lt;/code&gt; (&lt;code class=&quot;highlighter-rouge&quot;&gt;Secure Shell&lt;/code&gt;) wybierając opcję:&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/mc/mc-2.png&quot; alt=&quot;&quot; /&gt;
    &lt;figcaption&gt;
        Wybranie opcji: &quot;Right → Shell link&quot; programu Midnight Commander.
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Midnight Commander wykorzystuje protokół SSH, w komunikacji z serwerem, więc
jeśli Twój serwer wspiera ten protokół, to przetestuj kopiowanie plików -
zobaczysz jakie to proste. Nie trzeba instalować specjalnych programów, aby
zarządzać plikami na serwerze w sposób: &lt;strong&gt;szybki&lt;/strong&gt; oraz &lt;strong&gt;intuicyjny&lt;/strong&gt;.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;h3 id=&quot;osobiste-przemyślenia&quot;&gt;Osobiste przemyślenia&lt;/h3&gt;
  &lt;p&gt;Kiedyś nie miałem pojęcia o istnieniu tak prostych narzędzi i zastanawiałem
się jaki typ programu wybrać jako
&lt;a href=&quot;/blog/2011/09/03/klient-ftp-plugin-czy-program.html&quot;&gt;klient FTP&lt;/a&gt;.
Przeczytaj co myślałem 6 lat temu.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Manager wykorzystuje protokół
&lt;a href=&quot;https://en.wikipedia.org/wiki/Files_transferred_over_shell_protocol&quot;&gt;fish&lt;/a&gt; -
&lt;code class=&quot;highlighter-rouge&quot;&gt;Files transferred over shell protocol&lt;/code&gt; - który został specjalnie stworzony
na potrzeby opisywanego narzędzia.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/mc/mc-3.png&quot; alt=&quot;&quot; /&gt;
    &lt;figcaption&gt;
        Opis protokołu &quot;fish&quot; w programie Midnight Commander.
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;po-co-mi-takie-narzędzie&quot;&gt;Po co mi takie narzędzie?&lt;/h2&gt;

&lt;p&gt;Osobiście wykorzystuję &lt;code class=&quot;highlighter-rouge&quot;&gt;mc&lt;/code&gt; podczas kopiowania pliku na serwer VPS - opisywałem
tą możliwość powyżej. Nie chcę instalować programu do każdej operacji jaką
wykonują na swojej maszynie. Uważam, że dobry inżynier wykorzystuje dostępne
dla niego narzędzia (w danej sytuacji) zamiast instalować nowe.&lt;/p&gt;

&lt;p&gt;Czasami wykorzystuję jeszcze Midnight Commandera do porządkowania plików i
katalogów na dysku prywatnego komputera, bo przenoszenie folderów za pomocą
touchbara nie zawsze jest najszybszym rozwiązaniem.&lt;/p&gt;

&lt;h2 id=&quot;bibliografia&quot;&gt;&lt;a href=&quot;http://sjp.pwn.pl/szukaj/bibliografia.html&quot;&gt;Bibliografia&lt;/a&gt;&lt;/h2&gt;

&lt;p&gt;Stan na dzień: 2017-04-17&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Midnight_Commander&quot;&gt;https://en.wikipedia.org/wiki/Midnight_Commander&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Norton_Commander&quot;&gt;https://en.wikipedia.org/wiki/Norton_Commander&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Files_transferred_over_shell_protocol&quot;&gt;https://en.wikipedia.org/wiki/Files_transferred_over_shell_protocol&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Secure_Shell&quot;&gt;https://en.wikipedia.org/wiki/Secure_Shell&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
            <pubDate>Mon, 17 Apr 2017 00:00:00 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2017/04/17/midnight-commander-narzedzie-odporne-na-czas.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2017/04/17/midnight-commander-narzedzie-odporne-na-czas.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/mc/mc-526x275.jpg</image>
        </item>
        
        <item>
            <title>Dziedziczenie obiektów w JavaScript (bez użycia klas)</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Od 2015 roku dzięki specyfikacji ES6 a.k.a. ES2015 mamy możliwość stworzenia
klasy jako reprezentacji opisu obiektu, na podstawie której zostanie
on stworzony.&lt;/p&gt;

&lt;p&gt;Co jeśli architektura Twojej aplikacji nie opiera się na klasach?
A może po prostu nie jesteś zwolennikiem &lt;code class=&quot;highlighter-rouge&quot;&gt;Object-Oriented Programming&lt;/code&gt; (&lt;code class=&quot;highlighter-rouge&quot;&gt;OOP&lt;/code&gt;)?&lt;/p&gt;

&lt;p&gt;Taka sytuacja jest dosyć częsta, kiedy zaczynasz poznawać świat programowania
w JavaScript i klasy nie są jeszcze Ci znane.&lt;/p&gt;

&lt;p&gt;Z pomocą przychodzi wzorzec delegacji i styl &lt;code class=&quot;highlighter-rouge&quot;&gt;Objects Linked to Other
Objects&lt;/code&gt; (&lt;code class=&quot;highlighter-rouge&quot;&gt;OLOO&lt;/code&gt;), który swoją definicję posiada w książce “You Don’t Know JS”
autorstwa Kyle Simsona.&lt;/p&gt;

&lt;h2 id=&quot;dziedziczenie&quot;&gt;Dziedziczenie&lt;/h2&gt;

&lt;p&gt;Przykładowy model architektury w ujęciu klasycznym, czyli istnieją obiekty
główne (rodzice) oraz obiekty pochodne (dzieci).&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/inheritance/oop/scheme.png&quot; alt=&quot;&quot; /&gt;
    &lt;figcaption&gt;
        Schemat obiektów prostej architektury aplikacji
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;dziedziczenie-obiektów-nie&quot;&gt;Dziedziczenie obiektów? Nie!&lt;/h2&gt;

&lt;p&gt;Model architektury opartej na OLOO nie wprowadza hierarchii. On po prostu
informuje, że jeden obiekty będą korzystały z innych.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/inheritance/oloo/scheme.png&quot; alt=&quot;&quot; /&gt;
    &lt;figcaption&gt;
        Schemat obiektów prostej architektury aplikacji
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Tego procesu nie można nazwać dziedziczeniem, tylko delegacją.&lt;/p&gt;

&lt;p&gt;W specyfikacji ES2015 została zdefiniowana funkcja statyczna
&lt;code class=&quot;highlighter-rouge&quot;&gt;Object.setPrototypeOf&lt;/code&gt;, która łączy ze sobą &lt;strong&gt;obiekty&lt;/strong&gt; za pomocą wiązania
&lt;code class=&quot;highlighter-rouge&quot;&gt;__proto__&lt;/code&gt;. Wiązanie te występuje TYLKO w obiektach, w funkcjach “od zawsze”
istnieje inne wiązanie, tj: “prototype”.&lt;/p&gt;

&lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;point&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;draw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;c1&quot;&gt;// ...&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;};&lt;/span&gt;

&lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;point1&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;};&lt;/span&gt;
&lt;span class=&quot;nx&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;typeof&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;point1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;draw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// undefined&lt;/span&gt;

&lt;span class=&quot;nb&quot;&gt;Object&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;setPrototypeOf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;point1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;point&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

&lt;span class=&quot;nx&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;point1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;hasOwnProperty&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'draw'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;));&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// false&lt;/span&gt;
&lt;span class=&quot;nx&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'draw'&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;point1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// true&lt;/span&gt;
&lt;span class=&quot;nx&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;typeof&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;point1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;draw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// &quot;function&quot;&lt;/span&gt;

&lt;span class=&quot;kd&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;point2&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;50&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;50&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;};&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;Object&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;setPrototypeOf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;point2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;point&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;weryfikacja&quot;&gt;Weryfikacja&lt;/h3&gt;

&lt;p&gt;Aby móc zweryfikować aktualny stan proponuję uruchomić:&lt;/p&gt;

&lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;// Check: Different points&lt;/span&gt;
&lt;span class=&quot;nx&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;point1&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;!==&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;point2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// true&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;// Same definition of &quot;draw&quot; method&lt;/span&gt;
&lt;span class=&quot;nx&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;point&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;draw&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;point1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;draw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// true&lt;/span&gt;
&lt;span class=&quot;nx&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;point&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;draw&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;point2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;draw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// true&lt;/span&gt;
&lt;span class=&quot;nx&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;point1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;draw&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;point2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;draw&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;wsparcie-systemowe&quot;&gt;Wsparcie systemowe&lt;/h2&gt;

&lt;p&gt;Ale gdzie można używać takiej składni zapytasz? Otóż dzięki
najpopularniejszemu zestawieniu wsparcia feature-ów JavaScript-owych,
realizowanemu przez &lt;a href=&quot;https://twitter.com/kangax&quot;&gt;Kangax-a&lt;/a&gt;, możemy się
dowiedzieć, że:&lt;/p&gt;

&lt;h3 id=&quot;jest-wsparcie&quot;&gt;Jest wsparcie&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Google Chrome 57+ (Opera 44+)&lt;/li&gt;
  &lt;li&gt;Firefox 52+&lt;/li&gt;
  &lt;li&gt;Safari:
    &lt;ul&gt;
      &lt;li&gt;desktop: 10+&lt;/li&gt;
      &lt;li&gt;mobile: 9+&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Microsoft
    &lt;ul&gt;
      &lt;li&gt;IE 11&lt;/li&gt;
      &lt;li&gt;Edge 14+&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Node.js 4+&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;brak-wsparcia&quot;&gt;Brak wsparcia&lt;/h3&gt;

&lt;p&gt;Niestety, ale żaden transpiler nie pomoże w zapewnieniu wsparcia
wykorzystania funkcji &lt;code class=&quot;highlighter-rouge&quot;&gt;Object.setPrototypeOf&lt;/code&gt;:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Babel.js&lt;/li&gt;
  &lt;li&gt;Traceur&lt;/li&gt;
  &lt;li&gt;Closure&lt;/li&gt;
  &lt;li&gt;TypeScript&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Link do pełnego &lt;a href=&quot;https://kangax.github.io/compat-table/es6/&quot;&gt;zestawienia&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;polyfill&quot;&gt;Polyfill&lt;/h2&gt;

&lt;p&gt;Link do definicji polyfilla znajduje się na
&lt;a href=&quot;https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object/setPrototypeOf&quot;&gt;MDN&lt;/a&gt;
jednak, abyś mógł szybko zobaczyć jak on wygląda umieszczę go tutaj:&lt;/p&gt;

&lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;// Only works in Chrome and FireFox, does not work in IE:&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;Object&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;setPrototypeOf&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;Object&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;setPrototypeOf&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;||&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;obj&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;proto&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;nx&quot;&gt;obj&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;__proto__&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;proto&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;obj&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
</description>
            <pubDate>Sat, 15 Apr 2017 00:00:00 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2017/04/15/dziedziczenie-obiektow-w-javascript-bez-uzycia-klas.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2017/04/15/dziedziczenie-obiektow-w-javascript-bez-uzycia-klas.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/inheritance/oop/scheme.png</image>
        </item>
        
        <item>
            <title>Jak stworzyć swój szablon do Cleaver?</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Cleaver to narzędzia, które na podstawie pliku w formacie Markdown (&lt;code class=&quot;highlighter-rouge&quot;&gt;*.md&lt;/code&gt;)
tworzy slajdy w formacie HTML (po uprzednim zbudowaniu za pomocą polecania w
terminalu).&lt;/p&gt;

&lt;p&gt;Format Markdown to pewnego rodzaju standard w świecie programistycznym.
I dobrze. Składnia jest prosta, ale nie uboga. Format ten daje duże możliwości
w przygotowaniu dobrze sformatowanego tekstu.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/cleaver/cleaver.jpg&quot; itemprop=&quot;image&quot; alt=&quot;Baner promujący artykuł&quot; /&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;jak-stworzyć-nowy-temat&quot;&gt;Jak stworzyć nowy temat?&lt;/h2&gt;

&lt;p&gt;Aby stworzyć własny szablon należy stworzyć 5 plików:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;layout.mustache&lt;/code&gt;&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;Szablon głównej strony (w stylu &lt;code class=&quot;highlighter-rouge&quot;&gt;index.html&lt;/code&gt;). Zawiera definicję
  strukturę strony.&lt;/li&gt;
      &lt;li&gt;
        &lt;p&gt;Aby wyświetlić zawartość pliku &lt;code class=&quot;highlighter-rouge&quot;&gt;template.mustache&lt;/code&gt; należy wykorzystać
  składnię (bez spacji między nawiasami): &lt;code class=&quot;highlighter-rouge&quot;&gt;{ { {  slideshow } } }&lt;/code&gt;&lt;/p&gt;

        &lt;p&gt;&lt;strong&gt;Uwaga&lt;/strong&gt;: &lt;em&gt;jeśli zamiast 3 nawiasów zostaną użyte tylko 2, to zawartość
  zmiennej zostanie po prostu zwrócona. 3 nawiasy powodują, że treść jest
  sparsowana do HTMLa.&lt;/em&gt;&lt;/p&gt;
      &lt;/li&gt;
      &lt;li&gt;Warto wykorzystać pola &lt;code class=&quot;highlighter-rouge&quot;&gt;author&lt;/code&gt; oraz &lt;code class=&quot;highlighter-rouge&quot;&gt;encoding&lt;/code&gt; aby wpisać odpowiednie
  metadane (znaczniki &lt;code class=&quot;highlighter-rouge&quot;&gt;&amp;lt;meta&amp;gt;&lt;/code&gt;).&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;script.js&lt;/code&gt;&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;Obecnie jest to pusty plik. Można tutaj dołożyć jakieś dodatkowe
  feature-y do slajdów, np. zegarek.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;settings.json&lt;/code&gt;&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;Konfiguracja projektu.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;style.css&lt;/code&gt;&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;Wygląd slajdów.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;template.mustache&lt;/code&gt;&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;Szablon listy slajdów.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Polecam stworzyć te pliku w osobnym katalogu, aby potem w pliku ze slajdami
móc zdefiniować ścieżkę do katalogu z customowym tematem:&lt;/p&gt;

&lt;div class=&quot;language-markdown highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;title: My Custom Theme
output: demo/slides.html
theme: ../my-custom-theme
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;marna-dokumentacja-cleaver-a&quot;&gt;Marna dokumentacja Cleaver-a&lt;/h2&gt;

&lt;p&gt;W źródłach projektu &lt;code class=&quot;highlighter-rouge&quot;&gt;cleaver&lt;/code&gt; znajduje się plik &lt;code class=&quot;highlighter-rouge&quot;&gt;cleaver/lib/index.js&lt;/code&gt;,
w którym w okolicach 250 linijki jest stworzona zmienna &lt;code class=&quot;highlighter-rouge&quot;&gt;layoutData&lt;/code&gt;, która
to definiuje listę zmiennych. Będą one wstrzykiwane w szablon. Niestety
nigdzie w dokumentacji nie ma informacji jakie pola można wykorzystać.&lt;/p&gt;

&lt;p&gt;Stwierdziłem więc, że napiszę o tym post. Może komuś się przyda.&lt;/p&gt;

&lt;h2 id=&quot;slajdy&quot;&gt;Slajdy&lt;/h2&gt;

&lt;p&gt;W pliku z definicją slajdów (plik z rozszerzeniem &lt;code class=&quot;highlighter-rouge&quot;&gt;.md&lt;/code&gt;), na górze tego pliku
można zdefiniować listę parametrów, które Cleaver rozumie.&lt;/p&gt;

&lt;p&gt;Oto lista wspieranych pól:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;author&lt;/code&gt; - login z Twitter-a autora slajdów&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;title&lt;/code&gt; - tytuł slajdów (domyślnie: &lt;code class=&quot;highlighter-rouge&quot;&gt;Untitled&lt;/code&gt;)&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;encoding&lt;/code&gt; - kodowanie plików (domyślnie: &lt;code class=&quot;highlighter-rouge&quot;&gt;utf-8&lt;/code&gt;)&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;script&lt;/code&gt; - ścieżka albo URL do pliku JavaScript&lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;style&lt;/code&gt; - obecnie jest to ścieżka albo URL do pliku CSS.&lt;/p&gt;

    &lt;p&gt;Stworzyłem &lt;a href=&quot;https://github.com/jdan/cleaver/pull/167&quot;&gt;Pull Request&lt;/a&gt;, gdzie
  dodałem wsparcie do osadzenia wielu plików.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;slideshow&lt;/code&gt; - tutaj zostanie wstrzyknięta lista slajdów&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;options&lt;/code&gt; - nieznany obiekt (nie wiem jak można go wykorzystać)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;mój-własny-temat&quot;&gt;Mój własny temat&lt;/h2&gt;

&lt;p&gt;Przedstawiam Wam prosty przykład szablonu mojego autorstwa:&lt;br /&gt;
&lt;a href=&quot;https://github.com/piecioshka/my-cleaver-theme&quot;&gt;https://github.com/piecioshka/my-cleaver-theme&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Projekt dostępny jest w moim portfolio projektów na GitHubie.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;Projekt w katalogu &lt;code class=&quot;highlighter-rouge&quot;&gt;theme/&lt;/code&gt; zawiera 5 wymaganych plików.&lt;/p&gt;

    &lt;ul&gt;
      &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;layout.mustache&lt;/code&gt;&lt;/li&gt;
      &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;script.js&lt;/code&gt;&lt;/li&gt;
      &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;settings.json&lt;/code&gt;&lt;/li&gt;
      &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;style.css&lt;/code&gt;&lt;/li&gt;
      &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;template.mustache&lt;/code&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Natomiast w katalogu &lt;code class=&quot;highlighter-rouge&quot;&gt;demo/&lt;/code&gt; jest plik &lt;code class=&quot;highlighter-rouge&quot;&gt;slides.md&lt;/code&gt;, która po wykonaniu
 polecenia &lt;code class=&quot;highlighter-rouge&quot;&gt;npm run build&lt;/code&gt; zostanie wykorzystany do stworzenia pliku
 &lt;code class=&quot;highlighter-rouge&quot;&gt;demo/slides.html&lt;/code&gt;.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;linki&quot;&gt;Linki&lt;/h2&gt;

&lt;p&gt;Dokumentacja projektu:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/jdan/cleaver/wiki/Theme-Index&quot;&gt;https://github.com/jdan/cleaver/wiki/Theme-Index&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/sjaakvandenberg/cleaver-start&quot;&gt;https://github.com/sjaakvandenberg/cleaver-start&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Lista narzędzi, które podobnie jak Cleaver konwertują format Markdown do
formatu HTMLa w formie slajdów:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/partageit/markdown-to-slides&quot;&gt;https://github.com/partageit/markdown-to-slides&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/trabe/slide-pack&quot;&gt;https://github.com/trabe/slide-pack&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/gnab/remark&quot;&gt;https://github.com/gnab/remark&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/juanpabloaj/platon&quot;&gt;https://github.com/juanpabloaj/platon&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
            <pubDate>Thu, 13 Apr 2017 00:00:00 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2017/04/13/jak-stworzyc-swoj-szablon-do-cleaver.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2017/04/13/jak-stworzyc-swoj-szablon-do-cleaver.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/cleaver/cleaver.jpg</image>
        </item>
        
        <item>
            <title>Jak zacząć programować?</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Niby proste pytanie. Jednak nie do końca. Jako developer oraz trener z
wieloletnim stażem chciałbym pokazać Ci mój punkt widzenia na tą kwestię.&lt;/p&gt;

&lt;p&gt;Sama idea programowania polega na wpisywaniu odpowiednich znaków z klawiatury.
Znajomość kolejności tych znaków powoduje, że piszemy dobry albo zły kod.&lt;/p&gt;

&lt;p&gt;Proponuję wydzielić kilka sytuacji, w których pada tytułowe pytanie.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/how-to-start/how-to-start.jpg&quot; itemprop=&quot;image&quot; alt=&quot;Baner promujący artykuł&quot; /&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;1-sytuacja-jarząbek&quot;&gt;1 sytuacja: Jarząbek&lt;/h2&gt;

&lt;blockquote&gt;
  &lt;p&gt;Moje doświadczenie z komputerami jest małe. Potrafię sprawdzić pocztę
i obejrzeć film na YouTube. Chciałbym spróbować sił w programowaniu, ale nie
wiem od czego zacząć.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Proponuję zacząć od tego czy w ogóle jesteś w stanie wysiedzieć długo przed
komputerem czytając i wklepując “jakieś dziwne” znaczki z klawiatury.&lt;/p&gt;

&lt;p&gt;Potrzebujesz weryfikacji w temacie posiadania zdolności analitycznych.
Jest kilka serwisów, które oferują przetestowanie tychże zdolności poprzez
rozwiązywanie zagadek algorytmicznych. Jednym z takim portali jest godny
polecenia: &lt;a href=&quot;https://studio.code.org/&quot;&gt;studio.code.org/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Portale o programowaniu “dla dzieci” posiadają inne podejście do
programowania. Omawiane podejście jest podobne do tego w jaki sposób uczyliśmy
się w szkole, dlatego też dla osób początkujących będzie to właściwy wybór.&lt;/p&gt;

&lt;h2 id=&quot;2-sytuacja-zdolny-internauta&quot;&gt;2 sytuacja: Zdolny internauta&lt;/h2&gt;

&lt;blockquote&gt;
  &lt;p&gt;Potrafię wykorzystać komputer do tego, aby mi pomagał rozwijać moje
umiejętności. Radzę sobie doskonale z wyszukiwaniem informacji w sieci.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Jesteś konsekwentny w działaniu i wiesz, że komputer potrafi więcej niż
na pierwszy rzut oka się wydaje. Spróbuj zrobić kilka lekcji z darmowych
kursów online np. &lt;a href=&quot;https://www.codecademy.com/&quot;&gt;codecademy.com/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Jeśli chęć programowania będzie się utrzymywała polecam zakup literatury,
bądź kontynuowania realizowania kursów online. Jest ich cała masa. Na pewno
godnym polecenia jest serwis
&lt;a href=&quot;https://www.freecodecamp.com/&quot;&gt;freecodecamp.com/&lt;/a&gt;&lt;/p&gt;

&lt;h2 id=&quot;3-sytuacja-aspirujący-developer&quot;&gt;3 sytuacja: Aspirujący developer&lt;/h2&gt;

&lt;blockquote&gt;
  &lt;p&gt;Wiem, że programowanie to jest to, co chcę robić, ale nie wiem skąd czerpać
wiedzę, aby się go nauczyć.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Idealnym rozwiązaniem w tej sytuacji jest znalezienie mentora, który
poprowadzi Cię przez ten etap mając kontrolę nad tym czego się uczysz.&lt;/p&gt;

&lt;p&gt;Ten etap jest błogosławieństwem dla trenera. Każdy opiekun chce wyszkolić
taką jednostkę, aby stała się ona jeszcze lepsza i żeby rozpoczęła pracę, gdzie
będzie rozwijać swoje umiejętności programistyczne.&lt;/p&gt;

&lt;p&gt;Na tym etapie najważniejsze jest tworzenie projektów. Takich prostych -
testowych, ale też i takich, które wzbogacą Twoje portfolio projektów.&lt;/p&gt;

&lt;p&gt;Portfolio jest drugą rzeczą na jaką pracodawcy patrzą podczas oceniania
kandydatów. A co jest pierwszą zapytasz? Oczywiście umiejętności techniczne.&lt;/p&gt;

&lt;h2 id=&quot;szkoły-programowania&quot;&gt;Szkoły programowania&lt;/h2&gt;

&lt;p&gt;Od kiedy programowanie stało się tak bardzo popularnym zawodem, powstały
szkoły programowania, które szkolą adeptów, aby po kursie mogli oni znaleźć
swoją pierwszą pracę jako junior developerzy.&lt;/p&gt;

&lt;p&gt;Cena za taki kurs może wydawać się ogromna, ponieważ często sięga ona ok. 10
tyś zł. Może się wydawać, że jest to problem, którego nie da się łatwo
rozwiązać. Jeśli popatrzy się na ten problem z drugiej strony, to pracując
kilka miesięcy jako programista będziesz w stanie zarobić tyle pieniędzy, że
koszt takiego kursu szybko Ci się zwróci.&lt;/p&gt;

&lt;h2 id=&quot;problem-z-zatrudnieniem&quot;&gt;Problem z zatrudnieniem?&lt;/h2&gt;

&lt;p&gt;Wiele razy miałem takich uczniów, którzy mocno chcieli się uczyć, bo byli
zdecydowani aby zmienić pracę. Jednak w życiu nie jest tak kolorowo. Wielu
ludziom wydaje się, że wystarczy poświęcić kilka dni, aby liznąć wierzchnią
warstwę programowania i sądzą oni, że pracodawcy zatrudnią ich z ucałowaniem
ręki.&lt;/p&gt;

&lt;p&gt;Nie ma tak łatwo.&lt;/p&gt;

&lt;p&gt;Rynek IT jest obecnie mocno nienasycony. Nie znaczy to jednak tego, że
wystarczy posiedzieć kilkadziesiąt godzin przy komputerze aby szukać pracodawcy,
który zaoferuje olbrzymią pensję.&lt;/p&gt;

&lt;h2 id=&quot;jak-zdobyć-pierwszą-pracę&quot;&gt;Jak zdobyć pierwszą pracę?&lt;/h2&gt;

&lt;p&gt;Ze swojej strony rekomenduję pisać do dużych firm, które poszukują
programistów dowolnego szczebla. Firmy rzadko kiedy tworzą oferty na
juniorskie stanowiska, bo wiedzą, że na stanowiska dla regularnych
developerów i tak zgłoszą się Ci, którzy nie mają wymaganego doświadczenia i
umiejętności.&lt;/p&gt;

&lt;p&gt;Dlatego też, pisząc swoje CV zadbaj o to aby było ono czytelne i mieściło się na
1 stronie. Pierwsze taki dokument (raczej) nie będzie posiadać dużej ilości
umiejętności więc nie opisuj całego swojego życiorysu, tylko po to, aby CV
było dwustronicowe.&lt;/p&gt;

&lt;p&gt;To nie wykształcenie będzie zarabiać pieniądze lecz Twój skill
programistyczny. Sekcję z wykształceniem umieść zaraz po umiejętnościach.&lt;/p&gt;

&lt;h2 id=&quot;podsumowanie&quot;&gt;Podsumowanie&lt;/h2&gt;

&lt;p&gt;Co powinieneś zapamiętać z tgo artykułu?&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Programowanie to praca w której ciągle trzeba się rozwijać.&lt;/li&gt;
  &lt;li&gt;Na początku swojej kariery dobrze jest poprosić doświadczonego developera
  o pomoc, aby nie tracić czasu na poszukiwanie informacji.&lt;/li&gt;
&lt;/ul&gt;
</description>
            <pubDate>Sun, 09 Apr 2017 00:00:00 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2017/04/09/jak-zaczac-programowac.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2017/04/09/jak-zaczac-programowac.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/how-to-start/how-to-start.jpg</image>
        </item>
        
        <item>
            <title>Struktura katalogów w projekcie front-endowym</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Każdy ma swój sposób na definicję struktury katalogów w projekcie. Chcę przedstawi Ci mój punkt widzenia. Na wstępie chciałbym abyśmy rozmawiali tym samym językiem więc przedstawię Ci pewną zasadę.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;strong&gt;Aplikacja&lt;/strong&gt; i &lt;strong&gt;projekt&lt;/strong&gt; to dwa różne elementy.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Projekt zawiera w sobie źródła aplikacji, ale również inne elementy konfiguracyjne takie jak: ustawienia systemu kontroli wersji, dokumentację, testy jednostkowe etc.&lt;/p&gt;

&lt;p&gt;Aplikacja zawiera kod źródłowy z implementacją logiki, definicją wyglądu etc.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/project-structure/project-structure.jpg&quot; itemprop=&quot;image&quot; alt=&quot;Baner promujący artykuł&quot; /&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;opcja-1---jeden-katalog-z-aplikacją-app&quot;&gt;Opcja #1 - Jeden katalog z aplikacją (&lt;code class=&quot;highlighter-rouge&quot;&gt;app/&lt;/code&gt;)&lt;/h2&gt;

&lt;p&gt;Główny plik HTML odpowiedzialny jest za dołączenie wszystkich plików &lt;code class=&quot;highlighter-rouge&quot;&gt;*.js&lt;/code&gt; oraz &lt;code class=&quot;highlighter-rouge&quot;&gt;*.css&lt;/code&gt;. Oczywiście &lt;code class=&quot;highlighter-rouge&quot;&gt;main.css&lt;/code&gt; może importować inne definicje styli więc nie trzeba koniecznie dołączać wszystkich plików w &lt;code class=&quot;highlighter-rouge&quot;&gt;index.html&lt;/code&gt;.&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;.&lt;/span&gt;
├── app
│   ├── images
│   │   ├── banner.jpg
│   │   ├── favicon.ico
│   │   └── logo.png
│   ├── scripts
│   │   ├── main.js
│   │   └── module-1.js
│   ├── styles
│   │   ├── main.css
│   │   └── module-1.css
│   └── index.html
├── .gitignore
├── README.md
└── package.json
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Czasami bywa tak, że z uwagi na prostotę projektu katalog &lt;code class=&quot;highlighter-rouge&quot;&gt;app/&lt;/code&gt; nie jest tworzony. Wtedy taka architektura niweluje tą wyraźną różnicę między &lt;strong&gt;aplikacją&lt;/strong&gt; a &lt;strong&gt;projektem&lt;/strong&gt;.&lt;/p&gt;

&lt;h3 id=&quot;kiedy-warto-zastosować&quot;&gt;Kiedy warto zastosować?&lt;/h3&gt;

&lt;p&gt;Opisaną architekturę warto wykorzystać w sytuacji bardzo prostego projektu, który nie będzie poddawany długiemu procesu utrzymania aplikacji.&lt;/p&gt;

&lt;blockquote class=&quot;block-average&quot;&gt;
  &lt;h3 id=&quot;-uwaga&quot;&gt;&lt;i class=&quot;icon-average&quot;&gt;&lt;/i&gt; Uwaga&lt;/h3&gt;
  &lt;p&gt;Jeśli wrzucimy taki katalog na serwer, to dajemy użytkownikowi podgląd pliku &lt;code class=&quot;highlighter-rouge&quot;&gt;.gitignore&lt;/code&gt; i &lt;code class=&quot;highlighter-rouge&quot;&gt;package.json&lt;/code&gt;, które nie powinny być dla niego dostępne. Jeśli kopiujemy cały katalog na serwer to najgroźniejsze jest to, że możemy skopiować także katalog &lt;code class=&quot;highlighter-rouge&quot;&gt;.git&lt;/code&gt;, gdzie zapisana jest historia zmian projektu.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3 id=&quot;jak-to-wygląda-w-praktyce&quot;&gt;Jak to wygląda w praktyce?&lt;/h3&gt;

&lt;p&gt;Przykłady zrealizowanych projektów:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/piecioshka/warsawjs-workshop-3-online-shop&quot;&gt;https://github.com/piecioshka/warsawjs-workshop-3-online-shop&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/piecioshka/patterns-guide/tree/main/demo/mvc&quot;&gt;https://github.com/piecioshka/patterns-guide/tree/main/demo/mvc&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/piecioshka/test-phaser-collision&quot;&gt;https://github.com/piecioshka/test-phaser-collision&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;opcja-2---wykorzystanie-bundlera-modułów-dist&quot;&gt;Opcja #2 - Wykorzystanie bundlera modułów (&lt;code class=&quot;highlighter-rouge&quot;&gt;dist/&lt;/code&gt;)&lt;/h2&gt;

&lt;p&gt;Kolejnym bardzo częstym rozwiązaniem jest wykorzystanie narzędzia typu &lt;code class=&quot;highlighter-rouge&quot;&gt;module bundler&lt;/code&gt;, które tworzy katalog &lt;code class=&quot;highlighter-rouge&quot;&gt;dist/&lt;/code&gt; wraz z jednym plikiem &lt;code class=&quot;highlighter-rouge&quot;&gt;*.js&lt;/code&gt; po to, aby nie dołączać wszystkich plików &lt;code class=&quot;highlighter-rouge&quot;&gt;*.js&lt;/code&gt; w &lt;code class=&quot;highlighter-rouge&quot;&gt;index.html&lt;/code&gt;.&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;.&lt;/span&gt;
├── app
│   ├── dist        &lt;span class=&quot;c&quot;&gt;# katalog zawierający wynik pracy module bundlera&lt;/span&gt;
│   │   └── bundle.js    &lt;span class=&quot;c&quot;&gt;# wynik pracy module bundlera np. Webpacka&lt;/span&gt;
│   ├── images
│   │   ├── banner.jpg
│   │   ├── favicon.ico
│   │   └── logo.png
│   ├── scripts
│   │   ├── main.js
│   │   └── module-1.js
│   ├── styles
│   │   ├── main.css
│   │   └── module-1.css
│   └── index.html
├── .gitignore
├── README.md
└── package.json
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Różnica między opcją &lt;strong&gt;#1&lt;/strong&gt; a &lt;strong&gt;#2&lt;/strong&gt; jest zasadnicza. Wszystkie pliki &lt;code class=&quot;highlighter-rouge&quot;&gt;*.js&lt;/code&gt; zostają potraktowane przez dowolny &lt;code class=&quot;highlighter-rouge&quot;&gt;module bundler&lt;/code&gt; (np. Webpack, Browserify) i sklejone w jeden plik wynikowy (lub więcej jeśli pojawi się taka potrzeba) tzw. “bundle” (pakiet, paczka).&lt;/p&gt;

&lt;p&gt;Katalog &lt;code class=&quot;highlighter-rouge&quot;&gt;dist/&lt;/code&gt; zawiera źródła projektu, czyli pliki &lt;code class=&quot;highlighter-rouge&quot;&gt;*.js&lt;/code&gt; oraz ich mapy (pliki o rozszerzeniu &lt;code class=&quot;highlighter-rouge&quot;&gt;*.js.map&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;Oczywiście katalog &lt;code class=&quot;highlighter-rouge&quot;&gt;dist/&lt;/code&gt; nie powinien być dodawany do systemu kontroli wersji (np. Git). Nie ma sensu wersjonować zbudowanego kodu, dlatego też warto go &lt;a href=&quot;%7B%%20post_url%202017-02-06-globalna-konfiguracja-gita%20%%7D&quot;&gt;wykluczyć&lt;/a&gt; .&lt;/p&gt;

&lt;p&gt;Wyjątkiem od tej zasady jest tworzenie bibliotek, które charakteryzują się tym, że dla korzystających nie jest ważne z ilu plików zostały stworzone oraz czy są budowane z użyciem transpilera. W projektach tego typu najważniejszy jest plik wynikowy, czyli plik z biblioteką (plikiem) gotowym do użytku.&lt;/p&gt;

&lt;h3 id=&quot;kiedy-warto-zastosować-1&quot;&gt;Kiedy warto zastosować?&lt;/h3&gt;

&lt;p&gt;Ta architektura z uwagi na wykorzystanie &lt;code class=&quot;highlighter-rouge&quot;&gt;module bundlera&lt;/code&gt; pomocna jest w sytuacji większego projektu. Wykorzystanie Webpacka z definicji pomaga w zarządzaniu modułami.&lt;/p&gt;

&lt;h3 id=&quot;jak-to-wygląda-w-praktyce-1&quot;&gt;Jak to wygląda w praktyce?&lt;/h3&gt;

&lt;p&gt;Przykłady zrealizowanych projektów:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/piecioshka/test-webpack&quot;&gt;https://github.com/piecioshka/test-webpack&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;opcja-3---źródło-src-oraz-dystrybucja-dist&quot;&gt;Opcja #3 - Źródło (&lt;code class=&quot;highlighter-rouge&quot;&gt;src/&lt;/code&gt;) oraz Dystrybucja (&lt;code class=&quot;highlighter-rouge&quot;&gt;dist/&lt;/code&gt;)&lt;/h2&gt;

&lt;p&gt;Jak już możesz się domyślić trzecia opcja jest ewolucją poprzedniej. Struktura projektu jest taka, że źródła aplikacji silnie oddzielamy od wersji aplikacji, którą uznajemy za “dystrybucyjną”.&lt;/p&gt;

&lt;p&gt;Wersja dystrybucyjna to taka która zawiera źródła aplikacji, które były poddane różnym procesom, np. transpilacji kodu poprzez Babel.js, sklejane w jeden plik wynikowy.&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;.&lt;/span&gt;
├── dist
│   ├── images
│   │   ├── banner.jpg
│   │   ├── favicon.ico
│   │   └── logo.png
│   ├── bundle.css
│   ├── bundle.js
│   └── index.html
├── src
│   ├── images
│   │   ├── banner.jpg
│   │   ├── favicon.ico
│   │   └── logo.png
│   ├── scripts
│   │   ├── main.js
│   │   └── module-1.js
│   ├── styles
│   │   ├── main.css
│   │   └── module-1.css
│   └── index.html
├── .gitignore
├── README.md
└── package.json
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;kiedy-warto-zastosować-2&quot;&gt;Kiedy warto zastosować?&lt;/h3&gt;

&lt;p&gt;Takie podejście jest bardzo pomocne kiedy chcemy mieć pewność, że użytkownik nie będzie miał dostępu do źródeł projektu i aplikacji. Świetnym przykładem może być tutaj zbudowanie wersji dystrybucyjnej, którą wysyłamy podmiotom trzecim (poprzez przesłanie paczki z nową wersją aplikacji).&lt;/p&gt;

&lt;p&gt;Najlepszym przykładem będzie stworzenie biblioteki. Taka architektura sprawdza się bardzo dobrze.&lt;/p&gt;

&lt;h3 id=&quot;jak-to-wygląda-w-praktyce-2&quot;&gt;Jak to wygląda w praktyce?&lt;/h3&gt;

&lt;p&gt;Przykłady zrealizowanych projektów:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/piecioshka/super-event-emitter&quot;&gt;https://github.com/piecioshka/super-event-emitter&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/piecioshka/executor-editor&quot;&gt;https://github.com/piecioshka/executor-editor&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/piecioshka/underscore.slice&quot;&gt;https://github.com/piecioshka/underscore.slice&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/piecioshka/complete-string&quot;&gt;https://github.com/piecioshka/complete-string&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;opcja-4---publiczny-katalog-public&quot;&gt;Opcja #4 - Publiczny katalog (&lt;code class=&quot;highlighter-rouge&quot;&gt;public/&lt;/code&gt;)&lt;/h2&gt;

&lt;p&gt;Kolejnym przykładem jest wyodrębnienie katalogów &lt;code class=&quot;highlighter-rouge&quot;&gt;scripts/&lt;/code&gt; oraz &lt;code class=&quot;highlighter-rouge&quot;&gt;styles/&lt;/code&gt; poza katalog dostępny dla użytkownika, czyli &lt;code class=&quot;highlighter-rouge&quot;&gt;public/&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;W ustawieniach domeny przekierowujemy użytkownika na katalog na serwerze &lt;code class=&quot;highlighter-rouge&quot;&gt;[...]/example-project/public/&lt;/code&gt;, tym samym źródła aplikacji są bezpieczne, tzn. nie ma do nich dostępu z poziomu internauty, czyli przeglądarki internetowej.&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;.&lt;/span&gt;
├── public
│   ├── dist
│   │   ├── bundle.css
│   │   └── bundle.js
│   ├── images
│   │   ├── banner.jpg
│   │   ├── favicon.ico
│   │   └── logo.png
│   └── index.html
├── scripts
│   ├── main.js
│   └── module-1.js
├── styles
│   ├── main.css
│   └── module-1.css
├── .gitignore
├── README.md
└── package.json
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;kiedy-warto-zastosować-3&quot;&gt;Kiedy warto zastosować?&lt;/h3&gt;

&lt;p&gt;Hybryda poprzednich architektur, łączy ze sobą plusy i minusy poprzednich. Taka koncepcja przydatna jest w sytuacji projektów, które mają podział na pliki dostępne dla użytkownika oraz główne źródła aplikacji. W tej architekturze współdzielone są &lt;code class=&quot;highlighter-rouge&quot;&gt;assety&lt;/code&gt;, czyli wszelkie obrazki, fonty czy muzyka.&lt;/p&gt;

&lt;h3 id=&quot;jak-to-wygląda-w-praktyce-3&quot;&gt;Jak to wygląda w praktyce?&lt;/h3&gt;

&lt;p&gt;Przykłady zrealizowanych projektów:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/piecioshka/boilerplate-babel-webpack&quot;&gt;https://github.com/piecioshka/boilerplate-babel-webpack&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/piecioshka/boilerplate-phaser-es2016&quot;&gt;https://github.com/piecioshka/boilerplate-phaser-es2016&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/piecioshka/7balls&quot;&gt;https://github.com/piecioshka/7balls&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/piecioshka/dumplings-nko2016&quot;&gt;https://github.com/piecioshka/dumplings-nko2016&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;słowo-podsumowania&quot;&gt;Słowo podsumowania&lt;/h2&gt;

&lt;p&gt;Nie ma idealnej struktury. Istotne jest dobranie odpowiedniej do celu projektu. Ważne jest aby &lt;strong&gt;nie mieszać konwencji&lt;/strong&gt;.&lt;/p&gt;
</description>
            <pubDate>Wed, 15 Feb 2017 00:00:00 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2017/02/15/struktura-katalogow-w-projekcie-front-endowym.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2017/02/15/struktura-katalogow-w-projekcie-front-endowym.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/project-structure/project-structure.jpg</image>
        </item>
        
        <item>
            <title>Git. Globalna konfiguracja</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;W dobie dzisiejszej popularności systemu kontroli wersji Git, chciałem przedstawić Tobie jak wykorzystać globalną konfigurację, aby plik &lt;code class=&quot;highlighter-rouge&quot;&gt;.gitignore&lt;/code&gt; w dowolnym projekcie nie zawierał nadmiarowych informacji.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/post-banner-git.jpg&quot; itemprop=&quot;image&quot; alt=&quot;Baner promujący artykuł&quot; /&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;częsty-problem&quot;&gt;Częsty problem&lt;/h2&gt;

&lt;p&gt;Wiele razy widzę, jak w projektach na GitHubie dodane są katalogi z konfiguracją edytorów, które są zupełnie niepotrzebne osobom trzecim, wykorzystującym ten projekt do własnych celów.&lt;/p&gt;

&lt;h3 id=&quot;webstorm-i-jego-katalog-idea&quot;&gt;WebStorm i jego katalog &lt;code class=&quot;highlighter-rouge&quot;&gt;.idea&lt;/code&gt;&lt;/h3&gt;

&lt;p&gt;I tak na przykład &lt;a href=&quot;https://www.jetbrains.com/webstorm/&quot;&gt;WebStorm&lt;/a&gt; (edytor firmy &lt;a href=&quot;https://www.jetbrains.com/&quot;&gt;JetBrains&lt;/a&gt;) tworzy katalog &lt;code class=&quot;highlighter-rouge&quot;&gt;.idea&lt;/code&gt;, w którym zapisuje różne ustawienia projektów.&lt;/p&gt;

&lt;p&gt;Ten katalog jest pomocny, kiedy korzystamy z zaawansowanych funkcjonalności edytora, na przykład wykluczania katalogów. Proces polega na wyłączeniu z procesu indeksowania oraz wyszukiwania dowolnych katalogów, na przykład katalogów &lt;code class=&quot;highlighter-rouge&quot;&gt;node_modules&lt;/code&gt; albo &lt;code class=&quot;highlighter-rouge&quot;&gt;bower_components&lt;/code&gt; zawierających zależności projektów.&lt;/p&gt;

&lt;h3 id=&quot;jak-wykluczyć-katalog&quot;&gt;Jak wykluczyć katalog?&lt;/h3&gt;

&lt;p&gt;Aby “wyłączyć” katalog z projektu należy kliknąć prawym przyciskiem myszy na katalogu oraz wybrać: &lt;code class=&quot;highlighter-rouge&quot;&gt;Mark Directory as -&amp;gt; Excluded&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Od tej pory wybrany katalog nie będzie brany pod uwagę przez edytor. Informacja o tym stanie zostanie zapisana w katalogu &lt;code class=&quot;highlighter-rouge&quot;&gt;.idea&lt;/code&gt;. Dlatego też trzeba wykluczyć katalog &lt;code class=&quot;highlighter-rouge&quot;&gt;.idea&lt;/code&gt; z systemu kontroli wersji.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Nie ma absolutnie żadnych przesłanek, aby katalog &lt;code class=&quot;highlighter-rouge&quot;&gt;.idea&lt;/code&gt; był wersjonowany wiec nie ma sensu dodawać go do Gita.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Aby to zrobić programiści często w pliku &lt;code class=&quot;highlighter-rouge&quot;&gt;.gitignore&lt;/code&gt;, w katalogu głównym projektu dodają linijkę, która wyklucza katalog &lt;code class=&quot;highlighter-rouge&quot;&gt;.idea&lt;/code&gt;. Niestety informacja ta nie powinna znaleźć się w pliku &lt;code class=&quot;highlighter-rouge&quot;&gt;.gitignore&lt;/code&gt; projektu, bo nie jest z nim związana, dotyczy wyłącznie konfiguracji środowiska programisty.&lt;/p&gt;

&lt;h2 id=&quot;jak-wykorzystać-plik-gitignore-w-katalogu-użytkownika&quot;&gt;Jak wykorzystać plik &lt;code class=&quot;highlighter-rouge&quot;&gt;.gitignore&lt;/code&gt; w katalogu użytkownika?&lt;/h2&gt;

&lt;p&gt;Git daje możliwość stworzenia pliku &lt;code class=&quot;highlighter-rouge&quot;&gt;.gitignore&lt;/code&gt; w katalogu projektu, aby wykluczyć rzeczy projektowe, oraz w katalogu użytkownika, aby wykluczyć katalogi i pliki, które zależą od wybranego środowiska developerskiego (edytor, system operacyjny, etc.).&lt;/p&gt;

&lt;p&gt;Informacja o wykluczeniu katalogu &lt;code class=&quot;highlighter-rouge&quot;&gt;.idea&lt;/code&gt; powinna znaleźć się w pliku &lt;code class=&quot;highlighter-rouge&quot;&gt;.gitignore&lt;/code&gt;, który znajduje się w katalogu użytkownika. Jeśli taki plik nie istnieje, warto go stworzyć.&lt;/p&gt;

&lt;p&gt;Każdy system operacyjny tworzy pliki ukryte (tymczasowe), których także nie ma sensu dodawać do systemu kontroli wersji.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Nie wyobrażam sobie, że miałbym w każdym projekcie dopisywać do pliku &lt;code class=&quot;highlighter-rouge&quot;&gt;.gitignore&lt;/code&gt; informację, aby katalog &lt;code class=&quot;highlighter-rouge&quot;&gt;.idea&lt;/code&gt; był ignorowany, albo jakiś inny katalog z ustawieniami edytora, którego obecnie używam.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3 id=&quot;jak-skonfigurować-globalny-plik-gitignore&quot;&gt;Jak skonfigurować globalny plik &lt;code class=&quot;highlighter-rouge&quot;&gt;.gitignore&lt;/code&gt;?&lt;/h3&gt;

&lt;p&gt;Aby skonfigurować Gita proponuję wykonać następujące polecenia:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# ~ (tylda) znak ten odnosi się do katalogu domowego użytkownika&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;touch&lt;/span&gt; ~/.gitconfig

git config &lt;span class=&quot;nt&quot;&gt;--global&lt;/span&gt; core.excludesfile ~/.gitignore
vim ~/.gitignore

&lt;span class=&quot;c&quot;&gt;# W pliku ~/.gitignore dodaj katalog .idea/&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;# A teraz wykonaj w katalogu projektu polecenie `git status`&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;moja-konfiguracja&quot;&gt;Moja konfiguracja&lt;/h3&gt;

&lt;p&gt;Przedstawiam zawartość mojego pliku &lt;code class=&quot;highlighter-rouge&quot;&gt;~/.gitignore&lt;/code&gt;&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# Windows&lt;/span&gt;
&lt;span class=&quot;nv&quot;&gt;$RECYCLE&lt;/span&gt;.BIN/
Desktop.ini
&lt;span class=&quot;k&quot;&gt;*&lt;/span&gt;.db
&lt;span class=&quot;k&quot;&gt;*&lt;/span&gt;.autosave

&lt;span class=&quot;c&quot;&gt;# Linux&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;*&lt;/span&gt;~
.directory

&lt;span class=&quot;c&quot;&gt;# macOS&lt;/span&gt;
.Spotlight-V100/
.Trashes/
.DS_Store
._&lt;span class=&quot;k&quot;&gt;*&lt;/span&gt;

&lt;span class=&quot;c&quot;&gt;# Edytory&lt;/span&gt;
.idea/
.settings/
.project
nbproject/
&lt;span class=&quot;k&quot;&gt;*&lt;/span&gt;.swp
.vscode
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;dodałem-katalog-idea-do-projektu-co-robić&quot;&gt;Dodałem katalog &lt;code class=&quot;highlighter-rouge&quot;&gt;.idea&lt;/code&gt; do projektu, co robić?&lt;/h2&gt;

&lt;blockquote&gt;
  &lt;p&gt;Ignorowanie katalogu &lt;code class=&quot;highlighter-rouge&quot;&gt;.idea&lt;/code&gt; nie usunie go z systemu kontroli wersji Git.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Po tym jak dodałeś w globalnym pliku &lt;code class=&quot;highlighter-rouge&quot;&gt;.gitignore&lt;/code&gt; informację o tym, żeby Git ignorował katalog &lt;code class=&quot;highlighter-rouge&quot;&gt;.idea&lt;/code&gt;, należy usunąć ten katalog poleceniem (będąc w katalogu projektu)&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;git &lt;span class=&quot;nb&quot;&gt;rm&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-rf&lt;/span&gt; .idea
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Oraz stworzyć rewizję (commit) z tą zmianą:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;git commit .idea &lt;span class=&quot;nt&quot;&gt;-m&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;Remove WebStorm settings directory&quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
</description>
            <pubDate>Mon, 06 Feb 2017 00:00:00 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2017/02/06/globalna-konfiguracja-gita.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2017/02/06/globalna-konfiguracja-gita.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/post-banner-git.jpg</image>
        </item>
        
        <item>
            <title>WarsawJS Meetup #28</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Ostatnie spotkanie w &lt;a href=&quot;http://panstwomiasto.pl/&quot;&gt;Państwomiasto&lt;/a&gt;. Żal zmieniać miejsce, ale taki stan rzeczy był do przewidzenia. Liczba osób, które chcą brać udział w naszych spotkaniach zwiększa się z meetupu na meetup.&lt;/p&gt;

&lt;p&gt;Podczas ostatniego spotkania w 2016 roku mieliśmy dwie prelekcje oraz mini workshop poprowadzony przez Kamila. Każdy mógł przyjść ze swoim komputerem i w ciągu 30 minut zakodować serwer w Node.js w oparciu o architekturę GraphQL.&lt;/p&gt;

&lt;!-- &lt;figure&gt;
    &lt;a href=&quot;https://www.meetup.com/WarsawJS/&quot;&gt;
        &lt;img src=&quot;/assets/images/posts/post-banner-warsawjs.jpg&quot;
             alt=&quot;WarsawJS&quot;/&gt;
    &lt;/a&gt;
&lt;/figure&gt; --&gt;

&lt;h2 id=&quot;invitation&quot;&gt;Invitation&lt;/h2&gt;

&lt;p&gt;Zapowiedź nagrywaliśmy podczas &lt;a href=&quot;%7B%%20post_url%202016-12-13-warsawjs-workshop-1%20%%7D&quot;&gt;WarsawJS Workshop #1&lt;/a&gt; , czyli nowej inicjatywie organizacji WarsawJS, która ma miejsce w &lt;a href=&quot;https://www.campus.co/warsaw/en&quot;&gt;Campus Warsaw&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Zapraszam w imieniu organizatorów WarsawJS.&lt;/p&gt;

&lt;div class=&quot;youtube-lazy&quot; data-youtube-id=&quot;OLV5tf0a8cI&quot;&gt;&lt;/div&gt;

&lt;p class=&quot;chapter-break&quot;&gt;&amp;bull;&lt;/p&gt;

&lt;h2 id=&quot;talk-1-rapid-prototyping-and-easy-testing-in-ember-with-ember-cli-mirage-en-krzysztof-białek&quot;&gt;Talk #1: Rapid prototyping and easy testing in Ember with Ember CLI Mirage [EN] &lt;small&gt;Krzysztof Białek&lt;/small&gt;&lt;/h2&gt;

&lt;p&gt;Krzysztof opowiadał o Mirage, czyli narzędziu do testowania aplikacji tworzonych w oparciu o &lt;a href=&quot;http://emberjs.com/&quot;&gt;Ember.js&lt;/a&gt;. Zapraszam wszystkich pasjonatów tego frameworka do obejrzenia tej anglojęzycznej prelekcji developera z &lt;a href=&quot;https://rebased.pl/&quot;&gt;Rebased&lt;/a&gt;.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Link do prelekcji: &lt;a href=&quot;https://www.youtube.com/watch?v=MTkMgtgqAQs&quot;&gt;youtube.com/watch?v=MTkMgtgqAQs&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p class=&quot;chapter-break&quot;&gt;&amp;bull;&lt;/p&gt;

&lt;h2 id=&quot;talk-2-declarative-ui-relay-is-the-way-pl-kamil-grabek&quot;&gt;Talk #2: Declarative UI. Relay is the way? [PL] &lt;small&gt;Kamil Grabek&lt;/small&gt;&lt;/h2&gt;

&lt;p&gt;Kontynuacja tematu który został rozpoczęty podczas &lt;a href=&quot;%7B%%20post_url%202016-11-19-warsawjs-meetup-27%20%%7D&quot;&gt;WarsawJS Meetup #27&lt;/a&gt; i prelekcji pt. “GraphQL in a nutshell” tego samego speakera.&lt;/p&gt;

&lt;p&gt;Kamil opowiadał o innym podejściu do budowania aplikacji webowych. Zapraszam wszystkich developerów, którzy tworzą architekturę dla nowego, dużego systemu webowego, aby obejrzeli tę prelekcję.&lt;/p&gt;

&lt;p&gt;Podobnie jak miesiąc temu Kamil poprowadził mini-workshop budując pełnoprawny serwer GraphQL. Może w przyszłym roku będzie cały dzień z GraphQL-em? Zastanowimy się.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Link do prelekcji: &lt;a href=&quot;https://www.youtube.com/watch?v=HFQvUr_yqVU&quot;&gt;youtube.com/watch?v=HFQvUr_yqVU&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p class=&quot;chapter-break&quot;&gt;&amp;bull;&lt;/p&gt;

&lt;h2 id=&quot;sponsorzy-spotkania&quot;&gt;Sponsorzy spotkania&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.facebook.com/10Clouds/&quot;&gt;10Clouds&lt;/a&gt; - żetony w barze&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.facebook.com/cyfrowypolsat/&quot;&gt;Cyfrowy Polsat&lt;/a&gt; - materiały na YouTube&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.facebook.com/whitestreampl&quot;&gt;Whitestream&lt;/a&gt; - transmisja na żywo - &lt;a href=&quot;http://warsawjs.com/live&quot;&gt;warsawjs.com/live&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.facebook.com/softwarely/&quot;&gt;Softwarely&lt;/a&gt; - dodatkowe wsparcie&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;podsumowanie&quot;&gt;Podsumowanie&lt;/h2&gt;

&lt;p&gt;Bardzo dziękujemy PM za te ponad 2 lata udostępniania nam przestrzeni w sali konferencyjnej. Jako organizatorzy uważamy, że nie mogliśmy lepiej rozpocząć. Świetna lokalizacja w centrum miasta z super jedzeniem.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Będzie co wspominać. Dziękujemy ❤️&lt;/strong&gt;&lt;/p&gt;
</description>
            <pubDate>Tue, 17 Jan 2017 00:00:00 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2017/01/17/warsawjs-meetup-28.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2017/01/17/warsawjs-meetup-28.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/post-banner-warsawjs.jpg</image>
        </item>
        
        <item>
            <title>Długość artykułu w minutach</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Kilka lat temu gdy powstała platforma &lt;a href=&quot;http://medium.com/&quot;&gt;Medium.com&lt;/a&gt; ich artykuły rozpoczynały się od bardzo przydatnej informacji - ile czasu zajmie przeczytanie danego artykułu.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/miernik/post-header.png&quot; alt=&quot;&quot; /&gt;

    &lt;figcaption&gt;
        Informacja o liczbie minut jakie trzeba poświęcić aby przeczytać
        artykuł.&lt;br /&gt;W tym serwisie znajduje się ona zawsze pod nagłówkiem
        artykułu.
    &lt;/figcaption&gt;

&lt;/figure&gt;

&lt;h2 id=&quot;co-nam-po-takiej-informacji&quot;&gt;Co nam po takiej informacji?&lt;/h2&gt;

&lt;p&gt;Każdy z nas czyta artykuły w sieci. Niektóre są krótsze, niektóre dłuższe. Artykuły zawierające mniej tekstu mają to do siebie, że czas potrzebny na ich przeczytanie jest proporcjonalnie krótszy.&lt;/p&gt;

&lt;p&gt;Po otworzeniu danego artykułu podejmujemy mikro decyzję, czy czytamy go od razu czy jednak zostawiamy na później, czego powodem może być np. brak czasu w danej chwili.&lt;/p&gt;

&lt;p&gt;Taki mikro wybór jest dokonywany przez nas, internautów, bardzo szybko. Jest kilka czynników, które mogą pomóc nam podjąć tę decyzję.&lt;/p&gt;

&lt;p&gt;Co jeśli przed otworzeniem artykułu, np. na liście postów, pokażemy informację czasie potrzebnym na zapoznanie się z danym artykułem? Internauta podejmie decyzję jeszcze przed kliknięciem w zachęcający tytuł. Oszczędzi to mu czas i nerwy, które mogą się pojawić, gdy jakiś artykuł okaże się dłuższy niż czas, który czytelnik może mu poświęcić.&lt;/p&gt;

&lt;h2 id=&quot;dobre-zasady-pisania-postów&quot;&gt;Dobre zasady pisania postów&lt;/h2&gt;

&lt;p&gt;Jeśli post zawiera interesujące tło, albo obrazki w artykule są ciekawe, mózg czytelnika otrzymuje bodziec, który sygnalizuje, że jest się na stronie godnej uwagi i może warto przeczytać znajdujący się na niej artykuł.&lt;/p&gt;

&lt;p&gt;Dobrze sformatowana treść również zaprasza czytelnika do przeczytania artykułu w całości. Gdy internauta zobaczy ścianę tekstu, to jest bardzo duża szansa, że zamknie kartę przeglądarki.&lt;/p&gt;

&lt;h2 id=&quot;projekt-jekyll-time-to-read-in-polish&quot;&gt;Projekt: &lt;a href=&quot;https://github.com/piecioshka/jekyll-time-to-read-in-polish&quot;&gt;jekyll-time-to-read-in-polish&lt;/a&gt;&lt;/h2&gt;

&lt;p&gt;Chciałem zamieścić taką informację o długości artykułu stworzyłem więc projekt, który pomaga mi zrealizować ten cel. Projekt dostępny jest na moim profilu na GitHubie. Plugin analizuje liczbę słów znajdujących się w artykule.&lt;/p&gt;

&lt;p&gt;Jeśli korzystasz z &lt;a href=&quot;https://jekyllrb.com/&quot;&gt;Jekyll&lt;/a&gt;-a to polecam Ci wypróbowanie tego dodatku na łamach swojego bloga. Link do projektu znajduje się w nagłówku tej sekcji.&lt;/p&gt;

&lt;h2 id=&quot;podsumowanie&quot;&gt;Podsumowanie&lt;/h2&gt;

&lt;p&gt;Pokazanie (orientacyjnej) informacji o czasie, jaki trzeba poświęcić, aby przeczytać artykuł pomaga internaucie odpowiedzieć sobie na pytanie, które zadawane jest przed rozpoczęciem czytania dowolnej treści w sieci:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Czy jestem w stanie / chce mi się poświęcić X minut, aby przeczytać post o takim tytule?&lt;/em&gt;&lt;/p&gt;
</description>
            <pubDate>Fri, 16 Dec 2016 00:00:00 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2016/12/16/dlugosc-artykulu-w-minutach.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2016/12/16/dlugosc-artykulu-w-minutach.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/miernik/time-to-read-526x275.jpg</image>
        </item>
        
        <item>
            <title>WarsawJS Workshop #1</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;4 grudnia 2016 roku odbyły się pierwsze warsztaty pod szyldem &lt;a href=&quot;http://warsawjs.com/&quot;&gt;WarsawJS&lt;/a&gt;, których byłem współorganizatorem. Myślą przewodnią tych warsztatów była nauka początkujących. Wszyscy Ci którzy nie mieli wcześniej styczności z programowaniem mogli przyjść i przez całe 8 godzin tworzyć projekt &lt;a href=&quot;https://github.com/piecioshka/warsawjs-workshop-gallery/&quot;&gt;galerii zdjęć&lt;/a&gt; pod okiem trenerów.&lt;/p&gt;

&lt;figure&gt;
    &lt;a href=&quot;https://www.meetup.com/WarsawJS/&quot;&gt;
        &lt;img src=&quot;/assets/images/posts/post-banner-warsawjs.jpg&quot; alt=&quot;WarsawJS&quot; /&gt;
    &lt;/a&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;jak-zrodził-się-pomysł&quot;&gt;Jak zrodził się pomysł?&lt;/h2&gt;

&lt;p&gt;Po 2 latach organizowania meetupów stwierdziliśmy, że jako organizacja moglibyśmy spróbować swoich sił w zorganizowaniu czegoś więcej.&lt;/p&gt;

&lt;p&gt;Tym samym wpadliśmy na pomysł zorganizowania ankiety, która miała na celu weryfikację, czym uczestnicy meetupów byliby zainteresowani. Do wyboru w ankiecie były 2 opcje:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;konferencja&lt;/li&gt;
  &lt;li&gt;warsztaty&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ponad połowa osób opowiedziała się za &lt;strong&gt;warsztatami&lt;/strong&gt;.&lt;/p&gt;

&lt;figure class=&quot;social-center-block&quot;&gt;
    &lt;iframe src=&quot;https://www.facebook.com/plugins/post.php?href=https%3A%2F%2Fwww.facebook.com%2Fwarsawjs%2Fphotos%2Fa.2019795684913431.1073741831.1578130679079936%2F2019795961580070%2F%3Ftype%3D3&amp;amp;width=500&quot; width=&quot;500&quot; height=&quot;337&quot; style=&quot;border:none;overflow:hidden&quot; scrolling=&quot;no&quot; frameborder=&quot;0&quot; allowtransparency=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;plan&quot;&gt;Plan&lt;/h2&gt;

&lt;p&gt;Podczas &lt;a href=&quot;%7B%%20post_url%202016-11-05-warsawjs-meetup-26%20%%7D&quot;&gt;WarsawJS Meetup #26&lt;/a&gt; założyliśmy event na Meetup.com oraz poprosiliśmy o sugestie atrakcyjnych tematów byłyby dla członków naszej organizacji.&lt;/p&gt;

&lt;p&gt;Link do eventu &lt;a href=&quot;https://www.meetup.com/WarsawJS/events/234806304/&quot;&gt;meetup.com/WarsawJS/events/234806304/&lt;/a&gt; gdzie opisane są zasady oraz wszelkie informacje techniczne potrzebne uczestnikom.&lt;/p&gt;

&lt;p&gt;Wielu ludzi opowiedziało się za Angularem, Reactem oraz innymi bibliotekami.&lt;/p&gt;

&lt;p&gt;Jednak, jak przez mgłę można było dostrzec liczne głosy, że może temat warsztatu gdzie moglibyśmy nauczyć się podstaw byłby dobrym pomysłem. Tak też zrobiliśmy.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Po 2 miesiącach zbierania wyników, ogłosiliśmy na profilu wydarzenia jaki mamy plan na tematykę kolejnych warsztatów.&lt;/strong&gt; Pozwolę sobie skopiować tę listę. W tym roku odbyło się jedno szkolenie:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Grudzień 2016: Podstawy JavaScript (część 1) - dla początkujących&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;W następnym roku planujemy szkolenia z następujących tematów:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Styczeń 2017: Podstawy JavaScript (część 2) - dla średnio zaawansowanych&lt;/li&gt;
  &lt;li&gt;Luty 2017: Angular 1&lt;/li&gt;
  &lt;li&gt;Marzec 2017: Angular 2 (angular-cli)&lt;/li&gt;
  &lt;li&gt;Kwiecień 2017: Node.js [tutaj mamy 3 propozycje]&lt;/li&gt;
  &lt;li&gt;Maj 2017: Meteor.js&lt;/li&gt;
  &lt;li&gt;Czerwiec 2017: Web Components&lt;/li&gt;
  &lt;li&gt;Lipiec 2017: Portal społecznościowy w oparciu o Firebase&lt;/li&gt;
  &lt;li&gt;Sierpień 2017: RxJS 5 - Reactive programming&lt;/li&gt;
  &lt;li&gt;Wrzesień 2017: Gamedev: Wyścigi samochodowe z użyciem Phaser.js&lt;/li&gt;
  &lt;li&gt;Październik 2017: React.js + Enzyme + Redux&lt;/li&gt;
  &lt;li&gt;Listopad 2017: Vue.js&lt;/li&gt;
  &lt;li&gt;Grudzień 2017: React Native - tworzenie aplikacji na iOSa i Androida&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Nie chcąc czekać jeszcze w tym roku zorganizować pierwsze warsztaty.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/photos/warsawjs/workshop-1/IMG_7746.jpg&quot; alt=&quot;&quot; /&gt;

    &lt;figcaption&gt;
        Praca wre!
    &lt;/figcaption&gt;

&lt;/figure&gt;

&lt;h2 id=&quot;lokalizacja&quot;&gt;Lokalizacja&lt;/h2&gt;

&lt;p&gt;Znalezienie miejsca na zorganizowanie warsztatów nie sprawiło trudności, ze względu na świetną propozycję jaką dostaliśmy od &lt;a href=&quot;https://www.campus.co/warsaw/en&quot;&gt;Campus Warsaw&lt;/a&gt;.&lt;/p&gt;

&lt;figure class=&quot;social-center-block&quot;&gt;
    &lt;iframe src=&quot;https://www.facebook.com/plugins/post.php?href=https%3A%2F%2Fwww.facebook.com%2Fwarsawjs%2Fphotos%2Fa.2019795684913431.1073741831.1578130679079936%2F2019796258246707%2F%3Ftype%3D3&amp;amp;width=500&quot; width=&quot;500&quot; height=&quot;337&quot; style=&quot;border:none;overflow:hidden&quot; scrolling=&quot;no&quot; frameborder=&quot;0&quot; allowtransparency=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;/figure&gt;

&lt;p&gt;Campus Warsaw mieści się na ulicy Ząbkowskiej 27 - na Pradze Północ. Pod tym adresem znajdują się budynki, już nieaktywnej warszawskiej wytwórni wódek “Koneser”.&lt;/p&gt;

&lt;p&gt;Większość zabudowań należących do wytwórni przetrwało II wojnę światową. Piękne mury budynki zawdzięczają czerwonej cegle, z której są zrobione. Na Wikipedii wyczytałem, że jest to styl &lt;em&gt;neogotycki&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Akurat w budynku w którym znajduje się biuro Campus Warsaw jest wyróżniająca się w tle brama wjazdowa - pozostałość po starej wytwórni.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/photos/warsawjs/workshop-1/IMG_7709.jpg&quot; alt=&quot;&quot; /&gt;

    &lt;figcaption&gt;
        Koneser - Warszawska wytwórnia wódek.
    &lt;/figcaption&gt;

&lt;/figure&gt;

&lt;p&gt;Lokalizacja jest wyśmienita. Blisko metra, tramwaju, pociągu czy autobusu. Fakt - z każdego środka komunikacji trzeba jeszcze przebyć 5-10 minut pieszo, ale to chyba nie problem 😄&lt;/p&gt;

&lt;h2 id=&quot;bilety&quot;&gt;Bilety&lt;/h2&gt;

&lt;p&gt;5 dni przed eventem uruchomiliśmy rejestrację za pomocą systemu &lt;a href=&quot;http://evenea.pl/&quot;&gt;Evenea&lt;/a&gt;. Bilety sprzedały się w oka mgnieniu. Nie spodziewaliśmy się tak szybkiej sprzedaży. Po 3 godzinach wszystkie bilety były wykupione.&lt;/p&gt;

&lt;p&gt;Po wyprzedaniu biletów na stronie eventu zaczęły pojawiać się zapytania, czy ktoś ma może bilet do odsprzedania. Miło kiedy ludziom zależy na czymś czego jest się twórcą 😄&lt;/p&gt;

&lt;h2 id=&quot;bycie-trenerem&quot;&gt;Bycie trenerem…&lt;/h2&gt;

&lt;p&gt;…to brzmi dumnie! Uwielbiam uczyć ludzi, patrzeć jak nagle rozumieją co do nich mówię i sami tworzą ciekawe rozwiązania!&lt;/p&gt;

&lt;figure class=&quot;social-center-block&quot;&gt;
    &lt;iframe src=&quot;https://www.facebook.com/plugins/post.php?href=https%3A%2F%2Fwww.facebook.com%2Fwarsawjs%2Fphotos%2Fa.2019795684913431.1073741831.1578130679079936%2F2019796248246708%2F%3Ftype%3D3&amp;amp;width=500&quot; width=&quot;500&quot; height=&quot;337&quot; style=&quot;border:none;overflow:hidden&quot; scrolling=&quot;no&quot; frameborder=&quot;0&quot; allowtransparency=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;/figure&gt;

&lt;p&gt;Mieliśmy 4 trenerów dostępnych podczas warsztatów:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Piotr Kowalski: &lt;a href=&quot;https://twitter.com/piecioshka&quot;&gt;twitter.com/piecioshka&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Piotr Zientara: &lt;a href=&quot;https://twitter.com/piotr_zientara&quot;&gt;twitter.com/piotr_zientara&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Rafał Gierczak: &lt;a href=&quot;https://www.linkedin.com/in/rafał-gierczak-b431318a&quot;&gt;linkedin.com/in/rafał-gierczak-b431318a&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Piotr Błaszczak: &lt;a href=&quot;https://www.linkedin.com/in/piotr-błaszczak-650b4724&quot;&gt;linkedin.com/in/piotr-błaszczak-650b4724&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/photos/warsawjs/workshop-1/trainers.png&quot; alt=&quot;&quot; /&gt;

    &lt;figcaption&gt;
        Trenerzy pierwszego edycji WarsawJS Workshop.
    &lt;/figcaption&gt;

&lt;/figure&gt;

&lt;p&gt;Tym samym liczba uczestników była limitowana pod tym kątem. Chciałem, jako organizator, aby każdy z trenerów pomagał grupie maksymalnie 10 osobowej.&lt;/p&gt;

&lt;h2 id=&quot;prework--postwork&quot;&gt;Prework &amp;amp; Postwork&lt;/h2&gt;

&lt;p&gt;Jako organizatorzy wpadliśmy na pomysł, aby przed pierwszym spotkaniem przygotować zadanie, które wprowadzi w programowanie Front-end.&lt;/p&gt;

&lt;p&gt;Postanowiliśmy, że wyślemy do uczestników zadanie, którego celem będzie realizacja strony z napisem “Hello world”. Dla doświadczonego developera wydaje się, że jest to zadanie zbyt proste. Jednak ze względu na to, że uczestnikami pierwszego workshopu będą ludzie bez doświadczenia to takie wyzwanie idealnie się wpasowuje.&lt;/p&gt;

&lt;p&gt;Dziś wysłaliśmy drugie zadanie. Tym razem w formie pracy domowej, czyli tzw. postworka. Celem takiego zadania jest rozwijanie wiedzy nabytej podczas &lt;em&gt;WarsawJS Workshop&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Jako organizatorzy liczymy na to, że w naszej skrzynce za kilka dni pojawią się maile z linkami do waszych projektów. Na każdego maila odpowiemy przesyłając techniczny feedback.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/piecioshka/warsawjs-workshop-gallery&quot;&gt;github.com/piecioshka/warsawjs-workshop-gallery&lt;/a&gt; - zadanie jakie było do wykonania podczas pierwszego szkolenia&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/piecioshka/warsawjs-workshop-slider&quot;&gt;github.com/piecioshka/warsawjs-workshop-slider&lt;/a&gt; - zadanie jakie trzeba wykonać jako praca domowa.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;słowo-na-koniec&quot;&gt;Słowo na koniec&lt;/h2&gt;

&lt;p&gt;Bardzo dziękujemy wszystkim za przybycie. Mamy nadzieje, że nie odpuścicie rozwijania swoich kompetencji programistycznych i będziecie zgłębiać tajniki JavaScriptu!&lt;/p&gt;

&lt;p&gt;Organizowanie warsztatów było dla nas, organizatorów, nowym i bardzo ciekawym wyzwaniem dającym wiele frajdy. Dziękujemy za przybycie!&lt;/p&gt;

&lt;figure class=&quot;social-center-block&quot;&gt;
    &lt;iframe src=&quot;https://www.facebook.com/plugins/post.php?href=https%3A%2F%2Fwww.facebook.com%2Fwarsawjs%2Fphotos%2Fa.2019795684913431.1073741831.1578130679079936%2F2019796348246698%2F%3Ftype%3D3&amp;amp;width=500&quot; width=&quot;500&quot; height=&quot;337&quot; style=&quot;border:none;overflow:hidden&quot; scrolling=&quot;no&quot; frameborder=&quot;0&quot; allowtransparency=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;/figure&gt;
</description>
            <pubDate>Tue, 13 Dec 2016 00:00:00 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2016/12/13/warsawjs-workshop-1.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2016/12/13/warsawjs-workshop-1.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/post-banner-warsawjs.jpg</image>
        </item>
        
        <item>
            <title>"JavaScript" to nie to samo co "Java"</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Podczas mojej pracy zawodowej przychodzi mi czasem rozmawiać z ludźmi, których domeną nie jest programowanie. Tym samym nie znają języków programowania oraz różnic jakie pomiędzy nimi występują a tym bardziej ich zastosowania.&lt;/p&gt;

&lt;p&gt;Tym artykułem chciałbym nauczyć ludzi “nietechnicznych”, o dziwnym zbiegu okoliczności jaki ma miejsce w świecie programowania, mianowicie kolizji nazw dwóch języków, wymienionych przeze mnie w tytule.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Na wstępie chciałem zaznaczyć, że tym artykułem nie mam zamiaru nikogo obrażać, a tylko naświetlić problem jaki występuje, kiedy nazwy różnych języków programowania stosowane są zamiennie.&lt;/em&gt;&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/javascript/javascript-is-not-java-526x275.jpg&quot; itemprop=&quot;image&quot; alt=&quot;Baner promujący artykuł&quot; /&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;skrót&quot;&gt;Skrót?&lt;/h2&gt;

&lt;p&gt;Niestety, ale “Java” to &lt;strong&gt;nie jest skrót&lt;/strong&gt; od “JavaScript”.&lt;/p&gt;

&lt;h2 id=&quot;dla-rekrutera&quot;&gt;Dla …rekrutera&lt;/h2&gt;

&lt;p&gt;Praca rekrutera to ciężki kawałek chleba. Musi wyszukiwać programistów na rynku pracy, umawiać się z nimi na spotkania, towarzyszyć w całym procesie rekrutacji.&lt;/p&gt;

&lt;p&gt;Cały ten proces wymaga skupienia oraz kompletu informacji o profilu programisty jaki jest poszukiwany.&lt;/p&gt;

&lt;p&gt;Poszukiwanie programisty to chyba najtrudniejszy etap w całym procesie zatrudniania nowej osoby. I tutaj popełnianych jest wiele błędów przez początkujących Human Resource Managerów.&lt;/p&gt;

&lt;p&gt;Znalezienie stosownego kandydata wiąże się z wysyłaniem ogromnej ilości zapytań. Łatwo jest tutaj popełnić mały błąd, który może zaważyć na odbiorze firmy do której rekruterzy poszukują pracowników.&lt;/p&gt;

&lt;p&gt;Nie ważne jest to, czy błąd został popełniony z pośpiechu, czy z niedbalstwa. My programiści szybko wyłapiemy błędy.&lt;/p&gt;

&lt;p&gt;Może warto aby HR managerzy byli wykształcenia technicznego? Nie wiem. Można tylko gdybać.&lt;/p&gt;

&lt;p&gt;Poszukiwanie osoby na stanowisko JavaScript Developera to nie jest to samo, co poszukiwanie kandydata na stanowisko Java Developera.&lt;/p&gt;

&lt;p&gt;Nie chce tutaj omawiać innych błędów, które się zdarzają, np. gdy dostaje się maile z innym imieniem i nazwiskiem odbiorcy. Tutaj niech wytłumaczeniem będzie szum komunikacyjny jaki towarzyszy rekruterom.&lt;/p&gt;

&lt;h3 id=&quot;rada&quot;&gt;Rada&lt;/h3&gt;

&lt;p&gt;Moja rada jest prosta. Przywiązujcie wagę do nazwy stanowiska na jakie szukacie programisty. Java to zupełnie inny język niż JavaScript. Nie należy tego mieszać. Nigdy.&lt;/p&gt;

&lt;h2 id=&quot;dla-pracowników-księgarni&quot;&gt;Dla …pracowników księgarni&lt;/h2&gt;

&lt;p&gt;Większość z nas, programistów, lubi czytać książki techniczne. Zawierają one (zwykle) poukładaną wiedzę na temat danej dziedziny.&lt;/p&gt;

&lt;p&gt;Księgarnie mają to do siebie, że zawsze panuje w nich podział tematyczny. Taki stan rzeczy bardzo odpowiada programistom, których cechuje logiczne myślenie.&lt;/p&gt;

&lt;h3 id=&quot;moja-historia&quot;&gt;Moja historia&lt;/h3&gt;

&lt;p&gt;Wchodząc do księgarni, szukam regału z książkami dotyczącymi programowania. Gdy już znajdę, szukam tych, które interesują mnie najbardziej, tj. związanych z szeroko pojętym Front-end-em.&lt;/p&gt;

&lt;p&gt;Moim oczom ukazuje się cała gablotka na pierwszy rzut oka interesujących dla mnie książek. Jednak gdy podejdę bliżej, widzę książki pt. “Java. Podstawy.”, “Java. Kompendium”. Na mojej twarzy zawsze maluje się wtedy uśmiech, gdy widzę jak książki o JavaScripcie mieszają się z książkami o Javie.&lt;/p&gt;

&lt;p&gt;Chciałbym kiedyś wejść do księgarni i nie natknąć się na taką sytuację. Miałbym wtedy większe zaufanie, że osoby pracujące w księgarni wiedzą z jakimi książkami mają do czynienia.&lt;/p&gt;

&lt;h3 id=&quot;rada-1&quot;&gt;Rada&lt;/h3&gt;

&lt;p&gt;Moja rada jest prosta. Jeżeli, koleżanko albo kolego, pracujesz w księgarni i masz za zadanie poukładać książki w dziale INFORMATYKA, to proszę abyś robił/a to uważnie. Programisty JavaScript nie interesują książki o Javie i odwrotnie. Zapamiętaj proszę.&lt;/p&gt;

&lt;h2 id=&quot;dla-początkującego-programisty&quot;&gt;Dla …początkującego programisty&lt;/h2&gt;

&lt;p&gt;Jeśli zaczynasz swoją przygodę z programowaniem, to prędzej czy później dowiesz się, że Java i JavaScript to zupełnie inne języki, ale jeśli zabraknie Ci dowodów, to chciałbym Co przedstawić podobieństwa i różnice tych dwóch języków powstałych w tym samym roku (1995).&lt;/p&gt;

&lt;h3 id=&quot;podobieństwa&quot;&gt;Podobieństwa&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Oba języki są multi-platformowe - uruchomią się na wszystkich konfiguracjach sprzętowych.&lt;/li&gt;
  &lt;li&gt;Obiekty wbudowane Math i Date są takie same w obu językach.&lt;/li&gt;
  &lt;li&gt;JavaScript zawiera listę zarezerwowanych słów prosto z Javy&lt;/li&gt;
  &lt;li&gt;Składnia języka JavaScript była wzorowana na języku Java.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;różnice&quot;&gt;Różnice&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;Autorem Javy jest Sun Microsystems.&lt;/p&gt;

    &lt;p&gt;Autorem JavaScriptu jest Netscape Communications.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Java jest językiem programowania.&lt;/p&gt;

    &lt;p&gt;JavaScript jest językiem (programowania) skryptowym.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Java jest językiem kompilowanym i uruchamianym w wirtualnej maszynie.&lt;/p&gt;

    &lt;p&gt;JavaScript interpretowany i uruchamiany w przeglądarce.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Oba języki programowania są zorientowane obiektowo, jednak JavaScript zawiera obiektowość prototypową,&lt;/p&gt;

    &lt;p&gt;natomiast Java obiektowość klasyczną.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;W JavaScript nie ma klas (klasy z ES2015 to tylko syntactic sugar). W Javie są klasy.&lt;/li&gt;
  &lt;li&gt;W JavaScript, obiekty nie posiadają prywatnych i chronionych właściwości i funkcji. W Javie można zdefiniować tryb dostępu do właściwości albo metody.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;rada-2&quot;&gt;Rada&lt;/h3&gt;

&lt;p&gt;Wielkim &lt;abbr title=&quot;gafa&quot;&gt;faux pas&lt;/abbr&gt; byłoby, gdybyś jako programista nie znał różnicy między tymi dwoma najpopularniejszymi językami programowania. Proszę przeczytaj ww. punkty i połowę z nich zapamiętaj. Nalegam.&lt;/p&gt;

&lt;h2 id=&quot;zabawne-porównania&quot;&gt;Zabawne porównania&lt;/h2&gt;

&lt;p&gt;Jak już wspomniałem, te 2 języki programowania są zupełnie odmienne. W związku z tym powstało wiele zabawnych porównań wyśmiewających zestawianie ich nazw.&lt;/p&gt;

&lt;p&gt;O to lista najpopularniejszych:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;PL
    &lt;ul&gt;
      &lt;li&gt;koń i koniak&lt;/li&gt;
      &lt;li&gt;rum i rumak&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;EN
    &lt;ul&gt;
      &lt;li&gt;ham and hamster&lt;/li&gt;
      &lt;li&gt;car and carpet&lt;/li&gt;
      &lt;li&gt;grape and grapefruit&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Więcej angielskich zwrotów znajdziesz na stronie &lt;a href=&quot;http://javascriptisnotjava.io/&quot;&gt;javascriptisnotjava.io&lt;/a&gt;&lt;/p&gt;

&lt;h2 id=&quot;podsumowanie&quot;&gt;Podsumowanie&lt;/h2&gt;

&lt;p&gt;Na koniec chciałem dodać, że pisząc ten artykuł chciałem zaznaczyć jasno, że istnieją duże różnice między tymi językami. Mieszanie nazw tychże języków, szczególnie wśród programistów, rodzi mnóstwo niepotrzebnych komplikacji i nieporozumień.&lt;/p&gt;
</description>
            <pubDate>Fri, 09 Dec 2016 00:00:00 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2016/12/09/javascript-to-nie-to-samo-co-java.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2016/12/09/javascript-to-nie-to-samo-co-java.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/javascript/javascript-is-not-java-526x275.jpg</image>
        </item>
        
        <item>
            <title>Historia języka JavaScript</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Jako świadomy programista języka JavaScript, chciałem przedstawić wam historię tego języka. Wpis będzie również zawierał informację o powstaniu języka Java.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/javascript/logo-javascript.svg&quot; alt=&quot;JavaScript logo&quot; /&gt;

    &lt;figcaption&gt;
        Logo JS-a zaproponowane przez Chrisa Willisa podczas konferencji
        JSConf EU 2011.
    &lt;/figcaption&gt;

&lt;/figure&gt;

&lt;h2 id=&quot;tldr&quot;&gt;tl;dr&lt;/h2&gt;

&lt;ul class=&quot;flos&quot;&gt;
    &lt;li&gt;
        &lt;h3&gt;lata 70, XX wieku&lt;/h3&gt;
        &lt;p&gt;
            Z uwagi na rosnące zapotrzebowanie producentów urządzeń,
            potrzebne było oprogramowania, które będzie w stanie działać
            na wszystkich typach urządzeń.
        &lt;/p&gt;
    &lt;/li&gt;
    &lt;li&gt;
        &lt;h3&gt;lata 90, XX wieku&lt;/h3&gt;
        &lt;p&gt;
            &lt;em&gt;Sun Microsystems&lt;/em&gt; stworzyło język Java (nazwa pochodzi
            od kawy produkowanej na wyspie Jawa), którego ideą był
            &lt;code&gt;WORA&lt;/code&gt; - &lt;code&gt;Write once, run anywhere&lt;/code&gt;.
        &lt;/p&gt;
    &lt;/li&gt;
    &lt;li&gt;
        &lt;p&gt;
            &lt;em&gt;Netscape Communications&lt;/em&gt; chciało wprowadzić do swojej
            przeglądarki dynamikę znaną z programów desktopowych.
        &lt;/p&gt;
    &lt;/li&gt;
    &lt;li&gt;
        &lt;p&gt;
            &lt;em&gt;Sun Microsystems&lt;/em&gt; chciało aby
            &lt;em&gt;Netscape Communications&lt;/em&gt; wprowadziło do swojej
            przeglądarki Javę.
        &lt;/p&gt;
    &lt;/li&gt;
    &lt;li&gt;
        &lt;p&gt;
            &lt;em&gt;Netscape Communications&lt;/em&gt; nie zgodziło się. Chciało
            wprowadzić coś co trafi do szerszego grona odbiorców niż tylko
            programistom Javy.
        &lt;/p&gt;
    &lt;/li&gt;
    &lt;li&gt;
        &lt;h3&gt;kwiecień 1995&lt;/h3&gt;
        &lt;p&gt;
            W &lt;em&gt;Netscape Communications&lt;/em&gt; zatrudnili programistę, który
            z języków: Java, Scheme i Self skonstruował nowy język o nazwie
            LiveScript.
        &lt;/p&gt;
    &lt;/li&gt;
    &lt;li&gt;
        &lt;p&gt;
            &lt;em&gt;Sun Microsystems&lt;/em&gt;, jako partner w biznesowej ofensywie
            na &lt;em&gt;Microsoft&lt;/em&gt; nie był zadowolony z tego pomysłu i chciał
            unicestwić projekt LiveScript.
        &lt;/p&gt;
    &lt;/li&gt;
    &lt;li&gt;
        &lt;h3&gt;koniec roku 1995&lt;/h3&gt;
        &lt;p&gt;
            Firma &lt;em&gt;Netscape Communications&lt;/em&gt; wpadła na pomysł zmiany
            nazwy na JavaScript, który jakoby miał mieć coś wspólnego z
            Javą.
        &lt;/p&gt;
    &lt;/li&gt;
    &lt;li&gt;
        &lt;p&gt;
            &lt;em&gt;Sun Microsystems&lt;/em&gt; zaakceptowało pomysł, ale przejęło
            prawa do marki udzielając licencji na używanie nazwy tylko
            firmie &lt;em&gt;Netscape Communications&lt;/em&gt;.
        &lt;/p&gt;
    &lt;/li&gt;
    &lt;li&gt;
        &lt;h3&gt;czerwiec 1997&lt;/h3&gt;
        &lt;p&gt;
            &lt;em&gt;Netscape Communications&lt;/em&gt; wraz z &lt;em&gt;ECMA&lt;/em&gt; tworzy
            standard nowego języka - &lt;em&gt;ECMAScript&lt;/em&gt;.
        &lt;/p&gt;
    &lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;od-czego-to-się-wszystko-zaczęło&quot;&gt;Od czego to się wszystko zaczęło?&lt;/h2&gt;

&lt;p&gt;W XVII w. na wyspę Jawa została sprowadzona przez Holendrów kawa gatunku Arabica (nazwana później Liberica, a potem Robusta).&lt;/p&gt;

&lt;p&gt;W dniu 9 listopada 1981 roku powstała w &lt;em&gt;Mountain View&lt;/em&gt; firma &lt;em&gt;Silicon Graphics&lt;/em&gt;, założona przez James H. Clarka, która była amerykańskim producentem wysokiej jakości hardware-u (sprzętu komputerowego) oraz software-u.&lt;/p&gt;

&lt;p&gt;W 1982 roku, 24 lutego powstała firma &lt;em&gt;Sun Microsystems&lt;/em&gt;, zajmowała się podobnie jak &lt;em&gt;Silicon Graphics&lt;/em&gt; produkcją oprogramowania.&lt;/p&gt;

&lt;p&gt;W 1986 roku na uniwersytecie w Illinois w USA, powstała komórka zajmująca się rozwojem oraz wdrażaniem krajowego oprogramowania komputerowego.&lt;/p&gt;

&lt;h2 id=&quot;po-co-ta-java&quot;&gt;Po co ta Java?&lt;/h2&gt;

&lt;p&gt;W 1990 firma &lt;em&gt;Sun Microsystems&lt;/em&gt; powołała komórkę Sun Labs, która miała zajmować się nowymi technologiami webowymi, rozwijaniem nowego języka programowania oraz sieciami komputerowymi.&lt;/p&gt;

&lt;p&gt;W tym samym czasie, w komórce ds. rozwoju nowego języka, James Gosling razem z grupą innych ludzi zajmowali się tworzeniem języka, który mógłby być uruchamiany na komputerach z dowolną konfiguracją sprzętową.&lt;/p&gt;

&lt;p&gt;Programy napisane w C lub C++ mogły być uruchamiane tylko na urządzeniach z takim samym procesorem, aby wykorzystać w pełni potencjał maszyny. Nie nadawały się więc do nowych urządzeń, które miały inną konfigurację sprzętową. Dlatego też powstał projekt stworzenia nowego języka, który nadawałby się lepiej do oprogramowania użytkowego niż C i C++.&lt;/p&gt;

&lt;p&gt;Początkowo język nazwano “Oak”, ze względu na wielki dąb w pobliżu budynku w którym prowadzono prace. Ponieważ istniał już język o takiej nazwie należało znaleźć alternatywę. Po długich dyskusjach olśnienie przyszło podczas wyjścia do sklepu z kawą.&lt;/p&gt;

&lt;p&gt;Java to nazwa kawy produkowanej na wyspie o takiej samej nazwie. Jest to też slangowe określenie kawy w USA.&lt;/p&gt;

&lt;h2 id=&quot;narodziny-najpopularniejszej-przeglądarki-internetowej&quot;&gt;Narodziny najpopularniejszej przeglądarki internetowej&lt;/h2&gt;

&lt;p&gt;Na początku lat 90. James H. Clark odszedł z &lt;em&gt;Silicon Graphics&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;W 1993 roku National Center for Supercomputing Applications wypuściła przeglądarką webową o nazwie NCSA Mosaic. Nie była to pierwsza przeglądarka na rynku, ale jako pierwsza pozwalała na wyświetlanie obrazków (wspierała tag &lt;code class=&quot;highlighter-rouge&quot;&gt;&amp;lt;img&amp;gt;&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;W tym samym roku James H. Clark poznał Marca Andreessena, z którym zamierzał podbić rynek przeglądarek.&lt;/p&gt;

&lt;p&gt;W 1994 roku, w &lt;em&gt;Mountain View&lt;/em&gt;, panowie razem zarejestrowali firmę Mosaic Communications. Zatrudnili autorów przeglądarki NCSA Mosaic w celu stworzenia nowej pod nazwą Mosaic Navigator, która miała nie mieć ani jednej linijki kodu z pierwotnej wersji.&lt;/p&gt;

&lt;p&gt;(Wewnątrz projektu nową przeglądarkę nazywano “Mozilla”, czyli “Mosaic killer”. Celem nowo powstałej firmy, było stać się liderem na rynku przeglądarek.)&lt;/p&gt;

&lt;p&gt;15 grudnia 1994 roku miała miejsce premiera pierwszej wersji przeglądarki Mosaic Netscape 1.0. Po kilku miesiącach udało się zdobyć ponad 70% rynku. Zyskanie takiej popularności przyniosło wspieranie tagu &lt;code class=&quot;highlighter-rouge&quot;&gt;≶blink&amp;gt;&lt;/code&gt; (powodującego mruganiem tekstu) oraz elementów formularza.&lt;/p&gt;

&lt;p&gt;(Aby uniknąć problemów z NSCA, nazwa przeglądarki została zmieniona na &lt;em&gt;Netscape Navigator&lt;/em&gt;, a po kilku miesiącach - w tym samym roku - firma zmieniła nazwę na &lt;em&gt;Netscape Communications&lt;/em&gt;.)&lt;/p&gt;

&lt;h2 id=&quot;narodziny-języka-livescript&quot;&gt;Narodziny języka LiveScript&lt;/h2&gt;

&lt;p&gt;Marc Andreessen stwierdził, że świat webu potrzebuje czegoś bardziej zaawansowanego, czegoś co będzie klejem dla obecnego HTMLa. Model przeglądarkowy utracił interaktywność. Dlatego Java była taka atrakcyjna, bo przywracała interaktywność w przeglądarce co pozwalało rywalizować z aplikacjami desktopowymi.&lt;/p&gt;

&lt;p&gt;Początkowo firma chciała, aby dynamika była podobna do mechanizmu HyperCard, systemu rozwijanego przez Billa Atkinsona w Apple, który miał na celu ułatwienie programowania na platformę Macintosh. Dostępnych było mnóstwo przycisków, do których można było przypisać dowolne skrypty. Firma &lt;em&gt;Netscape Communications&lt;/em&gt; chciał zrobić coś podobnego, ale na stronie internetowej.&lt;/p&gt;

&lt;p&gt;W 1995 roku firma &lt;em&gt;Netscape Communications&lt;/em&gt; zatrudniła kolejnego programistę z &lt;em&gt;MicroUnity&lt;/em&gt;, który wcześniej pracował w &lt;em&gt;Silicon Graphics&lt;/em&gt;, Brendana Eicha. Brendan na rozmowie rekrutacyjnej powiedział, że chciałby w przeglądarce &lt;em&gt;Netscape Navigator&lt;/em&gt; osadzić interpreter języka programowania Scheme. Firmie bardzo to się spodobało, bo właśnie tego oczekiwali od nowego kandydata.&lt;/p&gt;

&lt;figure class=&quot;social-center-block&quot;&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;Thanks. Just FYI (your piece was fine, if I read translation correctly), I worked at MicroUnity between SGI and Netscape.&lt;/p&gt;&amp;mdash; BrendanEich (@BrendanEich) &lt;a href=&quot;https://twitter.com/BrendanEich/status/804841960334725120?ref_src=twsrc%5Etfw&quot;&gt;December 3, 2016&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async=&quot;&quot; src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;

&lt;/figure&gt;

&lt;p&gt;Po rozpoczęciu prac, firma zorientowała się jak wygląda język Scheme i zarządziła zmiany, w obawie że w obecnej formie nowy język będzie mało atrakcyjny. Firma zaproponowała, aby Brendan osadził język przypominający np. Visual Basic albo Javę - czyli języki już cieszące się popularnością.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Netscape Communications&lt;/em&gt; w porozumieniu z &lt;em&gt;Sun Microsystems&lt;/em&gt; chciało dodać do swojej przeglądarki wsparcie dla języka Java, aby konkurować z &lt;em&gt;Microsoft&lt;/em&gt;-em pod kątem nowych technologii. &lt;em&gt;Netscape Communications&lt;/em&gt; zdecydowało, że język, który stworzą i dodadzą do swojej przeglądarki, będzie uzupełnieniem do języka Java o podobnej składni. Z miejsca wykluczało to więc osadzenia takich języków jak Python czy Perl. Aby bronić swojej idei wobec konkurencyjnych propozycji firma potrzebowała jednak prototypu.&lt;/p&gt;

&lt;p&gt;Brendan zmiksował elementy trzech języków: Java - ponieważ powiedziano mu, że musi użyć tego języka oraz dwóch innych bardzo interesujących języków: Scheme (dialekt Lispa, skąd pochodzi pomysł &lt;code class=&quot;highlighter-rouge&quot;&gt;first-class functions&lt;/code&gt;) oraz Self (język który bazował na Smaltalku, skąd zaczerpnięty został pomysł &lt;code class=&quot;highlighter-rouge&quot;&gt;prototypów&lt;/code&gt;), które nie były znane na rynku programistów. Wykorzystywane były głównie przez twórców innych języków języków programowania. Taki wybór okazał się sporym zaskoczeniem.&lt;/p&gt;

&lt;p&gt;Projekt został przeniesiony do Sun Labs firmy &lt;em&gt;Sun Microsystems&lt;/em&gt;, aby od czasu do czasu móc wspierać rozwój projektu odnośnie języków Java i Self. Z jakiegoś powodu firma &lt;em&gt;Sun Microsystems&lt;/em&gt; podjęła decyzję o zaprzestaniu rozwoju jednego z nich. Wybrali Self.&lt;/p&gt;

&lt;p&gt;Brendan Eich stworzył w maju nowy język. Zrobił to w 10 dni.&lt;/p&gt;

&lt;p&gt;W swojej opowieści Brendan dodaje, że razem ze swoim kolegą z pracy, Kippem Hickmanem, rywalizowali, który język da się lepiej osadzić w przeglądarce. Po kilku dniach przełożony obu developerów, Bil Joy, przekonał ich do porzucenia projektu umieszczenia Javy w przeglądarce, ze względu na problemy jakie pojawiły się przy osadzaniu wirtualnej maszyny. Nie była ona kompatybilna z maszyną firmy &lt;em&gt;Sun Microsystems&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Pierwsza wersja nowego języka nazywała się Mocha, ale w wersji beta przeglądarki &lt;em&gt;Netscape Navigator&lt;/em&gt; 2.0, która została opublikowana we wrześniu, nazwa została zmieniona na LiveScript.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Dnia 23 maja 1995 roku firma &lt;em&gt;Sun Microsystems&lt;/em&gt; podczas konferencji SunWorld, ogłosiła powstanie nowego języka programowania Java.&lt;/strong&gt;&lt;/p&gt;

&lt;h2 id=&quot;narodziny-języka-javascript&quot;&gt;Narodziny języka JavaScript&lt;/h2&gt;

&lt;p&gt;Nowy język Java wraz z przeglądarką &lt;em&gt;Netscape Navigator&lt;/em&gt;, wzbudziły wiele emocji, dlatego też &lt;em&gt;Sun Microsystems&lt;/em&gt; oraz &lt;em&gt;Netscape Communications&lt;/em&gt; podjęły decyzję o współpracy przeciwko firmie &lt;em&gt;Microsoft&lt;/em&gt;, w obawie że pojedynczo nie wytrzymają konkurencji.&lt;/p&gt;

&lt;p&gt;Największym punktem spornym w tym układzie był LiveScript. &lt;em&gt;Sun Microsystems&lt;/em&gt; chciało dodać Javę do przeglądarki &lt;em&gt;Netscape Navigator&lt;/em&gt; oraz zakończyć pracę nad LiveScriptem. Firma &lt;em&gt;Netscape Communications&lt;/em&gt; nie zgodziła się na taki zabieg ponieważ wierzyli, że uda im się stworzyć coś w rodzaju funkcjonalności HyperCard. Z powodu braku porozumienia współpraca prawie została zerwana.&lt;/p&gt;

&lt;p&gt;Aby załagodzić stosunki nazwa została zmieniona na JavaScript. I tak w 3 wersji beta przeglądarki &lt;em&gt;Netscape Navigator&lt;/em&gt; 2.0 LiveScript został zastąpiony nazwą JavaScript.&lt;/p&gt;

&lt;p&gt;Ostateczny wybór wprowadził zamieszanie jako iż wiele osób myślało, że JavaScript jest efektem ubocznym powstania Javy, która cechowała się większą popularnością.&lt;/p&gt;

&lt;p&gt;Wybór został scharakteryzowany jako chwyt marketingowy firmy &lt;em&gt;Netscape Communications&lt;/em&gt; aby pochwalić się wynalezienie nowego webowego języka programowania.&lt;/p&gt;

&lt;p&gt;Spór ucichł - zmiana nazwy pomogła. Z drobnym wyjątkiem - firma &lt;em&gt;Sun Microsystems&lt;/em&gt; zastrzegła prawa własności do znaku towarowego. Najciekawsze jest to, że firma nie miała nic wspólnego z nazwą, a nawet próbowała zabić ten język. W drodze przysługi &lt;em&gt;Sun Microsystems&lt;/em&gt; udzieliło firmie &lt;em&gt;Netscape Communications&lt;/em&gt; licencji na używanie nazwy nowego języka programowania, co było o tyle satysfakcjonujące, że posiadali ją na wyłączność.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Na dzień 4 grudnia 1995 przypadają narodziny języka JavaScript tj. wtedy firma Netscape Communications wydała oficjalne oświadczenie (link poniżej) o nowym, otwartym, multi-platformowym języku.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Można powiedzieć, że stabilna wersja języka JavaScript z numerem 1.0 pojawiła się wraz z opublikowaniem przeglądarki &lt;em&gt;Netscape Navigator&lt;/em&gt; 2.0, a miało to miejsce 18 września 1995 roku.&lt;/p&gt;

&lt;h2 id=&quot;narodziny-języka-jscript-oraz-ecmascript&quot;&gt;Narodziny języka JScript oraz ECMAScript&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Microsoft&lt;/em&gt; przypatrywał się temu z boku. Postanowił, że skopiuje język pod inną nazwą. Nie mogli używać nazwy JavaScript - prawa do niej miała firma &lt;em&gt;Sun Microsystems&lt;/em&gt; (z którą &lt;em&gt;Microsoft&lt;/em&gt; nie miał dobrych stosunków). Swoją kopię silnika nazwali JScript.&lt;/p&gt;

&lt;p&gt;Z kolei firma &lt;em&gt;Netscape Communications&lt;/em&gt; - gdy zobaczyła, że konkurencja kopiuje jej język, i że może on zostać przejęty i rozszerzany przez kogoś innego - postanowiła stworzyć standard. Początkowo próbowała ustandaryzować swój język w organizacji W3C, ale niestety współpraca nie została nawiązana.&lt;/p&gt;

&lt;p&gt;Dopiero organizacja ECMA (European Computer Manufacturers Association z siedzibą w Genewie) zdecydowała się nawiązać współpracę, dzięki temu firma &lt;em&gt;Netscape Communications&lt;/em&gt; mogła wykupić u nich standard. Było to w czerwcu w 1997 roku. Była to długa droga dla firmy z Kaliforni, ale się udało.&lt;/p&gt;

&lt;p&gt;Firma chciała ustandaryzować język, ale nie chciała nazywać go JavaScript, ponieważ tylko &lt;em&gt;Netscape Communications&lt;/em&gt; mógł nazywać ten język JavaScript. Komitet starał się wymyślić inną nazwę. Koniec końców, został opublikowany dokument, który zawierał nazwę ECMAScript.&lt;/p&gt;

&lt;h2 id=&quot;podsumowanie&quot;&gt;Podsumowanie&lt;/h2&gt;

&lt;p&gt;Historia naszego pięknego języka jest burzliwa, ale warto ją znać. Dobrą praktyką jest tworzenie &lt;strong&gt;tl;dr&lt;/strong&gt; (&lt;code class=&quot;highlighter-rouge&quot;&gt;too long; don't read&lt;/code&gt;), czyli krótkiego podsumowania. W 10 punktach zawarłem najważniejsze zwroty akcji o początkach tworzenia języka JavaScript.&lt;/p&gt;

&lt;h2 id=&quot;bibliografia&quot;&gt;Bibliografia&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://brendaneich.com/2008/04/popularity/&quot;&gt;brendaneich.com/2008/04/popularity/&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://javascript.crockford.com/popular.html&quot;&gt;javascript.crockford.com/popular.html&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://javascript.crockford.com/javascript.html&quot;&gt;javascript.crockford.com/javascript.html&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=RO1Wnu-xKoY&quot;&gt;Crockford on JavaScript - Chapter 2: And Then There Was JavaScript&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;cs.put.poznan.pl/mmasewicz/dydaktyka/po/kursjavy/historia.html&amp;lt;/&amp;gt;&lt;/li&gt;
  &lt;li&gt;web.archive.org
    &lt;ul&gt;
      &lt;li&gt;&lt;a href=&quot;https://web.archive.org/web/20080208124612/http://wp.netscape.com/comprod/columns/techvision/innovators_be.html&quot;&gt;https://web.archive.org/web/20080208124612/http://wp.netscape.com/comprod/columns/techvision/innovators_be.html&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;https://web.archive.org/web/20080213171613/http://wp.netscape.com/newsref/pr/newsrelease67.html&quot;&gt;https://web.archive.org/web/20080213171613/http://wp.netscape.com/newsref/pr/newsrelease67.html&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Wikipedia
    &lt;ul&gt;
      &lt;li&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/JavaScript&quot;&gt;https://en.wikipedia.org/wiki/JavaScript&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Java_(programming_language)&quot;&gt;https://en.wikipedia.org/wiki/Java_(programming_language)&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Netscape_(web_browser)&quot;&gt;https://en.wikipedia.org/wiki/Netscape_(web_browser)&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Sun_Microsystems&quot;&gt;https://en.wikipedia.org/wiki/Sun_Microsystems&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Sun_Microsystems_Laboratories&quot;&gt;https://en.wikipedia.org/wiki/Sun_Microsystems_Laboratories&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Silicon_Graphics&quot;&gt;https://en.wikipedia.org/wiki/Silicon_Graphics&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/National_Center_for_Supercomputing_Applications&quot;&gt;https://en.wikipedia.org/wiki/National_Center_for_Supercomputing_Applications&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Douglas_Crockford&quot;&gt;https://en.wikipedia.org/wiki/Douglas_Crockford&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Historia Javy
    &lt;ul&gt;
      &lt;li&gt;&lt;a href=&quot;http://cs.smu.ca/~porter/csc/465/notes/java_story_history.html&quot;&gt;cs.smu.ca/~porter/csc/465/notes/java_story_history.html&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;http://papa.det.uvigo.es/~theiere/cursos/Curso_Java/history.html&quot;&gt;papa.det.uvigo.es/~theiere/cursos/Curso_Java/history.html&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;
</description>
            <pubDate>Fri, 02 Dec 2016 00:00:00 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2016/12/02/historia-jezyka-javascript.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2016/12/02/historia-jezyka-javascript.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/post-banner-javascript.png</image>
        </item>
        
        <item>
            <title>Konferencja: ngPoland 2016</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;W zeszły wtorek (&lt;em&gt;22-11-2016&lt;/em&gt;) byłem uczestnikiem pierwszej polskiej konferencji poświęconej w 100% najpopularniejszemu frameworkowi w świecie JavaScript-u, czyli &lt;a href=&quot;http://angular.io&quot;&gt;Angular&lt;/a&gt;-owi. Ciekawią Cię jakie są moje wrażenia z konferencji &lt;a href=&quot;http://ng-poland.pl&quot;&gt;ngPoland&lt;/a&gt;? Czytaj dalej.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/conference-ng-poland-2016/ng-poland-2016-logo.png&quot; alt=&quot;&quot; /&gt;

    &lt;figcaption&gt;
        Oficjalne logo tegorocznej konferencji.
    &lt;/figcaption&gt;

&lt;/figure&gt;

&lt;p&gt;Techniczne notatki jak zawsze są dostępne na GitHubie. Są tworzone one podczas wydarzenia. Zapraszam: &lt;a href=&quot;https://github.com/piecioshka/notes-ng-poland-2016&quot;&gt;github.com/piecioshka/notes-ng-poland-2016&lt;/a&gt;&lt;/p&gt;

&lt;h2 id=&quot;lokalizacja&quot;&gt;Lokalizacja&lt;/h2&gt;

&lt;p&gt;Kto się spodziewał, że konferencja odbędzie się na stadionie narodowym? Większość pewnie zadawała sobie pytanie, czy wydarzenie przypadkiem nie odbędzie się na płycie boiska?&lt;/p&gt;

&lt;p&gt;Niestety, ale na płycie boiska znajdują się 2 lodowiska, które przyciągają wszelkich zainteresowanych do swobodnej przejażdżki.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.pgenarodowy.pl/&quot;&gt;PGE Narodowy&lt;/a&gt; to piękny obiekt z zewnątrz ale i od środka. Obiekt zawiera wiele salek, które można wynająć w celach biznesowych (&lt;a href=&quot;http://narodowy.blpoland.com/&quot;&gt;Business Link&lt;/a&gt;).&lt;/p&gt;

&lt;figure class=&quot;social-center-block&quot;&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;Just before registration for &lt;a href=&quot;https://twitter.com/ngPolandConf?ref_src=twsrc%5Etfw&quot;&gt;@ngPolandConf&lt;/a&gt; &lt;a href=&quot;https://twitter.com/hashtag/polish?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#polish&lt;/a&gt; &lt;a href=&quot;https://twitter.com/hashtag/conference?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#conference&lt;/a&gt; &lt;a href=&quot;https://t.co/9qhj3sOP2Y&quot;&gt;pic.twitter.com/9qhj3sOP2Y&lt;/a&gt;&lt;/p&gt;&amp;mdash; Piotr Kowalski (@piecioshka) &lt;a href=&quot;https://twitter.com/piecioshka/status/800964636002648064?ref_src=twsrc%5Etfw&quot;&gt;November 22, 2016&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async=&quot;&quot; src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;

&lt;/figure&gt;

&lt;h2 id=&quot;rejestracja&quot;&gt;Rejestracja&lt;/h2&gt;

&lt;p&gt;Przed wejściem na salę z prelekcjami czekała rejestracja. Każdy uczestnik musiał się zarejestrować. Podczas rejestracji trzeba było pokazać swój bilet. W zamian dostawało się smycz z logo sponsora &lt;a href=&quot;http://acaisoft.com/&quot;&gt;Acaisoft&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Jako uczestnicy dostawaliśmy też kuferek z poczęstunkiem (słodycze) i jeszcze kilka fantów. Świetny pomysł! Człowiek od razu na starcie jest miło przywitany - sprzyja to lepszemu odbiorowi całej konferencji.&lt;/p&gt;

&lt;figure class=&quot;social-center-block&quot;&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;Yeah!! I just register to the first polish &lt;a href=&quot;https://twitter.com/hashtag/angular?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#angular&lt;/a&gt; conference &lt;a href=&quot;https://twitter.com/ngPolandConf?ref_src=twsrc%5Etfw&quot;&gt;@ngPolandConf&lt;/a&gt; &lt;a href=&quot;https://t.co/gfXD3cHFeP&quot;&gt;pic.twitter.com/gfXD3cHFeP&lt;/a&gt;&lt;/p&gt;&amp;mdash; Piotr Kowalski (@piecioshka) &lt;a href=&quot;https://twitter.com/piecioshka/status/800966796551471106?ref_src=twsrc%5Etfw&quot;&gt;November 22, 2016&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async=&quot;&quot; src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;

&lt;/figure&gt;

&lt;h2 id=&quot;partnerzy--a-wśród-nich-warsawjs&quot;&gt;Partnerzy … a wśród nich &lt;a href=&quot;http://warsawjs.com/&quot;&gt;WarsawJS&lt;/a&gt;&lt;/h2&gt;

&lt;p&gt;Zakładaliśmy &lt;strong&gt;WarsawJS&lt;/strong&gt; w celu aktywizacji warszawskich programistów JavaScript. Wszelkie formy networkingu oczywiście popieramy, dlatego też jesteśmy partnerami wielu inicjatyw, a konferencja &lt;a href=&quot;http://ng-poland.pl&quot;&gt;ngPoland&lt;/a&gt; jest jedną z nich.&lt;/p&gt;

&lt;p&gt;Zawsze cieszy widok, tylu ludzi zainteresowanych JavaScriptem. Szczególnie tych zakochanych w konkretnym frameworku. Ci developerzy starają się użyć tego narzędzia wszędzie gdzie się da - nie zawsze ma to pozytywne skutki 😄&lt;/p&gt;

&lt;p&gt;Frameworki są stworzone, żeby rozwiązywać problemy. Nie ma frameworka, który rozwiązuje wszystkie problemy, więc i nie takiego, którego można użyć w dowolnym zastosowaniu.&lt;/p&gt;

&lt;p&gt;Tomasz Ducin podczas swojej prelekcji na &lt;strong&gt;ngPoland&lt;/strong&gt; powiedział:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Don’t focus on tools, focus on the problem. &lt;small&gt;Tomasz Ducin&lt;/small&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;W pełni się z nim zgadzam. Chciałbym aby wszyscy myśleli podobnie.&lt;/p&gt;

&lt;figure class=&quot;social-center-block&quot;&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;We are partners of &lt;a href=&quot;https://twitter.com/ngPolandConf?ref_src=twsrc%5Etfw&quot;&gt;@ngPolandConf&lt;/a&gt; 😉 &lt;a href=&quot;https://t.co/bwmi3RiSSo&quot;&gt;pic.twitter.com/bwmi3RiSSo&lt;/a&gt;&lt;/p&gt;&amp;mdash; WarsawJS (@warsawjs) &lt;a href=&quot;https://twitter.com/warsawjs/status/800972652747825152?ref_src=twsrc%5Etfw&quot;&gt;November 22, 2016&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async=&quot;&quot; src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;

&lt;/figure&gt;

&lt;p&gt;Jak możecie zobaczyć, partnerami konferencji było mnóstwo organizacji zaangażowanych w aktywizację społeczności programistów, nie tylko warszawskich! Jak dobrze się przypatrzycie obrazkowi powyżej zobaczycie, że wśród sponsorów jest organizacja &lt;a href=&quot;https://www.meetup.com/ng-poznan-meetup/&quot;&gt;ng-poznan&lt;/a&gt;, która działa na podobnej zasadzie co organizacja &lt;a href=&quot;https://www.meetup.com/AngularJS-Warsaw/&quot;&gt;AngularJS Warsaw&lt;/a&gt;, od której zaczynali organizatorzy konferencji, czyli:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.linkedin.com/in/arkadiusz-kalbarczyk-7a14bbb4&quot;&gt;Arek Kalbarczyk&lt;/a&gt; - developer, pracujący w 10Clouds&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.linkedin.com/in/ngkalbarczyk&quot;&gt;Darek Kalbarczyk&lt;/a&gt; - wieloletni developer, pracujący obecnie w 7N.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Z tego co wiem, w gronie współorganizatorów znajduje się także &lt;a href=&quot;https://twitter.com/emluszkiewicz&quot;&gt;Emilię Łuszkiewicz&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;prezentacja-organizatorów&quot;&gt;Prezentacja organizatorów&lt;/h2&gt;

&lt;p&gt;Konferencja zaczęła się punktualnie o godzinie 9:00, gdzie na scenie pojawili się kuzyni: Arek i Darek - organizatorzy. Podziękowali wszystkim za przybycie oraz zaprosili do wysłuchania 16 prelekcji na temat Angular-a (w obu wersjach 1.x oraz 2.x).&lt;/p&gt;

&lt;p&gt;Prelekcje jak i cała konferencja odbywała się w języku angielskim. To już standard na międzynarodowych konferencjach.&lt;/p&gt;

&lt;h2 id=&quot;co-tam-się-działo&quot;&gt;Co tam się działo?&lt;/h2&gt;

&lt;figure class=&quot;social-center-block&quot;&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;What happen at &lt;a href=&quot;https://twitter.com/ngPolandConf?ref_src=twsrc%5Etfw&quot;&gt;@ngPolandConf&lt;/a&gt; ???? &lt;a href=&quot;https://t.co/rvAq5iCuug&quot;&gt;pic.twitter.com/rvAq5iCuug&lt;/a&gt;&lt;/p&gt;&amp;mdash; Piotr Kowalski (@piecioshka) &lt;a href=&quot;https://twitter.com/piecioshka/status/800984610003881984?ref_src=twsrc%5Etfw&quot;&gt;November 22, 2016&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async=&quot;&quot; src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;

&lt;/figure&gt;

&lt;p&gt;Druga prelekcja i już banany na scenie!!?&lt;/p&gt;

&lt;p&gt;Osoby, które zostały zaproszone do bycia speakerami nie były z tzw. ulicy. Prelegenci znali się już przed konferencją, więc mogli zrobić coś interesującego, jak chociażby wspólne śpiewanie!&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://twitter.com/@ladyleet&quot;&gt;Tracy Lee&lt;/a&gt; opowiadała o tym jak stowrzyć projekt w oparciu o &lt;a href=&quot;https://github.com/angular/angular-cli&quot;&gt;angular-cli&lt;/a&gt;, ale przed tym jak zaczęła wgłębiać się w temat, zaprosiła swojego dobrego kolegę Bena Lesh-a z którym zaczęła śpiewać.&lt;/p&gt;

&lt;p&gt;Jeszcze przed rozpoczęciem na scenie pojawił się człowiek-banan - wydaje mi się, że był to Uri Shaked, który śpiewał i tańczył jednocześnie. Wszystko to przed publicznością liczącą kilkuset osób.&lt;/p&gt;

&lt;p&gt;Było to dla mnie NIESAMOWITE!&lt;/p&gt;

&lt;h2 id=&quot;nagroda&quot;&gt;Nagroda&lt;/h2&gt;

&lt;p&gt;Organizatorzy przed lunchem, wpadli na pomysł, na realizację planu i wręczeniu kilku nagród pod szyldem: &lt;em&gt;ng-awards&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Dostałem nagrodę jako przedstawiciel organizacji WarsawJS - największej społeczności JavaScript-owej w Warszawie. Chciałem zaznaczyć, że brawa należą się wszystkim organizatorom WarsawJS, aktualnym&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.linkedin.com/in/piotr-zientara-60210a99&quot;&gt;Piotr Zientara&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.linkedin.com/in/katarzyna-grabowska-2273447a&quot;&gt;Katarzyna Grabowska&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;oraz tym, którzy zrezygnowali z pełnienia tej funkcji, tj:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.linkedin.com/in/marcincimaszewski&quot;&gt;Marcin Cimaszewski&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.linkedin.com/in/krzysztofmodras&quot;&gt;Krzysztof Modras&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;W imieniu wszystkich całej organizacji &lt;strong&gt;bardzo dziękuję&lt;/strong&gt; 🎉&lt;/p&gt;

&lt;figure class=&quot;social-center-block&quot;&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;Thanks a lot &lt;a href=&quot;https://twitter.com/ngPolandConf?ref_src=twsrc%5Etfw&quot;&gt;@ngPolandConf&lt;/a&gt; 😘😎 &lt;a href=&quot;https://twitter.com/hashtag/ngawards2016?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#ngawards2016&lt;/a&gt; &lt;a href=&quot;https://t.co/YmbLi5AXJx&quot;&gt;pic.twitter.com/YmbLi5AXJx&lt;/a&gt;&lt;/p&gt;&amp;mdash; Piotr Kowalski (@piecioshka) &lt;a href=&quot;https://twitter.com/piecioshka/status/801031112969568256?ref_src=twsrc%5Etfw&quot;&gt;November 22, 2016&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async=&quot;&quot; src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;

&lt;/figure&gt;

&lt;h2 id=&quot;spiderman-na-scenie&quot;&gt;Spiderman na scenie!&lt;/h2&gt;

&lt;p&gt;Jako 8 na scenie w roli speakera pojawił się &lt;a href=&quot;https://twitter.com/gerardsans&quot;&gt;Gerard Sans&lt;/a&gt;, który to opowiadał o tworzeniu aplikacji opartej na frameworku Angular2, którą realizował na potrzeby chorego Spider-mana.&lt;/p&gt;

&lt;p&gt;Brawa za kreatywność. Sala miała ubaw po pachy 😄&lt;/p&gt;

&lt;figure class=&quot;social-center-block&quot;&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;Spiderman with cap on stage! &lt;a href=&quot;https://twitter.com/gerardsans?ref_src=twsrc%5Etfw&quot;&gt;@gerardsans&lt;/a&gt; talk about app which is make for &lt;a href=&quot;https://twitter.com/hashtag/Spiderman?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#Spiderman&lt;/a&gt;. Everything is happen at &lt;a href=&quot;https://twitter.com/ngPolandConf?ref_src=twsrc%5Etfw&quot;&gt;@ngPolandConf&lt;/a&gt; 😜🕷💥 &lt;a href=&quot;https://t.co/Kue8Up7ajh&quot;&gt;pic.twitter.com/Kue8Up7ajh&lt;/a&gt;&lt;/p&gt;&amp;mdash; Piotr Kowalski (@piecioshka) &lt;a href=&quot;https://twitter.com/piecioshka/status/801059791632236544?ref_src=twsrc%5Etfw&quot;&gt;November 22, 2016&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async=&quot;&quot; src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;

&lt;/figure&gt;

&lt;h2 id=&quot;konkurs-na-najbardziej-zwariowane-zdjęcie&quot;&gt;Konkurs na najbardziej zwariowane zdjęcie&lt;/h2&gt;

&lt;figure class=&quot;social-center-block&quot;&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;We are at &lt;a href=&quot;https://twitter.com/ngPolandConf?ref_src=twsrc%5Etfw&quot;&gt;@ngPolandConf&lt;/a&gt; 🐝 (photo taking part in craziest photo contest at the conference) 🙈 &lt;a href=&quot;https://t.co/Zst4C6uHIB&quot;&gt;pic.twitter.com/Zst4C6uHIB&lt;/a&gt;&lt;/p&gt;&amp;mdash; WarsawJS (@warsawjs) &lt;a href=&quot;https://twitter.com/warsawjs/status/801097496818655233?ref_src=twsrc%5Etfw&quot;&gt;November 22, 2016&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async=&quot;&quot; src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;

&lt;/figure&gt;

&lt;p&gt;Organizatorzy podczas otwarcia konferencji opowiadali o konkursie jaki będzie się toczył podczas wydarzenia, a mianowicie zawodów na najbardziej kreatywne zdjęcie tego dnia.&lt;/p&gt;

&lt;p&gt;Postanowiliśmy z Piotrem wzięć udział. Stąd też powyższe zdjęcie. Proszę nie martwcie się o nasze zdrowie psychiczne - wszystko gra 😄&lt;/p&gt;

&lt;h2 id=&quot;podsumowanie&quot;&gt;Podsumowanie&lt;/h2&gt;

&lt;p&gt;Na wstępie podsumowania, chciałem podziękować za możliwość uczestnictwa ekipie WarsawJS na tej konferencji. Jest to świetny dowód wsparcia warszawskich społeczności developerskich.&lt;/p&gt;

&lt;h3 id=&quot;ocena-od-strony-organizatora&quot;&gt;Ocena od strony organizatora&lt;/h3&gt;

&lt;p&gt;Konferencja od strony organizacyjnej stała na bardzo wysokim poziomie. Nie ma się do czego przyczepić.&lt;/p&gt;

&lt;p&gt;Mogę śmiało dać w skali 1-5 ocenę &lt;strong&gt;5&lt;/strong&gt;. Good job!&lt;/p&gt;

&lt;h3 id=&quot;ocena-strony-merytorycznej&quot;&gt;Ocena strony merytorycznej&lt;/h3&gt;

&lt;p&gt;Jako zwolennik wszystkiego, co JavaScript-owe to dla mnie wszelkie rozmowy, prelekcje czy filmy są super. Więc nie jestem tutaj dobrą osobą na ocenę. Jeśli jednak miałbym dać jakąś cyferkę, to oczywiście &lt;strong&gt;5&lt;/strong&gt; w tej samej skali co powyżej.&lt;/p&gt;

&lt;h3 id=&quot;inne-artykułu-traktujące-o-ngpoland-2016&quot;&gt;Inne artykułu traktujące o ngPoland 2016&lt;/h3&gt;

&lt;p&gt;Pozwolę sobie na stworzenie listy artykułów o konferencji, które zostały napisane przez innych uczestników.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://codewithstyle.info/ngpoland-angular-conference-2016/&quot;&gt;codewithstyle.info/ngpoland-angular-conference-2016/&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://tomaszpuchalski.com/ngpoland-2016-takie-konferencje-to-ja-rozumiem/&quot;&gt;tomaszpuchalski.com/ngpoland-2016-takie-konferencje-to-ja-rozumiem/&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://poznajprogramowanie.pl/konferencja-ng-poland-2016/&quot;&gt;poznajprogramowanie.pl/konferencja-ng-poland-2016/&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://blog.jankowalski.pl/ngpoland-diabel-tkwi-w-szczegolach.html&quot;&gt;blog.jankowalski.pl/ngpoland-diabel-tkwi-w-szczegolach.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/conference-ng-poland-2016/IMG_7227.JPG&quot; alt=&quot;&quot; /&gt;

    &lt;figcaption&gt;
        Uri Shaked na scenie i jego zabawka - Raspberry PI,&lt;br /&gt;
        na której uruchomił grę &quot;Simon says...&quot;.
    &lt;/figcaption&gt;

&lt;/figure&gt;
</description>
            <pubDate>Fri, 25 Nov 2016 00:00:00 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2016/11/25/konferencja-ng-poland-2016.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2016/11/25/konferencja-ng-poland-2016.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/conference-ng-poland-2016/ng-poland-526x275.jpg</image>
        </item>
        
        <item>
            <title>WarsawJS Meetup #27</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Ten meetup był delikatnie inny niż poprzednie. Jako organizatorzy WarsawJS chcieliśmy trochę poeksperymentować. Tym samym, dołożyliśmy do standardowych 3 prelekcji &lt;strong&gt;mini workshop&lt;/strong&gt;, aby zobaczyć, ile osób będzie zainteresowanych naszą nową inicjatywą &lt;em&gt;WarsawJS Workshop&lt;/em&gt;.&lt;/p&gt;

&lt;!-- &lt;figure&gt;
    &lt;a href=&quot;https://www.meetup.com/WarsawJS/&quot;&gt;
        &lt;img src=&quot;/assets/images/posts/post-banner-warsawjs.jpg&quot;
             alt=&quot;WarsawJS&quot;/&gt;
    &lt;/a&gt;
&lt;/figure&gt; --&gt;

&lt;h2 id=&quot;invitation&quot;&gt;Invitation&lt;/h2&gt;

&lt;p&gt;Film nagrywaliśmy w dość chłodny (bo musiałem mieć rękawiczki) dzień na pl. Trzech Krzyży, w centrum miasta.&lt;/p&gt;

&lt;p&gt;Zapraszam w imieniu organizatorów WarsawJS.&lt;/p&gt;

&lt;div class=&quot;youtube-lazy&quot; data-youtube-id=&quot;5003uFm7WSE&quot;&gt;&lt;/div&gt;

&lt;p class=&quot;chapter-break&quot;&gt;&amp;bull;&lt;/p&gt;

&lt;h2 id=&quot;talk-1-single-page-application-loading-time-optimization-powered-by-webpack-react-nodejs-and-isomorphic-style-loader-pl-michał-janaszek&quot;&gt;Talk #1: Single-page application loading time optimization. Powered by Webpack, React, Node.js and isomorphic-style-loader [PL] &lt;small&gt;Michał Janaszek&lt;/small&gt;&lt;/h2&gt;

&lt;p&gt;Prelekcja była nt. optymalizacji działania &lt;del&gt;strony&lt;/del&gt; aplikacji webowej. Skupiała się ona w większości na sposobie przyspieszenia ładowania się.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;JSX jest dobry do opisu elementów wizualnych. &lt;small&gt;Michał Janaszek&lt;/small&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Pierwotnie analizowana aplikacja, przed załadowaniem treści pokazywała użytkownikowi tekst &lt;em&gt;Loading&lt;/em&gt; i trwało to około 540 [ms]. Z kolei pełna treść tejże aplikacji wraz z funkcjonalnościami była dostępna po 3580 [ms].&lt;/p&gt;

&lt;p&gt;Michał, przeprowadził aplikację przez kolejne 3 fazy i zredukował czas ładowania aplikacji do 257 [ms], a użytkownik nie był w stanie zobaczyć napisu &lt;em&gt;Loading&lt;/em&gt;, ponieważ go po prostu nie było w aplikacji, zastąpiła go docelowa treść aplikacji.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Link do prelekcji: &lt;a href=&quot;https://www.youtube.com/watch?v=R8La_pSPSGY&quot;&gt;youtube.com/watch?v=R8La_pSPSGY&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p class=&quot;chapter-break&quot;&gt;&amp;bull;&lt;/p&gt;

&lt;h2 id=&quot;talk-2-graphql-in-a-nutshell-pl-kamil-grabek&quot;&gt;Talk #2: GraphQL in a nutshell [PL] &lt;small&gt;Kamil Grabek&lt;/small&gt;&lt;/h2&gt;

&lt;p&gt;Podczas prelekcji dowiedzieliśmy się czym jest GraphQL oraz o kilku jego zaletach np. o tym, że GraphQL ma ściśle określony typ.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;W skrócie jest to idea, w jaki sposób powinna odbywać się komunikacja klient-serwer. &lt;small&gt;Kamil Grabek&lt;/small&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Część kliencka aplikacji, gdzie jest wykorzystany GraphQL, jest w stanie powiedzieć serwerowi co chce dostać w odpowiedzi na zapytania.&lt;/p&gt;

&lt;p&gt;Technologia GraphQL jest dość młoda. Ma dopiero 2 lata. Facebook - ze względu na to, że jest autorem projektu - korzystał już wcześniej. Technologia się rozwija, także dajmy jej szansę i zobaczymy jak za kilka lat będzie wyglądał protokół komunikacji klient-serwer.&lt;/p&gt;

&lt;p&gt;Kamil po swojej prezentacji poprowadził mini workshopy z GraphQL, na których obecnych było ponad 20 osób.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Link do prelekcji: &lt;a href=&quot;https://www.youtube.com/watch?v=w0AOqhzWK3E&quot;&gt;youtube.com/watch?v=w0AOqhzWK3E&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p class=&quot;chapter-break&quot;&gt;&amp;bull;&lt;/p&gt;

&lt;h2 id=&quot;sponsorzy-spotkania&quot;&gt;Sponsorzy spotkania&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.facebook.com/10Clouds/&quot;&gt;10Clouds&lt;/a&gt; - żetony w barze&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.facebook.com/cyfrowypolsat/&quot;&gt;Cyfrowy Polsat&lt;/a&gt; - materiały na YouTube&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.facebook.com/whitestreampl&quot;&gt;Whitestream&lt;/a&gt; - transmisja na żywo - &lt;a href=&quot;http://warsawjs.com/live&quot;&gt;warsawjs.com/live&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.facebook.com/softwarely/&quot;&gt;Softwarely&lt;/a&gt; - dodatkowe wsparcie&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;podsumowanie&quot;&gt;Podsumowanie&lt;/h2&gt;

&lt;p&gt;Ze względu na to, że nasz eksperyment się powiódł, tj. na workshopach zostało kilkadziesiąt osób, to kolejne spotkanie (grudniowe), również będzie zawierało mini workshop o GraphQL, a dokładniej o Relay, ale o tym dowiecie się podczas kolejnej zapowiedzi wideo.&lt;/p&gt;

&lt;p&gt;Do zobaczenia za miesiąc!&lt;/p&gt;
</description>
            <pubDate>Sat, 19 Nov 2016 00:00:00 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2016/11/19/warsawjs-meetup-27.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2016/11/19/warsawjs-meetup-27.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/post-banner-warsawjs.jpg</image>
        </item>
        
        <item>
            <title>Hackathon: Node Knockout #6 (2016)</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;W miniony weekend brałem udział w maratonie dla programistów, czyli &lt;strong&gt;hackathonie&lt;/strong&gt;! Od kilku lat jestem wiernym fanem hackathonu o nazwie &lt;strong&gt;Node Knockout&lt;/strong&gt;, gdzie podstawową zasadą jest wykorzystanie technologii &lt;em&gt;Node.js&lt;/em&gt; w aplikacjach biorących udział w zawodach.&lt;/p&gt;

&lt;p&gt;Tematyka na takich zawodach jest dowolna. Można tworzyć aplikacje ale też i gry. Docelowym środowiskiem musi być przeglądarka internetowa. Dlatego też tworzenie aplikacji mobilnych, desktopowych czy na &lt;em&gt;Smart TV&lt;/em&gt; albo &lt;em&gt;Smart Watch&lt;/em&gt; odpada.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/nko-2016/nko-2016.png&quot; alt=&quot;&quot; /&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;co-to-jest-hackathon&quot;&gt;Co to jest Hackathon?&lt;/h2&gt;

&lt;p&gt;Hackathon jest zlepkiem 2 słów: &lt;em&gt;hack&lt;/em&gt; oraz &lt;em&gt;marathon&lt;/em&gt;. Podstawową ideą jest tworzenie czegoś, albo projektu programistycznego, albo czegoś z dziedziny hardware-u, &lt;em&gt;non-stop&lt;/em&gt;, czyli bez przerwy, w określonych wcześniej ramach czasowych. Bardzo często jest to 48 godzin. Jeśli po 48 godzinach dalej będziemy rozwijać naszą aplikację zostaniemy &lt;em&gt;zdyskwalifikowani.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Ostatnio nawet polski rząd stworzył hackathon. Więcej &lt;a href=&quot;https://www.wprost.pl/kraj/10024608/Polski-rzad-zorganizowal-pierwszy-w-historii-hackathon.html&quot;&gt;tutaj&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;zespół&quot;&gt;Zespół&lt;/h2&gt;

&lt;p&gt;Mój zespół liczył 3 osoby. W teamie &lt;em&gt;Dumplings&lt;/em&gt; do którego należałem, znajdowały się jeszcze 2 osoby: &lt;a href=&quot;https://grabowska.org&quot;&gt;Katarzyna&lt;/a&gt; oraz &lt;a href=&quot;https://rendfall.pl&quot;&gt;Krzysztof.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Kasia jest grafikiem komputerowym, taka umiejętność w tworzeniu aplikacji, czy gier jest nieoceniona. Jestem przekonany, że gdybyśmy z Krzyśkiem napisali super grę, ale nie miała by ona grafiki to nikomu by się nie podobała.&lt;/p&gt;

&lt;p&gt;Według mnie &lt;strong&gt;grafika w grach to około 50% odbioru&lt;/strong&gt;, reszta to: szybkość grania i ładowania, obsługa sterowania, interesująca fabuła itd.&lt;/p&gt;

&lt;h2 id=&quot;opis-gry-stworzonej-w-34-godziny&quot;&gt;Opis gry, stworzonej w 34 godziny&lt;/h2&gt;

&lt;p&gt;Hackathon zaczął się o w 0:00 UTC 12 listopada, więc czasu polskiego 1:00 w sobotę. A kończył 23:59:59 UTC w 13 listopada, czyli sekundę przed końcem niedzieli. Polskiego czasu to 0:59:59 w poniedziałek.&lt;/p&gt;

&lt;p&gt;Jako zespół realizowaliśmy projekt w następujących ramach czasowych:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Sobota: 7:00 - 1:00 (niedziela) = 18&lt;/li&gt;
  &lt;li&gt;Niedziela: 9:00 - 1:00 (poniedziałek) = 16&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;HINT: Ważne jest, aby w ciągu tych dwóch dni zrobić przerwę na sen. Człowiek nie jest w stanie pracować przez 48 godzin non-stop. W takich zawodach wygrywają osoby, które dobrze zarządzą swoim czasem podczas hackathonu.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/nko-2016/screen-1.png&quot; alt=&quot;&quot; /&gt;

    &lt;figcaption&gt;
        Screen z gry.
    &lt;/figcaption&gt;

&lt;/figure&gt;

&lt;p&gt;Gra dostępna jest pod adresem: &lt;a href=&quot;http://dumplings.2016.nodeknockout.com/&quot;&gt;dumplings.2016.nodeknockout.com/&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Głosować na nią można na stronie &lt;a href=&quot;https://www.nodeknockout.com/entries/170-dumplings&quot;&gt;https://www.nodeknockout.com/entries/170-dumplings&lt;/a&gt; poprzez kliknięcie przycisku &lt;strong&gt;FAVOURITE&lt;/strong&gt; albo jeśli byłeś zawodnikiem tych zawodów poprzez uzupełnienie formularza:&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/nko-2016/vote-form.png&quot; alt=&quot;&quot; /&gt;

    &lt;figcaption&gt;
        Formularz oceny projektów biorących udział w hackathonie Node Knockout 2016.
    &lt;/figcaption&gt;

&lt;/figure&gt;

&lt;p&gt;A jeśli jesteś geekiem (albo po prostu developerem) i interesuję Cię jak gra wygląda od środka, to zapraszam Cię do odwiedzenia repozytorium projektu: &lt;a href=&quot;https://github.com/rumblex/nodeknockout2016-dumplings&quot;&gt;github.com/rumblex/nodeknockout2016-dumplings&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;pitch-video&quot;&gt;Pitch video&lt;/h2&gt;

&lt;p&gt;Organizatorzy wpadli na pomysł, aby zawodnicy nagrywali krótkie wideo o swojej grze. Na tzw. pitch video warto wytłumaczyć jakieś skomplikowane aspekty gry - jeśli takie są.&lt;/p&gt;

&lt;div class=&quot;youtube-lazy&quot; data-youtube-id=&quot;K8meeVn2VH8&quot;&gt;&lt;/div&gt;

&lt;p&gt;Ze względu na to, że gra nie została skończona, tj. nie zrealizowaliśmy w niej wymaganych feature-ów, to nie musiałem opisywać o co chodzi w tej grze.&lt;/p&gt;

&lt;h2 id=&quot;wskazówki&quot;&gt;Wskazówki&lt;/h2&gt;

&lt;p&gt;Podczas hackathonu robiłem notatki, aby móc Ci je teraz przedstawić. Notatki te są swego rodzaju wskazówkami dla wszystkich tych, którzy zamierzają wziąć udział w imprezach takiego typu.&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Przygotować kilka pomysłów na projekt na kilka dni przed zawodami&lt;/li&gt;
  &lt;li&gt;Wybrać jeden projekt dzień lub dwa przed zawodami. W ostateczności można go wybrać w ciągu pierwszych minut trwania hackathonu. Jednak wtedy poświęcamy czas zawodów na wymyślanie architektury, co jest dość czasochłonne.&lt;/li&gt;
  &lt;li&gt;Rozpisać jego architekturę projektu tak, aby hackathon polegał już na samej implementacji.&lt;/li&gt;
  &lt;li&gt;Podczas realizacji projektu warto jest zadbać o takie rzeczy jak:
    &lt;ul&gt;
      &lt;li&gt;Dodać favicon&lt;/li&gt;
      &lt;li&gt;Pokazać użytkownikowi wersję z &lt;code class=&quot;highlighter-rouge&quot;&gt;package.json&lt;/code&gt;&lt;/li&gt;
      &lt;li&gt;Dodać dźwięki do gry&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Wskazówki dotyczące realizacji gry:
    &lt;ul&gt;
      &lt;li&gt;
        &lt;p&gt;Domyślne pozycje playera, aby pozbyć się problemu z błędem pozycji u innych klientów&lt;/p&gt;
      &lt;/li&gt;
      &lt;li&gt;
        &lt;p&gt;Ustawienie velocity na 1, aby były kolizje (o tym problemie opiszę poniżej) gdy używa się &lt;a href=&quot;http://phaser.io/&quot;&gt;Phaser.js&lt;/a&gt;&lt;/p&gt;
      &lt;/li&gt;
      &lt;li&gt;
        &lt;p&gt;Dodać &lt;code class=&quot;highlighter-rouge&quot;&gt;error handling&lt;/code&gt; gdy używa się &lt;em&gt;Socket.io&lt;/em&gt;&lt;/p&gt;
      &lt;/li&gt;
      &lt;li&gt;
        &lt;p&gt;Ładnie zrobione intro pomaga w odbiorze&lt;/p&gt;
      &lt;/li&gt;
      &lt;li&gt;
        &lt;p&gt;Jak się dowiedzieć, z czym chcielibyśmy ustawić kolizję na mapie?&lt;/p&gt;

        &lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;  &lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;getCollisionTilesets&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;c1&quot;&gt;// Uzupełnić nazwy plików ze sprite-ami&lt;/span&gt;
      &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;..&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;nazwy&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;..&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;].&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;forEach&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;tileset&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
          &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;tilesets&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;tileset&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;].&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;frameid&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;p&quot;&gt;});&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

  &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;setCollision&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;getCollisionTilesets&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;());&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;        &lt;/div&gt;
      &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Zrobić zaślepkowy obrazek, dla robotów robiących screenshot-y&lt;/li&gt;
  &lt;li&gt;Opisać swoją pracę dopiero po skończonym kodowaniu
    &lt;ul&gt;
      &lt;li&gt;Jeśli gra jest multiplayer to warto to napisać!&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Warto nagrać pitch video oraz oceniać innych zawodników, wtedy oni będą też oceniać naszą aplikację&lt;/li&gt;
  &lt;li&gt;Jaką wersję Node.js wspiera hosting na którym będzie uruchomiona aplikacja. Mieliśmy błąd uruchomienia aplikacji, z powodu syntax errora, który był wygenerowany przez tworzenie &lt;code class=&quot;highlighter-rouge&quot;&gt;class&lt;/code&gt;. Niestety, ale starsze wersje Node.js nie wspierają ich nawet gdy uruchomisz skrypt z opcją &lt;code class=&quot;highlighter-rouge&quot;&gt;--harmony&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Najważniejszą radą jaką mogę Ci dać, to gdy tworzysz grę na w takich zawodach, to postaraj się aby była ona &lt;strong&gt;grywalna&lt;/strong&gt;. Nie ważne, że będzie prosta, ważne jest to, aby była gotowa do używania.&lt;/p&gt;

&lt;p&gt;Niestety, ale nam się nie udało zrealizować ten najważniejszej zasady, dlatego też nie mamy szans na jakikolwiek zwycięstwo. No może poza design-em, bo tutaj Kasia przerosła samą siebie!&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/nko-2016/screen-2.png&quot; alt=&quot;&quot; /&gt;

    &lt;figcaption&gt;
        Screen z gry.
    &lt;/figcaption&gt;

&lt;/figure&gt;

&lt;h2 id=&quot;problemy&quot;&gt;Problemy&lt;/h2&gt;

&lt;p&gt;Na zakończenie, chciałem podzielić się z Wami największymi problemami jaki mieliśmy podczas hackathonu. Były to dwa.&lt;/p&gt;

&lt;h3 id=&quot;problem-z-brakiem-kolizji&quot;&gt;Problem z brakiem kolizji&lt;/h3&gt;

&lt;p&gt;2 godziny męczyłem się ze znalezieniem przyczyny dlaczego nie ma kolizji pomiędzy naszym samochodem a mapą. Przypomniałem sobie, że aby kolizja w świecie &lt;code class=&quot;highlighter-rouge&quot;&gt;Phaser.js&lt;/code&gt; wystąpiła, to &lt;code class=&quot;highlighter-rouge&quot;&gt;velocity&lt;/code&gt; obiektu, którym sterujemy nie może być równa 0.&lt;/p&gt;

&lt;p&gt;Po tym jak sobie przypomniałem, od razu stworzyłem nowy projekt, gdzie zachodzi kolizja między obiektem którym sterujemy a mapą. Niestety, ale w przykładach na &lt;a href=&quot;http://phaser.io/examples/&quot;&gt;phaser.io/examples/&lt;/a&gt; nie znalazłem takiego przykładu.&lt;/p&gt;

&lt;p&gt;Projekt dostępny jest na moim GitHubie: &lt;a href=&quot;https://github.com/piecioshka/test-phaser-collision&quot;&gt;github.com/piecioshka/test-phaser-collision&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;problem-z-uruchomieniem-aplikacji&quot;&gt;Problem z uruchomieniem aplikacji&lt;/h3&gt;

&lt;p&gt;Największym problemem było to, że każda próba deployu kończyła się niepowodzeniem, choć w środowisku lokalnym aplikacja działała poprawnie. Błąd był następujący:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;events.js:160
throw er&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; // Unhandled &lt;span class=&quot;s1&quot;&gt;'error'&lt;/span&gt; event
^

Error: listen EADDRINUSE :::5000
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Nie miałem pojęcia dlaczego akurat na środowisku produkcyjnym dany problem istnieje. Obecnie problem nie istnieje, a został rozwiązany dodaniem zmiennej środowiskowej &lt;code class=&quot;highlighter-rouge&quot;&gt;PORT&lt;/code&gt; oraz zabiciem wszystkich procesów &lt;code class=&quot;highlighter-rouge&quot;&gt;nginx&lt;/code&gt; oraz &lt;code class=&quot;highlighter-rouge&quot;&gt;haproxy&lt;/code&gt; na docelowym serwerze. Z tego miejsca chciałem podziękować &lt;a href=&quot;http://kamilzaleski.com/&quot;&gt;Kamilowi&lt;/a&gt;, który pomógł mi w tej &lt;code class=&quot;highlighter-rouge&quot;&gt;sysadmin&lt;/code&gt;-owej kwestii.&lt;/p&gt;

&lt;h2 id=&quot;podsumowanie&quot;&gt;Podsumowanie&lt;/h2&gt;

&lt;p&gt;Chciałem podziękować organizatorom za organizację zawodów kolejny raz. Była to szósta edycja. Mogę się domyślać, jak wiele czasu trzeba było poświęcić na przygotowanie środowisk dla zawodników, oraz przygotowanie strony internetowej, która będzie informowała na bieżąco o stanie zawodów (bardzo motywujący był licznik czasu na stronie głównej).&lt;/p&gt;

&lt;p&gt;Jeśli nie brałeś udziału w takich zawodach, to polecam. Kod tworzony nie musi (a nawet nie może z powodu czasu) być najpiękniejszy - on po prostu musi działać. Moje pierwsze hackathony nauczyły mnie dużo. Poznawałem nowe biblioteki, które na swój sposób pomagały mi zrealizować zamierzony cel, czyli stworzyć grę!&lt;/p&gt;

&lt;p&gt;Tegoroczna edycja Node Knockout powiększyła liczbę hackathonów w których brałem udział do 5. Post na temat zeszłorocznej edycji (gdzie zająłem 2 miejsce w kategorii &lt;strong&gt;Solo Winner&lt;/strong&gt;) jest dostępny tutaj: &lt;a href=&quot;%7B%%20post_url%202015-11-09-hackathon-node-knockout-2015%20%%7D&quot;&gt;NKO 2015&lt;/a&gt;.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/nko-2016/screen-3.png&quot; alt=&quot;&quot; /&gt;
    &lt;figcaption&gt;
        Screen z gry.
    &lt;/figcaption&gt;
&lt;/figure&gt;
</description>
            <pubDate>Tue, 15 Nov 2016 00:00:00 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2016/11/15/hackathon-node-knockout-2016.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2016/11/15/hackathon-node-knockout-2016.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/nko-2015/nko-logo-526x275.jpg</image>
        </item>
        
        <item>
            <title>WarsawJS Meetup #26</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;To już 26-te nasze spotkanie! Mi jako organizatorowi jest bardzo miło “gościć” tyle osób, które bez przymusu, z chęcią przychodzą w drugą środę miesiąca do &lt;a href=&quot;http://panstwomiasto.pl/&quot;&gt;Państwomiasto&lt;/a&gt;, aby posłuchać ciekawostek, nowinek, dobrych praktyk w języku JavaScript.&lt;/p&gt;

&lt;!-- &lt;figure&gt;
    &lt;a href=&quot;https://www.meetup.com/WarsawJS/&quot;&gt;
        &lt;img src=&quot;/assets/images/posts/post-banner-warsawjs.jpg&quot;
             alt=&quot;WarsawJS&quot;/&gt;
    &lt;/a&gt;
&lt;/figure&gt; --&gt;

&lt;h2 id=&quot;invitation&quot;&gt;Invitation&lt;/h2&gt;

&lt;p&gt;Zaproszenie dość szczególne. Dostałem od mojego działu drona-zabawkę. Chciałem go wykorzystać aby dodać czegoś nowego do naszych zapowiedzi. Może i dron-zabawka, ale świat z 4-5 metrów wygląda inaczej.&lt;/p&gt;

&lt;p&gt;Ciężko mi było w te kilka minut lotu nagrać jakieś ciekawe ujęcie. Dodałem do zapowiedzi te, które wyszły najlepiej, czyli najstabilniej.&lt;/p&gt;

&lt;p&gt;Zapraszam w imieniu organizatorów WarsawJS.&lt;/p&gt;

&lt;div class=&quot;youtube-lazy&quot; data-youtube-id=&quot;HkEITLTFE6c&quot;&gt;&lt;/div&gt;

&lt;p class=&quot;chapter-break&quot;&gt;&amp;bull;&lt;/p&gt;

&lt;h2 id=&quot;talk-1-web-components-are-we-there-yet-pl-dominik-lubański&quot;&gt;Talk #1: Web Components. Are we there yet? [PL] &lt;small&gt;Dominik Lubański&lt;/small&gt;&lt;/h2&gt;

&lt;blockquote&gt;
  &lt;p&gt;Elementy w HTML mogę być: Semantyczny, funkcjonalny, czy też wizualny. &lt;small&gt;Dominik Lubański. 2016-10-12&lt;/small&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Elementy mogą być definiowanie &lt;em&gt;deklaratywne&lt;/em&gt;, czyli zapisanie w pliku HTML.&lt;/p&gt;

&lt;p&gt;Komunikacja z API elementów, które są bardziej skomplikowane i posiadają swoje metody może polegać na uruchomieniu imperatywnym (rozkazującym).&lt;/p&gt;

&lt;p&gt;4 specyfikacje w połączeniu definiują Web Component-y:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Shadow DOM&lt;/li&gt;
  &lt;li&gt;Custom Elements&lt;/li&gt;
  &lt;li&gt;Templates&lt;/li&gt;
  &lt;li&gt;HTML Imports&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
  &lt;p&gt;Shadow DOM uruchamiamy imperatywnie. Nie możemy deklaratywnie stwierdzić, że element gdzieś ma Shadow DOM. &lt;small&gt;Dominik Lubański. 2016-10-12&lt;/small&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Specyfikacja &lt;em&gt;Templates&lt;/em&gt; daje programistom definiowania kontenerów &lt;code class=&quot;highlighter-rouge&quot;&gt;&amp;lt;template&amp;gt;&lt;/code&gt;, które nie są wyświetlane, pomimo, że ona żywym drzewem w DOM.&lt;/p&gt;

&lt;p&gt;Dominik serdecznie zachęca do wykorzystania Web Components, aby zunifikować biblioteki, które tworzą UI.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Link do prelekcji: &lt;a href=&quot;https://www.youtube.com/watch?v=2YEE5W8HdKk&quot;&gt;youtube.com/watch?v=2YEE5W8HdKk&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p class=&quot;chapter-break&quot;&gt;&amp;bull;&lt;/p&gt;

&lt;h2 id=&quot;talk-2-kind-of-javascript-en-mariusz-nowak&quot;&gt;Talk #2: Kind of JavaScript [EN] &lt;small&gt;Mariusz Nowak&lt;/small&gt;&lt;/h2&gt;

&lt;p&gt;Dobra organizacja wartości w JSie zakłada podział na:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Immutable
    &lt;ul&gt;
      &lt;li&gt;Primitive non-value
        &lt;ul&gt;
          &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;undefined&lt;/code&gt;&lt;/li&gt;
          &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;null&lt;/code&gt;&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
      &lt;li&gt;Primitive value
        &lt;ul&gt;
          &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;number&lt;/code&gt;&lt;/li&gt;
          &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;boolean&lt;/code&gt;&lt;/li&gt;
          &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;string&lt;/code&gt;&lt;/li&gt;
          &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;symbol&lt;/code&gt;&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Mutable&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Różnica między &lt;code class=&quot;highlighter-rouge&quot;&gt;null&lt;/code&gt; a &lt;code class=&quot;highlighter-rouge&quot;&gt;undefined&lt;/code&gt; w JavaScript?&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;null&lt;/code&gt; - jest wartością, która mówi, że nie ma wartości&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;undefined&lt;/code&gt; - mówi, że nie ma wartości, nie ma klucza, nie ma niczego&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;dobra-praktyka&quot;&gt;Dobra praktyka&lt;/h3&gt;

&lt;p&gt;Usuwanie klucza z obiektu powinno odbywać się poprzez nadpisanie wartości &lt;code class=&quot;highlighter-rouge&quot;&gt;null&lt;/code&gt;-em, zamiast wykorzystywać operator &lt;code class=&quot;highlighter-rouge&quot;&gt;delete&lt;/code&gt;.&lt;/p&gt;

&lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nx&quot;&gt;obj&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;foo&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// Good practice ✔&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;delete&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;obj&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;foo&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// Bad practice ✖&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Mariusz wytłumaczył jak działa &lt;code class=&quot;highlighter-rouge&quot;&gt;Object Boxing&lt;/code&gt;, czyli dlaczego prymitywy mają właściwości. Kolejne dwa terminy, które po prelekcji będą dla nas jasne, to:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;Type Coercion&lt;/code&gt; - rzutowanie typów, to poważny temat. Przy pracy z językiem, stykamy się z koercją w wielu miejscach. Ważne jest zrozumienie tego mechanizmu i zapoznanie się np. &lt;em&gt;Falsy Values&lt;/em&gt;.&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;Duck Typing&lt;/code&gt; - czyli, porównywanie obiektu, na podstawie jego zawartości, np. czy posiada właściwości takie jak?&lt;/li&gt;
&lt;/ul&gt;

&lt;!-- --&gt;

&lt;ul&gt;
  &lt;li&gt;Link do prelekcji: &lt;a href=&quot;https://www.youtube.com/watch?v=fQIvfgrjGSE&quot;&gt;youtube.com/watch?v=fQIvfgrjGSE&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p class=&quot;chapter-break&quot;&gt;&amp;bull;&lt;/p&gt;

&lt;h2 id=&quot;talk-3-angular-2-quickstart-angular-2-automated-unit-testing-pl-robert-gurgul&quot;&gt;Talk #3: Angular 2 quickstart, Angular 2 automated unit testing [PL] &lt;small&gt;Robert Gurgul&lt;/small&gt;&lt;/h2&gt;

&lt;p&gt;Ze względu na to, że aplikacje tworzone w oparciu o framework Angular 2 tworzone są w TypeScript, to będzie istniała pewna różnica między środowiskami developerskimi projektów opartych na Angular 1 (starym) oraz Angular 2 (nowym). Elementem tym będzie &lt;em&gt;transpilator&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Robert podczas prelekcji pokazał narzędzie &lt;code class=&quot;highlighter-rouge&quot;&gt;angular-cli&lt;/code&gt; - narzędzie automatyzując oraz standaryzujące budowanie aplikacji Angularowych.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Ostatnio zastanawiałem się nad tym “dlaczego w ogóle lubię programować?”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;Lubię programować, bo lubię widzieć co zrobiłem. Gdy napiszę fajny kod, lubię sprawdzić czy on działa. &lt;small&gt;Robert Gurgul. 2016-10-12&lt;/small&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Robert poleca jazdę pociągiem, bo wtedy ze względu na brak internetu możemy pisać testy. Dobre testy to takie, które mock-ują całą komunikację z serwerem, więc faktycznie nie potrzebujemy internetu do dopisania do naszej aplikacji kilkunastu testów. W pełni się z tym zgadzam. Swoją drogą, żyjemy w XXI wieku i w pociągach dalekobieżnych dalej nie ma sieci Wi-Fi. Ciekawe czy nasze dzieci będą kiedykolwiek w takiej sytuacji.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Link do prelekcji: &lt;a href=&quot;https://www.youtube.com/watch?v=2lhmK60hQGY&quot;&gt;youtube.com/watch?v=2lhmK60hQGY&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p class=&quot;chapter-break&quot;&gt;&amp;bull;&lt;/p&gt;

&lt;h2 id=&quot;sponsorzy-spotkania&quot;&gt;Sponsorzy spotkania&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.facebook.com/10Clouds/&quot;&gt;10Clouds&lt;/a&gt; - żetony w barze&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.facebook.com/cyfrowypolsat/&quot;&gt;Cyfrowy Polsat&lt;/a&gt; - materiały na YouTube&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.facebook.com/whitestreampl&quot;&gt;Whitestream&lt;/a&gt; - transmisja na żywo - &lt;a href=&quot;http://warsawjs.com/live&quot;&gt;warsawjs.com/live&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.facebook.com/softwarely/&quot;&gt;Softwarely&lt;/a&gt; - dodatkowe wsparcie&lt;/li&gt;
&lt;/ul&gt;
</description>
            <pubDate>Sat, 05 Nov 2016 00:00:00 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2016/11/05/warsawjs-meetup-26.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2016/11/05/warsawjs-meetup-26.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/post-banner-warsawjs.jpg</image>
        </item>
        
        <item>
            <title>Konferencja: Codemotion Warsaw 2016</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Dziś miałem przyjemność bycia uczestnikiem na konferencji &lt;a href=&quot;http://warsaw2016.codemotionworld.com/conference/&quot;&gt;Codemotion Warsaw 2016&lt;/a&gt; jako partner tego eventu z ramienia WarsawJS. Nawiązaliśmy współpracę aby wymienić się w Social Mediach. Nieskomplikowany układ: &lt;em&gt;my reklamujemy Ciebie, a Ty nas&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Główną organizatorką była &lt;a href=&quot;https://www.meetup.com/Codemotion-Warsaw-Group/members/184133564/&quot;&gt;Agnieszka&lt;/a&gt;, która na co dzień pracuje w firmie &lt;a href=&quot;https://touk.pl/&quot;&gt;Touk&lt;/a&gt;. Agnieszka jest znana z tego, że dość często coś organizuje, nie tylko w stolicy naszego kraju, ale też w innych miastach.&lt;/p&gt;

&lt;p&gt;Bilety na konferencję wahały się od €40 do €100 - podaję zakres cenowy ze względu na to, że w zależności od kilku czynników bilet możesz kupić taniej albo drożej. Jednym z takich czynników jest czas. Im wcześniej kupisz bilet tym jest tańszy, oraz im więcej biletów kupisz naraz to masz zniżkę.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/conference-codemotion-warsaw-2016/codemotion-warsaw-2016.jpg&quot; itemprop=&quot;image&quot; alt=&quot;Baner promujący artykuł&quot; /&gt;
&lt;/figure&gt;

&lt;p&gt;Z każdej konferencji przywożę zbiór technologicznych notatek, które później wrzucam na GitHuba jako projekt. Tym razem nie było wyjątkowo, bo i z tej konferencji listę moich technicznych notatek, znajdziesz na moim profilu na GitHubie. Dokładny adres do albumu z notatkami wygląda tak: &lt;a href=&quot;https://github.com/piecioshka/notes-codemotion-warsaw-2016&quot;&gt;github.com/piecioshka/notes-codemotion-warsaw-2016&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Zapraszam do zapoznania się. Reszta część wpisu będzie bardziej społeczno-organizacyjna.&lt;/p&gt;

&lt;h2 id=&quot;miło-spędza-się-czas-w-dobrym-towarzystwie&quot;&gt;Miło spędza się czas w dobrym towarzystwie&lt;/h2&gt;

&lt;p&gt;Na konferencję pojechaliśmy we 3 z naszej firmy, oraz jeden kolega z zaprzyjaźnionej firmy. Lokalizacja była idealna. Centrum miasta. Może trochę miałem problemy, aby znaleźć kino, ze względu na to, że nigdy w nim nie byłem.&lt;/p&gt;

&lt;figure class=&quot;social-center-block&quot;&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;pl&quot; dir=&quot;ltr&quot;&gt;Siedzimy sobie na wykładach, słuchamy i się uczymy! &lt;a href=&quot;https://twitter.com/hashtag/codemoWarsaw2016?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#codemoWarsaw2016&lt;/a&gt; &lt;a href=&quot;https://t.co/CSWpmQYTtO&quot;&gt;pic.twitter.com/CSWpmQYTtO&lt;/a&gt;&lt;/p&gt;&amp;mdash; Piotr Kowalski (@piecioshka) &lt;a href=&quot;https://twitter.com/piecioshka/status/776358471990185984?ref_src=twsrc%5Etfw&quot;&gt;September 15, 2016&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async=&quot;&quot; src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;

&lt;/figure&gt;

&lt;p&gt;Całe kino Atlantic było wynajęte, aby konferencja mogła toczyć się własnym życiem. 4 duże sale kinowe w których non stop były prowadzone prelekcje. Nie jestem do końca zwolennikiem kilku jednoczesnych sesji wykładowych, bo co mam zrobić, gdy będą ciekawiły mnie co najmniej 2 tematy, które są obecnie poruszane?&lt;/p&gt;

&lt;figure class=&quot;social-center-block&quot;&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;Yestarday &lt;a href=&quot;https://twitter.com/hashtag/warsawjs25?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#warsawjs25&lt;/a&gt; today &lt;a href=&quot;https://twitter.com/hashtag/codemotionwarsaw?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#codemotionwarsaw&lt;/a&gt; ^^ &lt;a href=&quot;https://t.co/KysL4Ssk0V&quot;&gt;pic.twitter.com/KysL4Ssk0V&lt;/a&gt;&lt;/p&gt;&amp;mdash; Piotr Kowalski (@piecioshka) &lt;a href=&quot;https://twitter.com/piecioshka/status/776312857151561728?ref_src=twsrc%5Etfw&quot;&gt;September 15, 2016&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async=&quot;&quot; src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;

&lt;/figure&gt;

&lt;p&gt;Pierwszy talk był projekcie &lt;a href=&quot;http://conceptmap.cfapps.io/&quot;&gt;ConceptMap&lt;/a&gt;. Jego prelegentem była bardzo znana osobistość w świecie Javy - pan James Weaver - autor kilku książek o Javie.&lt;/p&gt;

&lt;p&gt;Najważniejszą rzeczą jaką wyniosłem z tej prelekcji była informację, że Wikipedia, na bazie której projekt map był omawiany, jest częścią organizacji WikiMedia.&lt;/p&gt;

&lt;p&gt;Kolejny talk jaki wybrałem, był o połączeniu się do urządzenia podłączonego przez protokół USB. Mocno hardware-owa prelekcja. Myślałem, że będzie inaczej. Nie interesują mnie jakoś mocno tematy hardware-owe.&lt;/p&gt;

&lt;figure class=&quot;social-center-block&quot;&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;At seconds talk at &lt;a href=&quot;https://twitter.com/hashtag/CodemoWarsaw2016?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#CodemoWarsaw2016&lt;/a&gt; I can hear about USB devices 🙃 &lt;a href=&quot;https://t.co/222RtsNW0l&quot;&gt;pic.twitter.com/222RtsNW0l&lt;/a&gt;&lt;/p&gt;&amp;mdash; Piotr Kowalski (@piecioshka) &lt;a href=&quot;https://twitter.com/piecioshka/status/776339673656549376?ref_src=twsrc%5Etfw&quot;&gt;September 15, 2016&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async=&quot;&quot; src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;

&lt;/figure&gt;

&lt;p&gt;Najlepszymi dla mnie prelekcjami były te poprowadzone przez &lt;a href=&quot;https://twitter.com/nirkaufman&quot;&gt;Nira Kaufmana&lt;/a&gt;. Nir pracuje w firmie 500tech. Co ciekawe podczas tej konferencji, Nir był podwójnym prelegentem. Pierwszy talk był o tym, jak Angular 2 współpracuje z Redux-em. Nawet nie źle te 2 moduły ze sobą współpracują. Nie sądziłem, że można zrobić taką hybrydę.&lt;/p&gt;

&lt;p&gt;Natomiast druga prelekcja była o dekoratorach w JavaScript (nowa składnia, która nie jest jeszcze zatwierdzona). Mogę się tylko domyślać, jak Nir musiał być zmęczony po 2 wygłoszonych prelekcja podczas jednego dnia konferencji. Ciekawi mnie jak długo się przygotowywał do tych 2 talków.&lt;/p&gt;

&lt;figure class=&quot;social-center-block&quot;&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;Great talk about JS decorators by &lt;a href=&quot;https://twitter.com/nirkaufman?ref_src=twsrc%5Etfw&quot;&gt;@nirkaufman&lt;/a&gt; at &lt;a href=&quot;https://twitter.com/hashtag/codemoWarsaw2016?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#codemoWarsaw2016&lt;/a&gt; &lt;a href=&quot;https://t.co/HjOZCfyIVW&quot;&gt;pic.twitter.com/HjOZCfyIVW&lt;/a&gt;&lt;/p&gt;&amp;mdash; Piotr Kowalski (@piecioshka) &lt;a href=&quot;https://twitter.com/piecioshka/status/776756223362424832?ref_src=twsrc%5Etfw&quot;&gt;September 16, 2016&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async=&quot;&quot; src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;

&lt;/figure&gt;

&lt;h3 id=&quot;najlepsza-prelekcja&quot;&gt;Najlepsza prelekcja&lt;/h3&gt;

&lt;p&gt;Najlepiej wygłoszoną prelekcją podczas konferencji Codemotion Warsaw pt. “Regex fundamentals” była wykonana przez &lt;a href=&quot;https://twitter.com/jrf_nl&quot;&gt;Juliette Reinders Folmer&lt;/a&gt;. To dzięki tej prelekcji zrozumiałem kilka ważnych aspektów z życia wyrażeń regularnych. Pani Juliette jest autorką &lt;a href=&quot;https://www.pluralsight.com/courses/regular-expressions-fundamentals&quot;&gt;kursu na temat fundamentów w RegExp&lt;/a&gt;. Link do slajdów: &lt;a href=&quot;https://speakerdeck.com/jrf/regex-fundamentals&quot;&gt;https://speakerdeck.com/jrf/regex-fundamentals&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Podczas naszych testów używaliśmy narzędzia &lt;a href=&quot;https://regexper.com/&quot;&gt;https://regexper.com/&lt;/a&gt;, które tłumaczy jak działa dane wyrażenie regularne.&lt;/p&gt;

&lt;p&gt;To dzięki Julii nauczyłem się co to jest &lt;code class=&quot;highlighter-rouge&quot;&gt;Non-Capturing Groups&lt;/code&gt;. To jest taki typ regexpa, który nie szuka pojedynczych grup, tylko cały blok o który nam chodzi. Może dla jasności zademonstruje to na przykładzie:&lt;/p&gt;

&lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;// Typo match-owanie&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;red&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;green&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;blue&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;exec&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'color=red,green'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;// =&amp;gt; [&quot;color=red&quot;, &quot;red&quot;]&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;// Match-owanie z użyciem NCG&lt;/span&gt;
&lt;span class=&quot;sr&quot;&gt;/color=&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;(?:&lt;/span&gt;&lt;span class=&quot;sr&quot;&gt;red|green|blue&lt;/span&gt;&lt;span class=&quot;se&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;sr&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;exec&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'color=red,green'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;// =&amp;gt; [&quot;color=red&quot;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;figure class=&quot;social-center-block&quot;&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;Best speaker at &lt;a href=&quot;https://twitter.com/hashtag/codemoWarsaw2016?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#codemoWarsaw2016&lt;/a&gt; Congratulations &lt;a href=&quot;https://twitter.com/jrf_nl?ref_src=twsrc%5Etfw&quot;&gt;@jrf_nl&lt;/a&gt;!! 🏅😍 &lt;a href=&quot;https://t.co/5jpM4MpN4f&quot;&gt;pic.twitter.com/5jpM4MpN4f&lt;/a&gt;&lt;/p&gt;&amp;mdash; Piotr Kowalski (@piecioshka) &lt;a href=&quot;https://twitter.com/piecioshka/status/776790481648902144?ref_src=twsrc%5Etfw&quot;&gt;September 16, 2016&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async=&quot;&quot; src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;

&lt;/figure&gt;

&lt;h2 id=&quot;podsumowanie&quot;&gt;Podsumowanie&lt;/h2&gt;

&lt;p&gt;Gorące podziękowania składam na ręce organizatorom, na których czele stała Agnieszka Cieśla! Zazdroszczę jej, że ma już tak duże doświadczenie w realizacji takich event-ów.&lt;/p&gt;

&lt;p&gt;Może kiedyś będzie konferencja naszej organizacji &lt;em&gt;WarsawJS&lt;/em&gt;. Czas pokaże.&lt;/p&gt;

&lt;figure class=&quot;social-center-block&quot;&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;pl&quot; dir=&quot;ltr&quot;&gt;Dzięki &lt;a href=&quot;https://twitter.com/hashtag/codemoWarsaw2016?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#codemoWarsaw2016&lt;/a&gt; za fajnie spędzony czas! Do zobaczenia w przyszłości! :)) &lt;a href=&quot;https://t.co/iUrbVE4JPT&quot;&gt;pic.twitter.com/iUrbVE4JPT&lt;/a&gt;&lt;/p&gt;&amp;mdash; Piotr Kowalski (@piecioshka) &lt;a href=&quot;https://twitter.com/piecioshka/status/776794468502601728?ref_src=twsrc%5Etfw&quot;&gt;September 16, 2016&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async=&quot;&quot; src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;

&lt;/figure&gt;
</description>
            <pubDate>Thu, 15 Sep 2016 00:00:00 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2016/09/15/konferencja-codemotion-warsaw-2016.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2016/09/15/konferencja-codemotion-warsaw-2016.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/conference-codemotion-warsaw-2016/codemotion-warsaw-2016.jpg</image>
        </item>
        
        <item>
            <title>WarsawJS Meetup #25 — 2 urodziny 🎂</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Jak ten czas szybko leci? To już 2 lata od kiedy rozpoczęliśmy spotykać się regularnie i rozmawiać o JavaScript w naszym pięknym mieście, Warszawie. Podczas &lt;mark&gt;WarsawJS Meetup #25&lt;/mark&gt; gościliśmy około 100 osób, także sala wypchana po brzegi.&lt;/p&gt;

&lt;!-- &lt;figure&gt;
    &lt;a href=&quot;https://www.meetup.com/WarsawJS/&quot;&gt;
        &lt;img src=&quot;/assets/images/posts/post-banner-warsawjs.jpg&quot;
             alt=&quot;WarsawJS&quot;/&gt;
    &lt;/a&gt;
&lt;/figure&gt; --&gt;

&lt;h2 id=&quot;jak-wyglądały-przygotowania&quot;&gt;Jak wyglądały przygotowania?&lt;/h2&gt;

&lt;h3 id=&quot;rozstanie-się-z-rebased-1-września&quot;&gt;Rozstanie się z Rebased &lt;small&gt;1 września&lt;/small&gt;&lt;/h3&gt;

&lt;p&gt;Jedną z pierwszych rzeczy które zrobiliśmy, to niestety rozstanie się z jednym z naszych sponsorów, firmą &lt;a href=&quot;https://rebased.pl/&quot;&gt;Rebased&lt;/a&gt;. Software house nie rekrutuje do swojego zespołu już developerów JavaScript, więc sponsorowanie imprezy, która ma na celu popularyzację tego języka wydaje się już nie mieć sensu.&lt;/p&gt;

&lt;h3 id=&quot;nagranie-zapowiedzi-1-września&quot;&gt;Nagranie zapowiedzi &lt;small&gt;1 września&lt;/small&gt;&lt;/h3&gt;

&lt;p&gt;Tego samego dnia pojechaliśmy całą ekipą na most Józefa Poniatowskiego, gdzie korzystając z dobroci zachodzącego słońca oraz pięknej panoramy miasta nagraliśmy zapowiedź na kolejne spotkanie.&lt;/p&gt;

&lt;p&gt;Jeszcze tego samego dnia udało mi się skończyć 1 etap przy montażu, mianowicie synchronizację audio i wideo ze wszystkich źródeł. Proces trwał około 3-4h.&lt;/p&gt;

&lt;p&gt;Kolejnego dnia w piątek (&lt;em&gt;02-09-2016&lt;/em&gt;), zacząłem wybierać sceny, które są miarę i mogą pójść do konkursu scen spośród których wybiorę te najlepsze, które zostaną na finalnej wersji zapowiedzi. Proces trwa zawsze długo. Tym razem ze względu na krótki czas nagrywania, który trwał około 4h.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;03-09-2016&lt;/em&gt;. Kolejny dzień montowania. To już trzeci. A wersja finalna zapowiedzi jeszcze daleko. Według scenariusza, chciałem aby ta zapowiedź była trochę inna.&lt;/p&gt;

&lt;p&gt;Chciałem dodać do tej zapowiedzi 3 specjalne bonusy:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;historię WarsawJS - czyli jak to wszystko się zaczęło + zeszłoroczne urodziny&lt;/li&gt;
  &lt;li&gt;przewodnik, o co chodzi z “żetonami” podczas WarsawJS, czyli jak z nich skorzystać&lt;/li&gt;
  &lt;li&gt;oraz chciałem wymienić wszystkich zeszłorocznych prelegentów&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Na dokończenie zapowiedzi w sobotę poświęciłem cały dzień (ok. 7h). Po tych godzinach miałem już dość komputera i pojechałem trochę się rozerwać na zakupach 😄&lt;/p&gt;

&lt;h3 id=&quot;publikacja-zapowiedzi-5-września-2016&quot;&gt;Publikacja zapowiedzi &lt;small&gt;5 września 2016&lt;/small&gt;&lt;/h3&gt;

&lt;p&gt;Niedzielę poświęciłem na delikatny odpoczynek. Zresztą publikowanie w niedzielę zapowiedzi nigdy nie wiązało się z dużym zainteresowaniem, więc publikację zaproszenia w formie wideo przesunąłem na poniedziałek.&lt;/p&gt;

&lt;p&gt;Ciekawi mnie jak będzie wam podobał się wynik &lt;mark&gt;mojej 14-godzinnej&lt;/mark&gt; pracy. Tego dnia stworzyłem też wydarzenia w social mediach.&lt;/p&gt;

&lt;h3 id=&quot;załatwienie-tortu&quot;&gt;Załatwienie tortu&lt;/h3&gt;

&lt;p&gt;Razem z Kasią poszukaliśmy cukierni, gdzie mogliśmy zamówić sobie spersonalizowany tort. Znaleźliśmy cukiernię &lt;a href=&quot;http://ale-tort.pl&quot;&gt;ale-tort.pl&lt;/a&gt; na Saskiej Kępie. Świetna lokalizacja i świetna strona skusiły nas do zakupu.&lt;/p&gt;

&lt;p&gt;Piękny tort odebraliśmy w dniu urodzin - na kilka godzin przed głównym wydarzeniem. Jesteście ciekawi jak się prezentował?&lt;/p&gt;

&lt;figure class=&quot;social-center-block&quot;&gt;
    &lt;iframe src=&quot;https://www.facebook.com/plugins/post.php?href=https%3A%2F%2Fwww.facebook.com%2Fwarsawjs%2Fphotos%2Fa.1611828025710201.1073741827.1578130679079936%2F1968454936714173%2F%3Ftype%3D3&amp;amp;width=500&quot; width=&quot;500&quot; height=&quot;448&quot; style=&quot;border:none;overflow:hidden&quot; scrolling=&quot;no&quot; frameborder=&quot;0&quot; allowtransparency=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;invitation&quot;&gt;Invitation&lt;/h2&gt;

&lt;p&gt;Zapraszam w imieniu organizatorów WarsawJS.&lt;/p&gt;

&lt;div class=&quot;youtube-lazy&quot; data-youtube-id=&quot;bYRttV7d0iI&quot;&gt;&lt;/div&gt;

&lt;p class=&quot;chapter-break&quot;&gt;&amp;bull;&lt;/p&gt;

&lt;h2 id=&quot;talk-1-new-collections-in-js-from-ecmascript-2015-map-set-weakmap-weakset-pl-piotr-kowalski&quot;&gt;Talk #1: New collections in JS (from ECMAScript 2015): Map, Set, WeakMap, WeakSet [PL] &lt;small&gt;Piotr Kowalski&lt;/small&gt;&lt;/h2&gt;

&lt;p&gt;Przygotowania do prelekcji zacząłem ok. 2 tygodnie przed terminem. Stworzenie samych slajdów to dość żmudny proces, który zawsze owocuje idealnymi slajdami, na które już nie chce się patrzeć.&lt;/p&gt;

&lt;p&gt;Temat na prelekcję narodził się, kiedy mój kolega miał problem ze swoją implementacją. Zerknąłem na kod i od razu zacząłem robić slajdy, aby pokazać jak można dany problem rozwiązać lepiej korzystając z dobrodziejstw &lt;strong&gt;ECMAScript 2015&lt;/strong&gt;, a dokładnie kolekcji &lt;code class=&quot;highlighter-rouge&quot;&gt;Map&lt;/code&gt;, &lt;code class=&quot;highlighter-rouge&quot;&gt;Set&lt;/code&gt;, &lt;code class=&quot;highlighter-rouge&quot;&gt;WeakMap&lt;/code&gt; i &lt;code class=&quot;highlighter-rouge&quot;&gt;WeakSet&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Stworzyłem około 70 slajdów głównych oraz około 10 slajdów moimi osobistymi wskazówkami. Te dodatkowe slajdy dodałem z myślą o krótkim lightning talku, który chciałem wygłosić.&lt;/p&gt;

&lt;p&gt;W poniedziałek i wtorek przed środowym meetupem przeprowadzałem testy przed kamerą.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Link do prelekcji: &lt;a href=&quot;https://www.youtube.com/watch?v=NtErU3Jbt78&quot;&gt;youtube.com/watch?v=NtErU3Jbt78&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p class=&quot;chapter-break&quot;&gt;&amp;bull;&lt;/p&gt;

&lt;h2 id=&quot;talk-2-writing-your-first-amazon-lambda-using-js-en-piotr-zientara&quot;&gt;Talk #2: Writing your first Amazon lambda using JS [EN] &lt;small&gt;Piotr Zientara&lt;/small&gt;&lt;/h2&gt;

&lt;p&gt;Piotr od początku sygnalizował mi, że chce zrobić &lt;mark&gt;live coding&lt;/mark&gt;.&lt;/p&gt;

&lt;p&gt;My, organizatorzy wiemy jedno: &lt;em&gt;live coding ZAWSZE stwarza problemy&lt;/em&gt;. Zawsze jest jakiś nieprzewidziany problem, który niweczy poczynania speakera. Całe szczęście ten live coding przeszedł bez problemu. Za co chwała Piotrowi!&lt;/p&gt;

&lt;p&gt;Mój imiennik opowiadał jak stworzyć pierwszą lambdę na Amazon S3 korzystając z naszego pięknego języka - &lt;code class=&quot;highlighter-rouge&quot;&gt;JavaScript&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Prelekcja odbywała się po angielsku. Jestem zawsze pod wrażeniem osób, które są wstanie wyjść na scenę i powiedzieć coś w obcym języku. Mogę sobie tylko wyobrazić jak duży stres towarzyszy takiemu prelegentowi.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Link do prelekcji: &lt;a href=&quot;https://www.youtube.com/watch?v=GKIVnnUNcEw&quot;&gt;youtube.com/watch?v=GKIVnnUNcEw&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;lightning-talks&quot;&gt;Lightning talks&lt;/h2&gt;

&lt;p&gt;Po prelekcji Piotra Zientary, wyszedłem jeszcze na lightning talka. Skorzystałem z moich przygotowanych slajdów, jednak kolejny raz nie zmieściłem się w czasie. Ta w teorii krótka prelekcja trwała ponad 3 razy dłużej niż zakładałem, czyli około 15 minut (sic!).&lt;/p&gt;

&lt;p&gt;Przepraszam wszystkich, których tak długo trzymałem na zakończenie eventu!&lt;/p&gt;

&lt;p class=&quot;chapter-break&quot;&gt;&amp;bull;&lt;/p&gt;

&lt;h2 id=&quot;sponsorzy-spotkania&quot;&gt;Sponsorzy spotkania&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.facebook.com/10Clouds/&quot;&gt;10Clouds&lt;/a&gt; - żetony w barze&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.facebook.com/cyfrowypolsat/&quot;&gt;Cyfrowy Polsat&lt;/a&gt; - materiały na YouTube&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.facebook.com/whitestreampl&quot;&gt;Whitestream&lt;/a&gt; - transmisja na żywo - &lt;a href=&quot;http://warsawjs.com/live&quot;&gt;warsawjs.com/live&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.facebook.com/softwarely/&quot;&gt;Softwarely&lt;/a&gt; - dodatkowe wsparcie&lt;/li&gt;
&lt;/ul&gt;
</description>
            <pubDate>Wed, 14 Sep 2016 00:00:00 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2016/09/14/warsawjs-meetup-25.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2016/09/14/warsawjs-meetup-25.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/post-banner-warsawjs.jpg</image>
        </item>
        
        <item>
            <title>Konferencja: Frontend Union Conf 2016</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Dzisiejsza historia zaczyna się w litewskiej stolicy Wilnie, gdzie razem z Kasią polecieliśmy na konferencję &lt;a href=&quot;http://frontend-union.co/&quot;&gt;Frontend Union Conf&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Konferencja odbyła się dnia 2016-08-27 o godzinie: 10:00 w &lt;abbr title=&quot;nie jestem do końca przekonany&quot;&gt;budynku starego teatru?&lt;/abbr&gt; pod adresem ŠILTADARŽIO G. 6, w Wilnie.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Niestety nie robiłem notatek, więc post nie będzie mocno techniczny.&lt;/strong&gt;&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/conference-frontend-union-2016/panorama-of-vilnus.jpg&quot; alt=&quot;&quot; /&gt;

    &lt;figcaption&gt;
        Panorama miasta
    &lt;/figcaption&gt;

&lt;/figure&gt;

&lt;p&gt;Jako organizatorzy WarsawJS zostaliśmy zaproszeni na konferencję przez jednego ze współorganizatorów, &lt;a href=&quot;https://www.facebook.com/filipovskii.off&quot;&gt;Andreya&lt;/a&gt;. Dodam jeszcze, że Andrey jest organizatorem &lt;a href=&quot;https://www.meetup.com/MoscowJS-Meetup/&quot;&gt;MoscowJS Meetup&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;wilno---piękne-polskie-miasto&quot;&gt;Wilno - piękne polskie miasto&lt;/h2&gt;

&lt;figure class=&quot;social-center-block&quot;&gt;
    &lt;iframe src=&quot;https://www.facebook.com/plugins/post.php?href=https%3A%2F%2Fwww.facebook.com%2Ffrontendunion%2Fphotos%2Fa.1833931860175039.1073741831.1680776825490544%2F1833932036841688%2F%3Ftype%3D3&amp;amp;width=500&quot; width=&quot;500&quot; height=&quot;338&quot; style=&quot;border:none;overflow:hidden&quot; scrolling=&quot;no&quot; frameborder=&quot;0&quot; allowtransparency=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;/figure&gt;

&lt;p&gt;Była to nasza pierwsza wizyta, w tymże “polskim” mieście. Pierwszy dzień poświęciliśmy na zwiedzanie i okazało się, że w przy kościołach - których jest pełno w tym mieście - są zawsze ogłoszenia w 3 językach:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;litewskim&lt;/li&gt;
  &lt;li&gt;rosyjskim&lt;/li&gt;
  &lt;li&gt;i polskim&lt;/li&gt;
&lt;/ul&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/conference-frontend-union-2016/old-church.jpg&quot; alt=&quot;&quot; /&gt;

    &lt;figcaption&gt;
        Najstarszy kościół jaki w życiu widziałem. Powstał w XIV wieku.
    &lt;/figcaption&gt;

&lt;/figure&gt;

&lt;p&gt;Podczas zwiedzania kościołów, przez przypadek byliśmy świadkiem nabożeństwa, które było odprawiane po polsku, gdzie wiara modliła się za naród polski. Było to dla nas z jednej strony szokujące, z drugiej naturalne.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/conference-frontend-union-2016/adam-mickiewicz-house.jpg&quot; alt=&quot;&quot; /&gt;

    &lt;figcaption&gt;
        Miejsce gdzie mieszkał Adam Mickiewicz.
    &lt;/figcaption&gt;

&lt;/figure&gt;

&lt;p&gt;Wracając do meritum.&lt;/p&gt;

&lt;h2 id=&quot;konferencja&quot;&gt;Konferencja&lt;/h2&gt;

&lt;p&gt;Konferencja nie była mocno popularna, tzn. sala na której siedzieliśmy mogła spokojnie pomieścić, jeszcze raz tą samą liczbę obecnych osób. Nie ma to większego znaczenia dla uczestników. Może bardziej dla organizatorów.&lt;/p&gt;

&lt;p&gt;Merytoryczna część talków była świetna. Na scenie pojawiły się takie gwiazdy jak:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Mathias Bynens - &lt;a href=&quot;https://twitter.com/mathias&quot;&gt;@mathias&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Martin Splitt - &lt;a href=&quot;https://twitter.com/g33konaut&quot;&gt;@g33konaut&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Martin Kleppe - &lt;a href=&quot;https://twitter.com/aemkei&quot;&gt;@aemkei&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Gerard Sans - &lt;a href=&quot;https://twitter.com/gerardsans&quot;&gt;@gerardsans&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ostatnia prelekcja nie poruszała tematyki technicznej, a bardziej społeczną. Otóż prelegent - Oleg Podsechin &lt;a href=&quot;https://twitter.com/olegpodsechin&quot;&gt;@olegpodsechin&lt;/a&gt; - wyszedł na scenę jako organizator meetupu &lt;a href=&quot;https://www.facebook.com/groups/helsinkijs/&quot;&gt;HelsinkiJS&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Oleg bardzo mnie zaciekawił swoim wystąpieniem, ze względu na to, że opowiadał o swoich doświadczeniach z organizowaniem meetup-ów. Mega interesujące jest zebrać dostać feeback o tym, jak rosną inne społeczności JS-owe.&lt;/p&gt;

&lt;p&gt;Bardzo ciekawie i mądrze opowiadał o tym, jak należy organizować meetupy, aby wiara przychodziła i wszyscy byli zadowoleni. Oleg przedstawił ciekawą listę:&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/conference-frontend-union-2016/checklist-to-start-meetup.jpg&quot; alt=&quot;&quot; /&gt;

    &lt;figcaption&gt;
        Lista rzeczy, które należy zrobić, aby zorganizować meetup.
    &lt;/figcaption&gt;

&lt;/figure&gt;

&lt;p&gt;W sumie to zgadzam się, ze wszystkim co opowiadał. Ta lista to takie minimum.&lt;/p&gt;

&lt;h2 id=&quot;after-party&quot;&gt;After party&lt;/h2&gt;

&lt;p&gt;Po konferencji przyszedł czas na After party, które odbyło się na patio budynku przy którym była sala konferencyjna. Poniżej możecie zobaczyć drinki, które były dostępne w barze. Najmocniejszy to &lt;mark&gt;debugger&lt;/mark&gt;. Hmm. Polecam.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/conference-frontend-union-2016/drinks-list.jpg&quot; alt=&quot;&quot; /&gt;

    &lt;figcaption&gt;
        Lista drinków.
    &lt;/figcaption&gt;

&lt;/figure&gt;

&lt;p&gt;Na konferencji poznaliśmy Martynę z &lt;a href=&quot;https://touk.pl/&quot;&gt;Touk&lt;/a&gt;, która na poprzednim WarsawJS wygrała bluzę ufundowaną przez jednego ze sponsorów naszej organizacji, czyli firmę &lt;a href=&quot;http://www.softwarely.pl/&quot;&gt;Softwarely&lt;/a&gt;.&lt;/p&gt;

&lt;figure class=&quot;social-center-block&quot;&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;Greetings from &lt;a href=&quot;https://twitter.com/hashtag/forest?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#forest&lt;/a&gt; restaurant in &lt;a href=&quot;https://twitter.com/hashtag/Vilnius?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#Vilnius&lt;/a&gt; during the break of &lt;a href=&quot;https://twitter.com/hashtag/func2016?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#func2016&lt;/a&gt; &lt;a href=&quot;https://t.co/KBVxooYOEH&quot;&gt;pic.twitter.com/KBVxooYOEH&lt;/a&gt;&lt;/p&gt;&amp;mdash; Piotr Kowalski (@piecioshka) &lt;a href=&quot;https://twitter.com/piecioshka/status/769532327227785216?ref_src=twsrc%5Etfw&quot;&gt;August 27, 2016&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async=&quot;&quot; src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;

&lt;/figure&gt;

&lt;h2 id=&quot;podsumowanie&quot;&gt;Podsumowanie&lt;/h2&gt;

&lt;p&gt;Bardzo dziękujemy organizatorom za poświęcony czas i włożone siły w organizację konferencji. Nauczyłem się wielu rzeczy - po to w sumie ludzie uczęszczają na konferencje i meetupy: aby poznawać nowych ludzi, oraz aby poznawać nowe technologie.&lt;/p&gt;

&lt;figure class=&quot;social-center-block&quot;&gt;
    &lt;iframe src=&quot;https://www.facebook.com/plugins/post.php?href=https%3A%2F%2Fwww.facebook.com%2Ffrontendunion%2Fphotos%2Fa.1833931860175039.1073741831.1680776825490544%2F1833933886841503%2F%3Ftype%3D3&amp;amp;width=500&quot; width=&quot;500&quot; height=&quot;423&quot; style=&quot;border:none;overflow:hidden&quot; scrolling=&quot;no&quot; frameborder=&quot;0&quot; allowtransparency=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;/figure&gt;
</description>
            <pubDate>Sun, 28 Aug 2016 00:00:00 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2016/08/28/konferencja-frontend-union-conf-2016.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2016/08/28/konferencja-frontend-union-conf-2016.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/conference-frontend-union-2016/frontend-union-2016.jpg</image>
        </item>
        
        <item>
            <title>WarsawJS Meetup #24</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;No i mamy kolejne spotkanie “fanatyków” JavaScript-owych! Oczywiście, w pozytywnym tego słowa znaczeniu. Tym razem spotkaliśmy się 10 sierpnia w &lt;a href=&quot;http://panstwomiasto.pl/&quot;&gt;Państwomiasto&lt;/a&gt; i wysłuchaliśmy trzech prelekcji o JS-ie.&lt;/p&gt;

&lt;!-- &lt;figure&gt;
    &lt;a href=&quot;https://www.meetup.com/WarsawJS/&quot;&gt;
        &lt;img src=&quot;/assets/images/posts/post-banner-warsawjs.jpg&quot;
             alt=&quot;WarsawJS&quot;/&gt;
    &lt;/a&gt;
&lt;/figure&gt; --&gt;

&lt;h2 id=&quot;invitation&quot;&gt;Invitation&lt;/h2&gt;

&lt;p&gt;Ze względu na piękne słońce oraz niesamowite widoki tym razem wybraliśmy się na dach &lt;a href=&quot;http://www.buw.uw.edu.pl/&quot;&gt;Biblioteki Uniwersyteckiej&lt;/a&gt; w Warszawie. Z dachu widać mnóstwo pięknych krajobrazów - świetne miejsce do nagrywania wideo, ale również do zwiedzania. Z tego też powodu, nie było łatwo nagrywać. Ciężko się skupić, gdy koło Ciebie kręci się mnóstwo ludzi.&lt;/p&gt;

&lt;p&gt;Zapraszam w imieniu organizatorów WarsawJS.&lt;/p&gt;

&lt;div class=&quot;youtube-lazy&quot; data-youtube-id=&quot;wlG4akSDQ8g&quot;&gt;&lt;/div&gt;

&lt;p class=&quot;chapter-break&quot;&gt;&amp;bull;&lt;/p&gt;

&lt;h2 id=&quot;talk-1-9-demonów-programisty-js-pl-cezary-walenciuk&quot;&gt;Talk #1: 9 demonów programisty JS [PL] &lt;small&gt;Cezary Walenciuk&lt;/small&gt;&lt;/h2&gt;

&lt;p&gt;Pierwsza prelekcja nie poruszała konkretnego kodu, ani biblioteki. Była ona z rodzaju tych miękkich. Uważam, że takie prelekcji pobudzają równie mocno do myślenia co stricte techniczne prelekcje.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Link do prelekcji: &lt;a href=&quot;https://www.youtube.com/watch?v=jG7PImd2Ja4&quot;&gt;youtube.com/watch?v=jG7PImd2Ja4&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p class=&quot;chapter-break&quot;&gt;&amp;bull;&lt;/p&gt;

&lt;h2 id=&quot;talk-2-react-w-świecie-nawiasów-clojurescript-reagent-en-daniel-janus&quot;&gt;Talk #2: React w świecie nawiasów: ClojureScript, reagent [EN] &lt;small&gt;Daniel Janus&lt;/small&gt;&lt;/h2&gt;

&lt;p&gt;Daniel, doświadczony programista obecnie wykonujący swój zawód w firmie &lt;a href=&quot;https://rebased.pl/&quot;&gt;Rebased&lt;/a&gt;, opowiedział o Reagencie, czyli wykorzystaniu biblioteki React.js w języku ClojureScript. Niestety, ale Reagent nie rozwiązuje wszystkich problemów, ze względu na to, że jest on tylko prezentacyjną warstwą.&lt;/p&gt;

&lt;p&gt;Kolejne narzędzie omawiane podczas prelekcji to &lt;a href=&quot;https://github.com/Day8/re-frame&quot;&gt;re-frame&lt;/a&gt;. Które to rozwiązuje problem braku innych warstw. Dzięki &lt;code class=&quot;highlighter-rouge&quot;&gt;re-frame&lt;/code&gt; mamy &lt;mark&gt;unidirectional data flow&lt;/mark&gt;.&lt;/p&gt;

&lt;p&gt;Ciekawostka: W ClojureScript nigdy nie napiszemy funkcji w stylu &lt;code class=&quot;highlighter-rouge&quot;&gt;shouldComponentUpdate&lt;/code&gt;, ponieważ wszystko w tym języku jest &lt;em&gt;pure&lt;/em&gt;.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;re-frame makes the code maintainable. &lt;small&gt;Daniel Janus. 2016-08-10&lt;/small&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
  &lt;li&gt;Link do prelekcji: &lt;a href=&quot;https://www.youtube.com/watch?v=QqaShg7pIig&quot;&gt;youtube.com/watch?v=QqaShg7pIig&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p class=&quot;chapter-break&quot;&gt;&amp;bull;&lt;/p&gt;

&lt;h2 id=&quot;talk-3-nativescript-gentle-introduction-pl-paweł-kondraciuk&quot;&gt;Talk #3: NativeScript: Gentle Introduction [PL] &lt;small&gt;Paweł Kondraciuk&lt;/small&gt;&lt;/h2&gt;

&lt;p&gt;Paweł - developer z Białegostoku. Człowiek, który wypalił się zawodowo w Pythonie przeszedł do Front-end-u.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Nie ma HTML-a, nie ma DOMu. &lt;small&gt;Paweł Kondraciuk. 2016-08-10&lt;/small&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Prelegent zrobić demo, korzystając z emulatora. Gdzie pokazał “mięso”, czyli przykładowy projekt. Dowiedzieliśmy się, że JavaScript jest uruchomiony w UI Thread, dzięki temu JS ma dostęp do obiektów Java-owych. Stąd też kod zaprezentowany na poniższym listing uruchomi się bez błędu.&lt;/p&gt;

&lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;// Android&lt;/span&gt;
&lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;time&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;android&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;text&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;format&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;Time&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
&lt;span class=&quot;nx&quot;&gt;time&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;kd&quot;&gt;set&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2015&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;nx&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;time&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;format&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'%D'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;));&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;// iOS&lt;/span&gt;
&lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;alert&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;UIAlertView&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
&lt;span class=&quot;nx&quot;&gt;alert&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;message&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'Hello world!'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;nx&quot;&gt;alert&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;addButtonWithTitle&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'OK'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;nx&quot;&gt;alert&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;show&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;// https://pawelkondraciuk.github.io/warsawjs-nativescript/&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Dzięki Pawłowi dowiedzieliśmy się, że największą zaletą korzystania z NativeScript jest bardzo dużo wspólnego kodu - jeden wspólny &lt;strong&gt;codebase&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Link do prelekcji: &lt;a href=&quot;https://www.youtube.com/watch?v=Y4FpNQuefAg&quot;&gt;youtube.com/watch?v=Y4FpNQuefAg&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p class=&quot;chapter-break&quot;&gt;&amp;bull;&lt;/p&gt;

&lt;h2 id=&quot;sponsorzy-spotkania&quot;&gt;Sponsorzy spotkania&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.facebook.com/Rebased/&quot;&gt;Rebased&lt;/a&gt;, &lt;a href=&quot;https://www.facebook.com/10Clouds/&quot;&gt;10Clouds&lt;/a&gt; - żetony w barze&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.facebook.com/cyfrowypolsat/&quot;&gt;Cyfrowy Polsat&lt;/a&gt; - materiały na YouTube&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.facebook.com/whitestreampl&quot;&gt;Whitestream&lt;/a&gt; - transmisja na żywo - &lt;a href=&quot;http://warsawjs.com/live&quot;&gt;warsawjs.com/live&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.facebook.com/softwarely/&quot;&gt;Softwarely&lt;/a&gt; - dodatkowe wsparcie&lt;/li&gt;
&lt;/ul&gt;
</description>
            <pubDate>Tue, 23 Aug 2016 00:00:00 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2016/08/23/warsawjs-meetup-24.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2016/08/23/warsawjs-meetup-24.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/post-banner-warsawjs.jpg</image>
        </item>
        
        <item>
            <title>WarsawJS Meetup #23</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Po raz 23-ci zebraliśmy się aby posłuchać co piszczy w JS-ie. Standardowo mieliśmy 3 prelekcje. Tym razem zrobiliśmy (my, organizatorzy) jednak coś czego jeszcze nie było wcześniej…&lt;/p&gt;

&lt;!-- &lt;figure&gt;
    &lt;a href=&quot;https://www.meetup.com/WarsawJS/&quot;&gt;
        &lt;img src=&quot;/assets/images/posts/post-banner-warsawjs.jpg&quot;
             alt=&quot;WarsawJS&quot;/&gt;
    &lt;/a&gt;
&lt;/figure&gt; --&gt;

&lt;h2 id=&quot;invitation&quot;&gt;Invitation&lt;/h2&gt;

&lt;p&gt;Postanowiliśmy, że nagramy sprzed Pałacu Kultury, gdzie umówiliśmy się z Mistrzem Polski w Trialu rowerowym - Michałem Nowakiem. Zapraszam w imieniu Michała do odwiedzenia jego fanpage: &lt;a href=&quot;https://www.facebook.com/michalnowaktrial/&quot;&gt;facebook.com/michalnowaktrial/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Wpadliśmy na pomysł, że nagramy &lt;mark&gt;2 zapowiedzi&lt;/mark&gt;. Jedną standardowo po polsku, drugą natomiast w języku angielskim. Takie nagranie będzie celowało w zaproszenie na meetup osób anglojęzycznych. Z naszej dwójki to &lt;a href=&quot;https://twitter.com/Piotr_Zientara&quot;&gt;Piotr&lt;/a&gt; lepiej włada angielskim, więc zapowiedź w tym języku jest w całości opowiedziana przez niego.&lt;/p&gt;

&lt;p&gt;Zapraszam w imieniu organizatorów WarsawJS. &lt;strong&gt;Szczególnie warto obejrzeć do końca!&lt;/strong&gt; 💥&lt;/p&gt;

&lt;div class=&quot;youtube-lazy&quot; data-youtube-id=&quot;D1vql7kvp90&quot;&gt;&lt;/div&gt;

&lt;p&gt;I teraz “to samo” ale po angielsku.&lt;/p&gt;

&lt;div class=&quot;youtube-lazy&quot; data-youtube-id=&quot;rKIgTmmBVlk&quot;&gt;&lt;/div&gt;

&lt;p class=&quot;chapter-break&quot;&gt;&amp;bull;&lt;/p&gt;

&lt;h2 id=&quot;talk-1-you-dont-need-react-to-use-virtual-dom-en-illarion-koperski&quot;&gt;Talk #1: You don’t need React to use virtual DOM [EN] &lt;small&gt;Illarion Koperski&lt;/small&gt;&lt;/h2&gt;

&lt;p&gt;Illarion przedstawił przykład użycia &lt;code class=&quot;highlighter-rouge&quot;&gt;virtual-dom&lt;/code&gt;-a bez użycia React-a. Virtual DOM to pomysł. Idea, która została zaciągnięta do wielu bibliotek. Najpopularniejszą z nich jest oczywiście React - pewnie dlatego, że autorami biblioteki są nasi koledzy z firmy Facebook.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Link do prelekcji: &lt;a href=&quot;https://www.youtube.com/watch?v=Amu3ur3fWW8&quot;&gt;youtube.com/watch?v=Amu3ur3fWW8&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p class=&quot;chapter-break&quot;&gt;&amp;bull;&lt;/p&gt;

&lt;h2 id=&quot;talk-2-building-bulletproof-and-maintainable-js-apps-en-michał-załęcki&quot;&gt;Talk #2: Building bulletproof and maintainable JS apps [EN] &lt;small&gt;Michał Załęcki&lt;/small&gt;&lt;/h2&gt;

&lt;p&gt;Michał opowiadał o nowych technologiach webowych, które pomagają nam, programistom, stworzyć kuloodporne aplikacje. Prelegent na co dzień pracuje we Wrocławiu i jest organizatorem &lt;a href=&quot;https://www.meetup.com/ReactJS-Wroclaw/&quot;&gt;React.js Wrocław&lt;/a&gt; oraz pracuje w &lt;a href=&quot;https://woumedia.com/&quot;&gt;woumedia&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Usłyszeliśmy o tym co to jest MVC i jak się ten wzorzec rozwinął, do takiego stopnia, że powstał Flux i Redux. Zdaniem Michała nie są to najlepsze technologie, wkrótce powstaną jeszcze lepsze. Co ciekawe, prelegent uważa, że i jest wiele innych języków, które są lepsze od JavaScript-u.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Link do prelekcji: &lt;a href=&quot;https://www.youtube.com/watch?v=TgCs3BmE5mU&quot;&gt;youtube.com/watch?v=TgCs3BmE5mU&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p class=&quot;chapter-break&quot;&gt;&amp;bull;&lt;/p&gt;

&lt;h2 id=&quot;talk-3-soa-and-rest---tying-the-knot-en-robert-kawecki--damian-cikowski&quot;&gt;Talk #3: SOA and REST - Tying the knot [EN] &lt;small&gt;Robert Kawecki + Damian Cikowski&lt;/small&gt;&lt;/h2&gt;

&lt;p&gt;Panowie we dwóch wyszli na scenę i zainscenizowali scenkę. Rozmawiali o doborze technologii do nowej aplikacji typu enterprise, czyli bardzo bogatej w funkcjonalności. Panowie doszli do wniosku, że skorzystają z:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;DDD&lt;/li&gt;
  &lt;li&gt;CQRS&lt;/li&gt;
  &lt;li&gt;Event sourcing - services returns event&lt;/li&gt;
  &lt;li&gt;&lt;del&gt;SOAP&lt;/del&gt; JSON-RPC over WebSocket&lt;/li&gt;
  &lt;li&gt;Client library: esdf-ws-client&lt;/li&gt;
  &lt;li&gt;Single service that emulates HTTP GET for performance&lt;/li&gt;
  &lt;li&gt;Universal language: RQL&lt;/li&gt;
&lt;/ul&gt;

&lt;figure&gt;
    &lt;img src=&quot;https://rkaw92.github.io/warsaw-soa-rest/pictures/whole-picture.svg&quot; alt=&quot;&quot; /&gt;
    &lt;figcaption&gt;
        Prosto ze slide–ów: &lt;a href=&quot;https://rkaw92.github.io/warsaw-soa-rest/&quot;&gt;https://rkaw92.github.io/warsaw-soa-rest/&lt;/a&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h3 id=&quot;gui&quot;&gt;GUI&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Task-based UI&lt;/li&gt;
  &lt;li&gt;React.js: actions - commands&lt;/li&gt;
  &lt;li&gt;Event handlers in Flux stores mapped 1:1 to Domain Events&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
  &lt;p&gt;Architektura GUI został dobrana do aplikacji, a nie odwrotnie. &lt;small&gt;Robert Kawecki&lt;/small&gt; 2016-07-13&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
  &lt;li&gt;Link do prelekcji: &lt;a href=&quot;https://www.youtube.com/watch?v=r5F7jcNvGLk&quot;&gt;youtube.com/watch?v=r5F7jcNvGLk&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p class=&quot;chapter-break&quot;&gt;&amp;bull;&lt;/p&gt;

&lt;h2 id=&quot;sponsorzy-spotkania&quot;&gt;Sponsorzy spotkania&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.facebook.com/Rebased/&quot;&gt;Rebased&lt;/a&gt;, &lt;a href=&quot;https://www.facebook.com/10Clouds/&quot;&gt;10Clouds&lt;/a&gt; - żetony w barze&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.facebook.com/cyfrowypolsat/&quot;&gt;Cyfrowy Polsat&lt;/a&gt; - materiały na YouTube&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.facebook.com/whitestreampl&quot;&gt;Whitestream&lt;/a&gt; - transmisja na żywo - &lt;a href=&quot;http://warsawjs.com/live&quot;&gt;warsawjs.com/live&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.facebook.com/softwarely/&quot;&gt;Softwarely&lt;/a&gt; - dodatkowe wsparcie&lt;/li&gt;
&lt;/ul&gt;
</description>
            <pubDate>Fri, 15 Jul 2016 00:00:00 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2016/07/15/warsawjs-meetup-23.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2016/07/15/warsawjs-meetup-23.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/post-banner-warsawjs.jpg</image>
        </item>
        
        <item>
            <title>Konferencja: PolyConf 2016</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;&lt;a href=&quot;https://www.linkedin.com/in/zaiste&quot;&gt;Zaiste&lt;/a&gt; - człowiek legenda. To dzięki niemu co roku mamy możliwość uczestniczenia w konferencji &lt;a href=&quot;http://polyconf.com/&quot;&gt;PolyConf&lt;/a&gt; (dawniej &lt;a href=&quot;http://rupy.eu/&quot;&gt;RuPy&lt;/a&gt;). Osobiście uczestniczyłem w PolyConf po raz pierwszy. Forma niewiele odbiega od wcześniej wspomnianego RuPy. Świetna przygotowanie od strony organizatorów. Tego można się spodziewać, od ekipy, która to robi już 10 lat.&lt;/p&gt;

&lt;p&gt;Konferencja trwała 3 dni: od 30 czerwca do 2 lipca, 2016 roku.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/conference-polyconf-2016/logo.jpg&quot; alt=&quot;&quot; /&gt;

    &lt;figcaption&gt;
        PolyConf 2016: June 30 - July 2, Poznań, Polska
    &lt;/figcaption&gt;

&lt;/figure&gt;

&lt;p&gt;Do Poznania dotarliśmy w składzie: Ja, Kamil Kiełbasa oraz Krzysztof Syrytczyk samolotem. Świat pięknie wygląda z perspektywy ptaka!&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/conference-polyconf-2016/poznan-z-lotu-ptaka.jpg&quot; alt=&quot;&quot; /&gt;

    &lt;figcaption&gt;
        Widok na Poznań, z samolotu.
    &lt;/figcaption&gt;

&lt;/figure&gt;

&lt;p&gt;Poznań, to piękne miasto. A najładniejsze miejsce to chyba rynek.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/conference-polyconf-2016/poznan-rynek.jpg&quot; alt=&quot;&quot; /&gt;

    &lt;figcaption&gt;
        Rynek poznański.
    &lt;/figcaption&gt;

&lt;/figure&gt;

&lt;h2 id=&quot;dzień-1&quot;&gt;Dzień 1&lt;/h2&gt;

&lt;p&gt;Pierwszy dzień zaczęliśmy od tego co często robię, czyli poranny trening biegowy. Bieganie jest świetnym sposobem na rozpoczęcie dnia. Kiedy człowiekowi nie chce się iść do pracy, to po kilku kilometrach podnosi się poziom &lt;abbr title=&quot;hormonu szczęścia&quot;&gt;endorfin&lt;/abbr&gt; we krwi i od razu jest większa energia na wszystko.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/conference-polyconf-2016/7k-run.jpg&quot; alt=&quot;&quot; /&gt;

    &lt;figcaption&gt;
        Poranne bieganie pierwszego dnia konferencji. Trening na Endomondo:
        &lt;a href=&quot;https://www.endomondo.com/users/15939217/workouts/756612189&quot;&gt;https://www.endomondo.com/users/15939217/workouts/756612189&lt;/a&gt;
    &lt;/figcaption&gt;

&lt;/figure&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/conference-polyconf-2016/attendee.jpg&quot; alt=&quot;&quot; /&gt;

    &lt;figcaption&gt;
        Identyfikator uczestnika.
    &lt;/figcaption&gt;

&lt;/figure&gt;

&lt;p&gt;Jak zwykle, kiedy jestem na konferencji (albo meetupie) to robię notatki. Jeśli jesteś zaciekawiony gdzie one są to zapraszam Cię do repozytorium na moim profilu na GitHubie: &lt;a href=&quot;https://github.com/piecioshka/notes-polyconf-2016&quot;&gt;github.com/piecioshka/notes-polyconf-2016&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Pierwszy na scenie pojawił się organizator. Opowiadał on o swojej roli w organizacji oraz podziękował wszystkim za przybycie i zaprosił do uczestniczenia przez kolejne 3 dni w świetnym wydarzeniu.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/conference-polyconf-2016/opening-intoduction.jpg&quot; alt=&quot;&quot; /&gt;

    &lt;figcaption&gt;
        Organizator - Zaiste.
    &lt;/figcaption&gt;

&lt;/figure&gt;

&lt;p&gt;Jak to na każdej konferencji do zebrania jest kilka giftów dla uczestników. Najlepszym jest oczywiście oryginalna naklejka z logiem konferencji.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/conference-polyconf-2016/stickers.jpg&quot; alt=&quot;&quot; /&gt;

    &lt;figcaption&gt;
        Naklejki z logiem konferencji.
    &lt;/figcaption&gt;

&lt;/figure&gt;

&lt;p&gt;Dzień pierwszy konferencji zakończyliśmy w barze oglądając mecz &lt;mark&gt;Polska - Portugalia&lt;/mark&gt;. Niestety w karnych przegraliśmy. W sercu pojawił się smutek. Jednak nie wolno zapominać, że doszliśmy tak wysoko - to przecież &lt;strong&gt;Ćwierćfinał Mistrzostw Europy&lt;/strong&gt;.&lt;/p&gt;

&lt;h2 id=&quot;dzień-2&quot;&gt;Dzień 2&lt;/h2&gt;

&lt;p&gt;Drugi dzień zaczęliśmy świetnymi prelekcjami. Natomiast podczas przerwy obiadowej mogliśmy zagrać w bubble soccer.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/conference-polyconf-2016/bubble-soccer.jpg&quot; alt=&quot;&quot; /&gt;

    &lt;figcaption&gt;
        Tak wygląda wielka kula do której się wchodzi aby wziąć udział w rozgrywkach Bubble Soccera.
    &lt;/figcaption&gt;

&lt;/figure&gt;

&lt;p&gt;Jedzenie i piecie podczas konferencji to bardzo ważne elementy. Człowiek z nudów nie ma co ze sobą zrobić. Nuda pojawia się, nie ze względu na słabe prelekcje, tylko na brak interakcji. Jeśli siedzimy 8 godzin i nic nie musimy robić, tylko słuchać, to siłą rzeczy ziewanie to normalne zjawisko.&lt;/p&gt;

&lt;p&gt;Organizatorzy wiedzą, że programiści lubią smakołyki, więc zorganizowali pyszne desery, które mi osobiście MOCNO przypadły go gustu i zjadłem ich 3.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/conference-polyconf-2016/dessert.jpg&quot; alt=&quot;&quot; /&gt;

    &lt;figcaption&gt;
        Deser.
    &lt;/figcaption&gt;

&lt;/figure&gt;

&lt;p&gt;Ostatnim wykładem drugiego dnia był talk o projekcie &lt;strong&gt;Seif&lt;/strong&gt;, który poprowadził Douglas Crockford.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/conference-polyconf-2016/talk-about-seif.jpg&quot; alt=&quot;&quot; /&gt;

    &lt;figcaption&gt;
        Spotkanie z Douglas-em Crockford-em.
    &lt;/figcaption&gt;

&lt;/figure&gt;

&lt;p&gt;Na zakończenie dnia, zrobiliśmy sobie zdjęcie z Douglasem:&lt;/p&gt;

&lt;figure class=&quot;social-center-block&quot;&gt;
    &lt;iframe src=&quot;https://www.facebook.com/plugins/post.php?href=https%3A%2F%2Fwww.facebook.com%2Fphoto.php%3Ffbid%3D1762630160680924%26set%3Da.1762630980680842.1073741828.100008018719372%26type%3D3&amp;amp;width=500&quot; width=&quot;500&quot; height=&quot;380&quot; style=&quot;border:none;overflow:hidden&quot; scrolling=&quot;no&quot; frameborder=&quot;0&quot; allowtransparency=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;dzień-3&quot;&gt;Dzień 3&lt;/h2&gt;

&lt;p&gt;Trzeciego dnia mieliśmy panel lightning talków, podczas których mogliśmy usłyszeć JavaScript!&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/conference-polyconf-2016/lightning-talk.jpg&quot; alt=&quot;&quot; /&gt;

    &lt;figcaption&gt;
        Muzyka i efekty specjalne były zrealizowane dzięki odpowiednim bibliotekom w JavaScript.
    &lt;/figcaption&gt;

&lt;/figure&gt;

&lt;h2 id=&quot;lesson-learned-czyli-czego-się-nauczyłem&quot;&gt;Lesson learned, czyli czego się nauczyłem?&lt;/h2&gt;

&lt;p&gt;Wskazówki do slajdów:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;na pierwszym slajdzie link do wersji online oraz do Twittera&lt;/li&gt;
  &lt;li&gt;na każdym slajdzie w prawym dolnym rogu Twitter username&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bardzo dziękuję organizatorom, za włożone siły w organizację tak dużego przedsięwzięcia jakim jest konferencja ze speakerami z najwyższej półki.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/conference-polyconf-2016/heaven.jpg&quot; alt=&quot;&quot; /&gt;

    &lt;figcaption&gt;
        Piękne niebo nad Warszawą.
    &lt;/figcaption&gt;

&lt;/figure&gt;
</description>
            <pubDate>Thu, 30 Jun 2016 00:00:00 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2016/06/30/konferencja-polyconf-2016.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2016/06/30/konferencja-polyconf-2016.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/conference-polyconf-2016/polyconf-2016.jpg</image>
        </item>
        
        <item>
            <title>WarsawJS Meetup #22</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;To już 22 spotkanie! Szybko leci. Tak się zastanawiając, to między każdym meetupem WarsawJS są tylko 4 tygodnie = 4 poniedziałki. To bardzo krótki okres czasu dla organizatorów, aby podczas spotkania wszystko zagrało jak powinno, ale wiecie co? Mi się to podoba!&lt;/p&gt;

&lt;p&gt;Lubię pomagać ludziom, którzy chcą pomocy. A tak sobie tłumaczę, że Ci którzy przychodzą, chcą się rozwijać. Cieszę się, że mogę takim ludziom pomagać rozwijać ich wachlarz umiejętności. Rozwój swoich umiejętności to proces ciągły. Trwa on całe życie. A najfajniejsze w tym wszystkim jest to, że można zacząć rozwijać się jako developer w dowolnym wieku!&lt;/p&gt;

&lt;!-- &lt;figure&gt;
    &lt;a href=&quot;https://www.meetup.com/WarsawJS/&quot;&gt;
        &lt;img src=&quot;/assets/images/posts/post-banner-warsawjs.jpg&quot;
             alt=&quot;WarsawJS&quot;/&gt;
    &lt;/a&gt;
&lt;/figure&gt; --&gt;

&lt;h2 id=&quot;invitation&quot;&gt;Invitation&lt;/h2&gt;

&lt;p&gt;Tym razem na sportowo! Lubię jeździć na deskorolce, to pomyślałem, że zabiorę Was na jeden z wielu warszawskich skateparków. W Parku Szymańskiego jest taki mini skatepark - jeden z pierwszych jaki poznałem.&lt;/p&gt;

&lt;figure class=&quot;center-block&quot;&gt;
    &lt;iframe src=&quot;https://www.google.com/maps/embed?pb=!1m14!1m12!1m3!1d267.6590867061538!2d20.948811547992193!3d52.23294604279061!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!5e1!3m2!1spl!2spl!4v1466933188861&quot; width=&quot;600&quot; height=&quot;450&quot; frameborder=&quot;0&quot; style=&quot;border:0&quot; allowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
    &lt;figcaption&gt;
        Skatepark w Parku Szymańskiego.
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;Czerwcowe spotkanie zaowocowało w trzy prelekcje. Pierwsza i ostania były po angielsku. Generalnie to zazdroszczę prelegentom, którzy wychodzą na scenę i opowiadają kilkadziesiąt minut po angielsku. Muszą na pewno czuć się pewnie w tym języku. Także &lt;a href=&quot;https://twitter.com/dotintegral&quot;&gt;Artur&lt;/a&gt;, &lt;a href=&quot;https://twitter.com/tomasz_ducin&quot;&gt;Tomasz&lt;/a&gt; - &lt;strong&gt;chapeau bas&lt;/strong&gt;!&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://www.meetup.com/WarsawJS/events/231619825/&quot;&gt;Profil wydarzenia na portalu Meetup.com&lt;/a&gt; dostał mnóstwo komentarzy z pochwałami, czyli prelekcje podobały się nie tylko mi! To zawsze cieszy organizatorów.&lt;/p&gt;

&lt;p&gt;Zapraszam w imieniu organizatorów WarsawJS.&lt;/p&gt;

&lt;div class=&quot;youtube-lazy&quot; data-youtube-id=&quot;iHiBBiwebs0&quot;&gt;&lt;/div&gt;

&lt;p class=&quot;chapter-break&quot;&gt;&amp;bull;&lt;/p&gt;

&lt;h2 id=&quot;talk-1-node-like-a-pro-en-artur-siery&quot;&gt;Talk #1: Node like a pro [EN] &lt;small&gt;Artur Siery&lt;/small&gt;&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;Link do prelekcji: &lt;a href=&quot;https://www.youtube.com/watch?v=DuE39Fl5BS0&quot;&gt;youtube.com/watch?v=DuE39Fl5BS0&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p class=&quot;chapter-break&quot;&gt;&amp;bull;&lt;/p&gt;

&lt;h2 id=&quot;talk-2-back-to-the-future---async-js-handling-pl-maciej-pawluk&quot;&gt;Talk #2: Back to the future - async JS handling [PL] &lt;small&gt;Maciej Pawluk&lt;/small&gt;&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;Link do prelekcji: &lt;a href=&quot;https://www.youtube.com/watch?v=_AeAeSwRQ5A&quot;&gt;youtube.com/watch?v=_AeAeSwRQ5A&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p class=&quot;chapter-break&quot;&gt;&amp;bull;&lt;/p&gt;

&lt;h2 id=&quot;talk-3-javascript--java--typescript-en-tomasz-ducin&quot;&gt;Talk #3: JavaScript + Java = TypeScript [EN] &lt;small&gt;Tomasz Ducin&lt;/small&gt;&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;Link do prelekcji: &lt;a href=&quot;https://www.youtube.com/watch?v=jtdIHM24LwQ&quot;&gt;youtube.com/watch?v=jtdIHM24LwQ&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p class=&quot;chapter-break&quot;&gt;&amp;bull;&lt;/p&gt;

&lt;h2 id=&quot;sponsorzy-spotkania&quot;&gt;Sponsorzy spotkania&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.facebook.com/Rebased/&quot;&gt;Rebased&lt;/a&gt;, &lt;a href=&quot;https://www.facebook.com/10Clouds/&quot;&gt;10Clouds&lt;/a&gt; - żetony w barze&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.facebook.com/cyfrowypolsat/&quot;&gt;Cyfrowy Polsat&lt;/a&gt; - materiały na YouTube&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.facebook.com/whitestreampl&quot;&gt;Whitestream&lt;/a&gt; - transmisja na żywo - &lt;a href=&quot;http://warsawjs.com/live&quot;&gt;warsawjs.com/live&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.facebook.com/softwarely/&quot;&gt;Softwarely&lt;/a&gt; - dodatkowe wsparcie&lt;/li&gt;
&lt;/ul&gt;
</description>
            <pubDate>Mon, 27 Jun 2016 00:00:00 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2016/06/27/warsawjs-meetup-22.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2016/06/27/warsawjs-meetup-22.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/post-banner-warsawjs.jpg</image>
        </item>
        
        <item>
            <title>WarsawJS Meetup #21</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Spotkanie organizacji &lt;strong&gt;WarsawJS&lt;/strong&gt; odbyło się 11 maja w Państwomiasto. Wysłuchaliśmy trzech prelekcji o JavaScript. Ten meetup był szczególny pod trzema względami.&lt;/p&gt;

&lt;p&gt;Po &lt;strong&gt;pierwsze&lt;/strong&gt;, na scenie widzieliśmy pasjonata Fizyki, Andriya Mykulyaka, który to opowiadał o najatrakcyjniejszym ostatnimi czasy dla mnie narzędziu &lt;code class=&quot;highlighter-rouge&quot;&gt;Webpack&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Po &lt;strong&gt;drugie&lt;/strong&gt;, kolejną prelekcję po prowadził Dominik Lubański, który to opowiedział o prototypowaniu w JavaScript. Temat jest bardzo szeroki. Prelekcja zakończyła się krótką historią o serii książek &lt;code class=&quot;highlighter-rouge&quot;&gt;YDKJS&lt;/code&gt;. Dominik powiedział, że w swojej firmie mocno ciśnie wszystkich, aby przeczytali całą serię. Ze względu, że nigdy nie przeczytałem choć jednego tomu, to postanowiłem, że zbiorę się w sobie i przeczytam cała, 6-cio tomową, serię. Zacząłem czytać i tak powstały &lt;strong&gt;2 wpisy&lt;/strong&gt; na blogu:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;%7B%%20post_url%202016-05-20-ksiazka-tajniki-jezyka-javascript-zakresy-i-domkniecia%20%%7D&quot;&gt;Tajniki Języka JavaScript: Zakresy i domknięcia&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;%7B%%20post_url%202016-05-24-ksiazka-tajniki-jezyka-javascript-na-drodze-do-bieglosci%20%%7D&quot;&gt;Tajniki Języka JavaScript: Na drodze do biegłości&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Więcej postów z tej serii, już wkrótce!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No i po &lt;strong&gt;trzecie&lt;/strong&gt;! Ten meetup był bardzo atrakcyjny z jeszcze jednego powodu. Na warszawskiej scenie pojawiła się pierwsza dziewczyna. Paulina Kamińska opowiadała o bibliotece &lt;code class=&quot;highlighter-rouge&quot;&gt;gsap.js&lt;/code&gt;, która to pomaga przy tworzeniu animacji.&lt;/p&gt;

&lt;!-- &lt;figure&gt;
    &lt;a href=&quot;https://www.meetup.com/WarsawJS/&quot;&gt;
        &lt;img src=&quot;/assets/images/posts/post-banner-warsawjs.jpg&quot;
             alt=&quot;WarsawJS&quot;/&gt;
    &lt;/a&gt;
&lt;/figure&gt; --&gt;

&lt;h2 id=&quot;invitation&quot;&gt;Invitation&lt;/h2&gt;

&lt;p&gt;Ze względu na moment w którym nagrywaliśmy zapowiedź, a było to na początku maja, postanowiliśmy upamiętnić naszą flagę państwową!&lt;/p&gt;

&lt;p&gt;Całą zapowiedź nagrywaliśmy sprzed budynku Warsaw Spire, nowo otwartego wówczas wieżowca w centrum miasta.&lt;/p&gt;

&lt;p&gt;Zapraszam w imieniu organizatorów WarsawJS.&lt;/p&gt;

&lt;div class=&quot;youtube-lazy&quot; data-youtube-id=&quot;Rj7a_QrsNwc&quot;&gt;&lt;/div&gt;

&lt;p class=&quot;chapter-break&quot;&gt;&amp;bull;&lt;/p&gt;

&lt;h2 id=&quot;talk-1-webpack---co-to-jest-i-z-czym-go-jeść-pl-andriy-mykulyak&quot;&gt;Talk #1: Webpack - co to jest i z czym go jeść? [PL] &lt;small&gt;Andriy Mykulyak&lt;/small&gt;&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;Link do prelekcji: &lt;a href=&quot;https://www.youtube.com/watch?v=uBp4lheDXZI&quot;&gt;youtube.com/watch?v=uBp4lheDXZI&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p class=&quot;chapter-break&quot;&gt;&amp;bull;&lt;/p&gt;

&lt;h2 id=&quot;talk-2-is-there-inheritance-or-delegation-pl-dominik-lubański&quot;&gt;Talk #2: Is there inheritance or delegation? [PL] &lt;small&gt;Dominik Lubański&lt;/small&gt;&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;Link do prelekcji: &lt;a href=&quot;https://www.youtube.com/watch?v=3Atpqz5zgk0&quot;&gt;youtube.com/watch?v=3Atpqz5zgk0&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p class=&quot;chapter-break&quot;&gt;&amp;bull;&lt;/p&gt;

&lt;h2 id=&quot;talk-3-gsapjs-czyli-animowanie-bez-css-pl-paulina-kamińska&quot;&gt;Talk #3: gsap.js, czyli animowanie bez CSS [PL] &lt;small&gt;Paulina Kamińska&lt;/small&gt;&lt;/h2&gt;

&lt;p&gt;Paulina jest była pierwszą prelegentką podczas meetupów WarsawJS. Dodatkowo, pierwszy raz opowiadała przed publicznością, więc myślę, że należą jej się pochwały!&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Link do prelekcji: &lt;a href=&quot;https://www.youtube.com/watch?v=DRQyeIOqdqE&quot;&gt;youtube.com/watch?v=DRQyeIOqdqE&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p class=&quot;chapter-break&quot;&gt;&amp;bull;&lt;/p&gt;

&lt;h2 id=&quot;sponsorzy-spotkania&quot;&gt;Sponsorzy spotkania&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.facebook.com/Rebased/&quot;&gt;Rebased&lt;/a&gt;, &lt;a href=&quot;https://www.facebook.com/10Clouds/&quot;&gt;10Clouds&lt;/a&gt; - żetony w barze&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.facebook.com/cyfrowypolsat/&quot;&gt;Cyfrowy Polsat&lt;/a&gt; - materiały na YouTube&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.facebook.com/whitestreampl&quot;&gt;Whitestream&lt;/a&gt; - transmisja na żywo - &lt;a href=&quot;http://warsawjs.com/live&quot;&gt;warsawjs.com/live&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.facebook.com/softwarely/&quot;&gt;Softwarely&lt;/a&gt; - dodatkowe wsparcie&lt;/li&gt;
&lt;/ul&gt;
</description>
            <pubDate>Sun, 26 Jun 2016 00:00:00 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2016/06/26/warsawjs-meetup-21.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2016/06/26/warsawjs-meetup-21.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/post-banner-warsawjs.jpg</image>
        </item>
        
        <item>
            <title>AngularJS Warsaw #8</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;W minioną środę zawitałem z kolegą na warszawskie Włochy, gdzie w siedzibie firmy &lt;strong&gt;Microsoft&lt;/strong&gt; odbyło się kolejne spotkanie z Angularem, czyli &lt;a href=&quot;https://www.meetup.com/AngularJS-Warsaw/&quot;&gt;AngularJS Warsaw&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Na spotkanie zapisało się 133 osoby i przyszło około 80. Taka prawidłowość występuje zawsze. Nigdy na spotkania nie przychodzi dokładnie tyle osób ile się zapisuje. Ale tak jest zawsze w życiu, chociażby zaproszenia na wesele. Zostaje zaproszonych 200 osób, a przychodzi 150.&lt;/p&gt;

&lt;figure class=&quot;social-center-block&quot;&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;With &lt;a href=&quot;https://twitter.com/ckyambitny?ref_src=twsrc%5Etfw&quot;&gt;@ckyambitny&lt;/a&gt; in .... Hmmm, where are we? &lt;a href=&quot;https://t.co/AkGTm77KUY&quot;&gt;pic.twitter.com/AkGTm77KUY&lt;/a&gt;&lt;/p&gt;&amp;mdash; Piotr Kowalski (@piecioshka) &lt;a href=&quot;https://twitter.com/piecioshka/status/745653228780523520?ref_src=twsrc%5Etfw&quot;&gt;June 22, 2016&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async=&quot;&quot; src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;

&lt;/figure&gt;

&lt;p&gt;Link do wydarzenia: &lt;a href=&quot;https://www.meetup.com/AngularJS-Warsaw/&quot;&gt;meetup.com/AngularJS-Warsaw/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Podczas spotkania wysłuchaliśmy 4 prelekcji. A jedną z nich poprowadził nawet organizator całego zamieszania, &lt;a href=&quot;https://twitter.com/ngkalbarczyk&quot;&gt;Darek Kalbarczyk&lt;/a&gt;. Wszystkie prelekcje były zorientowane na framework &lt;a href=&quot;https://angular.io/&quot;&gt;AngularJS&lt;/a&gt; autorstwa Misko Havery’ego, Adam Abrons’a, pracujących w organizacji Google.&lt;/p&gt;

&lt;h2 id=&quot;talk-1-tworzenie-aplikacji-wielojęzykowych-w-angularjs-bartłomiej-narożnik&quot;&gt;Talk #1: Tworzenie aplikacji wielojęzykowych w AngularJS &lt;small&gt;Bartłomiej Narożnik&lt;/small&gt;&lt;/h2&gt;

&lt;p&gt;Prelegent, został przedstawiony przez Darka (organizatora) jako jeden z najlepszych programistów z którymi pracował.&lt;/p&gt;

&lt;h3 id=&quot;zarządzenie-wielojęzykowością&quot;&gt;Zarządzenie wielojęzykowością&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Podejście &lt;em&gt;monarchistyczne&lt;/em&gt; - tylko tłumaczenie języka&lt;/li&gt;
  &lt;li&gt;Podejście &lt;em&gt;anarchistyczne&lt;/em&gt; - osobny Front-end&lt;/li&gt;
  &lt;li&gt;Podejście &lt;em&gt;federalistyczne&lt;/em&gt; - wspólna cześć, ale dla każdej kultury dostosowujemy aplikacje&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;narzędzie-angular-translate&quot;&gt;Narzędzie &lt;code class=&quot;highlighter-rouge&quot;&gt;angular-translate&lt;/code&gt;&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Obsługuje większość tego co oferuje Angular&lt;/li&gt;
  &lt;li&gt;Parametryzacja&lt;/li&gt;
  &lt;li&gt;Można przetłumaczyć całe fragmenty HTMLa&lt;/li&gt;
  &lt;li&gt;Można dodać obsługę błędów&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Instalacja bardzo prosta, wystarczy zdefiniować:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Zależność&lt;/li&gt;
  &lt;li&gt;Język&lt;/li&gt;
  &lt;li&gt;Struktura translacji (JSON)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Dobrze się obsługuje, gdy mamy &lt;code class=&quot;highlighter-rouge&quot;&gt;service&lt;/code&gt;. Jednakże &lt;code class=&quot;highlighter-rouge&quot;&gt;filter&lt;/code&gt; również pasuje. Dyrektywa jest najbardziej popularna w użyciu.&lt;/p&gt;

&lt;h3 id=&quot;zmienne-w-tłumaczeniach&quot;&gt;Zmienne w tłumaczeniach&lt;/h3&gt;

&lt;p&gt;Trzeba podawać dodatkowo wartości tych zmiennych np. &lt;code class=&quot;highlighter-rouge&quot;&gt;translate-values&lt;/code&gt; w dyrektywach.&lt;/p&gt;

&lt;h3 id=&quot;zmiana-języka&quot;&gt;Zmiana języka&lt;/h3&gt;

&lt;p&gt;Metoda &lt;code class=&quot;highlighter-rouge&quot;&gt;use(key)&lt;/code&gt;, gdzie &lt;code class=&quot;highlighter-rouge&quot;&gt;key&lt;/code&gt; to klucz z językiem.&lt;/p&gt;

&lt;p&gt;Uruchomienie metody bez argumentu zwróci obecnie używany język.&lt;/p&gt;

&lt;h3 id=&quot;pluralizacja&quot;&gt;Pluralizacja&lt;/h3&gt;

&lt;p&gt;Obsługuje &lt;a href=&quot;https://github.com/SlexAxton/messageformat.js/&quot;&gt;messageformat.js&lt;/a&gt;.&lt;/p&gt;

&lt;h3 id=&quot;obsługa-błędów&quot;&gt;Obsługa błędów&lt;/h3&gt;

&lt;p&gt;Jeśli jest problem z tłumaczeniem, np. jeśli klucz nie ma swojego odpowiednika, możemy dostać &lt;code class=&quot;highlighter-rouge&quot;&gt;console.warn()&lt;/code&gt; z tego tytułu, albo też możemy zdefiniować swój handler.&lt;/p&gt;

&lt;p&gt;Mamy mnóstwo zdarzeń, na które możemy nasłuchiwać, więc można stwierdzić, że możliwości są ogromne.&lt;/p&gt;

&lt;h3 id=&quot;bezpieczeństwo&quot;&gt;Bezpieczeństwo&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;angular-sanitize&lt;/code&gt; (z modułu)&lt;/li&gt;
  &lt;li&gt;albo po prostu &lt;code class=&quot;highlighter-rouge&quot;&gt;escape&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Zalecane jest aby używać &lt;code class=&quot;highlighter-rouge&quot;&gt;angular-sanitize&lt;/code&gt;.&lt;/p&gt;

&lt;h3 id=&quot;jak-wykryć-język&quot;&gt;Jak wykryć język?&lt;/h3&gt;

&lt;p&gt;Funkcja &lt;code class=&quot;highlighter-rouge&quot;&gt;determinePreferredLanguage&lt;/code&gt;&lt;/p&gt;

&lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;navigator&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;languages&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;];&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;navigator&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;language&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;navigator&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;browserLanguage&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;navigator&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;systemLanguage&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;navigator&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;userLanguage&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Język z jakim jest zainstalowana przeglądarka, co nie koniecznie jest wystarczające, np. w dużych firmach mamy zainstalowane z domyślnymi ustawieniami (ang) a przecież mówimy po polsku.&lt;/p&gt;

&lt;p&gt;Lepsze rozwiązanie to parsowanie nagłówka HTTP “Accept-Language”, gdzie wystarczy zmienić język w przeglądarce, wtedy będziemy mieli zawsze poprawny język odpowiadający preferencjom użytkownika.&lt;/p&gt;

&lt;p&gt;&lt;small&gt;Czas trwania 19:05 - 19:20 + 3&lt;/small&gt;&lt;/p&gt;

&lt;p class=&quot;chapter-break&quot;&gt;&amp;bull;&lt;/p&gt;

&lt;h2 id=&quot;talk-2-angularjs-najczęściej-zadawane-pytania-na-rozmowie-kwalifikacyjnej-dariusz-kalbarczyk&quot;&gt;Talk #2: AngularJS. Najczęściej zadawane pytania na rozmowie kwalifikacyjnej &lt;small&gt;Dariusz Kalbarczyk&lt;/small&gt;&lt;/h2&gt;

&lt;p&gt;Darek razem z Bartkiem przygotowują razem książkę o tytule takim jak tytuł tej prelekcji.&lt;/p&gt;

&lt;h3 id=&quot;skąd-pomysł-na-książkę&quot;&gt;Skąd pomysł na książkę?&lt;/h3&gt;

&lt;p&gt;Ostatnimi czasy Darek rekrutował całymi dniami w Katowicach i Szczecinie kandydatów na developerów do firm, gdzie projekty oparte były na AngularJS.&lt;/p&gt;

&lt;p&gt;Po przeprowadzonych rozmowach postanowił zebrać wszystkie pytania w jedno miejsce i napisać książkę.&lt;/p&gt;

&lt;p&gt;Według Darka, pracodawca poszukuje pracowników według takich 3 kryteriów:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;33% - czy ma to czego firma oczekuje?&lt;/li&gt;
  &lt;li&gt;33% - czy mu się w ogóle chce?&lt;/li&gt;
  &lt;li&gt;33% - jak się sprawdzi w zespole?&lt;/li&gt;
&lt;/ul&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/angularjs-warsaw/meetup-8/ng-8-dariusz.jpg&quot; alt=&quot;&quot; /&gt;

    &lt;figcaption&gt;
        &lt;a href=&quot;http://www.goldenline.pl/dariusz-kalbarczyk4/&quot;&gt;Darek Kalbarczyk&lt;/a&gt; opowiada o nowej książce, którą piszę razem ze swoim kolegą z pracy.
    &lt;/figcaption&gt;

&lt;/figure&gt;

&lt;h3 id=&quot;seria-pytań&quot;&gt;Seria pytań&lt;/h3&gt;

&lt;h4 id=&quot;1-dlaczego-warto-używać-angulara&quot;&gt;1. Dlaczego warto używać Angulara?&lt;/h4&gt;

&lt;p&gt;Odp. z sali: “Jest pocięty”, ale jest komponentyzacja, która przekłada się na testy,&lt;/p&gt;

&lt;h4 id=&quot;2-czy-angular-jest-zależny-od-jquery&quot;&gt;2. Czy angular jest zależny od &lt;code class=&quot;highlighter-rouge&quot;&gt;jQuery&lt;/code&gt;?&lt;/h4&gt;

&lt;p&gt;Odp. z sali: nie jest zależny, ponieważ posiada &lt;code class=&quot;highlighter-rouge&quot;&gt;jqLite&lt;/code&gt;, czyli takie podstawy z biblioteki jQuery, jeśli jednak jQuery będzie dostępne przed osadzeniem Angulara, to wykorzysta on metody obiektu jQuery.&lt;/p&gt;

&lt;h4 id=&quot;3-wymień-najważniejsze-cechy-angulara&quot;&gt;3. Wymień najważniejsze cechy Angulara.&lt;/h4&gt;

&lt;p&gt;Odp. z sali: moduły, SPA, i … reszta cech.&lt;/p&gt;

&lt;h4 id=&quot;4-co-to-są-moduły-w-angularze&quot;&gt;4. Co to są moduły w Angularze?&lt;/h4&gt;

&lt;p&gt;Odp. z sali: Kontenery, podobne do przestrzeni nazw. Możemy definiować zależności.&lt;/p&gt;

&lt;h4 id=&quot;5-jakie-komponenty-możemy-definiować-w-modułach&quot;&gt;5. Jakie komponenty możemy definiować w modułach?&lt;/h4&gt;

&lt;p&gt;Odp. z sali: kontrolery, dyrektywy, configi.&lt;/p&gt;

&lt;h4 id=&quot;6-jak-nazywa-się-moduł-główny-angulara&quot;&gt;6. Jak nazywa się moduł główny Angulara?&lt;/h4&gt;

&lt;p&gt;Odp z sali: &lt;code class=&quot;highlighter-rouge&quot;&gt;ng&lt;/code&gt; - moduł główny, ładowany domyślnie, podczas startu aplikacji.&lt;/p&gt;

&lt;h4 id=&quot;7-jak-angular-ładuje-zależności&quot;&gt;7. Jak Angular ładuje zależności?&lt;/h4&gt;

&lt;p&gt;Odp. z sali: Dependency Injection.&lt;/p&gt;

&lt;h4 id=&quot;8-kiedy-są-ładowane-moduły-zależne&quot;&gt;8. Kiedy są ładowane moduły zależne?&lt;/h4&gt;

&lt;p&gt;Brak odpowiedzi.&lt;/p&gt;

&lt;h4 id=&quot;9-co-to-jest-globalne-api&quot;&gt;9. Co to jest globalne API?&lt;/h4&gt;

&lt;p&gt;Odp. z sali: Metody obiektu &lt;code class=&quot;highlighter-rouge&quot;&gt;angular&lt;/code&gt;, np. &lt;code class=&quot;highlighter-rouge&quot;&gt;angular.copy&lt;/code&gt;.&lt;/p&gt;

&lt;h4 id=&quot;10-jaka-jest-różnica-jest-pomiędzy-prefiksem--a-&quot;&gt;10. Jaka jest różnica jest pomiędzy prefiksem &lt;code class=&quot;highlighter-rouge&quot;&gt;$&lt;/code&gt; a &lt;code class=&quot;highlighter-rouge&quot;&gt;$$&lt;/code&gt;?&lt;/h4&gt;

&lt;p&gt;Odp. z sali: W Angularze za pomocą &lt;code class=&quot;highlighter-rouge&quot;&gt;$&lt;/code&gt; oznaczone są właściwości publiczne obiektu, a z &lt;code class=&quot;highlighter-rouge&quot;&gt;$$&lt;/code&gt; prywatne.&lt;/p&gt;

&lt;h4 id=&quot;11-co-to-jest-scope-i-rootscope&quot;&gt;11. Co to jest &lt;code class=&quot;highlighter-rouge&quot;&gt;$scope&lt;/code&gt; i &lt;code class=&quot;highlighter-rouge&quot;&gt;$rootScope&lt;/code&gt;?&lt;/h4&gt;

&lt;p&gt;Odp. z sali:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;$rootScope&lt;/code&gt; jest to najwyższy rodzaj &lt;code class=&quot;highlighter-rouge&quot;&gt;$scope&lt;/code&gt; (główny)&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;$scope&lt;/code&gt; - obiekt skleja kontroler i widok.&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;$scope&lt;/code&gt;-y mogą być zagnieżdżane.&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;$rootScope.$new&lt;/code&gt; może tworzyć niezwiązane z niczym scope-y, można go zapakować w &lt;code class=&quot;highlighter-rouge&quot;&gt;service&lt;/code&gt; i traktować jako obsługa sygnałów.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;12-wyjaśnij-różnice-pomiędzy-ng-if-oraz-ng-show&quot;&gt;12. Wyjaśnij różnice pomiędzy &lt;code class=&quot;highlighter-rouge&quot;&gt;ng-if&lt;/code&gt; oraz &lt;code class=&quot;highlighter-rouge&quot;&gt;ng-show&lt;/code&gt;?&lt;/h4&gt;

&lt;p&gt;Odp. z sali: &lt;code class=&quot;highlighter-rouge&quot;&gt;ng-if&lt;/code&gt; usuwa z DOM, a &lt;code class=&quot;highlighter-rouge&quot;&gt;ng-show&lt;/code&gt; korzysta ze styli CSS do ukrycia elementu.&lt;/p&gt;

&lt;h4 id=&quot;13-jakie-specjalne-zmienne-udostępnia-ngrepeat&quot;&gt;13. Jakie specjalne zmienne udostępnia &lt;code class=&quot;highlighter-rouge&quot;&gt;ngRepeat&lt;/code&gt;?&lt;/h4&gt;

&lt;p&gt;Odp. z sali: &lt;code class=&quot;highlighter-rouge&quot;&gt;last&lt;/code&gt;, &lt;code class=&quot;highlighter-rouge&quot;&gt;first&lt;/code&gt;, &lt;code class=&quot;highlighter-rouge&quot;&gt;even&lt;/code&gt;, &lt;code class=&quot;highlighter-rouge&quot;&gt;odd&lt;/code&gt;, &lt;code class=&quot;highlighter-rouge&quot;&gt;index&lt;/code&gt;, &lt;code class=&quot;highlighter-rouge&quot;&gt;middle&lt;/code&gt;.&lt;/p&gt;

&lt;h4 id=&quot;14-co-to-jest-i-jak-działa-ng-include&quot;&gt;14. Co to jest i jak działa &lt;code class=&quot;highlighter-rouge&quot;&gt;ng-include&lt;/code&gt;?&lt;/h4&gt;

&lt;p&gt;Odp. z sali: Dyrektywa służy do ładowania plików statycznych. Niestety, ale nie można z innej domeny.&lt;/p&gt;

&lt;h4 id=&quot;15-co-jest-szybsze-digest-czy-apply&quot;&gt;15. Co jest szybsze &lt;code class=&quot;highlighter-rouge&quot;&gt;$digest&lt;/code&gt; czy &lt;code class=&quot;highlighter-rouge&quot;&gt;$apply&lt;/code&gt;?&lt;/h4&gt;

&lt;p&gt;Odp. z sali: &lt;code class=&quot;highlighter-rouge&quot;&gt;$digest&lt;/code&gt; jest szybszy bo jedzie tylko w dół.&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;$apply&lt;/code&gt; w górę i w dół.&lt;/p&gt;

&lt;h4 id=&quot;16-jak-działa-funkcja-destroy-dla-danego-zakresu&quot;&gt;16. Jak działa funkcja &lt;code class=&quot;highlighter-rouge&quot;&gt;$destroy&lt;/code&gt; dla danego zakresu?&lt;/h4&gt;

&lt;p&gt;Odp. z sali: Usuwa &lt;code class=&quot;highlighter-rouge&quot;&gt;$scope&lt;/code&gt; z pamięci.&lt;/p&gt;

&lt;h4 id=&quot;17-jaka-jest-różnica-pomiędzy-watch-i-observe&quot;&gt;17. Jaka jest różnica pomiędzy &lt;code class=&quot;highlighter-rouge&quot;&gt;$watch&lt;/code&gt; i &lt;code class=&quot;highlighter-rouge&quot;&gt;$observe&lt;/code&gt;?&lt;/h4&gt;

&lt;p&gt;Odp. z sali:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;$watch&lt;/code&gt; można wykorzystywać w dyrektywach w funkcji link i kontrolerach&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;$observe&lt;/code&gt; tylko w dyrektywach w obiekcie &lt;em&gt;attrs&lt;/em&gt;.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;18-wymień-metody-serwisu-http&quot;&gt;18. Wymień metody serwisu &lt;code class=&quot;highlighter-rouge&quot;&gt;$http&lt;/code&gt;?&lt;/h4&gt;

&lt;p&gt;Odp. z sali: &lt;code class=&quot;highlighter-rouge&quot;&gt;$get&lt;/code&gt;, &lt;code class=&quot;highlighter-rouge&quot;&gt;$head&lt;/code&gt;, &lt;code class=&quot;highlighter-rouge&quot;&gt;$post&lt;/code&gt;, &lt;code class=&quot;highlighter-rouge&quot;&gt;$put&lt;/code&gt;, &lt;code class=&quot;highlighter-rouge&quot;&gt;$delete&lt;/code&gt;, &lt;code class=&quot;highlighter-rouge&quot;&gt;$jsonp&lt;/code&gt;, &lt;code class=&quot;highlighter-rouge&quot;&gt;$patch&lt;/code&gt;&lt;/p&gt;

&lt;h4 id=&quot;19-wymień-metody-wspierane-przez-serwis-resource&quot;&gt;19. Wymień metody wspierane przez serwis &lt;code class=&quot;highlighter-rouge&quot;&gt;$resource&lt;/code&gt;?&lt;/h4&gt;

&lt;p&gt;Odp. z sali: &lt;code class=&quot;highlighter-rouge&quot;&gt;$get&lt;/code&gt;, &lt;code class=&quot;highlighter-rouge&quot;&gt;$save&lt;/code&gt;, &lt;code class=&quot;highlighter-rouge&quot;&gt;$query&lt;/code&gt;, &lt;code class=&quot;highlighter-rouge&quot;&gt;$remove&lt;/code&gt;, &lt;code class=&quot;highlighter-rouge&quot;&gt;$delete&lt;/code&gt;.&lt;/p&gt;

&lt;h4 id=&quot;20-które-dyrektywy-wspierają-animacje&quot;&gt;20. Które dyrektywy wspierają animacje?&lt;/h4&gt;

&lt;p&gt;Odp. z sali: &lt;code class=&quot;highlighter-rouge&quot;&gt;ng-show&lt;/code&gt;, &lt;code class=&quot;highlighter-rouge&quot;&gt;ng-if&lt;/code&gt;, …&lt;/p&gt;

&lt;h4 id=&quot;21-co-to-jest-iife&quot;&gt;21. Co to jest IIFE?&lt;/h4&gt;

&lt;p&gt;Na to pytanie ja odpowiedziałem! Chciałem chociaż raz móc odpowiedzieć. Przy mojej znajomości Angulara (brak realizacji żadnego projektu) powiedziałem, że IIFE to pewnego rodzaju &lt;code class=&quot;highlighter-rouge&quot;&gt;$scope&lt;/code&gt; dla Angulara.&lt;/p&gt;

&lt;p&gt;Generalnie o IIFE można opowiadać i opowiadać, a odpowiedzi musiały być jak najbardziej trafne.&lt;/p&gt;

&lt;p&gt;Każda poprawna odpowiedź kończyła się otrzymaniem od organizatorów drobnych upominków. Według mnie jest to bardzo miły gest.&lt;/p&gt;

&lt;p&gt;&lt;small&gt;Czas trwania 19:30 - 19:50&lt;/small&gt;&lt;/p&gt;

&lt;p class=&quot;chapter-break&quot;&gt;&amp;bull;&lt;/p&gt;

&lt;h2 id=&quot;talk-3-host-your-angularjs-app-like-a-pro-tomasz-wiśniewski&quot;&gt;Talk #3: Host your AngularJS app like a PRO! &lt;small&gt;Tomasz Wiśniewski&lt;/small&gt;&lt;/h2&gt;

&lt;p&gt;&lt;mark&gt;Prelekcja sponsorowana.&lt;/mark&gt;&lt;/p&gt;

&lt;p&gt;Tomasz opowiadał o &lt;a href=&quot;https://azure.microsoft.com/en-us/services/app-service/&quot;&gt;Azure App Service&lt;/a&gt;. Usługa jest za darmo do 10 produkcyjnych aplikacji internetowych.&lt;/p&gt;

&lt;p&gt;Prelekcja zachęciła mnie do skorzystania z tego narzędzia! Także, spróbujmy dać szansę. Zachęcam do podzielenia się wnioskami w komentarzach.&lt;/p&gt;

&lt;p&gt;&lt;small&gt;Czas trwania 19:50 - 20:20&lt;/small&gt;&lt;/p&gt;

&lt;p class=&quot;chapter-break&quot;&gt;&amp;bull;&lt;/p&gt;

&lt;h2 id=&quot;talk-4-ionic-kreator-interfejs-szybko-łatwo-i-przyjemnie-dariusz-biedrzycki&quot;&gt;Talk #4: Ionic kreator. Interfejs szybko łatwo i przyjemnie. &lt;small&gt;Dariusz Biedrzycki&lt;/small&gt;&lt;/h2&gt;

&lt;p&gt;Tworzenie UI w ionic-u jest żmudne oraz nudne, dlatego powstał &lt;em&gt;Ionic Creator&lt;/em&gt;, który to ma “interfejs webowy”.&lt;/p&gt;

&lt;h3 id=&quot;kiedy-ja-używam-takiego-kreatora&quot;&gt;Kiedy ja używam takiego kreatora?&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Zaczynam projekt - wyklikując go&lt;/li&gt;
  &lt;li&gt;Tworzę nowy template&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Darek pokazuje jak się obsługuje kreator Ionica. Opisuje plusy i minusy tego narzędzia na żywo. Co prawda miał przygotowane slajdy, ale publiczność opowiedziała się za prezentacja z użyciem właściwego narzędzia.&lt;/p&gt;

&lt;h3 id=&quot;-zalety&quot;&gt;&lt;i class=&quot;icon-good&quot;&gt;&lt;/i&gt; Zalety&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Szybkie tworzenie formularzy w aplikacji mobilnej&lt;/li&gt;
  &lt;li&gt;Klient od razu widzi projekt&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;-minusy&quot;&gt;&lt;i class=&quot;icon-poor&quot;&gt;&lt;/i&gt; Minusy&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Nie da się wgrać do kreatora własnego projektu&lt;/li&gt;
  &lt;li&gt;W bezpłatnej wersji można zrobić tylko 1 projekt&lt;/li&gt;
  &lt;li&gt;Statyczny &lt;code class=&quot;highlighter-rouge&quot;&gt;routing&lt;/code&gt;, czyli nie można parametryzować ścieżek&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;small&gt;Czas trwania 20:28 - 20:57&lt;/small&gt;&lt;/p&gt;

&lt;h3 id=&quot;podsumowanie&quot;&gt;Podsumowanie&lt;/h3&gt;

&lt;p&gt;Jako organizator &lt;a href=&quot;http://warsawjs.com&quot;&gt;WarsawJS&lt;/a&gt; cieszę się, że w warszawskiej społeczności developerów JavaScript, powstają nowe organizacje związane z tym językiem.&lt;/p&gt;

&lt;p&gt;Jako osoba lubiąca interakcje międzyludzkie, staram się być obecny na większości meetupów, nie zawsze mi się to udaje, ale jeśli jestem uczestnikiem takiego wydarzenia, to na 90%, kilka dni po wydarzeniu pojawi się wpis zawierający moje notatki ze spotkania.&lt;/p&gt;

&lt;p&gt;Najbliższe spotkanie AngularJS Warsaw odbędzie się za około 2 miesiące, na które organizatorzy serdecznie zapraszają!&lt;/p&gt;
</description>
            <pubDate>Sat, 25 Jun 2016 00:00:00 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2016/06/25/angularjs-warsaw-8.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2016/06/25/angularjs-warsaw-8.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/angularjs-warsaw/logo/logo-526x275.jpg</image>
        </item>
        
        <item>
            <title>Fish — shell przyjazny każdemu</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Powodem dla którego napisałem ten post jest przedstawienie ciekawej powłoki terminala, konkurenta domyślnej &lt;code class=&quot;highlighter-rouge&quot;&gt;bash&lt;/code&gt; w taki sposób, aby szybko zacząć korzystanie z niego. &lt;code class=&quot;highlighter-rouge&quot;&gt;Fish&lt;/code&gt; to o nim mowa.&lt;/p&gt;

&lt;p&gt;Nazwa jest interesująca, jednak tu nie chodzi o jakiekolwiek ryby. Rozwinięciem akronimu jest &lt;code class=&quot;highlighter-rouge&quot;&gt;Friendly Interactive Shell&lt;/code&gt;. Przychylam się do tej nazwy. Powłoka jest bardzo elastyczna. Możliwości konfiguracyjne są bardzo duże, jest ona zdecydowanie łatwiejsza w porównaniu z domyślnym &lt;code class=&quot;highlighter-rouge&quot;&gt;bash&lt;/code&gt;em - &lt;code class=&quot;highlighter-rouge&quot;&gt;Bourne-Again Shell&lt;/code&gt;.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/fish-friendly-shell/ascii-fish.png&quot; alt=&quot;Fish&quot; /&gt;

    &lt;figcaption&gt;
        Oficjalne logo powłoki.
    &lt;/figcaption&gt;

&lt;/figure&gt;

&lt;h2 id=&quot;jak-zacząć&quot;&gt;Jak zacząć?&lt;/h2&gt;

&lt;p&gt;Od kilku lat używam &lt;strong&gt;OSX&lt;/strong&gt;a. Ten artykuł będzie więc pisany z perspektywy programisty korzystającego na co dzień z tego systemu.&lt;/p&gt;

&lt;p&gt;Jestem jednak przekonany, że konfiguracja powłoki Fish, wygląda podobnie na wszystkich systemach Unixowych. Kilka lat temu moim podstawowym systemem był Linux, na którym też skonfigurowałem Fisha.&lt;/p&gt;

&lt;p&gt;Najprzyjemniejsza instalacja pakietów zawsze będzie zorientowana na wykorzystaniu managera pakietów. Jeśli chodzi o system OSX to nie ma takiego managera w domyślnej instalacji. Ze swojej strony polecam instalację &lt;a href=&quot;http://brew.sh/&quot;&gt;Homebrew&lt;/a&gt;. Bardzo prosty i wolny od błędów, przynajmniej podczas mojego kilkuletniego doświadczenia.&lt;/p&gt;

&lt;h3 id=&quot;instalacja&quot;&gt;Instalacja&lt;/h3&gt;

&lt;p&gt;Proces instalacji skupia się na wydaniu w terminalu takiego polecenia:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;brew &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;fish
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Po samej instalacji możemy przełączyć się na nową powłokę wykonując polecenie &lt;code class=&quot;highlighter-rouge&quot;&gt;fish&lt;/code&gt;. Jednak idźmy krok dalej. Skonfigurujmy środowisko tak, aby zmienić domyślną powłokę. Aby uniknąć błędu:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;ERROR: /usr/local/bin/fish: non-standard shell
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;należy w pliku &lt;code class=&quot;highlighter-rouge&quot;&gt;/etc/shells&lt;/code&gt;, w którym znajduje się lista ze wspieranymi &lt;code class=&quot;highlighter-rouge&quot;&gt;shell&lt;/code&gt;ami, dodać nowy rekord ze ścieżką do Fisha. Edytujemy plik poleceniem:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;vim /etc/shells
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;oraz dodajemy taką linijkę:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;...
/usr/local/bin/fish
...
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;dl class=&quot;question-list&quot;&gt;
    &lt;dt&gt;Skąd wiem jaka jest ścieżka do pliku binarnego?&lt;/dt&gt;
    &lt;dd&gt;Nie wiem, ale wydając polecenie &lt;code&gt;which fish&lt;/code&gt; dostaniemy ścieżkę do pliku &lt;code&gt;fish&lt;/code&gt;.&lt;/dd&gt;
&lt;/dl&gt;

&lt;h3 id=&quot;zamiana-domyślnego-shella&quot;&gt;Zamiana domyślnego shella&lt;/h3&gt;

&lt;p&gt;Do zmiany domyślnej powłoki dla obecnie zalogowanego użytkownika, korzystamy z polecenia:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;chsh &lt;span class=&quot;nt&quot;&gt;-s&lt;/span&gt; &lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;which fish&lt;span class=&quot;sb&quot;&gt;`&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Parametr &lt;code class=&quot;highlighter-rouge&quot;&gt;-s&lt;/code&gt; wymaga wskazania ścieżki do shella, uzyskujemy go dodając polecenie &lt;code class=&quot;highlighter-rouge&quot;&gt;which fish&lt;/code&gt; otaczając je znakami &lt;em&gt;backtick&lt;/em&gt;.&lt;/p&gt;

&lt;h2 id=&quot;konfiguracja-powłoki-fish&quot;&gt;Konfiguracja powłoki Fish&lt;/h2&gt;

&lt;p&gt;Każdy shell posiada możliwość konfiguracji “pod siebie”, czyli tak, aby praca w nim była przyjemnością, a nie udręką. Na przykład tworzenie aliasów skraca czas wpisywania tych samych komend. Główny plik konfiguracyjny dla powłoki Fish znajduje się w pliku:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;vim ~/.config/fish/config.fish
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Jeśli taki plik nie istnieje, to nie ma problemu, abyśmy go stworzyli. Uzupełnijmy konfigurację o podstawowy edytor powłoki. Oczywiście będzie nim &lt;em&gt;Vim&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;W pliku &lt;code class=&quot;highlighter-rouge&quot;&gt;config.fish&lt;/code&gt; wpisujemy poniższą linijkę:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;set&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-U&lt;/span&gt; EDITOR vim
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Tworzy ona uniwersalną zmienną &lt;code class=&quot;highlighter-rouge&quot;&gt;$EDITOR&lt;/code&gt;. Po restarcie powłoki, pod zmienną środowiskową &lt;code class=&quot;highlighter-rouge&quot;&gt;$EDITOR&lt;/code&gt; będzie znajdował się edytor &lt;em&gt;Vim&lt;/em&gt;. Dlaczego to jest takie ważne? Wiele narzędzi korzysta z tej zmiennej, aby użyć edytora podczas swoich prac, np. polecenie &lt;code class=&quot;highlighter-rouge&quot;&gt;git commit&lt;/code&gt; korzysta z domyślnego edytora, aby zaprezentować developerowi zmiany w projekcie (jeśli takie istnieją).&lt;/p&gt;

&lt;p&gt;Bardzo prosty przykład pliku konfiguracyjnego &lt;code class=&quot;highlighter-rouge&quot;&gt;~/.config/fish/config.fish&lt;/code&gt;&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# Setup default editor&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;set&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-u&lt;/span&gt; editor vim

&lt;span class=&quot;c&quot;&gt;# Disable default greeting message&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;set &lt;/span&gt;fish_greeting

&lt;span class=&quot;c&quot;&gt;# Load private aliases&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;source&lt;/span&gt; ~/.aliases
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;vim-na-fishu&quot;&gt;Vim na Fishu?&lt;/h2&gt;

&lt;p&gt;Aby uniknąć błędu:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;syntastic: error: your shell /usr/local/bin/fish can&lt;span class=&quot;s1&quot;&gt;'t handle traditional UNIX syntax for redirections
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Trzeba do konfiguracji &lt;em&gt;Vima&lt;/em&gt;, czyli w pliku &lt;code class=&quot;highlighter-rouge&quot;&gt;.vimrc&lt;/code&gt; ustawić domyślną powłokę&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;set &lt;/span&gt;&lt;span class=&quot;nv&quot;&gt;shell&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;bash
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Więcej o błędzie można przeczytać w &lt;a href=&quot;https://github.com/fish-shell/fish-shell/issues/2701&quot;&gt;tym&lt;/a&gt; issue.&lt;/p&gt;

&lt;h2 id=&quot;pytania-i-odpowiedzi&quot;&gt;Pytania i odpowiedzi&lt;/h2&gt;

&lt;dl class=&quot;question-list&quot;&gt;
    &lt;dt&gt;Pyt. Jakie są zalety?&lt;/dt&gt;
    &lt;dd&gt;
        Zalet jest dużo. Największe zalety to: duża społeczność, autosugestie, proste skrypty z konfiguracją, podpowiadanie &lt;code&gt;man&lt;/code&gt;a.
    &lt;/dd&gt;

    &lt;dt&gt;Pyt. Jakiego języka trzeba używać pisząc skrypty dla Fisha?&lt;/dt&gt;
    &lt;dd&gt;
        Pisząc skrypty będziemy używali &lt;code&gt;shell&lt;/code&gt;a według składni Posix.
    &lt;/dd&gt;

    &lt;dt&gt;Pyt. Gdzie jest miejsce na trzymanie konfiguracji powłoki?&lt;/dt&gt;
    &lt;dd&gt;
        Plik ze wszelką konfiguracją związaną z &lt;code&gt;Fish&lt;/code&gt;em znajduje się w katalog &lt;code&gt;~/.config/fish/&lt;/code&gt;.
        Główny plik konfiguracyjny jest w tym katalogu pod nazwą &lt;code&gt;config.fish&lt;/code&gt;.
    &lt;/dd&gt;

    &lt;dt&gt;Pyt. Jakie rozszerzenie jest wymagane, aby skrypt był brany pod uwagę przez powłokę Fish?&lt;/dt&gt;
    &lt;dd&gt;
        Nie ma żadnego wymaganego rozszerzenia. Można w katalogu &lt;code&gt;~/.config/fish/functions/&lt;/code&gt;
        tworzyć pliki z dowolnym rozszerzeniem, a nawet bez niego.
    &lt;/dd&gt;

    &lt;dt&gt;Pyt. Czy nazwa pliku w katalogu &lt;code&gt;~/.config/fish/functions/&lt;/code&gt; ma znaczenie?&lt;/dt&gt;
    &lt;dd&gt;
        Tak. Nazwa pliku musi odpowiadać funkcji, która zostanie dodana to środowiska i będzie dostapna
        jako polecenie. Rozszerzenie nie jest ważne.
    &lt;/dd&gt;

    &lt;dt&gt;Pyt. Czy można w konfiguracji &lt;code&gt;config.fish&lt;/code&gt; definiować funkcje?&lt;/dt&gt;
    &lt;dd&gt;
        Nie. Tam definiuje się tylko pojedyncze ustawienia - każde w innej linii.
        Funkcje definiujemy w katalogu &lt;code&gt;~/.config/fish/functions/&lt;/code&gt;.
    &lt;/dd&gt;

    &lt;dt&gt;Pyt. Jak zmienić domyślny &lt;code&gt;prompt&lt;/code&gt;?&lt;/dt&gt;
    &lt;dd&gt;
        Wystarczy stworzyć plik &lt;code&gt;~/.config/fish/fish_prompt.fish&lt;/code&gt; i stworzyć w nim funkcję
        o nazwie &lt;code&gt;fish_prompt&lt;/code&gt;. Przykład:

&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;
function fish_prompt
    echo ' &amp;gt; '
end
&lt;/code&gt;&lt;/pre&gt;

    &lt;/dd&gt;

    &lt;dt&gt;Co to jest &lt;code&gt;fish_right_prompt&lt;/code&gt;?&lt;/dt&gt;
    &lt;dd&gt;
        &lt;code&gt;prompt&lt;/code&gt; jest to tzw. znak zachęty. Znajduje się on zawsze po lewej stronie.
        Od tej wartości zaczyna się linia w której na końcu mam ustawiony kursor, gdzie możemy coś wpisać.
        Jednak co jeśli chcielibyśmy wpisać coś po prawej stronie? Mamy możliwość poprzez funkcję:

&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;
function fish_right_prompt
    echo (date '+%H:%M:%S)
end
&lt;/code&gt;&lt;/pre&gt;

        &lt;p&gt;
            Jak to będzie wyglądało w praktyce? Poniżej przykład.
        &lt;/p&gt;

        &lt;figure&gt;
            &lt;img src=&quot;/assets/images/posts/fish-friendly-shell/fish-right-prompt.png&quot; alt=&quot;&quot; /&gt;

            &lt;figcaption&gt;
                Powyższa funkcja w praktyce.
            &lt;/figcaption&gt;
        &lt;/figure&gt;

        &lt;p&gt;
            Więcej detali można znaleźć w
            &lt;a href=&quot;https://fishshell.com/docs/current/commands.html#fish_right_prompt&quot;&gt;oficjalnej dokumentacji&lt;/a&gt;.
        &lt;/p&gt;
    &lt;/dd&gt;

&lt;/dl&gt;

&lt;h2 id=&quot;ciekawostki&quot;&gt;Ciekawostki&lt;/h2&gt;

&lt;h3 id=&quot;design&quot;&gt;Design&lt;/h3&gt;

&lt;p&gt;Rzadko kiedy spotyka się tak dobrze zapisane zasady projektu, jak ma to miejsce w przypadku Fisha. Pełna lista praw i zasad dostępna jest &lt;a href=&quot;https://fishshell.com/docs/current/design.html&quot;&gt;tutaj&lt;/a&gt;. W dokumencie znajduje się lista następujących praw: “The law of orthogonality”, “The law of responsiveness”, “The law of user focus” oraz “The law of discoverability”.&lt;/p&gt;

&lt;p&gt;Bardzo ciekawym prawem jest zasada, że jeśli wystąpi sytuacja, że 2 rozwiązania jest zaimplementowane podobnie, ale nie są identyczne, to jedno z nich trzeba usunąć a to drugie ulepszyć. Taka zasada powinna panować w każdym managerze paczek, np. w &lt;em&gt;npm&lt;/em&gt;. Tylko kto by weryfikował każdą paczkę?&lt;/p&gt;

&lt;p&gt;Kolejne ciekawe prawo mówi, żeby doprowadzić do sytuacji, aby w jak najkrótszym czasie nowy użytkownik stał się ekspertem w danym narzędziu. Jest to oznaką zaprojektowania szybkiego wykrywania / odnajdywania nowych opcji programu. Każda funkcja powinna posiadać komentarz, aby była bardziej zrozumiała, jeszcze przed użyciem.&lt;/p&gt;

&lt;h3 id=&quot;zdarzenia&quot;&gt;Zdarzenia&lt;/h3&gt;

&lt;p&gt;Bardzo ciekawe jest to, że powłoka umożliwia nam nasłuchiwania na zdarzeniach. Pierwszy raz spotykam się z taką możliwości, że np. jedno polecenie / narzędzie emituje zdarzenie, a inne nasłuchuje na nie i się uruchamia.&lt;/p&gt;

&lt;p&gt;Więcej w tym temacie jest dostępne &lt;a href=&quot;https://fishshell.com/docs/current/index.html#event&quot;&gt;tutaj&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;mój-sposób-na-dotfiles&quot;&gt;Mój sposób na &lt;code class=&quot;highlighter-rouge&quot;&gt;dotfiles&lt;/code&gt;&lt;/h2&gt;

&lt;p&gt;W dzisiejszych czasach, developerzy mają swoje serwery np. na hosting, vps-y. Tam też chcielibyśmy mieć &lt;code class=&quot;highlighter-rouge&quot;&gt;fish&lt;/code&gt; shella. Jak przenieść całą konfigurację na serwer?&lt;/p&gt;

&lt;p&gt;Pomysłem jest stworzenie projektu &lt;code class=&quot;highlighter-rouge&quot;&gt;dotfiles&lt;/code&gt; z naszą konfiguracją środowiska pracy. Wystarczy na serwerze (miejscu docelowym) pobrać repozytorium i rozpropagować konfigurację w odpowiednie miejsce.&lt;/p&gt;

&lt;p&gt;Ze względu na liczbę konfiguracji środowiska większą niż 1 plik, warto skorzystać z narzędzia &lt;code class=&quot;highlighter-rouge&quot;&gt;rsync&lt;/code&gt;, które zadba od skopiowanie / nadpisanie plików z projektu &lt;code class=&quot;highlighter-rouge&quot;&gt;dotfiles&lt;/code&gt; w zdefiniowane przez nas miejsce. Osobiście używam takiego polecenia do instalacji konfiguracji powłoki &lt;code class=&quot;highlighter-rouge&quot;&gt;Fish&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;rsync &lt;span class=&quot;nt&quot;&gt;-rv&lt;/span&gt; ~/projects/dotfiles/.config/fish/&lt;span class=&quot;k&quot;&gt;*&lt;/span&gt; ~/.config/fish/
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Ze względu na tak długie polecenie polecam stworzyć sobie skrypt &lt;em&gt;shellowy&lt;/em&gt;, w którym wyżej wymieniona linijka znajdzie swoje miejsce. Dzięki takiemu skryptowi będzie możliwość dodania jeszcze innych konfiguracji, np. &lt;em&gt;Vima&lt;/em&gt;, Gita.&lt;/p&gt;

&lt;p class=&quot;chapter-break&quot;&gt;&amp;bull;&lt;/p&gt;

&lt;h2 id=&quot;its-demo-time-&quot;&gt;It’s DEMO time! 🎉&lt;/h2&gt;

&lt;figure&gt;
    &lt;img src=&quot;https://fishshell.com/assets/img/screenshots/autosuggestion.png&quot; alt=&quot;&quot; /&gt;
    &lt;figcaption&gt;
        Feature: &lt;strong&gt;Autosugestie&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;figure&gt;
    &lt;img src=&quot;https://fishshell.com/assets/img/screenshots/works_out_of_the_box.png&quot; alt=&quot;&quot; /&gt;
    &lt;figcaption&gt;
        Feature: &lt;strong&gt;Sugestie do różnych poleceń&lt;/strong&gt;
    &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p class=&quot;chapter-break&quot;&gt;&amp;bull;&lt;/p&gt;

&lt;h2 id=&quot;źródła-warte-przeczytania&quot;&gt;Źródła warte przeczytania&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;Strona główna projektu &lt;a href=&quot;http://fishshell.com/&quot;&gt;fish-shell&lt;/a&gt;.&lt;/li&gt;
  &lt;li&gt;Oficjalny &lt;a href=&quot;https://fishshell.com/docs/current/tutorial.html&quot;&gt;tutorial&lt;/a&gt; do nauki Fisha.&lt;/li&gt;
  &lt;li&gt;Jeśli ktoś chciałby zobaczyć źródła powłoki to &lt;a href=&quot;https://github.com/fish-shell/fish-shell&quot;&gt;projekt jest dostępny na GitHubie&lt;/a&gt;.&lt;/li&gt;
  &lt;li&gt;Możliwość prezentacji w &lt;code class=&quot;highlighter-rouge&quot;&gt;prompt&lt;/code&gt; informacji o &lt;a href=&quot;https://github.com/michaeldfallen/git-radar&quot;&gt;statusie projektu wersjonowanego przez Gita&lt;/a&gt;.&lt;/li&gt;
  &lt;li&gt;Szukasz pluginu? Wypróbuj: &lt;a href=&quot;https://github.com/oh-my-fish/oh-my-fish&quot;&gt;oh-my-fish&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Dobra wiadomość dla użytkowników Windowsa&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Dostępna jest opcja &lt;strong&gt;FISHa z Cygwinem!&lt;/strong&gt;&lt;/p&gt;
</description>
            <pubDate>Mon, 30 May 2016 00:00:00 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2016/05/30/fish-shell-przyjazny-kazdemu.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2016/05/30/fish-shell-przyjazny-kazdemu.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/fish-friendly-shell/ascii-fish.png</image>
        </item>
        
        <item>
            <title>Popularny błąd w obsłudze zdarzeń w JavaScript</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Chciałbym dzisiaj przedstawić problem z jakim możecie się spotkać podczas obsługi zdarzeń. Naturą języka jest asynchroniczność, spotykana jest w wielu miejscach. Asynchroniczne zapytania do serwera, czyli AJAX, to technika bardzo popularna w dzisiejszych czasach.&lt;/p&gt;

&lt;p&gt;Pewnym rodzajem asynchroniczności są też zdarzenia aplikacji. Częsty problem początkujących developerów objawia się tym, że próbują oni dostać się do DOMu, kiedy nie jest on jeszcze załadowany. Trzeba wtedy skorzystać z &lt;code class=&quot;highlighter-rouge&quot;&gt;window.onload&lt;/code&gt; (albo lepszej formy &lt;code class=&quot;highlighter-rouge&quot;&gt;window.addEventListener('DOMContentLoaded', ...')&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Ewentualnie można skorzystać z &lt;code class=&quot;highlighter-rouge&quot;&gt;load&lt;/code&gt; (&lt;code class=&quot;highlighter-rouge&quot;&gt;window.addEventListener('load', ...)&lt;/code&gt; jeśli event &lt;code class=&quot;highlighter-rouge&quot;&gt;DOMContentLoaded&lt;/code&gt; nie jest wspierany.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/post-banner-javascript.png&quot; itemprop=&quot;image&quot; alt=&quot;Baner promujący artykuł&quot; /&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;customowe-eventy&quot;&gt;Customowe eventy&lt;/h2&gt;

&lt;p&gt;Customowe eventy, to bardzo popularny wzorzec w aplikacjach webowych. Zdarzenia te nie są wyzwalane przez interakcję użytkownika, tylko przez samą aplikację. Dobrym przykładem może być zapytanie do serwera.&lt;/p&gt;

&lt;p&gt;Zerknijmy na taki kod:&lt;/p&gt;

&lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;ajax&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;req&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Request&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;req&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;on&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'load'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;nx&quot;&gt;Request&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;emit&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'success'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;});&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;req&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;on&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'error'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;nx&quot;&gt;Request&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;emit&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'error'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;});&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Mamy zapytanie do serwera, gdzie na zakończenie wyzwolone zostanie odpowiednie zdarzenie. Kiedy zapytanie się powiedzie, zostanie wyzwolone zdarzenie &lt;code class=&quot;highlighter-rouge&quot;&gt;success&lt;/code&gt;, w przypadku błędu - &lt;code class=&quot;highlighter-rouge&quot;&gt;error&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Chcielibyśmy teraz skorzystać z funkcji &lt;code class=&quot;highlighter-rouge&quot;&gt;ajax&lt;/code&gt;, aby pobrać dane dotyczące użytkownika. Wykonujemy więc taki kod:&lt;/p&gt;

&lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nx&quot;&gt;Request&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;once&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'success'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;response&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;loadUserProfile&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;response&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;});&lt;/span&gt;
&lt;span class=&quot;nx&quot;&gt;Request&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;once&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'error'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;loadFailUserPage&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;});&lt;/span&gt;
&lt;span class=&quot;nx&quot;&gt;ajax&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'/user'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Nasłuchujemy na 2 zdarzenia:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;na &lt;strong&gt;poprawne&lt;/strong&gt; pobranie danych z serwera wyświetlamy profil użytkownika&lt;/li&gt;
  &lt;li&gt;kiedy zapytania zakończy się &lt;strong&gt;niepowodzeniem&lt;/strong&gt; wyświetlamy błąd załadowania profilu&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Na pierwszy rzuta oka nie ma tutaj nic dziwnego. A jednak. Co jeśli skorzytamy z funkcji &lt;code class=&quot;highlighter-rouge&quot;&gt;ajax&lt;/code&gt; w innym miejscu? Chcemy pobrać zawartość kategorii produktów w sklepie internetowym, korzystając oczywiście z funkcji &lt;code class=&quot;highlighter-rouge&quot;&gt;ajax&lt;/code&gt;.&lt;/p&gt;

&lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nx&quot;&gt;Request&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;once&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'success'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;response&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;loadCategory&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;response&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;});&lt;/span&gt;
&lt;span class=&quot;nx&quot;&gt;Request&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;once&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'error'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;loadErrorCategoryPage&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;});&lt;/span&gt;
&lt;span class=&quot;nx&quot;&gt;ajax&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'/category/1234'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Mamy problem&lt;/strong&gt;. Dlaczego? Bo nie wyrejestrowaliśmy handlerów z pierwszego zapytania. Powiecie: “No ale przecież używamy tam &lt;code class=&quot;highlighter-rouge&quot;&gt;once&lt;/code&gt;, to handler sam się wyrejestruje po wykonaniu zdarzenia.” Zgadza się, ale tylko &lt;strong&gt;użyty&lt;/strong&gt; handler się wyrejestruje. Nigdy nie będzie sytuacji, że zapytanie uruchomi dwa zdarzenie &lt;code class=&quot;highlighter-rouge&quot;&gt;success&lt;/code&gt; i &lt;code class=&quot;highlighter-rouge&quot;&gt;error&lt;/code&gt;.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/event-handling-mistake/error-handling-mistake.jpg&quot; alt=&quot;&quot; /&gt;

    &lt;figcaption&gt;
        Diagram z opisywaną sytuacją. Zakreśliłem problem jaki się pojawił owalem.
    &lt;/figcaption&gt;

&lt;/figure&gt;

&lt;h2 id=&quot;rozwiązanie-problemu&quot;&gt;Rozwiązanie problemu&lt;/h2&gt;

&lt;p&gt;Jest kilka rozwiązań opisywanego przeze mnie problemu. Najlepsze (dla użytego kodu) jest takie, aby w dowolnym handlerze wyrejestrować oba handlery.&lt;/p&gt;

&lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;categoryHelperSuccess&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;response&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;loadCategory&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;response&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;clearCategoryHelpers&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// Usuwamy niepotrzebne handler&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;categoryHelperError&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;loadErrorCategoryPage&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;clearCategoryHelpers&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;// Usuwamy nasłuchiwanie na zdarzenia: success i error,&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;// aby zapobiec problemowi uruchamiania niepotrzebnych handlerów.&lt;/span&gt;
&lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;clearCategoryHelpers&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;Request&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;off&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'success'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;categoryHelperSuccess&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;Request&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;off&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'error'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;categoryHelperError&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;nx&quot;&gt;Request&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;once&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'success'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;categoryHelperSuccess&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;nx&quot;&gt;Request&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;once&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'error'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;categoryHelperError&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

&lt;span class=&quot;nx&quot;&gt;ajax&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'/category/1234'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Najlepsze rozwiązanie leży u podstaw tego kodu. Nie należy zapisywać się na zdarzenia obiektu współdzielonego. Wtedy nie będzie problemu. Lepsze rozwiązania w tym przypadku to używanie &lt;code class=&quot;highlighter-rouge&quot;&gt;Promise&lt;/code&gt;-ów albo &lt;code class=&quot;highlighter-rouge&quot;&gt;callback&lt;/code&gt;-ów.&lt;/p&gt;

&lt;h2 id=&quot;testowy-projekt&quot;&gt;Testowy projekt&lt;/h2&gt;

&lt;p&gt;Stworzyłem na potrzeby tego artykułu &lt;a href=&quot;https://github.com/piecioshka/test-event-handling-mistake&quot;&gt;projekt na GitHubie&lt;/a&gt;. Chciałem pokazać Wam jak na faktycznym kodzie, objawia się opisywany przeze mnie problem.&lt;/p&gt;

&lt;p&gt;Wystarczy uruchomić przykład w przeglądarce (plik &lt;code class=&quot;highlighter-rouge&quot;&gt;demo/index.html&lt;/code&gt;), albo w terminalu uruchomić polecenie &lt;code class=&quot;highlighter-rouge&quot;&gt;node index.js&lt;/code&gt;, aby zobaczyć opisywany problem. Poniżej zrzut ekranu z błędem.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/event-handling-mistake/screenshot.png&quot; alt=&quot;&quot; /&gt;

    &lt;figcaption&gt;
        Błąd, który pojawi się w konsoli po stworzenie opisywanej
        architektury.
    &lt;/figcaption&gt;

&lt;/figure&gt;
</description>
            <pubDate>Fri, 27 May 2016 00:00:00 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2016/05/27/popularny-blad-w-obsludze-zdarzen-w-js.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2016/05/27/popularny-blad-w-obsludze-zdarzen-w-js.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/post-banner-javascript.png</image>
        </item>
        
        <item>
            <title>Recenzja: "Tajniki języka JavaScript. Na drodze do biegłości"</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Przeczytałem kolejną książkę z serii &lt;code class=&quot;highlighter-rouge&quot;&gt;You Don't Know JS&lt;/code&gt; (&lt;strong&gt;YDKJS&lt;/strong&gt;). Tym razem wziąłem na warsztat książkę pt. &lt;em&gt;Tajniki języka JavaScript. Na drodze do biegłości&lt;/em&gt;. Generalnie, to zacząłem czytanie serii w nieodpowiedniej kolejności. Seria YDKJS rozpoczyna się właśnie tą książką, a przeczytałem dopiero ją teraz. Mam nadzieje, że przeczytanie jej w drugiej kolejności, zaraz po &lt;em&gt;Tajniki języka JavaScript. Zakresy i domknięcia&lt;/em&gt;, nie będzie stanowiło dla mnie problemu.&lt;/p&gt;

&lt;p&gt;Zdradzę Wam sekret. Nie stanowiło.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/ydkjs/ydkjs-526x275.jpg&quot; itemprop=&quot;image&quot; alt=&quot;Baner promujący artykuł&quot; /&gt;
&lt;/figure&gt;

&lt;p&gt;Autor serii, Kyle Simpson, pod koniec książki stworzył rozdział, gdzie opisał pokrótce całą serię i zdefiniował kolejność czytania. Przedstawia się ona następująco:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;a href=&quot;http://helion.pl/ksiazki/tjndro.htm&quot;&gt;Tajniki języka JavaScript. Na drodze do biegłości&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://helion.pl/ksiazki/tjszak.htm&quot;&gt;Tajniki języka JavaScript. Zakresy i domknięcia&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://helion.pl/ksiazki/tajejs.htm&quot;&gt;Tajniki języka JavaScript. Wskaźnik this i prototypy obiektów&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://helion.pl/ksiazki/tjtypy.htm&quot;&gt;Tajniki języka JavaScript. Typy i składnia&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://helion.pl/ksiazki/tjsasy.htm&quot;&gt;Tajniki języka JavaScript. Asynchroniczność i wydajność&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://helion.pl/ksiazki/tajnjs.htm&quot;&gt;Tajniki języka JavaScript. ES6 &amp;amp; Beyond&lt;/a&gt; (dostępna od sierpnia 2016)&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;promowanie-wydawnictwa-helion&quot;&gt;Promowanie wydawnictwa Helion&lt;/h2&gt;

&lt;p&gt;Cała seria dostępna jest &lt;a href=&quot;http://helion.pl/seria-JS.phtml&quot;&gt;tutaj&lt;/a&gt;. Helion przygotował landing page, aby reklamować YDKJS. Świetny pomysł. Uważam, że Helion od jakiegoś bardziej dba o marketing, i robi często promocje i oferty specjalne. Pamiętam, że jakoś 2-3 lata temu tak niestety nie było.&lt;/p&gt;

&lt;p&gt;Nawet przed chwilą dostałem maila, pt: “&lt;em&gt;Dzień Matki - skomponuj książkowy bukiet w promocji 3za2&lt;/em&gt;”. Moją mamę, raczej nie interesują komputery, więc akurat nie trafili, ale za sam pomysł należą się brawa.&lt;/p&gt;

&lt;p&gt;Może i reklamuję wydawnictwo Helion swoim wpisem, ale nie widzę w tym nic dziwnego. Za dobre rzeczy należą się pochwały.&lt;/p&gt;

&lt;p class=&quot;center-text&quot;&gt;
    Helion wykonuje dla nas (programistów) bardzo dobrą robotę.
&lt;/p&gt;

&lt;p&gt;Każdy popełnia błędy, myślę, że Helion sam też wie, kiedy w książkę jest błąd czy to związany z tłumaczeniem, czy błąd merytoryczny, ale może wtedy jest już za późno na poprawę? Przecież rzadko, kto z nas czyta erraty.&lt;/p&gt;

&lt;p&gt;Ważne, aby unikać tłumaczenia kodu źródłowego po polsku. Inaczej można uzyskać jakieś “pieseły” albo inne ciekawe polsko-brzmiące słowa.&lt;/p&gt;

&lt;figure class=&quot;social-center-block&quot;&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;pl&quot; dir=&quot;ltr&quot;&gt;Czas na drugą książkę z serii &lt;a href=&quot;https://twitter.com/YDKJS?ref_src=twsrc%5Etfw&quot;&gt;@YDKJS&lt;/a&gt; &lt;a href=&quot;https://twitter.com/hashtag/read?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#read&lt;/a&gt; &lt;a href=&quot;https://twitter.com/hashtag/book?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#book&lt;/a&gt; &lt;a href=&quot;https://t.co/uCn5TTdXA5&quot;&gt;pic.twitter.com/uCn5TTdXA5&lt;/a&gt;&lt;/p&gt;&amp;mdash; Piotr Kowalski (@piecioshka) &lt;a href=&quot;https://twitter.com/piecioshka/status/734829087135522817?ref_src=twsrc%5Etfw&quot;&gt;May 23, 2016&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async=&quot;&quot; src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;

&lt;/figure&gt;

&lt;h2 id=&quot;oryginalna-wersja&quot;&gt;Oryginalna wersja&lt;/h2&gt;

&lt;p&gt;W poprzednim &lt;a href=&quot;%7B%%20post_url%202016-05-20-ksiazka-tajniki-jezyka-javascript-zakresy-i-domkniecia%20%%7D&quot;&gt;wpisie&lt;/a&gt; wyjaśniłem, dlaczego czytam książki po polsku. Jednak nie chciałbym, byście mnie żle zrozumieli. Nasza branża rozwija się non stop. Codziennie powstają nowe rzeczy dotyczące JavaScript oraz całego Front-end-u.&lt;/p&gt;

&lt;p&gt;Jeśli ktoś chce być na bieżąco ze wszystkimi nowinkami technicznymi, to musi opanować język angielskim, przynajmniej w takim stopniu, aby pozwolił mu czytać, posiłkując się od czasu do czasu słownikiem ang-pol.&lt;/p&gt;

&lt;p&gt;Seria książek YDKJS wydana przez Helion, jest po prostu przetłumaczona z jakiegoś czasu, kiedy specyfikacja ES6 nie była jeszcze w zatwierdzona. Miało to miejsce 17 czerwca 2015 roku. Tak więc, od 11 miesięcy najnowszy standard nosi nazwę ES2015 (a.k.a. ES6).&lt;/p&gt;

&lt;p&gt;Czytając książki z serii YDKJS, możemy czasami widzieć, że autor nie był jeszcze pewien jak będzie wyglądała specyfikacja. Często to podkreśla, informując czytelnika, że kod może być przestarzały.&lt;/p&gt;

&lt;p&gt;Oryginalną wersję &lt;code class=&quot;highlighter-rouge&quot;&gt;YDKJS: Up &amp;amp; Going&lt;/code&gt; znajdziesz na GitHubie pod &lt;a href=&quot;https://github.com/getify/You-Dont-Know-JS/tree/master/up%20%26%20going&quot;&gt;tym&lt;/a&gt; linkiem.&lt;/p&gt;

&lt;h2 id=&quot;moje-notatki&quot;&gt;Moje notatki&lt;/h2&gt;

&lt;p&gt;Chciałbym przedstawić teraz moje notatki, które pojawiły się podczas czytania &lt;em&gt;TJJS. Na drodze do biegłości&lt;/em&gt;. Tym razem przykleiłem w książce 17 karteczek znajdując przy tym tylko 2 błędy. Błędy te bardziej były wynikiem złego tłumaczenia, niż w braku wiedzy na temat JavaScript.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/review-ydkjs-up-going/IMG_2348.JPG&quot; alt=&quot;&quot; /&gt;

    &lt;figcaption&gt;
        Sticker 1. Strona 13. Tekst z karteczki: Książka wprowadza do
        programowania. Jest to pierwszy tom z serii YDKJS.
    &lt;/figcaption&gt;

&lt;/figure&gt;

&lt;p&gt;Jak już wspomniałem na początku wpisu, książka jest skierowana do wszystkich tych, którzy chcą zacząć swoją przygodę z programowaniem od JavaScriptu. Pierwszy tom serii &lt;code class=&quot;highlighter-rouge&quot;&gt;YDKJS&lt;/code&gt; (w polskim tłumaczeniu &lt;code class=&quot;highlighter-rouge&quot;&gt;TJJS&lt;/code&gt;) porusza podstawowe kwestie języka, takie jak opis składni, zmiennych, typów, domknięć itd.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/review-ydkjs-up-going/IMG_2349.JPG&quot; alt=&quot;&quot; /&gt;

    &lt;figcaption&gt;
        Sticker 2. Strona 14. Tekst z karteczki: Wartość literalna? Co to?
    &lt;/figcaption&gt;

&lt;/figure&gt;

&lt;p&gt;Znalazłem w słowniku PWN informację, że &lt;em&gt;literalny&lt;/em&gt; to synonim słowa &lt;em&gt;dosłowny&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Myślałem, że literalny to może być tylko obiekt, ale tu chodzi o polskie tłumaczenie, gdzie znaczenie jest trochę inne.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/review-ydkjs-up-going/IMG_2350.JPG&quot; alt=&quot;&quot; /&gt;

    &lt;figcaption&gt;
        Sticker 3. Strona 23. Tekst z karteczki: &quot;literał&quot; czy to synonim &quot;wartości literalnych&quot;?
    &lt;/figcaption&gt;

&lt;/figure&gt;

&lt;p&gt;Według &lt;a href=&quot;https://pl.wikipedia.org/wiki/Litera%C5%82&quot;&gt;Wikipedii&lt;/a&gt;, słowem &lt;em&gt;literał&lt;/em&gt; oznaczana jest jednostka leksykalna reprezentująca ustaloną wartość (liczbową, tekstową itp.) wpisaną przez programistę bezpośrednio w danym miejscu w kod programu. (…) Poza tym funkcje anonimowe są literałami dla typu funkcyjnego. (…) W przeciwieństwie do literałów, stałe i zmienne są identyfikatorami (…).&lt;/p&gt;

&lt;p&gt;Po tych wytłumaczeniach dalej bałbym się zastępować określenie &lt;code class=&quot;highlighter-rouge&quot;&gt;literał&lt;/code&gt; wartością literalna. No trudno. Może kiedyś spotkam polonistę, który by mi to wytłumaczył.&lt;/p&gt;

&lt;p&gt;**Uwaga**: Aktualizacja wiedzy dzięki &lt;a href=&quot;http://www.wykop.pl/wpis/17861693/#comment-62973955&quot;&gt;komentarzowi&lt;/a&gt; na &lt;a href=&quot;https://www.wykop.pl&quot;&gt;Wykop.pl&lt;/a&gt; autorstwa &lt;a href=&quot;https://www.wykop.pl/ludzie/obereczekpl/&quot;&gt;obereczekpl&lt;/a&gt;, możemy się dowiedzieć, że (cytuję):&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Literał to zapis wartości literalnej, czy bardziej “czegoś” co posiada taką wartość lub jest takim wyrażeniem.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/review-ydkjs-up-going/IMG_2351.JPG&quot; alt=&quot;&quot; /&gt;

    &lt;figcaption&gt;
        Sticker 4. Strona 24. Tekst z karteczki: koercja? Co to?
        Jakie jest dokładne znaczenie?
    &lt;/figcaption&gt;

&lt;/figure&gt;

&lt;p&gt;Idąc dalej &lt;a href=&quot;http://www.wykop.pl/wpis/17861693/#comment-62973955&quot;&gt;za komentarzem&lt;/a&gt;, na portalu &lt;a href=&quot;https://www.wykop.pl&quot;&gt;Wykop.pl&lt;/a&gt;, możemy opisać różnicą między koercją a rzutowaniem w sposób następujący (cytuję użytkownika &lt;a href=&quot;https://www.wykop.pl/ludzie/obereczekpl/&quot;&gt;obereczekpl&lt;/a&gt;):&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;“koercja” to niejako wymuszanie rzutowania, rzutowanie niejawne, dziejące się automatycznie&lt;/li&gt;
  &lt;li&gt;“rzutowanie” to zmiana typu, które może być jawne i niejawne (czyli wtedy gdy wprost mówimy “zrzutuj mi tę zmienną do tego typu”), jednak użyte samodzielnie oznacza rzutowanie jawne&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Podsumowując: &lt;strong&gt;Koercja i rzutowanie&lt;/strong&gt; to nie synonimy.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/review-ydkjs-up-going/IMG_2352.JPG&quot; alt=&quot;&quot; /&gt;

    &lt;figcaption&gt;
        Sticker 5. Strona 25. Tekst z karteczki: &quot;kod tworzysz nie tylko
        dla komputera&quot; święta racja!
    &lt;/figcaption&gt;

&lt;/figure&gt;

&lt;p&gt;To zdanie to jest święta racja. Kod, który piszemy, nie piszemy dla komputera, on jest dla nas, developerów. Komputer zrozumie dziwną składnię, człowiek już nie.&lt;/p&gt;

&lt;p&gt;Jestem tego zdania, że kod trzeba pisać taki, aby się za niego nie wstydzić, kiedy do Twojego projektu dołączy nowa osoba i będzie musiała się w niego wdrożyć.&lt;/p&gt;

&lt;p&gt;Bardzo dobrym zwyczajem jest pisać komentarze. Po kilku latach doświadczenia z językiem, przyjąłem takie zasady:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;w funkcjach, metodach i procedurach, piszę &lt;strong&gt;komentarze jednolinijkowe&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;nad funkcjami piszę JSDoc, do tworzenia którego wykorzystuję &lt;strong&gt;komentarze wielolinijkowe&lt;/strong&gt;, korzystając ze specyfikacji tagów. Polecam przejrzeć wszystkie wspierane tagi na stronie &lt;a href=&quot;http://usejsdoc.org&quot;&gt;usejsdoc.org&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/review-ydkjs-up-going/IMG_2353.JPG&quot; alt=&quot;&quot; /&gt;

    &lt;figcaption&gt;
        Sticker 6. Strona 26. Tekst z karteczki: &quot;komentarze powinny
        wyjaśniać &lt;strong&gt;dlaczego?&lt;/strong&gt;, a nie &lt;strong&gt;co?&lt;/strong&gt;&quot;
    &lt;/figcaption&gt;

&lt;/figure&gt;

&lt;p&gt;Kolejna mądrość. Czasami zdarza mi się zobaczyć taki kod:&lt;/p&gt;

&lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;// Tworzę nowy obiekt&lt;/span&gt;
&lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;fred&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Person&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Jak sens ma ten komentarz? Żaden. Bez sensu jest tworzyć komentarz, które opisują co tu się robi. Przecież to widać po kodzie źródłowym. Zdecydowane lepiej było napisać tak:&lt;/p&gt;

&lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;// Obiekt nowej osoby potrzebny, aby zarządzać jego danymi w procesie xyz.&lt;/span&gt;
&lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;fred&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Person&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/review-ydkjs-up-going/IMG_2354.JPG&quot; alt=&quot;&quot; /&gt;

    &lt;figcaption&gt;
        Sticker 7. Strona 29. Tekst z karteczki: A czy &lt;code&gt;toFixed&lt;/code&gt;
        nie zwraca zawsze stringa?
    &lt;/figcaption&gt;

&lt;/figure&gt;

&lt;p&gt;W książce jest napisane, że: &lt;em&gt;Jeżeli zachodzi konieczność to generowany jest ciąg tekstowy (string)&lt;/em&gt;. Według specyfikacji, to &lt;code class=&quot;highlighter-rouge&quot;&gt;toFixed&lt;/code&gt; zawsze zwraca stringa, nie tylko gdy zachodzi konieczność. Więcej informacji w &lt;a href=&quot;http://es5.github.io/#x15.7.4.5&quot;&gt;specyfikacji&lt;/a&gt;.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/review-ydkjs-up-going/IMG_2355.JPG&quot; alt=&quot;&quot; /&gt;

    &lt;figcaption&gt;
        Sticker 8. Strona 45. Tekst z karteczki: &lt;code&gt;void&lt;/code&gt; chyba
        przypisując wynik tego operatora do zmiennej
    &lt;/figcaption&gt;

&lt;/figure&gt;

&lt;p&gt;Trochę wyrwane z kontekstu. Nakreślę go Wam. Książka chce określić różnice między:&lt;/p&gt;

&lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;względem:&lt;/p&gt;

&lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;a&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;undefined&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Nie ma różnicy.&lt;/p&gt;

&lt;p&gt;Na zakończenia akapitu jest zdanie:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Zmienna może przejść do stanu “niezdefiniowanego” na wiele różnych sposobów, między innymi na skutek działania funkcji, która nie zwraca wartości, i przez użycie operatora &lt;code class=&quot;highlighter-rouge&quot;&gt;void&lt;/code&gt;. &lt;small&gt;Kyle Simpson&lt;/small&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Zrozumiałem to tak, jak by operator &lt;code class=&quot;highlighter-rouge&quot;&gt;void&lt;/code&gt; coś robił. To nieprawda, no może nie wprost. On zapewnia, że wyrażenie zawsze zwróci wartość &lt;code class=&quot;highlighter-rouge&quot;&gt;undefined&lt;/code&gt;. Autorowi musiało chodzić o taką operację.&lt;/p&gt;

&lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;a&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Po wykonaniu takiego kodu, zmienna &lt;code class=&quot;highlighter-rouge&quot;&gt;a&lt;/code&gt; również będzie miała wartość &lt;code class=&quot;highlighter-rouge&quot;&gt;undefined&lt;/code&gt;.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/review-ydkjs-up-going/IMG_2356.JPG&quot; alt=&quot;&quot; /&gt;

    &lt;figcaption&gt;
        Sticker 9. Strona 51. Tekst z karteczki: &quot;Operator == sprawdza
        równość wartości wraz z dozwoloną koercją, natomiast === bez
        zezwolenia na koercję&quot;
    &lt;/figcaption&gt;

&lt;/figure&gt;

&lt;p&gt;Bardzo ciekawe wytłumaczenie. Nigdy się z takim nie spotkałem, ale to prawda. Operator &lt;code class=&quot;highlighter-rouge&quot;&gt;==&lt;/code&gt; nie sprawdza typów ponieważ żagluje nimi, sprowadza obie strony do tego samego typu, a potem dopiero porównuje. Natomiast operator &lt;code class=&quot;highlighter-rouge&quot;&gt;===&lt;/code&gt;, nie zmienia typów. Sprawdza na początku, czy są one takie same. Jeśli nie są to od razu zwraca &lt;code class=&quot;highlighter-rouge&quot;&gt;false&lt;/code&gt;. Przykład:&lt;/p&gt;

&lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nx&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;==&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'1'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// true&lt;/span&gt;
&lt;span class=&quot;nx&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'1'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// false&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/review-ydkjs-up-going/IMG_2357.JPG&quot; alt=&quot;&quot; /&gt;

    &lt;figcaption&gt;
        Sticker 10. Strona 52. Tekst z karteczki: Zerknąć do specyfikacji
        ECMAScript 5
    &lt;/figcaption&gt;

&lt;/figure&gt;

&lt;p&gt;Wszystkie reguły koercji znajdziemy w &lt;a href=&quot;http://www.ecma-international.org/ecma-262/5.1/&quot;&gt;specyfikacji&lt;/a&gt;, w rozdziale &lt;a href=&quot;http://www.ecma-international.org/ecma-262/5.1/#sec-11.9.3&quot;&gt;11.9.3&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Trzeba koniecznie się temu przyjrzeć!&lt;/p&gt;

&lt;p&gt;Algorytm jest trochę skomplikowany, nie będę go tutaj umieszczał. Zapraszam do przeczytania. Chociaż raz, każdy developer JavaScript powinien ten algorytm przeczytać. Rozumiem, że zapamiętanie całego procesu, może być trochę kłopotliwe, ale zawsze możemy posiłkować się internetem podczas weryfikacji, jak dokładnie wygląda ten algorytm koercji.&lt;/p&gt;

&lt;p&gt;No chyba że jesteśmy na rozmowie rekrutacyjnej, ale to inny temat.&lt;/p&gt;

&lt;p&gt;Dodam jeszcze, że ten algorytm jest &lt;a href=&quot;http://www.ecma-international.org/ecma-262/6.0/#sec-abstract-equality-comparison&quot;&gt;również&lt;/a&gt; w ECMAScript 6.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/review-ydkjs-up-going/IMG_2358.JPG&quot; alt=&quot;&quot; /&gt;

    &lt;figcaption&gt;
        Sticker 11. Strona 60. Tekst z karteczki: Czy funkcje można
        deklarować w &lt;code&gt;if&lt;/code&gt;-ie?
    &lt;/figcaption&gt;

&lt;/figure&gt;

&lt;p&gt;Dobre pytanie, czy można to robić? Jak sprawa wygląda w &lt;strong&gt;Trybie ścisłym&lt;/strong&gt;? Zrobiłem do tego &lt;a href=&quot;https://github.com/piecioshka/test-define-function-in-if&quot;&gt;projekt&lt;/a&gt; na GitHubie, obrazujący co się będzie działo, gdy w &lt;code class=&quot;highlighter-rouge&quot;&gt;strict mode&lt;/code&gt; będziemy próbowali zdefiniować funkcję w instrukcji warunkowej.&lt;/p&gt;

&lt;p&gt;Zapraszam do zapoznania się z nim: &lt;a href=&quot;https://github.com/piecioshka/test-define-function-in-if&quot;&gt;github.com/piecioshka/test-define-function-in-if&lt;/a&gt;.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/review-ydkjs-up-going/IMG_2359.JPG&quot; alt=&quot;&quot; /&gt;

    &lt;figcaption&gt;
        Sticker 12. Strona 66. Tekst z karteczki: &quot;publiczne API&quot;? a może
        być niepubliczne? &lt;strong&gt;masło maślane&lt;/strong&gt;
    &lt;/figcaption&gt;

&lt;/figure&gt;

&lt;p&gt;API czyli &lt;code class=&quot;highlighter-rouge&quot;&gt;Application Programming Interface&lt;/code&gt; oznacza pewien interfejs, który wcale nie musi być publiczny. Więc można zrobić prywatne oraz publiczne API. Więcej można poczytać na &lt;a href=&quot;https://pl.wikipedia.org/wiki/Application_Programming_Interface&quot;&gt;Wikipedii&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Pisząc tą karteczkę byłem w błędzie i myślałem, że API jednoznacznie daje nam do zrozumienia, że jest tylko PUBLICZNE. Po przeczytaniu Wikipedii wiem, że tak nie jest. Nie ma tutaj “masła maślanego”.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/review-ydkjs-up-going/IMG_2360.JPG&quot; alt=&quot;&quot; /&gt;

    &lt;figcaption&gt;
        Sticker 13. Strona 72. Tekst z karteczki: literówka: zamiast
        &lt;code&gt;X !== x&lt;/code&gt; powinno być &lt;code&gt;x !== x&lt;/code&gt;
    &lt;/figcaption&gt;

&lt;/figure&gt;

&lt;p&gt;Literówki się zdarzają. Jeśli zdarzają się w kodzie, to mogą one spędzić nam sen z powiek i zająć nas na bardzo długo. Takie błędy w książce, mogą co najwyżej spowodować problemy po przepisaniu kodu z książki do komputera.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/review-ydkjs-up-going/IMG_2361.JPG&quot; alt=&quot;&quot; /&gt;

    &lt;figcaption&gt;
        Sticker 14. Strona 72. Tekst z karteczki:
        transpiling = transforming + compiling
    &lt;/figcaption&gt;

&lt;/figure&gt;

&lt;p&gt;Dobrze wiedzieć, od czego pochodzi słowo &lt;strong&gt;transpiling&lt;/strong&gt;. W dobie transpilacji Babela i innych narzędzi tego typu.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/review-ydkjs-up-going/IMG_2362.JPG&quot; alt=&quot;&quot; /&gt;

    &lt;figcaption&gt;
        Sticker 15. Strona 80. Tekst z karteczki: No nie wiem, czy koercja
        jest faktycznie tym, co powinienem używać w JS-ie
    &lt;/figcaption&gt;

&lt;/figure&gt;

&lt;p&gt;Rzutowanie, szczególnie te niejawne, czasami może przysporzyć problemy (szczególnie z &lt;strong&gt;falsy values&lt;/strong&gt;). Jednak bez rzutowania jawnego daleko byśmy nie “pojechali” w programowaniu w języku JavaScript.&lt;/p&gt;

&lt;p&gt;A jak ja konwertuje zmienne? Używam funkcji konstruktorów!&lt;/p&gt;

&lt;p&gt;Aby np. zrzutować &lt;code class=&quot;highlighter-rouge&quot;&gt;string&lt;/code&gt; na &lt;code class=&quot;highlighter-rouge&quot;&gt;number&lt;/code&gt; używam takiej konstrukcji:&lt;/p&gt;

&lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nx&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;Number&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'1.1'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;));&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// 1.1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Nie wiem, czemu, ludzie często używają funkcji &lt;code class=&quot;highlighter-rouge&quot;&gt;parseInt&lt;/code&gt; - ona służy do konwersji na &lt;strong&gt;liczbę całkowitą.&lt;/strong&gt;&lt;/p&gt;

&lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nx&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;parseInt&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'1.1'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;));&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// 1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/review-ydkjs-up-going/IMG_2363.JPG&quot; alt=&quot;&quot; /&gt;

    &lt;figcaption&gt;
        Sticker 16. Strona 83. Tekst z karteczki: &lt;em&gt;destrukcja&lt;/em&gt;
        w ES6? chyba &lt;em&gt;destrukturyzacja&lt;/em&gt;
    &lt;/figcaption&gt;

&lt;/figure&gt;

&lt;p&gt;Tutaj wina leży po stronie tłumaczenia. Autorowi chodziło o &lt;code class=&quot;highlighter-rouge&quot;&gt;destructuring&lt;/code&gt;, czyli rozbijcie struktury. Zaprezentuje przykład o co chodzi z “destrukturyzacją”.&lt;/p&gt;

&lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;];&lt;/span&gt;
&lt;span class=&quot;nx&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// 1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/review-ydkjs-up-going/IMG_2364.JPG&quot; alt=&quot;&quot; /&gt;

    &lt;figcaption&gt;
        Sticker 17. Strona 85. Tekst z karteczki: Kto znajduje się
        w komitecie TC39?
    &lt;/figcaption&gt;

&lt;/figure&gt;

&lt;p&gt;Ostatnia karteczka. Czysto teoretyczna. Jak zdobyć listę członków komitetu zajmującego się rozwijaniem naszego ulubionego języka programowania? Wystarczy wejść na &lt;a href=&quot;http://www.ecma-international.org/memento/members.htm&quot;&gt;oficjalną stronę&lt;/a&gt;, na której znajduje się podział względem typu danego członka. Najważniejsi to “Ordinary members”, czyli firmy, które mają największe prawa.&lt;/p&gt;

&lt;p&gt;Ordinary members - firmy zainteresowane i mające doświadczenie w kwestiach związanych z jednym lub więcej Technicznym Komitetem Stowarzyszenia, chcące korzystać z prawa do głosu na zgromadzeniu ogólnym i chcące korzystać z innych wyłącznych praw zdefiniowanych w Statucie i Regulaminie.&lt;/p&gt;

&lt;p&gt;Najlepszym źródłem na zdobycie listy członków w postaci listy osób będzie weryfikacja listy obecności w notatkach ze spotkań komitetu. &lt;a href=&quot;https://github.com/rwaldron/tc39-notes&quot;&gt;Tutaj&lt;/a&gt; znajduje się projekt z notatkami z regularnych spotkań komitetu w sprawie specyfikacji standardu ECMAScript. Notatki z ostatniego spotkania możemy przejrzeć &lt;a href=&quot;https://github.com/rwaldron/tc39-notes/blob/master/es7/2016-03/march-31.md&quot;&gt;tutaj&lt;/a&gt;. Na liście obecności znajdują się:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Dave Herman&lt;/li&gt;
  &lt;li&gt;Michael Ficarra&lt;/li&gt;
  &lt;li&gt;Jordan Harband&lt;/li&gt;
  &lt;li&gt;Adam Klein&lt;/li&gt;
  &lt;li&gt;Mark Miller&lt;/li&gt;
  &lt;li&gt;Brian Terlson&lt;/li&gt;
  &lt;li&gt;Domenic Denicola&lt;/li&gt;
  &lt;li&gt;Brad Nelson&lt;/li&gt;
  &lt;li&gt;JF Bastien&lt;/li&gt;
  &lt;li&gt;Joe Lencioni&lt;/li&gt;
  &lt;li&gt;Sebastian Markbage&lt;/li&gt;
  &lt;li&gt;Jeff Morrison&lt;/li&gt;
  &lt;li&gt;Kevin Smith&lt;/li&gt;
  &lt;li&gt;Lars Hansen&lt;/li&gt;
  &lt;li&gt;Saam Barati&lt;/li&gt;
  &lt;li&gt;Keith Miller&lt;/li&gt;
  &lt;li&gt;Michael Saboff&lt;/li&gt;
  &lt;li&gt;Eric Ferraiuolo&lt;/li&gt;
  &lt;li&gt;Eric Faust&lt;/li&gt;
  &lt;li&gt;Chip Morningstar&lt;/li&gt;
  &lt;li&gt;Dean Tribble&lt;/li&gt;
  &lt;li&gt;Shu-yu Guo&lt;/li&gt;
  &lt;li&gt;Tim Disney&lt;/li&gt;
  &lt;li&gt;Waldemar Horwat&lt;/li&gt;
  &lt;li&gt;Bert Belder&lt;/li&gt;
  &lt;li&gt;Peter Jensen&lt;/li&gt;
  &lt;li&gt;Daniel Ehrenberg&lt;/li&gt;
  &lt;li&gt;Caridy Patiño&lt;/li&gt;
  &lt;li&gt;Diego Ferreiro Val&lt;/li&gt;
  &lt;li&gt;Jean Fraucois Paradis&lt;/li&gt;
  &lt;li&gt;Shelby Hubick&lt;/li&gt;
  &lt;li&gt;Leo Balter&lt;/li&gt;
  &lt;li&gt;Misko Hevery - autor Angular.js&lt;/li&gt;
  &lt;li&gt;Allen Wirfs-Brock&lt;/li&gt;
  &lt;li&gt;Kevin Gibbons&lt;/li&gt;
  &lt;li&gt;Steven Lumis&lt;/li&gt;
  &lt;li&gt;Zibi Braniecki&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Dość długa lista. Pewnie niepełna. Ktoś nie przyszedł. Nie szkodzi, przynajmniej teraz już widzę, ilu ludzi zaangażowanych jest w rozwój języka &lt;code class=&quot;highlighter-rouge&quot;&gt;JavaScript&lt;/code&gt;.&lt;/p&gt;

&lt;h2 id=&quot;podsumowanie&quot;&gt;Podsumowanie&lt;/h2&gt;

&lt;p&gt;O książce &lt;em&gt;Tajniki języka JavaScript. Na drodze do biegłości&lt;/em&gt; mogę wypowiedzieć się w samych superlatywach. Pięknie opisuje ona podstawy i motywuje do tego, aby zacząć programować w JavaScript już dziś!&lt;/p&gt;

&lt;p&gt;Jak dla mnie, porusza ona ciut za mało tego co znajduje się w języku, ale może po prostu tak myślę, ze względu na doświadczenie w tej branży. Nie wiem. Grube lektury nigdy nie zachęcają.&lt;/p&gt;

&lt;p&gt;Kolejną książką którą opiszę na łamach mojego bloga będzie: &lt;em&gt;Tajniki języka JavaScript. Wskaźnik this i prototypy obiektów&lt;/em&gt;.&lt;/p&gt;
</description>
            <pubDate>Tue, 24 May 2016 00:00:00 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2016/05/24/ksiazka-tajniki-jezyka-javascript-na-drodze-do-bieglosci.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2016/05/24/ksiazka-tajniki-jezyka-javascript-na-drodze-do-bieglosci.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/ydkjs/ydkjs-526x275.jpg</image>
        </item>
        
        <item>
            <title>Recenzja: "Tajniki języka JavaScript. Zakresy i domknięcia"</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Historia zaczęła się na minionym &lt;a href=&quot;https://www.meetup.com/WarsawJS/events/230815812/&quot;&gt;WarsawJS&lt;/a&gt;, gdzie drugim prelegentem był &lt;a href=&quot;https://twitter.com/smalluban&quot;&gt;Dominik Lubański&lt;/a&gt;. Prelekcja jest dostępna na kanale &lt;a href=&quot;https://www.youtube.com/warsawjs/videos&quot;&gt;WarsawJS&lt;/a&gt;, jednak klikając na &lt;a href=&quot;https://youtu.be/3Atpqz5zgk0?t=45m21s&quot;&gt;ten link&lt;/a&gt; wejdziecie bezpośrednio do momentu, który rozpoczyna moją przygodę z &lt;code class=&quot;highlighter-rouge&quot;&gt;YDKJS&lt;/code&gt; (&lt;strong&gt;“You Don’t Know JS”&lt;/strong&gt;).&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/ydkjs/ydkjs-526x275.jpg&quot; itemprop=&quot;image&quot; alt=&quot;Baner promujący artykuł&quot; /&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;jak-to-się-zaczęło&quot;&gt;Jak to się zaczęło?&lt;/h2&gt;

&lt;p&gt;Dominik pod koniec swojej prelekcji powiedział, że “ciśnie” wszystkich w swojej firmie, aby przeczytali “od deski do deski” wszystkie książki &lt;code class=&quot;highlighter-rouge&quot;&gt;You Don't Know JS&lt;/code&gt;. Cenię sobie kompetencje oraz doświadczenie w programowaniu Dominika, dlatego też jego słowa wziąłem sobie do serca i pomimo tego, że nie pracujemy razem, to sam przysiadłem do przeczytania &lt;strong&gt;YDKJS&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Nigdy nie czytałem YDKJS. Wydawało mi się to zbyteczne. Myślałem sobie:&lt;/p&gt;

&lt;p&gt;YDKJS? Kolejna zwykła książka traktująca o JavaScript. Przeczytałem ich tak wiele, że nie zaszkodzi jeśli pominę tę serię.&lt;/p&gt;

&lt;p&gt;Myślałem tak aż do momentu tej prelekcji.&lt;/p&gt;

&lt;p&gt;Postawiłem sobie nowy cel: &lt;strong&gt;przeczytać całą serię!&lt;/strong&gt;&lt;/p&gt;

&lt;h2 id=&quot;dlaczego-ydkjs&quot;&gt;Dlaczego YDKJS?&lt;/h2&gt;

&lt;p&gt;Wydawnictwo &lt;a href=&quot;http://helion.pl/&quot;&gt;Helion.pl&lt;/a&gt; trochę pomogło i stworzyło specjalną ofertę promocyjną na swojej stronie: &lt;a href=&quot;http://helion.pl/seria-JS.phtml&quot;&gt;helion.pl/seria-JS.phtml&lt;/a&gt;, gdzie dostępna jest lista 5 książek &lt;code class=&quot;highlighter-rouge&quot;&gt;You Don't Know JS&lt;/code&gt; autorstwa &lt;a href=&quot;https://twitter.com/getify&quot;&gt;Kyle Simpsona&lt;/a&gt;. Książki, są przetłumaczone na język polski.&lt;/p&gt;

&lt;p&gt;Nie będę ukrywał, że książki lepiej mi się czyta w języku ojczystym. Mój poziom angielskiego wystarczy mi do komunikacji z obcokrajowcami, ale nie pozwala na płynne (a co najważniejsze, zachowując to samo tempo) czytanie podręczników.&lt;/p&gt;

&lt;p&gt;Wczoraj na łamach fanpaga WarsawJS zamieściłem link do tej promocji.&lt;/p&gt;

&lt;p&gt;Nasuwa się pytanie: czy warto?&lt;/p&gt;

&lt;figure class=&quot;center-block&quot;&gt;
    &lt;iframe src=&quot;https://www.facebook.com/plugins/post.php?href=https%3A%2F%2Fwww.facebook.com%2Fwarsawjs%2Fposts%2F1905027293056938&amp;amp;width=500&quot; width=&quot;500&quot; height=&quot;336&quot; style=&quot;border:none;overflow:hidden&quot; scrolling=&quot;no&quot; frameborder=&quot;0&quot; allowtransparency=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;/figure&gt;

&lt;p&gt;Po kilku minutach od publikacji pojawił się komentarz (pod tym wpisem), że książka jest dostępna za darmo na publicznym profilu projektu YDKJS.&lt;/p&gt;

&lt;p&gt;To prawda. Projekt dostępny jest tutaj: &lt;a href=&quot;https://github.com/getify/You-Dont-Know-JS&quot;&gt;github.com/getify/You-Dont-Know-JS&lt;/a&gt;&lt;/p&gt;

&lt;p class=&quot;center-text&quot;&gt;
    Jednak uważam, że prawdziwe czytanie książki jest TYLKO w wersji papierowej.
&lt;/p&gt;

&lt;p&gt;Tak zostałem wychowany i to już się nie zmieni. Oczywiście nie mówię tego bez porównania. Kupiłem sobie jakiś czas temu (może to już 2 lata) &lt;a href=&quot;http://www.amazon.com/Kindle-Paperwhite-Ereader/dp/B00AWH595M&quot;&gt;Kindla&lt;/a&gt;. Mam kilka ebooków na nim. Jednak… bez rewelacji. Nie czuję tego klimatu. Brakuje mi dotyku papieru. No cóż.&lt;/p&gt;

&lt;p&gt;Może i jestem osobą, która lubi nowinki techniczne, jednak książki mają to do siebie, że muszę je czuć podczas czytania. Lubię dbać o nie, obkładać szarym papierem jak w bibliotece.&lt;/p&gt;

&lt;p&gt;Dobra. Wracamy do meritum!&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;Kilka dni temu kupiłem wszystkie dostępne 5 książek z serii. Szósta książka jest w przygotowaniu (pewnie obecnie trwa proces tłumaczenia oryginału). Termin publikacji to sierpień, tego roku.&lt;/p&gt;

&lt;p&gt;Przedwczoraj zabrałem się za czytanie i napisałem o tym na Twitterze.&lt;/p&gt;

&lt;p&gt;Zauważył ją autor książki, Kyle, polajkował i zaretweetował z komentarzem: “Polish translation”.&lt;/p&gt;

&lt;p&gt;Zrobiło mi się miło. Jemu pewnie również.&lt;/p&gt;

&lt;figure class=&quot;social-center-block&quot; title=&quot;Zdjęcie pierwszej książki z serii YDKJS, którą przeczytałem.&quot;&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;pl&quot; dir=&quot;ltr&quot;&gt;Czytam sobie o &lt;a href=&quot;https://twitter.com/hashtag/JavaScript?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#JavaScript&lt;/a&gt;! Człowiek uczy się przez całe życie! thanks &lt;a href=&quot;https://twitter.com/getify?ref_src=twsrc%5Etfw&quot;&gt;@getify&lt;/a&gt; &lt;a href=&quot;https://t.co/XmaLKpK1mA&quot;&gt;pic.twitter.com/XmaLKpK1mA&lt;/a&gt;&lt;/p&gt;&amp;mdash; Piotr Kowalski (@piecioshka) &lt;a href=&quot;https://twitter.com/piecioshka/status/733022067109601280?ref_src=twsrc%5Etfw&quot;&gt;May 18, 2016&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async=&quot;&quot; src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;

&lt;/figure&gt;

&lt;h2 id=&quot;jak-czytam-książki&quot;&gt;Jak czytam książki?&lt;/h2&gt;

&lt;p&gt;Wspomniana książka składa się z około 100 stron.&lt;/p&gt;

&lt;p&gt;Więc na przeczytanie całej potrzebuje około 2-3 godzin.&lt;/p&gt;

&lt;p&gt;Generalnie, gdy czytam książki to robię sobie notatki, ale nie takie normalne notatki gdzieś obok na kartce. Nie piszę również długopisem ani ołówkiem po książce - uważam to za pewnego rodzaju &lt;strong&gt;złamanie zasad&lt;/strong&gt;.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Pisanie długopisem albo ołówkiem po książce to bluźnierstwo! &lt;small&gt;Piotr Kowalski&lt;/small&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Gdy czytam książki to naklejam stickery (takie małe karteczki), na których notuję jakieś informacje. Przykładem niech będzie &lt;a href=&quot;%7B%%20post_url%202015-08-27-angularjs-warsaw-3%20%%7D&quot;&gt;moja prelekcja&lt;/a&gt; na &lt;a href=&quot;https://www.meetup.com/Angular-Warsaw/&quot;&gt;“Angular Warsaw”&lt;/a&gt; nt. mojego podejścia do frameworka AngularJS po przeczytaniu dwóch książek. Zobaczcie &lt;a href=&quot;http://piecioshka.github.io/slides-angularjs-q-and-a/&quot;&gt;slajdy&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;moje-notatki&quot;&gt;Moje notatki&lt;/h2&gt;

&lt;p&gt;Tym razem nie było inaczej. W sumie użyłem 11-tu karteczek, gdzie napisałem sobie notatki w związku z daną zawartością strony, na której karteczka znalazła swoje miejsce.&lt;/p&gt;

&lt;p&gt;Może przedstawię te kilkanaście punktów, gdzie chciałem napisać komentarz.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/review-ydkjs-scope-closures/IMG_2336.JPG&quot; alt=&quot;&quot; /&gt;

    &lt;figcaption&gt;
        Sticker 1. Strona 18. Tekst z karteczki: LHS - co jest celem przypisania? RHS - co jest źródłem przypisania?
    &lt;/figcaption&gt;

&lt;/figure&gt;

&lt;p&gt;Co się kryje za terminem &lt;code class=&quot;highlighter-rouge&quot;&gt;LHS&lt;/code&gt;? Rozwinięcia tego akronimu próżno szukać w książce. Jest za to coś ważniejszego, czyli wytłumaczenie pojęcia. W skrócie chodzi o to, że silnik gdy widzi taki kod:&lt;/p&gt;

&lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;a&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;…wykonuje &lt;strong&gt;2 operacje&lt;/strong&gt;. Pierwsza to definicja zmiennej:&lt;/p&gt;

&lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;druga to:&lt;/p&gt;

&lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nx&quot;&gt;a&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Ten drugi etap jest wyciągnięciem zmiennej w trybie &lt;em&gt;do przypisania&lt;/em&gt;, czyli &lt;strong&gt;LHS&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Drugi termin, czyli &lt;code class=&quot;highlighter-rouge&quot;&gt;RHS&lt;/code&gt; oznacza, że silnik chce użyć zmienną. I tak o to prosty przykład:&lt;/p&gt;

&lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nx&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Mamy tutaj pobranie wartości zmiennej.&lt;/p&gt;

&lt;p&gt;Nigdy nie słyszałem, o takich nazwach trybów dostępu. Oczywiście, używałem obu tych form, jednak nie wiedziałem, że jest taka terminologia (zasada działania) zaimplementowana w silniku.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;LHS&lt;/code&gt; oznacza &lt;code class=&quot;highlighter-rouge&quot;&gt;Left Hand Side&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;RHS&lt;/code&gt; oznacza &lt;code class=&quot;highlighter-rouge&quot;&gt;Right Hand Side&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Dla dociekliwych, polecam przeczytać wpis opisujący bardziej dokładnie LHS i RHS:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://john-dugan.com/hoisting-in-javascript/&quot;&gt;https://john-dugan.com/hoisting-in-javascript/&lt;/a&gt;&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/review-ydkjs-scope-closures/IMG_2338.JPG&quot; alt=&quot;&quot; /&gt;

    &lt;figcaption&gt;
        Sticker 2. Strona 30. Tekst z karteczki: Wyszukiwanie zakresu zostanie zatrzymane po znalezieniu pierwszego dopasowania!
    &lt;/figcaption&gt;

&lt;/figure&gt;

&lt;p&gt;Karteczka czysto informacyjna. Jak silnik nie znajdzie zmiennej w zakresie, gdzie jest żądanie pobrania wartości, to szuka w zakresie wyższym. Jeśli znajdzie to przestaje szukać. Chociaż oczywiste, to warto zanotować.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/review-ydkjs-scope-closures/IMG_2339.JPG&quot; alt=&quot;&quot; /&gt;

    &lt;figcaption&gt;
        Sticker 3. Strona 34. Tekst z karteczki: Wyciekająca zmienna globalna (&lt;code&gt;with&lt;/code&gt;)
    &lt;/figcaption&gt;

&lt;/figure&gt;

&lt;p&gt;Kto używa &lt;code class=&quot;highlighter-rouge&quot;&gt;with&lt;/code&gt; w dzisiejszych czasach? Chyba tylko &lt;a href=&quot;https://github.com/firebug/firebug&quot;&gt;Firebug&lt;/a&gt;. Sticker przypomina, że &lt;code class=&quot;highlighter-rouge&quot;&gt;with&lt;/code&gt; jest bardzo złe bo, jeśli w obiekcie, który jest brany pod uwagę przez &lt;code class=&quot;highlighter-rouge&quot;&gt;with&lt;/code&gt; nie znajdziemy właściwości, którą chcemy zaktualizować, to będzie ona ustawiona jako globalna. Przykład:&lt;/p&gt;

&lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;dog&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;''&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;};&lt;/span&gt;
&lt;span class=&quot;kd&quot;&gt;with&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;dog&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;name&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'doggy'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;surname&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'what?'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;nx&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;dog&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// &quot;doggy&quot;&lt;/span&gt;
&lt;span class=&quot;nx&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;dog&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;surname&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// undefined&lt;/span&gt;
&lt;span class=&quot;nx&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;window&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;surname&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// &quot;what?&quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/review-ydkjs-scope-closures/IMG_2340.JPG&quot; alt=&quot;&quot; /&gt;

    &lt;figcaption&gt;
        Sticker 4. Strona 46. Tekst z karteczki: ...czyli &lt;code&gt;arrow function&lt;/code&gt; to wyrażenie funkcyjne!
    &lt;/figcaption&gt;

&lt;/figure&gt;

&lt;p&gt;Zgadza się! &lt;code class=&quot;highlighter-rouge&quot;&gt;Arrow Function&lt;/code&gt; to nie funkcja a &lt;strong&gt;wyrażenie funkcyjne&lt;/strong&gt;! Dlaczego? Każda funkcja podczas definicji musi posiadać nazwę, a ze względu na to, że w składni AF nie można zdefiniować nazwy to jest to wyrażenie funkcyjne! Dziwne, bo przecież są funkcje anonimowe, czyli takie, które nie posiadają nazwy. Temat warty dyskusji.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/review-ydkjs-scope-closures/IMG_2341.JPG&quot; alt=&quot;&quot; /&gt;

    &lt;figcaption&gt;
        Sticker 5. Strona 55. Tekst z karteczki: Ciekawy zabieg wydajnościowy zw. z &lt;code&gt;{ }&lt;/code&gt;
    &lt;/figcaption&gt;

&lt;/figure&gt;

&lt;p&gt;Uważam to za interesujące, ponieważ w JavaScript mamy zasięg leksykalny, czyli funkcyjny. Zasięg zaczyna się na początku definicja funkcji i kończy wraz z jej końcem. Wyjątkiem jest konstrukcja &lt;code class=&quot;highlighter-rouge&quot;&gt;try...catch&lt;/code&gt;, gdzie w bloku &lt;code class=&quot;highlighter-rouge&quot;&gt;catch&lt;/code&gt; mamy zasięg blokowy! Czyli od klamerki &lt;code class=&quot;highlighter-rouge&quot;&gt;{&lt;/code&gt; do klamerki &lt;code class=&quot;highlighter-rouge&quot;&gt;}&lt;/code&gt;.&lt;/p&gt;

&lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;try&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;throw&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;Error&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'test'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;catch&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// zmienna `error` jest dostępna TYLKO pomiędzy `{}`&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;W specyfikacji &lt;strong&gt;ECMAScript 6&lt;/strong&gt; mamy wsparcie do zasięgu blokowego, gdy definiujemy zmienną wyrażeniami: &lt;code class=&quot;highlighter-rouge&quot;&gt;let&lt;/code&gt; albo &lt;code class=&quot;highlighter-rouge&quot;&gt;const&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Pewną optymalizacją jest, aby nie definiować zmiennych na początku funkcji (w zasięgu blokowym), skoro używamy jej tylko w jednym miejscu. Przykład na pewno rozjaśni sprawę.&lt;/p&gt;

&lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;doSomething&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;e&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;nx&quot;&gt;bar&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;foo&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

    &lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;r&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'abc'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kd&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;t&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;t&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;++&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;nx&quot;&gt;setTimeout&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;nx&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;},&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;400&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;kd&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;startLabel&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'start'&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;endLabel&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'end'&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;([&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;startLabel&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;endLabel&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]);&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Na powyższym przykładzie widać, że zmienna &lt;code class=&quot;highlighter-rouge&quot;&gt;e&lt;/code&gt; jest zdefiniowana bardzo wysoko. Lepiej od strony &lt;strong&gt;wydajności&lt;/strong&gt; jest zdefiniować ją blisko użycia i opakować w klamerki:&lt;/p&gt;

&lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;doSomething&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;bar&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;foo&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

    &lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;r&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'abc'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kd&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;t&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;t&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;++&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;nx&quot;&gt;setTimeout&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;nx&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;},&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;400&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;kd&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;e&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;kd&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;startLabel&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'start'&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;kd&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;endLabel&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'end'&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;nx&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;([&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;startLabel&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;endLabel&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]);&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Tworzymy wtedy zasięg TYLKO dla zmiennych &lt;code class=&quot;highlighter-rouge&quot;&gt;e&lt;/code&gt;, &lt;code class=&quot;highlighter-rouge&quot;&gt;startLabel&lt;/code&gt; i &lt;code class=&quot;highlighter-rouge&quot;&gt;endLabel&lt;/code&gt;. No i tylko w tym zasięgu zmienna &lt;code class=&quot;highlighter-rouge&quot;&gt;e&lt;/code&gt; jest potrzebna. Nie ma sensu jej wciskać do zasięgu zewnętrznego.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/review-ydkjs-scope-closures/IMG_2342.JPG&quot; alt=&quot;&quot; /&gt;

    &lt;figcaption&gt;
        Sticker 6. Strona 63. Tekst z karteczki: Bardzo dziwny kawałek kodu, dający jednak jasno do zrozumienia, że to funkcje są pierwotnie &quot;wynoszone&quot; (hoisting)
    &lt;/figcaption&gt;

&lt;/figure&gt;

&lt;p&gt;Może zacytuje kawałek kodu, o którym mowa:&lt;/p&gt;

&lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nx&quot;&gt;foo&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// 1&lt;/span&gt;

&lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;foo&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;foo&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;nx&quot;&gt;foo&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Tak to zinterpretuje silnik:&lt;/p&gt;

&lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;foo&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;nx&quot;&gt;foo&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// 1&lt;/span&gt;

&lt;span class=&quot;nx&quot;&gt;foo&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Interesujący smaczek języka!&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/review-ydkjs-scope-closures/IMG_2343.JPG&quot; alt=&quot;&quot; /&gt;

    &lt;figcaption&gt;
        Sticker 7. Strona 73. Tekst z karteczki: Domknięcie to funkcja, która ma dostęp do zmiennych lokalnych (zdefiniowanych w tym samym zakresie leksykalnym co dana funkcja) musi być uruchomiona na zewnątrz tego zakresu!
    &lt;/figcaption&gt;

&lt;/figure&gt;

&lt;p&gt;&lt;abbr title=&quot;Immediately Invoked Function Expression&quot;&gt;IIFE&lt;/abbr&gt; to nie domknięcie. Szok. Przez tyle lat tak myślałem. Prawdziwe domknięcie polega na tym, że uruchamiamy funkcję z zakresu, gdzie nie ma dostępnej danej zmiennej. Przykład zobrazuje to najlepiej.&lt;/p&gt;

&lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;MyModule&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;secret&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;123&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;getSecret&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;secret&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;getSecret&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;getSecret&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;};&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;mod&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;MyModule&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
&lt;span class=&quot;nx&quot;&gt;mod&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;getSecret&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// Uruchamiamy funkcję, która ma dostęp do zmiennej &quot;secret&quot;. Tylko w ten sposób do niej się dobierzemy.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/review-ydkjs-scope-closures/IMG_2344.JPG&quot; alt=&quot;&quot; /&gt;

    &lt;figcaption&gt;
        Sticker 8. Strona 80. Tekst z karteczki: Piękna definicja wzorca &lt;code&gt;Singleton&lt;/code&gt;
    &lt;/figcaption&gt;

&lt;/figure&gt;

&lt;p&gt;Najpopularniejszy wzorzec projektowy, który bardzo często słyszę na rozmowach rekrutacyjnych jako odpowiedź na pytanie: &lt;em&gt;A jakie znasz wzorce projektowe?&lt;/em&gt; SINGLETON!&lt;/p&gt;

&lt;p&gt;Świetny przykład znajduje się na 80-tej stronie. Może skrócę go do wersji minimum:&lt;/p&gt;

&lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;foo&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;s1&quot;&gt;'use strict'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// tego w książce nie było&lt;/span&gt;

    &lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;secret&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;12345&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;getSecret&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;secret&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;getSecret&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;getSecret&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;};&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;})();&lt;/span&gt;

&lt;span class=&quot;nx&quot;&gt;foo&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;getSecret&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Pięknie się tworzy takie implementacje.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/review-ydkjs-scope-closures/IMG_2345.JPG&quot; alt=&quot;&quot; /&gt;

    &lt;figcaption&gt;
        Sticker 9. Strona 84. Tekst z karteczki: Błąd: zamiast &lt;code&gt;module foo from &quot;foo&quot;;&lt;/code&gt; powinno być &lt;code&gt;import foo from &quot;foo&quot;;&lt;/code&gt;
    &lt;/figcaption&gt;

&lt;/figure&gt;

&lt;p&gt;No i mamy (niestety) pierwszy błąd w książce, bynajmniej znaleziony przeze mnie. Pod koniec 5-tego rozdziału autor chciał opisać moduły w ES6. Nazwa podrozdział “Pyszne moduły”. Niestety kod źródłowy w przykładzie posiada rażące błędy.&lt;/p&gt;

&lt;hr /&gt;

&lt;p class=&quot;center-text&quot;&gt;
    Stworzyłem projekt na GitHubie opisujący błędny kod, wraz z kodem poprawionym.&lt;br /&gt;
    &lt;strong&gt;Zapraszam do zapoznania się:&lt;/strong&gt;
    &lt;a href=&quot;https://github.com/piecioshka/errors-in-ydkjs-scope-closures-book&quot;&gt;github.com/piecioshka/errors-in-ydkjs-scope-closures-book&lt;/a&gt;
&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;A o to lista błędów:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;pierwszy problem to ścieżki, do plików lokalnych trzeba odnosić się poprzez &lt;code class=&quot;highlighter-rouge&quot;&gt;./&lt;/code&gt; na początku&lt;/li&gt;
  &lt;li&gt;nie ma w specyfikacji &lt;code class=&quot;highlighter-rouge&quot;&gt;ECMAScript 6&lt;/code&gt; słowa operatora &lt;code class=&quot;highlighter-rouge&quot;&gt;module&lt;/code&gt; (taki w stylu &lt;code class=&quot;highlighter-rouge&quot;&gt;import&lt;/code&gt;)&lt;/li&gt;
  &lt;li&gt;nie ma takiej składni eksportowania jak &lt;code class=&quot;highlighter-rouge&quot;&gt;export hello;&lt;/code&gt; (&lt;a href=&quot;http://www.ecma-international.org/ecma-262/6.0/index.html#table-42&quot;&gt;lista dostępnych możliwości&lt;/a&gt;), trzeba eksportować tak &lt;code class=&quot;highlighter-rouge&quot;&gt;export {hello};&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;nie można zmienić nazwy importowanego modułu &lt;code class=&quot;highlighter-rouge&quot;&gt;import foo from &quot;./foo&quot;;&lt;/code&gt;, należy wskazać, że API z pliku &lt;code class=&quot;highlighter-rouge&quot;&gt;foo.js&lt;/code&gt;, będzie w obiekcie poprzez takie kod: &lt;code class=&quot;highlighter-rouge&quot;&gt;import * as foo from &quot;./foo&quot;;&lt;/code&gt; (&lt;a href=&quot;http://www.ecma-international.org/ecma-262/6.0/index.html#table-40&quot;&gt;lista wszystkich możliwości importowania&lt;/a&gt;)&lt;/li&gt;
  &lt;li&gt;jeżeli chcemy z modułu wyciągnąć tylko jedną funkcję to trzeba opakować ja w &lt;code class=&quot;highlighter-rouge&quot;&gt;curly braces&lt;/code&gt;, zamiast &lt;code class=&quot;highlighter-rouge&quot;&gt;import hello from &quot;bar&quot;;&lt;/code&gt; trzeba &lt;code class=&quot;highlighter-rouge&quot;&gt;import {hello} from &quot;bar&quot;;&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/review-ydkjs-scope-closures/IMG_2346.JPG&quot; alt=&quot;&quot; /&gt;

    &lt;figcaption&gt;
        Sticker 10. Strona 92. Tekst z karteczki: Trochę szkoda, że nikt nie wspomniał o &lt;code&gt;Babel.js&lt;/code&gt;
    &lt;/figcaption&gt;

&lt;/figure&gt;

&lt;p&gt;W książce jako transpiler wymieniony byl tylko &lt;a href=&quot;https://github.com/google/traceur-compiler&quot;&gt;Traceur&lt;/a&gt;. Z tego co pamiętam, to ma on zdecydowanie mniejsze pokrycia &lt;a href=&quot;http://www.ecma-international.org/ecma-262/6.0/index.html&quot;&gt;specyfikacji&lt;/a&gt; niż &lt;a href=&quot;https://babeljs.io/&quot;&gt;Babel.js&lt;/a&gt;. Babel ma bardzo przyjemne wsparcie do m.in &lt;a href=&quot;http://webpack.github.io&quot;&gt;Webpacka&lt;/a&gt; i jest zdecydowanie bardziej popularniejszy w społeczności.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/review-ydkjs-scope-closures/IMG_2347.JPG&quot; alt=&quot;&quot; /&gt;

    &lt;figcaption&gt;
        Sticker 11. Strona 94. Tekst z karteczki: TODO: skorzystać z projektu &quot;let-er&quot;
    &lt;/figcaption&gt;

&lt;/figure&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/getify/let-er&quot;&gt;let-er&lt;/a&gt; - nowe narzędzie - warto się zapoznać! Projekt autorstwa Kyle Simpsona pozwala na kompilację bloku kodu:&lt;/p&gt;

&lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;foo&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// &quot;foo&quot;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Do zapisuj znanego nam z ES6:&lt;/p&gt;

&lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;let&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'foo'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// &quot;foo&quot;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Narzędzie posiada opcję konwersji do ES3. Jak już wcześniej wspomniałem, w JavaScripcie jest zasięg funkcyjny, z 1 wyjątkiem, konstrukcja &lt;code class=&quot;highlighter-rouge&quot;&gt;try...catch&lt;/code&gt;, w której mamy zasięg blokowy. Przykład:&lt;/p&gt;

&lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;try&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;throw&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'foo'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;catch&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Jeżeli chodzi o mnie to projektu raczej nie wykorzystam. Nie widzę praktycznego zastosowania.&lt;/p&gt;

&lt;h2 id=&quot;moje-doświadczenie&quot;&gt;Moje doświadczenie&lt;/h2&gt;

&lt;p&gt;Może trochę słów o książce. Czytało mi się ją szybko. Nie miałem jakiś problemów ze zrozumiem, o co autorowi chodzi. Książka dla mnie jest odświeżeniem tematu zakresów i domknięć. Polecam ją każdemu, kto zaczyna swoją przygodę z JavaScriptem.&lt;/p&gt;

&lt;p&gt;Mam nadzieje, że inne książki z serii będą miały podobny styl. Dziękuję Dominik, że zaszczepiłeś we mnie ten pomysł na przeczytanie całej serii.&lt;/p&gt;
</description>
            <pubDate>Fri, 20 May 2016 00:00:00 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2016/05/20/ksiazka-tajniki-jezyka-javascript-zakresy-i-domkniecia.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2016/05/20/ksiazka-tajniki-jezyka-javascript-zakresy-i-domkniecia.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/ydkjs/ydkjs-526x275.jpg</image>
        </item>
        
        <item>
            <title>Jak podsłuchać iPhona?</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Tym artykułem chciałbym pomóc wszystkim tym, którzy podobnie jak ja, tworzą aplikacje cross-platformowe, i mają problem z debugowaniem na urządzeniach z rodziny Apple. Przedstawię jak podsłuchać komunikację przeglądarki uruchomionej na iPhonie, iPadzie albo iPodzie.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/inspect-iphone/sniffing-iphone.png&quot; itemprop=&quot;image&quot; alt=&quot;Baner promujący artykuł&quot; /&gt;
&lt;/figure&gt;

&lt;p&gt;Jako developer aplikacji &lt;abbr title=&quot;cross-platformowych&quot;&gt;multi-platformowych&lt;/abbr&gt;, często (moim zdaniem za często) poprawiam błędy pojawiające się tylko na jednej platformie. Nie jest to miłe.&lt;/p&gt;

&lt;p class=&quot;center-text&quot;&gt;
    &lt;strong&gt;JESTEM OGROMNYM ZWOLENNIKIEM SPÓJNOŚCI&lt;/strong&gt;
&lt;/p&gt;

&lt;p&gt;…dlatego moim marzeniem byłaby sytuacja taka, że jedno rozwiązanie powinno działać, albo nie działać wszędzie zarazem.&lt;/p&gt;

&lt;p&gt;Wolę mieć jasną sytuację, że &lt;strong&gt;jeśli na jednej platformie nie działa, to na pozostałych również&lt;/strong&gt;. Wtedy wiem, że gdy na jednej zrobię poprawkę, to na wszystkich innych będzie także działało.&lt;/p&gt;

&lt;p&gt;Niestety, to rzadkość w tym fachu.&lt;/p&gt;

&lt;h2 id=&quot;problem-kompatybilności-z-apple&quot;&gt;Problem kompatybilności z Apple&lt;/h2&gt;

&lt;p&gt;Jakiś czas temu w pewnym moim projekcie istniał problem przeglądarki uruchomionej na iPhonie komunikującej się z serwerem HTTP. Korzystając z przeglądarki &lt;em&gt;Google Chrome&lt;/em&gt;, nie można niestety wejść w tryb developerski (&lt;code class=&quot;highlighter-rouge&quot;&gt;remote debugging&lt;/code&gt;), czyli mieć połączenie &lt;em&gt;komputer - urządzenie&lt;/em&gt; i weryfikować stan aplikacji uruchomionej na urządzeniu.&lt;/p&gt;

&lt;p&gt;Taki &lt;em&gt;remote debugging&lt;/em&gt; działa tylko na urządzeniach z Androidem, które podłączymy do komputera z Windowsem / OSXem / Linuksem.&lt;/p&gt;

&lt;p&gt;Wtedy po podłączeniu telefonu z Androidem wchodzimy na komputerze (korzystamy z Google Chrome) na &amp;lt;chrome://inspect&amp;gt; i wybieramy urządzenie, które chcemy połączyć z naszym komputerem.&lt;/p&gt;

&lt;p&gt;Chcę po prostu podłączyć się do iPhona, ale jak? Może… to narysuję.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/inspect-iphone/macbook-iphone-ipad.jpeg&quot; alt=&quot;&quot; /&gt;

    &lt;figcaption&gt;
        Ryc. 1. Połączenie MacBook z iPhonem albo iPadem.
    &lt;/figcaption&gt;

&lt;/figure&gt;

&lt;p&gt;Kabel podłączam. iTunes wykrywa urządzenie. Na razie wszystko gra. Co dalej?&lt;/p&gt;

&lt;p&gt;Tryb &lt;code class=&quot;highlighter-rouge&quot;&gt;remote debugging&lt;/code&gt; działa w Safari (specjalnie nie nazywam tego programu przeglądarką ze względu na implementację specyfikacji W3C oraz kiepskie narzędzia developerskie - &lt;a href=&quot;https://www.google.pl/chrome/&quot;&gt;Google Chrome&lt;/a&gt; to jedyna słuszna przeglądarka). No dobra, przedstawię kroki jak skorzystać z remote debugging.&lt;/p&gt;

&lt;h2 id=&quot;safari---remote-debugging&quot;&gt;Safari - Remote debugging&lt;/h2&gt;

&lt;p&gt;Poniżej lista kroków, aby korzystać z DevToolsów (czytaj “narzędzi developerskich”) dla Safari.&lt;/p&gt;

&lt;ol&gt;
    &lt;li&gt;
        Pierwszy krok to konfiguracja sprzętowa: podłączasz kabelkiem iPhona z MacBookiem (to chyba jasne).
    &lt;/li&gt;
    &lt;li&gt;
        &lt;mark&gt;iPhone&lt;/mark&gt;: Drugim krokiem jest włączenie Inspektora w przeglądarce Safari. Wykonać to należy wchodząc w urządzeniu w:
        &lt;em&gt;Ustawienia → Safari → Zaawansowane → Inspektor WWW&lt;/em&gt;.
        Przełączamy &lt;em&gt;Inspektora&lt;/em&gt; w stan włączenia.
    &lt;/li&gt;
    &lt;li&gt;
        &lt;mark&gt;iPhone&lt;/mark&gt;: uruchamiasz Safari i wchodzisz na stronę &lt;a href=&quot;http://example.org&quot;&gt;example.org&lt;/a&gt;

        &lt;figure&gt;
            &lt;img src=&quot;/assets/images/posts/inspect-iphone/iphone-example-site.png&quot; alt=&quot;&quot; /&gt;

            &lt;figcaption&gt;
                Ryc. 2. Otworzona strona &lt;a href=&quot;http://example.org&quot;&gt;example.org&lt;/a&gt; na iPhone.
            &lt;/figcaption&gt;
        &lt;/figure&gt;
    &lt;/li&gt;
    &lt;li&gt;
        &lt;mark&gt;MacBook&lt;/mark&gt;: uruchamiasz Safari i wybierasz z menu górnego Programowanie, a potem iPhone (albo iPad, albo iPod)

        &lt;figure&gt;
            &lt;img src=&quot;/assets/images/posts/inspect-iphone/osx-safari-see-iphone-safari-tabs.png&quot; alt=&quot;&quot; /&gt;

            &lt;figcaption&gt;
                Ryc. 3. Otwieramy zakładkę Programowanie → iPhone i widzimy wszystkie otwarte strony.
            &lt;/figcaption&gt;
        &lt;/figure&gt;

        Jeżeli będziesz w takiej sytuacji:

        &lt;figure&gt;
            &lt;img src=&quot;/assets/images/posts/inspect-iphone/osx-safari-not-see-iphone-safari-tabs.png&quot; alt=&quot;&quot; /&gt;

            &lt;figcaption&gt;
                Ryc. 4. Otwieramy zakładkę Programowanie → iPhone i nie widzimy otwartych stron.
            &lt;/figcaption&gt;
        &lt;/figure&gt;

        ...to w sekcji FAQ (na dole strony) znajdziesz rozwiązanie.
    &lt;/li&gt;
    &lt;li&gt;
        &lt;mark&gt;MacBook&lt;/mark&gt;: wybierasz stronę &lt;a href=&quot;http://example.org&quot;&gt;example.org&lt;/a&gt; klikając w element menu.

        &lt;figure&gt;
            &lt;img src=&quot;/assets/images/posts/inspect-iphone/osx-safari-select-iphone-safari-tab.png&quot; alt=&quot;&quot; /&gt;

            &lt;figcaption&gt;
                Ryc. 5. Klikamy w konkretną stronę otwartą na Safari na iPhone.
            &lt;/figcaption&gt;
        &lt;/figure&gt;
    &lt;/li&gt;
    &lt;li&gt;
        &lt;mark&gt;MacBook&lt;/mark&gt;: naszym oczom ukazują się narzędzia
        developerskie znane z typowego debugowania pod Safari na OSX.

        &lt;figure&gt;
            &lt;img src=&quot;/assets/images/posts/inspect-iphone/osx-safari-devtools.png&quot; alt=&quot;&quot; /&gt;

            &lt;figcaption&gt;
                Ryc. 6. Otwarte DevToolsy (narzędzia developerskie),
                które są podłączone do Safari uruchomionego na iPhone.
            &lt;/figcaption&gt;
        &lt;/figure&gt;
    &lt;/li&gt;
    &lt;li&gt;
        Od teraz jesteśmy podłączeni konsolą do strony otworzonej na iPhonie. Możemy w pełni debugować naszą aplikację.
    &lt;/li&gt;

&lt;/ol&gt;

&lt;p&gt;Co jeśli jednak chcielibyśmy podłączyć się Wiresharkiem? Tutaj pojawia się problem, ponieważ nie wykrywa on podłączonego urządzenia!&lt;/p&gt;

&lt;h2 id=&quot;wireshark-podsłuchuje-iphona&quot;&gt;Wireshark podsłuchuje iPhona&lt;/h2&gt;

&lt;p&gt;Wireshark to najlepszy sniffer (analizator pakietów) na rynku. Każdy kto uważa się za programistę sieciowego, a Ty jako programista aplikacji internetowych należysz do takich, to na pewno wiesz jak sobie poradzić z Wiresharkiem.&lt;/p&gt;

&lt;p&gt;Jeśli nie korzystałeś nigdy z tego programu, to polecam książkę pt. “Praktyczna analiza pakietów” autorstwa Chrisa Sandersa. Książka jest dostępna po polsku w księgarni internetowej Helion: &lt;a href=&quot;http://helion.pl/ksiazki/praktyczna-analiza-pakietow-wykorzystanie-narzedzia-wireshark-do-rozwiazywania-problemow-z-siecia-chris-sanders,panpak.htm&quot;&gt;helion.pl/ksiazki/praktyczna-analiza-pakietow-….htm&lt;/a&gt; Wkrótce na blogu pojawi się recenzja tej książki. Jeśli kogoś temat interesuje, to zachęcam do śledzenia mojego bloga.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/inspect-iphone/osx-wireshark.png&quot; alt=&quot;&quot; /&gt;

    &lt;figcaption&gt;
        Ryc. 7. Wireshark z listą interfejsów.
    &lt;/figcaption&gt;

&lt;/figure&gt;

&lt;p&gt;Na powyższym zrzucie ekranu nie widać połączenia (odpowiedni interfejs) z iPhonem. Rozwiązanie zagadki jest proste. &lt;strong&gt;Do komunikacji z tym urządzeniem brakuje odpowiedniego interfejsu! Dodajmy go!&lt;/strong&gt;&lt;/p&gt;

&lt;h2 id=&quot;dodajemy-interfejs-do-komunikacji-z-iphone&quot;&gt;Dodajemy interfejs do komunikacji z iPhone&lt;/h2&gt;

&lt;ol&gt;
    &lt;li&gt;
        Za pomocą narzędzia &lt;code&gt;rvictl&lt;/code&gt;, czyli &lt;code&gt;Remote Virtual Interface Tool&lt;/code&gt; możemy zarządzać interfejsami.
        Zobaczmy jak wygląda pełny opis narzędzia:

        &lt;figure&gt;
            &lt;img src=&quot;/assets/images/posts/inspect-iphone/osx-rvictl.png&quot; alt=&quot;&quot; /&gt;

            &lt;figcaption&gt;
                Ryc. 8. Program &lt;code&gt;rvictl&lt;/code&gt;.
            &lt;/figcaption&gt;
        &lt;/figure&gt;
    &lt;/li&gt;
    &lt;li&gt;
        &lt;p&gt;
            Skorzystamy z opcji &lt;code&gt;-s&lt;/code&gt;, aby uruchomić kanał komunikacyjny między MacBookiem a iPhonem.
            Potrzebujemy do tego &lt;code&gt;UUID&lt;/code&gt; urządzenia (dowolnego z rodziny Apple: iPhone, iPad, iPod).
        &lt;/p&gt;

        &lt;p&gt;&lt;em&gt;Jeśli nie wiesz co to jest &lt;code&gt;UUID&lt;/code&gt;, to odpowiedź znajdziesz w FAQ.&lt;/em&gt;&lt;/p&gt;

        &lt;p&gt;Żeby to zrobić uruchamiamy program iTunes:&lt;/p&gt;

        &lt;figure&gt;
            &lt;img src=&quot;/assets/images/posts/inspect-iphone/osx-itunes.png&quot; alt=&quot;&quot; /&gt;

            &lt;figcaption&gt;
                Ryc. 9. Program iTunes.
            &lt;/figcaption&gt;
        &lt;/figure&gt;
    &lt;/li&gt;
    &lt;li&gt;
        &lt;p&gt;Następnie wybieramy nasze urządzenie:&lt;/p&gt;

        &lt;figure&gt;
            &lt;img src=&quot;/assets/images/posts/inspect-iphone/osx-itunes-select-iphone.png&quot; alt=&quot;&quot; /&gt;

            &lt;figcaption&gt;
                Ryc. 10. Wybieramy iPhona w programie iTunes.
            &lt;/figcaption&gt;
        &lt;/figure&gt;
    &lt;/li&gt;
    &lt;li&gt;
        &lt;p&gt;Klikamy w &quot;Numer seryjny&quot; aby pokazał nam się UUID urządzenia:&lt;/p&gt;

        &lt;figure&gt;
            &lt;img src=&quot;/assets/images/posts/inspect-iphone/osx-itunes-display-iphone-uuid.png&quot; alt=&quot;&quot; /&gt;

            &lt;figcaption&gt;
                Ryc. 11. Wyświetlony UUID urządzenia iPhone.
            &lt;/figcaption&gt;
        &lt;/figure&gt;
    &lt;/li&gt;
    &lt;li&gt;
        &lt;p&gt;Klikamy prawym przyciskiem myszy, pokazuje nam się menu kontekstowe z jedną opcją &lt;em&gt;&quot;kopiuj&quot;&lt;/em&gt;.&lt;/p&gt;
    &lt;/li&gt;
    &lt;li&gt;
        &lt;p&gt;Przechodzimy do terminala i wpisujemy polecenie:&lt;/p&gt;

&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;
rvictl -s [UUID]
&lt;/code&gt;&lt;/pre&gt;

        &lt;p&gt;
            ...zastępując &lt;code&gt;[UUID]&lt;/code&gt; skopiowanym ciągiem znaków.
        &lt;/p&gt;
    &lt;/li&gt;
    &lt;li&gt;
        Resetujemy Wiresharka, a w nowej sesji programu widzimy listę interfejsów z nowym &lt;code&gt;rv0&lt;/code&gt;:

        &lt;figure&gt;
            &lt;img src=&quot;/assets/images/posts/inspect-iphone/osx-wireshark-rv0.png&quot; alt=&quot;&quot; /&gt;

            &lt;figcaption&gt;
                Ryc. 12. Wireshark z dłuższą listą interfejsów (pojawił się interfejs &lt;code&gt;rv0&lt;/code&gt;).&quot;
            &lt;/figcaption&gt;
        &lt;/figure&gt;
    &lt;/li&gt;
    &lt;li&gt;
        Wybieramy interfejs &lt;code&gt;rv0&lt;/code&gt; (klikając 2x w daną pozycję)
        i od teraz &lt;strong&gt;możemy nasłuchiwać wszelką komunikację
        telefonu ze światem zewnętrznym!&lt;/strong&gt;
        &lt;br /&gt;&lt;br /&gt;
        Przykład poniżej:

        &lt;figure&gt;
            &lt;img src=&quot;/assets/images/posts/inspect-iphone/osx-wireshark-rv0-http-listening.png&quot; alt=&quot;&quot; /&gt;

            &lt;figcaption&gt;
                Ryc. 13. Request HTTP do strony &lt;a href=&quot;http://example.org&quot;&gt;example.org&lt;/a&gt; widziany w programie Wireshark.
            &lt;/figcaption&gt;
        &lt;/figure&gt;
    &lt;/li&gt;

&lt;/ol&gt;

&lt;p&gt;Dzięki takiemu nasłuchiwaniu pakietów jesteśmy w 100% pewni jakie zapytania generuje urządzenie, oraz tym samym jakie dostaje odpowiedzi z serwera.&lt;/p&gt;

&lt;h3 id=&quot;faq&quot;&gt;FAQ&lt;/h3&gt;

&lt;dl class=&quot;question-list&quot;&gt;
    &lt;dt&gt;Nie widzę w Safari na MacBooku żadnej strony na moim iPhonie?&lt;/dt&gt;
    &lt;dd&gt;
        Zerknij na iPhone, czy przypadkiem nie zgasł Ci ekran. Aby korzystać z Remote debugging, musisz ciągle
        mieć otwartą aplikację Safari na pierwszym planie (musi być widoczne).
    &lt;/dd&gt;

    &lt;dt&gt;Co to jest UUID urządzenia?&lt;/dt&gt;
    &lt;dd&gt;
        Pełne rozwinięcie akronimu to &lt;code&gt;Universally unique identifier&lt;/code&gt;.
        Jednoznacznie identyfikuje urządzenie, które podłączyliśmy do
        komputera. Ciąg znaków jest 128-bitowy, więc ma 2&lt;sup&gt;128&lt;/sup&gt;
        kombinacji. Więcej szczegółów dostępnych na Wikipedii (hasło:
        &lt;a href=&quot;https://en.wikipedia.org/wiki/Universally_unique_identifier&quot;&gt;Universally_unique_identifier&lt;/a&gt;).
    &lt;/dd&gt;

&lt;/dl&gt;

&lt;h2 id=&quot;podsumowanie&quot;&gt;Podsumowanie&lt;/h2&gt;

&lt;p&gt;Jak widać wystarczy kilka minut, aby podsłuchiwać dowolne narzędzie z rodziny Apple, czy to będzie iPhone, iPad czy iPod. Trzeba posiadać “kompatybilny” komputer z rodziny Apple. Po podłączeniu kabelkami możemy podglądać co tam “lata w tle”.&lt;/p&gt;

&lt;p&gt;Na oficjalnej stronie firmy Apple, w sekcji dla developerów, znajduje się wyjaśnienie po angielsku, może dla kogoś będzie to przystępniejsza forma pozyskania wiedzy.&lt;/p&gt;

&lt;p&gt;Zapraszam do oficjalnego manuala na &lt;a href=&quot;https://developer.apple.com/library/mac/qa/qa1176/_index.html&quot;&gt;developer.apple.com&lt;/a&gt;.&lt;/p&gt;
</description>
            <pubDate>Tue, 17 May 2016 00:00:00 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2016/05/17/jak-podsluchac-iphona.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2016/05/17/jak-podsluchac-iphona.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/inspect-iphone/sniffing-iphone.png</image>
        </item>
        
        <item>
            <title>WarsawJS Meetup #20</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;To już 20-ty miesiąc z rzędu, kiedy spotykamy się w &lt;a href=&quot;http://panstwomiasto.pl/&quot;&gt;Państwomiasto&lt;/a&gt; i rozmawiamy o JavaScript. Tym razem mieliśmy 4 prelekcje - taka mini konferencja - powrót do korzeni. Dla przypomnienia 2 pierwsze meetupy miały po 4 prelekcje, ale ze względu na sumaryczny czas prelekcji my jako organizatorzy postanowiliśmy skrócić część oficjalną do 3 wystąpień.&lt;/p&gt;

&lt;!-- &lt;figure&gt;
    &lt;a href=&quot;https://www.meetup.com/WarsawJS/&quot;&gt;
        &lt;img src=&quot;/assets/images/posts/post-banner-warsawjs.jpg&quot;
             alt=&quot;WarsawJS&quot;/&gt;
    &lt;/a&gt;
&lt;/figure&gt; --&gt;

&lt;h2 id=&quot;invitation&quot;&gt;Invitation&lt;/h2&gt;

&lt;p&gt;Tym razem pojawiliśmy się na Warszawskich bielanach.&lt;/p&gt;

&lt;p&gt;Dostaliśmy zaproszenie o Ogólnopolski turniej walk rycerskich.&lt;/p&gt;

&lt;p&gt;Zapraszam w imieniu organizatorów WarsawJS.&lt;/p&gt;

&lt;div class=&quot;youtube-lazy&quot; data-youtube-id=&quot;KTr4Sp6wtI0&quot;&gt;&lt;/div&gt;

&lt;p class=&quot;chapter-break&quot;&gt;&amp;bull;&lt;/p&gt;

&lt;h2 id=&quot;talk-1-puppetize-js-pl-krzysztof-suszyński-i-karol-kozakowski&quot;&gt;Talk #1: Puppetize JS [PL] &lt;small&gt;Krzysztof Suszyński i Karol Kozakowski&lt;/small&gt;&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;Link do prelekcji: &lt;a href=&quot;https://www.youtube.com/watch?v=Uwoicz3wX3M&quot;&gt;youtube.com/watch?v=Uwoicz3wX3M&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p class=&quot;chapter-break&quot;&gt;&amp;bull;&lt;/p&gt;

&lt;h2 id=&quot;talk-2-my-first-time-with-angular2-pl-norbert-sienkiewicz&quot;&gt;Talk #2: My first time with Angular2 [PL] &lt;small&gt;Norbert Sienkiewicz&lt;/small&gt;&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;Link do prelekcji: &lt;a href=&quot;https://www.youtube.com/watch?v=knmaXx3yNts&quot;&gt;youtube.com/watch?v=knmaXx3yNts&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p class=&quot;chapter-break&quot;&gt;&amp;bull;&lt;/p&gt;

&lt;h2 id=&quot;talk-3-idea-reaktywnego-programowania-pl-robert-gurgul&quot;&gt;Talk #3: Idea reaktywnego programowania [PL] &lt;small&gt;Robert Gurgul&lt;/small&gt;&lt;/h2&gt;

&lt;p&gt;Robert opowiadał o reaktywnym podejściu do programowania. Do tego tematu wykorzystał bibliotekę &lt;a href=&quot;https://github.com/Reactive-Extensions/RxJS&quot;&gt;RxJS&lt;/a&gt;. Z prelekcji dowiedziałem się mnóstwa nowych i bardzo interesujących rzeczy, do takiego stopnia, że chciałbym zrobić projekt, raczej prosty taki do wypróbowania biblioteki oraz zapoznania się w praktyce z takim podejściem do programowania.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Link do prelekcji: &lt;a href=&quot;https://www.youtube.com/watch?v=zdunjYAyoJw&quot;&gt;youtube.com/watch?v=zdunjYAyoJw&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p class=&quot;chapter-break&quot;&gt;&amp;bull;&lt;/p&gt;

&lt;h2 id=&quot;talk-4-event-sourcing-towards-clarity-en-robert-kawecki&quot;&gt;Talk #4: Event Sourcing: Towards Clarity [EN] &lt;small&gt;Robert Kawecki&lt;/small&gt;&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;Link do prelekcji: &lt;a href=&quot;https://www.youtube.com/watch?v=9GvbCvoNdk4&quot;&gt;youtube.com/watch?v=9GvbCvoNdk4&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p class=&quot;chapter-break&quot;&gt;&amp;bull;&lt;/p&gt;

&lt;h2 id=&quot;sponsorzy-spotkania&quot;&gt;Sponsorzy spotkania&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.facebook.com/Rebased/&quot;&gt;Rebased&lt;/a&gt;, &lt;a href=&quot;https://www.facebook.com/10Clouds/&quot;&gt;10Clouds&lt;/a&gt; - żetony w barze&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.facebook.com/cyfrowypolsat/&quot;&gt;Cyfrowy Polsat&lt;/a&gt; - materiały na YouTube&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.facebook.com/whitestreampl&quot;&gt;Whitestream&lt;/a&gt; - transmisja na żywo - &lt;a href=&quot;http://warsawjs.com/live&quot;&gt;warsawjs.com/live&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.facebook.com/softwarely/&quot;&gt;Softwarely&lt;/a&gt; - dodatkowe wsparcie&lt;/li&gt;
&lt;/ul&gt;
</description>
            <pubDate>Sun, 24 Apr 2016 00:00:00 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2016/04/24/warsawjs-meetup-20.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2016/04/24/warsawjs-meetup-20.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/post-banner-warsawjs.jpg</image>
        </item>
        
        <item>
            <title>WarsawJS Meetup #19</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;19-te spotkanie warszawskich programistów JavaScript.&lt;/p&gt;

&lt;!-- &lt;figure&gt;
    &lt;a href=&quot;https://www.meetup.com/WarsawJS/&quot;&gt;
        &lt;img src=&quot;/assets/images/posts/post-banner-warsawjs.jpg&quot;
             alt=&quot;WarsawJS&quot;/&gt;
    &lt;/a&gt;
&lt;/figure&gt; --&gt;

&lt;h2 id=&quot;invitation&quot;&gt;Invitation&lt;/h2&gt;

&lt;p&gt;Jako warszawski obiekt, przed którym nagramy kolejną zapowiedź, aby pokazać oglądającym jak wygląda Warszawa wybraliśmy fabrykę czekolady Wedel. Znajduje się ona na Pradze na ulicy Grochowskiej.&lt;/p&gt;

&lt;p&gt;Zapraszam w imieniu organizatorów WarsawJS.&lt;/p&gt;

&lt;div class=&quot;youtube-lazy&quot; data-youtube-id=&quot;lgTflzNdSTQ&quot;&gt;&lt;/div&gt;

&lt;p class=&quot;chapter-break&quot;&gt;&amp;bull;&lt;/p&gt;

&lt;h2 id=&quot;talk-1-class-free-oop-en-artur-siery&quot;&gt;Talk #1: Class Free OOP [EN] &lt;small&gt;Artur Siery&lt;/small&gt;&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;Link do prelekcji: &lt;a href=&quot;https://www.youtube.com/watch?v=CxfIeEG8fnE&quot;&gt;youtube.com/watch?v=CxfIeEG8fnE&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p class=&quot;chapter-break&quot;&gt;&amp;bull;&lt;/p&gt;

&lt;h2 id=&quot;talk-2-painless-3d-graphics-in-browser-with-threejs-pl-jakub-skałecki&quot;&gt;Talk #2: Painless 3D graphics in browser with THREE.js [PL] &lt;small&gt;Jakub Skałecki&lt;/small&gt;&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;Link do prelekcji: &lt;a href=&quot;https://www.youtube.com/watch?v=bRjlBejvcog&quot;&gt;youtube.com/watch?v=bRjlBejvcog&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p class=&quot;chapter-break&quot;&gt;&amp;bull;&lt;/p&gt;

&lt;h2 id=&quot;talk-3-js-promises---use-cases-standards-and-libraries-pl-marcin-bychawski&quot;&gt;Talk #3: JS Promises - use cases, standards and libraries [PL] &lt;small&gt;Marcin Bychawski&lt;/small&gt;&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;Link do prelekcji: &lt;a href=&quot;https://www.youtube.com/watch?v=fwOq8lS63q0&quot;&gt;youtube.com/watch?v=fwOq8lS63q0&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p class=&quot;chapter-break&quot;&gt;&amp;bull;&lt;/p&gt;

&lt;h2 id=&quot;sponsorzy-spotkania&quot;&gt;Sponsorzy spotkania&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.facebook.com/Rebased/&quot;&gt;Rebased&lt;/a&gt;, &lt;a href=&quot;https://www.facebook.com/10Clouds/&quot;&gt;10Clouds&lt;/a&gt; - żetony w barze&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.facebook.com/cyfrowypolsat/&quot;&gt;Cyfrowy Polsat&lt;/a&gt; - materiały na YouTube&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.facebook.com/whitestreampl&quot;&gt;Whitestream&lt;/a&gt; - transmisja na żywo - &lt;a href=&quot;http://warsawjs.com/live&quot;&gt;warsawjs.com/live&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.facebook.com/softwarely/&quot;&gt;Softwarely&lt;/a&gt; - dodatkowe wsparcie&lt;/li&gt;
&lt;/ul&gt;
</description>
            <pubDate>Sun, 24 Apr 2016 00:00:00 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2016/04/24/warsawjs-meetup-19.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2016/04/24/warsawjs-meetup-19.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/post-banner-warsawjs.jpg</image>
        </item>
        
        <item>
            <title>Definicje testów</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Często spotykam się z niepoprawnym nazywaniem testów wykonywanych
w procesie wytwarzania oprogramowania. Tym wpisem chciałbym przedstawić
Ci sześć podstawowych typów testów. Mam nadzieje, że będziemy od teraz
porozumiewać się tą samą terminologią (przynajmniej jeżeli chodzi o testy).&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/post-banner-testing.jpg&quot; itemprop=&quot;image&quot; alt=&quot;Baner promujący artykuł&quot; /&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;testy-w-inżynierii-oprogramowania&quot;&gt;Testy w Inżynierii Oprogramowania&lt;/h2&gt;

&lt;h3 id=&quot;testy-jednostkowe-unit-testing&quot;&gt;Testy jednostkowe &lt;small&gt;(unit testing)&lt;/small&gt;&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Testy stworzone przez autorów kodu&lt;/strong&gt;, które testują
pojedyncze funkcje. Czasami można pod tą definicje zalicza się także klasa.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Bardzo lubię pisać testy jednostkowe, ponieważ po ich napisaniu dla
danej funkcji, mam pewność poprawności jej działania. Podnosi to mój
komfort podczas pracy twórczej (implementacji).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Każdy z testów powinien być uruchomiony w izolowanym środowisku. Co to oznacza?
A no tyle że wynika działania jednego testu NIE MOŻE wpływać na drugi. W tym
miejscu warto poznać &lt;a href=&quot;/blog/2017/05/31/angular-jak-zamockowac-dane-do-uslugi-http.html&quot;&gt;mocki&lt;/a&gt;.&lt;/p&gt;

&lt;h4 id=&quot;narzędzia&quot;&gt;Narzędzia&lt;/h4&gt;

&lt;p&gt;Jakich narzędzi używam do pisania testów jednostkowych?&lt;/p&gt;

&lt;p&gt;Bardzo lubię składnie i idee, które są zaaplikowane w bibliotece
&lt;a href=&quot;http://jasmine.github.io/&quot;&gt;Jasmine&lt;/a&gt; ale też &lt;a href=&quot;https://mochajs.org/&quot;&gt;Mocha&lt;/a&gt; świetnie się spisuje jako test runner.&lt;/p&gt;

&lt;p&gt;Pół roku temu stworzyłem na GitHubie projekt, gdzie wykorzystałem Jasmine oraz
transpiler &lt;a href=&quot;http://babeljs.io/&quot;&gt;Babel&lt;/a&gt; - &lt;a href=&quot;https://github.com/piecioshka/test-jasmine-babel&quot;&gt;https://github.com/piecioshka/test-jasmine-babel&lt;/a&gt;.
Niestety projekt ten nie zawiera większej definicji testów - nie ma
punktu odniesienia. Jest on zrobiony tylko w celu udowodnienia
(samemu sobie), że można wykorzystywać Babel.js, aby tworzyć testy.&lt;/p&gt;

&lt;p&gt;Projekt &lt;em&gt;opisany poniżej&lt;/em&gt; już może bardziej zaciekawić.&lt;/p&gt;

&lt;p&gt;Dobrym przykładem z większą ilością testów jest biblioteka
&lt;a href=&quot;https://github.com/piecioshka/super-event-emitter&quot;&gt;https://github.com/piecioshka/super-event-emitter&lt;/a&gt;.&lt;br /&gt;
Na dzień 2016-04-16 W katalogu &lt;code class=&quot;highlighter-rouge&quot;&gt;test/unit/specs/&lt;/code&gt; ich liczba &lt;strong&gt;wynosi 32&lt;/strong&gt;.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Ci z Was, którzy nie tworzyli wcześniej testów, to jest to najlepszy
moment, aby w swoim projekcie (tak naprawdę w dowolnym) spróbować
napisać kilka testów jednostkowych.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4 id=&quot;pokrycie-kodu-code-coverage&quot;&gt;Pokrycie kodu &lt;small&gt;(code coverage)&lt;/small&gt;&lt;/h4&gt;

&lt;blockquote&gt;
  &lt;p&gt;Podczas pisania testów jednostkowych ważne jest tzw. &lt;strong&gt;pokrycie
kodu&lt;/strong&gt;. Mam tutaj na myśli, stosunek procentowy: ile linijek kodu
aplikacji zostało uruchomionych podczas testów do całości kodu.
Jeśli coś zostało uruchomione, to TAK JAKBY zostało przetestowane.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Warto napisać kilka asercji to każdego wyrażenia, które coś modyfikuje.&lt;/p&gt;

&lt;blockquote class=&quot;block-average&quot;&gt;
  &lt;p&gt;Wskaźnik pokrycia kodu na poziomie 100%, mówi, że cały kod aplikacji
został uruchomiony podczas testów, ale proszę nie mylcie tego z tym,
że każda linijka została przetestowana.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3 id=&quot;testy-integracyjne-integration-testing&quot;&gt;Testy integracyjne &lt;small&gt;(integration testing)&lt;/small&gt;&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Testy stworzone przez developerów.&lt;/strong&gt; Zweryfikowane są
połączenia między modułami.&lt;/p&gt;

&lt;p&gt;Testy integracyjne to trudniejszy temat. Tutaj pojawia się stworzenie
sztucznego (laboratoryjnego) środowiska, gdzie takie testy można
uruchomić.&lt;/p&gt;

&lt;h4 id=&quot;narzędzia-1&quot;&gt;Narzędzia&lt;/h4&gt;

&lt;p&gt;Podobnie jak w przypadku testów jednostkowych możemy wykorzystać te same
narzędzia, aczkolwiek będziemy potrzebowali sprawdzić nie tylko poprawne
działanie pojedynczej funkcji, ale połączenie jej z inną.&lt;/p&gt;

&lt;h3 id=&quot;testy-end-to-end-e2e-testing&quot;&gt;Testy end-to-end &lt;small&gt;(e2e testing)&lt;/small&gt;&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Testy stworzone przez developerów.&lt;/strong&gt; Testują one procesy
biznesowe w sposób emulujący zachowanie użytkownika. Celem jest przejście przez
dowolny proces z logiki biznesowej w celu potwierdzenia poprawnej implementacji.&lt;/p&gt;

&lt;p&gt;Najczęściej aby przeprowadzić testy E2E należy posiadać rzeczywiste dane.
Przykładem niech będzie posiadanie loginu i hasła użytkownika, aby przetestować
mechanizm logowania użytkownika.&lt;/p&gt;

&lt;h4 id=&quot;narzędzia-2&quot;&gt;Narzędzia&lt;/h4&gt;

&lt;p&gt;Ostatnio chętnie używam narzędzia &lt;a href=&quot;http://nightwatchjs.org/&quot;&gt;Nightwatch.js&lt;/a&gt;. Korzystnym
przykładem takich testów jest bardzo znany sposób nagrywania
scenariusza, takiego jaki tester realizuje podczas swoich testów
funkcjonalnych, a potem ich automatycznego odtwarzania.&lt;/p&gt;

&lt;p&gt;Najpopularniejsze narzędzie do takich testów nosi nazwę &lt;strong&gt;Selenium&lt;/strong&gt;.
Jednak wyżej wymienione przeze mnie narzędzie jest o wiele lepsze dla
nas (developerów JavaScriptu) ponieważ testy tworzymy w języku,
który używamy na co dzień.&lt;/p&gt;

&lt;h3 id=&quot;testy-funkcjonalne-black-box-testing&quot;&gt;Testy funkcjonalne &lt;small&gt;(black-box testing)&lt;/small&gt;&lt;/h3&gt;

&lt;p&gt;Testy przeprowadzane przez osoby z zewnątrz (nie autorów kodu).&lt;/p&gt;

&lt;p&gt;Testy takie są wykonywane najczęściej przez testerów - osobny dział
weryfikujący poprawność działania aplikacji. Developer oddaje
aplikację do testów uruchamiając ją na środowisku stagingowym, po to
aby testerzy mogli ją “przeklikać”.&lt;/p&gt;

&lt;h3 id=&quot;testy-strukturalne-white-box-testing&quot;&gt;Testy strukturalne &lt;small&gt;(white-box testing)&lt;/small&gt;&lt;/h3&gt;

&lt;p&gt;Testy przeprowadzane przez osoby z zewnątrz tak, aby przetestować
wszystkie przypadki kodu, przy tego rodzaju testach pomagają
programiści, aby móc przetestować każdą linijkę.&lt;/p&gt;

&lt;p&gt;Specjalny rodzaj testów funkcjonalnych, gdzie programiści modyfikują
kod aplikacji, aby przetestować przypadki, które ciężko zreprodukować
w środowisku uruchomionej aplikacji (na przykład modyfikacja czasu na
urządzeniach takich jak telewizory).&lt;/p&gt;

&lt;h3 id=&quot;testy-statyczne&quot;&gt;Testy statyczne&lt;/h3&gt;

&lt;p&gt;Autorzy kodu, czytają kod źródłowy w poszukiwaniu błędów składni,
ale też procesów biznesowych.&lt;/p&gt;

&lt;p&gt;Takie testy realizowane są najczęściej podczas &lt;strong&gt;code review&lt;/strong&gt; innego
developera. Z mojego doświadczenia są to testy bardzo pomocne w zakończeniu
zadania - na Twój kod patrzy cały zespół projektowy.&lt;/p&gt;

&lt;p&gt;Moje doświadczenie pokazuje, że warto spotkać się jako zespół i porozmawiać
o konkretnej zmianie, przed wdrożeniem.&lt;/p&gt;

&lt;p&gt;Jeśli realizujecie swoje projekty na GitHubie (albo GitLabie)
to świetnie jest spotkać się zespołem na omawianiu danego Pull
Request-u. Wszyscy skupiają się tylko na tej jednej zmianie (która
może oczywiście dotyczyć wielu plików).&lt;/p&gt;

&lt;h3 id=&quot;testy-dynamiczne&quot;&gt;Testy dynamiczne&lt;/h3&gt;

&lt;p&gt;Porównywanie danych wyjściowych z oczekiwanymi.&lt;/p&gt;

&lt;p&gt;Na analizowanym kodzie (w testach statycznych) dorzucamy testowanie
kodu uruchamiając z przykładowymi danymi w oczekiwaniu na dane
wyjściowe, które to powinny być zgodne z flow implementacji logiki
biznesowej (albo algorytmu).&lt;/p&gt;

&lt;h2 id=&quot;podsumowanie&quot;&gt;Podsumowanie&lt;/h2&gt;

&lt;p&gt;Wystarczy zapamiętanie tych kilku typów testów, wśród których najważniejsze
są 3 pierwsze, a komunikacja w zespołach projektowych może się poprawić.&lt;/p&gt;

&lt;p&gt;Zachęcam wszystkich, którzy jeszcze nie pisali testów jednostkowych
albo integracyjnych do spróbowania. Możecie się wzorować na moich projektach:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/piecioshka/test-jasmine-typescript&quot;&gt;https://github.com/piecioshka/test-jasmine-typescript&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/piecioshka/test-jasmine-babel&quot;&gt;https://github.com/piecioshka/test-jasmine-babel&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/piecioshka/test-blanket-jasmine&quot;&gt;https://github.com/piecioshka/test-blanket-jasmine&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/piecioshka/test-mocha&quot;&gt;https://github.com/piecioshka/test-mocha&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/piecioshka/test-jest&quot;&gt;https://github.com/piecioshka/test-jest&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;!-- Resources --&gt;

</description>
            <pubDate>Sat, 16 Apr 2016 00:00:00 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2016/04/16/definicje-testow.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2016/04/16/definicje-testow.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/post-banner-testing.jpg</image>
        </item>
        
        <item>
            <title>Moja przygoda z monadami w JavaScript</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Kilka lat temu mój kolega z pracy, developer pythona, który to uwielbiał
czytać książki techniczne rozwijając przy tym swój wachlarz umiejętności
zapytał mnie, osoby która zajmowała się JavaScript, jak to w “moim”
języku wyglądają &lt;code class=&quot;highlighter-rouge&quot;&gt;monady&lt;/code&gt;.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/post-banner-javascript.png&quot; itemprop=&quot;image&quot; alt=&quot;Baner promujący artykuł&quot; /&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;flame&quot;&gt;Flame&lt;/h2&gt;

&lt;p&gt;Pierwsze co pomyślałem, to że znowu zaczyna się &lt;em&gt;flame&lt;/em&gt; - czyli kolejna
kłótnia, nad wyższością swojego języka programowania. Nie lubię brać udziału
w takich dyskusjach, ponieważ zwykle poza zwiększeniem poziomu stresu niczego
 wartościowego nie doświadczymy.&lt;/p&gt;

&lt;p&gt;Niestety zawiodłem, ponieważ nie znałem odpowiedzi na jego pytania.&lt;/p&gt;

&lt;p&gt;Wtedy nie wiedziałem czym się charakteryzuje programowanie funkcyjne, tym samym
coś takiego jak monady w JavaScript dla mnie nie istniały.&lt;/p&gt;

&lt;p&gt;Generalnie po kilkudziesięciu minutach researchu dowiedziałem się,
że monady to takie “idiotoodporne” funkcje. Gama metod biblioteki jQuery jest
dobrym przykładem, które to nigdy (a raczej rzadko kiedy) rzucą wyjątku.
Z takim myśleniem zostałem przez kolejne 2-3 lata.&lt;/p&gt;

&lt;h2 id=&quot;po-2-latach-bycia-niedoinformowanym&quot;&gt;Po 2 latach bycia niedoinformowanym…&lt;/h2&gt;

&lt;p&gt;Pewnego dnia mój kolega &lt;a href=&quot;https://www.meetup.com/Monadic-Warsaw/members/158366352/&quot;&gt;Michał Kawalec&lt;/a&gt;, zaprosił mnie
na &lt;a href=&quot;https://www.meetup.com/Monadic-Warsaw/&quot;&gt;Monadic Warsaw&lt;/a&gt;. Mowa tu dokładnie o
&lt;a href=&quot;https://www.meetup.com/Monadic-Warsaw/events/228675674/&quot;&gt;6-tej&lt;/a&gt; edycji. Monadic to organizacja, której przyświeca
cel rozmawiania o programowaniu funkcyjnym. Postanowiłem, że z miła chęcią
się odwdzięczę i opowiem o monadach w JavaScript - doczytam, przygotuję się i
wyjdę na scenę.&lt;/p&gt;

&lt;p&gt;Poczytałem, przestudiowałem.&lt;br /&gt;
Zrobiłem slajdy &lt;a href=&quot;http://piecioshka.github.io/slides-monads-in-javascript/&quot;&gt;http://piecioshka.github.io/slides-monads-in-javascript/&lt;/a&gt;.&lt;br /&gt;
Jestem przygotowany - do dzieła zatem!&lt;/p&gt;

&lt;h2 id=&quot;wychodzę-na-scenę&quot;&gt;Wychodzę na scenę&lt;/h2&gt;

&lt;p&gt;Przyszedłem na spotkanie. Pełna sala.&lt;/p&gt;

&lt;p&gt;Świetnie jest widzieć tylu ludzi, którzy poza swoimi codziennymi
obowiązkami przychodzą na spotkania i się rozwijają.&lt;/p&gt;

&lt;p&gt;Po wysłuchaniu pierwszej prezentacji poprowadzonej przez Bartosza Milewskiego,
który to wyjaśniał teorię kategorii, dowiedziałem się zdecydowanie więcej o
monadach niż przypuszczałem.&lt;/p&gt;

&lt;p&gt;Dowiedziałem się, że monada musi zawsze zwracać inny typ gdy zostanie
zdefiniowany ze względu na swoją naturę. Monady to konstruktory typów.
Dlatego gdy zostaną użyte muszę zwracać rożne wyniki.&lt;/p&gt;

&lt;h2 id=&quot;jquery-to-nie-jest-monada&quot;&gt;jQuery to nie jest monada&lt;/h2&gt;

&lt;p&gt;Biblioteka &lt;a href=&quot;https://jquery.com/&quot;&gt;jQuery&lt;/a&gt;, o której wcześniej pisałem nie jest więc przykładem
na realizację monad w JavaScript.&lt;/p&gt;

&lt;p&gt;Poniżej jeden z slajdów z mojej prezentacji:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/posts/monads/jquery-is-not-a-monad.png&quot; alt=&quot;jQuery to nie monada&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Źródła slajdów dostępne tu: &lt;a href=&quot;https://github.com/piecioshka/slides-monads-in-javascript&quot;&gt;https://github.com/piecioshka/slides-monads-in-javascript&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Podczas swojego researchu przed prezentacją i kompletowaniem źródeł, z których
korzystałem przy tworzeniu slajdów natknąłem się na post
&lt;a href=&quot;https://www.quora.com/Is-jQuery-a-monad&quot;&gt;https://www.quora.com/Is-jQuery-a-monad&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;W pierwszym komentarzu mój poprzednik na scenie wyjaśnił, że wszyscy, którzy
uważają jQuery za monadę, żyją w błędzie.&lt;/p&gt;

&lt;p&gt;jQuery nie jest monadą, ponieważ gdy zastosujemy funkcję jQuery &lt;code class=&quot;highlighter-rouge&quot;&gt;$()&lt;/code&gt; na wyniku
tejże funkcji to otrzymamy ten sam typ obiektu.&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;$($($('body')))&lt;/code&gt; jest tym samym co &lt;code class=&quot;highlighter-rouge&quot;&gt;$('body')&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Podczas mojego researchu dowiedziałem się o 3 aksjomatach, które muszą zostać
spełnione, aby można było coś nazwać monadą.&lt;/p&gt;

&lt;h2 id=&quot;3-prawa-monad&quot;&gt;3 prawa monad&lt;/h2&gt;

&lt;p&gt;Przetłumaczyłem prawa znajdujące się w projekcie
&lt;a href=&quot;https://github.com/piecioshka/my-monad#the-monadic-laws&quot;&gt;https://github.com/piecioshka/my-monad#the-monadic-laws&lt;/a&gt;
na język polski (z góry przepraszam jeśli się pomyliłem w tłumaczeniu).&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;monada jest wraperem na inny typ&lt;/li&gt;
  &lt;li&gt;wszystkie funkcje monad muszą posiadać funkcję do wrapowania samych siebie o
  inne typy danych&lt;/li&gt;
  &lt;li&gt;wszystkie monady muszą być zdolne aby zasilać wartością, które wrapują, inne
  funkcje, dopóki one nie zwrócą kolejnej monady&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;w-czym-monady-pomagają&quot;&gt;W czym monady pomagają?&lt;/h2&gt;

&lt;p&gt;Monady mają pomóc w programowaniu i to robią.&lt;/p&gt;

&lt;p&gt;Najpopularniejszym przykładem monad jest obiekt &lt;code class=&quot;highlighter-rouge&quot;&gt;Promise&lt;/code&gt; w JavaScript.
To dzięki niemu piszemy kod asynchronicznych w sposób bardzo czytelny. Przykład:&lt;/p&gt;

&lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;makeSomething&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;Promise&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;resolve&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;reject&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;nx&quot;&gt;setTimeout&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(()&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;resolve&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;),&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;});&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;nb&quot;&gt;Promise&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;resolve&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;then&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;makeSomething&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;then&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;((&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;nx&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;debug&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;value&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;podsumowanie&quot;&gt;Podsumowanie&lt;/h2&gt;

&lt;p&gt;Temat monad jest bardzo szeroki. Nie opisałem jak samemu stworzyć implementację
chociażby &lt;code class=&quot;highlighter-rouge&quot;&gt;Identity Monad&lt;/code&gt;, ze względu na to, że istnieje już wiele miejsc
gdzie można takie implementację zobaczyć.&lt;/p&gt;

&lt;p&gt;Na swoim profilu na GitHubie stworzyłem projekt, z implementacją monad w JavaScript.
Zapraszam do odwiedzenia przykładowych testów:
&lt;a href=&quot;https://github.com/piecioshka/my-monad&quot;&gt;https://github.com/piecioshka/my-monad&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Aby jeszcze bardziej zapoznać się monadami i ich różnymi typami zapraszam
do 11 slajdu mojej prezentacji na Monadic Warsaw
&lt;a href=&quot;http://piecioshka.github.io/slides-monads-in-javascript/#11&quot;&gt;http://piecioshka.github.io/slides-monads-in-javascript/#11&lt;/a&gt;.
Jest tutaj lista podstawowych typów monad jakie występują w przyrodzie.&lt;/p&gt;

&lt;h2 id=&quot;bibliografia&quot;&gt;Bibliografia&lt;/h2&gt;

&lt;p&gt;Na zakończenie warto zapoznać się ze źródłami, z których czerpałem wiedzę:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=b0EF0VTs9Dc&quot;&gt;Monads &amp;amp; Gonads - Douglas Crockford (GoogleTechTalks)&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://curiosity-driven.org/monads-in-javascript&quot;&gt;Monads in JavaScript&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://channel9.msdn.com/shows/Going+Deep/Brian-Beckman-Dont-fear-the-Monads/&quot;&gt;Brian Beckman: Don’t fear the Monad&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.lispcast.com/monads-and-objects&quot;&gt;Monads and Objects&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://gist.github.com/sym3tri/4370733&quot;&gt;So simple MONAD implementation&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.reddit.com/r/javascript/comments/1fv3w5/deriving_a_useful_monad_in_javascript/&quot;&gt;Step by step into Monads&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/jgnewman/monad.js&quot;&gt;Use monads in JavaScript without needing to know how they work&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.quora.com/Is-jQuery-a-monad&quot;&gt;jQuery is not a monad&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;!-- Resources --&gt;

</description>
            <pubDate>Sat, 12 Mar 2016 00:00:00 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2016/03/12/moja-przygoda-z-monadami-w-javascript.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2016/03/12/moja-przygoda-z-monadami-w-javascript.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/post-banner-javascript.png</image>
        </item>
        
        <item>
            <title>WarsawJS Meetup #18</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Lutowe spotkanie ze śniegiem w tle. Spotkaliśmy się kolejny raz aby porozmawiać o JavaScript.&lt;/p&gt;

&lt;!-- &lt;figure&gt;
    &lt;a href=&quot;https://www.meetup.com/WarsawJS/&quot;&gt;
        &lt;img src=&quot;/assets/images/posts/post-banner-warsawjs.jpg&quot;
             alt=&quot;WarsawJS&quot;/&gt;
    &lt;/a&gt;
&lt;/figure&gt; --&gt;

&lt;h2 id=&quot;invitation&quot;&gt;Invitation&lt;/h2&gt;

&lt;p&gt;Zapowiedz nagraliśmy w Centrum stolicy na pl. Defilad. Chcieliśmy rozpowszechnić informację o lodowisku, które zaprasza wszystkich chętnych do jazdy. Człowiek czasami musi odpocząć od kodu i dokonać aktywności fizycznej 😄&lt;/p&gt;

&lt;p&gt;Zapraszam w imieniu organizatorów WarsawJS.&lt;/p&gt;

&lt;div class=&quot;youtube-lazy&quot; data-youtube-id=&quot;NGDHnj6T5P4&quot;&gt;&lt;/div&gt;

&lt;p class=&quot;chapter-break&quot;&gt;&amp;bull;&lt;/p&gt;

&lt;h2 id=&quot;talk-1-model-współbieżności-i-event-loop-pl-paweł-thomalla&quot;&gt;Talk #1: Model współbieżności i Event Loop [PL] &lt;small&gt;Paweł Thomalla&lt;/small&gt;&lt;/h2&gt;

&lt;p&gt;Paweł jako programista C++ nie ma doświadczenie komercyjnego z JavaScript, jednak odważył się wejść na warszawską scenę i porozmawiać o JavaScript. Paweł w swojej prezentacji wyjaśnił na czym polega pętla zdarzeń - główna idea asynchroniczności w JavaScript.&lt;/p&gt;

&lt;p&gt;Wszystko dzięki zegarom. To one “wrzucają” funkcję do wykonania po zakończeniu aktualnego obrotu. Funkcja zdefiniowana w &lt;code class=&quot;highlighter-rouge&quot;&gt;setTimeout&lt;/code&gt; uruchomi się dopiero gdy obecny kod zostanie uruchomiony w sposób asynchroniczny.&lt;/p&gt;

&lt;p&gt;Slajdy dostępne w opisie filmu.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Link do prelekcji: &lt;a href=&quot;https://www.youtube.com/watch?v=hSCX0_rGqhA&quot;&gt;youtube.com/watch?v=hSCX0_rGqhA&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p class=&quot;chapter-break&quot;&gt;&amp;bull;&lt;/p&gt;

&lt;h2 id=&quot;talk-2-universal-javascript-web-applications-with-react-pl-wojciech-rydel&quot;&gt;Talk #2: Universal JavaScript web applications with React [PL] &lt;small&gt;Wojciech Rydel&lt;/small&gt;&lt;/h2&gt;

&lt;p&gt;Wojtek pierwszy raz pojawił się przed naszą warszawską publicznością. Podczas swojego debiutu opowiedział o uniwersalnym kodzie z użyciem biblioteki &lt;code class=&quot;highlighter-rouge&quot;&gt;React.js&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Slajdy dostępne w opisie filmu.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Link do prelekcji: &lt;a href=&quot;https://www.youtube.com/watch?v=DGdaOLZ_VP8&quot;&gt;youtube.com/watch?v=DGdaOLZ_VP8&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p class=&quot;chapter-break&quot;&gt;&amp;bull;&lt;/p&gt;

&lt;h2 id=&quot;talk-3-automatyzacja-zadań-pl-radosław-krzepkowski&quot;&gt;Talk #3: Automatyzacja zadań [PL] &lt;small&gt;Radosław Krzepkowski&lt;/small&gt;&lt;/h2&gt;

&lt;p&gt;Radek występował dwa razy pod rząd (w zeszłym miesiącu opowiadał o podstawach biblioteki &lt;code class=&quot;highlighter-rouge&quot;&gt;Backbone.js&lt;/code&gt;, tym razem opowiadał o &lt;code class=&quot;highlighter-rouge&quot;&gt;Gulp&lt;/code&gt;-ie, &lt;code class=&quot;highlighter-rouge&quot;&gt;Grunt&lt;/code&gt;-cie oraz generalnie o &lt;code class=&quot;highlighter-rouge&quot;&gt;npm&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Slajdy dostępne w opisie filmu.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Link do prelekcji: &lt;a href=&quot;https://www.youtube.com/watch?v=iFO5y661VhI&quot;&gt;youtube.com/watch?v=iFO5y661VhI&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p class=&quot;chapter-break&quot;&gt;&amp;bull;&lt;/p&gt;

&lt;h2 id=&quot;sponsorzy-spotkania&quot;&gt;Sponsorzy spotkania&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.facebook.com/Rebased/&quot;&gt;Rebased&lt;/a&gt;, &lt;a href=&quot;https://www.facebook.com/10Clouds/&quot;&gt;10Clouds&lt;/a&gt; - żetony w barze&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.facebook.com/cyfrowypolsat/&quot;&gt;Cyfrowy Polsat&lt;/a&gt; - materiały na YouTube&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.facebook.com/whitestreampl&quot;&gt;Whitestream&lt;/a&gt; - transmisja na żywo - &lt;a href=&quot;http://warsawjs.com/live&quot;&gt;warsawjs.com/live&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
            <pubDate>Wed, 24 Feb 2016 00:00:00 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2016/02/24/warsawjs-meetup-18.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2016/02/24/warsawjs-meetup-18.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/post-banner-warsawjs.jpg</image>
        </item>
        
        <item>
            <title>Zezwalaj na wklejanie w Mozilla Firefox</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;W dniu wczorajszym chciałem przetestować kawałek kodu JavaScript. Bardzo prosty kawałek kodu sprawdzający właściwość User-Agent naszej przeglądarki. Chciałem sprawdzić, czy linijka którą napisałem, zadziała na różnych programach do przeglądania internetu.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/firefox/firefox-526x275.jpg&quot; itemprop=&quot;image&quot; alt=&quot;Baner promujący artykuł&quot; /&gt;
&lt;/figure&gt;

&lt;p&gt;Wspomniany kawałek kodu:&lt;/p&gt;

&lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;firefox&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;test&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;navigator&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;userAgent&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Ta linijka na podstawie &lt;code class=&quot;highlighter-rouge&quot;&gt;navigator.userAgent&lt;/code&gt; weryfikuje czy jesteśmy w przeglądarce Mozilla Firefox. Dzięki wyrażeniu regularnemu &lt;code class=&quot;highlighter-rouge&quot;&gt;/firefox/&lt;/code&gt; oraz funkcji &lt;code class=&quot;highlighter-rouge&quot;&gt;test()&lt;/code&gt; weryfikujemy czy w łańcuchu znaków (jakim jest &lt;code class=&quot;highlighter-rouge&quot;&gt;navigator.userAgent&lt;/code&gt;) znajduje się wyraz &lt;code class=&quot;highlighter-rouge&quot;&gt;firefox&lt;/code&gt;, bez znaczenia na wielkość liter (dzięki &lt;code class=&quot;highlighter-rouge&quot;&gt;/i&lt;/code&gt; - wyłączamy tryb &lt;em&gt;case sensitive&lt;/em&gt;).&lt;/p&gt;

&lt;p&gt;W przeglądarce Google Chrome napisałem ten kawałek kodu. &lt;strong&gt;Zwrócił &lt;code class=&quot;highlighter-rouge&quot;&gt;false&lt;/code&gt;&lt;/strong&gt; rzecz jasna.&lt;/p&gt;

&lt;p&gt;Chciałem zweryfikować, czy w przeglądarce Mozilla Firefox, &lt;strong&gt;zwróci &lt;code class=&quot;highlighter-rouge&quot;&gt;true&lt;/code&gt;&lt;/strong&gt;. Otwieram go i wklejam kawałek tekstu.&lt;/p&gt;

&lt;p&gt;Moim oczom ukazuje się następujący komunikat:&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/firefox/firefox-paste-warning.jpg&quot; alt=&quot;&quot; /&gt;

    &lt;figcaption&gt;
        Komunikat zabezpieczający przed wklejeniem kodu do konsoli DevTools w Mozilla Firefox
    &lt;/figcaption&gt;

&lt;/figure&gt;

&lt;blockquote&gt;
  &lt;p&gt;Ostrzeżenie: należy zachować szczególną ostrożność podczas wklejania rzeczy, których się nie rozumie. Takie treści mogą potencjalnie pozwolić atakującemu na kradzież Twojej tożsamości lub przejęcie kontroli nad Twoim komputerem. Należy wprowadzić „zezwalaj na wklejanie” poniżej (nie trzeba zatwierdzać enterem), aby umożliwić wklejanie.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id=&quot;moje-odczucia&quot;&gt;Moje odczucia&lt;/h2&gt;

&lt;p&gt;Pierwsza linijka sugeruje, że &lt;strong&gt;nie wiem co wklejam&lt;/strong&gt;. Doskonale wiem co chcę wkleić. Komunikat trochę kontrowersyjny.&lt;/p&gt;

&lt;p&gt;Na początku myślałem, że to jakiś żart. Ten komunikat prosi, że &lt;cite&gt;mam wpisać “zezwalaj na wklejanie”?&lt;/cite&gt; Strasznie dziwne, ale tak zrobiłem. &lt;strong&gt;Wpisałem te 3 wyrazy&lt;/strong&gt; i … od tego momentu mogłem już wklejać!&lt;/p&gt;

&lt;p&gt;Dziwne to zabezpieczenie, ale jednak zatrzymuje na kilkadziesiąt sekund proces wklejania dowolnego ciągu znaku. Od razu wzbudza trzeźwe myślenie i zadaje pytanie: &lt;strong&gt;czy na pewno to, co chcę zrobić jest zgodne z moralnymi wartościami?&lt;/strong&gt;&lt;/p&gt;

&lt;h2 id=&quot;ciekawostka&quot;&gt;Ciekawostka&lt;/h2&gt;

&lt;p&gt;Referencji do takiego komunikatu w polskim internecie jest tylko kilka. Możecie kliknąć i zobaczyć inne wpisy opisujące o tym zagadnieniu: &lt;a href=&quot;https://www.google.pl/search?q=%22zezwalaj+na+wklejanie%22+firefox&quot;&gt;https://www.google.pl/search?q=%22zezwalaj+na+wklejanie%22+firefox&lt;/a&gt;&lt;/p&gt;
</description>
            <pubDate>Mon, 01 Feb 2016 00:00:00 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2016/02/01/zezwalaj-na-wklejanie-mozilla-firefox.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2016/02/01/zezwalaj-na-wklejanie-mozilla-firefox.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/firefox/firefox-526x275.jpg</image>
        </item>
        
        <item>
            <title>XMLHttpRequest, czyli natywny AJAX</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Dziś zajmiemy się &lt;code class=&quot;highlighter-rouge&quot;&gt;AJAX&lt;/code&gt;em. Za tym określeniem stoi zapytanie do serwera, które jest inicjowane kodem JavaScript. Jeśli chcemy po załadowaniu już całej strony znowu pobrać z serwera dane, to możemy stworzyć takie zapytanie i pobrać tylko dane nam potrzebne.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/post-banner-javascript.png&quot; itemprop=&quot;image&quot; alt=&quot;Baner promujący artykuł&quot; /&gt;
&lt;/figure&gt;

&lt;p&gt;W standardowych stronach internetowych pobieramy nie tylko dane, ale wszystko o stronie, czyli np. wygląd (&lt;code class=&quot;highlighter-rouge&quot;&gt;CSS&lt;/code&gt;) oraz strukturę &lt;code class=&quot;highlighter-rouge&quot;&gt;HTML&lt;/code&gt;, czyli generujemy &lt;strong&gt;odświeżenie&lt;/strong&gt;. Nie potrzebuje znowu pobierać definicji wyglądu strony - przecież ona już raz się wyrenderowała i dobrze wygląda.&lt;/p&gt;

&lt;p&gt;Odświeżenia są kosztowne i nie korzystne dla wszystkich. Dla klienta, bo czeka aż “strona się załaduje”. Dla serwera, bo musi znowu zwracać dużo więcej danych (musi odpowiedzieć na większą ilość zapytań do niego).&lt;/p&gt;

&lt;p&gt;Spróbujemy stworzyć w &lt;strong&gt;czystym JavaScript&lt;/strong&gt; zapytanie do serwera, pobierające tylko te dane, które faktycznie potrzebujemy.&lt;/p&gt;

&lt;h2 id=&quot;konstrukcja-zapytania&quot;&gt;Konstrukcja zapytania&lt;/h2&gt;

&lt;p&gt;Tworzymy nowy obiekt &lt;code class=&quot;highlighter-rouge&quot;&gt;XMLHttpRequest&lt;/code&gt;, który pomoże nam w stworzeniu zapytania do serwera. W odpowiedzi wcale nie musimy otrzymywać pliku w formacie XML. &lt;strong&gt;XML jest to format opisu dokumentu, a nie format wymiany danych.&lt;/strong&gt; Szczególnie w JavaScript nie używamy XMLa, mamy coś lepszego - format JSON.&lt;/p&gt;

&lt;p&gt;Forma notacji JSON jest standardem zdefiniowanym w dokumencie &lt;a href=&quot;http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf&quot;&gt;ECMA-404&lt;/a&gt;. Na &lt;a href=&quot;http://json.org/&quot;&gt;stronie głównej projektu&lt;/a&gt; jest pełny opis formatu w sposób (może) bardziej zrozumiały niż zapis standardu ECMA.&lt;/p&gt;

&lt;p&gt;JSON jest super pomocny, ze względu na to, że jest bardzo podobny do zwykłego obiektu literałowego.&lt;/p&gt;

&lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;xhr&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;XMLHttpRequest&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
&lt;span class=&quot;nx&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;xhr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;readyState&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// 0, czyli `XMLHttpRequest.UNSENT`&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;inicjacja-połączenia&quot;&gt;Inicjacja połączenia&lt;/h2&gt;

&lt;p&gt;Inicjujemy połączenie. Tutaj dopiero zmieniamy stan naszego zapytania z 0 (&lt;code class=&quot;highlighter-rouge&quot;&gt;UNSET&lt;/code&gt;) na 1 (&lt;code class=&quot;highlighter-rouge&quot;&gt;OPENED&lt;/code&gt;). Jak się przedstawiają parametry jakie musimy podać do prawidłowo stworzonego zapytania.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;W pierwszym parametrze ustawiamy metodę protokołu HTTP. Metoda &lt;code class=&quot;highlighter-rouge&quot;&gt;GET&lt;/code&gt; służy do pobierania danych z serwera. Jest ona używana w 90% przypadków komunikacji z serwerem.&lt;/li&gt;
  &lt;li&gt;Drugi parametr to string (łańcuch znaków) w którym jest ścieżka (albo URI) do pliku, który chcemy pobrać. Uwaga! Nie wszystkie zasoby w sieci możemy pobierać. Jest zabezpieczenie w przeglądarkach, które nazywane jest &lt;strong&gt;Same-origin policy&lt;/strong&gt;. Zabezpieczenie to blokuje nam (domyślnie) zapytania do innych serwerów. Jeśli jednak serwer na którym jest plik (który chcemy pobrać) wspiera CORS, to problem przestanie istnieć. CORS to technika zarządzania nagłówkami w konkretny sposób.&lt;/li&gt;
  &lt;li&gt;Kolejny parametr to flaga, odpowiadająca na pytanie, czy to zapytanie ma nie blokować zasobu aplikacji uruchomione w przeglądarce? Jeśli ustawimy na &lt;code class=&quot;highlighter-rouge&quot;&gt;false&lt;/code&gt; to możemy zablokować naszą aplikację na dobre kilka sekund.&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;Kolejne 2 parametry są potrzebne tylko w sytuacji kiedy mamy włączaną podstawową autoryzację HTTP, czyli tzw. “Basic access authentication”&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nx&quot;&gt;xhr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;open&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'GET'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'data.json'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;nx&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;xhr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;readyState&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// 1, czyli `XMLHttpRequest.OPENED`&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;kiedy-będziemy-znali-odpowiedź&quot;&gt;Kiedy będziemy znali odpowiedź?&lt;/h2&gt;

&lt;p&gt;Funkcja &lt;code class=&quot;highlighter-rouge&quot;&gt;xhr.onreadystatechange&lt;/code&gt; (czyli handler), jest ona uruchomiona z każdym zmianą stanu w zapytaniu do serwera.&lt;/p&gt;

&lt;p&gt;Trzy kolejne stany są tutaj użyte:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;2&lt;/strong&gt;, wartość ta jest dostępna we właściwości &lt;code class=&quot;highlighter-rouge&quot;&gt;XMLHttpRequest.HEADERS_RECEIVED&lt;/code&gt;&lt;/p&gt;

    &lt;p&gt;Stan ten oznacza, że zapytanie pobrało już nagłówki z serwera i tylko nagłówki zapytania HTTP.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;3&lt;/strong&gt;, wartość ta jest dostępna we właściwości &lt;code class=&quot;highlighter-rouge&quot;&gt;XMLHttpRequest.LOADING&lt;/code&gt;&lt;/p&gt;

    &lt;p&gt;Stan w którym ładujemy nasze dane. Im większy plik, tym ten stan będzie trwał dłużej.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;strong&gt;4&lt;/strong&gt;, wartość ta jest dostępna we właściwości &lt;code class=&quot;highlighter-rouge&quot;&gt;XMLHttpRequest.DONE&lt;/code&gt;&lt;/p&gt;

    &lt;p&gt;Ostatni stan informuje nas, że zapytanie do serwera się zakończyło.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nx&quot;&gt;xhr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;onreadystatechange&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;readyState&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;XMLHttpRequest&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;DONE&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;c1&quot;&gt;// Odpowiedź z serwera pobieramy w tym miejscu.&lt;/span&gt;
        &lt;span class=&quot;c1&quot;&gt;// Uwaga: tutaj oczekujemy odpowiedzi w formacie JSON.&lt;/span&gt;
        &lt;span class=&quot;nx&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;JSON&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;parse&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;responseText&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;));&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;We właściwości &lt;code class=&quot;highlighter-rouge&quot;&gt;responseText&lt;/code&gt; mamy dostępną odpowiedź z serwera. Jeśli tą odpowiedzą jest plik w formacie XML, to odpowiedź dostępna jest we właściwości &lt;code class=&quot;highlighter-rouge&quot;&gt;responseXML&lt;/code&gt;. Dzięki funkcji &lt;code class=&quot;highlighter-rouge&quot;&gt;JSON.parse&lt;/code&gt; zamieniamy łańcuch znaków na obiekt &lt;code class=&quot;highlighter-rouge&quot;&gt;JavaScript&lt;/code&gt;-owy.&lt;/p&gt;

&lt;h2 id=&quot;wysyłamy-zapytanie&quot;&gt;Wysyłamy zapytanie&lt;/h2&gt;

&lt;p&gt;Ostatnia funkcja z &lt;em&gt;tych najważniejszych&lt;/em&gt; w &lt;code class=&quot;highlighter-rouge&quot;&gt;AJAX&lt;/code&gt;, czyli wysłanie wcześniej stworzonego zapytania.&lt;/p&gt;

&lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nx&quot;&gt;xhr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;send&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;koniec&quot;&gt;Koniec?&lt;/h2&gt;

&lt;p&gt;Co tutaj się zadziało? Po prostu stworzyliśmy zapytanie do serwera. Sklejmy cały kod w jeden.&lt;/p&gt;

&lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;xhr&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;XMLHttpRequest&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
&lt;span class=&quot;nx&quot;&gt;xhr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;open&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'GET'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'data.json'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;nx&quot;&gt;xhr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;onreadystatechange&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;readyState&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;XMLHttpRequest&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;DONE&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;c1&quot;&gt;// Odpowiedź z serwera pobieramy w tym miejscu.&lt;/span&gt;
        &lt;span class=&quot;nx&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;JSON&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;parse&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;responseText&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;));&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;};&lt;/span&gt;
&lt;span class=&quot;nx&quot;&gt;xhr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;send&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Dobrą praktyką&lt;/strong&gt; jest, zamknięcie tego kawałka kodu w funkcję, która będzie przyjmowała 2 parametry: &lt;code class=&quot;highlighter-rouge&quot;&gt;url&lt;/code&gt; oraz &lt;code class=&quot;highlighter-rouge&quot;&gt;callback&lt;/code&gt; - czyli wywołanie zwrotne.&lt;/p&gt;

&lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;makeRequest&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;callback&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;xhr&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;XMLHttpRequest&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;xhr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;open&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'GET'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;xhr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;onreadystatechange&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;readyState&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;XMLHttpRequest&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;DONE&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;nx&quot;&gt;callback&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;responseText&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;};&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;xhr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;send&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Teraz możemy tej funkcji używać w przyjemy sposób bez zbędnego kopiowania kodu, czyli według zasady &lt;strong&gt;DRY - DON’T REPEAT YOURSELF&lt;/strong&gt;:&lt;/p&gt;

&lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nx&quot;&gt;makeRequest&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'data.json'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;response&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;response&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
</description>
            <pubDate>Sat, 30 Jan 2016 00:00:00 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2016/01/30/xml-http-request-natywny-ajax.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2016/01/30/xml-http-request-natywny-ajax.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/post-banner-javascript.png</image>
        </item>
        
        <item>
            <title>Narzędzia Świata: super-event-emitter</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Framework ze wsparciem eventów? Backbone. Świetny i lekki framework. Jednym z 4 fundamentów jest &lt;code class=&quot;highlighter-rouge&quot;&gt;Backbone.Events&lt;/code&gt;. Jego prosta implementacja bardzo przypadła mi do gustu. 4 niezbędne funkcje to: &lt;code class=&quot;highlighter-rouge&quot;&gt;on&lt;/code&gt;, &lt;code class=&quot;highlighter-rouge&quot;&gt;once&lt;/code&gt;, &lt;code class=&quot;highlighter-rouge&quot;&gt;off&lt;/code&gt;, &lt;code class=&quot;highlighter-rouge&quot;&gt;trigger&lt;/code&gt;. Zachęciło mnie to do stworzenia nowego projektu: &lt;a href=&quot;https://github.com/piecioshka/super-event-emitter&quot;&gt;super-event-emitter&lt;/a&gt;. Więcej o nim poniżej.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/post-banner-narzedzia-swiata-super-event-emitter.png&quot; itemprop=&quot;image&quot; alt=&quot;Baner promujący artykuł&quot; /&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;backboneevents&quot;&gt;Backbone.Events&lt;/h2&gt;

&lt;p&gt;Przyzwyczajony do składni:&lt;/p&gt;

&lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nx&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;extend&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;MyCustomObject&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;prototype&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Backbone&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;Events&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Mogłem teraz w mojej definicji &lt;code class=&quot;highlighter-rouge&quot;&gt;MyCustomObject&lt;/code&gt; wyzwalać zdarzenia (&lt;code class=&quot;highlighter-rouge&quot;&gt;trigger&lt;/code&gt;), oraz na nie nasłuchiwać &lt;code class=&quot;highlighter-rouge&quot;&gt;on&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Jednak nie ma sensu używania całej biblioteki &lt;em&gt;Backbone&lt;/em&gt; tylko na potrzeby korzystania ze zdarzeń. Postanowiłem, że w tych aplikacjach, które miały &lt;abbr title=&quot;zależność&quot;&gt;dependency&lt;/abbr&gt; w postaci wyżej wymienionej biblioteki, podmienię na coś. Cokolwiek, co będzie tylko robiło to samo.&lt;/p&gt;

&lt;h2 id=&quot;problem-ze-wspólnym-api&quot;&gt;Problem ze wspólnym API&lt;/h2&gt;

&lt;p&gt;Moje poszukiwania skupiły się na kilku bibliotekach:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.npmjs.org/package/event-emitter&quot;&gt;event-emitter&lt;/a&gt; autorstwa &lt;a href=&quot;https://twitter.com/medikoo&quot;&gt;Mariusza Nowak&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.npmjs.com/package/eventemitter2&quot;&gt;eventemitter2&lt;/a&gt; autorstwa &lt;a href=&quot;https://twitter.com/jasonkuhrt&quot;&gt;Jason Rose-Kuhrt&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;oraz wielu innych z listy wyników wyszukiwania &lt;a href=&quot;https://www.npmjs.com/search?q=event+emitter&quot;&gt;https://www.npmjs.com/search?q=event+emitter&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;przeszukałem również kilka projektów stąd: &lt;a href=&quot;http://microjs.com/#event&quot;&gt;microjs.com/#event&lt;/a&gt;, ale bez rewelacji&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Żadna z nich nie pomogła mi w tym czego chciałem:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Dodać zarządzanie zdarzeniami dla już istniejącego obiektu&lt;/li&gt;
  &lt;li&gt;Callback uruchomiony z przekazanym kontekstem&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;nowy-projekt&quot;&gt;Nowy projekt&lt;/h2&gt;

&lt;p&gt;Dlatego postanowiłem, że napiszę swój. Prawdopodobnie gdzieś w czeluściach internetu można znaleźć bliźniaczy projekt, jednak dla mnie to zbyt duże wyzwania, aby przez kilka dni szukać jakiegoś projektu, który mogę kosztem max 2h pracy stworzyć od zera i być z niego zadowolony.&lt;/p&gt;

&lt;p&gt;Wybrałem ciekawą nazwę i opublikowałem stary projekt, który był pierwotnie stworzony w celach edukacyjnych. Nazwa nowego projektu to &lt;strong&gt;super-event-emitter&lt;/strong&gt;. Przynajmniej tak nazywa się paczka w &lt;em&gt;npm registry&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;W rejestrze paczek &lt;em&gt;npm&lt;/em&gt; można znaleźć ogromną liczbę różnych event emitterów. Chciałem mieć najlżejsza wersję (w miarę możliwości) ale również i czytelną.&lt;/p&gt;

&lt;h2 id=&quot;super-event-emitter-api&quot;&gt;Super Event Emitter API&lt;/h2&gt;

&lt;p&gt;Publiczny interfejs jest bardzo prosty. Opieramy się na 4 funkcjach: &lt;code class=&quot;highlighter-rouge&quot;&gt;on&lt;/code&gt;, &lt;code class=&quot;highlighter-rouge&quot;&gt;once&lt;/code&gt;, &lt;code class=&quot;highlighter-rouge&quot;&gt;off&lt;/code&gt;, &lt;code class=&quot;highlighter-rouge&quot;&gt;emit&lt;/code&gt;. Nic więcej. Nazwy mówią same za siebie.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;on&lt;/code&gt; - nasłuchujemy na event, który uruchomi callback, w ewentualnym przekazanym kontekście&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;once&lt;/code&gt; - podobnie jak &lt;code class=&quot;highlighter-rouge&quot;&gt;on&lt;/code&gt;, ale po pierwszym wyzwoleniu zdarzenia, kasujemy tego listenera&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;off&lt;/code&gt; - kasujemy przekazany listener według jego nazwy i konkretnej definicji callbacka&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;emit&lt;/code&gt; - krótsza nazwa niż &lt;code class=&quot;highlighter-rouge&quot;&gt;trigger&lt;/code&gt;, wyzwala zdarzenie&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;SuperEventEmitter&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;require&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'super-event-emitter'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

&lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;MyCar&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;SuperEventEmitter&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;mixin&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;ferrari&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;MyCar&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;

&lt;span class=&quot;nx&quot;&gt;ferrari&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;on&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;s1&quot;&gt;'test'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;nx&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'triggered!'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

&lt;span class=&quot;nx&quot;&gt;ferrari&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;emit&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'test'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Przykład dostępny tutaj: &lt;a href=&quot;https://tonicdev.com/56a74ef27f528a0d002fabb5/56aa9e75c8f1470c0060db4f&quot;&gt;https://tonicdev.com/56a74ef27f528a0d002fabb5/56aa9e75c8f1470c0060db4f&lt;/a&gt;&lt;/p&gt;

&lt;h2 id=&quot;podsumowanie&quot;&gt;Podsumowanie&lt;/h2&gt;

&lt;p&gt;Jestem bardzo zadowolony, że w projekcie, gdzie dorzucałem 2k linii (&lt;em&gt;Backbone&lt;/em&gt;) tylko po to, aby mieć wsparcie zdarzeń, teraz mogę dodać 140 linii i jestem zadowolony, że wszystko działa pięknie!&lt;/p&gt;
</description>
            <pubDate>Fri, 29 Jan 2016 00:00:00 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2016/01/29/narzedzia-swiata-super-event-emitter.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2016/01/29/narzedzia-swiata-super-event-emitter.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/post-banner-narzedzia-swiata-super-event-emitter.png</image>
        </item>
        
        <item>
            <title>React Warsaw #2</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Druga wizyta na &lt;a href=&quot;https://www.meetup.com/React-Warsaw/events/228081067/&quot;&gt;React Warsaw&lt;/a&gt;. Sponsor spotkania była firma &lt;a href=&quot;https://www.syncano.io/&quot;&gt;Syncano&lt;/a&gt;, która ugościła w swoim biurze wszystkich członków spotkania.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/reactjs-warsaw/reactjs-warsaw-logo-526x275.jpg&quot; itemprop=&quot;image&quot; alt=&quot;Baner promujący artykuł&quot; /&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;talk-1-react-starter-kit-pl-daniel-kopka&quot;&gt;Talk #1: React Starter Kit [PL] &lt;small&gt;Daniel Kopka&lt;/small&gt;&lt;/h2&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;Zaczynamy: 18: 37
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Celem tej prezentacji było zebranie kilku(-nastu) narzędzi których trzeba (warto?) używać podczas tworzenia nowej aplikacji w obecnym standardzie (React + webpack + babel).&lt;/p&gt;

&lt;p&gt;Daniel przedstawił swój project layout, czy przykładową strukturę projektu.&lt;/p&gt;

&lt;p&gt;Nie odpowiednie zbudowanie projektu w dużym projekcie, to pierwszy krok, aby z biegiem czasu zagubić się w strukturze i spędzić (niepotrzebnie?) czas na przeszukiwanie, gdzie coś się znajduje.&lt;/p&gt;

&lt;p&gt;Dzięki tej prezentacji dowiedzieliśmy się również jak zbudować swój pierwszy projekt w oparciu o Reacta.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Slajdy: &lt;a href=&quot;http://dancio.github.io/react-warsaw-react-starter-kit/&quot;&gt;dancio.github.io/react-warsaw-react-starter-kit/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;!-- --&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;Koniec z pytaniami: 19:14
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p class=&quot;chapter-break&quot;&gt;&amp;bull;&lt;/p&gt;

&lt;h2 id=&quot;talk-2-react-router---normalnie-i-po-mojemu-pl-rafał-ruciński&quot;&gt;Talk #2: React Router - normalnie i po mojemu [PL] &lt;small&gt;Rafał Ruciński&lt;/small&gt;&lt;/h2&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;Zaczynamy: 19:42
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Rafał opowiadał o routerze w React.js.&lt;/p&gt;

&lt;p&gt;Musiał sprostować zadaniu jaki jest spełnienie zasad &lt;em&gt;izomorficzności&lt;/em&gt;, czyli aby jeszcze przez wyrenderowaniem przez React.js widoku aplikacji, była ona już dostępna dla usera.&lt;/p&gt;

&lt;p&gt;Typowy przykład prerenderingu - to serwer renderuje w po swojej stronie widok i zwraca do przeglądarki, na widoku to już React.js analizuje tworząc sumę kontrolną:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;gdy się zgadzają to React to wykorzysta wyrenderowany kontent do zbudowania komponentów&lt;/li&gt;
  &lt;li&gt;gdy się nie zgadzają to usunie wyrenderowane komponenty (i powiadomi)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Druga część prelekcji była oparta o livecoding.&lt;/p&gt;

&lt;p&gt;Rafał pokazał nam jak działa &lt;em&gt;React Router&lt;/em&gt; i wykorzystał &lt;code class=&quot;highlighter-rouge&quot;&gt;indexroot&lt;/code&gt; aby pokazać, na jakiej stronie jesteśmy. Aplikacja po odświeżeniu od razu przechodziła na wskazaną w adresie stronę.&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;Koniec z pytaniami: 20:34
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
</description>
            <pubDate>Thu, 21 Jan 2016 00:00:00 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2016/01/21/react-warsaw-2.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2016/01/21/react-warsaw-2.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/reactjs-warsaw/reactjs-warsaw-logo-526x275.jpg</image>
        </item>
        
        <item>
            <title>WarsawJS Meetup #17</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Pierwsze spotkanie w tym roku razem z ekipą WarsawJS! Inauguracyjne spotkanie składało się z 3 prezentacji na temat 3 różnych bibliotek: &lt;strong&gt;Meteor.js&lt;/strong&gt;, &lt;strong&gt;Backbone.js&lt;/strong&gt; oraz &lt;strong&gt;ExceptionID.js&lt;/strong&gt; autorstwa Krzysztofa Suszyńskiego - jednego z nas, czyli warszawskich programistów.&lt;/p&gt;

&lt;!-- &lt;figure&gt;
    &lt;a href=&quot;https://www.meetup.com/WarsawJS/&quot;&gt;
        &lt;img src=&quot;/assets/images/posts/post-banner-warsawjs.jpg&quot;
             alt=&quot;WarsawJS&quot;/&gt;
    &lt;/a&gt;
&lt;/figure&gt; --&gt;

&lt;h2 id=&quot;invitation&quot;&gt;Invitation&lt;/h2&gt;

&lt;p&gt;Pierwsze nasze nagranie przeprowadzone nocną porą.&lt;/p&gt;

&lt;p&gt;Postanowiliśmy pojechać do nowej stacji metra na II linii - stacja Centrum Nauki Kopernik.&lt;/p&gt;

&lt;p&gt;Niesamowite światła dają świetne wrażenie przebywania w gwiazdach!&lt;/p&gt;

&lt;p&gt;Zapraszam w imieniu organizatorów WarsawJS.&lt;/p&gt;

&lt;div class=&quot;youtube-lazy&quot; data-youtube-id=&quot;DX8CDC3u3XE&quot;&gt;&lt;/div&gt;

&lt;p class=&quot;chapter-break&quot;&gt;&amp;bull;&lt;/p&gt;

&lt;h2 id=&quot;talk-1-reactive-javascript-all-in-meteorjs-en-jacek-migdał&quot;&gt;Talk #1: Reactive JavaScript all-in: Meteor.js [EN] &lt;small&gt;Jacek Migdał&lt;/small&gt;&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;Link do prelekcji: &lt;a href=&quot;https://www.youtube.com/watch?v=rPZocWdOjTY&quot;&gt;youtube.com/watch?v=rPZocWdOjTY&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p class=&quot;chapter-break&quot;&gt;&amp;bull;&lt;/p&gt;

&lt;h2 id=&quot;talk-2-backbone-podstawy-dobre-praktyki-pl-radosław-krzepkowski&quot;&gt;Talk #2: Backbone. Podstawy, dobre praktyki [PL] &lt;small&gt;Radosław Krzepkowski&lt;/small&gt;&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;Link do prelekcji: &lt;a href=&quot;https://www.youtube.com/watch?v=hC-BDD2ymK8&quot;&gt;youtube.com/watch?v=hC-BDD2ymK8&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p class=&quot;chapter-break&quot;&gt;&amp;bull;&lt;/p&gt;

&lt;h2 id=&quot;talk-3-exceptionidjs---obsługa-sytuacji-wyjątkowych-pl-krzysztof-suszyński&quot;&gt;Talk #3: ExceptionID.JS - obsługa sytuacji wyjątkowych [PL] &lt;small&gt;Krzysztof Suszyński&lt;/small&gt;&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;Link do prelekcji: &lt;a href=&quot;https://www.youtube.com/watch?v=Eq3E5LwQnRw&quot;&gt;youtube.com/watch?v=Eq3E5LwQnRw&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p class=&quot;chapter-break&quot;&gt;&amp;bull;&lt;/p&gt;

&lt;h2 id=&quot;sponsorzy-spotkania&quot;&gt;Sponsorzy spotkania&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.facebook.com/Rebased/&quot;&gt;Rebased&lt;/a&gt;, &lt;a href=&quot;https://www.facebook.com/10Clouds/&quot;&gt;10Clouds&lt;/a&gt; - żetony w barze&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.facebook.com/cyfrowypolsat/&quot;&gt;Cyfrowy Polsat&lt;/a&gt; - materiały na YouTube&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.facebook.com/whitestreampl&quot;&gt;Whitestream&lt;/a&gt; - transmisja na żywo - &lt;a href=&quot;http://warsawjs.com/live&quot;&gt;warsawjs.com/live&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
            <pubDate>Sun, 17 Jan 2016 00:00:00 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2016/01/17/warsawjs-meetup-17.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2016/01/17/warsawjs-meetup-17.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/post-banner-warsawjs.jpg</image>
        </item>
        
        <item>
            <title>WarsawJS Meetup #16</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Ostatnie w tym roku spotkanie było szczególne. Mikołajkowe spotkanie było zakończone zupełnie inaczej niż inne spotkania w tym roku. WarsawJS miało specjalnego - eventowego - sponsora który to ufundował grę planszową &lt;strong&gt;Vendors&lt;/strong&gt; (Dostawcy) dla każdego członka spotkania.&lt;/p&gt;

&lt;!-- &lt;figure&gt;
    &lt;a href=&quot;https://www.meetup.com/WarsawJS/&quot;&gt;
        &lt;img src=&quot;/assets/images/posts/post-banner-warsawjs.jpg&quot;
             alt=&quot;WarsawJS&quot;/&gt;
    &lt;/a&gt;
&lt;/figure&gt; --&gt;

&lt;h2 id=&quot;invitation&quot;&gt;Invitation&lt;/h2&gt;

&lt;p&gt;Zostaliśmy zaproszenie przez jednego z prelegentów najbliższego spotkania “do siebie”, czyli na “Arenę Wspinaczkową Makak” - &lt;a href=&quot;http://www.arenamakak.pl/&quot;&gt;arenamakak.pl/&lt;/a&gt;. Bardzo dużo ludzi w środku, dało nam sygnał, że wspinaczka oraz chodzenie po linie jest bardzo popularnym zajęciem 😄 My nie próbowaliśmy, ale zrobiliśmy coś innego szalonego.&lt;/p&gt;

&lt;p&gt;Wdrapaliśmy się na balkon na wysokości mniej więcej 12m nad ziemią i stamtąd nagraliśmy zapowiedź trzeciej prelekcji Piotrka Błaszczaka o generatorach.&lt;/p&gt;

&lt;div class=&quot;youtube-lazy&quot; data-youtube-id=&quot;LZkyx006FlE&quot;&gt;&lt;/div&gt;

&lt;p class=&quot;chapter-break&quot;&gt;&amp;bull;&lt;/p&gt;

&lt;h2 id=&quot;talk-1-programowanie-współbieżne-w-javascript-pl-bartłomiej-sobczuk&quot;&gt;Talk #1: Programowanie współbieżne w JavaScript [PL] &lt;small&gt;Bartłomiej Sobczuk&lt;/small&gt;&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;Link do prelekcji: &lt;a href=&quot;https://www.youtube.com/watch?v=Vq0zKmlLWa0&quot;&gt;youtube.com/watch?v=Vq0zKmlLWa0&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p class=&quot;chapter-break&quot;&gt;&amp;bull;&lt;/p&gt;

&lt;h2 id=&quot;talk-2-react-native-czyli-zaprogramujmy-natywną-aplikację-mobilną-w-js-pl-tomasz-netczuk&quot;&gt;Talk #2: React Native, czyli zaprogramujmy natywną aplikację mobilną w JS [PL] &lt;small&gt;Tomasz Netczuk&lt;/small&gt;&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;Link do prelekcji: &lt;a href=&quot;https://www.youtube.com/watch?v=2lX4-QVkNoI&quot;&gt;youtube.com/watch?v=2lX4-QVkNoI&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p class=&quot;chapter-break&quot;&gt;&amp;bull;&lt;/p&gt;

&lt;h2 id=&quot;talk-3-do-what-you-love-automate-the-rest-en-piotr-błaszczak&quot;&gt;Talk #3: Do what you love, automate the rest… [EN] &lt;small&gt;Piotr Błaszczak&lt;/small&gt;&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;Link do prelekcji: &lt;a href=&quot;https://www.youtube.com/watch?v=fKBJG2nFA_g&quot;&gt;youtube.com/watch?v=fKBJG2nFA_g&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p class=&quot;chapter-break&quot;&gt;&amp;bull;&lt;/p&gt;

&lt;h2 id=&quot;sponsorzy-spotkania&quot;&gt;Sponsorzy spotkania&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.facebook.com/Rebased/&quot;&gt;Rebased&lt;/a&gt;, &lt;a href=&quot;https://www.facebook.com/10Clouds/&quot;&gt;10Clouds&lt;/a&gt; - żetony w barze&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.facebook.com/cyfrowypolsat/&quot;&gt;Cyfrowy Polsat&lt;/a&gt; - materiały na YouTube&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.facebook.com/whitestreampl&quot;&gt;Whitestream&lt;/a&gt; - transmisja na żywo - &lt;a href=&quot;http://warsawjs.com/live&quot;&gt;warsawjs.com/live&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
            <pubDate>Sat, 26 Dec 2015 00:00:00 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2015/12/26/warsawjs-meetup-16.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2015/12/26/warsawjs-meetup-16.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/post-banner-warsawjs.jpg</image>
        </item>
        
        <item>
            <title>WarsawJS Meetup #15</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Meetup taki jak ten, mają to do siebie, że jest wielce prawdopodobne usłyszenie wiele ciekawych historii, ponieważ prelegentami byli prelegencie, którzy nie gościli pierwszy raz na scenie (no może poza Mariuszem) oraz mają bogate doświadczenie zawodowe.&lt;/p&gt;

&lt;!-- &lt;figure&gt;
    &lt;a href=&quot;https://www.meetup.com/WarsawJS/&quot;&gt;
        &lt;img src=&quot;/assets/images/posts/post-banner-warsawjs.jpg&quot;
             alt=&quot;WarsawJS&quot;/&gt;
    &lt;/a&gt;
&lt;/figure&gt; --&gt;

&lt;h2 id=&quot;invitation&quot;&gt;Invitation&lt;/h2&gt;

&lt;p&gt;Jesień kojarzy się z nostalgią, dlatego nagrywając zapowiedź chcieliśmy tchnąć nieco życia. Kolory jesieni, bardzo mi odpowiadają, pewnie ze względu na mój zewnętrzny odbiór oraz dress code.&lt;/p&gt;

&lt;div class=&quot;youtube-lazy&quot; data-youtube-id=&quot;0eER57taqes&quot;&gt;&lt;/div&gt;

&lt;p class=&quot;chapter-break&quot;&gt;&amp;bull;&lt;/p&gt;

&lt;h2 id=&quot;talk-1-introduction-to-linked-html-library-en-dominik-lubański&quot;&gt;Talk #1: Introduction to Linked HTML library [EN] &lt;small&gt;Dominik Lubański&lt;/small&gt;&lt;/h2&gt;

&lt;p&gt;Dominik jako kolejny warszawski developer wystąpił w roli twórca/autora biblioteki o której to opowiedział. Jako WarsawJS uruchomiliśmy specjalny hashtag pod nazwą: &lt;a href=&quot;https://www.facebook.com/hashtag/wspierajmywarszawsk%C4%85tw%C3%B3rczo%C5%9B%C4%87&quot;&gt;#wspierajmywarszawskątwórczość&lt;/a&gt;, aby agregować twórczość warszawskich programistów.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Link do prelekcji: &lt;a href=&quot;https://www.youtube.com/watch?v=Acdhiu7_g34&quot;&gt;youtube.com/watch?v=Acdhiu7_g34&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p class=&quot;chapter-break&quot;&gt;&amp;bull;&lt;/p&gt;

&lt;h2 id=&quot;talk-2-lodash-methods-with-practical-examples-en-illarion-khapyorskiy&quot;&gt;Talk #2: Lodash methods with practical examples [EN] &lt;small&gt;Illarion Khapyorskiy&lt;/small&gt;&lt;/h2&gt;

&lt;p&gt;Lodash jako mocny konkurent dla Underscore.js, charakteryzuje się mocnym podziałem na moduły.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Link do prelekcji: &lt;a href=&quot;https://www.youtube.com/watch?v=Crj-8xjzaLc&quot;&gt;youtube.com/watch?v=Crj-8xjzaLc&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p class=&quot;chapter-break&quot;&gt;&amp;bull;&lt;/p&gt;

&lt;h2 id=&quot;talk-3-aplikacja-back-end-owa-w-nodejs-z-bazą-danych-oracle-pl-mariusz-lichota&quot;&gt;Talk #3: Aplikacja Back-end-owa w Node.js z bazą danych Oracle [PL] &lt;small&gt;Mariusz Lichota&lt;/small&gt;&lt;/h2&gt;

&lt;p&gt;Prelekcja o tym, jak ten “ciężki” Oracle może szybko komunikować się z Node.js.&lt;/p&gt;

&lt;p&gt;Czasy requestu, którymi pochwalił się Mariusz, robią wrażenie!&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Link do prelekcji: &lt;a href=&quot;https://www.youtube.com/watch?v=7OK4i9HkXBQ&quot;&gt;youtube.com/watch?v=7OK4i9HkXBQ&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p class=&quot;chapter-break&quot;&gt;&amp;bull;&lt;/p&gt;

&lt;h2 id=&quot;sponsorzy-spotkania&quot;&gt;Sponsorzy spotkania&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.facebook.com/Rebased/&quot;&gt;Rebased&lt;/a&gt;, &lt;a href=&quot;https://www.facebook.com/10Clouds/&quot;&gt;10Clouds&lt;/a&gt; - żetony w barze&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.facebook.com/cyfrowypolsat/&quot;&gt;Cyfrowy Polsat&lt;/a&gt; - materiały na YouTube&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.facebook.com/whitestreampl&quot;&gt;Whitestream&lt;/a&gt; - transmisja na żywo - &lt;a href=&quot;http://warsawjs.com/live&quot;&gt;warsawjs.com/live&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
            <pubDate>Sun, 13 Dec 2015 00:00:00 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2015/12/13/warsawjs-meetup-15.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2015/12/13/warsawjs-meetup-15.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/post-banner-warsawjs.jpg</image>
        </item>
        
        <item>
            <title>React Warsaw #1</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Na rynku pojawiła się nowa inicjatywa “React Warsaw” - która (prawdopodobnie) będzie zrzeszać, developerów JavaScript zainteresowanych frameworkiem autorstwa Facebooka.&lt;/p&gt;

&lt;p&gt;Więcej informacji o spotkaniu: &lt;a href=&quot;https://www.meetup.com/React-js-Warsaw/events/227108785/&quot;&gt;meetup.com/React-js-Warsaw/events/227108785/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Poniżej chciałbym przedstawić moje osobiste doświadczenia w związku z pierwszym spotkaniem.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/reactjs-warsaw/reactjs-warsaw-logo-526x275.jpg&quot; itemprop=&quot;image&quot; alt=&quot;Baner promujący artykuł&quot; /&gt;
&lt;/figure&gt;

&lt;p&gt;Spotkaliśmy się w interesującej lokalizacji “Sienna Training Centre” (Sienna 73).&lt;/p&gt;

&lt;p&gt;Pierwsze spotkanie zawsze stoi pod znakiem zapytania dla organizatorów.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Czy przyjdą ludzie?&lt;/li&gt;
  &lt;li&gt;Ile ich przyjdzie?&lt;/li&gt;
  &lt;li&gt;Czy przygotowaliśmy odpowiednią ilość miejsc?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tym razem organizatorzy podeszli do sprawy inaczej niż inne organizacje, zarezerwowali malutką salę “Jowisz”, czego wynikiem było ciągłe wnoszenie krzesełek.&lt;/p&gt;

&lt;p&gt;Organizatorzy spodziewali się 20-25 osób max.&lt;/p&gt;

&lt;p&gt;Obecnych na pierwszym spotkaniu było ok. 50.&lt;/p&gt;

&lt;h2 id=&quot;talk-0---występ-sponsorski-pl-marcin-adamowicz&quot;&gt;Talk #0 - Występ sponsorski [PL] &lt;small&gt;Marcin Adamowicz&lt;/small&gt;&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;Start: 18:30&lt;/li&gt;
  &lt;li&gt;Koniec: 18:40&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sponsor spotkania “&lt;a href=&quot;http://www.astek.pl/&quot;&gt;ASTEK Polska&lt;/a&gt;” - główny sponsor.&lt;/p&gt;

&lt;p&gt;Prelegent zachęcał do współpracy w swojej firmie.&lt;/p&gt;

&lt;h2 id=&quot;talk-1-reactjs-wprowadzenia-pl-marcin-mieszek&quot;&gt;Talk #1: ReactJS Wprowadzenia [PL] &lt;small&gt;Marcin Mieszek&lt;/small&gt;&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;Slajdy: &lt;a href=&quot;https://www.slideshare.net/MarcinMieszek/reactjs-wprowadzenie&quot;&gt;React.js Wprowadzenie&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;co-to-jest-reactjs&quot;&gt;Co to jest React.js?&lt;/h3&gt;

&lt;p&gt;Biblioteka do budowania UI.&lt;/p&gt;

&lt;h3 id=&quot;cechy&quot;&gt;Cechy&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;komponenty tworzymy deklaratywnie&lt;/li&gt;
  &lt;li&gt;bazuje na virtual dom oraz jsx&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;problem-facebooka-3-duże-komponenty&quot;&gt;Problem Facebooka: 3 duże komponenty&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;sidebar&lt;/li&gt;
  &lt;li&gt;powiadomienia w top menu&lt;/li&gt;
  &lt;li&gt;wiadomości w lewym sidebarze&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Jak okiełznać te wszystkie zmiany stanu? Trzeba było wymyślić jakiś sposób.&lt;/p&gt;

&lt;h3 id=&quot;deklaratywne-komponenty&quot;&gt;Deklaratywne komponenty&lt;/h3&gt;

&lt;p&gt;Kod w JSX jest bardziej czytelny niż wersja przetłumaczona. Zachowania i widok w jednym miejscu.&lt;/p&gt;

&lt;h3 id=&quot;virtual-dom---główna-zaleta-biblioteki&quot;&gt;Virtual DOM - główna zaleta biblioteki&lt;/h3&gt;

&lt;p&gt;Operacje na DOMie są kosztowne (wyszukiwanie, zmienianie)&lt;/p&gt;

&lt;p&gt;Za każdym razem kiedy zmieni się komponent, React trzyma w pamięci obecną strukturę oraz poprzednią, następnie szuka jak najmniejszej liczby operacji, aby zaktualizować zwykły DOM.&lt;/p&gt;

&lt;h3 id=&quot;przepływ-danych&quot;&gt;Przepływ danych&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;dane przekazujemy w dół, poprzez property-isy (właściwości)&lt;/li&gt;
  &lt;li&gt;zdarzenia natomiast, są delegowane w górę&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Przekazanie danych - sprawa oczywista.&lt;/p&gt;

&lt;p&gt;Aby komponent zagnieżdżony mogły operować na obecnym stanie, przekazujemy im callbacki.&lt;/p&gt;

&lt;h3 id=&quot;state--props&quot;&gt;State &amp;amp; Props&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;jeśli komponent ma tylko pobrać dane i wyświetlić, to używamy &lt;code class=&quot;highlighter-rouge&quot;&gt;props&lt;/code&gt; (właściwości)&lt;/li&gt;
  &lt;li&gt;stan jest używany do przechowywania danych zmienionych przez dany komponent, np. fakt kliknięcia w przycisk&lt;/li&gt;
  &lt;li&gt;nie trzymamy innych stanów&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;refs&quot;&gt;Refs&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;referencja do elementów w HTML&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;language-html highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;input&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;refs=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;inputName&quot;&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;children&quot;&gt;Children&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;możemy dostawać się do zagnieżdżonych kontenerów za pomocą &lt;code class=&quot;highlighter-rouge&quot;&gt;this.props.children&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;cykl-życia&quot;&gt;Cykl życia&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;jeśli komponent ma jakiś stan początkowy, wtedy ten stan możemy pobrać przez &lt;code class=&quot;highlighter-rouge&quot;&gt;getInitialState&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;domyślna wartość właściwości - &lt;code class=&quot;highlighter-rouge&quot;&gt;getDefaultProps&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;componentDidMount&lt;/code&gt; - komponent został wyrenderowany i chcemy operować na stanie&lt;/li&gt;
&lt;/ul&gt;

&lt;!-- --&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;18:58 - warsztat
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;React.js&lt;/em&gt; ma jednokierunkowy przepływ danych.&lt;/p&gt;

&lt;p&gt;Świetnie współpracuje z Immutable (niezmiennymi) danymi.&lt;/p&gt;

&lt;p&gt;Np. kiedy to &lt;code class=&quot;highlighter-rouge&quot;&gt;Array.prototype.push&lt;/code&gt; zwraca nową listę zadań.&lt;/p&gt;

&lt;p&gt;Aby podpiąć się pod zdarzenia DOM, to korzystamy z atrybutów &lt;code class=&quot;highlighter-rouge&quot;&gt;on*&lt;/code&gt;, np.&lt;/p&gt;

&lt;div class=&quot;language-html highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;button&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;onclick=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;this.addTask&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Pojawił się problem, ponieważ, w bardziej zaawansowanej strukturze przekazywanie parametrów, odbywa się przez przekazanie tych samych propertisów przez kilka komponentów. Rozwiązaniem jest architektura &lt;a href=&quot;https://facebook.github.io/flux/&quot;&gt;Flux&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;React.js&lt;/strong&gt; nie dostarcza gotowych komponentów.&lt;/p&gt;

&lt;p&gt;Angular.js można rozszerzyć tak, aby działał jak React.js korzystając ze słabo udokumentowanego argumentu.&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;Zaczynamy: 18:41
Koniec talków z pytaniami: 19:30 (5 ostatnich minut to pytania)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p class=&quot;chapter-break&quot;&gt;&amp;bull;&lt;/p&gt;

&lt;h2 id=&quot;talk-2-flex---intro-i-przykłady-wykorzystania-pl-damian-legawiec&quot;&gt;Talk #2: Flex - intro i przykłady wykorzystania [PL] &lt;small&gt;Damian Legawiec&lt;/small&gt;&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;Slajdy: &lt;a href=&quot;https://www.slideshare.net/damianlegawiec/intro-to-flux-reactjs-warsaw-1&quot;&gt;Intro to Flux&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Start: 19:47&lt;/li&gt;
  &lt;li&gt;Kontakt: &lt;a href=&quot;https://twitter.com/damianlegawiec&quot;&gt;@damianlegawiec&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Współzałożyciel “Spark Solutions”&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;co-to-jest&quot;&gt;Co to jest?&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;nie jest to framework&lt;/li&gt;
  &lt;li&gt;biblioteka? tak jakby&lt;/li&gt;
  &lt;li&gt;schemat działania przepływu informacji&lt;/li&gt;
  &lt;li&gt;nie jest to MVC - zupełnie inne działanie - bardziej przemyślany dla UI&lt;/li&gt;
  &lt;li&gt;Flux nie narzuca niczego&lt;/li&gt;
  &lt;li&gt;może być używany do przechowywania danych z ORM&lt;/li&gt;
  &lt;li&gt;zwykły obiekt JS, który zostaje wzbogacony o zdarzenia (&lt;code class=&quot;highlighter-rouge&quot;&gt;EventEmitter&lt;/code&gt; albo &lt;code class=&quot;highlighter-rouge&quot;&gt;MicroEvent&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;One way data binding!&lt;/strong&gt;&lt;/p&gt;

&lt;h3 id=&quot;framework-agnostic&quot;&gt;Framework Agnostic&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;można używać z Angular.js oraz Ember.js&lt;/li&gt;
  &lt;li&gt;najlepiej jednak działa z React.js&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;flux&quot;&gt;Flux&lt;/h3&gt;

&lt;p&gt;Zasada działania:&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;Action → Dispatcher → Store → View → Action → Dispatcher
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;store&quot;&gt;Store&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Nie jest to model ani kolekcja&lt;/li&gt;
  &lt;li&gt;Konkretne - gdzie przechowujemy stan aplikacji&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;action&quot;&gt;Action&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;wywoływane są z komponentów Reactowych&lt;/li&gt;
  &lt;li&gt;przekazują parametry - &lt;code class=&quot;highlighter-rouge&quot;&gt;payload = [nazwa, parametry]&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;dispatcher&quot;&gt;Dispatcher&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;może być tylko jeden&lt;/li&gt;
  &lt;li&gt;przekazywanie akcji do Store-a&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;view&quot;&gt;View&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;em&gt;Smart Components&lt;/em&gt; (bezpośrednio podłączone, odrazu widzą zmiany)
    &lt;ul&gt;
      &lt;li&gt;zależne od stanu aplikacji&lt;/li&gt;
      &lt;li&gt;jeśli będzie akcja to prerenderowane&lt;/li&gt;
      &lt;li&gt;dane są przechowywane w State (nie są przekazywane prze props-y&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;em&gt;Dump Components&lt;/em&gt; (tylko do renderowania danych)
    &lt;ul&gt;
      &lt;li&gt;tylko wyświetlają dane&lt;/li&gt;
      &lt;li&gt;nie są zależne od Store-a&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;example&quot;&gt;Example&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://greetabl.com/builder&quot;&gt;https://greetabl.com/builder&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://milanstyle.com/&quot;&gt;https://milanstyle.com/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;!-- --&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;React Dev Tools (Google Chrome)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;kiedy-potrzebujemy-używać-fluxa&quot;&gt;Kiedy potrzebujemy używać Fluxa?&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;kiedy robimy Single Page App (aby wszystko było ze sobą zgrane)&lt;/li&gt;
  &lt;li&gt;zaawansowane UI&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;kiedy-nie-używać&quot;&gt;Kiedy nie używać?&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;jeśli zaczynacie naukę React.js&lt;/li&gt;
  &lt;li&gt;lepiej zacząć od prostych komponentów&lt;/li&gt;
  &lt;li&gt;prosty komponent na statycznej stronie&lt;/li&gt;
&lt;/ul&gt;

&lt;!-- --&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;Zbiór architektonicznych wzorców
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;implementacje&quot;&gt;Implementacje&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Flux - implementacja Facebook-owa&lt;/li&gt;
  &lt;li&gt;Redux - sporo upraszcza, boilerplate jest dużo mniejszy&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
  &lt;p&gt;Na start lepiej zacząć od Flux.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;Nie polecam używać &lt;code class=&quot;highlighter-rouge&quot;&gt;examples/&lt;/code&gt; w Facebook repo. &lt;small&gt;Damian Legawiec&lt;/small&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3 id=&quot;po-zaznajomieniu-się-z-flux-to-2-opcje-do-wyporu&quot;&gt;Po zaznajomieniu się z Flux, to 2 opcje do wyporu&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Redux (aby zaryzykować?, upraszcza wiele elementów)&lt;/li&gt;
  &lt;li&gt;Reflux (konserwatywne)&lt;/li&gt;
  &lt;li&gt;Alt (konserwatywne)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;future-reading-list&quot;&gt;Future Reading List&lt;/h3&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;a href=&quot;http://facebook.github.io/flux/docs/overview.html&quot;&gt;facebook.github.io/flux/docs/overview.html&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://blog.andrewray.me/flux-for-stupid-people/&quot;&gt;blog.andrewray.me/flux-for-stupid-people/&lt;/a&gt; - dużo lepszy niż oficjalny poradnik&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Koniec: 20:15 - czas na pytania&lt;/strong&gt;&lt;/p&gt;

&lt;h3 id=&quot;ile-rzeczy-potrzebuje-aby-zrobić-spa&quot;&gt;Ile rzeczy potrzebuje aby zrobić SPA?&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;React.js - czysty oraz React.js Router (można pominąć Fluxa)&lt;/li&gt;
  &lt;li&gt;Ekosystem wokół React.js nie jest tak skompresowana&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;po-co-jest-dispatcher&quot;&gt;Po co jest Dispatcher?&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;aby nie dało si zrobić za dużo naraz&lt;/li&gt;
  &lt;li&gt;aby można było w łatwy sposób myśleć o zmianach&lt;/li&gt;
  &lt;li&gt;aby tylko jedna zmiana wpływała na stronę&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;czy-używamy-prerender-w-reactjs&quot;&gt;Czy używamy `prerender` w React.js?&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;tak, aby poprawić SEO&lt;/li&gt;
  &lt;li&gt;microformats, dla e-commerce-owych stron&lt;/li&gt;
  &lt;li&gt;Rect.js renderuje, a potem zapamiętuje ten wyrenderowany content&lt;/li&gt;
  &lt;li&gt;nie ma loading screenu&lt;/li&gt;
  &lt;li&gt;user dostaje od razu wszystko&lt;/li&gt;
  &lt;li&gt;Googlebot nie zdegraduje nam strony&lt;/li&gt;
  &lt;li&gt;Googlebot podąży po wygenerowanych linkach&lt;/li&gt;
&lt;/ul&gt;

&lt;!-- --&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;Koniec z pytaniami: 20:35
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
</description>
            <pubDate>Wed, 09 Dec 2015 00:00:00 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2015/12/09/react-warsaw-1.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2015/12/09/react-warsaw-1.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/reactjs-warsaw/reactjs-warsaw-logo-526x275.jpg</image>
        </item>
        
        <item>
            <title>Browser Rendering Optimization</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Dzięki firmie &lt;a href=&quot;http://www.codilime.com/&quot;&gt;CodiLime&lt;/a&gt; mogłem dziś uczestniczyć w spotkaniu poświęconym &lt;strong&gt;optymalizacji&lt;/strong&gt; aplikacji uruchomionych w przeglądarce internetowej.&lt;/p&gt;

&lt;p&gt;Oficjalny profil spotkanie dostępny na &lt;a href=&quot;https://www.meetup.com/Poland-CodiLime-Tech-Talk/events/226809629/&quot;&gt;Meetup.com&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;_Prelegent: &lt;a href=&quot;https://twitter.com/alex_kachura&quot;&gt;Aliosha Kachura&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Miejsce: &lt;strong&gt;&lt;a href=&quot;https://www.mimuw.edu.pl/&quot;&gt;MIMUW&lt;/a&gt;. Sala 4420&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Liczba osób na sali: &lt;strong&gt;23 developerów&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Spotkanie było prowadzone w &lt;strong&gt;języku angielskim&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Slajdy &lt;a href=&quot;http://slides.com/alex-kachura/bro/&quot;&gt;slides.com/alex-kachura/bro/&lt;/a&gt;_&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/browser-render-optimization/browser-render-optimization.jpg&quot; itemprop=&quot;image&quot; alt=&quot;Baner promujący artykuł&quot; /&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;layout&quot;&gt;Layout&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;paint
    &lt;ul&gt;
      &lt;li&gt;composite layers
        &lt;ul&gt;
          &lt;li&gt;developer does not control them&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
      &lt;li&gt;gpu - put picture on the screen&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;app-lifecycles---rail--lair&quot;&gt;App Lifecycles - RAIL / LAIR&lt;/h2&gt;

&lt;table class=&quot;table table-bordered&quot;&gt;
    &lt;thead&gt;
        &lt;tr&gt;
            &lt;th&gt;&lt;/th&gt;
            &lt;th&gt;ms&lt;/th&gt;
        &lt;/tr&gt;
    &lt;/thead&gt;
    &lt;tbody&gt;
        &lt;tr&gt;
            &lt;td&gt;
                &lt;strong&gt;R&lt;/strong&gt;esponse
            &lt;/td&gt;
            &lt;td&gt;100&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;
                &lt;strong&gt;A&lt;/strong&gt;nimate (scrolling) - each frame of animation)
            &lt;/td&gt;
            &lt;td&gt;16 = &lt;em&gt;1s/60 frames&lt;/em&gt;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;
                &lt;strong&gt;I&lt;/strong&gt;dle - nonessential work
            &lt;/td&gt;
            &lt;td&gt;50ms&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;
                &lt;strong&gt;L&lt;/strong&gt;oad
            &lt;/td&gt;
            &lt;td&gt;1000ms&lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;

&lt;h2 id=&quot;typical-frame&quot;&gt;Typical frame&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;JavaScript&lt;/li&gt;
  &lt;li&gt;Style&lt;/li&gt;
  &lt;li&gt;Layout (geometry)&lt;/li&gt;
  &lt;li&gt;Effected element painted&lt;/li&gt;
  &lt;li&gt;Composite together&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You cannot optimize before &lt;strong&gt;measure it&lt;/strong&gt;!&lt;/p&gt;

&lt;p&gt;Timeline in DevTools - very useful.&lt;/p&gt;

&lt;h2 id=&quot;jit-example&quot;&gt;JIT example&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;JavaScript code you wrote, is not the same code that is executed&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;JIT is optimize code before run&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;micro-optimization&quot;&gt;Micro-optimization&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;… is the last thing is that you optimize&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;requestanimationframe-support-ie10&quot;&gt;requestAnimationFrame &lt;small&gt;(Support IE10+)&lt;/small&gt;&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;jQuery still uses timeout (for a backwards compatibility reasons)&lt;/li&gt;
&lt;/ul&gt;

&lt;div&gt;
    &lt;h2&gt;Web workers &lt;small&gt;(Support IE10+)&lt;/small&gt;&lt;/h2&gt;

    &lt;ul&gt;
        &lt;li&gt;main-script.js &lt;small&gt;(HTML5)&lt;/small&gt; → workers.js &lt;small&gt;(Worker)&lt;/small&gt;&lt;/li&gt;
        &lt;li&gt;communicate through &lt;code&gt;postMessage&lt;/code&gt; function&lt;/li&gt;
    &lt;/ul&gt;

&lt;/div&gt;

&lt;h2 id=&quot;limitations-of-web-workers&quot;&gt;Limitations of Web Workers&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;longer initial start and post messages&lt;/li&gt;
  &lt;li&gt;every worker consumes some amount of memory&lt;/li&gt;
  &lt;li&gt;no access to DOM, Window&lt;/li&gt;
  &lt;li&gt;results from workers are copied (&lt;strong&gt;without binary data!&lt;/strong&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;javascript&quot;&gt;JavaScript&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;use Web Workers for long-running operations&lt;/li&gt;
  &lt;li&gt;replace &lt;code class=&quot;highlighter-rouge&quot;&gt;setTimeout&lt;/code&gt;/&lt;code class=&quot;highlighter-rouge&quot;&gt;setInterval&lt;/code&gt; by &lt;code class=&quot;highlighter-rouge&quot;&gt;requestAnimationFrame&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;styles&quot;&gt;Styles&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;reduce complexity of selectors&lt;/li&gt;
  &lt;li&gt;use BEM (block element modifier) methodology&lt;/li&gt;
  &lt;li&gt;reduce number of elements on which style calculation must be calculated&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;layout-1&quot;&gt;Layout&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;flexbox&lt;/li&gt;
  &lt;li&gt;don’t trigger the layout&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;paint-and-compositing&quot;&gt;Paint and Compositing&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;CSS Triggers (by Paul Lewis) - &lt;a href=&quot;http://csstriggers.com/&quot;&gt;csstriggers.com/&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;don’t animate the &lt;code class=&quot;highlighter-rouge&quot;&gt;width&lt;/code&gt;, use &lt;code class=&quot;highlighter-rouge&quot;&gt;transform: scale(x);&lt;/code&gt; rule instead&lt;/li&gt;
  &lt;li&gt;CSS property &lt;code class=&quot;highlighter-rouge&quot;&gt;will-change: transform;&lt;/code&gt; (&lt;a href=&quot;http://caniuse.com/#search=will-change&quot;&gt;caniuse.com/#search=will-change&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;window.performance&lt;/code&gt; - try to study it!&lt;/p&gt;

&lt;p&gt;Less layers in Timeline tab in DevTools are better.&lt;/p&gt;

&lt;p&gt;On &lt;a href=&quot;http://jquery.com&quot;&gt;jquery.com&lt;/a&gt; has only one layer.&lt;/p&gt;

&lt;p&gt;Add “will-change” rules to element which are use any transformation.&lt;/p&gt;

&lt;h2 id=&quot;podsumowanie&quot;&gt;Podsumowanie&lt;/h2&gt;

&lt;p&gt;Całe spotkanie było poświęcone optymalizacji - jest to interesujący zabieg zrealizowany przez organizatorów. Takie tematyczne spotkania mają to do siebie, że wszelkie pytanie i wątpliwości dotyczą tylko jednego tematu.&lt;/p&gt;

&lt;p&gt;Temat optymalizacji stron internetowych w dzisiejszych czasach jest tematem dosyć popularnym. Początkujący developerzy nie zwracają na to uwagi, ale w miarę rozwoju zaczynają rozumieć, istotną kwestię optymalizacji.&lt;/p&gt;

&lt;p&gt;Po spotkaniu najaktywniejsi dostali upominki od &lt;strong&gt;CodiLime&lt;/strong&gt; - sponsora dzisiejszego spotkania.&lt;/p&gt;
</description>
            <pubDate>Wed, 25 Nov 2015 00:00:00 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2015/11/25/browser-rendering-optimization.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2015/11/25/browser-rendering-optimization.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/browser-render-optimization/browser-render-optimization.jpg</image>
        </item>
        
        <item>
            <title>Hackathon: Node Knockout #5 (2015)</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Chciałbym podzielić się moimi doświadczeniami z ostatniego hackathonu, w którym uczestniczyłem, co takiego udało mi się stworzyć, jak to wyglądało okiem uczestnika. Podczas minionego weekendu miałem przyjemność uczestniczenia w &lt;strong&gt;Node Knockout 5 - edycja 2015!&lt;/strong&gt;&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/nko-2015/nko-logo-black.png&quot; alt=&quot;&quot; /&gt;

    &lt;figcaption&gt;
        &lt;a href=&quot;http://www.nodeknockout.com/&quot;&gt;Node Knockout 2015&lt;/a&gt;
    &lt;/figcaption&gt;

&lt;/figure&gt;

&lt;h2 id=&quot;hackathon-czyli-co&quot;&gt;Hackathon? czyli co?&lt;/h2&gt;

&lt;p&gt;W świecie developerów pojęcie znane wszystkim tym, którzy chcą czegoś więcej niż to, co codzienna praca nam zapewnia. Rozrywka polega na tym, że jest z góry narzucony czas - w tym przypadku 48h. W tym czasie trzeba stworzyć aplikację, która będzie się podobać nie tylko autorom.&lt;/p&gt;

&lt;p&gt;Aplikacje stworzone podczas &lt;a href=&quot;http://www.nodeknockout.com/&quot;&gt;Node Knockout&lt;/a&gt; (NKO) będą oceniane w 4 kryteriach:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;UTILITY/FUN&lt;/li&gt;
  &lt;li&gt;DESIGN&lt;/li&gt;
  &lt;li&gt;INNOVATION&lt;/li&gt;
  &lt;li&gt;COMPLETENESS&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;zasady&quot;&gt;Zasady&lt;/h2&gt;

&lt;p&gt;W tym roku brało udział mnóstwo zespołów. Prawdopodobnie około 400. Całą przygodę ukończyło 82 zespoły. Przynajmniej tyle team-ów zgłosiło swoje aplikacje do testów.&lt;/p&gt;

&lt;p&gt;Na stronie &lt;a href=&quot;http://www.nodeknockout.com/entries&quot;&gt;nodeknockout.com/entries&lt;/a&gt; jest lista aplikacji zgłoszonych do głosowania. Wśród nich jest także i moja aplikacja:&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/nko-2015/nko-2015.jpg&quot; alt=&quot;&quot; /&gt;

    &lt;figcaption&gt;
        Pozycja w wynikach &lt;a href=&quot;http://www.nodeknockout.com/entries?q=dumplings&quot;&gt;nodeknockout.com/entries?q=dumplings&lt;/a&gt;
    &lt;/figcaption&gt;

&lt;/figure&gt;

&lt;p&gt;Każda aplikacja ma swój profil na witrynie &lt;strong&gt;NKO&lt;/strong&gt;. Postarałem się opisać całą aplikację na stronie &lt;a href=&quot;http://www.nodeknockout.com/teams/dumplings&quot;&gt;nodeknockout.com/teams/dumplings&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;jak-się-programuje-podczas-hackathonu&quot;&gt;Jak się programuje podczas hackathonu?&lt;/h2&gt;

&lt;p&gt;Generalnie, w zawodach zawsze chodzi o to aby być pierwszym. Jeśli chodzi o hackathony, to czas również odgrywa ogromną rolę. Tutaj liczy się tylko pierwsze 48h projektu. Co się będzie działo po tym czasie już nie nikogo nie interesuje.&lt;/p&gt;

&lt;p&gt;Ze względu na czas nie ma tutaj czasu na testy (jednostkowe, integracyjne), dokumentację, czy nawet na refaktoryzację. Jeśli jednak chodzi o ostatni punkt, to ja jestem tak bardzo przywiązany do czytelnego kodu, że nie potrafię pisać wszystkiego (całe aplikacji) w jednym pliku i nie dbać o zmienne. Doświadczyłem tego empirycznie podczas pierwszego NKO.&lt;/p&gt;

&lt;p&gt;Development odbywa się zawsze na GitHubie. Cała historia jest dostępna na profilu projektu: &lt;a href=&quot;https://github.com/nko5/dumplings&quot;&gt;github.com/nko5/dumplings&lt;/a&gt;.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/nko-2015/modulus-logo-small-gray.png&quot; alt=&quot;&quot; /&gt;

    &lt;figcaption&gt;
        Jeden ze sponsorów, firma &lt;a href=&quot;https://modulus.io/&quot;&gt;Modulus&lt;/a&gt;.
    &lt;/figcaption&gt;

&lt;/figure&gt;

&lt;p&gt;Deployment aplikacji był możliwy dzięki jednego ze sponsorów. Firma &lt;a href=&quot;https://modulus.io/&quot;&gt;Modulus&lt;/a&gt; udostępniła swoją usługę do uploadowania paczek aplikacji, oraz hostowania i serwowania plików statycznych. Bardzo proste zasady, prosta instalacja - same plusy!&lt;/p&gt;

&lt;p&gt;Najgorsze chwile podczas hackathonu to takie, w których trzeba rozwiązać bug, a do końca pozostało niewiele. Wtedy człowiek ma chwila zawahania, aby wszystko rzucić, ale z drugiej strony, szkoda.&lt;/p&gt;

&lt;p&gt;Szkoda, tych kilkudziesięciu godzin pracy.&lt;/p&gt;

&lt;h2 id=&quot;jaką-grę-zrobiłem&quot;&gt;Jaką grę zrobiłem?&lt;/h2&gt;

&lt;p&gt;Załączam screen z gry:&lt;/p&gt;

&lt;figure class=&quot;full-width&quot;&gt;
    &lt;img src=&quot;/assets/images/posts/nko-2015/screen-1.png&quot; alt=&quot;&quot; /&gt;

    &lt;figcaption&gt;
        Screenshot z tegorocznej edycji hackathonu.
    &lt;/figcaption&gt;

&lt;/figure&gt;

&lt;h2 id=&quot;pitch-video&quot;&gt;Pitch video&lt;/h2&gt;

&lt;p&gt;Aby zgłoszenie aplikacji to głosowania było traktowane w pełni trzeba było nagrać tzw. &lt;em&gt;pitch video&lt;/em&gt;. Trzeba było pokazać jak aplikacja działa i odpowiedzieć na 3 pytania:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Who is it for?&lt;/li&gt;
  &lt;li&gt;Why would people use it?&lt;/li&gt;
  &lt;li&gt;How does it work?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O tym jak powinno wyglądać idealne video można przeczytać tutaj: &lt;a href=&quot;http://blog.nodeknockout.com/post/35353987436/protip-create-a-perfect-pitch-video-this-year&quot;&gt;blog.nodeknockout.com/post/35353987436/protip-create-a-perfect-pitch-video-this-year&lt;/a&gt;&lt;/p&gt;

&lt;figure&gt;
    &lt;div class=&quot;youtube-lazy&quot; data-youtube-id=&quot;4ORq3-ugtMc&quot;&gt;&lt;/div&gt;

    &lt;figcaption&gt;
        Moja pierwsza mini-prelekcja po angielsku: &lt;a href=&quot;https://www.youtube.com/watch?v=4ORq3-ugtMc&quot;&gt;youtube.com/watch?v=4ORq3-ugtMc&lt;/a&gt;.
    &lt;/figcaption&gt;

&lt;/figure&gt;

&lt;p&gt;INFO: Wideo nagrywałem o 2 w nocy, także proszę o wyrozumiałość.&lt;/p&gt;

&lt;h2 id=&quot;zakończenie-hackathonu---co-dalej&quot;&gt;Zakończenie hackathonu - co dalej?&lt;/h2&gt;

&lt;p&gt;Po zakończeniu 48-mio godzinnych zmagań z kodem, z łataniem bugów a przy tym rozwijaniu nowych funkcji, warto jeszcze stworzyć &lt;strong&gt;demo&lt;/strong&gt; swojej aplikacji (jeśli autorzy uznają, że aplikacja jest gotowa to tego).&lt;/p&gt;

&lt;p&gt;Na tak dużo liczbę aplikacji, zgłosiło się około 10 team-ów z całego świata, które chciało zaprezentować swoje aplikacje. Nie zważając na brak doświadczenia w wypowiadaniu się po angielsku zgłosiłem się na ochotnika.&lt;/p&gt;

&lt;p&gt;Godzinę po zakończeniu zawodów, czyli na czas w Polsce to 2 w nocy organizatorzy stworzyli hangout, podczas ochotnicy opowiadali o swoich aplikacjach.&lt;/p&gt;

&lt;p&gt;Całe wideo jest dostępne poniżej (moja część zaczyna się od 8:30).&lt;/p&gt;

&lt;figure&gt;
    &lt;div class=&quot;youtube-lazy&quot; data-youtube-id=&quot;Ib1G4h1fVuU&quot;&gt;&lt;/div&gt;

    &lt;figcaption&gt;
        &lt;a href=&quot;https://www.youtube.com/watch?v=Ib1G4h1fVuU&quot;&gt;Node Knockout 2015 Demo&lt;/a&gt;
    &lt;/figcaption&gt;

&lt;/figure&gt;

&lt;h2 id=&quot;podsumowanie&quot;&gt;Podsumowanie&lt;/h2&gt;

&lt;p&gt;Imprezę polecam wszystkim tym, którzy chcą sprostać wyzwaniu poddania swojego umysłu maksymalnemu zmęczeniu poprzez ciągłą, wytężoną pracę nad jednym projektem.&lt;/p&gt;

&lt;p&gt;Nie był to mój pierwszy hackathon.&lt;/p&gt;

&lt;p&gt;Brałem już 3 razy udział w NKO oraz jeden raz w &lt;a href=&quot;%7B%%20post_url%202015-01-28-hackathon-staticshowdown-2%20%%7D&quot;&gt;Static Showdown&lt;/a&gt;.&lt;/p&gt;
</description>
            <pubDate>Mon, 09 Nov 2015 00:00:00 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2015/11/09/hackathon-node-knockout-2015.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2015/11/09/hackathon-node-knockout-2015.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/nko-2015/nko-logo-526x275.jpg</image>
        </item>
        
        <item>
            <title>WarsawJS Meetup #14</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Kolejny raz spotkaliśmy się na WarsawJS.&lt;/p&gt;

&lt;p&gt;Jak zwykle było wiele nowych twarzy. Bardzo się cieszę, gdy jest tak duże zainteresowanie spotkaniami. Taki jest cel organizacji, aby aktywizować warszawskich programistów JavaScript.&lt;/p&gt;

&lt;!-- &lt;figure&gt;
    &lt;a href=&quot;https://www.meetup.com/WarsawJS/&quot;&gt;
        &lt;img src=&quot;/assets/images/posts/post-banner-warsawjs.jpg&quot;
             alt=&quot;WarsawJS&quot;/&gt;
    &lt;/a&gt;
&lt;/figure&gt; --&gt;

&lt;h2 id=&quot;invitation&quot;&gt;Invitation&lt;/h2&gt;

&lt;p&gt;Zaproszenie chcieliśmy pierwotnie nagrać w parku, aby pokazać piękno jesieni w mieście.&lt;/p&gt;

&lt;p&gt;Po namysłach pojechaliśmy jednak do parku Fontann, gdzie nagraliśmy zapowiedz na #14 meetup.&lt;/p&gt;

&lt;p&gt;Zapraszam w imieniu organizatorów WarsawJS.&lt;/p&gt;

&lt;div class=&quot;youtube-lazy&quot; data-youtube-id=&quot;SsVvykIX4dQ&quot;&gt;&lt;/div&gt;

&lt;p class=&quot;chapter-break&quot;&gt;&amp;bull;&lt;/p&gt;

&lt;h2 id=&quot;talk-1-ecmascript-7-overview-pl-krzysztof-syrytczyk&quot;&gt;Talk #1: ECMAScript 7 Overview [PL] &lt;small&gt;Krzysztof Syrytczyk&lt;/small&gt;&lt;/h2&gt;

&lt;p&gt;Pierwsza prelekcja Krzyśka na scenie WarsawJS. Trema robiła swoje, ale przebrnął.&lt;/p&gt;

&lt;p&gt;Krzysztof pracuje w Cyfrowym Polsacie na Front-end Developer.&lt;/p&gt;

&lt;p&gt;Dowiedzieliśmy o nowościach języka, które powinny wejść w życie w 2016 roku.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Link do prelekcji: &lt;a href=&quot;https://www.youtube.com/watch?v=1W_BXitt8Eg&quot;&gt;youtube.com/watch?v=1W_BXitt8Eg&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Link do slajdów: &lt;a href=&quot;http://ksyrytczyk.github.io/presentation-warsawjs-es7/&quot;&gt;ksyrytczyk.github.io/presentation-warsawjs-es7/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p class=&quot;chapter-break&quot;&gt;&amp;bull;&lt;/p&gt;

&lt;h2 id=&quot;talk-2-ember-20---whats-new-and-how-to-upgrade-en-krzysztof-białek&quot;&gt;Talk #2: Ember 2.0 - what’s new and how to upgrade [EN] &lt;small&gt;Krzysztof Białek&lt;/small&gt;&lt;/h2&gt;

&lt;p&gt;Druga prezentacja była poprowadzona przez kolejnego Krzyśka, tym razem z Rebased.&lt;/p&gt;

&lt;p&gt;Jako Front-end Developer w Rebased pisze na co dzień w Ember.js i dzięki jego uprzejmości, podzielił się z nami swoim doświadczeniem w tym temacie.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Link do prelekcji: &lt;a href=&quot;https://www.youtube.com/watch?v=K2A_-fyoWnw&quot;&gt;youtube.com/watch?v=K2A_-fyoWnw&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Link do slajdów: &lt;a href=&quot;http://krzysztofbialek.github.io/warsawjs-presentation-template/&quot;&gt;krzysztofbialek.github.io/warsawjs-presentation-template/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p class=&quot;chapter-break&quot;&gt;&amp;bull;&lt;/p&gt;

&lt;h2 id=&quot;talk-3-enterprise-interface-architecture-seeking-scalable-design-en-tomasz-ducin&quot;&gt;Talk #3: Enterprise Interface Architecture: Seeking Scalable Design [EN] &lt;small&gt;Tomasz Ducin&lt;/small&gt;&lt;/h2&gt;

&lt;p&gt;Ostatnią prelekcją poprowadził Tomek - Front-end Developer z doświadczeniem, które zaczął rozwijać od 2005 roku. Tomasz podczas prelekcji powiedział, że nie chce być Back-end Developerem, ale na pewnym etapie pracy Front-end Developera, musi on wiedzieć jak działa Back-end, aby był świadom swoich zabiegów w pracy Front-end-owej. Zgadzam się całkowicie. Jeśli developer zna całą ścieżkę procesu, który zostanie stworzony aby “obsłużyć” (ale brzydkie słowo) klienta, to ma pełną wiedzę, co się dzieje na każdym etapie. Jeśli pojawi się dowolny problem, to na pewno lepiej takiemu developerowi zdiagnozować przyczynę.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Link do prelekcji: &lt;a href=&quot;https://www.youtube.com/watch?v=a6kIeFimgxA&quot;&gt;youtube.com/watch?v=a6kIeFimgxA&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Link do slajdów: &lt;a href=&quot;http://slides.com/ducin/seeking-scalable-design&quot;&gt;slides.com/ducin/seeking-scalable-design&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p class=&quot;chapter-break&quot;&gt;&amp;bull;&lt;/p&gt;

&lt;h2 id=&quot;sponsorzy-spotkania&quot;&gt;Sponsorzy spotkania&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.facebook.com/Rebased/&quot;&gt;Rebased&lt;/a&gt;, &lt;a href=&quot;https://www.facebook.com/10Clouds/&quot;&gt;10Clouds&lt;/a&gt; - żetony w barze&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.facebook.com/cyfrowypolsat/&quot;&gt;Cyfrowy Polsat&lt;/a&gt; - materiały na YouTube&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.facebook.com/whitestreampl&quot;&gt;Whitestream&lt;/a&gt; - transmisja na żywo - &lt;a href=&quot;http://warsawjs.com/live&quot;&gt;warsawjs.com/live&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
            <pubDate>Thu, 29 Oct 2015 00:00:00 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2015/10/29/warsawjs-meetup-14.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2015/10/29/warsawjs-meetup-14.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/post-banner-warsawjs.jpg</image>
        </item>
        
        <item>
            <title>HbbTV: lista źródeł</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;&lt;abbr title=&quot;Hybrid Broadcast Broadband TV&quot;&gt;HbbTV&lt;/abbr&gt; jest to technologia dzięki której jest możliwe wpięcie aplikacji webowej do strumienia który zostaje wyświetlany w telewizorze.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/hbbtv/hbbtv.jpg&quot; itemprop=&quot;image&quot; alt=&quot;Baner promujący artykuł&quot; /&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;techniczna-specyfikacja-standardu-hbbtv-v131&quot;&gt;Techniczna specyfikacja standardu HbbTV (v1.3.1)&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.etsi.org/deliver/etsi_ts%5C102700_102799%5C102796%5C01.03.01_60%5Cts_102796v010301p.pdf&quot;&gt;etsi.org/deliver/etsi_ts%5C102700_102799%5C102796%5C01.03.01_60%5Cts_102796v010301p.pdf&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;filmy&quot;&gt;Filmy&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;Materiał filmowy z procesu tworzenia aplikacji wykonanej przez pewnego developera: &lt;a href=&quot;http://www.noterik.nl/hbbtv-example-app/&quot;&gt;noterik.nl/hbbtv-example-app/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;lista-aplikacji&quot;&gt;Lista aplikacji&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://itv.mit-xperts.com/mitxpgo/&quot;&gt;itv.mit-xperts.com/mitxpgo/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;opis-technologii&quot;&gt;Opis technologii&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Hybrid_Broadcast_Broadband_TV&quot;&gt;en.wikipedia.org/wiki/Hybrid_Broadcast_Broadband_TV&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://obywatelhd.pl/index.php/2012/06/19/co-to-jest-hbb-tv-i-czemu-powinno-nas-interesowac/&quot;&gt;obywatelhd.pl/index.php/2012/06/19/co-to-jest-hbb-tv-i-czemu-powinno-nas-interesowac/&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.wirtualnemedia.pl/artykul/jak-dziala-telewizja-hybrydowa-czyli-hbbtv&quot;&gt;wirtualnemedia.pl/artykul/jak-dziala-telewizja-hybrydowa-czyli-hbbtv&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.sit.tu-darmstadt.de/fileadmin/user_upload/Group_SIT/Publications/ghiglieri_slides_aprivacyprotectionsystemhbbtv.pdf&quot;&gt;https://www.sit.tu-darmstadt.de/fileadmin/user_upload/Group_SIT/Publications/ghiglieri_slides_aprivacyprotectionsystemhbbtv.pdf&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.viaccess-orca.com/end-to-end/hybrid-tv.html&quot;&gt;viaccess-orca.com/end-to-end/hybrid-tv.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;portale&quot;&gt;Portale&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://hbbtv.pl/&quot;&gt;hbbtv.pl/&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.hdtv.com.pl/&quot;&gt;hdtv.com.pl/&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://hdtvpolska.com/&quot;&gt;hdtvpolska.com/&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.hbbtv.com/&quot;&gt;hbbtv.com/&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://hbbtvsummit.com/&quot;&gt;hbbtvsummit.com/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;pluginy&quot;&gt;Pluginy&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://addons.mozilla.org/pl/firefox/addon/firehbbtv/&quot;&gt;https://addons.mozilla.org/pl/firefox/addon/firehbbtv/&lt;/a&gt; - Plugin do Mozilla Firefox.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;oferty-pracy&quot;&gt;Oferty pracy&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.aplitrak.com/?adid=dG9td2hpdGUuMDQyNzcudHdpQHBlb3BsZXNvdXJjZS5hcGxpdHJhay5jb20&quot;&gt;aplitrak.com/?adid=dG9td2hpdGUuMDQyNzcudHdpQHBlb3BsZXNvdXJjZS5hcGxpdHJhay5jb20&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;artykuły&quot;&gt;Artykuły&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.strefa-zakupowa.pl/blog/rtv/122972-hbbtv-czyli-z-czym-to-sie-je/&quot;&gt;strefa-zakupowa.pl/blog/rtv/122972-hbbtv-czyli-z-czym-to-sie-je/&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.genity.pl/technologie?akt=Pierwsza-transmisja-sygnalu-4k-w-Europie-2014-10-08#.VHHPplWG_jk&quot;&gt;genity.pl/technologie?akt=Pierwsza-transmisja-sygnalu-4k-w-Europie-2014-10-08#.VHHPplWG_jk&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://screenlovers.pl/zaklete-rewiry-hbbtv/&quot;&gt;screenlovers.pl/zaklete-rewiry-hbbtv/&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.videotesty.pl/news/1765/Interaktywna-telewizja-hybrydowa-w-technologii-HbbTV-juz-dostepna-w-telewizorach-Samsung-Smart-TV/&quot;&gt;videotesty.pl/news/1765/Interaktywna-telewizja-hybrydowa-w-technologii-HbbTV-juz-dostepna-w-telewizorach-Samsung-Smart-TV/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;różne&quot;&gt;Różne&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.redsmart.tv/hbbtv-development&quot;&gt;redsmart.tv/hbbtv-development&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://media.opera.com/media/b2b/tv/201203/Opera-TV-HbbTV-option.pdf&quot;&gt;media.opera.com/media/b2b/tv/201203/Opera-TV-HbbTV-option.pdf&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.w3.org/2013/10/tv-workshop/papers/webtv4_submission_10.pdf&quot;&gt;w3.org/2013/10/tv-workshop/papers/webtv4_submission_10.pdf&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.theregister.co.uk/Print/2011/09/28/wtf_is_hbbtv/&quot;&gt;theregister.co.uk/Print/2011/09/28/wtf_is_hbbtv/&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.artsat.eu/hbbtv.html&quot;&gt;artsat.eu/hbbtv.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;projekty&quot;&gt;Projekty&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/anis/2CTv&quot;&gt;github.com/anis/2CTv&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/kalessil/tv.jquery&quot;&gt;github.com/kalessil/tv.jquery&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/Mtillmann/habibiTV&quot;&gt;github.com/Mtillmann/habibiTV&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/itamayo/Fsk_test_4_hbbtv&quot;&gt;github.com/itamayo/Fsk_test_4_hbbtv&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/indarium/hbbTVSenderportal&quot;&gt;github.com/indarium/hbbTVSenderportal&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/sunglim/HbbtvFrameworkTest&quot;&gt;github.com/sunglim/HbbtvFrameworkTest&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/ebu/hbbtv-dvbstream&quot;&gt;github.com/ebu/hbbtv-dvbstream&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/sunglim/HbbTV_Demo_App&quot;&gt;github.com/sunglim/HbbTV_Demo_App&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/g-w/HbbTV-Bench&quot;&gt;github.com/g-w/HbbTV-Bench&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/SmartMediaSystems/hbbtv&quot;&gt;github.com/SmartMediaSystems/hbbtv&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/sunglim/HbbTV_Application_Template&quot;&gt;github.com/sunglim/HbbTV_Application_Template&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/mitxp/HbbTV-Testsuite&quot;&gt;github.com/mitxp/HbbTV-Testsuite&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;panasonic&quot;&gt;Panasonic&lt;/h2&gt;

&lt;p&gt;W telewizorach Panasonic usługa HbbTV nazywa się &lt;code class=&quot;highlighter-rouge&quot;&gt;Aplikacja usługi danych&lt;/code&gt;, jednak jest domyślnie wyłączona na ten rok (trzeba ją samemu włączyć).&lt;/p&gt;

&lt;p&gt;Aby ją aktywować, należy wejść w menu telewizora Panasonic:&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;Menu → Konfiguracja → Ustawienia Wyświetlania → Aplikacja Usługi Danych&lt;/code&gt;.&lt;/p&gt;
</description>
            <pubDate>Wed, 14 Oct 2015 00:00:00 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2015/10/14/hbbtv-lista-zrodel.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2015/10/14/hbbtv-lista-zrodel.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/hbbtv/hbbtv.jpg</image>
        </item>
        
        <item>
            <title>IT Manager Meetup #2</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Drugie spotkanie z cyklu &lt;strong&gt;IT Manager Meetup&lt;/strong&gt;. Tym razem planowane są dwie prelekcje. Na sali jest `8 osób` - kiepska frekwencja. Trochę mnie to dziwi. Takie spotkania powinny cieszyć się większą ilością grona managerów, np. kierowników działów, kierowników projektów, project managerów, Scrum Masterów. A jednak.&lt;/p&gt;

&lt;p&gt;Więcej o spotkaniu można dowiedzieć się na profilu wydarzenia: &lt;a href=&quot;https://www.facebook.com/events/887113191371393/&quot;&gt;facebook.com/events/887113191371393/&lt;/a&gt;&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/it-manager-meetup/it-manager-meetup.jpg&quot; itemprop=&quot;image&quot; alt=&quot;Baner promujący artykuł&quot; /&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;talk-1-zarządzanie-projektami-programistycznymi&quot;&gt;Talk #1: Zarządzanie projektami programistycznymi&lt;/h2&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;Prelegent: Adam Ławcewicz (Project Manager w 10Clouds)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Adam ma 10 lat doświadczenia w Scrum. Nabył je podczas 18 lat pracy w branży.&lt;/p&gt;

&lt;h3 id=&quot;jak-implementujemy-agile&quot;&gt;Jak implementujemy Agile?&lt;/h3&gt;

&lt;p&gt;W którym momencie wiemy, że coś jest nie tak z naszym Scrumem?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;To be on the same page…&lt;/strong&gt;&lt;/p&gt;

&lt;h3 id=&quot;role---kto-kim-jest&quot;&gt;Role - kto kim jest?&lt;/h3&gt;

&lt;h4 id=&quot;scrum-master-sm---nie-jest-kierownikiem-projektu&quot;&gt;Scrum Master (SM) - nie jest kierownikiem projektu&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;jeden SM = jeden projekt&lt;/li&gt;
  &lt;li&gt;niestety nie zawsze tak jest, a tak powinno być&lt;/li&gt;
  &lt;li&gt;nie wolno traktować SM jako awans dla developera&lt;/li&gt;
  &lt;li&gt;SM ma dużo więcej obowiązków, więcej nie ma co odbierać połowy etatu developera&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;product-owner-po&quot;&gt;Product Owner (PO)&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;jedna osoba - one single point of contact&lt;/li&gt;
  &lt;li&gt;jest władcza osoba, która powinna odpowiedzieć na wszystkie pytania&lt;/li&gt;
  &lt;li&gt;my jako SM nie interesujemy się kontaktami PO&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;development-team-dt&quot;&gt;Development Team (DT)&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;zespół do którego możemy wcielić wszystkie osoby, aby wykonać zadanie&lt;/li&gt;
  &lt;li&gt;możemy na część iteracji wcielić grafika, UX developera&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Scrum Team (ST) = SM + PO + DT&lt;/strong&gt;&lt;/p&gt;

&lt;h3 id=&quot;eventy&quot;&gt;Eventy&lt;/h3&gt;

&lt;p&gt;Po czym rozpoznajemy Scruma? Powtarzalne eventy jest to dość charakterystyczne.&lt;/p&gt;

&lt;h4 id=&quot;sprint-planning&quot;&gt;Sprint planning&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;wielka burza mózgów&lt;/li&gt;
  &lt;li&gt;na sam koniec ST ma &lt;abbr title=&quot;zobowiązanie&quot;&gt;commitment&lt;/abbr&gt;, że on to zrealizuje w tym sprincie&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;daily-scrum---stand-up-meeting&quot;&gt;Daily Scrum - stand-up meeting&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;dziennie spotkania - bardzo formalne&lt;/li&gt;
  &lt;li&gt;nie mogą trwać dłużej niż 15 minut&lt;/li&gt;
  &lt;li&gt;zespół powinien wstać od biurek i odpowiedzieć na pytania:
    &lt;ol&gt;
      &lt;li&gt;co wczoraj zrobiłem?&lt;/li&gt;
      &lt;li&gt;co dziś będę robić?&lt;/li&gt;
      &lt;li&gt;czy mam jakieś trudności?&lt;/li&gt;
    &lt;/ol&gt;
  &lt;/li&gt;
  &lt;li&gt;lepiej jest stać, aby szybciej skończyć spotkanie&lt;/li&gt;
  &lt;li&gt;ludzie nie będą się bawili telefonem - jak to zwykle ma miejsce&lt;/li&gt;
  &lt;li&gt;jak się siedzi - to zawsze przekracza się czas - mur beton&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;sprint-review&quot;&gt;Sprint Review&lt;/h4&gt;

&lt;h4 id=&quot;retrospektywa&quot;&gt;Retrospektywa&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;czas po burzliwych spotkaniach (planning i review)&lt;/li&gt;
  &lt;li&gt;team się zbiera i analizuje ostatnią iterację:
    &lt;ol&gt;
      &lt;li&gt;co poszło nie tak - jak się przed tym ochronić next time?&lt;/li&gt;
      &lt;li&gt;co poszło super?&lt;/li&gt;
    &lt;/ol&gt;
  &lt;/li&gt;
  &lt;li&gt;poprawa procesu iteracji, aby ustrzec się w przyszłości przed błędami&lt;/li&gt;
  &lt;li&gt;nie rozmawiamy o problemach na przestrzeni całego projektu, tylko ostatni sprint&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;sprint-classic-planning&quot;&gt;Sprint classic planning&lt;/h3&gt;

&lt;h4 id=&quot;1-nie-estymujemy-w-dniach-godzinach-tylko-w-tzw-story-pointach&quot;&gt;1) Nie estymujemy w dniach, godzinach, tylko w tzw “story pointach”&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;dobrze jest mieć skalę referencyjną&lt;/li&gt;
  &lt;li&gt;np. walidacja hasła na formularzu - 2 story pointy&lt;/li&gt;
  &lt;li&gt;odchodzi się od godzinowego estymowania, aby znieść presję z developera&lt;/li&gt;
  &lt;li&gt;pokazuje trudność zadania
    &lt;ul&gt;
      &lt;li&gt;jak bardzo zadanie jest złożone&lt;/li&gt;
      &lt;li&gt;czy developer jest sam w stanie to zrobić?&lt;/li&gt;
      &lt;li&gt;czy potrzebuje kogoś z zewnątrz?&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;nie należy się bać story pointów!&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;2-planning-poker&quot;&gt;2) Planning poker&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;omawiamy jak zrealizować dane zadanie
    &lt;ul&gt;
      &lt;li&gt;czy to jest trudne zadanie?&lt;/li&gt;
      &lt;li&gt;czy mamy wszystko, aby wykonać zadanie?&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;jestli tak, to gramy w pokera
    &lt;ul&gt;
      &lt;li&gt;ludzie kładą swoje karty na stole&lt;/li&gt;
      &lt;li&gt;gdy wszyscy odłożą to odwracamy karty&lt;/li&gt;
      &lt;li&gt;gdy story point będą takie same - to super&lt;/li&gt;
      &lt;li&gt;w przeciwnym przypadku z dwóch skrajnych story pointów osoby muszą się “wytłumaczyć”&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;3-otwarte-karty&quot;&gt;3) Otwarte karty&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;jeżeli nie ma mamy kart to gramy w otwarte karty&lt;/li&gt;
  &lt;li&gt;bo ludzie małpują estymacje po innych - po autorytecie&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;4-dałbym-3-ale-nie-wiem-czy-mamy-wszystko-aby-zrealizować-to-zadanie&quot;&gt;4) Dałbym 3 ale nie wiem, czy mamy wszystko aby zrealizować to zadanie&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;jeśli nie mamy kompletu informacji o zadaniu, to na planningu to zadanie &lt;em&gt;nie powinno być brane pod uwagę&lt;/em&gt;&lt;/li&gt;
  &lt;li&gt;wszystko musi być jasne&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;Definition Of Ready (DOR)&lt;/em&gt; - przy każdym zadaniu mamy checklistę:
    &lt;ol&gt;
      &lt;li&gt;czy są grafiki?&lt;/li&gt;
      &lt;li&gt;czy jest ux?&lt;/li&gt;
      &lt;li&gt;czy są servery?&lt;/li&gt;
      &lt;li&gt;czy są mockup-y?&lt;/li&gt;
      &lt;li&gt;…&lt;/li&gt;
    &lt;/ol&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;skale&quot;&gt;Skale&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;em&gt;t-shirt scale&lt;/em&gt;: XS, S, M, L, XL, XXL,&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;fruit scale&lt;/em&gt;: cytryna, arbuz, pomarańcza, banan, dynia&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;“Jira” nie rozumie tych skal.&lt;/p&gt;

&lt;h3 id=&quot;daily-scrum&quot;&gt;Daily Scrum&lt;/h3&gt;

&lt;p&gt;Niby 15 minut - krótkie spotkanie - ale bardzo ważne.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;problemy:
    &lt;ul&gt;
      &lt;li&gt;1. “to kto zaczyna?”&lt;/li&gt;
      &lt;li&gt;2. “kto następny?”
        &lt;ul&gt;
          &lt;li&gt;totem - kto ma totem ten mówi, jak ktoś skończy to przekazuje go dalej&lt;/li&gt;
          &lt;li&gt;jeśli zespół zdalny, SM zaczyna, a potem mówi kto następny&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
      &lt;li&gt;3. “po co mamy wstawać od biurka?”
        &lt;ul&gt;
          &lt;li&gt;zwykle te pytanie zadaje autorytet - ta osoba ma poszanowanie&lt;/li&gt;
          &lt;li&gt;nie ma złotego środka na odpowiedź&lt;/li&gt;
          &lt;li&gt;warto się spotkać, aby pokazać cenne dialogi&lt;/li&gt;
          &lt;li&gt;nie wolno takiej osoby ignorować&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
      &lt;li&gt;4. słowotok
        &lt;ul&gt;
          &lt;li&gt;niepotrzebna dyskusja&lt;/li&gt;
          &lt;li&gt;nie rozwiązujemy problemów - od tego są inne spotkania&lt;/li&gt;
          &lt;li&gt;ustalamy, czy mamy się spotkać później&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
      &lt;li&gt;5. zespół zdalnie
        &lt;ul&gt;
          &lt;li&gt;gdy mamy Slacka, to możemy zrobić zdalnie, każdy pisze co zrobił i co będzie robił dziś&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;to nie jest raportowe spotkanie&lt;/li&gt;
  &lt;li&gt;nie raportujemy do kogoś&lt;/li&gt;
  &lt;li&gt;czas powinien być na max wykorzystywany&lt;/li&gt;
  &lt;li&gt;wszyscy powinni mieć czas na wygadanie się - nie wolno nikogo pominąć&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;sprint-review---demo&quot;&gt;Sprint Review - DEMO&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;zespół pokazuje PO status swojej &lt;strong&gt;ostatniej iteracji&lt;/strong&gt;
    &lt;ul&gt;
      &lt;li&gt;opowiedzieć: &lt;em&gt;“co team zrobił?”&lt;/em&gt;&lt;/li&gt;
      &lt;li&gt;punkt po punkcie, jak to, co zespół zrobił działa&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;trzeba zaplanować spotkanie - SM wyznacza kto zaplanuje&lt;/li&gt;
  &lt;li&gt;bardzo profesjonalnie zaplanować&lt;/li&gt;
  &lt;li&gt;problemy:
    &lt;ul&gt;
      &lt;li&gt;nikt nie chce tego pokazać, brak odpowiedzialności&lt;/li&gt;
      &lt;li&gt;nie wolno pokazywać w środowisku &lt;em&gt;localhost&lt;/em&gt;
        &lt;ul&gt;
          &lt;li&gt;bo wtedy PM nie możemy pobawić się daną iteracją&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
      &lt;li&gt;nie wolno dopuszczać, że coś robimy na szybko&lt;/li&gt;
      &lt;li&gt;&lt;em&gt;“przed chwilą działało”&lt;/em&gt; - należy przygotować się, upewnić się, że demo działa&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;lepiej nie pokazać nic, niż pokazywać co może nie działać tak jak byśmy chcieli&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;sprint-retrospective&quot;&gt;Sprint retrospective&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Bardzo wiele błędów jest robionych podczas retrospekcji.&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;“czyste marnowanie czasu”&lt;/li&gt;
  &lt;li&gt;największy potencjał:
    &lt;ul&gt;
      &lt;li&gt;możemy zmotywować zespół&lt;/li&gt;
      &lt;li&gt;usunąć przeszkody&lt;/li&gt;
      &lt;li&gt;zrewidować co się stało&lt;/li&gt;
      &lt;li&gt;udoskonalić&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;musi być zaplanowana przez SM&lt;/li&gt;
  &lt;li&gt;“przecież wszyscy wiemy jak jest”
    &lt;ul&gt;
      &lt;li&gt;jeśli tak, to znaczy, że podczas poprzedniej retrospekcji daliśmy ciała&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;“po co mamy to mówić skoro i tak nikt nic nie zrobi”
    &lt;ul&gt;
      &lt;li&gt;co poszło źłe | co poszło nie tak - na tablicy&lt;/li&gt;
      &lt;li&gt;nie wolno zostawiać rzeczy&lt;/li&gt;
      &lt;li&gt;spisać uwagi zespołu&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;na następnej retrospekcji podsumować ostatni sprint&lt;/li&gt;
  &lt;li&gt;otworzenie się zespołu&lt;/li&gt;
  &lt;li&gt;wpływają na jakość wykonywanej pracy&lt;/li&gt;
  &lt;li&gt;jak my wykonujemy zadania&lt;/li&gt;
  &lt;li&gt;czas na miękkie elementy&lt;/li&gt;
  &lt;li&gt;technik jest dużo&lt;/li&gt;
  &lt;li&gt;SM prosi zespół co poszło nie tak, co super&lt;/li&gt;
  &lt;li&gt;zespół przykleja na tablicy&lt;/li&gt;
  &lt;li&gt;kreska dobrze | źle&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;silent sort&lt;/em&gt; - posortować karteczki, bez komunikacji werbalnej między sortującymi, fajnie gdyby nie sortowali własnych karteczek&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Scrum Masterem&lt;/strong&gt; nie powinna być osobą która dostała awans,&lt;/p&gt;

&lt;p&gt;tylko &lt;strong&gt;osoba która potrafi zobaczyć dużo więcej niż karteczki z tablicy&lt;/strong&gt;.&lt;/p&gt;

&lt;h3 id=&quot;kiedy-scrum--scrum&quot;&gt;Kiedy Scrum = Scrum?&lt;/h3&gt;

&lt;p&gt;Czy można zrobić czekoladowe ciastka bez czekolady?&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;aby S = S muszą być &lt;em&gt;wszystkie rzeczy&lt;/em&gt;, które Scrum przewiduje&lt;/li&gt;
  &lt;li&gt;jak tego dokonać?
    &lt;ul&gt;
      &lt;li&gt;przeczytać &lt;a href=&quot;http://www.scrumguides.org/docs/scrumguide/v1/scrum-guide-us.pdf&quot;&gt;Scrum Guide&lt;/a&gt; (16 stron w PDF)?&lt;/li&gt;
      &lt;li&gt;nic nie pomoże samo przeczytanie&lt;/li&gt;
      &lt;li&gt;zatrudnić &lt;strong&gt;Scrum Coacha&lt;/strong&gt;&lt;/li&gt;
      &lt;li&gt;edukacja Scruma na wszystkich szczeblach organizacji&lt;/li&gt;
      &lt;li&gt;zaczynamy od Zarządu&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Scruma można wprowadzić wszędzie - do życia codziennego również.&lt;/strong&gt;&lt;/p&gt;

&lt;h4 id=&quot;anegdota&quot;&gt;Anegdota&lt;/h4&gt;

&lt;h5 id=&quot;1-dziecko-sortuje-karteczki&quot;&gt;1. Dziecko sortuje karteczki&lt;/h5&gt;

&lt;p&gt;Przyklejamy do karteczki rzeczy, które dziecko musi zrobić każdego dnia, np. umyć zęby, spakować śniadanie do szkoły. Ośmiolatek potrafi dostosować się do tego i w samemu ustalić kolejność realizacji zadań w karteczkach.&lt;/p&gt;

&lt;h5 id=&quot;2-remontowanie-mieszkanie&quot;&gt;2. Remontowanie mieszkanie&lt;/h5&gt;

&lt;p&gt;Gdy remontujemy mieszkanie, można codziennie robić z ekipą daily meeting stand-up. Codziennie zapisywać co zrobili, a czego nie, aby potem z końcem tygodnia przy wypłacie podsumować.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Niech dany Coach przeżyje tydzień w organizacji.&lt;/strong&gt;&lt;/p&gt;

&lt;h4 id=&quot;story-point&quot;&gt;Story point&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;ile ich spalamy w jednym sprintcie?&lt;/li&gt;
  &lt;li&gt;jeśli dany zespół spala w tygodniu 20, to w następnym zaplanować na tyle samo&lt;/li&gt;
  &lt;li&gt;nie ważne są jednostki czasu - ważna jest skala referencyjna - dlatego bierzemy ogólną skalę&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;small&gt;Kontakt do prelegenta: &lt;a href=&quot;https://twitter.com/adamlawcewicz&quot;&gt;@adamlawcewicz&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;

&lt;p&gt;&lt;small&gt;Czas trwania prelekcji: 18:38 - 19.23&lt;/small&gt;&lt;/p&gt;

&lt;p class=&quot;chapter-break&quot;&gt;&amp;bull;&lt;/p&gt;

&lt;h2 id=&quot;talk-2-jak-odbywała-się-cyfryzacja-urzędów-państwowych-w-republice-korei-i-w-jaki-sposób-można-wykorzystać-niektóre-rozwiązania-w-polsce&quot;&gt;Talk #2: Jak odbywała się cyfryzacja urzędów państwowych w Republice Korei i w jaki sposób można wykorzystać niektóre rozwiązania w Polsce?&lt;/h2&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;Prelegent: Edgar Czop (Intelicom)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Edgar współpracował przy projektach biznesowych z Koreańczykami. Obecnie redaktor naczelny serwisu o Korei Północnej - &lt;a href=&quot;http://www.pukhan.pl&quot;&gt;www.pukhan.pl&lt;/a&gt;.&lt;/p&gt;

&lt;figure&gt;
    &lt;iframe id=&quot;iframe_container&quot; frameborder=&quot;0&quot; webkitallowfullscreen=&quot;&quot; mozallowfullscreen=&quot;&quot; allowfullscreen=&quot;&quot; width=&quot;550&quot; height=&quot;400&quot; src=&quot;https://prezi.com/embed/ju27-lkfhwci/?bgcolor=ffffff&amp;amp;lock_to_path=0&amp;amp;autoplay=0&amp;amp;autohide_ctrls=0&amp;amp;landing_data=bHVZZmNaNDBIWnNjdEVENDRhZDFNZGNIUE43MHdLNWp4eFBrV0JIL1Q0cTRkWTFkTXJ5K0lra3dRWjE3N2lsWmRJdHlqOWtJYzZQaW5taDBnWWlsVlpLOGV3NTNmZz09&amp;amp;landing_sign=aT6VgdmDmAhs7Z_xwFDbMk9ciEqnh46S66Y7LZBqx0Q&quot;&gt;&lt;/iframe&gt;

    &lt;figcaption&gt;
        Slajdy &lt;a href=&quot;https://prezi.com/ju27-lkfhwci/e-administracja/&quot;&gt;https://prezi.com/ju27-lkfhwci/e-administracja/&lt;/a&gt;.
    &lt;/figcaption&gt;

&lt;/figure&gt;

&lt;ul&gt;
  &lt;li&gt;eksport e-administracji&lt;/li&gt;
  &lt;li&gt;1960 - autorytarny prezydent &lt;a href=&quot;https://pl.wikipedia.org/wiki/Park_Chung-hee&quot;&gt;Park Chung-hee&lt;/a&gt; - stworzył cud na rzeką Han - dał dużo funduszy na rozwój&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Polska jest bardzo daleko za Koreą.&lt;/strong&gt;&lt;/p&gt;

&lt;h3 id=&quot;czym-jest-e-administracja&quot;&gt;Czym jest e-administracja?&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;takie zastosowanie internetu (sieci www) dla obywateli, świata biznesu dostęp, aby był możliwy dostęp do informacji rządowych&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;e-Government Development Index&lt;/em&gt;: 1 (pozycja Korei) - indeks usług online&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;e-Government Participation Index&lt;/em&gt;: 2 (pozycja Korei)&lt;/li&gt;
  &lt;li&gt;suma programów rządowych zachęcających obywateli do uczestnictwa w życiu publicznym i gotowość obywateli aby to zrobić&lt;/li&gt;
  &lt;li&gt;e-administracja jako produkt eksportowy została uwypuklona podczas forum w 23-10-2013 roku&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Minister powiedział:&lt;/p&gt;

&lt;p&gt;Korea będzie eksportował do 27 państw (przychód 900 mln dolarów amerykańskich).&lt;/p&gt;

&lt;p&gt;Pani prezydent jest córką generała, tego który doprowadził do cudu na rzeką Han.&lt;/p&gt;

&lt;p&gt;W 2013 roku wygrała wybory.&lt;/p&gt;

&lt;p&gt;Wprowadziła ustawę antymonopolizacyjną dla czebolaków.&lt;/p&gt;

&lt;h4 id=&quot;korea-online-e-procurement-system&quot;&gt;Korea online e-procurement system&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;oszczędności 8 mld USD rocznie&lt;/li&gt;
  &lt;li&gt;zwiększone zadowolenie&lt;/li&gt;
  &lt;li&gt;ludzie zyskali skrócenie procesowania z 30h na 2h&lt;/li&gt;
  &lt;li&gt;zaoszczędzony papier - Korea staje się bardziej ECO&lt;/li&gt;
  &lt;li&gt;internetowe e-usługi dla obywateli&lt;/li&gt;
  &lt;li&gt;wzrost satysfakcji o 20%&lt;/li&gt;
  &lt;li&gt;oszczędności w ciągu 7 lat&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;kompleksowe-usługi-podatkowe&quot;&gt;Kompleksowe usługi podatkowe&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;150 mln oszczędności&lt;/li&gt;
  &lt;li&gt;24h na dobę&lt;/li&gt;
  &lt;li&gt;zgłoszenia, archiwizacji w pełni zautomatyzowane&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;przykłady&quot;&gt;Przykłady&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;Samsung SDS&lt;/li&gt;
  &lt;li&gt;LG CNS
    &lt;ul&gt;
      &lt;li&gt;w Ułan Bator za 17 mln $&lt;/li&gt;
      &lt;li&gt;w Malezji za 6 mln dolarów wprowadzono InPost - Paczkomaty&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;SK C&amp;amp;C
    &lt;ul&gt;
      &lt;li&gt;Turkmenistan&lt;/li&gt;
      &lt;li&gt;Ceny ich realizacji to promil tego co w Polsce&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Posco&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;polsko-koreańska-współpraca-w-zakresie-e-administracji&quot;&gt;Polsko-koreańska współpraca w zakresie e-administracji&lt;/h4&gt;

&lt;h4 id=&quot;w-2013-roku-prezydent-spotkał-się-z-prezydent-park&quot;&gt;W 2013 roku prezydent spotkał się z prezydent Park&lt;/h4&gt;

&lt;p&gt;Udało się podpisać “memorandum of understanding”.&lt;/p&gt;

&lt;h4 id=&quot;tabelka&quot;&gt;Tabelka&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;em&gt;e-zus&lt;/em&gt;&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;e-zdrowie&lt;/em&gt; 490 mln (całość ok. 700 mln)&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;e-deklaracje&lt;/em&gt;&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;e-księgi-wieczyste&lt;/em&gt; (projekt 20x tańszy niż e-zus)&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;miasta-które-najlepiej-implementują-e-usługi&quot;&gt;Miasta, które najlepiej implementują e-usługi&lt;/h4&gt;

&lt;p&gt;&lt;em&gt;Warszawa nie była brana pod uwagę.&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Dąbrowa górnicza - najlepiej implementują e-usługi&lt;/li&gt;
  &lt;li&gt;Płock&lt;/li&gt;
  &lt;li&gt;…&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;co-dalej&quot;&gt;Co dalej?&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;my jako Polska próbujemy podłapywać bardziej europejskie rozwiązanie niż koreańskie&lt;/li&gt;
  &lt;li&gt;trzeba uwspólnić systemy&lt;/li&gt;
  &lt;li&gt;w Polsce jest duży problem z danymi osobowymi&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;w-korei-jest-funkcja-kultury-funkcjonowania&quot;&gt;W Korei jest funkcja kultury funkcjonowania&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;szkoła do nauki StarCrafta&lt;/li&gt;
  &lt;li&gt;obłęd cyfryzacji w seulskim metrze&lt;/li&gt;
  &lt;li&gt;mają bzika na punkcie nowych technologii&lt;/li&gt;
  &lt;li&gt;zakaz korzystania z aplikacji, które nie są potrzebne do pracy&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;small&gt;Czas trwania prelekcji: 19:27 - 20:06&lt;/small&gt;&lt;/p&gt;

&lt;h2 id=&quot;podsumowanie&quot;&gt;Podsumowanie&lt;/h2&gt;

&lt;p&gt;Plan organizatorów jest taki, aby spotkania odbywały się co miesiąc.&lt;/p&gt;

&lt;p&gt;Wszelkich interesantów prelekcji zachęcam do kontaktu z &lt;a href=&quot;https://www.facebook.com/dominika.gmerek&quot;&gt;Dominiką&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Na koniec ogłoszenie organizatorów i właścicieli pomieszczenia:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Jeśli ktoś chciałby stworzyć swój Meetup to Czwarty Sektor zaprasza do siebie.&lt;/strong&gt;&lt;/p&gt;
</description>
            <pubDate>Tue, 06 Oct 2015 00:00:00 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2015/10/06/it-manager-meetup-2.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2015/10/06/it-manager-meetup-2.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/it-manager-meetup/it-manager-meetup.jpg</image>
        </item>
        
        <item>
            <title>WRUG wrześniowy o nietestowaniu, pair-programmingu i spore.sh</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Mateusz Nowakowski rozpoczyna serię WRUG po wakacjach!&lt;/p&gt;

&lt;p&gt;Profil spotkania: &lt;a href=&quot;http://wrug.eu/2015/09/14/spotkanie-wrzesniowe/&quot;&gt;wrug.eu/2015/09/14/spotkanie-wrzesniowe/&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Pierwsza prelekcja Marek Kirejczyk opowie o &lt;em&gt;Pair programming&lt;/em&gt;.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/wrug/wrug-logo.jpeg&quot; alt=&quot;&quot; /&gt;

    &lt;figcaption&gt;
        &lt;a href=&quot;https://www.meetup.com/Warsaw-Ruby-Users-Group-WRUG/&quot;&gt;Warsaw Ruby Users Group (WRUG)&lt;/a&gt;
    &lt;/figcaption&gt;

&lt;/figure&gt;

&lt;h2 id=&quot;pair-programming-pl-marek-kirejczyk&quot;&gt;Pair programming [PL] &lt;small&gt;Marek Kirejczyk&lt;/small&gt;&lt;/h2&gt;

&lt;h3 id=&quot;first-problem&quot;&gt;First problem&lt;/h3&gt;

&lt;p&gt;Zespoły Agilowe powinny się same organizować.&lt;/p&gt;

&lt;h3 id=&quot;i-dont-learn-that-much-anymore&quot;&gt;I don’t learn that much anymore&lt;/h3&gt;

&lt;p&gt;Gdy się nie rozwijamy to popadamy w depresje.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Good code review is hard &lt;small&gt;Marek Kirejczyk&lt;/small&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Co to jest &lt;em&gt;pair programming&lt;/em&gt;?&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;2 osoby siedzą przy jednym komputerze&lt;/li&gt;
  &lt;li&gt;pierwsza osoba - &lt;em&gt;reaktor&lt;/em&gt; - fizycznie pisze&lt;/li&gt;
  &lt;li&gt;druga osoba - &lt;em&gt;nawigator&lt;/em&gt; - przygląda się co napisała ta pierwsza&lt;/li&gt;
  &lt;li&gt;zadania w parach się zmieniają co kilkanaście minut&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;myths---kilka-mitów-o-pair-programming&quot;&gt;Myths - Kilka mitów o Pair programming&lt;/h3&gt;

&lt;h4 id=&quot;1-zdublowane-koszty&quot;&gt;1. Zdublowane koszty&lt;/h4&gt;

&lt;p&gt;2 osoby kodujące razem wnoszą więcej do projektu, niż osobno.&lt;/p&gt;

&lt;h4 id=&quot;2-ma-sens-ale-gdy-jest-odpowiedni-partner&quot;&gt;2. Ma sens, ale gdy jest odpowiedni partner&lt;/h4&gt;

&lt;p&gt;Różne kombinacje przynoszą efekty.&lt;/p&gt;

&lt;p&gt;Nie ma idealnej mieszanki!&lt;/p&gt;

&lt;h4 id=&quot;3-ludzie-nie-lubią-pair-programming&quot;&gt;3. Ludzie nie lubią pair programming&lt;/h4&gt;

&lt;p&gt;Błąd! Badania potwierdziły, że jest inaczej!&lt;/p&gt;

&lt;p&gt;Developerzy lubią pair programming!&lt;/p&gt;

&lt;h4 id=&quot;4-pair-programming-jest-tylko-do-nauki&quot;&gt;4. Pair programming jest tylko do nauki&lt;/h4&gt;

&lt;p&gt;Różne rodzaje parowania są efektywne.&lt;/p&gt;

&lt;p&gt;Nie zawsze, nie wszystkie, ale większość przynosi dobry efekt.&lt;/p&gt;

&lt;h4 id=&quot;5-jeżeli-będę-pracował-w-parach-to-nikt-mnie-nie-doceni&quot;&gt;5. Jeżeli będę pracował w parach to nikt mnie nie doceni&lt;/h4&gt;

&lt;p&gt;Rozwiązanie na docenianie jednostki?&lt;/p&gt;

&lt;p&gt;Przypisanie ownerów do konkretnych modułów.&lt;/p&gt;

&lt;h4 id=&quot;6-nawigator-który-tylko-odnajduje-syntax-error&quot;&gt;6. Nawigator, który tylko odnajduje syntax error&lt;/h4&gt;

&lt;blockquote&gt;
  &lt;p&gt;Dobre parowanie, ma wpływ na design kodowania. &lt;small&gt;Marek Kirejczyk&lt;/small&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3 id=&quot;zachowania&quot;&gt;Zachowania&lt;/h3&gt;

&lt;h4 id=&quot;1-presja-społeczna&quot;&gt;1. Presja społeczna&lt;/h4&gt;

&lt;p&gt;Pary więcej spędzają kodując, niż na portalach społecznościowych.&lt;/p&gt;

&lt;p&gt;Robią dużo mniej przerw.&lt;/p&gt;

&lt;h4 id=&quot;2-negocjacja&quot;&gt;2. Negocjacja&lt;/h4&gt;

&lt;p&gt;Negocjacja pomiędzy dwoma pomysłami, podejściami.&lt;/p&gt;

&lt;p&gt;Jest to dużo lepsze, niż wzięcie pierwszego lepszego.&lt;/p&gt;

&lt;h4 id=&quot;3-pair-review&quot;&gt;3. Pair review&lt;/h4&gt;

&lt;p&gt;Ciągle ktoś robi review kodu.&lt;/p&gt;

&lt;h4 id=&quot;4-pair-learning&quot;&gt;4. Pair learning&lt;/h4&gt;

&lt;p&gt;W parach uczymy się dramatycznie szybciej niż w pojedynkę.&lt;/p&gt;

&lt;h4 id=&quot;5-pair-trust-zaufanie&quot;&gt;5. Pair trust (zaufanie)&lt;/h4&gt;

&lt;p&gt;Para która pracuje razem, ma inny poziom zaufania, zna swoje zalety i wady.&lt;/p&gt;

&lt;p&gt;Relacje są lepsze.&lt;/p&gt;

&lt;h4 id=&quot;6-pair-courage&quot;&gt;6. Pair courage&lt;/h4&gt;

&lt;p&gt;Para jest bardziej odważna.&lt;/p&gt;

&lt;p&gt;Przekłada się to na modyfikację &lt;em&gt;legacy code&lt;/em&gt;.&lt;/p&gt;

&lt;h4 id=&quot;7-pair-debugging&quot;&gt;7. Pair debugging&lt;/h4&gt;

&lt;p&gt;Często jak się debuguje w parach, to czas spędzony na rozwiązaniu bugów,&lt;/p&gt;

&lt;p&gt;jest to minimum z czasów spędzonych osobno.&lt;/p&gt;

&lt;h3 id=&quot;details&quot;&gt;Details&lt;/h3&gt;

&lt;h4 id=&quot;rotacje&quot;&gt;Rotacje!&lt;/h4&gt;

&lt;p&gt;Nowa para = nowe pomysły.&lt;/p&gt;

&lt;p&gt;Aby pobudzić zaznacza się na macierzy&lt;/p&gt;

&lt;h3 id=&quot;ping-pong-pair-programming&quot;&gt;Ping pong pair programming&lt;/h3&gt;

&lt;p&gt;Najlepiej TDD: jedna osoba pisze niedziałający test, a druga minimalna ilość kodu aby kod przeszedł.&lt;/p&gt;

&lt;p&gt;Gdy jest okey, to odwrócenie zadań.&lt;/p&gt;

&lt;h3 id=&quot;environment&quot;&gt;Environment&lt;/h3&gt;

&lt;p&gt;Więcej miejsca przy biurku!&lt;/p&gt;

&lt;h3 id=&quot;types-of-pairs&quot;&gt;Types of pairs&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;em&gt;junior &amp;amp; senior&lt;/em&gt;&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;extrovert &amp;amp; introvert&lt;/em&gt;&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;Back-end &amp;amp; Front-end&lt;/em&gt; - ludzie z chęcią chcą się nauczyć drugiej strony - taka para bardzo szybko realizuje zadania&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Przy &lt;em&gt;junior &amp;amp; junior&lt;/em&gt; - code review zawsze musi być robione przez seniora.&lt;/p&gt;

&lt;p&gt;Większość badań skupia się na 1 sprincie.&lt;/p&gt;

&lt;p&gt;Zespół bardzo przyspiesza ale to musi trochę potrwać.&lt;/p&gt;

&lt;h3 id=&quot;introducing-pair-programming-at-daftcode&quot;&gt;Introducing pair programming at DaftCode&lt;/h3&gt;

&lt;p&gt;“Fajne, chcemy więcej” - taki był odbiór po realizacji programu pilotażowego.&lt;/p&gt;

&lt;p&gt;Cały zespół &lt;em&gt;Daftcode&lt;/em&gt; programuje w parach!&lt;/p&gt;

&lt;h3 id=&quot;wnioski&quot;&gt;Wnioski&lt;/h3&gt;

&lt;p&gt;Parować się dużo i im szybciej tym lepiej!&lt;/p&gt;

&lt;p&gt;&lt;small&gt;Czas trwania prelekcji: 18:33 - 18:55 (10 min pytań)&lt;/small&gt;&lt;/p&gt;

&lt;h2 id=&quot;pisz-kod-tak-aby-go-nie-testować-pl-łukasz-detomastah-pełszyński&quot;&gt;Pisz kod tak, aby go nie testować [PL] &lt;small&gt;Łukasz “detomastah” Pełszyński&lt;/small&gt;&lt;/h2&gt;

&lt;p&gt;Co to znaczy “pokrycie kodu testami”?&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Wszystkie linie zostały przetestowane, ale nie oznacza, że program działa dobrze.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;stan-programu&quot;&gt;Stan programu&lt;/h3&gt;

&lt;p&gt;Stan wszystkich zmiennych, które program ma w pamięci&lt;/p&gt;

&lt;p&gt;Wg. Millera ludzie mogę operować na max “9 obiektach” w swojej pamięci.&lt;/p&gt;

&lt;p&gt;Średnio 7 obiektów.&lt;/p&gt;

&lt;h3 id=&quot;pamięć-jako-kolekcja-fifo&quot;&gt;Pamięć jako kolekcja FIFO&lt;/h3&gt;

&lt;h3 id=&quot;co-nam-pomaga-w-dużej-ilości-stanów&quot;&gt;Co nam pomaga w dużej ilości stanów?&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;tworzenie abstrakcji - pomagają one ogarnąć ten chaos&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;interakcja-szeregowa&quot;&gt;Interakcja szeregowa&lt;/h4&gt;

&lt;h4 id=&quot;interakcja-sprzężona&quot;&gt;Interakcja sprzężona&lt;/h4&gt;

&lt;p&gt;Bardzo często występuje w programach.&lt;/p&gt;

&lt;p&gt;Może wskazywać na naruszenie SRP (&lt;em&gt;single responsibility principle&lt;/em&gt;) pojedyncza odpowiedzialność.&lt;/p&gt;

&lt;p&gt;Problem z SRP: zasada DRY prowadzi do tworzenie super-obiektów, które możemy wkładać w różne miejsca.&lt;/p&gt;

&lt;p&gt;Rozwiązanie problemu z SRP: celowa duplikacja kodu.&lt;/p&gt;

&lt;p&gt;Umożliwia wyrwanie się ze &lt;em&gt;spaghetti code&lt;/em&gt;.&lt;/p&gt;

&lt;h4 id=&quot;interakcja-warunkowa&quot;&gt;Interakcja warunkowa&lt;/h4&gt;

&lt;p&gt;Każdy warunek tworzy nowe stany. Może wskazywać na brak interfejsów.&lt;/p&gt;

&lt;h4 id=&quot;interakcja-asynchroniczna&quot;&gt;Interakcja asynchroniczna&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;czyli programy działające na wątkach!&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Jak zaprogramować algorytm DFS?&lt;/p&gt;

&lt;p&gt;Kto z tym zadaniem poradził sobie bez problemów?&lt;/p&gt;

&lt;h4 id=&quot;ogólne-zalecenia&quot;&gt;Ogólne zalecenia&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;Zacząć samodzielnie myśleć&lt;/li&gt;
  &lt;li&gt;TRUST NO 1&lt;/li&gt;
  &lt;li&gt;Myśleć ekonomicznie&lt;/li&gt;
  &lt;li&gt;Dążyć do izolacji - łatwość podczas testowania&lt;/li&gt;
  &lt;li&gt;Stosować przetwarzanie wsadowe 😄 - jedno przekazuje drugiemu, programy liniowe&lt;/li&gt;
  &lt;li&gt;Nie pozwalać błędom się ukrywać - z góry rzucać wyjątkami&lt;/li&gt;
  &lt;li&gt;W ostateczności - zmienić język&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;small&gt;Czas trwania prelekcji: 19:07 - 19:32 (12 min pytań)&lt;/small&gt;&lt;/p&gt;

&lt;h3 id=&quot;pytania&quot;&gt;Pytania&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Mutation test coverage&lt;/em&gt; - rozwiązuje problem 100 procentowego pokrycia kodu.&lt;/p&gt;

&lt;p&gt;Więcej &lt;a href=&quot;https://pl.wikipedia.org/wiki/Testowanie_mutacyjne&quot;&gt;https://pl.wikipedia.org/wiki/Testowanie_mutacyjne&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Rozwiązania z komentarzy: Można wymusić implementowanie interfejsu - wystarczy &lt;code class=&quot;highlighter-rouge&quot;&gt;NoMethodError&lt;/code&gt; w jakiejś klasie.&lt;/p&gt;

&lt;p&gt;Rozwiązania z komentarzy: Można pisać SRP i DRY.&lt;/p&gt;

&lt;h2 id=&quot;zarządzanie-zmiennymi-środowiskowymi-przy-użyciu-sporesh-pl-marcin-wyszyński&quot;&gt;Zarządzanie zmiennymi środowiskowymi przy użyciu &lt;code class=&quot;highlighter-rouge&quot;&gt;spore.sh&lt;/code&gt; [PL] &lt;small&gt;Marcin Wyszyński&lt;/small&gt;&lt;/h2&gt;

&lt;p&gt;Na &lt;a href=&quot;https://news.ycombinator.com/&quot;&gt;HackerNews&lt;/a&gt; “pewien ktoś” opisał coś i się bulwersował, że go nikt nie rozumie. Marcin go zrozumiał i chce zaprezentować narzędzie opisane przez “tego kogoś”.&lt;/p&gt;

&lt;p&gt;Musimy korzystać z Heroku? Dlaczego, bo tak chce tego Heroku 😄&lt;/p&gt;

&lt;p&gt;Różnica między &lt;em&gt;develop&lt;/em&gt; a &lt;em&gt;produkcją&lt;/em&gt; jest tylko w 1 zmiennej środowiskowej.&lt;/p&gt;

&lt;p&gt;I to jest piękne!&lt;/p&gt;

&lt;h3 id=&quot;sporesh&quot;&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;spore.sh&lt;/code&gt;&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;serwer w Node.js&lt;/li&gt;
  &lt;li&gt;jest CLI&lt;/li&gt;
  &lt;li&gt;w root naszego projektu jest plik konfiguracyjny&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;zasada-uid&quot;&gt;Zasada UID&lt;/h3&gt;

&lt;p&gt;Komunikacja przez SSL i pobieranie konkretnej wartości po uid&lt;/p&gt;

&lt;h3 id=&quot;czy-powinienem-tego-używać&quot;&gt;Czy powinienem tego używać?&lt;/h3&gt;

&lt;p&gt;“Wasza decyzja.&lt;/p&gt;

&lt;p&gt;Może warto spróbować”&lt;/p&gt;

&lt;p&gt;&lt;small&gt;Czas trwania prelekcji: 19:47 - 20:02 (7 min pytań)&lt;/small&gt;&lt;/p&gt;

&lt;h2 id=&quot;podsumowanie&quot;&gt;Podsumowanie&lt;/h2&gt;

&lt;p&gt;Świetnie było się spotkać po wakacjach z ekipą z WRUGa.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Inny język = inne doświadczenia.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Dzięki sponsorom (&lt;a href=&quot;https://www.facebook.com/Rebased/&quot;&gt;Rebased&lt;/a&gt; i &lt;a href=&quot;https://www.facebook.com/elpassion/&quot;&gt;EL Passion&lt;/a&gt;) mogliśmy wymienić sobie żeton za produkt o równowartości 10zł.&lt;/p&gt;

&lt;p&gt;Kolejne spotkanie już za miesiąc!&lt;/p&gt;
</description>
            <pubDate>Thu, 24 Sep 2015 00:00:00 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2015/09/24/wrug-spotkanie-wrzesniowe-pair-programmingu-i-spore-sh.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2015/09/24/wrug-spotkanie-wrzesniowe-pair-programmingu-i-spore-sh.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/wrug/wrug-logo-526x275.jpg</image>
        </item>
        
        <item>
            <title>WarsawJS Meetup #13 — 1 urodziny 🎂</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Na jubileuszowym spotkaniu spotkaliśmy się jak zwykle w tym samym miejscu - &lt;a href=&quot;http://panstwomiasto.pl&quot;&gt;Państwomiasto&lt;/a&gt;. Spotkanie miało dla nas charakter uroczysty, przygotowywaliśmy się do niego bardziej niż zwykle. Kupiliśmy balony - aby podkreślić, że są to urodziny - &lt;strong&gt;pierwsze urodziny WarsawJS!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Dzięki &lt;a href=&quot;http://10clouds.com&quot;&gt;10Clouds&lt;/a&gt; mieliśmy do rozdania kilkanaście koszulek. Wpadliśmy na pomysł ponaklejać gdziekolwiek karteczki z literkami: C oraz K.&lt;/p&gt;

&lt;p&gt;Literka &lt;em&gt;C&lt;/em&gt; oznaczała czekoladę ufundowaną przez organizatorów WarsawJS, natomiast literka &lt;em&gt;K&lt;/em&gt; oznaczała koszulkę. Jeśli ktoś odkleił od ściany, albo od krzesełka taką karteczkę, to mógł w odpowiednim czasie podejść po nagrodę 😄&lt;/p&gt;

&lt;!-- &lt;figure&gt;
    &lt;a href=&quot;https://www.meetup.com/WarsawJS/&quot;&gt;
        &lt;img src=&quot;/assets/images/posts/post-banner-warsawjs.jpg&quot;
             alt=&quot;WarsawJS&quot;/&gt;
    &lt;/a&gt;
&lt;/figure&gt; --&gt;

&lt;h2 id=&quot;invitation&quot;&gt;Invitation&lt;/h2&gt;

&lt;p&gt;Ze względu na jubileuszowe spotkanie, chcieliśmy nagrać zapowiedź w miejscu bardzo ważnym dla naszego miasta. &lt;em&gt;Syrenka&lt;/em&gt; jest dla warszawiaków symbolem. Dlatego przed tak ważnym spotkaniem, wybraliśmy tak ważny obiekt.&lt;/p&gt;

&lt;div class=&quot;youtube-lazy&quot; data-youtube-id=&quot;YHQlQmTwO9s&quot;&gt;&lt;/div&gt;

&lt;p class=&quot;chapter-break&quot;&gt;&amp;bull;&lt;/p&gt;

&lt;h2 id=&quot;talk-1-my-10-days-with-phaserjs-pl-piotr-kowalski&quot;&gt;Talk #1: My 10 days with Phaser.js [PL] &lt;small&gt;Piotr Kowalski&lt;/small&gt;&lt;/h2&gt;

&lt;p&gt;Moja kolejne wejście na scenę WarsawJS. Chciałem opowiedzieć o czymś niezwykłym, dlatego wpadłem na pewien pomysł. Wyznaczę sobie trudne zadanie i spróbuję jemu sprostać. Chciałem pierwotnie w 10 napisać pracę dyplomową. Niestety, takie zadanie wiąże się z poświęceniem dużej ilości godzin na wklepywaniu literek w klawiaturę. Postanowiłem, że na początku może będę siebie nagrywał, a jak starczy czasu to przepiszę - ubiorę w słowa.&lt;/p&gt;

&lt;p&gt;Wymyśliłem, że stworzę grę w oparciu o anime &lt;a href=&quot;http://google.com/search?q=Dragon+Ball&quot;&gt;Dragon Ball&lt;/a&gt;. Jest to moja ulubiona bajka z dzieciństwa, no i warto nadać grze jaką tematykę.&lt;/p&gt;

&lt;p&gt;Od 1 września do 10 tworzyłem grę - &lt;a href=&quot;http://piecioshka.github.io/7balls/&quot;&gt;7balls&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Przez te 10 dni nagrywałem siebie jak tłumaczę ciekawe zagadnienia związane z grą. Całość będę umieszczał na swoim kanale w odstępach cotygodniowych.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Link do prelekcji: &lt;a href=&quot;https://www.youtube.com/watch?v=klDeljOKDjU&quot;&gt;https://www.youtube.com/watch?v=klDeljOKDjU&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Link do slajdów: &lt;a href=&quot;http://piecioshka.github.io/slides-my-10-days-with-phaser-js/&quot;&gt;piecioshka.github.io/slides-my-10-days-with-phaser-js/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p class=&quot;chapter-break&quot;&gt;&amp;bull;&lt;/p&gt;

&lt;h2 id=&quot;talk-2-debugging-javascript-not-only-for-beginners-en-piotr-zientara&quot;&gt;Talk #2: Debugging JavaScript not only for beginners [EN] &lt;small&gt;Piotr Zientara&lt;/small&gt;&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;Link do prelekcji: &lt;a href=&quot;https://www.youtube.com/watch?v=R1gtwxE1Vrc&quot;&gt;https://www.youtube.com/watch?v=R1gtwxE1Vrc&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Link do slajdów: &lt;a href=&quot;http://tuhaj.github.io/debugging-js/&quot;&gt;tuhaj.github.io/debugging-js/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p class=&quot;chapter-break&quot;&gt;&amp;bull;&lt;/p&gt;

&lt;h2 id=&quot;sponsorzy-spotkania&quot;&gt;Sponsorzy spotkania&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.facebook.com/Rebased/&quot;&gt;Rebased&lt;/a&gt;, &lt;a href=&quot;https://www.facebook.com/10Clouds/&quot;&gt;10Clouds&lt;/a&gt; - żetony w barze&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.facebook.com/cyfrowypolsat/&quot;&gt;Cyfrowy Polsat&lt;/a&gt; - materiały na YouTube&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.facebook.com/whitestreampl&quot;&gt;Whitestream&lt;/a&gt; - transmisja na żywo - &lt;a href=&quot;http://warsawjs.com/live&quot;&gt;warsawjs.com/live&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
            <pubDate>Tue, 22 Sep 2015 00:00:00 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2015/09/22/warsawjs-meetup-13.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2015/09/22/warsawjs-meetup-13.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/post-banner-warsawjs.jpg</image>
        </item>
        
        <item>
            <title>AngularJS Warsaw #3 + Moja prelekcja</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Po raz trzeci poszedłem na AngularJS Warsaw. Tym razem szczególnie, bo w roli prelegenta!&lt;/p&gt;

&lt;p&gt;Dawno nie bylem prelegentem, a miałem super temat na prelekcję. Chciałem podzielić się z innymi moimi doświadczeniami związanymi z nauką AngularJS.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/angularjs-warsaw/logo/logo-180x180.png&quot; alt=&quot;&quot; /&gt;

    &lt;figcaption&gt;
        &lt;a href=&quot;https://www.meetup.com/AngularJS-Warsaw/&quot;&gt;AngularJS Warsaw&lt;/a&gt;
    &lt;/figcaption&gt;

&lt;/figure&gt;

&lt;p&gt;Przeczytałem 2 książki oraz odbyłem szkolenie z podstaw AngularJS.&lt;/p&gt;

&lt;p&gt;Tylko tyle.&lt;/p&gt;

&lt;p&gt;Nie jest to dużo, chciałem tym samym wyjść na sceną i opowiedzieć to, co wiem dając przykład innym ludziom, że warto wychodzić na scenę, pomimo tego, że nie jest się ekspertem w danej dziedzinie.&lt;/p&gt;

&lt;figure&gt;
    &lt;img class=&quot;img-responsive&quot; src=&quot;https://photos3.meetupstatic.com/photos/event/c/2/4/b/highres_441349739.jpeg&quot; alt=&quot;&quot; /&gt;

    &lt;figcaption&gt;
        Link do zdjęć: &lt;a href=&quot;https://plus.google.com/+Evojam/posts/EqDvBMrDfmd&quot;&gt;https://plus.google.com/+Evojam/posts/EqDvBMrDfmd&lt;/a&gt;
    &lt;/figcaption&gt;

&lt;/figure&gt;

&lt;h2 id=&quot;talk-1-angularjs-qa-pl-piotr-kowalski&quot;&gt;Talk #1: AngularJS: Q&amp;amp;A [PL] &lt;small&gt;Piotr Kowalski&lt;/small&gt;&lt;/h2&gt;

&lt;p&gt;Podczas czytania książek notuję sobie na “żółtych karteczkach”, rzeczy:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;których nie do końca rozumiem,&lt;/li&gt;
  &lt;li&gt;które rozumiem, ale chciałbym przećwiczyć przed komputerem i się upewnić,&lt;/li&gt;
  &lt;li&gt;wszelkie błędy, abym ktoś kto będzie czytał tą książkę po mnie, wiedział, że jest błąd w druku.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Kiedyś czytałem książki i gdy tylko coś rzuciło mi się w oczy to od razu siadałem do komputera. Wtedy jedną książkę czytałem kilka tygodni, bo po tym jak siadłem do komputera to już nie wracałem do książki.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Uważam ten sposób, na najlepszy podczas czytania książek. &lt;small&gt;Piotr Kowalski&lt;/small&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Twitter: &lt;a href=&quot;https://twitter.com/piecioshka&quot;&gt;@piecioshka&lt;/a&gt;&lt;/p&gt;

&lt;iframe src=&quot;https://www.slideshare.net/slideshow/embed_code/key/mqnKtdFZlnkzCI&quot; width=&quot;615&quot; height=&quot;470&quot; frameborder=&quot;0&quot; marginwidth=&quot;0&quot; marginheight=&quot;0&quot; scrolling=&quot;no&quot; style=&quot;border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;&quot; allowfullscreen=&quot;&quot;&gt; &lt;/iframe&gt;

&lt;div style=&quot;margin-bottom:5px&quot;&gt; &lt;strong&gt; &lt;a href=&quot;//www.slideshare.net/piecioshka/angularjs-qa&quot; title=&quot;AngularJS: Q&amp;amp;A&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;AngularJS: Q&amp;amp;A&lt;/a&gt; &lt;/strong&gt; from &lt;strong&gt;&lt;a href=&quot;//www.slideshare.net/piecioshka&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Piotr Kowalski&lt;/a&gt;&lt;/strong&gt; &lt;/div&gt;

&lt;p&gt;Link do slajdów: &lt;a href=&quot;https://piecioshka.github.io/slides-angularjs-q-and-a&quot;&gt;https://piecioshka.github.io/slides-angularjs-q-and-a&lt;/a&gt;&lt;/p&gt;

&lt;figure&gt;
    &lt;img class=&quot;img-responsive&quot; src=&quot;https://photos2.meetupstatic.com/photos/event/c/2/5/0/highres_441349744.jpeg&quot; alt=&quot;&quot; /&gt;

    &lt;figcaption&gt;
        Link do zdjęć: &lt;a href=&quot;https://plus.google.com/+Evojam/posts/EqDvBMrDfmd&quot;&gt;https://plus.google.com/+Evojam/posts/EqDvBMrDfmd&lt;/a&gt;
    &lt;/figcaption&gt;

&lt;/figure&gt;

&lt;p class=&quot;chapter-break&quot;&gt;&amp;bull;&lt;/p&gt;

&lt;h2 id=&quot;talk-2-udekoruj-angulara-z-typescriptem-pl-jakub-strojewski&quot;&gt;Talk #2: Udekoruj Angulara z TypeScriptem [PL] &lt;small&gt;Jakub Strojewski&lt;/small&gt;&lt;/h2&gt;

&lt;p&gt;Kuba kontynuował swoją prelekcję z pierwszego spotkania nt. &lt;a href=&quot;https://google.com/search?q=typescript&quot;&gt;TypeScript&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Opowiadał o dekoratorach, które pojawią się w JavaScript wraz z akceptacją standardu ECMAScript 7, bo prawdopodobnie w niej doczekamy się wprowadzenie dekoratorów.&lt;/p&gt;

&lt;p&gt;W &lt;code class=&quot;highlighter-rouge&quot;&gt;TypeScript&lt;/code&gt; już dziś możemy korzystać z dekoratorów od wersji 1.5. Jest to wersja języka, która dostała najwięcej nowych rzeczy.&lt;/p&gt;

&lt;p&gt;Więcej do poczytania co nowego w wersji 1.5 można przeczytać tutaj: &lt;a href=&quot;https://github.com/Microsoft/TypeScript/wiki/What's-new-in-TypeScript&quot;&gt;github.com/Microsoft/TypeScript/wiki/What’s-new-in-TypeScript&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Kuba podczas tej prezentacji przedstawiał jak on skorzystał z dekoratorów w TypeScript na potrzeby pracy z Angularem. Dokładniejsze informacje znajdziesz jego projekcie na GitHub: &lt;a href=&quot;https://github.com/ulfryk/angular-typescript&quot;&gt;github.com/ulfryk/angular-typescript&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Twitter: &lt;a href=&quot;https://twitter.com/ulfryk&quot;&gt;@ulfryk&lt;/a&gt;&lt;/p&gt;

&lt;figure class=&quot;center-block&quot;&gt;
    &lt;iframe src=&quot;https://docs.google.com/presentation/d/1p3-1CdyZkdFyInjkR7KJ57Rw73sd3amDx9hr-SCU4cw/embed?start=false&amp;amp;loop=false&amp;amp;delayms=5000&quot; width=&quot;615px&quot; height=&quot;470px&quot; frameborder=&quot;0&quot; style=&quot;border:none;&quot; allowfullscreen=&quot;&quot; webkitallowfullscreen=&quot;&quot; mozallowfullscreen=&quot;&quot;&gt;&lt;/iframe&gt;
&lt;/figure&gt;

&lt;p&gt;Link do slajdów: &lt;a href=&quot;https://triangular.io/blog/es7-decorators/&quot;&gt;triangular.io/blog/es7-decorators/&lt;/a&gt;&lt;/p&gt;

&lt;figure&gt;
    &lt;img class=&quot;img-responsive&quot; src=&quot;https://photos2.meetupstatic.com/photos/event/c/2/4/d/highres_441349741.jpeg&quot; alt=&quot;&quot; /&gt;

    &lt;figcaption&gt;
        Taki był widok z okna! &lt;br /&gt;
        Link do zdjęć: &lt;a href=&quot;https://plus.google.com/+Evojam/posts/EqDvBMrDfmd&quot;&gt;https://plus.google.com/+Evojam/posts/EqDvBMrDfmd&lt;/a&gt;
    &lt;/figcaption&gt;

&lt;/figure&gt;

&lt;p&gt;Całe spotkanie oceniam bardzo pozytywnie.&lt;/p&gt;

&lt;p&gt;Pomimo wakacji frekwencja była dość dobra, około 60 osób.&lt;/p&gt;

&lt;p class=&quot;chapter-break&quot;&gt;&amp;bull;&lt;/p&gt;

&lt;h2 id=&quot;sponsorzy-spotkania&quot;&gt;Sponsorzy spotkania&lt;/h2&gt;

&lt;p&gt;Dzięki sponsorom, każdy z uczestników miał możliwość napicia się napoju produkującego poprzez Tyskie Browarium. Po mojej prelekcji, każdy mógł skosztować pizzy. Mnie po prelekcji wciągnęła publiczność w wir pytań i niestety nic nie zjadłem - ale za to poskładałem puste opakowania na jedno miejsce 😄&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://asseco.com/pl/&quot;&gt;Asseco&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.aviva.pl/&quot;&gt;Aviva&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
            <pubDate>Thu, 27 Aug 2015 00:00:00 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2015/08/27/angularjs-warsaw-3.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2015/08/27/angularjs-warsaw-3.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/angularjs-warsaw/logo/logo-526x275.jpg</image>
        </item>
        
        <item>
            <title>WarsawJS Meetup #12</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Spotkaliśmy się, jak zwykle w trzecią środę miesiąca w Państwomiasto (Andersa 29). Mieliśmy jak zwykle 3 prezentacje, gdzie pierwsza z nich była w pewien sposób wyjątkowa, gdyż była skierowana dla tych którzy dopiero zaczynają swoją przygodę z JavaScript.&lt;/p&gt;

&lt;!-- &lt;figure&gt;
    &lt;a href=&quot;https://www.meetup.com/WarsawJS/&quot;&gt;
        &lt;img src=&quot;/assets/images/posts/post-banner-warsawjs.jpg&quot;
             alt=&quot;WarsawJS&quot;/&gt;
    &lt;/a&gt;
&lt;/figure&gt; --&gt;

&lt;h2 id=&quot;invitation&quot;&gt;Invitation&lt;/h2&gt;

&lt;p&gt;Tym razem chcieliśmy wyszczególnić &lt;code class=&quot;highlighter-rouge&quot;&gt;Universam&lt;/code&gt; na Rondzie Wiatraczna jako miejsce znane warszawiakom. Jest to pierwszy sklep samoobsługowy w Polsce. Kilka tygodni temu dowiedzieliśmy się, że ten budynek zostanie zburzony, a w jego miejscu powstanie biurowiec.&lt;/p&gt;

&lt;div class=&quot;youtube-lazy&quot; data-youtube-id=&quot;jGxAsTl4a6A&quot;&gt;&lt;/div&gt;

&lt;p class=&quot;chapter-break&quot;&gt;&amp;bull;&lt;/p&gt;

&lt;h2 id=&quot;talk-1-jak-zacząć-przygodę-z-javascriptem-od-zera-pl-bartłomiej-sobczuk&quot;&gt;Talk #1: Jak zacząć przygodę z JavaScriptem od zera? [PL] &lt;small&gt;Bartłomiej Sobczuk&lt;/small&gt;&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;Link do prelekcji: &lt;a href=&quot;https://www.youtube.com/watch?v=_r_T8ubJLh4&quot;&gt;https://www.youtube.com/watch?v=_r_T8ubJLh4&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Link do slajdów: &lt;a href=&quot;http://ckyambitny.github.io/how-to-start-programming-in-Javascript/&quot;&gt;ckyambitny.github.io/how-to-start-programming-in-Javascript/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p class=&quot;chapter-break&quot;&gt;&amp;bull;&lt;/p&gt;

&lt;h2 id=&quot;talk-2-how-to-create-a-simple-nodejs-proxy-for-third-party-apis-en-illarion-khapyorskiy&quot;&gt;Talk #2: How to create a simple Node.js proxy for third-party APIs [EN] &lt;small&gt;Illarion Khapyorskiy&lt;/small&gt;&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;Link do prelekcji: &lt;a href=&quot;https://www.youtube.com/watch?v=TaKWftFtvVo&quot;&gt;https://www.youtube.com/watch?v=TaKWftFtvVo&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Link do slajdów: &lt;a href=&quot;http://illarionvk.github.io/warsawjs-simple-proxy/&quot;&gt;illarionvk.github.io/warsawjs-simple-proxy/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p class=&quot;chapter-break&quot;&gt;&amp;bull;&lt;/p&gt;

&lt;h2 id=&quot;talk-3-nodejs-on-mobile-en-oguz-bastemur&quot;&gt;Talk #3: Node.js on mobile [EN] &lt;small&gt;Oguz Bastemur&lt;/small&gt;&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;Link do prelekcji: &lt;a href=&quot;https://www.youtube.com/watch?v=kZkl9Luk12w&quot;&gt;https://www.youtube.com/watch?v=kZkl9Luk12w&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Link do slajdów: &lt;a href=&quot;https://drive.google.com/file/d/0B36_OUVtfH-KVDZGQzBMRkN3OTQ/view&quot;&gt;https://drive.google.com/file/d/0B36_OUVtfH-KVDZGQzBMRkN3OTQ/view&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p class=&quot;chapter-break&quot;&gt;&amp;bull;&lt;/p&gt;

&lt;h2 id=&quot;sponsorzy-spotkania&quot;&gt;Sponsorzy spotkania&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.facebook.com/Rebased/&quot;&gt;Rebased&lt;/a&gt;, &lt;a href=&quot;https://www.facebook.com/10Clouds/&quot;&gt;10Clouds&lt;/a&gt; - żetony w barze&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.facebook.com/cyfrowypolsat/&quot;&gt;Cyfrowy Polsat&lt;/a&gt; - materiały na YouTube&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.facebook.com/whitestreampl&quot;&gt;Whitestream&lt;/a&gt; - transmisja na żywo - &lt;a href=&quot;http://warsawjs.com/live&quot;&gt;warsawjs.com/live&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
            <pubDate>Sat, 22 Aug 2015 00:00:00 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2015/08/22/warsawjs-meetup-12.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2015/08/22/warsawjs-meetup-12.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/post-banner-warsawjs.jpg</image>
        </item>
        
        <item>
            <title>DevMeetings: ECMAScript 6: Warszawa</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Kila tygodni temu miałem przyjemność uczestniczenia w kolejnym DevMeetings-ie. Kolejny raz byłem w roli trenera - świetne uczucie, kiedy przekazuje się zdobytą wiedzę.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/post-banner-devmeetings.png&quot; itemprop=&quot;image&quot; alt=&quot;Baner promujący artykuł&quot; /&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;miejsce&quot;&gt;Miejsce&lt;/h2&gt;

&lt;p&gt;25 lipca spotkaliśmy się na 26 piętrze w budynku &lt;a href=&quot;http://www.warszawa.goldenfloor.pl/&quot;&gt;Golden Floor Plaza&lt;/a&gt;.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/devmeetings/devmeetings-ecmascript-6-warszawa.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;figcaption&gt;Widok na Centrum Warszawy.&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;ekipa&quot;&gt;Ekipa&lt;/h2&gt;

&lt;p&gt;Skład mentorów był nieco okrojony względem ostatniego DevMeetingu w Krakowie, mianowicie uczestnikom pomagałem ja oraz &lt;a href=&quot;https://github.com/jakubsta&quot;&gt;Kuba&lt;/a&gt; - młody developer z Wrocławia, z dużymi umiejętnościami.&lt;/p&gt;

&lt;h2 id=&quot;zadania&quot;&gt;Zadania&lt;/h2&gt;

&lt;p&gt;Zadania do wykonania były takie same jak w Krakowie. Jedno trudniejsze, drugie łatwiejsze. Dobór zadań nie był narzucany z góry, jednak dla uczestników z mniejszym doświadczeniem proponowana była aplikacja Tinder. Konkurowała ona z aplikacją Foursquare.&lt;/p&gt;

&lt;p&gt;Wzorcowe aplikacje wykonane przez doświadczonych developerów:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/kucharskimaciej/dm-es6-tinder&quot;&gt;dm-es6-tinder&lt;/a&gt; - Tinder autorstwa Macieja Kucharskiego&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/oleq/dm-es6-map&quot;&gt;dm-es6-map&lt;/a&gt; - Foursquare, którego wykonawcą jest Olek Nowodziński&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;podsumowanie&quot;&gt;Podsumowanie&lt;/h2&gt;

&lt;p&gt;Jestem bardzo zadowolony, że Piotr zaprosił mnie na kolejne spotkanie w roli mentora.&lt;/p&gt;

&lt;p&gt;Tylu ludzi zgromadzonych w jednym miejscu nie z przymusu, lecz z chęci rozwoju, daje mi do zrozumienia, że jest mnóstwo osób, którzy chcą się uczyć programowania i wychodzą na przeciw temu, zamiast siedzieć w domu i starać się być aspołecznymi developerami.&lt;/p&gt;

&lt;figure class=&quot;social-center-block&quot;&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;pl&quot; dir=&quot;ltr&quot;&gt;Po obiadku wracamy do &lt;a href=&quot;https://twitter.com/hashtag/ES6?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#ES6&lt;/a&gt; // cc: &lt;a href=&quot;https://twitter.com/DevMeetingsPL?ref_src=twsrc%5Etfw&quot;&gt;@DevMeetingsPL&lt;/a&gt; &lt;a href=&quot;http://t.co/eZ5K8Rh4Np&quot;&gt;pic.twitter.com/eZ5K8Rh4Np&lt;/a&gt;&lt;/p&gt;&amp;mdash; Piotr Kowalski (@piecioshka) &lt;a href=&quot;https://twitter.com/piecioshka/status/624926869129965568?ref_src=twsrc%5Etfw&quot;&gt;July 25, 2015&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async=&quot;&quot; src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;

&lt;/figure&gt;
</description>
            <pubDate>Mon, 10 Aug 2015 00:00:00 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2015/08/10/devmeetings-ecmascript-6-warszawa.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2015/08/10/devmeetings-ecmascript-6-warszawa.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/post-banner-devmeetings.png</image>
        </item>
        
        <item>
            <title>WarsawJS Meetup #11</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Widzieliśmy się 22 lipca po raz #11 w Państwomiasto o 18:30, aby porozmawiać o JavaScript. Było to niesamowite spotkanie, tyle ludzi podczas wakacji? Przerosło to nasze oczekiwania 😄&lt;/p&gt;

&lt;!-- &lt;figure&gt;
    &lt;a href=&quot;https://www.meetup.com/WarsawJS/&quot;&gt;
        &lt;img src=&quot;/assets/images/posts/post-banner-warsawjs.jpg&quot;
             alt=&quot;WarsawJS&quot;/&gt;
    &lt;/a&gt;
&lt;/figure&gt; --&gt;

&lt;h2 id=&quot;invitation&quot;&gt;Invitation&lt;/h2&gt;

&lt;p&gt;Zapraszam w imieniu organizatorów WarsawJS.&lt;/p&gt;

&lt;div class=&quot;youtube-lazy&quot; data-youtube-id=&quot;ryDB1jLilQQ&quot;&gt;&lt;/div&gt;

&lt;p class=&quot;chapter-break&quot;&gt;&amp;bull;&lt;/p&gt;

&lt;h2 id=&quot;talk-1-wprowadzenie-do-socketio-en-tomasz-marciszewski&quot;&gt;Talk #1: Wprowadzenie do Socket.io [EN] &lt;small&gt;Tomasz Marciszewski&lt;/small&gt;&lt;/h2&gt;

&lt;p&gt;Twitter: &lt;a href=&quot;https://twitter.com/Koori_&quot;&gt;@Koori_&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Link do prelekcji: &lt;a href=&quot;https://www.youtube.com/watch?v=n27c3Rsqjl0&quot;&gt;https://www.youtube.com/watch?v=n27c3Rsqjl0&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Link do slajdów: &lt;a href=&quot;http://tmarciszewski.github.io/socket.io-introduction/&quot;&gt;tmarciszewski.github.io/socket.io-introduction/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p class=&quot;chapter-break&quot;&gt;&amp;bull;&lt;/p&gt;

&lt;h2 id=&quot;talk-2-mobile-od-czego-zacząć-pisanie-aplikacji-na-urządzenia-mobilne-pl-tomasz-pietrzak&quot;&gt;Talk #2: Mobile: od czego zacząć pisanie aplikacji na urządzenia mobilne [PL] &lt;small&gt;Tomasz Pietrzak&lt;/small&gt;&lt;/h2&gt;

&lt;p&gt;Twitter: &lt;a href=&quot;https://twitter.com/Fulkman&quot;&gt;@Fulkman&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Link do prelekcji: &lt;a href=&quot;https://www.youtube.com/watch?v=UytvCo0cyLg&quot;&gt;https://www.youtube.com/watch?v=UytvCo0cyLg&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Link do slajdów: &lt;a href=&quot;http://fulkman.github.io/warsawjs-presentation/&quot;&gt;fulkman.github.io/warsawjs-presentation/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p class=&quot;chapter-break&quot;&gt;&amp;bull;&lt;/p&gt;

&lt;h2 id=&quot;talk-3-angular-2--krótkie-wprowadzenie-pl-mateusz-kocz&quot;&gt;Talk #3: Angular 2 – krótkie wprowadzenie [PL] &lt;small&gt;Mateusz Kocz&lt;/small&gt;&lt;/h2&gt;

&lt;p&gt;Twitter: &lt;a href=&quot;https://twitter.com/mateuszkocz&quot;&gt;@mateuszkocz&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Link do prelekcji: &lt;a href=&quot;https://www.youtube.com/watch?v=SonmrR01vu4&quot;&gt;https://www.youtube.com/watch?v=SonmrR01vu4&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Link do slajdów: &lt;a href=&quot;http://mateuszkocz.github.io/warsawjs-presentation/&quot;&gt;mateuszkocz.github.io/warsawjs-presentation/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p class=&quot;chapter-break&quot;&gt;&amp;bull;&lt;/p&gt;

&lt;h2 id=&quot;sponsorzy-spotkania&quot;&gt;Sponsorzy spotkania&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.facebook.com/Rebased/&quot;&gt;Rebased&lt;/a&gt;, &lt;a href=&quot;https://www.facebook.com/10Clouds/&quot;&gt;10Clouds&lt;/a&gt; - żetony w barze&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.facebook.com/cyfrowypolsat/&quot;&gt;Cyfrowy Polsat&lt;/a&gt; - materiały na YouTube&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.facebook.com/whitestreampl&quot;&gt;Whitestream&lt;/a&gt; - transmisja na żywo - &lt;a href=&quot;http://warsawjs.com/live&quot;&gt;warsawjs.com/live&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
            <pubDate>Sun, 09 Aug 2015 00:00:00 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2015/08/09/warsawjs-meetup-11.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2015/08/09/warsawjs-meetup-11.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/post-banner-warsawjs.jpg</image>
        </item>
        
        <item>
            <title>AngularJS Warsaw #2</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Organizatorami spotkania są Arek Kalbarczyk i Darek Kalbarczyk, których książka &lt;a href=&quot;http://helion.pl/ksiazki/angularjs-pierwsze-kroki-dariusz-kalbarczyk-arkadiusz-kalbarczyk,angupk.htm&quot;&gt;AngularJS. Pierwsze kroki&lt;/a&gt; od 6 tygodni jest na 1 miejscu &lt;a href=&quot;http://helion.pl/&quot;&gt;helion.pl&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Poniżej załączam swoje notatki robione podczas prelekcji. Zastrzegam sobie, że w notatkach nie mam zawartych wszystkich rzeczy, które zostały opowiedziane przez prelegentów.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/angularjs-warsaw/logo/logo-180x180.png&quot; alt=&quot;&quot; /&gt;

    &lt;figcaption&gt;
        &lt;a href=&quot;https://www.meetup.com/AngularJS-Warsaw/&quot;&gt;AngularJS Warsaw&lt;/a&gt;
    &lt;/figcaption&gt;

&lt;/figure&gt;

&lt;h2 id=&quot;talk-1-angularjs-ui-router-pl-arek-kalbarczyk&quot;&gt;Talk #1: AngularJS UI Router [PL] &lt;small&gt;Arek Kalbarczyk&lt;/small&gt;&lt;/h2&gt;

&lt;h3 id=&quot;czym-jest-spa&quot;&gt;Czym jest SPA?&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Dzięki SPA wzrasta responsywność.&lt;/li&gt;
  &lt;li&gt;Mamy wrażenie zbliżone do aplikacji desktopowej.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;routing&quot;&gt;Routing&lt;/h4&gt;

&lt;p&gt;Routing służy do przeładowywania widoków i szablonów.&lt;/p&gt;

&lt;p&gt;Ułatwia modularyzację.&lt;/p&gt;

&lt;p&gt;Dzięki routingowi można połączyć szablon i kontroler, nie trzeba wiązać dyrektywy.&lt;/p&gt;

&lt;h4 id=&quot;ngroute&quot;&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;ngRoute&lt;/code&gt;&lt;/h4&gt;

&lt;p&gt;&lt;cite&gt;W wersji AngularJS 1.2 został wyodrębniony.&lt;/cite&gt;&lt;/p&gt;

&lt;p&gt;To on łączy URL i szablony, czyli aplikacja wie, że ma przeładowywać szablony.&lt;/p&gt;

&lt;p&gt;To on wie, do jakiejś ścieżki podłączyć dany moduł oraz wspiera, co się ma dziać kiedy, ścieżka nie jest odnaleziona.&lt;/p&gt;

&lt;h4 id=&quot;ui-router---zewnętrzna-biblioteka-do-angularjs&quot;&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;UI Router&lt;/code&gt; - zewnętrzna biblioteka do AngularJS&lt;/h4&gt;

&lt;p&gt;Istotna zmiana względem ngRoute, który wiąże ze sobą ścieżki. W &lt;code class=&quot;highlighter-rouge&quot;&gt;UI Router&lt;/code&gt; Wszystkie ścieżki są połączone poprzez stany. Jest to lepsze, bo można zmienić URLa.&lt;/p&gt;

&lt;p&gt;&lt;cite&gt;Można zrobić incepcję 😄&lt;/cite&gt;&lt;/p&gt;

&lt;p&gt;W &lt;code class=&quot;highlighter-rouge&quot;&gt;ngRoute&lt;/code&gt; nie mamy możliwości dziedziczenia szablonów. w &lt;code class=&quot;highlighter-rouge&quot;&gt;UI Router&lt;/code&gt; można zrobić stany dziedziczące.&lt;/p&gt;

&lt;p&gt;Możemy na jednej stronie załączyć kilka niezależnych routingów.&lt;/p&gt;

&lt;p&gt;Co trzeba zrobić jeśli chcemy skorzystać z UI Router?&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;trzeba wstrzyknąć moduł za pomocą dependency injection&lt;/li&gt;
  &lt;li&gt;konfiguracja - za pomocą serwisu - providera w fazie konfiguracji ładowania&lt;/li&gt;
  &lt;li&gt;nie musimy konfigurować w jednym pliku&lt;/li&gt;
  &lt;li&gt;jak przełączać się pomiędzy stanami - za pomocą &lt;code class=&quot;highlighter-rouge&quot;&gt;ui-sref&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;ui-view&lt;/code&gt; wyświetla nasz szablony - może on być w dowolnym fragmencie &lt;code class=&quot;highlighter-rouge&quot;&gt;body&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;zagnieżdżony-routing&quot;&gt;Zagnieżdżony routing&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;do szablonu można załadować kolejny widok - czyli jest to zagnieżdżenie&lt;/li&gt;
  &lt;li&gt;nie warto przesadzać i robić 3 “podstanów”&lt;/li&gt;
  &lt;li&gt;wg UX nie powinniśmy robić więcej niż 3 podstanów, bo typowy użytkownik powinien doklikać się do celu w max 3 kliknięciach&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;multi-routing&quot;&gt;Multi routing&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;definiujemy tyle dyrektyw ile chcemy&lt;/li&gt;
  &lt;li&gt;przypisujemy wartości: &lt;code class=&quot;highlighter-rouge&quot;&gt;view-1&lt;/code&gt;, &lt;code class=&quot;highlighter-rouge&quot;&gt;view-2&lt;/code&gt;, …&lt;/li&gt;
  &lt;li&gt;konfiguracja!
    &lt;ul&gt;
      &lt;li&gt;stan rodzica&lt;/li&gt;
      &lt;li&gt;przekazujemy informację dot. zagnieżdżonych stanów (nazwa rodzica stanów)&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;struktura-aplikacji&quot;&gt;Struktura aplikacji&lt;/h4&gt;

&lt;div class=&quot;language-markdown highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;.
├── app
│   ├── app.js
│   └── modules
│   ├── home
│   │   ├── directives
│   │   ├── homeController.js
│   │   ├── homeView.html
│   │   └── services
│   ├── module2
│   └── modules3
├── assets
│   ├── images
│   └── styles
├── index.html
└── scripts
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h4 id=&quot;ui-router-seo&quot;&gt;UI Router SEO&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;23 maj 2014 roku - Googlebot parsuje &lt;strong&gt;JavaScript&lt;/strong&gt;!&lt;/li&gt;
  &lt;li&gt;czyli wchodząc na naszą stronę, jest w stanie zrozumieć naszą stronę i ją zindeksować&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;robots.txt&lt;/code&gt; może blokować crawlery&lt;/li&gt;
  &lt;li&gt;jeżeli chcemy osiągnąć prawdziwe wyniki to trzeba odwołać się do stałych metod&lt;/li&gt;
  &lt;li&gt;przed hash znajduje się wykrzyknik - &lt;code class=&quot;highlighter-rouge&quot;&gt;escaped fragments&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;biblioteka &lt;a href=&quot;https://prerender.io/&quot;&gt;prerender.io&lt;/a&gt; - pomaga nam przerenderować template po stronie serwera&lt;/li&gt;
  &lt;li&gt;ciekawe udogodnienie ale nie rozwiązanie ost&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;warto-wiedzieć&quot;&gt;Warto wiedzieć&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;htmlMode&lt;/code&gt; na &lt;code class=&quot;highlighter-rouge&quot;&gt;true&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;base href&lt;/code&gt; na &lt;code class=&quot;highlighter-rouge&quot;&gt;/&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;obsługa historii:
    &lt;ul&gt;
      &lt;li&gt;możemy zaimplementować po stronie serwera, który będzie zapamiętywał stany na których byliśmy&lt;/li&gt;
      &lt;li&gt;jeden wyjątek: każdy stan musi zawierać swoją unikalną ścieżkę&lt;/li&gt;
      &lt;li&gt;oraz kilka innych kroków&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;jeśli chcemy uatrakcyjnić:
    &lt;ul&gt;
      &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;ng-enter&lt;/code&gt;&lt;/li&gt;
      &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;ng-leave&lt;/code&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;na-zakończenie&quot;&gt;Na zakończenie…&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;Strona projektu &lt;code class=&quot;highlighter-rouge&quot;&gt;UI Router&lt;/code&gt;: &lt;a href=&quot;https://github.com/angular-ui/ui-router&quot;&gt;github.com/angular-ui/ui-router&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;small&gt;Slajdy: &lt;a href=&quot;http://pro.ispringcloud.com/acc/Hgk7GNIxMjQ4/view/1248-hbbYD-3MyQB-hJwuz&quot;&gt;pro.ispringcloud.com/acc/Hgk7GNIxMjQ4/view/1248-hbbYD-3MyQB-hJwuz&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;

&lt;p&gt;&lt;small&gt;Demo: &lt;a href=&quot;https://github.com/akalbarczyk/Prelekcje&quot;&gt;github.com/akalbarczyk/Prelekcje&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;

&lt;p&gt;&lt;small&gt;Czas trwania prelekcji: 18:35 - 19:01&lt;/small&gt;&lt;/p&gt;

&lt;p class=&quot;chapter-break&quot;&gt;&amp;bull;&lt;/p&gt;

&lt;h2 id=&quot;talk-2-angularjs--bootstrap---duet-internetowej-przyszłości-pl-tomasz-żarnowiec&quot;&gt;Talk #2: AngularJS + Bootstrap - duet internetowej przyszłości [PL] &lt;small&gt;Tomasz Żarnowiec&lt;/small&gt;&lt;/h2&gt;

&lt;h3 id=&quot;czym-jest-bootstrap&quot;&gt;Czym jest bootstrap?&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;jest frameworkiem CSS&lt;/li&gt;
  &lt;li&gt;ma predefiniowane klasy CSS&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;koncepcja&quot;&gt;Koncepcja&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;wszystkie elementy które są zdefiniowane opierają się na klasach nie na ID&lt;/li&gt;
  &lt;li&gt;id jest złe - jeśli wykorzystamy ID to odnosimy się do jednego&lt;/li&gt;
  &lt;li&gt;klasy są re-używalne, nie tak jak ID&lt;/li&gt;
  &lt;li&gt;głowna zasada - mobile first&lt;/li&gt;
  &lt;li&gt;w Bootstrap mamy &lt;code class=&quot;highlighter-rouge&quot;&gt;media-queries&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;boot dopasowuje tylko do szerokości - nigdy dla wysokości ekranu&lt;/li&gt;
  &lt;li&gt;co ciekawe tabele - mogą być skalowalne! - z nie responsywnego elementu mamy responsywny&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;jak-użyć&quot;&gt;Jak użyć?&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;podłączamy CSS w head&lt;/li&gt;
  &lt;li&gt;podłączamy JS w body na dole
    &lt;ul&gt;
      &lt;li&gt;jQuery&lt;/li&gt;
      &lt;li&gt;AngularJS&lt;/li&gt;
      &lt;li&gt;Bootstrap&lt;/li&gt;
      &lt;li&gt;następnie pluginy i dodatki JS-owe&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;ładujemy z CDN-a
    &lt;ul&gt;
      &lt;li&gt;bo nie mamy miejsca na serwerze&lt;/li&gt;
      &lt;li&gt;definicja poprzez &lt;code class=&quot;highlighter-rouge&quot;&gt;//cdnjs.com/bootstrap.js&lt;/code&gt; to strona ustala protokół po jakim ściągnie liba&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;grid-siatka-czyli-podstawowy-element-bootstrapa&quot;&gt;Grid (siatka) czyli podstawowy element bootstrapa&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;każda kolumna ma prefix
    &lt;ul&gt;
      &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;col-[xs-sm-md-lg]-[1-12]&lt;/code&gt; - odnosi się do szerokości wyświetlacza&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;najpierw skalujemy mały ekran, a potem do tych większych&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;div.row&lt;/code&gt; - dla desktop będzie wysokości 2 div-ów, ale po zmniejszeniu np. mobile to będzie zawierał 2 kontenery (1 pod drugim)&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;animacje&quot;&gt;Animacje!&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;jQuery ma w sobie animacje, ale są one już w CSS&lt;/li&gt;
  &lt;li&gt;jQuery i tak modyfikuje CSS&lt;/li&gt;
  &lt;li&gt;jQuery opóźnia&lt;/li&gt;
  &lt;li&gt;jeśli mamy mały element do animacji to jQuery&lt;/li&gt;
  &lt;li&gt;jeśli duży content trzeba animować to tylko CSS&lt;/li&gt;
  &lt;li&gt;lib: Animate.css - zawiera zdefiniowanych kilkadziesiąt animacji
    &lt;ul&gt;
      &lt;li&gt;dodajemy po bootstrapie do index.html&lt;/li&gt;
      &lt;li&gt;bardzo lekka biblioteka: 20KB&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Mój klucz do frontowego sukcesu: &lt;strong&gt;nie przeładowujemy - nie odświeżaj&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;small&gt;Slajdy: &lt;a href=&quot;http://pro.ispringcloud.com/acc/I9z1QnkxMjU1/view/1255-R4pEa-5qwp8-iZQsK&quot;&gt;pro.ispringcloud.com/acc/I9z1QnkxMjU1/view/1255-R4pEa-5qwp8-iZQsK&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;

&lt;p&gt;&lt;small&gt;Demo: &lt;a href=&quot;https://github.com/tomaszzarnowiec/SPATemplate&quot;&gt;github.com/tomaszzarnowiec/SPATemplate&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;

&lt;p&gt;&lt;small&gt;Czas trwania prelekcji: 19:35 - 20:06&lt;/small&gt;&lt;/p&gt;

&lt;p class=&quot;chapter-break&quot;&gt;&amp;bull;&lt;/p&gt;

&lt;h2 id=&quot;talk-3-angularjs---the-reactive-manifesto-v20-pl-marek-tuchalski&quot;&gt;Talk #3: AngularJS - The Reactive Manifesto (v2.0) [PL] &lt;small&gt;Marek Tuchalski&lt;/small&gt;&lt;/h2&gt;

&lt;h4 id=&quot;reactive-manifesto-v20&quot;&gt;Reactive Manifesto (v2.0)&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;użytkownicy żądają responsywności rzędu 100ms&lt;/li&gt;
  &lt;li&gt;w dużej mierze jest to marketingowy zabieg
    &lt;ul&gt;
      &lt;li&gt;aby sam typ programowania spopularyzować&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;istnieją 4 punkty:
    &lt;ol&gt;
      &lt;li&gt;responsive - obsługa błędów, np pojawiła się 504, trzeba poinformować usera&lt;/li&gt;
      &lt;li&gt;resilient - odporność
        &lt;ul&gt;
          &lt;li&gt;architektura serwisowa&lt;/li&gt;
          &lt;li&gt;nie dotyczy Front-end-u - bardziej Back-end-u&lt;/li&gt;
          &lt;li&gt;slack i gmail - przykładowe aplikacje, z których można korzystać kiedy połączenie z internetem zanika&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
      &lt;li&gt;elastic - Back-end-owa rzecz
        &lt;ul&gt;
          &lt;li&gt;skalowanie
            &lt;ul&gt;
              &lt;li&gt;automatyzacja mikroserwisów&lt;/li&gt;
              &lt;li&gt;replikacja danych&lt;/li&gt;
              &lt;li&gt;dodawania maszyn (manualna)&lt;/li&gt;
            &lt;/ul&gt;
          &lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
      &lt;li&gt;message driven
        &lt;ul&gt;
          &lt;li&gt;systemy komunikują się poprzez wiadomości&lt;/li&gt;
          &lt;li&gt;gdzie na Front-end-zie można użyć message driven?
            &lt;ul&gt;
              &lt;li&gt;systemy muszą działa async, aby nie blokować zasobów, kiedy tego nie potrzebujemy&lt;/li&gt;
            &lt;/ul&gt;
          &lt;/li&gt;
        &lt;/ul&gt;
      &lt;/li&gt;
    &lt;/ol&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;project-share-by-role&quot;&gt;Project share by role&lt;/h4&gt;

&lt;p&gt;Reactive manifesto reklamuje Typesafe. Ludzie myślą, że to dotyczy tylko Back-end-ów Nieprawda! Aby aplikacja spełniała wymogi użytkowników to Front-end musi być responsywny!&lt;/p&gt;

&lt;h4 id=&quot;demo-of-1-page-hr-hiring--idea-sharing-platform&quot;&gt;Demo of 1-page HR Hiring &amp;amp; Idea Sharing platform&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;platforma, która ma zmieniać świat!&lt;/li&gt;
  &lt;li&gt;handlujmy szybko&lt;/li&gt;
  &lt;li&gt;obsługujmy błędy&lt;/li&gt;
  &lt;li&gt;wpinajmy błędy, bo jak faktycznie klient zobaczy to abyśmy mogli się przed typ zabezpieczyć&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;ddos---jak-z-tym-żyć&quot;&gt;DDoS - jak z tym żyć?&lt;/h4&gt;

&lt;p&gt;Co jeśli przyjdzie nam przeżyć “Wykop Efekt” albo “Reddit Effect”?&lt;/p&gt;

&lt;p&gt;Poprawnie to się nazywa &lt;code class=&quot;highlighter-rouge&quot;&gt;Efekt Slashdot-a&lt;/code&gt;. Więcej do poczytania na ten temat &lt;a href=&quot;https://pl.wikipedia.org/wiki/Efekt_Slashdota&quot;&gt;https://pl.wikipedia.org/wiki/Efekt_Slashdota&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Co powinna zrobić reaktywna apka?&lt;/li&gt;
  &lt;li&gt;Pokazać 504 gateway timeout!&lt;/li&gt;
  &lt;li&gt;bo lepiej jest pokazać aplikację dla części użytkowników, niż wcale&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Facebook&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;continuous deployment&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Netflix&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;zabija swoje serwery&lt;/li&gt;
  &lt;li&gt;gdzie się podnoszą następne&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;bądź-gotowy-na-fail&quot;&gt;Bądź gotowy na fail!&lt;/h4&gt;

&lt;p&gt;Założenie:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;że zawsze dostanę odpowiedź jest bardzo złym założeniem&lt;/li&gt;
  &lt;li&gt;to że dostaniemy 404 też jest złym założeniem&lt;/li&gt;
  &lt;li&gt;obsługujemy grupy błędów (4xx, 5xx)&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;jak-to-osiągnąć-odpowiedź-separation-of-concerns&quot;&gt;Jak to osiągnąć? Odpowiedź: Separation of concerns!&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;oddzielić modele od widoku&lt;/li&gt;
  &lt;li&gt;nie przekazywać danych przez scope-a&lt;/li&gt;
  &lt;li&gt;izolować html od css&lt;/li&gt;
  &lt;li&gt;styleguide dla kontrolerów - więcej na &lt;a href=&quot;http://triangular.io/blog/styleguide-controllers/&quot;&gt;triangular.io/blog/styleguide-controllers/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;small&gt;Czas trwania prelekcji: 20:27 - 21:10&lt;/small&gt;&lt;/p&gt;

&lt;p&gt;&lt;small&gt;
Prelegentem był Marek z firmy &lt;a href=&quot;http://evojam.com/&quot;&gt;Evojam&lt;/a&gt;.&lt;br /&gt;
Kontakt: &lt;a href=&quot;https://twitter.com/marektuchalski&quot;&gt;@marektuchalski&lt;/a&gt;&lt;br /&gt;
&lt;/small&gt;&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/angularjs-warsaw/meetup-2/ng-2-marek.jpg&quot; alt=&quot;&quot; /&gt;
    &lt;figcaption&gt;Marek na scenie.&lt;/figcaption&gt;
&lt;/figure&gt;
</description>
            <pubDate>Fri, 31 Jul 2015 00:00:00 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2015/07/31/angularjs-warsaw-2.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2015/07/31/angularjs-warsaw-2.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/angularjs-warsaw/logo/logo-526x275.jpg</image>
        </item>
        
        <item>
            <title>Historia loga języka JavaScript</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Kiedy powstał &lt;strong&gt;JavaScript&lt;/strong&gt; nie miał swojego loga. Wszystkie języki kiedy powstają mają swoje &lt;em&gt;oficjalne&lt;/em&gt; loga. Mają ponieważ za każdym z języków stoi jakiś podmiot odpowiedzialny.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Za JavaScript nikt nie jest odpowiedzialny.&lt;/strong&gt;&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/post-banner-javascript.png&quot; itemprop=&quot;image&quot; alt=&quot;Baner promujący artykuł&quot; /&gt;
&lt;/figure&gt;

&lt;p&gt;Dlatego też, ten najpopularniejszy język dzisiejszych czasów (według serwisu &lt;a href=&quot;http://githut.info/&quot;&gt;githut.info/&lt;/a&gt;) nie posiada oficjalnego loga.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;JavaScript&lt;/strong&gt; jest implementowany przez przeglądarki na swój sposób. Dlatego też nie ma jednolitego przewodnika do tego języka. Istnieją manuale napisane przez firmy, które tworzą przeglądarki, np.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;Microsoft: JavaScript Language Reference&lt;/p&gt;

    &lt;p&gt;&lt;a href=&quot;https://msdn.microsoft.com/en-us/library/d1et7k7c(v=vs.85).aspx&quot;&gt;https://msdn.microsoft.com/en-us/library/d1et7k7c(v=vs.85).aspx&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Mozilla: JavaScript&lt;/p&gt;

    &lt;p&gt;&lt;a href=&quot;https://developer.mozilla.org/en/JavaScript&quot;&gt;https://developer.mozilla.org/en/JavaScript&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pośrednio nad rozwojem &lt;strong&gt;JavaScript&lt;/strong&gt;-u czuwa zespół &lt;a href=&quot;http://www.ecma-international.org/memento/TC39.htm&quot;&gt;TC39&lt;/a&gt;, który rozwija &lt;strong&gt;ECMAScript&lt;/strong&gt; czyli standard, który jest używany w JavaScript, JScript oraz ActionScript.&lt;/p&gt;

&lt;p&gt;Jednak oni nie są odpowiedzialni za implementację samego &lt;strong&gt;JavaScript&lt;/strong&gt;-u.&lt;/p&gt;

&lt;h2 id=&quot;oficjalne-logo-js&quot;&gt;“Oficjalne” logo JS&lt;/h2&gt;

&lt;p&gt;4-ego października 2011 roku podczas konferencji &lt;a href=&quot;https://www.youtube.com/playlist?list=PL37ZVnwpeshEVYiRemhMII6ORJmsJuqP7&quot;&gt;JSConf EU 2011&lt;/a&gt; Chris Williams wystąpił na scenie (&lt;a href=&quot;https://www.youtube.com/watch?v=17rkSdkc5TI&quot;&gt;youtube.com/watch?v=17rkSdkc5TI&lt;/a&gt;) i w swojej prezentacji, na temat negatywnych emocji, pokazał wszystkim swoją propozycję loga JS-a.&lt;/p&gt;

&lt;p&gt;Chris stworzył repozytorium na GitHub-ie (&lt;a href=&quot;https://github.com/voodootikigod/logo.js&quot;&gt;github.com/voodootikigod/logo.js&lt;/a&gt;), gdzie można zobaczyć jego propozycję:&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/javascript/logo-javascript.svg&quot; alt=&quot;JavaScript logo&quot; /&gt;

    &lt;figcaption&gt;
        Logo JS-a zaproponowane przez Chrisa Willisa podczas konferencji
        JSConf EU 2011.
    &lt;/figcaption&gt;

&lt;/figure&gt;

&lt;p&gt;W tym projekcie znajdują się loga innych organizacji (konferencji, meetup-ów) JavaScript-owych.&lt;/p&gt;

&lt;h2 id=&quot;dlaczego-js-a-nie-javascript&quot;&gt;Dlaczego JS a nie JavaScript?&lt;/h2&gt;

&lt;p&gt;Znak handlowy &lt;strong&gt;JavaScript&lt;/strong&gt; jest zastrzeżony przez firmę &lt;strong&gt;ORACLE AMERICA, INC.&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Dla pewności można zajrzeć tutaj:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://tsdr.uspto.gov/#caseNumber=75026640&amp;amp;caseType=SERIAL_NO&amp;amp;searchType=statusSearch&quot;&gt;tsdr.uspto.gov/#caseNumber=75026640&amp;amp;caseType=SERIAL_NO&amp;amp;searchType=statusSearch&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;prawa-do-marki&quot;&gt;Prawa do marki&lt;/h3&gt;

&lt;p&gt;Kiedy to w 1995 roku &lt;em&gt;Sun Microsystems&lt;/em&gt; stworzył język o nazwie Java, zastrzegł sobie od razu &lt;a href=&quot;https://en.wikipedia.org/wiki/Trademark&quot;&gt;trademark&lt;/a&gt;-ów. Wśród nich znalazły się:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;JAVA&lt;/li&gt;
  &lt;li&gt;JAVA COMMUNITY PROCESS&lt;/li&gt;
  &lt;li&gt;JAVA COMPATIBLE&lt;/li&gt;
  &lt;li&gt;JAVAONE&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;JAVASCRIPT&lt;/strong&gt;&lt;/li&gt;
  &lt;li&gt;JAVABEANS&lt;/li&gt;
  &lt;li&gt;JAVAFX&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Kilka lat temu (w 2010 roku) &lt;em&gt;Sun Microsystems&lt;/em&gt; zostało przejęte przez firmę &lt;a href=&quot;https://www.oracle.com/&quot;&gt;Oracle&lt;/a&gt;. Dlatego też według prawa, to tylko ta firma może tylko stworzyć oficjalne logo dla JavaScriptu. Niestety, ale to nie Oracle zajmuje się rozwojem tego języka, więc prawdopodobnie nigdy nie doczekamy się oficjalnego loga.&lt;/p&gt;

&lt;h3 id=&quot;chciałbym-użyć-logo-javascriptu-co-robić&quot;&gt;Chciałbym użyć logo JavaScriptu. Co robić?&lt;/h3&gt;

&lt;p&gt;W dzisiejszych czasach, developerzy utożsamiają sobie skrót JS tylko z JavaScriptem, więc korzystanie z loga do JS-a jest właściwym podejściem.&lt;/p&gt;

&lt;p&gt;Chris podkreślił, że jeśli ktoś chce używać jego propozycji to on nie widzi żadnych przeciwwskazań do tego, aby używać go wszędzie tam gdzie się chce. Logo jest udostępniane na licencji &lt;a href=&quot;https://pl.wikipedia.org/wiki/WTFPL&quot;&gt;WTFPL&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;logo-ecmascript-6&quot;&gt;Logo ECMAScript 6&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;ECMAScript&lt;/strong&gt; jest standardem stworzonym przez organizację &lt;a href=&quot;https://pl.wikipedia.org/wiki/Ecma_International&quot;&gt;Ecma International&lt;/a&gt;. Organizacja posiada swoje logo na swojej stronie domowej: &lt;a href=&quot;http://www.ecma-international.org/&quot;&gt;ecma-international.org/&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Jednak standardy raczej rzadko posiadają swoje loga, dlatego też i &lt;strong&gt;ECMAScript 6&lt;/strong&gt; nie posiada swojego loga.&lt;/p&gt;

&lt;p&gt;W takim razie jak można oddać światu zaufanie dla &lt;strong&gt;ES6&lt;/strong&gt;?&lt;/p&gt;

&lt;h3 id=&quot;siła-społeczności&quot;&gt;Siła społeczności&lt;/h3&gt;

&lt;p&gt;Wszystko za sprawą projektu &lt;a href=&quot;https://github.com/gilbarbara/logos&quot;&gt;github.com/gilbarbara/logos&lt;/a&gt; autorstwa &lt;a href=&quot;https://github.com/gilbarbara&quot;&gt;Gil Barbara&lt;/a&gt;. Zebrał on w jednym miejscu loga do wszystkich znanych projektów, języków, technologii.&lt;/p&gt;

&lt;p&gt;Dla wielu będzie to pierwsze miejsce w poszukiwaniu loga wybranej technologii w sieci.&lt;/p&gt;

&lt;p&gt;Dla mnie na pewno.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/javascript/logo-es6.svg&quot; /&gt;

    &lt;figcaption&gt;
        Propozycja loga ECMAScript 6.
    &lt;/figcaption&gt;

&lt;/figure&gt;
</description>
            <pubDate>Wed, 15 Jul 2015 00:00:00 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2015/07/15/historia-loga-jezyka-javascript.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2015/07/15/historia-loga-jezyka-javascript.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/post-banner-javascript.png</image>
        </item>
        
        <item>
            <title>IT Manager Meetup #1</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;W stolicy powstała nowa inicjatywa zrzeszająca managerów z branży IT. Zaplanowałem sobie, że chcę zobaczyć na jakich zasadach będzie polegał ten nowy cykl spotkań.&lt;/p&gt;

&lt;p&gt;Na ostatnie &lt;strong&gt;Warsaw Meta Meetup&lt;/strong&gt;, spotkaniu dla organizatorów meetup-ów w Warszawie, poznałem się z Dominiką Gmerek, która to zaprosiła mnie na nowy cykl spotkań. Jestem głodny takich nowych wyzwań, także nie mogłem odpuścić sobie tej przyjemności i odpuścić.&lt;/p&gt;

&lt;p&gt;Więcej o spotkaniu można dowiedzieć się na profilu wydarzenia: &lt;a href=&quot;https://www.facebook.com/events/1459914867639803/&quot;&gt;facebook.com/events/1459914867639803/&lt;/a&gt;&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/it-manager-meetup/it-manager-meetup.jpg&quot; itemprop=&quot;image&quot; alt=&quot;Baner promujący artykuł&quot; /&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;talk-1-developer-heaven&quot;&gt;Talk #1: Developer heaven&lt;/h2&gt;

&lt;blockquote&gt;
  &lt;p&gt;Prelegent: Maciej Cielecki (CTO w 10Clouds)&lt;/p&gt;

  &lt;p&gt;Od 6 lat jest prezesem.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Gdybyśmy nie chcieli wyprzedzić rynku trudno byłoby nam się przebić. Rekrutacja jest dosyć zaawansowana.&lt;/p&gt;

&lt;p&gt;Dwa kierunki:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;albo piekło&lt;/li&gt;
  &lt;li&gt;albo niebo&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;jaka-jest-rożnica-między-firmami-produktowymi-a-usługowymi&quot;&gt;Jaka jest rożnica między firmami produktowymi a usługowymi?&lt;/h4&gt;

&lt;p&gt;Usługowe - programują dla innych.&lt;/p&gt;

&lt;p&gt;&lt;i class=&quot;icon-good&quot;&gt;&lt;/i&gt; Plusy&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;ludzie mogą skakać po projektach (zyskują w zmienianiu siebie)&lt;/li&gt;
  &lt;li&gt;więcej człowiek może się nauczyć, kiedy jest rotacja pracownika między projektami&lt;/li&gt;
  &lt;li&gt;w usługach inaczej się buduje strukturę&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;i class=&quot;icon-poor&quot;&gt;&lt;/i&gt; Minusy&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;trudne jest poczucie celu np. Google, Uber&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Super ważne w kontekście satysfakcji pracy - jak dobrą ma dokumentację i design.&lt;/p&gt;

&lt;p&gt;Cały team design-owy i ux-owy który robi dobrą grafikę i makiety są one konsultowane technicznie.&lt;/p&gt;

&lt;p&gt;Pozwala to programistom w projektowaniu architektury aplikacji.&lt;/p&gt;

&lt;h4 id=&quot;agile-is-good-good-agile-is-better&quot;&gt;Agile is good, good agile is better.&lt;/h4&gt;

&lt;p&gt;Dużo osób pracuje w Agile, ale nie wszyscy znają tą metodologię dokładnie. Codziennie ludzie spotykają na stand-up-ach i myślą, że to jest cały &lt;code class=&quot;highlighter-rouge&quot;&gt;Agile&lt;/code&gt; 😄&lt;/p&gt;

&lt;p&gt;Dla programistów jest super ważne, aby nie byli managerami!&lt;/p&gt;

&lt;h5 id=&quot;zasada&quot;&gt;Zasada&lt;/h5&gt;

&lt;p&gt;Sprint jest nie do dotknięcia!&lt;/p&gt;

&lt;p&gt;Jeśli dobrze się planuje, to nie można mieszać zadaniami w sprint-cie.&lt;/p&gt;

&lt;p&gt;Tworzenie dużej dokumentacji na początek (bardzo dokładna):&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;rozbijana na tickety w Jira&lt;/li&gt;
  &lt;li&gt;wszystko wiadomo&lt;/li&gt;
  &lt;li&gt;ktoś przemyślał całość&lt;/li&gt;
  &lt;li&gt;w iteracjach uczestniczą też Ci, którzy robili dokumentację&lt;/li&gt;
  &lt;li&gt;rzeczy się zmieniają - design jest aktualizowany na bieżąco&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;anegdota-o-wychowaniu-8-latka&quot;&gt;Anegdota o wychowaniu 8-latka&lt;/h4&gt;

&lt;p&gt;Kiedyś pewien manager miał problem z wychowaniem swojego syna. Nie potrafił on przestrzegać pewnych słownych ustaleń. Tenże manager był “certyfikowanym scrum masterem” więc wiedział z czym się je “Scrum task board”. Postanowił więc wykorzystać tą wiedzę w życiu codziennym.&lt;/p&gt;

&lt;p&gt;Stworzył tabelę na kartce papieru, gdzie zapisał ile czasu w ciągu dnia jego syna będzie przeznaczał na każde zadanie (zabawę, naukę). Tym samym kiedy zapisał, że w ciągu całego dnia tylko &lt;em&gt;1h na XBox&lt;/em&gt;, inna na coś innego, a ostatnia na naukę, to dziecko widząc taki plan dostosowywało się do niego.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;Maciej polecił do przeczytania artykuł w serwisie Techcrunch: “Perks don’t work”.&lt;/p&gt;

&lt;p&gt;Jest on dostępy pod adresem: &lt;a href=&quot;http://techcrunch.com/2014/12/11/perks-dont-work/&quot;&gt;techcrunch.com/2014/12/11/perks-dont-work/&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;W Dolinie Krzemowej developerzy nie mają satysfakcji z pracy, bo dużo zarabiają. Pracodawcy popełniają ten błąd, że motywują swoich pracowników tylko wyższymi zarobkami. Jest to złe podeście, bo przy pewnym stopniu zarobków ich wzrost o kilka procent nie cieszy tam mocno jak na początku swojej kariery.&lt;/p&gt;

&lt;h4 id=&quot;emanowanie-kulturą&quot;&gt;Emanowanie kulturą&lt;/h4&gt;

&lt;p&gt;W 10Clouds zostało powołane nowe stanowisko &lt;em&gt;HR Marketing Manager&lt;/em&gt;. Osoba na tym stanowisku zajmuje się przedstawianiem priorytetów firmowych oraz zasad panujących w relacjach między pracownikami.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;“Procesy rekrutacyjne kończą się zawsze “ściągnięciem” ludzi którzy pasują do kultury panującej w firmie.”&lt;/em&gt;&lt;/p&gt;

&lt;h4 id=&quot;saying-goodbye&quot;&gt;Saying goodbye&lt;/h4&gt;

&lt;p&gt;Co zrobić kiedy trzeba zwolnić pracownika?&lt;/p&gt;

&lt;p&gt;Warto zwalniać ludzi którzy nie pasują dla wzrostu (rozwoju) firmy.&lt;/p&gt;

&lt;p&gt;Jak zwalniać ludzi?&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;nigdy nie zwalniać ludzi pochopnie&lt;/li&gt;
  &lt;li&gt;dać na początku “zółtą kartę”&lt;/li&gt;
  &lt;li&gt;następnie dać sobie okres “żebyśmy spróbowali się dograć”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Zwalnianie osób niepasujących do zespołu wywołuje bezpieczeństwo u innych.&lt;/p&gt;

&lt;h4 id=&quot;zarobki-w-firmie&quot;&gt;Zarobki w firmie&lt;/h4&gt;

&lt;p&gt;Maciek przybliżył historię pewnej firmy, która ma publiczny spritesheet z pensjami.&lt;/p&gt;

&lt;p&gt;Istnieje nawet jawny algorytm wyliczania pensji.&lt;/p&gt;

&lt;h4 id=&quot;headhunters&quot;&gt;Headhunters&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;nie emanują kulturą pracy w danej firmie&lt;/li&gt;
  &lt;li&gt;lepiej mieć HR wewnętrzny&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;droga-developer--manager---pros--cons&quot;&gt;Droga &lt;code class=&quot;highlighter-rouge&quot;&gt;developer → manager&lt;/code&gt; - Pros &amp;amp; Cons&lt;/h4&gt;

&lt;p&gt;&lt;i class=&quot;icon-good&quot;&gt;&lt;/i&gt; Plusy&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;zrozumienie mentalności koderów (miejsce pracy)&lt;/li&gt;
  &lt;li&gt;flow
    &lt;ul&gt;
      &lt;li&gt;spędzić trochę czasu aby wejść w stan nirvany&lt;/li&gt;
      &lt;li&gt;koderzy lubią wyjść z takiego flow - &lt;strong&gt;nie są aspołeczni&lt;/strong&gt;&lt;/li&gt;
      &lt;li&gt;tylko osoby które sa wstanie wejść w takim flow są dobrymi koderami&lt;/li&gt;
      &lt;li&gt;można zepsuć ten stan przychodząc i zaczepiając, np. robiąc spotkanie&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;flexible time&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;i class=&quot;icon-poor&quot;&gt;&lt;/i&gt; Minusy&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;brak!&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Kwintesencja programowania:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;zone: strefa mentalnego komfortu&lt;/li&gt;
  &lt;li&gt;flow: stan euforii&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Więcej na temat &lt;strong&gt;flow&lt;/strong&gt; na stronie &lt;a href=&quot;http://pinczek.pl/uczucie-przeplywu-czyli-jak-wejsc-w-flow/&quot;&gt;pinczek.pl/uczucie-przeplywu-czyli-jak-wejsc-w-flow/&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;“Praca zdalna” nie oznacza pracy w domu! &lt;small&gt;Maciej Cielecki&lt;/small&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Maciej poleca książkę 37signals pt. “Remote”, która to omawia sposoby pracy zdalnej.&lt;/p&gt;

&lt;p&gt;Więcej o książce na stronie domowej: &lt;a href=&quot;http://37signals.com/remote/&quot;&gt;37signals.com/remote/&lt;/a&gt;&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;Warto wspomnieć, że nie powinno się wymagać asertywności od programistów.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Project Manager&lt;/em&gt;-owie, przekonają programistę do zobligowania się do zrobienia czegoś na jutro.&lt;/p&gt;

&lt;p&gt;Developer, zdaje sobie sprawę, że jest to nie realne, ale się “postara”.&lt;/p&gt;

&lt;p&gt;Efekt jest taki, że developer nie skończy i będzie mu głupio, bo “obiecał”, no i PM będzie miał problem, bo myślał, że zadanie zostało zrealizowane.&lt;/p&gt;

&lt;p&gt;Istnieją takie firmy gdzie jest bardzo dużo procedur:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;[MINUS] zamiast pracować to wypełnia się procedury&lt;/li&gt;
  &lt;li&gt;[MINUS] to jest rozpraszające&lt;/li&gt;
  &lt;li&gt;[MINUS] nie daje satysfakcji pracy ludziom&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Lepiej jest &lt;strong&gt;nie tworzyć takich procedur&lt;/strong&gt;, a już jakiś soft, który może pomóc w rozwiązaniu problemów!&lt;/p&gt;

&lt;h4 id=&quot;kultura-nie-procedury&quot;&gt;Kultura nie procedury!&lt;/h4&gt;

&lt;dl class=&quot;question-list&quot;&gt;
    &lt;dt&gt;Co lubia programiści?&lt;/dt&gt;
    &lt;dd&gt;
        Lubią intelektualne wyzwania i to, żeby było one ciekawe.
        Na przykład zaczynają budować mega skomplikowany kod.
        Trzeba ich wtedy nauczyć, w którym miejscu stawiać
        granice, aby ten kod był możliwy do utrzymania na długi czas.
    &lt;/dd&gt;
&lt;/dl&gt;

&lt;h4 id=&quot;jak-można-dostarczyć-takich-intelektualnych-wyzwań&quot;&gt;Jak można dostarczyć takich “intelektualnych wyzwań”?&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;organizowanie hackday (aby użyć nowej technologii)&lt;/li&gt;
  &lt;li&gt;jesteś w stanie raz na kilka miesięcy - zrobić “intelektualny challenge”&lt;/li&gt;
  &lt;li&gt;czas, za która firma płaci&lt;/li&gt;
  &lt;li&gt;okiem pracodawcy: zespół bada nowe technologie, które można użyć w nowych projektach&lt;/li&gt;
  &lt;li&gt;trzeba przekonać prezesa aby zaakceptował budżet, bo dla firmy jednym plusem jest “research technologiczny”&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;człowiek-z-niewidzialny-pistoletem&quot;&gt;Człowiek z “niewidzialny pistoletem”&lt;/h4&gt;

&lt;p&gt;Ta osoba decyduje o wszystkich rzeczach. Ważna osoba (ten który ma władze) np. CTO&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;jeśli ta osoba nie rozumie, to nic się nie stanie nowego w organizacji&lt;/li&gt;
  &lt;li&gt;kultura developerska powinna być dostępna (jasna) do tego człowieka&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;“Niewidzialny pistolet” to metafora tego, że gdy na spotkaniu pojawi się pistolet to developer może czuć, że gdy powie coś złego się zwolniony.&lt;/p&gt;

&lt;p class=&quot;chapter-break&quot;&gt;&amp;bull;&lt;/p&gt;

&lt;h2 id=&quot;talk-2-autostrada-do-nieba&quot;&gt;Talk #2: Autostrada do nieba&lt;/h2&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;Marek Grochala (CEO w Evojam) Mała firma - 14 osób
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Jak my robimy proces rekrutacji w Evojam?&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;jak u nas działa&lt;/li&gt;
  &lt;li&gt;to nie jest jedyny słuszny proces&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bardzo subiektywny proces rekrutacji.&lt;/p&gt;

&lt;h4 id=&quot;plan&quot;&gt;Plan&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;po co szukamy nowego człowieka?&lt;/li&gt;
  &lt;li&gt;my z definicji nie chcemy być dużą firmą, chcemy rosnąć wolniej ale dokładniej&lt;/li&gt;
  &lt;li&gt;proces jest bardzo dokładny, dużo osób odpada, ale jeśli się ktoś znajdzie to w dużym stopniu pasuje do reszty organizacji&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Szukamy osoby która będzie pracowała dla zespołu, która dobrze się komunikowała.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Czasy samotnych wilków już minęły.&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Większość problemów wynika z problemów z komunikacją. &lt;small&gt;Marek Grochala&lt;/small&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Nie zatrudniamy znajomych, rodziny, bo rodzi problemy w przypadku czarnych scenariuszy. &lt;em&gt;Dylematy zwalniania rodziny i przyjaciół - wiemy z doświadczenia.&lt;/em&gt;&lt;/p&gt;

&lt;h4 id=&quot;jak-szukać-byś-sexi&quot;&gt;Jak szukać? Byś sexi!&lt;/h4&gt;

&lt;p&gt;Oszczędzić czas na spotkaniu? Napisać FAQ na stronie organizacji.&lt;/p&gt;

&lt;p&gt;W procesie rekrutacyjnym chodzi o transparentność (jasne zasady)!&lt;/p&gt;

&lt;p&gt;Podajemy przedziały zarobków na naszej stronie.&lt;/p&gt;

&lt;p&gt;Jakie są warunki pracy:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;warunki płacowe&lt;/li&gt;
  &lt;li&gt;wymyśliła to osoba (programista), a nie &lt;a href=&quot;http://www.bullshitgenerator.com/&quot;&gt;bullshitgenerator.com/&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;jak wygląda proces rekrutacji&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;jak-rekrutować&quot;&gt;Jak rekrutować?&lt;/h4&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;a href=&quot;http://pracuj.pl&quot;&gt;Pracuj.pl&lt;/a&gt; jest zdecydowanie większy od reszty. &lt;small&gt;Marek Grochala&lt;/small&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Często są na takie oferty zgłaszają się headhunterzy. Rzadko jednak zaproponują dobrych kandydatów.&lt;/p&gt;

&lt;p&gt;Alternatywne metody:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;prezentacje na meetup-ach&lt;/li&gt;
  &lt;li&gt;to nie jest szybkie rozwiązanie, ale działa&lt;/li&gt;
  &lt;li&gt;ewangelizacja studentów na uczelni&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;5-kroków-autostrady&quot;&gt;5 kroków autostrady&lt;/h4&gt;

&lt;ol&gt;
  &lt;li&gt;Curriculum Vitae
    &lt;ul&gt;
      &lt;li&gt;Czy osoba w ogóle się nadaje na programowaniu?&lt;/li&gt;
      &lt;li&gt;Kogo zna ta osoba? Jak się z nią pracuje?&lt;/li&gt;
      &lt;li&gt;Gdzie pracował?&lt;/li&gt;
      &lt;li&gt;Jak często zmieniał pracę? Warto czasem szybko zmieniać pracę.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Praca domowa
    &lt;ul&gt;
      &lt;li&gt;Bardzo ogólna praca domowa - od developera zależy jak zdefiniuje dziedzinę problemu.&lt;/li&gt;
      &lt;li&gt;Specjalnie nie jest stricte zdefiniowane.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Spotkanie
    &lt;ul&gt;
      &lt;li&gt;Wspólnicy + człowiek z zespołu.&lt;/li&gt;
      &lt;li&gt;Liberum Veto - jeśli jedna osoba powie NIE, to rezygnujemy z kandydata.&lt;/li&gt;
      &lt;li&gt;Bardzo dużo pytań miękkich.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Oczekiwania finansowe
    &lt;ul&gt;
      &lt;li&gt;..ale na końcu to my składamy ofertę na naszych warunkach finansowych!&lt;/li&gt;
      &lt;li&gt;Nie patrzysz na doświadczenie.&lt;/li&gt;
      &lt;li&gt;Jeśli oferta różni się od oczekiwań to tłumaczę zostaje wytłumaczone z jakiego powodu.&lt;/li&gt;
      &lt;li&gt;Logiczna oferta - z czego wynika oferta.&lt;/li&gt;
      &lt;li&gt;Główny cel to rozwój pracownika!&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Dream team
    &lt;ul&gt;
      &lt;li&gt;Dobór systemu jaki chcesz, ma dać się zainstalować soft który jest potrzebny.&lt;/li&gt;
      &lt;li&gt;Osoba musi zacząć tworzyć rewizje - kod musi przejść przez 2 osoby.&lt;/li&gt;
      &lt;li&gt;Klientom sprzedajemy jakość - pierwsze rewizje w bólach&lt;/li&gt;
      &lt;li&gt;Jak najszybciej dajemy dostęp i jak najszybciej kodowanie&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;p class=&quot;chapter-break&quot;&gt;&amp;bull;&lt;/p&gt;

&lt;h2 id=&quot;talk-3-szanuj-admina-swego-bo-możesz-mieć-gorszego&quot;&gt;Talk #3: Szanuj Admina swego, bo możesz mieć gorszego&lt;/h2&gt;

&lt;blockquote&gt;
  &lt;p&gt;Maciek Broniarz (Kierownik Działu Sieci Komputerowych UW) 17 lat doświadczenia.&lt;/p&gt;

  &lt;p&gt;W swojej historii zrobił dużo audytów bezpieczeństwa.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4 id=&quot;kim-jest-admin-gość-odpowiada-za-infrastrukturę&quot;&gt;Kim jest admin? Gość odpowiada za infrastrukturę&lt;/h4&gt;

&lt;p&gt;DevOps - nowe stanowisko. Jest to developer która pozbywa się cech administratora.&lt;/p&gt;

&lt;h4 id=&quot;co-robi-admin-robi-wszystko&quot;&gt;Co robi admin? Robi wszystko!&lt;/h4&gt;

&lt;p&gt;Pilnuje to, co udostępnia firma na świat, aby działało i w należyty sposób. Często jest tak, że admin jest jedyną osobą w firmie która wie jak coś działa, np. przy wdrożeniu uczy się całej aplikacji.&lt;/p&gt;

&lt;h4 id=&quot;rekrutacja&quot;&gt;Rekrutacja&lt;/h4&gt;

&lt;p&gt;Gdy w pracy nastąpiła awaria to jest ona mocno stresująca.&lt;/p&gt;

&lt;p&gt;Dobieramy ludzi w dosyć pedantyczny sposób: bezgraniczne zaufanie.&lt;/p&gt;

&lt;p&gt;Kandydaci wklejają certyfikaty, ale nie potrafią podstaw.&lt;/p&gt;

&lt;h5 id=&quot;test&quot;&gt;TEST&lt;/h5&gt;

&lt;p&gt;Telefon w dziwnej porze, aby zobaczyć jak sobie radzi w nie komfortowych warunkach. Cel: umieć odpowiedzieć na pytanie: “na ile ten gościu jest komunikatywny w rozmowie ze mną?”&lt;/p&gt;

&lt;p&gt;Najbardziej okrutne pytanie na rozmowie o pracę: &lt;strong&gt;jakie są Twoje najmocniejsze strony?&lt;/strong&gt;&lt;/p&gt;

&lt;h4 id=&quot;najważniejsze-3-rzeczy&quot;&gt;Najważniejsze 3 rzeczy…&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;umiejętności (merytoryka) - weryfikacja poprzez kwestionariusz, a następnie trzeba wypełnić test online, który weryfikuje wypełniony wcześniej kwestionariusz&lt;/li&gt;
  &lt;li&gt;komunikacja - potrzebujemy gości, którzy umieją mówić różne rzeczy, przeforsują swoje rzeczy&lt;/li&gt;
  &lt;li&gt;odporny na stres - ta umiejętność jest krytyczna, administratorzy pracują w trudnych warunkach, bo klient dzwoni zdenerwowany&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;test-kandydata-pod-kątem-reakcji-na-stressful-situation&quot;&gt;Test kandydata pod kątem reakcji na “stressful situation”&lt;/h4&gt;

&lt;p&gt;Rozmowa rekrutacyjna. Podczas rozmowy z kandydatem, otwierają się delikatnie drzwi i cichym głosem osoba z zza drzwi mówi że nie zrobiła czegoś przed deadline.&lt;/p&gt;

&lt;p&gt;Ty jako szef odpowiadasz w sposób stanowczy i wulgarny.&lt;/p&gt;

&lt;p&gt;Cel jest pogląd jak kandydat radzi sobie na sytuację stresogenną.&lt;/p&gt;

&lt;h4 id=&quot;całe-życia-z-wariatami&quot;&gt;“Całe życia z wariatami”&lt;/h4&gt;

&lt;p&gt;Najlepiej jak wszyscy admini się rozumieją. Admin nie rozumie, że są jakieś deadline w projekcie. Programista - to gość którzy pisze kod - i to jest fajne. Admin - to jest osoba która np. naprawi drukarkę, ogólnie taka co wszystko zrobi. &lt;strong&gt;Super admin to taki który nie ma nic do roboty&lt;/strong&gt;, bo robi swoją robotę i jest fenomenalny.&lt;/p&gt;

&lt;h4 id=&quot;budowanie-relacji-z-użytkownikiem&quot;&gt;Budowanie relacji z użytkownikiem&lt;/h4&gt;

&lt;p&gt;Jak użytkownik jest miły i ma dobrą relacji z adminem to lepiej się dogadać co nie działa.&lt;/p&gt;

&lt;h4 id=&quot;wymagania-życiowe&quot;&gt;Wymagania życiowe&lt;/h4&gt;

&lt;p&gt;Relacja zbudowana na opanowaniu i szacunku. Bardzo łatwo jest pozwolić adminowi, aby zadłużył firmę i zakupił mnóstwo zabawek. Admin nie ma czasu wydawać pensji. Admin potrzebuje gadgetów. Jeśli administratorzy chcą mieć ileś rzeczy, aby lepiej im się pracowało to warto zastanowić się nad listą zakupów. Adminom bardziej przeszkadzają rzeczy których nie ułatwiają pracy, a nie, że pensja jest za mała. &lt;strong&gt;Adminom trzeba rotować zadania.&lt;/strong&gt; Kupić mu dodatkowy serwer, aby mógł testować nowe rozwiązania.&lt;/p&gt;

&lt;p&gt;Awans i wynagrodzenie: nie ma sensownej ścieżki.&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;Adminem → Architekt → Manager innego smaku&lt;/code&gt;. Cały czas trzeba się troszczyć o admina, bo to, co on robi jest bardzo ważne dla firmy.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Łatwiej jest zrekrutować programistę niż wymienić administratora. &lt;small&gt;Maciej Broniarz&lt;/small&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4 id=&quot;solo-czy-zespołowo&quot;&gt;Solo czy zespołowo?&lt;/h4&gt;

&lt;p&gt;Lepiej jest mieć 2+ adminów. Dużo komfortowa sytuacja, kiedy możemy się stymulować naukowo.&lt;/p&gt;

&lt;h4 id=&quot;team-building-czyli-narty-w-aspen&quot;&gt;Team building, czyli narty w Aspen&lt;/h4&gt;

&lt;p&gt;Integracja zespołu jest krytyczna. Testy integracyjne - ciekawe rozwiązanie.&lt;/p&gt;

&lt;p&gt;Generujemy symulowanego fail-a w trudnej porze np. 6:15. Jeśli są w stanie coś takiego rozwiązać to są stanie dobrze współpracować. Nie można robić takich testów, jeśli nie ma się kompetencji 😄&lt;/p&gt;

&lt;h4 id=&quot;imprezy-firmowe&quot;&gt;Imprezy firmowe&lt;/h4&gt;

&lt;p&gt;Fajnie pracuje się z ludźmi z którymi lubi się przebywać!&lt;/p&gt;

&lt;h4 id=&quot;jak-zwalniać-administratora&quot;&gt;Jak zwalniać administratora&lt;/h4&gt;

&lt;p&gt;Żadna polityka nie jest w stanie zabezpieczyć danych. Oto lista kilku kroków:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Odcinamy dostęp administratorowi.&lt;/li&gt;
  &lt;li&gt;Zasada ograniczonego dostępu.&lt;/li&gt;
  &lt;li&gt;Pilnować do czego taka osoba ma dostęp.&lt;/li&gt;
  &lt;li&gt;Najlepiej rozstawać się na miękko.&lt;/li&gt;
  &lt;li&gt;Gdy drastycznie, to podziękować słowami “już nie pracuj” i wyprosić z biura.&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
  &lt;p&gt;Admina bierze się na lata. &lt;small&gt;Maciej Broniarz&lt;/small&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4 id=&quot;idealna-praca-admina&quot;&gt;Idealna praca admina&lt;/h4&gt;

&lt;p&gt;Jasne określone warunki na system. Niech przygotuje budżet i hardware.&lt;/p&gt;

&lt;p&gt;Jeśli administrator czuje, że nikt się nie wtrąca w prace to jest to praca marzeń.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Najgorsze jak developer zarządza administratorami.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;Słabe jest też kiedy administrator zarządza developerami. &lt;small&gt;Maciej Broniarz&lt;/small&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Firma zarządzana przez adminów nie będzie przynosiła zamierzonych efektów.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Admina ma wiele sytuacji, kiedy musi poprawić coś zamiast developera, bo tak było prościej.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Jak robimy się starsi to nie zawsze jesteśmy mądrzejsi.&lt;/p&gt;

&lt;p&gt;Jak znaleźć admina to &lt;strong&gt;tylko po znajomościach&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Jest sporo ludzi z kompetencjami, ale przejada się im praca w korporacji.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Prościej jest nauczyć kogoś z politechniki miękkich umiejętności,&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
  &lt;p&gt;niż mistrza miękkimi kompetencji nauczyć bycia administratorem. &lt;small&gt;Maciej Broniarz&lt;/small&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Admini chodzą do firmy, gdzie robi się fajne rzeczy, a nie tam gdzie jest kasa.&lt;/p&gt;

&lt;p&gt;Ciężko jest znaleźć dobrego admina. Jako pracodawca warto pokazać co firma robi ciekawego w pracy. Wszystkie wydarzenia np. spotkania to jest fajny kanał komunikacyjny na rekrutacje admina.&lt;/p&gt;

&lt;h2 id=&quot;podsumowanie&quot;&gt;Podsumowanie&lt;/h2&gt;

&lt;p&gt;Jestem bardzo pozytywnie zaskoczony jak interesujące może być spotkanie z ludźmi którzy na co dzień, mają podobne obowiązki co ja. Świetnie, że powstał taki event, gdzie będzie można podzielić się swoją wiedzą na ten temat, oraz wysłuchać co inni mają do powiedzenia w kwestii zarządzania ludźmi oraz firmą.&lt;/p&gt;

&lt;p&gt;W imieniu organizatorów &lt;strong&gt;IT Manager Meetup&lt;/strong&gt; zapraszam serdecznie na kolejne spotkanie na którym to ja będę chciał opowiedzieć z jakimi problemami zetknąłem się na początku swojej kariery managerskiej.&lt;/p&gt;
</description>
            <pubDate>Mon, 29 Jun 2015 00:00:00 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2015/06/29/it-manager-meetup-1.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2015/06/29/it-manager-meetup-1.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/it-manager-meetup/it-manager-meetup.jpg</image>
        </item>
        
        <item>
            <title>Jak założyć bloga korzystając z Jekyll?</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Plan jest prosty. Mamy pomysł na aplikację, która będzie w formie bloga.
Będzie można zakładać kolejne posty oraz dawać komentarze po nimi.
Warto jeszcze wspierać tagi, aby filtrować listę postów.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/jekyll/jekyll.jpg&quot; itemprop=&quot;image&quot; alt=&quot;Baner promujący artykuł&quot; /&gt;
&lt;/figure&gt;

&lt;p&gt;Moje zadanie będzie dotyczyło platformy &lt;del&gt;&lt;a href=&quot;http://www.ecmascript6.pl&quot;&gt;www.ecmascript6.pl&lt;/a&gt;&lt;/del&gt;.
Chciałbym, aby na niej znalazły się informacje nt. najnowszego standardu &lt;code class=&quot;highlighter-rouge&quot;&gt;ECMAScript 6&lt;/code&gt;.
Ze względu na końcówkę w domenie, chciałbym, aby artykuły były w niej po polsku.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Mam też plan, aby zrobić oddzielną sekcję na angielskojęzyczne artykuły.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id=&quot;wybór-narzędzia&quot;&gt;Wybór narzędzia&lt;/h2&gt;

&lt;p&gt;Zaczynamy od wyboru systemu na którym będziemy się opierali. Ze względu na łatwość zarządzania wybór padł
na &lt;a href=&quot;http://jekyllrb.com/&quot;&gt;Jekylla&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Jekyll to biblioteka (gem) w środowisku Ruby.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Za chwilę dowiecie się jak zainstalować interpreter języka Ruby. Stay Tuned!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id=&quot;stworzenie-katalogu&quot;&gt;Stworzenie katalogu&lt;/h2&gt;

&lt;p&gt;Zaczynamy tworząc katalog pod nasz projekt:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;mkdir &lt;/span&gt;NAZWA_PROJEKTU
&lt;span class=&quot;nb&quot;&gt;cd &lt;/span&gt;NAZWA_PROJEKTU
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;instalacja-narzędzia---rvm&quot;&gt;Instalacja narzędzia - &lt;code class=&quot;highlighter-rouge&quot;&gt;rvm&lt;/code&gt;&lt;/h2&gt;

&lt;p&gt;Zainstalujemy &lt;a href=&quot;https://rvm.io/&quot;&gt;rvm&lt;/a&gt;, tak aby nie zaśmiecać systemowej konfiguracji.
Zainstalować go można na wiele różnych sposobów. Dużo sposób na instalację jest na stronie domowej.
Moim zdaniem najprostszy to:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;se&quot;&gt;\c&lt;/span&gt;url &lt;span class=&quot;nt&quot;&gt;-sSL&lt;/span&gt; https://get.rvm.io | bash &lt;span class=&quot;nt&quot;&gt;-s&lt;/span&gt; stable
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;instalacja-interpretera-języka---ruby&quot;&gt;Instalacja interpretera języka - &lt;code class=&quot;highlighter-rouge&quot;&gt;ruby&lt;/code&gt;&lt;/h2&gt;

&lt;p&gt;Gdy mamy już manager wersji języka, zainstalujemy wreszcie jakąś jego wersję!
Wybrałem najnowszą z “2” na początku.&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;rvm &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;2.7.8
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Możemy właśnie zainstalowaną wersję ustawić jako domyślną za pomocą:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;rvm &lt;span class=&quot;nb&quot;&gt;alias &lt;/span&gt;create default 2.7.8
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;A następnie przełączmy się na tą wersję:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;rvm use 2.7.8
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;stworzenie-środowiska-dla-zależności---gemset&quot;&gt;Stworzenie środowiska dla zależności - &lt;code class=&quot;highlighter-rouge&quot;&gt;gemset&lt;/code&gt;&lt;/h2&gt;

&lt;p&gt;Następnie stworzymy tzw. &lt;code class=&quot;highlighter-rouge&quot;&gt;gemset&lt;/code&gt;, czyli katalog na potrzeby instalacji Jekylla
oraz jego zależności.&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;rvm gemset create NAZWA_PROJEKTU
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Po wydaniu polecenia &lt;code class=&quot;highlighter-rouge&quot;&gt;rvm list gemsets&lt;/code&gt; widzimy, że jeszcze musimy się przełączyć
na ten nowo stworzony &lt;code class=&quot;highlighter-rouge&quot;&gt;gemset&lt;/code&gt;. Wydajemy polecenie:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;rvm use 2.7.8@NAZWA_PROJEKTU
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Jesteśmy już w nowym środowisku!&lt;/strong&gt; 🎉&lt;/p&gt;

&lt;h2 id=&quot;instalacja-jekylla&quot;&gt;Instalacja Jekylla&lt;/h2&gt;

&lt;p&gt;Aby zainstalować Jekylla postępujemy zgodnie z rozpiską na stronie: &lt;a href=&quot;http://jekyllrb.com/&quot;&gt;http://jekyllrb.com/&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Wykonujemy poniższe polecenie, które zainstaluje nam gem (paczkę, program),
dzięki której będziemy mogli stworzyć strukturą plików i katalogów dla naszego projektu.&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;gem &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;jekyll
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Gdy mamy już zainstalowane narzędzie, wykorzystajmy je!&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;jekyll new &lt;span class=&quot;nb&quot;&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Tym samym w katalogu projektu stworzy się struktura:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;.&lt;/span&gt;
├── _config.yml
├── _includes
│   ├── footer-tag.html
│   ├── head-tag.html
│   └── header.html
├── _layouts
│   ├── default.html
│   ├── page.html
│   └── post.html
├── _posts
│   └── 2015-06-28-welcome-to-jekyll.markdown
├── _sass
│   ├── _base.scss
│   ├── _layout.scss
│   └── _syntax-highlighting.scss
├── about.md
├── css
│   └── main.scss
├── feed.xml
└── index.html

5 directories, 15 files
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;blockquote&gt;
  &lt;p&gt;Dobrym pomysłem, jest teraz stworzenie repozytorium w tym katalogu.
Wykonujemy po kolei:&lt;/p&gt;
  &lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;git init
git add &lt;span class=&quot;nb&quot;&gt;.&lt;/span&gt;
git commit &lt;span class=&quot;nt&quot;&gt;-am&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;Initialize project&quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;  &lt;/div&gt;
&lt;/blockquote&gt;

&lt;h2 id=&quot;uruchomienie&quot;&gt;Uruchomienie&lt;/h2&gt;

&lt;p&gt;Gdy już mamy strukturę projektu możemy już uruchomić nasz projekt w przeglądarce.
Wystarczy uruchomić:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;jekyll serve
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;W terminalu dostaniemy informację na jaki adres trzeba wejść,
aby wyświetlić stronę. W moim przypadku jest to &lt;a href=&quot;http://127.0.0.1:4000/&quot;&gt;http://127.0.0.1:4000/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Strona wygląda następująco:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/posts/jekyll/jekyll-default-page.png&quot; alt=&quot;Jekyll: Default page&quot; /&gt;&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;Zwróć uwagę na port który trzeba dopisać do adresu IP maszyny.&lt;br /&gt;
Można go (port) łatwo zmienić: &lt;code class=&quot;highlighter-rouge&quot;&gt;jekyll serve --port 4001&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id=&quot;konfiguracja&quot;&gt;Konfiguracja&lt;/h2&gt;

&lt;h4 id=&quot;plik-_configyml&quot;&gt;Plik: &lt;code class=&quot;highlighter-rouge&quot;&gt;_config.yml&lt;/code&gt;&lt;/h4&gt;

&lt;p&gt;Gdy już mamy uruchomioną aplikację czas na dostosowanie jej pod nasze potrzeby.
Warto zacząć od głównego pliku konfiguracyjnego &lt;code class=&quot;highlighter-rouge&quot;&gt;_config.yml&lt;/code&gt; znajdujący się w głównym katalog projektu.
Zawiera on takie pola jak: tytuł strony, opis, kontakt do autora no i URL.&lt;/p&gt;

&lt;h4 id=&quot;katalog-_includes&quot;&gt;Katalog: &lt;code class=&quot;highlighter-rouge&quot;&gt;_includes/&lt;/code&gt;&lt;/h4&gt;

&lt;p&gt;Następnie warto przyjrzeć się katalogowi &lt;code class=&quot;highlighter-rouge&quot;&gt;_includes&lt;/code&gt;, w którym jest lista
partiali (plików, które zostaną użyte w innym miejscu).&lt;/p&gt;

&lt;p&gt;Plik &lt;code class=&quot;highlighter-rouge&quot;&gt;head-tag.html&lt;/code&gt; zawiera definicję całego znacznika &lt;code class=&quot;highlighter-rouge&quot;&gt;&amp;lt;head&amp;gt;&lt;/code&gt;.
Polecam dodać w nim wygenerowany snippet kodu z Google Analytics.
Dodatkowo może jakieś pliku CSS.&lt;/p&gt;

&lt;h4 id=&quot;katalog-_posts&quot;&gt;Katalog: &lt;code class=&quot;highlighter-rouge&quot;&gt;_posts/&lt;/code&gt;&lt;/h4&gt;

&lt;p&gt;Kolejny katalog warty uwagi (chyba najważniejszy) to katalog &lt;code class=&quot;highlighter-rouge&quot;&gt;_posts&lt;/code&gt;,
w który znajduje się lista plików z naszymi postami.&lt;/p&gt;

&lt;p&gt;Jekyll przyjmuje konwencję, że &lt;strong&gt;jeden plik = jeden post&lt;/strong&gt;.
To w nim umieszczamy pliku wg schematu &lt;code class=&quot;highlighter-rouge&quot;&gt;YYYY-MM-DD-name-of-post.ext&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Mamy kilka typów rozszerzeń do wyboru, m.in. markdown, md, html.
W każdym plik post istnieje specjalna sekcja na początku tego pliku, w której
to definiujemy taki informacje jak:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;layout, w jakim dany post ma być wyświetlony,&lt;/li&gt;
  &lt;li&gt;tytuł posta,&lt;/li&gt;
  &lt;li&gt;oraz ewentualne tagi.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;W późniejszym etapie powiem o tagach. Ze swojej strony polecam zwykły html,
ze względu na nieograniczone możliwości edycyjny. Pierwotnie używałem Markdown-a,
ale przy bardziej skomplikowanych elementach nie radził on sobie najlepiej.&lt;/p&gt;

&lt;h4 id=&quot;katalogpages&quot;&gt;Katalog:&lt;code class=&quot;highlighter-rouge&quot;&gt;pages/&lt;/code&gt;&lt;/h4&gt;

&lt;p&gt;Ostatnią rzeczą na która warto zwrócić uwagę są zwykłe strony. W katalogu głównym
istnieje plik &lt;code class=&quot;highlighter-rouge&quot;&gt;about.md&lt;/code&gt;. W zawartości takiego pliku (podobnie jak w postach)
poza layoutem i tytułem jest jeszcze parametr: permalink. Oznacza on URL pod jakim
strona ma byc dostępna. I tak proponuję stworzyć katalog &lt;code class=&quot;highlighter-rouge&quot;&gt;pages&lt;/code&gt;, który będzie
przechowywał strony. Jekyll sam znajdzie pliki w takim katalogu.&lt;/p&gt;

&lt;p&gt;Ważne jest, aby nazwa nie zaczynała się od znaku podkreślenia, gdyś katalogi
z prefiksem “_” są traktowane przez Jekylla specjalnie.&lt;/p&gt;

&lt;h4 id=&quot;plik-gemfile&quot;&gt;Plik: &lt;code class=&quot;highlighter-rouge&quot;&gt;Gemfile&lt;/code&gt;&lt;/h4&gt;

&lt;p&gt;Ostatnim krokiem będzie stworzenie pliku &lt;code class=&quot;highlighter-rouge&quot;&gt;Gemfile&lt;/code&gt; w katalogu głównym,
aby ustawić odpowiednie środowisko (&lt;code class=&quot;highlighter-rouge&quot;&gt;gemset&lt;/code&gt;) wraz z zawartością:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;source&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'https://rubygems.org'&lt;/span&gt;

ruby &lt;span class=&quot;s1&quot;&gt;'2.7.8'&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;#ruby-gemset=NAZWA_PROJEKTU&lt;/span&gt;

gem &lt;span class=&quot;s1&quot;&gt;'jekyll'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;ponowna-instalacja&quot;&gt;Ponowna instalacja&lt;/h2&gt;

&lt;p&gt;Kiedy będziemy instalowali ponownie aplikację, to wystarczy wtedy tylko:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# stworzyć `gemset`&lt;/span&gt;
rvm gemset create NAZWA_PROJEKTU

&lt;span class=&quot;c&quot;&gt;# zainstalować gem `bundler`&lt;/span&gt;
gem &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;bundler

&lt;span class=&quot;c&quot;&gt;# zainstalować zależności&lt;/span&gt;
bundle &lt;span class=&quot;nb&quot;&gt;install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;… i mamy Jekylla!&lt;/strong&gt; 🎉&lt;/p&gt;

&lt;h2 id=&quot;podsumowanie&quot;&gt;Podsumowanie&lt;/h2&gt;

&lt;p&gt;Przejście opisanego tutoriala nie zajmuje wiele czasu. Po jego zakończeniu osiągamy
spory efekt - w pełni praktyczną aplikację z podstronami oraz postami.&lt;/p&gt;

&lt;p&gt;W dzisiejszych czasach postawienie bloga to nie jest jakiś &lt;em&gt;rocket science&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Jeśli masz doświadczenie z językami programowania to na pewno chciałbyś mieć nieograniczony wpływ
na Twoją aplikację webową, tym samym stworzenie takie aplikacji dzięki Jekyllowi jest efektywne, szybkie i łatwe!&lt;/p&gt;
</description>
            <pubDate>Sun, 28 Jun 2015 00:00:00 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2015/06/28/jak-zalozyc-bloga-korzystajac-z-jekyll.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2015/06/28/jak-zalozyc-bloga-korzystajac-z-jekyll.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/jekyll/jekyll.jpg</image>
        </item>
        
        <item>
            <title>Szkolenie: AngularJS Podstawy [Relacja Live]</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Szkolenie poprowadził &lt;a href=&quot;https://twitter.com/sulco&quot;&gt;Tomasz Sułkowski&lt;/a&gt; - developer pracujący w Hexagram. Od 16 miesięcy związany z firmą konsultingową Sages.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/angularjs/logo-angularjs.svg&quot; /&gt;

    &lt;figcaption&gt;
        Oficjalne logo frameworka AngularJS.
    &lt;/figcaption&gt;

&lt;/figure&gt;

&lt;p&gt;Miejsce szkolenia to siedziba firmy Sages na ul. Nowogrodzka 62c. Więcej o firmie: &lt;a href=&quot;http://www.sages.com.pl/&quot;&gt;sages.com.pl/&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Slajdy dostępne pod adresem: &lt;a href=&quot;http://www.slideshare.net/sagespl/podstawy-angularjs&quot;&gt;slideshare.net/sagespl/podstawy-angularjs&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;0905---agenda&quot;&gt;&lt;strong&gt;09:05&lt;/strong&gt; - Agenda&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;wprowadzenie / kontekst / narzędzia&lt;/li&gt;
  &lt;li&gt;teoria / demo&lt;/li&gt;
  &lt;li&gt;warsztat&lt;/li&gt;
  &lt;li&gt;teoria / demo&lt;/li&gt;
  &lt;li&gt;warsztat&lt;/li&gt;
  &lt;li&gt;…&lt;/li&gt;
  &lt;li&gt;Q &amp;amp; A&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Korzystamy ze Slacka - IMO komunikator obecnych czasów.&lt;/p&gt;

&lt;p&gt;Na początku trochę pytań odnośnie doświadczeń.&lt;/p&gt;

&lt;h2 id=&quot;cel-budujemy-aplikację-typu-spa&quot;&gt;Cel: Budujemy aplikację typu SPA&lt;/h2&gt;

&lt;p&gt;SPA - Single Page Application&lt;/p&gt;

&lt;p&gt;Nawigacja w aplikacji typu SPA polega na żonglowaniu hashem w URLu.&lt;/p&gt;

&lt;h2 id=&quot;narzędzia&quot;&gt;Narzędzia&lt;/h2&gt;

&lt;p&gt;Tomek polecał narzędzia:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;WebStorm (IDE)&lt;/li&gt;
  &lt;li&gt;Sublime Text 3&lt;/li&gt;
  &lt;li&gt;Atom 1.0&lt;/li&gt;
  &lt;li&gt;Brackets&lt;/li&gt;
  &lt;li&gt;… &lt;em&gt;Vim&lt;/em&gt;?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ze swojego doświadczenia stwierdził, że po kilku miesiącach korzystania z Submlime Text 3, postanowił przerzucić się na WebStorm, ze względu na lepsze podpowiadanie oraz na poprawianie literówek, które każdy z nas, siłą rzeczy, popełnia.&lt;/p&gt;

&lt;h2 id=&quot;npm&quot;&gt;npm&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;system zarządzania zależnościami dla “server-side js”&lt;/li&gt;
  &lt;li&gt;zależności opisywane w pliku &lt;code class=&quot;highlighter-rouge&quot;&gt;package.json&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;npm install&lt;/code&gt; - instaluje pakiety, których jeszcze nie ma w projekcie&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;npm update&lt;/code&gt; - sprawdza, czy istnieją nowsze wersje pakietów + instaluje&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;npm install nazwa-pakietu --save-dev&lt;/code&gt; - instaluje pakiet, dodaje go do &lt;code class=&quot;highlighter-rouge&quot;&gt;package.json&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Aby nie trzymać zależności w projekcie. Dla nowego środowiska wystarczy zainstalować jednym poleceniem biblioteki.&lt;/p&gt;

&lt;p&gt;Dodatkowo, możemy określi konkretną wersję którą chcemy zainstalować.&lt;/p&gt;

&lt;p&gt;Domyślnie, trzeba by było szukać biblioteki w sieci i ściągać plik na dysk - teraz wystarczy jedno polecenie.&lt;/p&gt;

&lt;h2 id=&quot;bower&quot;&gt;Bower&lt;/h2&gt;

&lt;p&gt;Instalacja poleceniem &lt;code class=&quot;highlighter-rouge&quot;&gt;npm install -g bower&lt;/code&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;zarządzanie zależnościami dla “client-side js”&lt;/li&gt;
  &lt;li&gt;zależności opisywane w &lt;code class=&quot;highlighter-rouge&quot;&gt;bower.json&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;bower install&lt;/code&gt; - instaluje pakiety, których jeszcze nie ma w projekcie&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;bower update&lt;/code&gt; - sprawdza, czy istnieją nowsze wersje pakietów + instaluje&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;bower install nazwa-pakietu --save&lt;/code&gt; - instaluje pakiet, dodaje go do &lt;code class=&quot;highlighter-rouge&quot;&gt;bower.json&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;pakiety instalowane są do katalogu &lt;code class=&quot;highlighter-rouge&quot;&gt;/bower_components/nazwa-pakietu/...&lt;/code&gt; - stamtąd należy je linkować w plikach html&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;0930---ćwiczenie-1&quot;&gt;&lt;strong&gt;09:30&lt;/strong&gt; - Ćwiczenie 1&lt;/h2&gt;

&lt;p&gt;Stworzenie nowego projektu w WebStorm.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;kbd&gt;ctrl+shift+a&lt;/kbd&gt; - wyszukiwarka wszystkich opcji edytora WebStorm&lt;/li&gt;
  &lt;li&gt;&lt;kbd&gt;ctrl+shift+o&lt;/kbd&gt; - szukanie plików w projekcie&lt;/li&gt;
  &lt;li&gt;&lt;kbd&gt;ctrl+e&lt;/kbd&gt; - lista ostatnio otwartych plików&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Złota myśl&lt;/strong&gt; Nauka skrótów jest bardzo pomocna. Umiejętność sprawnego poruszania się w skrótach, pomaga zdecydowanie zmniejszyć czas potrzebny na wykonywanie bieżącej pracy.&lt;/p&gt;

&lt;h2 id=&quot;omawianie-struktury-wygenerowanego-seed-a&quot;&gt;Omawianie struktury wygenerowanego seed-a&lt;/h2&gt;

&lt;p&gt;Kiedy stworzyliśmy nowy projekt typu AngularJS WebStorm stworzył prostą strukturę katalogów wraz z wieloma plikami.&lt;/p&gt;

&lt;p&gt;W kolejnym kroku czyścimy boilerplate usuwając e2e-test, index_async.html oraz 2 pliki CSS z html5-boilerplate.&lt;/p&gt;

&lt;p&gt;Po wydaniu magicznego polecenia &lt;code class=&quot;highlighter-rouge&quot;&gt;npm install&lt;/code&gt; mamy do projektu ściągnięte wszystkie zależności. W pliku &lt;code class=&quot;highlighter-rouge&quot;&gt;package.json&lt;/code&gt; w &lt;code class=&quot;highlighter-rouge&quot;&gt;script/postinstall&lt;/code&gt; uruchomimy również &lt;code class=&quot;highlighter-rouge&quot;&gt;bower install&lt;/code&gt;, więc i biblioteki &lt;em&gt;client-side&lt;/em&gt; będą zainstalowane w katalogu &lt;code class=&quot;highlighter-rouge&quot;&gt;app/bower_components&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Gdybyśmy nie mieli żadnego serwera serwującego statyki, w zależnościach mamy wpisany &lt;code class=&quot;highlighter-rouge&quot;&gt;http-server&lt;/code&gt;. Jest to prosty serwer napisany w &lt;code class=&quot;highlighter-rouge&quot;&gt;Node.js&lt;/code&gt;.&lt;/p&gt;

&lt;h2 id=&quot;1000---instalujemy-bootstrap&quot;&gt;&lt;strong&gt;10:00&lt;/strong&gt; - Instalujemy Bootstrap&lt;/h2&gt;

&lt;p&gt;Dzięki poleceniu &lt;code class=&quot;highlighter-rouge&quot;&gt;bower install --save bootstrap&lt;/code&gt; instalujemy Bootstrap-a. W zależności Bootstrap jest biblioteka jQuery.&lt;/p&gt;

&lt;p&gt;W katalogu &lt;code class=&quot;highlighter-rouge&quot;&gt;app/bower_components&lt;/code&gt; znajduje się ściągnięty pełny projekt Bootstrap oraz jQuery.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;strong&gt;TIP&lt;/strong&gt;: &lt;strong&gt;Bower&lt;/strong&gt; zawsze cache-uje sobie biblioteki, aby przy ponownym pobraniu szybko ściągnął kolejny raz zależności.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id=&quot;1004---korzystamy-z-bootstrap-a&quot;&gt;&lt;strong&gt;10:04&lt;/strong&gt; - Korzystamy z Bootstrap-a&lt;/h2&gt;

&lt;p&gt;Dołączamy Bootstrap-a do index.html dorzucając przed plikiem &lt;code class=&quot;highlighter-rouge&quot;&gt;app.css&lt;/code&gt; następującą linijkę kodu:&lt;/p&gt;

&lt;div class=&quot;language-html highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;link&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;rel=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;stylesheet&quot;&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;href=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;bower_components/bootstrap/dist/css/bootstrap.css&quot;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Usuwanie zbędne paczki: &lt;code class=&quot;highlighter-rouge&quot;&gt;bower uninstall angular-mocks&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Dodatkowo usuńmy zbędne komponenty &lt;code class=&quot;highlighter-rouge&quot;&gt;app/components&lt;/code&gt;.&lt;/p&gt;

&lt;h2 id=&quot;1011---prezentacja-docelowej-aplikacji&quot;&gt;&lt;strong&gt;10:11&lt;/strong&gt; - Prezentacja docelowej aplikacji&lt;/h2&gt;

&lt;p&gt;Tomek przedstawia aplikację, do którą chcemy dziś napisać. Portal bardzo podobny do &lt;a href=&quot;http://ipla.tv&quot;&gt;ipla.tv&lt;/a&gt; lub może bardziej do &lt;a href=&quot;http://filmweb.pl&quot;&gt;filmweb.pl&lt;/a&gt;. Przeglądanie listy seriali i wchodzimy w szczegóły danego serialu i możemy przeczytać opis. Możemy wyszukiwać dany serial po nazwie, oraz dodać dowolny serial do listy ulubionych.&lt;/p&gt;

&lt;h2 id=&quot;1015---angularjs&quot;&gt;&lt;strong&gt;10:15&lt;/strong&gt; - AngularJS&lt;/h2&gt;

&lt;p&gt;Posłuchamy teraz trochę więcej na temat samej biblioteki &lt;code class=&quot;highlighter-rouge&quot;&gt;AngularJS&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Najbardziej zewnętrzną rzeczą w aplikacji jest moduł. Każdy moduł może posiadać specyficzną konfigurację. Na szkoleniu będziemy korzystali z jednej specyficznej usługi - routing (&lt;code class=&quot;highlighter-rouge&quot;&gt;ui.router&lt;/code&gt;).&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;strong&gt;TIP&lt;/strong&gt;: Podejście &lt;strong&gt;Fat model&lt;/strong&gt; ma do siebie, że kontrolery powinny być “cienkie”, czyli nie zawierały dużo kodu, ale za to modele powinny przechowywać jak najwięcej się da 😄&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div&gt;
    &lt;h2&gt;Moduły, struktura aplikacji&lt;/h2&gt;

    &lt;em&gt;Form Follows Function&lt;/em&gt;

    &lt;ul&gt;
        &lt;li&gt;Moduły wskazuję na zależności od zewnętrznych bibliotek&lt;/li&gt;
        &lt;li&gt;Modułu nie separują zawieranych komponentów (brak namespaces)&lt;/li&gt;
        &lt;li&gt;Poszczególne fragmenty aplikacji jako moduły, o hierarchii odzwierciedlonej w strukturze katalogów&lt;/li&gt;
    &lt;/ul&gt;

    &lt;blockquote&gt;
        &lt;strong&gt;TIP&lt;/strong&gt;: Gdy stworzymy usługę o tej samej nazwie,
        to zostanie nadpisana poprzednia usługa w innym module o tej samej nazwie.
    &lt;/blockquote&gt;

&lt;/div&gt;

&lt;div&gt;
    &lt;h2&gt;Routing&lt;/h2&gt;

    &lt;p&gt;
        &lt;code&gt;ngRoute&lt;/code&gt; do jakiegoś czasu był obecny w AngularJS. Jest dosyć prosty.&lt;br /&gt;
        Lepszym rozwiązaniem jest &lt;code&gt;ui.router&lt;/code&gt;.
    &lt;/p&gt;

    &lt;p&gt;
        W &lt;code&gt;ui.router&lt;/code&gt; mamy kaskady widoków - każdy widok (kawałek HTMLa) może posiadać dostęp
        do innego kawałka kodu HTML, bez przeładowania całego globalnego widoku.
    &lt;/p&gt;

    &lt;p&gt;
        &lt;code&gt;ngRoute&lt;/code&gt; niestety przeładowuje całą stronę, dzięki czemu korzystanie z aplikacji jest bardzo podobne
        do typowego przeglądania stron internetowych (mam tu na myśli efekt przeładowania się całej strony).
    &lt;/p&gt;

&lt;/div&gt;

&lt;h2 id=&quot;1033---ćwiczenie-2&quot;&gt;&lt;strong&gt;10:33&lt;/strong&gt; - Ćwiczenie 2&lt;/h2&gt;

&lt;p&gt;Podmiana &lt;code class=&quot;highlighter-rouge&quot;&gt;ngRoute&lt;/code&gt; na &lt;code class=&quot;highlighter-rouge&quot;&gt;ui.router&lt;/code&gt; (&lt;a href=&quot;https://github.com/angular-ui/ui-router&quot;&gt;github.com/angular-ui/ui-router&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;Instalujemy &lt;code class=&quot;highlighter-rouge&quot;&gt;ui.router&lt;/code&gt; poprzez wykonywanie polecenia:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;bower &lt;span class=&quot;nb&quot;&gt;install &lt;/span&gt;angular-ui-router &lt;span class=&quot;nt&quot;&gt;--save&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;oraz usuwamy starą paczkę&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;bower uninstall angular-route &lt;span class=&quot;nt&quot;&gt;--save&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;1104---ścieżki-w-aplikacji-uirouter&quot;&gt;&lt;strong&gt;11:04&lt;/strong&gt; - Ścieżki w aplikacji (ui.router)&lt;/h2&gt;

&lt;p&gt;Dodajemy katalogi: &lt;code class=&quot;highlighter-rouge&quot;&gt;app/library&lt;/code&gt;, &lt;code class=&quot;highlighter-rouge&quot;&gt;app/profile&lt;/code&gt;, &lt;code class=&quot;highlighter-rouge&quot;&gt;app/search&lt;/code&gt;.&lt;/p&gt;

&lt;h2 id=&quot;1112---dependency-injection&quot;&gt;&lt;strong&gt;11:12&lt;/strong&gt; - Dependency Injection&lt;/h2&gt;

&lt;p&gt;AngularJS zanalizuje kontrolery, wyciąga nazwy parametrów na podstawie łańcucha znaków, który dostajemy kiedy uruchomimy &lt;code class=&quot;highlighter-rouge&quot;&gt;toString&lt;/code&gt; na funkcji.&lt;/p&gt;

&lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;MainController&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;$scope&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;$http&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;$scope&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;$http&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;nx&quot;&gt;MainController&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;toString&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// =&amp;gt; 'function MainController($scope, $http) { ...'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Na podstawie wyrażenia regularnego AngularJS wyciąga nazwy parametrów, których oczekujemy.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;strong&gt;TIP&lt;/strong&gt;: Gdy dokonamy minifikacji kodu pojawi się problem ze wstrzykiwaniem odpowiednich modułów, ponieważ wszystkie nazwy zmiennych zostaną zmienione na krótkie zaczynając od zwykłych liter. Z pomocą przychodzi &lt;code class=&quot;highlighter-rouge&quot;&gt;ngAnnotate&lt;/code&gt; - &lt;a href=&quot;https://github.com/olov/ng-annotate&quot;&gt;github.com/olov/ng-annotate&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Dodajemy moduł &lt;code class=&quot;highlighter-rouge&quot;&gt;ui.router&lt;/code&gt;.&lt;/p&gt;

&lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nx&quot;&gt;angular&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;module&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'myApp'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'ui.router'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]).&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;config&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;$stateProvider&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;$stateProvider&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;state&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'search'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;url&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'/search'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;templateUrl&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'search/search.html'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;});&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Dodatkowo podmieniamy w &lt;code class=&quot;highlighter-rouge&quot;&gt;index.html&lt;/code&gt;&lt;/p&gt;

&lt;div class=&quot;language-html highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;&amp;lt;!-- Następującą linijkę w pliku index.html: --&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;div&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;ng-view&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;&amp;lt;!-- Zastępujemy na taką: --&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;div&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;ui-view&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Tworzymy strukturę w projekcie - plik &lt;code class=&quot;highlighter-rouge&quot;&gt;app/search/search.html&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Ustawiamy domyślną stronę poprzez &lt;code class=&quot;highlighter-rouge&quot;&gt;$urlRouterProvider&lt;/code&gt;&lt;/p&gt;

&lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nx&quot;&gt;$urlRouterProvider&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;otherwise&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'/search'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;1149---widok&quot;&gt;&lt;strong&gt;11:49&lt;/strong&gt; - Widok&lt;/h2&gt;

&lt;p&gt;Kawałki mniejszego HTMLa, które możemy użyć w innym (większym).&lt;/p&gt;

&lt;h2 id=&quot;1151---controller&quot;&gt;&lt;strong&gt;11:51&lt;/strong&gt; - Controller&lt;/h2&gt;

&lt;p&gt;Zwykła funkcja JavaScript.&lt;/p&gt;

&lt;p&gt;Powiązanie z widokiem odbywa się przez &lt;code class=&quot;highlighter-rouge&quot;&gt;$scope&lt;/code&gt;.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;strong&gt;TIP&lt;/strong&gt;: &lt;code class=&quot;highlighter-rouge&quot;&gt;$scope&lt;/code&gt; jest to usługa, która jest obiektem to, co zdefiniujemy w tym obiekcie, będzie to od razu dostępne dla widoku (dyrektywy).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id=&quot;1154---dyrektywy&quot;&gt;&lt;strong&gt;11:54&lt;/strong&gt; - Dyrektywy&lt;/h2&gt;

&lt;p&gt;… czyli HTML na sterydach! 😄&lt;/p&gt;

&lt;p&gt;Możemy użyć na kilka sposobów:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;element&lt;/li&gt;
  &lt;li&gt;atrybut&lt;/li&gt;
  &lt;li&gt;klasę CSS&lt;/li&gt;
  &lt;li&gt;komentarz&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Wbudowane dyrektywy:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;ng-app&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;ng-init&lt;/code&gt; - służy do wykonywania kodu na początku&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;ng-model&lt;/code&gt; - służy do prowadzenia interakcji między użytkownikiem a modelem&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;ng-show&lt;/code&gt; - gdy wartość będzie truly to kontener się wyświetli (dodaje klasę ng-hide - widoczność poprzez CSS)&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;ng-if&lt;/code&gt; - usuwa albo dodaje dany fragment do DOMa&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;ng-repeat&lt;/code&gt; - służy do iteracji po tablicy&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;ng-list&lt;/code&gt; - podczas prezentacja tablicy jako ciąg znaków, traktuje ten ciąg jako tablicę&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;two-way data-binding&lt;/strong&gt; - wiązanie w obie strony, tj: widok aktualizuje model, który od razu jest zmieniony w kontrolerze, ale i w drugą stronę, gdy kontroler zaktualizuje model, będzie od widoczny (najszybciej jak to możliwe) widoku.&lt;/p&gt;

&lt;p&gt;Więcej na ten temat na stronie &lt;a href=&quot;https://docs.angularjs.org/guide/databinding&quot;&gt;https://docs.angularjs.org/guide/databinding&lt;/a&gt;.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;strong&gt;TIP&lt;/strong&gt;: AngularJS promuje deklaratywny styl pisania aplikacji (przeciwieństwo do imperatywnego).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Logika interfejsu jest w HTMLu!&lt;/p&gt;

&lt;div class=&quot;language-html highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;input&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;type=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;text&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;ng-model=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;flag&quot;&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;

&lt;span class=&quot;c&quot;&gt;&amp;lt;!-- Pierwotnie: flag=undefined (AngularJS nic nie wyświetli)--&amp;gt;&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;&amp;lt;!-- Po kliknięciu: flag=true --&amp;gt;&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;&amp;lt;!-- Po odkliknięciu: flag=false --&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Input jest dyrektywą!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Więcej na temat dyrektyw w dokumentacji: &lt;a href=&quot;https://docs.angularjs.org/guide/directive&quot;&gt;https://docs.angularjs.org/guide/directive&lt;/a&gt;.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;strong&gt;TIP&lt;/strong&gt;: Podczas wykonania &lt;code class=&quot;highlighter-rouge&quot;&gt;ng-repeat&lt;/code&gt; tablica nie może posiadać duplikatów.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Jeśli jednak chcemy operować na duplikatach trzeba utworzyć specjalną konstrukcję:&lt;/p&gt;

&lt;div class=&quot;language-html highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;ul&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;c&quot;&gt;&amp;lt;!-- Rozwiązujemy problem duplikatów --&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;li&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;ng-repeat=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;name in names track by $index&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;{ { name } }&lt;span class=&quot;nt&quot;&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;/ul&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;1218---usługi&quot;&gt;&lt;strong&gt;12:18&lt;/strong&gt; - Usługi&lt;/h2&gt;

&lt;p&gt;Do czego służą usługi?&lt;/p&gt;

&lt;p&gt;Miejsce gdzie trzymamy logikę biznesową. Wykonują się w kilku kontrolerów, więc nie ma sensu tego powtarzać. Usługi również służą do tego, aby współdzielić dane miedzy kontrolerami.&lt;/p&gt;

&lt;p&gt;Definicja usług na 5 sposobów:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;.constant()&lt;/code&gt; - proste wartości, nie można nadpisywać&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;.value()&lt;/code&gt; - proste wartości, można nadpisywać&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;.service()&lt;/code&gt; - większa usługa, która może posiadać wiele metod i właściwości&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;.factory()&lt;/code&gt; - większa usługa, która zwraca jeden obiekt&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;.provider()&lt;/code&gt; - generyczna usługa, bo każda jest de facto providerem&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Więcej na temat usług &lt;a href=&quot;https://docs.angularjs.org/api/ng/service/$http&quot;&gt;https://docs.angularjs.org/api/ng/service/$http&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;1235---ćwiczenie-3&quot;&gt;&lt;strong&gt;12:35&lt;/strong&gt; - Ćwiczenie 3&lt;/h2&gt;

&lt;p&gt;Tworzymy &lt;code class=&quot;highlighter-rouge&quot;&gt;SearchController&lt;/code&gt; w katalogu &lt;code class=&quot;highlighter-rouge&quot;&gt;app/search/&lt;/code&gt;, wykorzystujemy usługę &lt;code class=&quot;highlighter-rouge&quot;&gt;$http&lt;/code&gt; do pobierania listy filmów.&lt;/p&gt;

&lt;h2 id=&quot;1307---przerwa-obiadowa&quot;&gt;&lt;strong&gt;13:07&lt;/strong&gt; - Przerwa obiadowa!&lt;/h2&gt;

&lt;h2 id=&quot;1405---prezentacja-swoich-wyszukiwarek&quot;&gt;&lt;strong&gt;14:05&lt;/strong&gt; - Prezentacja swoich wyszukiwarek&lt;/h2&gt;

&lt;p&gt;Rozwiązujemy problem z obrazkami poprzez &lt;code class=&quot;highlighter-rouge&quot;&gt;ng-src&lt;/code&gt;.&lt;/p&gt;

&lt;h2 id=&quot;1433---tworzymy-service&quot;&gt;&lt;strong&gt;14:33&lt;/strong&gt; - Tworzymy &lt;code class=&quot;highlighter-rouge&quot;&gt;service&lt;/code&gt;&lt;/h2&gt;

&lt;p&gt;Bardzo prosty &lt;code class=&quot;highlighter-rouge&quot;&gt;service&lt;/code&gt; operujący na kolekcji dodanych elementów. Przykładowa implementacja:&lt;/p&gt;

&lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;s1&quot;&gt;'use strict'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;nx&quot;&gt;angular&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;module&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'myApp'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;service&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'library'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;library&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[];&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;add&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;item&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;nx&quot;&gt;library&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;push&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;item&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;};&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;getAll&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;c1&quot;&gt;// kopia, aby nie tracić tej hermetyzacji&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;library&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;slice&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;};&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;has&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;item&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;library&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;indexOf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;item&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;!==&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;};&lt;/span&gt;

    &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;remove&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;item&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;index&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;library&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;indexOf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;item&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

        &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;index&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;!==&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;nx&quot;&gt;library&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;splice&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;index&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;};&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Jako dodatkowe zajęcie dostałem zapisywanie do &lt;code class=&quot;highlighter-rouge&quot;&gt;localStorage&lt;/code&gt;. Udało mi się zrobić w 5 minut 😄&lt;/p&gt;

&lt;p&gt;Tomasz poleca portal &lt;a href=&quot;http://nodeschool.io/pl/&quot;&gt;nodeschool.io/pl/&lt;/a&gt; gdzie można podszkolić się z JavaScript.&lt;/p&gt;

&lt;p&gt;Aby obserwować jakiś model należy wykonać:&lt;/p&gt;

&lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nx&quot;&gt;$scope&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;$watch&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'query'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;newValue&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;oldValue&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;newValue&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;oldValue&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Na samym początku ładowania aplikacji &lt;code class=&quot;highlighter-rouge&quot;&gt;$watch&lt;/code&gt; zostanie uruchomiony i przekazane zostaną mu wartości &lt;code class=&quot;highlighter-rouge&quot;&gt;undefined&lt;/code&gt;. Można się przed tym zabezpieczyć wystarczy sprawdzić czy nowa wartość równą się starej, bo tylko na początku obie wartości będą miały tą samo wartość.&lt;/p&gt;

&lt;h2 id=&quot;1522---dyrektywa-ng-model-options&quot;&gt;&lt;strong&gt;15:22&lt;/strong&gt; - Dyrektywa &lt;code class=&quot;highlighter-rouge&quot;&gt;ng-model-options&lt;/code&gt;&lt;/h2&gt;

&lt;p&gt;Dzięki tej dyrektywie mamy możliwość skonfigurowania komunikacji pomiędzy widokiem a kontrolerem.&lt;/p&gt;

&lt;div class=&quot;language-html highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;input&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;type=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;search&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;ng-model=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;query&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;ng-model-options=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;{ debounce: 1000 }&quot;&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Dzięki takiemu zastosowaniu odciążamy trochę aplikację, dodając lag na zmianę modelu.&lt;/p&gt;

&lt;p&gt;Tomasz poleca wtyczkę do &lt;code class=&quot;highlighter-rouge&quot;&gt;Batarang&lt;/code&gt;, dzięki której mamy możliwość podglądu modelów analizując DOMa.&lt;/p&gt;

&lt;h2 id=&quot;1530---directive-definition-object&quot;&gt;&lt;strong&gt;15:30&lt;/strong&gt; - Directive Definition Object&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;Enkapsulują logikę związaną z zachowaniem&lt;/li&gt;
  &lt;li&gt;Tworzą widgety - małe aplikacje, klocki z których budujemy większe fragmenty&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Jako zadanie domowe warto zrobić dyrektywę dla przycisków “Dodaj” i “Usuń”.&lt;/p&gt;

&lt;h2 id=&quot;1625---filtry&quot;&gt;&lt;strong&gt;16:25&lt;/strong&gt; - Filtry&lt;/h2&gt;

&lt;p&gt;Umożliwiają przekształcanie danych w trakcje przejścia ze &lt;code class=&quot;highlighter-rouge&quot;&gt;$scope&lt;/code&gt; do widoku bez zmieniania oryginalnej wartości.&lt;/p&gt;

&lt;p&gt;Jest około 7 standardowych filtrów. Ta mała liczba wynika ze względu na prostotę dodawania swoich.&lt;/p&gt;

&lt;p&gt;Od AngularJS 1.3 mamy w filtrach &lt;code class=&quot;highlighter-rouge&quot;&gt;pure function&lt;/code&gt;, czyli dla takich samych parametrów mamy te same wyjście, tym samym biblioteka zapamiętuje (proces memoizacja) wynik dla tych samych parametrów.&lt;/p&gt;

&lt;h2 id=&quot;1639---formularze&quot;&gt;&lt;strong&gt;16:39&lt;/strong&gt; - Formularze&lt;/h2&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;strong&gt;TIP&lt;/strong&gt;: Koniecznie trzeba ustawiać nazwy dla znacznika form, ponieważ będzie on pod tą nazwą dostępny w &lt;code class=&quot;highlighter-rouge&quot;&gt;scope&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Stany formularza&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;$valid&lt;/code&gt; - bez błędów&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;$invalid&lt;/code&gt; - z błędami&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;$pristine&lt;/code&gt; - nienaruszony&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;$dirty&lt;/code&gt; - zmodyfikowany&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;1657---dobre-praktyki&quot;&gt;&lt;strong&gt;16:57&lt;/strong&gt; - Dobre praktyki&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/toddmotto/angularjs-styleguide&quot;&gt;github.com/toddmotto/angularjs-styleguide&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/johnpapa/angular-styleguide&quot;&gt;github.com/johnpapa/angular-styleguide&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;1708---kończymy-na-dziś&quot;&gt;&lt;strong&gt;17:08&lt;/strong&gt; - Kończymy na dziś!&lt;/h2&gt;

&lt;p&gt;Podziękowanie dla Tomka za całodniowe szkolenie 😄&lt;/p&gt;
</description>
            <pubDate>Sat, 27 Jun 2015 00:00:00 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2015/06/27/szkolenie-angularjs-podstawy-relacja-live.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2015/06/27/szkolenie-angularjs-podstawy-relacja-live.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/angularjs/angularjs-526x275.jpg</image>
        </item>
        
        <item>
            <title>DevMeetings: ECMAScript 6: Kraków</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Pewnego dnia spotkałem się z &lt;a href=&quot;https://www.linkedin.com/in/piotrzwolinski&quot;&gt;Piotrem Zwolińskim&lt;/a&gt; na spotkaniu. W luźnej atmosferze doszliśmy do wniosku, że dobrze by było zrobić coś razem. Piotr wspomniał o tym, że wkrótce &lt;a href=&quot;http://devmeetings.pl&quot;&gt;DevMeetings&lt;/a&gt; zamierza przygotować szkolenie z &lt;strong&gt;ECMAScript 6&lt;/strong&gt;. Ze względu na moje doświadczenie w tym temacie, zaproponowałem, że mogę mu pomóc w organizacji od strony technicznej.&lt;/p&gt;

&lt;p&gt;Jakieś było moje zdziwienie, kiedy to dostałem ofertę bycia &lt;em&gt;mentorem&lt;/em&gt; na &lt;a href=&quot;http://devmeetings.pl&quot;&gt;DevMeetings&lt;/a&gt;. Na tych samych szkoleniach, z których zawsze wracałem przytłoczony ilością zdobytej wiedzy, z głową spuszczoną do domu, bo poznałem lepszych od siebie - bardziej doświadczonych.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/post-banner-devmeetings.png&quot; itemprop=&quot;image&quot; alt=&quot;Baner promujący artykuł&quot; /&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;mentor-vs-trener&quot;&gt;Mentor vs Trener&lt;/h2&gt;

&lt;p&gt;Kiedy to w 2008 roku jeździłem po Polsce aby jak najczęściej być obecnym na szkoleniu &lt;a href=&quot;http://devmeetings.pl&quot;&gt;DevMeetings&lt;/a&gt;, głównym prowadzącym szkolenie był &lt;a href=&quot;https://github.com/ddrcode&quot;&gt;David de Rosier&lt;/a&gt;, którym był traktowany jak guru JavaScript, ze względu na swoje praktyczne doświadczenie, nigdy nie sądziłem, że kiedyś i ja mogę być w podobnej roli&lt;/p&gt;

&lt;p&gt;DevMeetings ma w swoim słowniku dwa słowa opisujące osobę szkolącą:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;`Trener` - zawsze jeden na szkoleniu, który był ekspertem w swojej dziedzinie&lt;/li&gt;
  &lt;li&gt;`Mentor` - osoba z bagażem doświadczeń, jednak tryb pracy z uczestnikami polegał tylko na bezpośrednim pomaganiu, nie wygłasza żadnej prezentacji na dany temat&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;ecmascript-6-kraków&quot;&gt;ECMAScript 6 (Kraków)&lt;/h2&gt;

&lt;p&gt;DevMeetings organizując szkolenia, nie ogranicza się tyko do jednego miasta. Warsztaty są przeprowadzane w kilku największych miastach: Warszawa, Wrocław, Poznać, Kraków. Jako pierwsze miasto na szkolenie z &lt;strong&gt;ECMAScript 6&lt;/strong&gt; został wybrany Kraków. Tym samym dostałem zaproszenie do pomocy w roli mentora.&lt;/p&gt;

&lt;p&gt;Zgodziłem się z uśmiechem na twarzy.&lt;/p&gt;

&lt;p&gt;Oficjalnie zostałem wciągnięty na listę osób zaangażowanych w tego rodzaju przedsięwzięcie: &lt;a href=&quot;http://registration.devmeetings.com/events/es6-maj-krakow&quot;&gt;registration.devmeetings.com/events/es6-maj-krakow&lt;/a&gt;. Miło jest znaleźć się na liście mentorów 😄&lt;/p&gt;

&lt;p&gt;Miałem przyjemność uczyć uczestników nowej składni oraz nowy feature-ów z dwoma kolegami:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Maciek Kucharski: &lt;a href=&quot;https://twitter.com/kucharskimaciej&quot;&gt;@kucharskimaciej&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Bartek Krupa&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Kolejne warsztaty z &lt;strong&gt;ECMAScript 6&lt;/strong&gt; planowane się we Wrocławiu. Więcej informacji na stronie: &lt;a href=&quot;http://registration.devmeetings.com/events/es6-maj-wroclaw&quot;&gt;registration.devmeetings.com/events/es6-maj-wroclaw&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;tak-to-wyglądało&quot;&gt;Tak to wyglądało&lt;/h2&gt;

&lt;p&gt;Niestety nie mogłem stworzyć &lt;em&gt;relacji live&lt;/em&gt; ze spotkania, ze względu na ciągłą pomoc uczestnikom kiedy to rozwiązywali przygotowane przez nas zadania, które doprowadzały uczestników do implementacji 2 aplikacji.&lt;/p&gt;

&lt;p&gt;Na moim profilu na Twitterze są dostępne zdjęcia ze spotkania. Załączam jeden z tweetów:&lt;/p&gt;

&lt;figure class=&quot;social-center-block&quot;&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;pl&quot; dir=&quot;ltr&quot;&gt;4 iteracja na &lt;a href=&quot;https://twitter.com/DevMeetingsPL?ref_src=twsrc%5Etfw&quot;&gt;@DevMeetingsPL&lt;/a&gt; z &lt;a href=&quot;https://twitter.com/hashtag/ES6?src=hash&amp;amp;ref_src=twsrc%5Etfw&quot;&gt;#ES6&lt;/a&gt; &lt;a href=&quot;http://t.co/vhNyexpBhE&quot;&gt;pic.twitter.com/vhNyexpBhE&lt;/a&gt;&lt;/p&gt;&amp;mdash; Piotr Kowalski (@piecioshka) &lt;a href=&quot;https://twitter.com/piecioshka/status/612253645162315776?ref_src=twsrc%5Etfw&quot;&gt;June 20, 2015&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async=&quot;&quot; src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;

&lt;/figure&gt;

&lt;h2 id=&quot;mentor&quot;&gt;Mentor&lt;/h2&gt;

&lt;p&gt;Każdy z mentorów otrzymał od Piotra Zwolińskiego (właściciela DevMeetings) dyplom. Dla mnie jest to pierwszy taki dyplom który na pewno pojawi się w widocznym miejscu na ścianie 😄&lt;/p&gt;

&lt;figure class=&quot;social-center-block&quot;&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;pl&quot; dir=&quot;ltr&quot;&gt;Mentor &lt;a href=&quot;https://twitter.com/DevMeetingsPL?ref_src=twsrc%5Etfw&quot;&gt;@DevMeetingsPL&lt;/a&gt; do brzmi dumnie! ;) &lt;a href=&quot;http://t.co/vZJi53iyIS&quot;&gt;pic.twitter.com/vZJi53iyIS&lt;/a&gt;&lt;/p&gt;&amp;mdash; Piotr Kowalski (@piecioshka) &lt;a href=&quot;https://twitter.com/piecioshka/status/612261875955441664?ref_src=twsrc%5Etfw&quot;&gt;June 20, 2015&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async=&quot;&quot; src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;

&lt;/figure&gt;
</description>
            <pubDate>Tue, 23 Jun 2015 00:00:00 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2015/06/23/devmeetings-ecmascript-6-krakow.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2015/06/23/devmeetings-ecmascript-6-krakow.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/post-banner-devmeetings.png</image>
        </item>
        
        <item>
            <title>WarsawJS Meetup #10</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Kolejna edycja WarsawJS już za nami.&lt;/p&gt;

&lt;p&gt;Spotkaliśmy się 16 czerwca po raz #10 w Państwomiasto o 18:30, aby podyskutować o JavaScript.&lt;/p&gt;

&lt;!-- &lt;figure&gt;
    &lt;a href=&quot;https://www.meetup.com/WarsawJS/&quot;&gt;
        &lt;img src=&quot;/assets/images/posts/post-banner-warsawjs.jpg&quot;
             alt=&quot;WarsawJS&quot;/&gt;
    &lt;/a&gt;
&lt;/figure&gt; --&gt;

&lt;h2 id=&quot;invitation&quot;&gt;Invitation&lt;/h2&gt;

&lt;p&gt;Zapraszam w imieniu organizatorów WarsawJS.&lt;/p&gt;

&lt;div class=&quot;youtube-lazy&quot; data-youtube-id=&quot;A960ZbLDHLE&quot;&gt;&lt;/div&gt;

&lt;p class=&quot;chapter-break&quot;&gt;&amp;bull;&lt;/p&gt;

&lt;h2 id=&quot;talk-1-testy-e2e-na-przykładzie-aplikacji-angularowej-pl-robert-gurgul&quot;&gt;Talk #1: Testy e2e na przykładzie aplikacji angularowej [PL] &lt;small&gt;Robert Gurgul&lt;/small&gt;&lt;/h2&gt;

&lt;p&gt;Twitter: &lt;a href=&quot;https://twitter.com/rgurgul&quot;&gt;@rgurgul&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Link do prelekcji: &lt;a href=&quot;https://www.youtube.com/watch?v=5EgJNRJuNGw&quot;&gt;https://www.youtube.com/watch?v=5EgJNRJuNGw&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Link do slajdów: &lt;a href=&quot;http://rgurgul.github.io/warsawjs-presentation-e2e-tests/&quot;&gt;rgurgul.github.io/warsawjs-presentation-e2e-tests/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p class=&quot;chapter-break&quot;&gt;&amp;bull;&lt;/p&gt;

&lt;h2 id=&quot;talk-2-enterprise-interface-architecture-json-schema-en-tomasz-ducin&quot;&gt;Talk #2: Enterprise Interface Architecture: JSON Schema [EN] &lt;small&gt;Tomasz Ducin&lt;/small&gt;&lt;/h2&gt;

&lt;p&gt;Twitter: &lt;a href=&quot;https://twitter.com/tomasz_ducin&quot;&gt;@tomasz_ducin&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Link do prelekcji: &lt;a href=&quot;https://www.youtube.com/watch?v=TkqiUG3j_Xw&quot;&gt;https://www.youtube.com/watch?v=TkqiUG3j_Xw&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Link do slajdów: &lt;a href=&quot;http://slides.com/ducin/json-schema&quot;&gt;slides.com/ducin/json-schema&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p class=&quot;chapter-break&quot;&gt;&amp;bull;&lt;/p&gt;

&lt;h2 id=&quot;sponsorzy-spotkania&quot;&gt;Sponsorzy spotkania&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.facebook.com/Rebased/&quot;&gt;Rebased&lt;/a&gt;, &lt;a href=&quot;https://www.facebook.com/10Clouds/&quot;&gt;10Clouds&lt;/a&gt; - żetony w barze&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.facebook.com/cyfrowypolsat/&quot;&gt;Cyfrowy Polsat&lt;/a&gt; - materiały na YouTube&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.facebook.com/whitestreampl&quot;&gt;Whitestream&lt;/a&gt; - transmisja na żywo - &lt;a href=&quot;http://warsawjs.com/live&quot;&gt;warsawjs.com/live&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
            <pubDate>Mon, 22 Jun 2015 00:00:00 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2015/06/22/warsawjs-meetup-10.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2015/06/22/warsawjs-meetup-10.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/post-banner-warsawjs.jpg</image>
        </item>
        
        <item>
            <title>ECMAScript 6. Dlaczego warto spróbować już dziś?</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Kiedy powstało narzędzie &lt;code class=&quot;highlighter-rouge&quot;&gt;6to5&lt;/code&gt; które miało być translatorem nowej składni JavaScript nie rzuciłem się na niego, ze względu na to, że potrzebowałem dowodu, że działa w 100%.&lt;/p&gt;

&lt;p&gt;Temat odszedł trochę w zapomnienie. Dałem sobie spokój z poznawaniem nowej składni - skoro jeszcze nie została ona zatwierdzona żadną pieczęcią.&lt;/p&gt;

&lt;p&gt;Nie chciałem uczyć się czegoś nowego co jest tylko draftem. Cenię sobie stabilne rozwiązania.&lt;/p&gt;

&lt;p&gt;Kilka tygodni temu temat wrócił ze zdwojoną siłą… dlaczego?&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/post-banner-javascript.png&quot; itemprop=&quot;image&quot; alt=&quot;Baner promujący artykuł&quot; /&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;powrót-z-dalekiej-podróży&quot;&gt;Powrót z dalekiej podróży…&lt;/h2&gt;

&lt;p&gt;… bo &lt;code class=&quot;highlighter-rouge&quot;&gt;6to5&lt;/code&gt; zmienił nazwę na &lt;code class=&quot;highlighter-rouge&quot;&gt;Babel.js&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Dało mi to nadzieję, że może coś się zmieniło w kwestii stabilności transpilera. Wgłębiłem się w temat i okazało się, że &lt;code class=&quot;highlighter-rouge&quot;&gt;Babel.js&lt;/code&gt; wspiera w 75% &lt;a href=&quot;http://kangax.github.io/compat-table/es6/#Proxy&quot;&gt;wg kangax&lt;/a&gt; standard który jest zapisany w dokumencie, który ma być zatwierdzony “na dniach”.&lt;/p&gt;

&lt;p&gt;Wydaje mi się to na tyle sensowną liczbą, że warto już dziś zacząć pisać z użyciem nowej składni. Chociażby z tego powodu, aby się do niej przyzwyczaić - aby brwi się nie marszczyły kiedy spojrzy się np. na klasy w pliku &lt;code class=&quot;highlighter-rouge&quot;&gt;*.js&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Tak przedstawia się lista wsparcia feature–ów z ES6 przez &lt;code class=&quot;highlighter-rouge&quot;&gt;Babel.js&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/posts/babel/babel-support-list.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Jak widać na powyższym obrazku lista nowych rzeczy jest wielka. Nowa składnia pozwala nam na uniknięcie wielu haków, chociażby znany wszystkich niby-obiekt, niby-tablica &lt;code class=&quot;highlighter-rouge&quot;&gt;arguments&lt;/code&gt;, w którym znajduje się lista argumentów przekazanych do funkcji. Jednak to nie jest zwykła tablica, bo nie można na niej uruchomić metod z konstruktora &lt;code class=&quot;highlighter-rouge&quot;&gt;Array&lt;/code&gt;. Takie zadanie jest możliwe po zastosowaniu rzutowania:&lt;/p&gt;

&lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;foo&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;args&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;Array&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;prototype&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;slice&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;call&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kr&quot;&gt;arguments&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;operation&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;args&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;slice&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;things&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;args&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;slice&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;operation&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;things&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;// ...&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Czy faktycznie taka linijka musi być w każdym miejscu kiedy chcemy operować na tablicy argumentów?&lt;/p&gt;

&lt;p&gt;&lt;em&gt;ECMAScript 6&lt;/em&gt; ma w swoich zbiorze ulepszeń &lt;code class=&quot;highlighter-rouge&quot;&gt;rest parameters&lt;/code&gt;. Dzięki temu kod może wyglądać tak:&lt;/p&gt;

&lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;foo&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(...&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;args&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;operation&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;args&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;slice&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;things&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;args&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;slice&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;operation&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;things&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;// ...&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Prawda, że ładniej? 😄&lt;/p&gt;

&lt;h2 id=&quot;skąd-czerpać-wiedzę&quot;&gt;Skąd czerpać wiedzę?&lt;/h2&gt;

&lt;p&gt;Pewnego czasu kupiłem kilka domen, które kierują na jedną: &lt;del&gt;&lt;a href=&quot;http://ecmascript6.pl&quot;&gt;ecmascript6.pl&lt;/a&gt;&lt;/del&gt;.&lt;/p&gt;

&lt;p&gt;Gdzie stworzyłem agregat linków do wartościowych artykułów, tutoriali nt. &lt;code class=&quot;highlighter-rouge&quot;&gt;ES6&lt;/code&gt;. Zachęcam do częstego odwiedzania. Codziennie powstają nowe artykuły, tutoriale i prezentacje z konferencji.&lt;/p&gt;

&lt;p&gt;Chyba najbardziej zaangażowanym developerem jest &lt;em&gt;Dr. Axel Rauschmayer&lt;/em&gt;. Na swoim blogu (&lt;a href=&quot;http://www.2ality.com&quot;&gt;www.2ality.com&lt;/a&gt;) stworzył już kilka bardzo dobrze opisanych artykułów dotyczących &lt;code class=&quot;highlighter-rouge&quot;&gt;ECMAScript 6&lt;/code&gt; (więcej w pkt 6. na stronie &lt;del&gt;&lt;a href=&quot;http://ecmascript6.pl&quot;&gt;ecmascript6.pl&lt;/a&gt;&lt;/del&gt;).&lt;/p&gt;

&lt;p&gt;Ci z Was którzy lubią dużo czytać, na pewno zostaną pochłonięci przez książkę napisaną przez &lt;em&gt;Nicholasa C. Zakasa&lt;/em&gt; pt. &lt;code class=&quot;highlighter-rouge&quot;&gt;Understanding ECMAScript 6&lt;/code&gt;. Jest ona dostępna pod adresem: &lt;a href=&quot;https://leanpub.com/understandinges6/read/&quot;&gt;https://leanpub.com/understandinges6/read/&lt;/a&gt;. Jestem tym szczęśliwcem, który posiada wersję papierkową.&lt;/p&gt;

&lt;h2 id=&quot;dlaczego-więc-warto&quot;&gt;Dlaczego więc warto?&lt;/h2&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;a href=&quot;http://www.ecma-international.org/memento/TC39.htm&quot;&gt;Komitet &lt;strong&gt;Ecma TC39&lt;/strong&gt;&lt;/a&gt; rozwija przed nami dywan.&lt;/p&gt;

  &lt;p&gt;Dywan po którym Ty i ja wkrótce &lt;strong&gt;będziemy stąpali&lt;/strong&gt;.&lt;/p&gt;

  &lt;p&gt;Na dziś dzień jeszcze ten dywan nie został rozwinięty do końca,&lt;/p&gt;

  &lt;p&gt;dlatego gdy chcesz poczuć jak to jest po nim chodzić&lt;/p&gt;

  &lt;p&gt;musisz wykorzystać linoleum, które jest tylko &lt;em&gt;skromnym zamiennikiem&lt;/em&gt;.&lt;/p&gt;

  &lt;p&gt;Linoleum w tej historii jest transpiler np. &lt;code class=&quot;highlighter-rouge&quot;&gt;Babel.js&lt;/code&gt; bądź &lt;code class=&quot;highlighter-rouge&quot;&gt;Traceur&lt;/code&gt;.&lt;/p&gt;

  &lt;p&gt;Dywanem jest &lt;code class=&quot;highlighter-rouge&quot;&gt;ECMAScript 6&lt;/code&gt; &lt;small&gt;Piotr Kowalski. 2015-06-10&lt;/small&gt;&lt;/p&gt;
&lt;/blockquote&gt;
</description>
            <pubDate>Wed, 10 Jun 2015 00:00:00 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2015/06/10/ecmascript-6-dlaczego-warto-sprobowac-juz-dzis.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2015/06/10/ecmascript-6-dlaczego-warto-sprobowac-juz-dzis.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/post-banner-javascript.png</image>
        </item>
        
        <item>
            <title>Narzędzia usprawniające prace z Git</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Obejrzałem dziś prezentację pt: &lt;strong&gt;Git — krok po kroku&lt;/strong&gt; &lt;a href=&quot;https://twitter.com/lewandm4&quot;&gt;Michała Lewandowskiego&lt;/a&gt; w ramach Jinkubatora .&lt;/p&gt;

&lt;p&gt;Zachęciło mnie to do napisania posta, aby przelać “na papier” słowa wypowiedziane.&lt;/p&gt;

&lt;p&gt;Michał podczas prezentacji, przedstawił jak działa Git, w jaki sposób radzi on sobie z tworzeniem rewizji, branchy czy tagów. Na początku prezentacji Michał zareklamował narzędzie &lt;code class=&quot;highlighter-rouge&quot;&gt;tig&lt;/code&gt; z którego miał często korzystać podczas weryfikacji stanu repozytorium, jednak chyba ze względu na stres korzystał z &lt;code class=&quot;highlighter-rouge&quot;&gt;sourceTree&lt;/code&gt; 😄&lt;/p&gt;

&lt;p&gt;Bardzo mnie zaciekawiło to narzędzie (&lt;code class=&quot;highlighter-rouge&quot;&gt;tig&lt;/code&gt; oczywiście, nie &lt;code class=&quot;highlighter-rouge&quot;&gt;sourceTree&lt;/code&gt;), zrobiłem więc szybki research i od razu postanowiłem, że się z nim zaprzyjaźnię.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/post-banner-git.jpg&quot; itemprop=&quot;image&quot; alt=&quot;Baner promujący artykuł&quot; /&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;tig&quot;&gt;Tig&lt;/h2&gt;

&lt;p&gt;Kiedyś, gdy w ferworze rozglądałem się nad jakimiś narzędziami z GUI do zarządzania repozytorium, dowiedziałem się o istnieniu &lt;code class=&quot;highlighter-rouge&quot;&gt;tig&lt;/code&gt;-a. Wtedy jednak narzędzie nie zrobiło na mnie jakiegoś wrażenia. Chciałem czegoś więcej. Czegoś co będzie miało jakiś interfejs użytkownika prezentowany w nowym oknie. Wybrałem wtedy narzędzie, które uruchamia się po uruchomieniu polecenia &lt;code class=&quot;highlighter-rouge&quot;&gt;gitk&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Jest ono bardzo lekkie:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;du&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-sh&lt;/span&gt; /usr/bin/gitk
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;div class=&quot;language-text highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt; 88K    /usr/bin/gitk
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Tym samym działa szybko - a jest to dla mnie priorytetem w doborze softu do codziennej pracy. Ile czasu można stracić używając wolnego oprogramowania to na pewno każdy z nas już się o tym przekonał.&lt;/p&gt;

&lt;p&gt;Pozwolę sobie zamieścić zrzut ekranu z głównego okna kiedy to uruchamiam &lt;code class=&quot;highlighter-rouge&quot;&gt;tig&lt;/code&gt;-a na jednym z moich projektów:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/posts/tig/tig.gif&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;h4 id=&quot;opcje&quot;&gt;Opcje&lt;/h4&gt;

&lt;p&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;tig&lt;/code&gt; to bardzo szybkie narzędzie terminalowe, dzięki któremu mamy dostęp do wielu rzeczy korzystając z prostych skrótów klawiaturowych.&lt;/p&gt;

&lt;p&gt;Najważniejszym skrótem jest oczywiście dostęp do pomocy. Wchodzimy do programu i … &lt;code class=&quot;highlighter-rouge&quot;&gt;h&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Wchodzimy tym samym do ekranu z całą listą skrótów dostępnych pod &lt;code class=&quot;highlighter-rouge&quot;&gt;tig&lt;/code&gt;iem.&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;m view-main         Show main view
d view-diff         Show diff view
l view-log          Show log view
t view-tree         Show tree view
f view-blob         Show blob view
b view-blame        Show blame view
r view-refs         Show refs view
s, S view-status       Show status view
c view-stage        Show stage view
y view-stash        Show stash view
g view-grep         Show &lt;span class=&quot;nb&quot;&gt;grep &lt;/span&gt;view
p view-pager        Show pager view
h view-help         Show &lt;span class=&quot;nb&quot;&gt;help &lt;/span&gt;view
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Lista powyżej jest listą ekranów do których mamy dostęp za pomocą pojedynczych literek jako skrótów klawiaturowych - zwykłych literek.&lt;/p&gt;

&lt;p&gt;Nie będę się starał opisywać całego programu, bo to nie o to chodzi - zresztą dziś zacząłem się nim interesować, więc potrzebuje jeszcze jakieś kilka tygodni codziennej pracy, aby móc się szerzej wypowiedzieć.&lt;/p&gt;

&lt;p&gt;Nie mniej jednak zachęcam do korzystania, ponieważ dzięki &lt;code class=&quot;highlighter-rouge&quot;&gt;tig&lt;/code&gt; zarządzamy repozytorium nie wpisując całych poleceń do terminala tylko korzystamy z łatwych skrótów. Nie czuję tutaj, abym nie wiedział co w danej chwili uruchomił za mnie program, tak jak ma to miejsce w tak skomplikowanych programach jak &lt;code class=&quot;highlighter-rouge&quot;&gt;SourceTree&lt;/code&gt; czy chociażby &lt;code class=&quot;highlighter-rouge&quot;&gt;GitHub for Mac&lt;/code&gt;.&lt;/p&gt;

&lt;h2 id=&quot;git-flow&quot;&gt;git flow&lt;/h2&gt;

&lt;p&gt;Kolejnym narzędziem pomocnym w pracy z Git-em jest &lt;code class=&quot;highlighter-rouge&quot;&gt;git flow&lt;/code&gt;. Nie jest to narzędzie zainstalowane domyślnie razem z Git-em, trzeba je zainstalować osobno (link poniżej).&lt;/p&gt;

&lt;p&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;git flow&lt;/code&gt; wymusza na nas utrzymanie porządku w branchach i tagach, nie poprzez przełączanie się bezpośrednio pomiędzy branchami, tylko według zasad zdefiniowanych w tzw. &lt;em&gt;flow&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Nie mogę powiedzieć, że mam doświadczenie z takim podejściem, więc przytoczę tylko to, co Michał przekazał na szkoleniu.&lt;/p&gt;

&lt;p&gt;Podstawową funkcjonalności jest przełączanie się pomiędzy feature-ami stworzonymi w projekcie poprzez:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;git flow feature start 12345-support-sign-up
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Kiedy zakończymy nad nim pracę informujemy, że &lt;em&gt;feature&lt;/em&gt; został zakończony:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;git flow feature finish 12345-support-sign-up
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Wtedy taki branch zostaje zmergowany do brancha &lt;em&gt;develop&lt;/em&gt;. Jest to branch w których nie prowadzimy żadnych prac, jest to taki kolektor, agregat, funkcjonalności realizowanych w innych branchach typu &lt;em&gt;feature/xxx&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hint:&lt;/strong&gt; branch &lt;em&gt;master&lt;/em&gt; jest odzwierciedleniem aplikacji na produkcji, czyli takiej która jest u klienta.&lt;/p&gt;

&lt;p&gt;Ten rysunek przedstawia jak wygląda praca z &lt;code class=&quot;highlighter-rouge&quot;&gt;git flow&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/assets/images/posts/git/git-model.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Bardzo ciekawą opcją jest jeszcze tworzenie &lt;em&gt;release&lt;/em&gt;-ów aplikacji.&lt;/p&gt;

&lt;p&gt;Z pomocą przychodzi tutaj polecenie:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;git flow release start 1.0
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;git flow&lt;/code&gt; przełącza nas na specjalnego brancha, w którym możemy tworzyć kolejne rewizje (np. podmiana numerka wersji w README.md). Jest to bardzo wygodne rozwiązanie, bo jeśli nic nie musimy robić to po prostu wykonujemy &lt;em&gt;finish&lt;/em&gt; tego procesu:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;git flow release finish 1.0
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Ze swojej strony bardzo zachęcam do chociażby wypróbowania takiego podejścia do zarządzania branchami w swoim projekcie.&lt;/p&gt;

&lt;p&gt;Najlepiej jak by cały zespół projektowy wykorzystywał te narzędzie, zachowalibyśmy spójność w całym projekcie, co jest w większych projektach nie tylko wskazane.&lt;/p&gt;

&lt;h2 id=&quot;podsumowanie&quot;&gt;Podsumowanie&lt;/h2&gt;

&lt;p&gt;Link do wcześniej wspomnianych rzeczy:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Prezentacja Michała: &lt;a href=&quot;https://www.youtube.com/watch?v=QrJ5cdX1ir4&quot;&gt;https://www.youtube.com/watch?v=QrJ5cdX1ir4&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Repozytorium &lt;code class=&quot;highlighter-rouge&quot;&gt;tig&lt;/code&gt;-a: &lt;a href=&quot;https://github.com/jonas/tig&quot;&gt;github.com/jonas/tig&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Projekt &lt;code class=&quot;highlighter-rouge&quot;&gt;git flow&lt;/code&gt;: &lt;a href=&quot;https://github.com/nvie/gitflow&quot;&gt;github.com/nvie/gitflow&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
            <pubDate>Sun, 07 Jun 2015 00:00:00 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2015/06/07/narzedzia-usprawniajace-prace-w-git.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2015/06/07/narzedzia-usprawniajace-prace-w-git.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/post-banner-git.jpg</image>
        </item>
        
        <item>
            <title>WarsawJS Meetup #9</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;#9 edycja WarsawJS już za nami.&lt;/p&gt;

&lt;p&gt;Spotkaliśmy się w Państwomiasto o 18:30 aby podyskutować o JavaScript.&lt;/p&gt;

&lt;!-- &lt;figure&gt;
    &lt;a href=&quot;https://www.meetup.com/WarsawJS/&quot;&gt;
        &lt;img src=&quot;/assets/images/posts/post-banner-warsawjs.jpg&quot;
             alt=&quot;WarsawJS&quot;/&gt;
    &lt;/a&gt;
&lt;/figure&gt; --&gt;

&lt;h2 id=&quot;invitation&quot;&gt;Invitation&lt;/h2&gt;

&lt;p&gt;Zapraszam w imieniu organizatorów WarsawJS.&lt;/p&gt;

&lt;div class=&quot;youtube-lazy&quot; data-youtube-id=&quot;4MIBdo-sOrs&quot;&gt;&lt;/div&gt;

&lt;p class=&quot;chapter-break&quot;&gt;&amp;bull;&lt;/p&gt;

&lt;h2 id=&quot;talk-1-understanding-data-binding-en-dominik-lubański&quot;&gt;Talk #1: Understanding data binding [EN] &lt;small&gt;Dominik Lubański&lt;/small&gt;&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;Link do prelekcji: &lt;a href=&quot;https://www.youtube.com/watch?v=zV-CVRpb4pg&quot;&gt;https://www.youtube.com/watch?v=zV-CVRpb4pg&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Link do slajdów: &lt;a href=&quot;http://slides.com/smalluban/understanding-data-binding&quot;&gt;slides.com/smalluban/understanding-data-binding&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p class=&quot;chapter-break&quot;&gt;&amp;bull;&lt;/p&gt;

&lt;h2 id=&quot;talk-2-responsive-images-the-easy-way-en-illarion-khapyorskiy&quot;&gt;Talk #2: Responsive images the easy way [EN] &lt;small&gt;Illarion Khapyorskiy&lt;/small&gt;&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;Link do prelekcji: &lt;a href=&quot;https://www.youtube.com/watch?v=FLBfeTH1DWo&quot;&gt;https://www.youtube.com/watch?v=FLBfeTH1DWo&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Link do slajdów: &lt;a href=&quot;http://illarionvk.github.io/warsawjs-responsive-assets/images/&quot;&gt;illarionvk.github.io/warsawjs-responsive-assets/images/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p class=&quot;chapter-break&quot;&gt;&amp;bull;&lt;/p&gt;

&lt;h2 id=&quot;talk-3-whats-up-javascript-en-sambath-kumar&quot;&gt;Talk #3: What’s up: JavaScript [EN] &lt;small&gt;Sambath Kumar&lt;/small&gt;&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;Link do prelekcji: &lt;a href=&quot;https://www.youtube.com/watch?v=Tb2uCGJzMg4&quot;&gt;https://www.youtube.com/watch?v=Tb2uCGJzMg4&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Link do slajdów: &lt;a href=&quot;http://sambathl.github.io/warsawjs-presentation-template/&quot;&gt;sambathl.github.io/warsawjs-presentation-template/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p class=&quot;chapter-break&quot;&gt;&amp;bull;&lt;/p&gt;

&lt;h2 id=&quot;sponsorzy-spotkania&quot;&gt;Sponsorzy spotkania&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.facebook.com/Rebased/&quot;&gt;Rebased&lt;/a&gt;, &lt;a href=&quot;https://www.facebook.com/10Clouds/&quot;&gt;10Clouds&lt;/a&gt; - żetony w barze&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.facebook.com/cyfrowypolsat/&quot;&gt;Cyfrowy Polsat&lt;/a&gt; - materiały na YouTube&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.facebook.com/whitestreampl&quot;&gt;Whitestream&lt;/a&gt; - transmisja na żywo - &lt;a href=&quot;http://warsawjs.com/live&quot;&gt;warsawjs.com/live&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
            <pubDate>Mon, 25 May 2015 00:00:00 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2015/05/25/warsawjs-meetup-9.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2015/05/25/warsawjs-meetup-9.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/post-banner-warsawjs.jpg</image>
        </item>
        
        <item>
            <title>WarsawJS Meetup #8</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;#8 edycja WarsawJS już za nami.&lt;/p&gt;

&lt;p&gt;Spotkaliśmy się w Państwomiasto o 18:30 aby podyskutować o JavaScript.&lt;/p&gt;

&lt;!-- &lt;figure&gt;
    &lt;a href=&quot;https://www.meetup.com/WarsawJS/&quot;&gt;
        &lt;img src=&quot;/assets/images/posts/post-banner-warsawjs.jpg&quot;
             alt=&quot;WarsawJS&quot;/&gt;
    &lt;/a&gt;
&lt;/figure&gt; --&gt;

&lt;h2 id=&quot;invitation&quot;&gt;Invitation&lt;/h2&gt;

&lt;p&gt;Krzysztof zaprasza w imieniu organizatorów WarsawJS.&lt;/p&gt;

&lt;div class=&quot;youtube-lazy&quot; data-youtube-id=&quot;zLFjxwRbwaM&quot;&gt;&lt;/div&gt;

&lt;p class=&quot;chapter-break&quot;&gt;&amp;bull;&lt;/p&gt;

&lt;h2 id=&quot;talk-1-user-friendly-website-with-websockets-adrian-woźniak&quot;&gt;Talk #1: User Friendly Website with WebSockets &lt;small&gt;Adrian Woźniak&lt;/small&gt;&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;Link do prelekcji: &lt;a href=&quot;https://www.youtube.com/watch?v=D93jVD2wSAE&quot;&gt;https://www.youtube.com/watch?v=D93jVD2wSAE&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Link do slajdów: &lt;a href=&quot;https://github.com/Eraden/user-friendly-website-with-websockets&quot;&gt;github.com/Eraden/user-friendly-website-with-websockets&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p class=&quot;chapter-break&quot;&gt;&amp;bull;&lt;/p&gt;

&lt;h2 id=&quot;talk-2-experience-design-development-jutro-jest-teraz-piotr-słowik&quot;&gt;Talk #2: Experience Design Development. Jutro jest teraz &lt;small&gt;Piotr Słowik&lt;/small&gt;&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;Link do prelekcji: &lt;a href=&quot;https://www.youtube.com/watch?v=UdklTOAKi60&quot;&gt;https://www.youtube.com/watch?v=UdklTOAKi60&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Link do slajdów: &lt;a href=&quot;#&quot;&gt;wkrótce&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p class=&quot;chapter-break&quot;&gt;&amp;bull;&lt;/p&gt;

&lt;h2 id=&quot;talk-3-react-isomorphism-and-getting-more-functional-en-michał-kawalec&quot;&gt;Talk #3: React, Isomorphism and getting more functional [EN] &lt;small&gt;Michał Kawalec&lt;/small&gt;&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;Link do prelekcji: &lt;a href=&quot;https://www.youtube.com/watch?v=ItlSIyyVOng&quot;&gt;https://www.youtube.com/watch?v=ItlSIyyVOng&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Link do slajdów: &lt;a href=&quot;https://github.com/mkawalec/warsawjs-presentation-template&quot;&gt;github.com/mkawalec/warsawjs-presentation-template&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p class=&quot;chapter-break&quot;&gt;&amp;bull;&lt;/p&gt;

&lt;h2 id=&quot;sponsorzy-spotkania&quot;&gt;Sponsorzy spotkania&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.facebook.com/Rebased/&quot;&gt;Rebased&lt;/a&gt;, &lt;a href=&quot;https://www.facebook.com/10Clouds/&quot;&gt;10Clouds&lt;/a&gt; - żetony w barze&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.facebook.com/cyfrowypolsat/&quot;&gt;Cyfrowy Polsat&lt;/a&gt; - materiały na YouTube&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.facebook.com/whitestreampl&quot;&gt;Whitestream&lt;/a&gt; - transmisja na żywo - &lt;a href=&quot;http://warsawjs.com/live&quot;&gt;warsawjs.com/live&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
            <pubDate>Tue, 05 May 2015 00:00:00 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2015/05/05/warsawjs-meetup-8.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2015/05/05/warsawjs-meetup-8.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/post-banner-warsawjs.jpg</image>
        </item>
        
        <item>
            <title>WarsawJS Meetup #7</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;#7 edycja WarsawJS już za nami.&lt;/p&gt;

&lt;p&gt;Spotkaliśmy się w Państwomiasto o 18:30 aby podyskutować o JavaScript.&lt;/p&gt;

&lt;!-- &lt;figure&gt;
    &lt;a href=&quot;https://www.meetup.com/WarsawJS/&quot;&gt;
        &lt;img src=&quot;/assets/images/posts/post-banner-warsawjs.jpg&quot;
             alt=&quot;WarsawJS&quot;/&gt;
    &lt;/a&gt;
&lt;/figure&gt; --&gt;

&lt;h2 id=&quot;invitation&quot;&gt;Invitation&lt;/h2&gt;

&lt;p&gt;Zapraszam w imieniu organizatorów WarsawJS.&lt;/p&gt;

&lt;div class=&quot;youtube-lazy&quot; data-youtube-id=&quot;MFX1jRty5y8&quot;&gt;&lt;/div&gt;

&lt;p class=&quot;chapter-break&quot;&gt;&amp;bull;&lt;/p&gt;

&lt;h2 id=&quot;talk-1-all-that-js-tomasz-ducin&quot;&gt;Talk #1: All that JS &lt;small&gt;Tomasz Ducin&lt;/small&gt;&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;Link do prelekcji: &lt;a href=&quot;https://www.youtube.com/watch?v=VFNnBhkiMrg&quot;&gt;https://www.youtube.com/watch?v=VFNnBhkiMrg&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Link do slajdów: &lt;a href=&quot;http://slides.com/tkoomzaaskz/all-that-js&quot;&gt;slides.com/tkoomzaaskz/all-that-js&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p class=&quot;chapter-break&quot;&gt;&amp;bull;&lt;/p&gt;

&lt;h2 id=&quot;talk-2-czy-50-to-dużo-marcin-operacz&quot;&gt;Talk #2: Czy 50 to dużo? &lt;small&gt;Marcin Operacz&lt;/small&gt;&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;Link do prelekcji: &lt;a href=&quot;https://www.youtube.com/watch?v=P818c0LXV04&quot;&gt;https://www.youtube.com/watch?v=P818c0LXV04&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Link do slajdów: &lt;a href=&quot;https://github.com/moperacz/czy-50-to-duzo&quot;&gt;github.com/moperacz/czy-50-to-duzo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p class=&quot;chapter-break&quot;&gt;&amp;bull;&lt;/p&gt;

&lt;h2 id=&quot;talk-3-angularjs---dyrektywy-szyte-na-miarę-darek-kalbarczyk&quot;&gt;Talk #3: AngularJS - Dyrektywy szyte na miarę &lt;small&gt;Darek Kalbarczyk&lt;/small&gt;&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;Link do prelekcji: &lt;a href=&quot;https://www.youtube.com/watch?v=3JTCbcVJqcE&quot;&gt;https://www.youtube.com/watch?v=3JTCbcVJqcE&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Link do slajdów: &lt;a href=&quot;http://ng-poland.pl/warsawjs/&quot;&gt;ng-poland.pl/warsawjs/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p class=&quot;chapter-break&quot;&gt;&amp;bull;&lt;/p&gt;

&lt;h2 id=&quot;sponsorzy-spotkania&quot;&gt;Sponsorzy spotkania&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.facebook.com/Rebased/&quot;&gt;Rebased&lt;/a&gt;, &lt;a href=&quot;https://www.facebook.com/10Clouds/&quot;&gt;10Clouds&lt;/a&gt; - żetony w barze&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.facebook.com/cyfrowypolsat/&quot;&gt;Cyfrowy Polsat&lt;/a&gt; - materiały na YouTube&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.facebook.com/whitestreampl&quot;&gt;Whitestream&lt;/a&gt; - transmisja na żywo - &lt;a href=&quot;http://warsawjs.com/live&quot;&gt;warsawjs.com/live&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
            <pubDate>Mon, 23 Mar 2015 00:00:00 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2015/03/23/warsawjs-meetup-7.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2015/03/23/warsawjs-meetup-7.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/post-banner-warsawjs.jpg</image>
        </item>
        
        <item>
            <title>WarsawJS Meetup #6</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Kolejna edycja WarsawJS już za nami. Jak zwykle spotkaliśmy się w Państwomiasto. Część oficjalną zaczęliśmy o 18:30 - może z lekkim opóźnieniem.&lt;/p&gt;

&lt;!-- &lt;figure&gt;
    &lt;a href=&quot;https://www.meetup.com/WarsawJS/&quot;&gt;
        &lt;img src=&quot;/assets/images/posts/post-banner-warsawjs.jpg&quot;
             alt=&quot;WarsawJS&quot;/&gt;
    &lt;/a&gt;
&lt;/figure&gt; --&gt;

&lt;h2 id=&quot;invitation&quot;&gt;Invitation&lt;/h2&gt;

&lt;p&gt;Zapraszam w imieniu organizatorów WarsawJS.&lt;/p&gt;

&lt;div class=&quot;youtube-lazy&quot; data-youtube-id=&quot;UFnLb4ZnqlQ&quot;&gt;&lt;/div&gt;

&lt;p class=&quot;chapter-break&quot;&gt;&amp;bull;&lt;/p&gt;

&lt;h2 id=&quot;talk-1-geokodowanie-w-aplikacjach&quot;&gt;Talk #1: Geokodowanie w aplikacjach&lt;/h2&gt;

&lt;p&gt;Pierwsza prelekcje dotyczyła geo-kodowania w aplikacjach. &lt;a href=&quot;https://github.com/navidata&quot;&gt;Michał Rogala&lt;/a&gt; opowiedział jak wykorzystać bibliotekę &lt;a href=&quot;http://leafletjs.com/&quot;&gt;leaflet.js&lt;/a&gt; na własny użytek.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Link do prelekcji: &lt;a href=&quot;https://www.youtube.com/watch?v=eaXffqD4i84&quot;&gt;https://www.youtube.com/watch?v=eaXffqD4i84&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Link do slajdów: &lt;a href=&quot;https://navidata.github.com/warsawjs-geocoding-in-applications&quot;&gt;https://navidata.github.com/warsawjs-geocoding-in-applications&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p class=&quot;chapter-break&quot;&gt;&amp;bull;&lt;/p&gt;

&lt;h2 id=&quot;talk-2-make-your-life-easier---use-underscorejs&quot;&gt;Talk #2: Make your life easier - use Underscore.js&lt;/h2&gt;

&lt;p&gt;Drugą prelekcję wygłosił &lt;a href=&quot;https://github.com/adamminiuk&quot;&gt;Adam Miniuk&lt;/a&gt;. Wprowadził nas w świat &lt;a href=&quot;http://underscorejs.org/&quot;&gt;underscore.js&lt;/a&gt;. Przedstawił nam najpopularniejsze metody z tej biblioteki oraz opowiedział o performance.&lt;/p&gt;

&lt;p&gt;Na sam koniec przedstawił listę 2 konkurentów:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://lodash.com/&quot;&gt;lodash.js&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://github.com/dtao/lazy.js&quot;&gt;lazy.js&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;Link do prelekcji: &lt;a href=&quot;https://www.youtube.com/watch?v=WullNDHBz5A&quot;&gt;https://www.youtube.com/watch?v=WullNDHBz5A&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Link do slajdów: &lt;a href=&quot;https://adamminiuk.github.com/warsawjs-underscore-js-presentation&quot;&gt;https://adamminiuk.github.com/warsawjs-underscore-js-presentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p class=&quot;chapter-break&quot;&gt;&amp;bull;&lt;/p&gt;

&lt;h2 id=&quot;talk-3-tdd-w-javascript---mały-warsztat&quot;&gt;Talk #3: TDD w JavaScript - mały warsztat&lt;/h2&gt;

&lt;p&gt;Ostatnią prezentacją poprowadził &lt;a href=&quot;https://github.com/darekb&quot;&gt;Darek Biedrzycki&lt;/a&gt;. Opowiedział o TDD w JavaScript z użyciem &lt;a href=&quot;http://karma-runner.github.io&quot;&gt;Karma&lt;/a&gt;, &lt;a href=&quot;http://jasmine.github.io/&quot;&gt;Jasmine&lt;/a&gt; oraz &lt;a href=&quot;http://phantomjs.org/&quot;&gt;Phantom.js&lt;/a&gt;.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Link do prelekcji: &lt;a href=&quot;https://www.youtube.com/watch?v=FTbKAC-4_JA&quot;&gt;https://www.youtube.com/watch?v=FTbKAC-4_JA&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Link do slajdów: &lt;a href=&quot;http://darekb.github.io/WarsawJs6/&quot;&gt;darekb.github.io/WarsawJs6/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p class=&quot;chapter-break&quot;&gt;&amp;bull;&lt;/p&gt;

&lt;h2 id=&quot;sponsorzy-spotkania&quot;&gt;Sponsorzy spotkania&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.facebook.com/Rebased/&quot;&gt;Rebased&lt;/a&gt;, &lt;a href=&quot;https://www.facebook.com/10Clouds/&quot;&gt;10Clouds&lt;/a&gt; - żetony w barze&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.facebook.com/cyfrowypolsat/&quot;&gt;Cyfrowy Polsat&lt;/a&gt; - materiały na YouTube&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.facebook.com/whitestreampl&quot;&gt;Whitestream&lt;/a&gt; - transmisja na żywo - &lt;a href=&quot;http://warsawjs.com/live&quot;&gt;warsawjs.com/live&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;ogłoszenia&quot;&gt;Ogłoszenia&lt;/h2&gt;

&lt;p&gt;Każdy z was może zostać prelegentem wystarczy wysłać maila na &lt;a href=&quot;mailto:kontakt@warsawjs.com&quot;&gt;kontakt@warsawjs.com&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Jeśli jednak chcielibyście poprowadzić krótką prezentację, wystarczy przyjść na spotkanie i po 3 prelekcjach zgłosić się do poprowadzenia lighting talka.&lt;/p&gt;

&lt;h2 id=&quot;zakończenia&quot;&gt;Zakończenia&lt;/h2&gt;

&lt;p&gt;Po część “oficjalnej” kto chciał ten dostał żeton, będący równowartością 10 pln,- w barze.&lt;/p&gt;

&lt;p&gt;Kolejka po napoje utrzymywała się kilkanaście minut.&lt;/p&gt;

&lt;p&gt;Gdy już każdy dostał co chciał rozpoczęła się druga część “barowa” w której to na luzie słuchacze wraz z prelegentami rozmawiali o wrażeniach ze spotkania, ale i nie tylko 😄&lt;/p&gt;

&lt;p&gt;Dziękuję serdecznie wszystkim za przybycie i zapraszam na kolejne spotkanie, które odbędzie się w środę 18 marca o 18:30, jak zwykle, w &lt;a href=&quot;http://panstwomiasto.pl/&quot;&gt;Państwomiasto&lt;/a&gt;.&lt;/p&gt;
</description>
            <pubDate>Tue, 10 Feb 2015 00:00:00 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2015/02/10/warsawjs-meetup-6.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2015/02/10/warsawjs-meetup-6.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/post-banner-warsawjs.jpg</image>
        </item>
        
        <item>
            <title>Hackathon: Static Showdown #2 (2015)</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;W miniony weekend brałem udział w hackathonie. Gdyby ktoś nie wiedział co to jest, to spieszę z wyjaśnieniem. Otóż, hackathon jest to inicjatywa której głównym celem jest napisanie aplikacji bądź gry w wyznaczonym przez organizatorów czasie.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/staticshowdown/staticshowdown.jpg&quot; itemprop=&quot;image&quot; alt=&quot;Baner promujący artykuł&quot; /&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;pomysł&quot;&gt;Pomysł&lt;/h2&gt;

&lt;p&gt;Miniony hackathon trwał 48 godzin - od &lt;em&gt;00:00:00 UTC&lt;/em&gt; z piątku na sobotę, do &lt;em&gt;23:59:59 UTC&lt;/em&gt; z niedzieli na poniedziałek.&lt;/p&gt;

&lt;p&gt;To już mój kolejny taki hackathon, podczas którego udało się stworzyć grę na przeglądarki komputerowe. Brałem udział w kilku hackathonach, np: DevCapms organizowany przez &lt;a href=&quot;http://devmeetings.pl&quot;&gt;DevMeetings&lt;/a&gt;, 2 razy w &lt;a href=&quot;http://nodeknockout.com/&quot;&gt;Node Knockout&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Miniony hackathon był organizowany przez ekipę z &lt;a href=&quot;http://2015.staticshowdown.com/&quot;&gt;Static Showdown&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;projekt&quot;&gt;Projekt&lt;/h2&gt;

&lt;p&gt;W projekcie uczestniczyły jeszcze dwie osoby: &lt;a href=&quot;http://kamilzaleski.com&quot;&gt;Kamil Załęski&lt;/a&gt; oraz &lt;a href=&quot;https://github.com/rootsher&quot;&gt;Konrad Kowalski&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Stworzyliśmy grę typu multi-player, do przetestowania tutaj: &lt;a href=&quot;https://ss15-dumplings.divshot.io/&quot;&gt;https://ss15-dumplings.divshot.io/&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Nasze oficjalne zgłoszenie gry jest dostępne pod adresem: &lt;a href=&quot;http://2015.staticshowdown.com/teams/dumplings&quot;&gt;2015.staticshowdown.com/teams/dumplings&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;technologie&quot;&gt;Technologie&lt;/h2&gt;

&lt;p&gt;Wykorzystaliśmy następujące technologie:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://phaser.io/&quot;&gt;Phaser.js&lt;/a&gt; - najlepszy framework do tworzenia gier&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://backbonejs.org/&quot;&gt;Backbone.js&lt;/a&gt; - nie wiem po co, ale wykorzystaliśmy…&lt;/li&gt;
  &lt;li&gt;Użytkowe: &lt;a href=&quot;https://lodash.com/&quot;&gt;Lodash&lt;/a&gt;, &lt;a href=&quot;http://jquery.com/&quot;&gt;jQuery&lt;/a&gt;, &lt;a href=&quot;https://github.com/stackp/promisejs&quot;&gt;Promise.js&lt;/a&gt;, &lt;a href=&quot;http://requirejs.org/&quot;&gt;Require.js&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;narzędzie &lt;a href=&quot;http://gulpjs.com/&quot;&gt;Gulp&lt;/a&gt; do ogarniania zadań projektowych&lt;/li&gt;
  &lt;li&gt;oraz bazę &lt;a href=&quot;https://www.firebase.com/&quot;&gt;Firebase&lt;/a&gt; idealną do zastosowań tymczasowych&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;pitch-video&quot;&gt;Pitch video&lt;/h2&gt;

&lt;p&gt;Po stworzeniu aplikacji zmontowałem krótki film dot. aplikacji. Do obejrzenia poniżej:&lt;/p&gt;

&lt;div class=&quot;youtube-lazy&quot; data-youtube-id=&quot;7lY7OxlA4v8&quot;&gt;&lt;/div&gt;

&lt;h2 id=&quot;nagrody&quot;&gt;Nagrody&lt;/h2&gt;

&lt;p&gt;Nagrody dla najlepszych są bardzo obfite i jest ich dużo, więc cień szansy jest, pewnie na jakąś smycz 😄&lt;/p&gt;
</description>
            <pubDate>Wed, 28 Jan 2015 00:00:00 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2015/01/28/hackathon-staticshowdown-2.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2015/01/28/hackathon-staticshowdown-2.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/staticshowdown/staticshowdown.jpg</image>
        </item>
        
        <item>
            <title>Vimium — plugin do Twojej przeglądarki</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Nawigacja kartą, a nawet całą przeglądarką za pomocą skrótów, które znamy z &lt;em&gt;Vima&lt;/em&gt;? Tak jest to możliwe! &lt;a href=&quot;https://github.com/philc/vimium&quot;&gt;Vimium&lt;/a&gt; - to o nim mówię. Plugin do przeglądarki Google Chrome na licencji MIT.&lt;/p&gt;

&lt;p&gt;Polecam obejrzeć prezentację możliwości: &lt;a href=&quot;https://www.youtube.com/watch?v=t67Sn0RGK54&quot;&gt;youtube.com/watch?v=t67Sn0RGK54&lt;/a&gt;. Autor pokazuje na prostym przykładzie zakupu książki na Amazinie jak to zrobić nie odrywając rąk od klawiatury. Posługuje się tylko skrótami jakie &lt;code class=&quot;highlighter-rouge&quot;&gt;Vimium&lt;/code&gt; udostępnia.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/vimium/vimium.jpg&quot; itemprop=&quot;image&quot; alt=&quot;Baner promujący artykuł&quot; /&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;nie-używam-google-chrome---co-teraz&quot;&gt;Nie używam Google Chrome - co teraz?&lt;/h2&gt;

&lt;p&gt;Plugin jest również dostępny na inne przeglądarki, jak &lt;strong&gt;Mozilla Firefox&lt;/strong&gt;. Link znajdziesz pod koniec artykułu. &lt;strong&gt;Opera&lt;/strong&gt; ze względu, że od jakiegoś czasu jest rozwijana w oparciu o Chromium, to możemy instalować te same paczki co w Google Chrome. Wystarczy zainstalować wtyczkę: “Download Chrome Extension”, która umożliwi dodanie przycisku “Dodaj do Opera” w sklepie &lt;a href=&quot;http://chrome.google.com/webstore&quot;&gt;chrome.google.com/webstore&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;dlaczego-polecam&quot;&gt;Dlaczego polecam?&lt;/h2&gt;

&lt;p&gt;Przeglądanie internetu za pomocą skrótów jest rewelacyjne, nie marnujesz czasu na np. otworzenie nowej karty w tylko korzystasz ze skrótu &lt;kbd&gt;ctrl+T&lt;/kbd&gt; i gotowe.&lt;/p&gt;

&lt;p&gt;Równie dobrze, zamykanie karty. Zamiast szukać małej ikonki do zamknięcia przeglądarki, następnie sięgnięcie ręką po myszkę i trafienie w ikonkę może być zastąpione prostym skrótem klawiaturowym &lt;kbd&gt;ctrl+w&lt;/kbd&gt;. I tak przykładów można wymieniać.&lt;/p&gt;

&lt;p&gt;Kolejnym bardzo częstym zabiegiem podczas czytania artykułów w sieci jest skrolowanie. Za pomocą myszki pomoże kółeczko. Co jeśli nie chcemy używać myszki, albo jej po prostu nie mamy? Gdy ktoś korzysta z przenośnych komputerów jest w stanie zastąpić myszkę touchpadem. Nie każdemu odpowiada skrolowanie poprzez ten wynalazek, dlatego też można w ostateczności przewijać strzałkami klawiatury. Na MacBookach strzałeczki, są na skraju klawiatury i korzystanie z nich nie jest wygodniejsze niż wciskanie klawiszy z literkami.&lt;/p&gt;

&lt;p&gt;Gdy już mamy zainstalowany plugin, to przewijanie do dołu (o pół ekranu) realizuje za pomocą klawisza &lt;kbd&gt;d&lt;/kbd&gt; a do góry &lt;em&gt;u&lt;/em&gt;. Dlatego też ten plugin mi się podoba. Nie muszę odrywać rąk z klawiatury, a jednak mogę w pełni korzystać z przeglądarki.&lt;/p&gt;

&lt;h2 id=&quot;proste-i-wygodne&quot;&gt;Proste i wygodne&lt;/h2&gt;

&lt;p&gt;Problem ze skrótami jaki znalazłem objawia się gdy w przeglądarce otworzymy np. plik pdf. Wtedy skróty nie działają. Proces programu obsługującego pliki pdf przejmuje kontrolę nad obsługą klawiatury.&lt;/p&gt;

&lt;h2 id=&quot;bibliografia&quot;&gt;Bibliografia&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;Strona główna projektu to: &lt;a href=&quot;http://vimium.github.io/&quot;&gt;vimium.github.io/&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Wersja na Firefox: &lt;a href=&quot;https://addons.mozilla.org/pl/firefox/addon/vimium/&quot;&gt;https://addons.mozilla.org/pl/firefox/addon/vimium/&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Repozytorium pluginu na Google Chrome: &lt;a href=&quot;https://github.com/philc/vimium&quot;&gt;github.com/philc/vimium&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Repozytorium pluginu na Firefox: &lt;a href=&quot;https://code.google.com/p/vimium-firefox/&quot;&gt;https://code.google.com/p/vimium-firefox/&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Repozytorium pluginu na Safari: &lt;a href=&quot;https://github.com/guyht/vimari&quot;&gt;github.com/guyht/vimari&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
            <pubDate>Fri, 23 Jan 2015 00:00:00 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2015/01/23/vimium-plugin-do-twojej-przegladarki.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2015/01/23/vimium-plugin-do-twojej-przegladarki.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/vimium/vimium.jpg</image>
        </item>
        
        <item>
            <title>Divshot vs GitHub — jako hosting do projektów webowych</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Od kilku dni testuje &lt;a href=&quot;http://divshot.com/&quot;&gt;Divshot&lt;/a&gt;. Narzędzie, które zostanie wykorzystane przy deploymencie aplikacji podczas zbliżającego się &lt;abbr title=&quot;hackathon&quot;&gt;hackathon&lt;/abbr&gt;-u &lt;a href=&quot;http://2015.staticshowdown.com&quot;&gt;2015.staticshowdown.com&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Deployment moich czysto webowych aplikacji polegał na wykorzystaniu GitHub-a. Czyżby czas na zmianę?&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/github/github-divshot.jpg&quot; itemprop=&quot;image&quot; alt=&quot;Baner promujący artykuł&quot; /&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;github&quot;&gt;GitHub&lt;/h2&gt;

&lt;p&gt;Często do swoich aplikacji wykorzystuje &lt;a href=&quot;https://pages.github.com/&quot;&gt;GitHub Pages&lt;/a&gt; aby kod aplikacji upublicznić.&lt;/p&gt;

&lt;p&gt;Deployment aplikacji jest bardzo prosty wystarczy wgrać zmiany na &lt;em&gt;origin/gh-pages&lt;/em&gt; i po chwili (Cache GitHub-a) mamy naszą aplikację na tzw. produkcji.&lt;/p&gt;

&lt;h2 id=&quot;divshot&quot;&gt;Divshot&lt;/h2&gt;

&lt;p&gt;Ciekawość mnie zżera na czym może polegać &lt;em&gt;hosting Front-end&lt;/em&gt;-owy. Przecież bez hosting silnie wiąże się częścią aplikacji po stronie serwera. Zobaczmy czym się charakteryzuje taki hosting.&lt;/p&gt;

&lt;h2 id=&quot;wady-i-zalety&quot;&gt;Wady i zalety&lt;/h2&gt;

&lt;table class=&quot;table table-bordered table-condensed table-striped table-hover&quot;&gt;
    &lt;thead&gt;
    &lt;tr&gt;
        &lt;th&gt;&lt;/th&gt;
        &lt;th&gt;GitHub&lt;/th&gt;
        &lt;th&gt;Divshot&lt;/th&gt;
    &lt;/tr&gt;
    &lt;/thead&gt;
    &lt;tbody&gt;
    &lt;tr&gt;
        &lt;td&gt;
            Hosting z 3 trybami dostępu: dla developera, staging (czyli
            taka preprodukcja) oraz produkcja
        &lt;/td&gt;
        &lt;td&gt;-&lt;/td&gt;
        &lt;td&gt;+&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;Blokowanie dostępu za pomocą HTTP Authentication&lt;/td&gt;
        &lt;td&gt;+ (poprzez plik w projekcie)&lt;/td&gt;
        &lt;td&gt;+ (wyklikujemy przy danej trybie dostępu lub &lt;code&gt;divshot
            protect [env] [user:pass]&lt;/code&gt;)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;Automatycznie tworzy się subdomena&lt;/td&gt;
        &lt;td&gt;+ (github.io)&lt;/td&gt;
        &lt;td&gt;+ (divshot.io)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;Zarządzanie wersjami&lt;/td&gt;
        &lt;td&gt;+ (Tak jak zarządzanie rewizjami w projekcie. Niby jest, ale ma bardzo mocny wpływ na kod w repozytorium.)&lt;/td&gt;
        &lt;td&gt;+ (Bardzo ładne zarządzani releasami. Możliwość rollback-a do poprzedniej wersji.)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;Możliwości konfiguracji projektu&lt;/td&gt;
        &lt;td&gt;+ (_config.yml)&lt;/td&gt;
        &lt;td&gt;+ (divshot.json)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;Potrzebny dodatkowy soft&lt;/td&gt;
        &lt;td&gt;+ (Tylko Git)&lt;/td&gt;
        &lt;td&gt;- (node, &lt;em&gt;npm&lt;/em&gt;, divshot-cli)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;Dodatkowe gałęzie w projekcie&lt;/td&gt;
        &lt;td&gt;- (Branch: &lt;em&gt;gh-pages&lt;/em&gt;)&lt;/td&gt;
        &lt;td&gt;+ (Nic nie trzeba)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;Customowa domena&lt;/td&gt;
        &lt;td&gt;+ (Plik: &lt;em&gt;CNAME&lt;/em&gt;)&lt;/td&gt;
        &lt;td&gt;+ (Polecenie: &lt;em&gt;divshot domains:add www.example.net&lt;/em&gt;)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;URL z poprzednimi wersjami&lt;/td&gt;
        &lt;td&gt;-&lt;/td&gt;
        &lt;td&gt;+ (Np.: &lt;em&gt;v25.my-app-name.production.divshot.io&lt;/em&gt;)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;Włączony HTTPS&lt;/td&gt;
        &lt;td&gt;+&lt;/td&gt;
        &lt;td&gt;- (Trzeba dokupić)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;Współpracownicy&lt;/td&gt;
        &lt;td&gt;+ (Bez limitu)&lt;/td&gt;
        &lt;td&gt;+ (Bez limitu)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;Webhooks&lt;/td&gt;
        &lt;td&gt;+ (Polecenie: &lt;em&gt;divshot hooks:add http://example.com/my/hook&lt;/em&gt;)&lt;/td&gt;
        &lt;td&gt;+ (Długa lista predefiniowanych)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;Jekyll&lt;/td&gt;
        &lt;td&gt;+&lt;/td&gt;
        &lt;td&gt;+&lt;/td&gt;
    &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;

&lt;h2 id=&quot;podsumowanie&quot;&gt;Podsumowanie&lt;/h2&gt;

&lt;p&gt;Wygląda to tak, jeśli chcemy wypchnąć nasz projekt w świat, aby sobie leżał bez większego nakładu pracy w jego utrzymanie, to &lt;strong&gt;GitHub Pages&lt;/strong&gt; będzie lepszym rozwiązaniem.&lt;/p&gt;

&lt;p&gt;Jeśli jednak będziemy rozwijać ten projekt, albo jest on dla nas bardzo cenny z jakiegoś punktu widzenia i martwi nas jaka wersja jest obecnie na produkcji, a jaka na stagingu, to lepszym rozwiązaniem jest &lt;strong&gt;Divshot&lt;/strong&gt;.&lt;/p&gt;

&lt;h2 id=&quot;bibliografia&quot;&gt;Bibliografia&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;GitHub
    &lt;ul&gt;
      &lt;li&gt;&lt;a href=&quot;https://github.com/&quot;&gt;github.com&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;https://help.github.com&quot;&gt;help.github.com&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Divshot
    &lt;ul&gt;
      &lt;li&gt;&lt;a href=&quot;http://divshot.com/&quot;&gt;divshot.com&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;http://docs.divshot.com/guides/getting-started&quot;&gt;docs.divshot.com/guides/getting-started&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;
</description>
            <pubDate>Tue, 20 Jan 2015 00:00:00 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2015/01/20/divshot-vs-github-jako-hosting-do-projektow-webowych.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2015/01/20/divshot-vs-github-jako-hosting-do-projektow-webowych.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/github/github-divshot.jpg</image>
        </item>
        
        <item>
            <title>Narzędzia Świata: pokemon-picker</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Jaka radość we mnie się pojawiła, kiedy zauważyłem w dniu wczorajszy w późnych godzinach nocnych pierwszą prośbę o zaakceptowanie zmian w projekcie: &lt;a href=&quot;https://github.com/piecioshka/pokemon-picker&quot;&gt;pokemon-picker&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;…a wszystko to, dzięki mojemu lightning-owi podczas &lt;a href=&quot;https://www.facebook.com/warsawjs&quot;&gt;WarsawJS&lt;/a&gt; &lt;a href=&quot;https://www.meetup.com/WarsawJS/events/219535591/&quot;&gt;Meetup #5&lt;/a&gt;. Przynajmniej tak mi się wydaje! 😄&lt;/p&gt;

&lt;p&gt;Developerem zgłaszającym był mój kolega &lt;a href=&quot;https://github.com/adamminiuk&quot;&gt;@adamminiuk&lt;/a&gt;.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/post-banner-narzedzia-swiata-pokemon-picker.png&quot; itemprop=&quot;image&quot; alt=&quot;Baner promujący artykuł&quot; /&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;ale-co-to-jest&quot;&gt;Ale co to jest?&lt;/h2&gt;

&lt;p&gt;Spieszę z wyjaśnieniem. Dosyć często kiedy do głowy wpadnie mi pomysł na projekt, czy to jakieś narzędzie, czy ciekawą grę, to mam problem z nazewnictwem…&lt;/p&gt;

&lt;p&gt;Postanowiłem więc, napisać projekt który będzie mi generował nazwę do innych. Chciałem, żeby to był jakiś “wybieracz” z wcześniej zdefiniowanej listy nazw, które akceptuje. Nie chciałem, żeby mi doklejał spółgłoski do samogłosek i w ten sposób generował jakąś dziwną nazwę.&lt;/p&gt;

&lt;p&gt;W stylu:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;Azubela&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;Pakobywa&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Chciałem, żeby to były nazwy, które z czymś mi się kojarzą, a że w dzieciństwie się oglądało to teraz można wykorzystać ten czas spędzony przed telewizorem.&lt;/p&gt;

&lt;h2 id=&quot;użycie&quot;&gt;Użycie&lt;/h2&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# install globally&lt;/span&gt;
npm &lt;span class=&quot;nb&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-g&lt;/span&gt; pokemon-picker

&lt;span class=&quot;c&quot;&gt;# choose random pokemon&lt;/span&gt;
pokemon-picker
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Ostatnie polecenie powinno zwrócić coś w stylu:&lt;/p&gt;

&lt;div class=&quot;language-js highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;nl&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'Talonflame'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;types&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'Fire'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'Flying'&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;],&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;index&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;672&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;podsumowanie&quot;&gt;Podsumowanie&lt;/h2&gt;

&lt;p&gt;Warto chwalić się pomysłami, bo społeczność czuwa i nie wiadomo kiedy przyjdzie taki moment, w którym dostaniesz wsparcie od obcych osób.&lt;/p&gt;
</description>
            <pubDate>Mon, 19 Jan 2015 00:00:00 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2015/01/19/narzedzia-swiata-pokemon-picker.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2015/01/19/narzedzia-swiata-pokemon-picker.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/post-banner-narzedzia-swiata-pokemon-picker.png</image>
        </item>
        
        <item>
            <title>WRUG styczniowy o rrd-tool, sztuce i organizowaniu projektów</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Dziś wybrałem się na kolejny w tym tygodniu event, a mianowicie &lt;a href=&quot;http://wrug.eu/&quot;&gt;WRUG&lt;/a&gt;.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/wrug/wrug-logo.jpeg&quot; alt=&quot;&quot; /&gt;

    &lt;figcaption&gt;
        &lt;a href=&quot;https://www.meetup.com/Warsaw-Ruby-Users-Group-WRUG/&quot;&gt;Warsaw Ruby Users Group (WRUG)&lt;/a&gt;
    &lt;/figcaption&gt;

&lt;/figure&gt;

&lt;h2 id=&quot;talk-1-rrdtool&quot;&gt;Talk #1: RRDTool&lt;/h2&gt;

&lt;p&gt;Pierwsza prelekcja nt. RRD (Round Robin Database) czyli o bazie danych która się nie rozszerza. Jest sztywna liczba zadeklarowanych komórek w które można wprowadzić dane, a kiedy danych będzie więcej niż jest miejsca w bazie danych, każda kolejna wartość nadpisze te wprowadzone na samym początku.&lt;/p&gt;

&lt;p&gt;Dla mnie mechanizm tej bazy jest bardzo podobny do kolejki FIFO. Czyli pierwszy element który zostanie zapisany, zostaje wyrzucony (zastąpiony) danymi na końcu, tj. kiedy baza już będzie pełna.&lt;/p&gt;

&lt;div class=&quot;clearfix&quot;&gt;&lt;/div&gt;

&lt;p&gt;Prezentację poprowadził Kamil “y3ti” Grabowski z &lt;a href=&quot;https://www.facebook.com/Rebased/&quot;&gt;Rebased&lt;/a&gt;.&lt;/p&gt;

&lt;h5 id=&quot;więcej-nt-rrdtool&quot;&gt;Więcej nt. RRDTool&lt;/h5&gt;

&lt;ul&gt;
  &lt;li&gt;Oryginalna prezentacja: &lt;a href=&quot;http://www.slideshare.net/y3ti/rrdtool-ruby-dsl-rrdffi&quot;&gt;slideshare.net/y3ti/rrdtool-ruby-dsl-rrdffi&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Strona domowa: &lt;a href=&quot;http://oss.oetiker.ch/rrdtool/&quot;&gt;oss.oetiker.ch/rrdtool/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p class=&quot;chapter-break&quot;&gt;&amp;bull;&lt;/p&gt;

&lt;h2 id=&quot;talk-2-sztuka-w-programowaniu&quot;&gt;Talk #2: Sztuka w programowaniu&lt;/h2&gt;

&lt;p&gt;To był mój pierwszy talk o sztuce w programowaniu jaki dane mi było wysłuchać. Nigdy nie sądziłem, że tak można myśleć o programowaniu jak o sztuce.&lt;/p&gt;

&lt;p&gt;Marta przedstawiła, że w 2004 roku, ktoś wpadł na pomysł wpuszczenia całego kodu jądra linux-a do syntezatora mowy. Gdyby ktoś chciał wówczas przesłuchać całego kodu napisanego w C oraz w Perlu musiałby spędzić około 2 lata na tym 😄&lt;/p&gt;

&lt;p&gt;Dodatkowo dowiedzieliśmy się o kilku językach, które &lt;em&gt;nie mają&lt;/em&gt; zastosowania komercyjnego. Wśród nich jest tzw. &lt;a href=&quot;https://pl.wikipedia.org/wiki/Brainfuck&quot;&gt;Brainfuck&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Prezentację poprowadziła Marta “ameba” Paciorkowska z &lt;a href=&quot;http://3ofcoins.net/&quot;&gt;3ofcoins&lt;/a&gt;.&lt;/p&gt;

&lt;p class=&quot;chapter-break&quot;&gt;&amp;bull;&lt;/p&gt;

&lt;h2 id=&quot;talk-3-organizacja-projektów-informatycznych&quot;&gt;Talk #3: Organizacja projektów informatycznych&lt;/h2&gt;

&lt;p&gt;Ostatni talk na spotkaniu dotyczył prowadzenia projektów. Jarek zaczął omawiać od wskazywania błędów w projekcie &lt;a href=&quot;https://github.com/discourse/discourse&quot;&gt;github.com/discourse/discourse&lt;/a&gt;, a dokładnie, struktura katalogów była bardzo słaba. Wszelkie warstwy aplikacji były wymieszane.&lt;/p&gt;

&lt;p&gt;Najciekawszym wg mnie był slajd dotyczący tworzenia nowego projektu:&lt;/p&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;Jeśli naprawdę jesteś przekonana/przekonany, że masz świetny pomysł, to:
 - Wydziel osobne repozytorium
 - &quot;Zaprogramój&quot; swój pomysł
 - Dokładnie udokumentuj przynajmniej cały zewnętrzny interfejs tego programu
 - Udostępnij projekt jako Open Source
 - Przekonaj trzy niepodległe Ci osoby do jego używania
 - Przekonaj się, że nikt nie chce tego używać
 - Usuń to repozytorium i ogarnij się.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Prezentację poprowadził Jarosław “Sztywny” Rzeszótko z &lt;a href=&quot;http://www.holtzbrinck-ventures.com/&quot;&gt;Holtzbrinck Ventures&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;podsumowanie&quot;&gt;Podsumowanie&lt;/h2&gt;

&lt;p&gt;Kolejne spotkanie WRUG było dla mnie bardzo pozytywne. Dowiedziałem się, dużo ciekawych rzeczy nt. RRDTool oraz prowadzenia projektów (utrzymania, czy też zarządzania). Dodatkowo, Marta zaszczepiła w mojej głowie myśl, że programowanie to nie tylko pisanie kodu, ale też swego rodzaju sztuka.&lt;/p&gt;

&lt;p&gt;Więcej znajdziesz tutaj: &lt;a href=&quot;http://wrug.eu/2015/01/11/spotkanie-styczniowe/&quot;&gt;wrug.eu/2015/01/11/spotkanie-styczniowe/&lt;/a&gt;&lt;/p&gt;
</description>
            <pubDate>Wed, 14 Jan 2015 00:00:00 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2015/01/14/wrug-spotkanie-styczniowe-o-rrd-tool-sztuce-i-organizowaniu-projektow.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2015/01/14/wrug-spotkanie-styczniowe-o-rrd-tool-sztuce-i-organizowaniu-projektow.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/wrug/wrug-logo-526x275.jpg</image>
        </item>
        
        <item>
            <title>WarsawJS Meetup #5</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;W najbliższy piątek, 16 stycznia, odbędzie się WarsawJS Meetup #5.&lt;/p&gt;

&lt;p&gt;Miejsce to jak zwykle Państwomiasto ul. Andersa 29. Zaczynamy o 18:30!&lt;/p&gt;

&lt;!-- &lt;figure&gt;
    &lt;a href=&quot;https://www.meetup.com/WarsawJS/&quot;&gt;
        &lt;img src=&quot;/assets/images/posts/post-banner-warsawjs.jpg&quot;
             alt=&quot;WarsawJS&quot;/&gt;
    &lt;/a&gt;
&lt;/figure&gt; --&gt;

&lt;h2 id=&quot;invitation&quot;&gt;Invitation&lt;/h2&gt;

&lt;p&gt;Zapraszam w imieniu organizatorów WarsawJS.&lt;/p&gt;

&lt;div class=&quot;youtube-lazy&quot; data-youtube-id=&quot;BDznkMEjcbQ&quot;&gt;&lt;/div&gt;

&lt;p&gt;Zapisujcie się na:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;naszym Fanpage: &lt;a href=&quot;https://www.facebook.com/events/1514722635461938/&quot;&gt;facebook.com/events/1514722635461938/&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;oraz na Meetup &lt;a href=&quot;https://www.meetup.com/WarsawJS/events/219535591/&quot;&gt;meetup.com/WarsawJS/events/219535591/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Do zobaczenia w piątek!&lt;/p&gt;

&lt;p class=&quot;chapter-break&quot;&gt;&amp;bull;&lt;/p&gt;

&lt;h2 id=&quot;talk-1-co-potrafi-svg-dariusz-biedrzycki&quot;&gt;Talk #1: Co potrafi SVG? &lt;small&gt;Dariusz Biedrzycki&lt;/small&gt;&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;Link do prelekcji: &lt;a href=&quot;https://www.youtube.com/watch?v=n8O7l8zZ4Mg&quot;&gt;https://www.youtube.com/watch?v=n8O7l8zZ4Mg&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p class=&quot;chapter-break&quot;&gt;&amp;bull;&lt;/p&gt;

&lt;h2 id=&quot;talk-2-games-development-for-smart-tv-kamil-kiełbasa&quot;&gt;Talk #2: Games development for Smart TV &lt;small&gt;Kamil Kiełbasa&lt;/small&gt;&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;Link do prelekcji: &lt;a href=&quot;https://www.youtube.com/watch?v=07fgNHVdF3A&quot;&gt;https://www.youtube.com/watch?v=07fgNHVdF3A&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p class=&quot;chapter-break&quot;&gt;&amp;bull;&lt;/p&gt;

&lt;h2 id=&quot;talk-3-functional-and-reactive-programming-techniques-patterns-and-tools-on-the-front-end-en-piotr-klibert&quot;&gt;Talk #3: Functional and reactive programming techniques, patterns and tools on the Front-end [EN] &lt;small&gt;Piotr Klibert&lt;/small&gt;&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;Link do prelekcji: &lt;a href=&quot;https://www.youtube.com/watch?v=m09RWtt5nd8&quot;&gt;https://www.youtube.com/watch?v=m09RWtt5nd8&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p class=&quot;chapter-break&quot;&gt;&amp;bull;&lt;/p&gt;

&lt;h2 id=&quot;aktualizacja&quot;&gt;&lt;mark&gt;[Aktualizacja]&lt;/mark&gt;&lt;/h2&gt;

&lt;p&gt;Dziękuję serdecznie wszystkim za przybycie. Zapraszam do galerii zdjęć:&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://www.meetup.com/WarsawJS/photos/25852054/&quot;&gt;meetup.com/WarsawJS/photos/25852054/&lt;/a&gt;&lt;/p&gt;
</description>
            <pubDate>Tue, 13 Jan 2015 00:00:00 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2015/01/13/warsawjs-meetup-5.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2015/01/13/warsawjs-meetup-5.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/post-banner-warsawjs.jpg</image>
        </item>
        
        <item>
            <title>Golang Warsaw #2</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Dziś odbyło się drugie spotkanie &lt;a href=&quot;https://www.meetup.com/Golang-Warsaw/&quot;&gt;Golang Warsaw&lt;/a&gt;. Jest to nowa organizacja w naszym mieście (dopiero drugie spotkanie w systemie comiesięcznym). Wiodącym językiem &lt;a href=&quot;https://golang.org/&quot;&gt;Go&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Będzie to moje pierwsze spotkanie z ludźmi pracującym w tym języku. Nie ukrywam, że chciałbym dowiedzieć się czegoś o tym nowym, tak mocno reklamowanym języku.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Godzina 18:15 - Zaczynamy!&lt;/strong&gt;&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/golang-warsaw/golang-warsaw.jpg&quot; itemprop=&quot;image&quot; alt=&quot;Baner promujący artykuł&quot; /&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;talk-1-testowanie-w-go&quot;&gt;Talk #1: Testowanie w Go&lt;/h2&gt;

&lt;p&gt;Pierwsza prelekcja - Tomasz Grodzki (&lt;a href=&quot;https://github.com/tg&quot;&gt;github.com/tg&lt;/a&gt;) opowiedział o testowaniu aplikacji napisanym w Go. Miałem nadzieje, że dowiem się czegoś o testowaniu oraz debugowaniu aplikacji.&lt;/p&gt;

&lt;p&gt;Tomek powiedział, że w Go można łatwo pisać aplikację na wielu procesorach, ze względu na to, że ma dzielone wątki. Go ma wiele wbudowanych rzeczy, m. in. biblioteka pomocna w testach (&lt;em&gt;testing&lt;/em&gt;).&lt;/p&gt;

&lt;h3 id=&quot;testowanie-kodu-napisanego-w-go&quot;&gt;Testowanie kodu napisanego w Go&lt;/h3&gt;

&lt;p&gt;Pisanie pierwszego testu: do danego pliku dodajemy na końcu: &lt;code class=&quot;highlighter-rouge&quot;&gt;_test.go&lt;/code&gt;.&lt;/p&gt;

&lt;h4 id=&quot;pierwsza-metoda&quot;&gt;Pierwsza metoda:&lt;/h4&gt;

&lt;div class=&quot;language-go highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;package&lt;/span&gt;&lt;span class=&quot;x&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;party&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;

&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;x&quot;&gt; &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;testing&quot;&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;

&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;func&lt;/span&gt;&lt;span class=&quot;x&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;TestBeer&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;x&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;x&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;testing&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;x&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;x&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;FridgeContains&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;beer&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;x&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Fatal&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;expected some cold beer&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h4 id=&quot;druga-metoda-from-outside&quot;&gt;Druga metoda (from outside):&lt;/h4&gt;

&lt;div class=&quot;language-go highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;package&lt;/span&gt;&lt;span class=&quot;x&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;part_test&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;

&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;import&lt;/span&gt;&lt;span class=&quot;x&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;testing&quot;&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;rihanna.com/party&quot;&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;

&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;func&lt;/span&gt;&lt;span class=&quot;x&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;TestBeer&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;x&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;testing&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;T&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;x&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;x&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;party&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;FridgeContains&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;beer&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;x&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Fatal&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;expected some cold beer&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;uruchomienie-testów&quot;&gt;Uruchomienie testów&lt;/h3&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;go &lt;span class=&quot;nb&quot;&gt;test&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;.&lt;/span&gt;
go &lt;span class=&quot;nb&quot;&gt;test &lt;/span&gt;rihanna.com/party
go &lt;span class=&quot;nb&quot;&gt;test&lt;/span&gt; ./... &lt;span class=&quot;c&quot;&gt;# odpala wszystkie testy w głąb&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;testing.T - nasze magiczne ‘t’. Biblioteka pomocna w testach. Zawiera mnóstwo metod tj: Error, Errorf, Fail, FailNow, Failed, Fatal, Fatalf, Log, Logf, Parallel, Skip, SkipNow, Skipf, Skipped.&lt;/p&gt;

&lt;p&gt;Logi pokazują się tylko w przypadku kiedy dany test nie przeszedł. Jeśli uruchomimy testy w parametrem verbose, pokażemy wszystkie logi (nawet w tych testach które przeszły).&lt;/p&gt;

&lt;p&gt;Testy z &lt;em&gt;parallel&lt;/em&gt; będą się uruchamiały jednocześnie.&lt;/p&gt;

&lt;h3 id=&quot;examples---część-testu&quot;&gt;Examples - część testu&lt;/h3&gt;

&lt;div class=&quot;language-go highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;func&lt;/span&gt;&lt;span class=&quot;x&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ExampleHandsUp&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;&lt;span class=&quot;x&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;fmt&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;PrintLn&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;HandsUp&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;o o o&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;c&quot;&gt;// Output:&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;c&quot;&gt;// \o/ \o/ \o/&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;

&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;func&lt;/span&gt;&lt;span class=&quot;x&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Example&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;&lt;span class=&quot;x&quot;&gt; &lt;/span&gt;&lt;span class=&quot;c&quot;&gt;// package&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;func&lt;/span&gt;&lt;span class=&quot;x&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ExampleF&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;&lt;span class=&quot;x&quot;&gt; &lt;/span&gt;&lt;span class=&quot;c&quot;&gt;// function&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;func&lt;/span&gt;&lt;span class=&quot;x&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ExampleT&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;&lt;span class=&quot;x&quot;&gt; &lt;/span&gt;&lt;span class=&quot;c&quot;&gt;// type&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;func&lt;/span&gt;&lt;span class=&quot;x&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;ExampleT_M&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;&lt;span class=&quot;x&quot;&gt; &lt;/span&gt;&lt;span class=&quot;c&quot;&gt;// method&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;

&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;func&lt;/span&gt;&lt;span class=&quot;x&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Example&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;_xyz&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;&lt;span class=&quot;x&quot;&gt; &lt;/span&gt;&lt;span class=&quot;c&quot;&gt;// more...&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;dokumentacja&quot;&gt;Dokumentacja&lt;/h3&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;go doc &lt;span class=&quot;nt&quot;&gt;-ex&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;true&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;c&quot;&gt;# budowanie dokumentacji&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Narzędzie to potrafi postawić webserwer oraz wygenerować dokumentację HTML.&lt;/p&gt;

&lt;h3 id=&quot;trzeci-rodzaj-testów-to-benchmarks&quot;&gt;Trzeci rodzaj testów to benchmarks.&lt;/h3&gt;

&lt;div class=&quot;language-go highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;func&lt;/span&gt;&lt;span class=&quot;x&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;BenchmarkHeadSpin&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;x&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;testing&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;B&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;x&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;k&quot;&gt;for&lt;/span&gt;&lt;span class=&quot;x&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;x&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:=&lt;/span&gt;&lt;span class=&quot;x&quot;&gt; &lt;/span&gt;&lt;span class=&quot;m&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;x&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;x&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;x&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;N&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;x&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;++&lt;/span&gt;&lt;span class=&quot;x&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;HeadSpin&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Uruchamiamy je za pomocą:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;go &lt;span class=&quot;nb&quot;&gt;test&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-bench&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;.&lt;/span&gt; &lt;span class=&quot;c&quot;&gt;# ta kropka to wyrażenie regularne&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;go test&lt;/code&gt; sam sobie dopiera ile iteracji ma zrobić w ciągu zadanego okresu czasowego. Parametr &lt;em&gt;benchtime&lt;/em&gt; zmienia ten okres czasu.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;testing.B = testing.T + (ReportAllocs, ResetTimer, RunParallel, SetBytes, SetParallelism, StartTimer, StopTimer)&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;ReportAllocs - raportuje alokację pamięci&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;więcej-kontroli&quot;&gt;Więcej kontroli&lt;/h3&gt;

&lt;div class=&quot;language-go highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;// since go 1.4&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;func&lt;/span&gt;&lt;span class=&quot;x&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;TestMain&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;x&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;testing&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;M&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;x&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;os&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Exit&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Run&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;())&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Tyle odnośnie podstaw testowania&lt;/p&gt;

&lt;p&gt;Jeśli do &lt;code class=&quot;highlighter-rouge&quot;&gt;go test&lt;/code&gt; przekażesz flagę, której &lt;code class=&quot;highlighter-rouge&quot;&gt;go test&lt;/code&gt; nie rozpozna przekaże te parametry do &lt;code class=&quot;highlighter-rouge&quot;&gt;MainTest&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;W bibliotece standardowej mamy kilka rzeczy, które ułatwiają testowanie:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;net/httptest&lt;/li&gt;
  &lt;li&gt;testing/iotest - do testowania wejścia / wyjścia&lt;/li&gt;
  &lt;li&gt;testing/quick - do testowania: generuje losowe argumenty naszej funkcji&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;net--httptest&quot;&gt;net / httptest&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;httptest.ResponseRecorder&lt;/li&gt;
  &lt;li&gt;httptest.Server - automatycznie nasłuchuje na localhost z wybranym przez system porcie, oraz zwraca nam URL do siebie&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;testing--iotest&quot;&gt;testing / iotest&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;iotest.DataErrReader&lt;/li&gt;
  &lt;li&gt;iotest.TimeoutReader - za drugim razem gdy będzie czytał, zwróci iotest.ErrTimeout&lt;/li&gt;
  &lt;li&gt;HalfRead - czyta dane do połowy - pomocne do testowania, co się stanie, jeśli nasza fn dostanie mniej danych niż się spodziewa&lt;/li&gt;
  &lt;li&gt;OneByteReader - czy nasz fn radzi sobie ze skrajnymi wartościami&lt;/li&gt;
  &lt;li&gt;TruncateWrite - zapisze przekazaną liczbę bajtów, ale poinformuje, że zapisał komplet danych - taka oszukańcza fn 😄&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;testing--quick&quot;&gt;testing / quick&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Black box testing&lt;/li&gt;
  &lt;li&gt;Generuje losowe ciągi znaków&lt;/li&gt;
  &lt;li&gt;quickCheck and quick.CheckEqual&lt;/li&gt;
  &lt;li&gt;inspirowana QuickCheck z Haskell-a&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Reflect - dość skomplikowana biblioteka do losowania wartości - więcej &lt;a href=&quot;http://golang.org/pkg/reflect/&quot;&gt;golang.org/pkg/reflect/&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;quickconfig&quot;&gt;quick.Config&lt;/h3&gt;

&lt;div class=&quot;language-go highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;type&lt;/span&gt;&lt;span class=&quot;x&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Config&lt;/span&gt;&lt;span class=&quot;x&quot;&gt; &lt;/span&gt;&lt;span class=&quot;k&quot;&gt;struct&lt;/span&gt;&lt;span class=&quot;x&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;c&quot;&gt;// Set max number of iterations&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;MaxCount&lt;/span&gt;&lt;span class=&quot;x&quot;&gt; &lt;/span&gt;&lt;span class=&quot;kt&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;

    &lt;/span&gt;&lt;span class=&quot;c&quot;&gt;// Scale max number of iterations&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;MaxCountScale&lt;/span&gt;&lt;span class=&quot;x&quot;&gt; &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;flaot64&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;

    &lt;/span&gt;&lt;span class=&quot;c&quot;&gt;// Source of random number&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Rand&lt;/span&gt;&lt;span class=&quot;x&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;rand&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Rand&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;

    &lt;/span&gt;&lt;span class=&quot;c&quot;&gt;// Generator of values&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Values&lt;/span&gt;&lt;span class=&quot;x&quot;&gt; &lt;/span&gt;&lt;span class=&quot;k&quot;&gt;func&lt;/span&gt;&lt;span class=&quot;x&quot;&gt; &lt;/span&gt;&lt;span class=&quot;p&quot;&gt;([]&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;reflect&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Value&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;x&quot;&gt; &lt;/span&gt;&lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;rand&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;Rand&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;x&quot;&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;polecane-narzędzia&quot;&gt;Polecane narzędzia&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;go vet&lt;/code&gt; - sprawdza popularne błędy w kodzie&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;-race flag&lt;/code&gt; - stara się wykryć kiedy używamy zmienny z różnych &lt;em&gt;go routings&lt;/em&gt;&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;Go&lt;/em&gt; bardzo lubi interfejsy, powinniśmy korzystać z nich, ponieważ lepiej się potem testuje&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;profile&quot;&gt;Profile&lt;/h3&gt;

&lt;p&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;go test&lt;/code&gt; pozwala zapisywać wynik do pliku.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;go test -covertprofile cover.out&lt;/li&gt;
  &lt;li&gt;go test -cpuprofile cpu.out&lt;/li&gt;
  &lt;li&gt;go test -memprofile mem.out&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nie działa to na OSX: &lt;a href=&quot;https://github.com/golang/go/issues/6047&quot;&gt;github.com/golang/go/issues/6047&lt;/a&gt;&lt;/p&gt;

&lt;h3 id=&quot;pokrycie-kodu&quot;&gt;Pokrycie kodu&lt;/h3&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;go &lt;span class=&quot;nb&quot;&gt;test&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-cover&lt;/span&gt;

&lt;span class=&quot;c&quot;&gt;# prezentacja na stronie internetowej&lt;/span&gt;
go &lt;span class=&quot;nb&quot;&gt;test&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-coverprofile&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;c.pro
go &lt;span class=&quot;nb&quot;&gt;test &lt;/span&gt;cover &lt;span class=&quot;nt&quot;&gt;-html&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;=&lt;/span&gt;c.pro
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;referencje&quot;&gt;Referencje&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;golang.org/pkg/testing&lt;/li&gt;
  &lt;li&gt;blog.golang.org&lt;/li&gt;
  &lt;li&gt;go help test&lt;/li&gt;
  &lt;li&gt;go help testflag&lt;/li&gt;
&lt;/ul&gt;

&lt;p class=&quot;chapter-break&quot;&gt;&amp;bull;&lt;/p&gt;

&lt;h2 id=&quot;talk-2&quot;&gt;Talk #2&lt;/h2&gt;

&lt;p&gt;Była tylko jedna prelekcja, niestety, ze względu na chorobę drugiego prelegenta.&lt;/p&gt;

&lt;p&gt;Do zobaczenia na następnym Golang!&lt;/p&gt;
</description>
            <pubDate>Mon, 12 Jan 2015 00:00:00 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2015/01/12/golang-warsaw-2.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2015/01/12/golang-warsaw-2.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/golang-warsaw/golang-warsaw.jpg</image>
        </item>
        
        <item>
            <title>WarsawJS Meetup #4</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;W miniony poniedziałek odbyło się już #4 spotkanie organizacji WarsawJS.&lt;/p&gt;

&lt;!-- &lt;figure&gt;
    &lt;a href=&quot;https://www.meetup.com/WarsawJS/&quot;&gt;
        &lt;img src=&quot;/assets/images/posts/post-banner-warsawjs.jpg&quot;
             alt=&quot;WarsawJS&quot;/&gt;
    &lt;/a&gt;
&lt;/figure&gt; --&gt;

&lt;h2 id=&quot;invitation&quot;&gt;Invitation&lt;/h2&gt;

&lt;p&gt;Zapraszam w imieniu organizatorów WarsawJS.&lt;/p&gt;

&lt;div class=&quot;youtube-lazy&quot; data-youtube-id=&quot;IfQHMaGTXYo&quot;&gt;&lt;/div&gt;

&lt;p class=&quot;chapter-break&quot;&gt;&amp;bull;&lt;/p&gt;

&lt;h2 id=&quot;talk-1-zastosowanie-javascript-nodejs-w-robotyce-marcin-borkowski&quot;&gt;Talk #1: Zastosowanie JavaScript (Node.js) w robotyce &lt;small&gt;Marcin Borkowski&lt;/small&gt;&lt;/h2&gt;

&lt;p&gt;Marcin poprowadził około 50 minutową prezentację na temat Cylon.js (&lt;a href=&quot;http://cylonjs.com&quot;&gt;cylonjs.com&lt;/a&gt;).&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Link do prelekcji: &lt;a href=&quot;https://www.youtube.com/watch?v=ezTbTL45cIE&quot;&gt;https://www.youtube.com/watch?v=ezTbTL45cIE&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p class=&quot;chapter-break&quot;&gt;&amp;bull;&lt;/p&gt;

&lt;h2 id=&quot;talk-2-large-applications-routing-using-angularjs-ui-router-en-piotr-błaszczak&quot;&gt;Talk #2: Large Applications Routing Using AngularJS UI-Router [EN] &lt;small&gt;Piotr Błaszczak&lt;/small&gt;&lt;/h2&gt;

&lt;p&gt;Piotr opowiedział o routingu w AngularJS.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Link do prelekcji: &lt;a href=&quot;https://www.youtube.com/watch?v=Gr1VjSjtAdQ&quot;&gt;https://www.youtube.com/watch?v=Gr1VjSjtAdQ&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p class=&quot;chapter-break&quot;&gt;&amp;bull;&lt;/p&gt;

&lt;h2 id=&quot;talk-3-what-restful-api-is-not-tomasz-skowroński&quot;&gt;Talk #3: What RESTful API is not &lt;small&gt;Tomasz Skowroński&lt;/small&gt;&lt;/h2&gt;

&lt;p&gt;Ostatnią prelekcje poprowadził Tomasz Skowroński który opowiedział o REST i wyjaśnił jaka jest różnica między REST a CRUD.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Link do prelekcji: &lt;a href=&quot;https://www.youtube.com/watch?v=96Y5_A3dZAE&quot;&gt;https://www.youtube.com/watch?v=96Y5_A3dZAE&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;zdjęcia&quot;&gt;Zdjęcia&lt;/h2&gt;

&lt;p&gt;Zdjęcia ze spotkania dostępne pod adresem: &lt;a href=&quot;https://www.meetup.com/WarsawJS/photos/25801548/&quot;&gt;meetup.com/WarsawJS/photos/25801548/&lt;/a&gt;&lt;/p&gt;
</description>
            <pubDate>Thu, 18 Dec 2014 00:00:00 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2014/12/18/warsawjs-meetup-4.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2014/12/18/warsawjs-meetup-4.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/post-banner-warsawjs.jpg</image>
        </item>
        
        <item>
            <title>WarsawJS Meetup #3</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Kolejna edycja WarsawJS już wkrótce. To już 3-cie spotkanie! Tym razem wszystkie prelekcje po polsku!&lt;/p&gt;

&lt;!-- &lt;figure&gt;
    &lt;a href=&quot;https://www.meetup.com/WarsawJS/&quot;&gt;
        &lt;img src=&quot;/assets/images/posts/post-banner-warsawjs.jpg&quot;
             alt=&quot;WarsawJS&quot;/&gt;
    &lt;/a&gt;
&lt;/figure&gt; --&gt;

&lt;h2 id=&quot;invitation&quot;&gt;Invitation&lt;/h2&gt;

&lt;p&gt;Zapraszam w imieniu organizatorów WarsawJS.&lt;/p&gt;

&lt;div class=&quot;youtube-lazy&quot; data-youtube-id=&quot;8Nq0sEvunhI&quot;&gt;&lt;/div&gt;

&lt;p class=&quot;chapter-break&quot;&gt;&amp;bull;&lt;/p&gt;

&lt;h2 id=&quot;talk-1-wzorce-projektowe-dla-aplikacji-enterprise-w-nodejs-konrad-kowalski--robert-kawecki&quot;&gt;Talk #1: Wzorce projektowe dla aplikacji enterprise w Node.js &lt;small&gt;Konrad Kowalski / Robert Kawecki&lt;/small&gt;&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;Link do prelekcji: &lt;a href=&quot;https://www.youtube.com/watch?v=6HS2nvf7BAI&quot;&gt;https://www.youtube.com/watch?v=6HS2nvf7BAI&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p class=&quot;chapter-break&quot;&gt;&amp;bull;&lt;/p&gt;

&lt;h2 id=&quot;talk-2-tworzenie-kartograficznych-wizualizacji-danych-z-wykorzystaniem-leafletjs-oraz-openstreetmap-wiktor-niesiobędzki&quot;&gt;Talk #2: Tworzenie kartograficznych wizualizacji danych z wykorzystaniem LeafletJS oraz OpenStreetMap &lt;small&gt;Wiktor Niesiobędzki&lt;/small&gt;&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;Link do prelekcji: &lt;a href=&quot;https://www.youtube.com/watch?v=SYquJ5c6p5w&quot;&gt;https://www.youtube.com/watch?v=SYquJ5c6p5w&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p class=&quot;chapter-break&quot;&gt;&amp;bull;&lt;/p&gt;

&lt;h2 id=&quot;talk-3--angularjs-pierwsze-kroki-dariusz-kalbarczyk--arkadiusz-kalbarczyk&quot;&gt;Talk #3- AngularJS pierwsze kroki &lt;small&gt;Dariusz Kalbarczyk / Arkadiusz Kalbarczyk&lt;/small&gt;&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;Link do prelekcji: &lt;a href=&quot;https://www.youtube.com/watch?v=bmrF56-9iyA&quot;&gt;https://www.youtube.com/watch?v=bmrF56-9iyA&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
            <pubDate>Thu, 13 Nov 2014 00:00:00 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2014/11/13/warsawjs-meetup-3.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2014/11/13/warsawjs-meetup-3.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/post-banner-warsawjs.jpg</image>
        </item>
        
        <item>
            <title>Jak wyłączyć reklamy w systemie?</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Swego czasu miałem problem, że we wszystkich programach np. Gadu-Gadu
miałem przyjemność oglądania reklam. Na początku dałem sobie pewny
czas - może się przyzwyczaję?&lt;/p&gt;

&lt;p&gt;Jednak po kilku dniach dałem sobie spokój i zacząłem poszukiwania
w sieci. Natknąłem się na obszerną listę adresów i domen, które są
głównymi reklamodawcami.&lt;/p&gt;

&lt;p&gt;Jeśli więc, nie chcesz dać zarobić reklamodawcom użyj listy załączonej
na końcu tego posta. Listę musisz dodać do swojego pliku
&lt;strong&gt;hosts&lt;/strong&gt;. Jest to ważny plik w systemie, w którym możesz ustawić
swoje ścieżki sieciowe.&lt;/p&gt;

&lt;p&gt;W tym przypadku, kierujemy wszystkie niżej wymienione serwisy na swój
komputer (127.0.0.1). Dzięki temu, zapytania po reklamy będą
uderzały w nasz komputer, na którym (prawdopodobnie) nie będziesz miał
plików graficznych (flash-owych) z reklamami.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/disable-commercials/disable-commercials.jpg&quot; itemprop=&quot;image&quot; alt=&quot;Baner promujący artykuł&quot; /&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;gdzie-jest-plik-hosts&quot;&gt;Gdzie jest plik &lt;strong&gt;hosts&lt;/strong&gt;?&lt;/h2&gt;

&lt;p&gt;Plik &lt;strong&gt;hosts&lt;/strong&gt; w różnych systemach znajduje się w innym miejscu:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Window: &lt;code class=&quot;highlighter-rouge&quot;&gt;C:\Windows\System32\drivers\etc\hosts&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;Linux: &lt;code class=&quot;highlighter-rouge&quot;&gt;/etc/hosts&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;macOS: &lt;code class=&quot;highlighter-rouge&quot;&gt;/private/etc/hosts&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;lista-z-serwisami-reklamodawców&quot;&gt;Lista z serwisami reklamodawców&lt;/h2&gt;

&lt;div class=&quot;highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;127.0.0.1  hit.gemius.pl
127.0.0.1  activeby.hit.gemius.pl
127.0.0.1  ad.hit.gemius.pl
127.0.0.1  adactiongapl.hit.gemius.pl
127.0.0.1  adclick.hit.gemius.pl
127.0.0.1  adlt.hit.gemius.pl
127.0.0.1  adnet.hit.gemius.pl
127.0.0.1  advice.hit.gemius.pl
127.0.0.1  advicead.hit.gemius.pl
127.0.0.1  arbo.hit.gemius.pl
127.0.0.1  allegro.hit.gemius.pl
127.0.0.1  centrumcz.hit.gemius.pl
127.0.0.1  cz.hit.gemius.pl
127.0.0.1  delfilv.hit.gemius.pl
127.0.0.1  eniro.hit.gemius.pl
127.0.0.1  gaat.hit.gemius.pl
127.0.0.1  gabg.hit.gemius.pl
127.0.0.1  gadk.hit.gemius.pl
127.0.0.1  gadnet.hit.gemius.pl
127.0.0.1  gail.hit.gemius.pl
127.0.0.1  garu.hit.gemius.pl
127.0.0.1  gask.hit.gemius.pl
127.0.0.1  gazeta.hit.gemius.pl
127.0.0.1  gdecz.hit.gemius.pl
127.0.0.1  gg.hit.gemius.pl
127.0.0.1  idg.hit.gemius.pl
127.0.0.1  hr.hit.gemius.pl
127.0.0.1  hu.hit.gemius.pl
127.0.0.1  idm.hit.gemius.pl
127.0.0.1  intao.hit.gemius.pl
127.0.0.1  interia.hit.gemius.pl
127.0.0.1  kon.hit.gemius.pl
127.0.0.1  lt.hit.gemius.pl
127.0.0.1  o2.hit.gemius.pl
127.0.0.1  onet.hit.gemius.pl
127.0.0.1  opt.hit.gemius.pl
127.0.0.1  pracuj.hit.gemius.pl
127.0.0.1  pro.hit.gemius.pl
127.0.0.1  rbcgaru.hit.gemius.pl
127.0.0.1  seznam.hit.gemius.pl
127.0.0.1  spir.hit.gemius.pl
127.0.0.1  st.hit.gemius.pl
127.0.0.1  st1.hit.gemius.pl
127.0.0.1  std1.hit.gemius.pl
127.0.0.1  stua.hit.gemius.pl
127.0.0.1  ua.hit.gemius.pl
127.0.0.1  vbadbg.hit.gemius.pl
127.0.0.1  webgroundadbg.hit.gemius.pl
127.0.0.1  wp.hit.gemius.pl
127.0.0.1  adserver.gadu-gadu.pl
127.0.0.1  adsearch.wp.pl
127.0.0.1  adv.wp.pl
127.0.0.1  badv.wp.pl
127.0.0.1  dot.wp.pl
127.0.0.1  rek.www.wp.pl
127.0.0.1  interia.nuggad.net
127.0.0.1  kropka.onet.pl
127.0.0.1  reklama.onet.pl
127.0.0.1  onet.hit.stat.pl
127.0.0.1  tracker.adtaily.pl
127.0.0.1  yahoo-analytics.net
127.0.0.1  yahoo.ivwbox.de
127.0.0.1  adserver.yahoo.com
127.0.0.1  ae.adserver.yahoo.com
127.0.0.1  au.adserver.yahoo.com
127.0.0.1  cn2.adserver.yahoo.com
127.0.0.1  hk.adserver.yahoo.com
127.0.0.1  in.adserver.yahoo.com
127.0.0.1  us.adserver.yahoo.com
127.0.0.1  pn1.adserver.yahoo.com
127.0.0.1  pn2.adserver.yahoo.com
127.0.0.1  tw2.adserver.yahoo.com
127.0.0.1  bc-beta.ads.yahoo.com
127.0.0.1  srv1.wa.marketingsolutions.yahoo.com
127.0.0.1  srv2.wa.marketingsolutions.yahoo.com
127.0.0.1  srv3.wa.marketingsolutions.yahoo.com
127.0.0.1  ts.richmedia.yahoo.com
127.0.0.1  adjax.flickr.yahoo.com
127.0.0.1  nz.adserver.yahoo.com
127.0.0.1  sg.adserver.yahoo.com
127.0.0.1  br.adserver.yahoo.com
127.0.0.1  cn.adserver.yahoo.com
127.0.0.1  tw.adserver.yahoo.com
127.0.0.1  be.adserver.yahoo.com
127.0.0.1  dk.adserver.yahoo.com
127.0.0.1  fr.adserver.yahoo.com
127.0.0.1  nl.adserver.yahoo.com
127.0.0.1  se.adserver.yahoo.com
127.0.0.1  uk.adserver.yahoo.com
127.0.0.1  de.adserver.yahoo.com
127.0.0.1  es.adserver.yahoo.com
127.0.0.1  gr.adserver.yahoo.com
127.0.0.1  it.adserver.yahoo.com
127.0.0.1  no.adserver.yahoo.com
127.0.0.1  ar.adserver.yahoo.com
127.0.0.1  ca.adserver.yahoo.com
127.0.0.1  cookex.amp.yahoo.com
127.0.0.1  launch.adserver.yahoo.com
127.0.0.1  mx.adserver.yahoo.com
127.0.0.1  ads.bloomberg.com
127.0.0.1  ads.euronews.net
127.0.0.1  ads.miniclip.com
127.0.0.1  ads.soft32.com
127.0.0.1  ads.tweakxp.com
127.0.0.1  adserver.adreactor.com
127.0.0.1  www.adsedo.com
127.0.0.1  ads.today.com
127.0.0.1  ad.ntvmsnbc.com
127.0.0.1  msncheck.41m.com
127.0.0.1  www.msn-firewall.com
127.0.0.1  www.msn-proxy.com
127.0.0.1  ninemsn.imrworldwide.com
127.0.0.1  a.ads2.msn.com
127.0.0.1  ads2.msn.com
127.0.0.1  analytics.msn.com
127.0.0.1  ac2.msn.com
127.0.0.1  analytics.r.msn.com
127.0.0.1  msnads-wm9.fplive.net
127.0.0.1  0.r.msn.com
127.0.0.1  ads.msn.com
127.0.0.1  ads1.msn.com
127.0.0.1  a.ads1.msn.com
127.0.0.1  b.ads1.msn.com
127.0.0.1  ads.eu.msn.com
127.0.0.1  ads.ninemsn.com.au
127.0.0.1  direct.ninemsn.com.au
127.0.0.1  arc2.msn.com
127.0.0.1  arc3.msn.com
127.0.0.1  arc9.msn.com
127.0.0.1  popup.msn.com
127.0.0.1  a.rad.msn.com
127.0.0.1  b.rad.msn.com
127.0.0.1  rmads.msn.com
127.0.0.1  rmads.eu.msn.com
127.0.0.1  adsyndication.msn.com
127.0.0.1  msnap.adbureau.net
127.0.0.1  agmsnag.112.2o7.net
127.0.0.1  cbmsn.112.2o7.net
127.0.0.1  msna1com.112.2o7.net
127.0.0.1  msnaccountservices.112.2o7.net
127.0.0.1  msnbcom.112.2o7.net
127.0.0.1  msnbc.112.2o7.net
127.0.0.1  msneshopbase.112.2o7.net
127.0.0.1  msninvite.112.2o7.net
127.0.0.1  msninviteprod.112.2O7.net
127.0.0.1  msnlivefavorites.112.2o7.net
127.0.0.1  msnmercom.112.2o7.net
127.0.0.1  msnmercustacqprod.112.2o7.net
127.0.0.1  msnonecare.112.2o7.net
127.0.0.1  msnportalaffiliate.112.2o7.net
127.0.0.1  msnportalaunews.112.2O7.net
127.0.0.1  msnportalbeetoffice2007.112.2o7.net
127.0.0.1  msnportalhome.112.2O7.net
127.0.0.1  msnportalgame.112.2O7.net
127.0.0.1  msnportallatino.112.2O7.net
127.0.0.1  msnportalmsgboardsrvc.112.2O7.net
127.0.0.1  msnportalvideo.112.2o7.net
127.0.0.1  msntrademarketing.112.2o7.net
127.0.0.1  msnportal.112.2o7.net
127.0.0.1  msnportallive.112.2O7.net
127.0.0.1  msnservices.112.2o7.net
127.0.0.1  sympmsnglobalen.112.2o7.net
127.0.0.1  sympmsnmusic.112.2o7.net
127.0.0.1  ccc01.opinionlab.com #[msn.com]
127.0.0.1  autos.msnbc.us.intellitxt.com
127.0.0.1  business.msnbc.us.intellitxt.com
127.0.0.1  news.msnbc.us.intellitxt.com
127.0.0.1  sports.msnbc.us.intellitxt.com
127.0.0.1  technology.msnbc.us.intellitxt.com
127.0.0.1  travel-and-weather.msnbc.us.intellitxt.com
127.0.0.1  entertainment.msn.us.intellitxt.com
127.0.0.1  tomsnetworking.us.intellitxt.com
127.0.0.1  msn.ivwbox.de
127.0.0.1  cm.au.msn.overture.com
127.0.0.1  anon.doubleclick.speedera.net
127.0.0.1  ad.doubleclick.net
127.0.0.1  ad-g.doubleclick.net
127.0.0.1  ad2.doubleclick.net
127.0.0.1  ad-yt-bfp.doubleclick.net
127.0.0.1  ad.3ad.doubleclick.net
127.0.0.1  ad.3au.doubleclick.net
127.0.0.1  ad.adx.doubleclick.net
127.0.0.1  ad.ae.doubleclick.net
127.0.0.1  ad.ar.doubleclick.net
127.0.0.1  ad.au.doubleclick.net
127.0.0.1  ad.be.doubleclick.net
127.0.0.1  ad.br.doubleclick.net
127.0.0.1  ad.ca.doubleclick.net
127.0.0.1  ad.ch.doubleclick.net
127.0.0.1  ad.cl.doubleclick.net
127.0.0.1  ad.cn.doubleclick.net
127.0.0.1  ad.de.doubleclick.net
127.0.0.1  ad.dk.doubleclick.net
127.0.0.1  ad.es.doubleclick.net
127.0.0.1  ad.fi.doubleclick.net
127.0.0.1  ad.fr.doubleclick.net
127.0.0.1  ad.gr.doubleclick.net
127.0.0.1  ad.hk.doubleclick.net
127.0.0.1  ad.hu.doubleclick.net
127.0.0.1  ad.ie.doubleclick.net
127.0.0.1  ad.in.doubleclick.net
127.0.0.1  ad.jp.doubleclick.net
127.0.0.1  ad.kr.doubleclick.net
127.0.0.1  ad.it.doubleclick.net
127.0.0.1  ad.nl.doubleclick.net
127.0.0.1  ad.no.doubleclick.net
127.0.0.1  ad.nz.doubleclick.net
127.0.0.1  ad.pl.doubleclick.net
127.0.0.1  ad.pt.doubleclick.net
127.0.0.1  ad.ro.doubleclick.net
127.0.0.1  ad.ru.doubleclick.net
127.0.0.1  ad.se.doubleclick.net
127.0.0.1  ad.sg.doubleclick.net
127.0.0.1  ad.terra.doubleclick.net
127.0.0.1  ad.th.doubleclick.net
127.0.0.1  ad.tw.doubleclick.net
127.0.0.1  ad.uk.doubleclick.net
127.0.0.1  ad.us.doubleclick.net
127.0.0.1  ad.za.doubleclick.net
127.0.0.1  ad.n2434.doubleclick.net
127.0.0.1  ad-emea.doubleclick.net
127.0.0.1  amn.doubleclick.net
127.0.0.1  creatives.doubleclick.net
127.0.0.1  dfp.doubleclick.net
127.0.0.1  feedads.g.doubleclick.net
127.0.0.1  fls.doubleclick.net
127.0.0.1  fls.uk.doubleclick.net
127.0.0.1  googleads.g.doubleclick.net
127.0.0.1  ir.doubleclick.net
127.0.0.1  iv.doubleclick.net
127.0.0.1  ln.doubleclick.net
127.0.0.1  m.doubleclick.net
127.0.0.1  m2.doubleclick.net
127.0.0.1  m.us.doubleclick.net
127.0.0.1  motifcdn.doubleclick.net
127.0.0.1  motifcdn2.doubleclick.net
127.0.0.1  n3285ad.doubleclick.net
127.0.0.1  n3349ad.doubleclick.net
127.0.0.1  n4052ad.doubleclick.net
127.0.0.1  n4061ad.doubleclick.net
127.0.0.1  n4061ad.fr.doubleclick.net
127.0.0.1  n4403ad.doubleclick.net
127.0.0.1  n479ad.doubleclick.net
127.0.0.1  n609ad.doubleclick.net
127.0.0.1  optout.doubleclick.net
127.0.0.1  optimize.doubleclick.net
127.0.0.1  paypalssl.doubleclick.net
127.0.0.1  pubads.g.doubleclick.net
127.0.0.1  rd.intl.doubleclick.net
127.0.0.1  se1.doubleclick.net
127.0.0.1  s2.video.doubleclick.net
127.0.0.1  doubleclick.ne.jp
127.0.0.1  www3.doubleclick.net
127.0.0.1  www.doubleclick.net
127.0.0.1  doubleclick.com
127.0.0.1  ad.doubleclick.com
127.0.0.1  www2.doubleclick.com
127.0.0.1  www3.doubleclick.com
127.0.0.1  www.doubleclick.com
127.0.0.1  googleads2.g.doubleclick.net
127.0.0.1  securepubads.g.doubleclick.net
127.0.0.1  cm.g.doubleclick.net
127.0.0.1  doubleclick.shockwave.com
127.0.0.1  www3.webhostingtalk.com
127.0.0.1  ad.mirror.co.uk
127.0.0.1  host3.adhese.be
127.0.0.1  1.googlenews.xorg.pl
127.0.0.1  2.googlenews.xorg.pl
127.0.0.1  3.googlenews.xorg.pl
127.0.0.1  4.googlenews.xorg.pl
127.0.0.1  5.googlenews.xorg.pl
127.0.0.1  feedads.googleadservices.com
127.0.0.1  imageads.googleadservices.com
127.0.0.1  google.tucows.com
127.0.0.1  adservices.google.com
127.0.0.1  video-stats.video.google.com
127.0.0.1  ad.adconsole.com
127.0.0.1  ad.ad-flow.com
127.0.0.1  ad.admediaprovider.com
127.0.0.1  ad.adnetinteractive.com
127.0.0.1  ad2.adnetinteractive.com
127.0.0.1  ad.adperium.com
127.0.0.1  ad.adserverplus.com
127.0.0.1  ad.advertise.com
127.0.0.1  ad.antventure.com
127.0.0.1  f.j.r.cltomedia.info
127.0.0.1  cltomedia.info
127.0.0.1  clicktorrent.info
127.0.0.1  ads.ero-advertising.com
127.0.0.1  adspaces.ero-advertising.com
127.0.0.1  api.ero-advertising.com
127.0.0.1  apo.ero-advertising.com
127.0.0.1  banners.ero-advertising.com
127.0.0.1  data.ero-advertising.com
127.0.0.1  layerads.ero-advertising.com
127.0.0.1  speedclicks.ero-advertising.com
127.0.0.1  thumbs.ero-advertising.com
127.0.0.1  opera1-servedby.advertising.com
127.0.0.1  home.hit.stat.pl
127.0.0.1  onet.hit.stat.pl
127.0.0.1  s1.hit.stat.pl
127.0.0.1  s2.hit.stat.pl
127.0.0.1  s3.hit.stat.pl
127.0.0.1  s4.hit.stat.pl
127.0.0.1  sisco.hit.stat.pl
127.0.0.1  survey.112.2o7.net
127.0.0.1  survey.122.2o7.net
127.0.0.1  adserver.aol.fr
127.0.0.1  ads.aol.co.uk
127.0.0.1  ads.web.aol.com
127.0.0.1  ads.newline.aol.com
127.0.0.1  o.sa.aol.com
127.0.0.1  s.sa.aol.com
127.0.0.1  banners.adultfriendfinder.com
127.0.0.1  ads.adultfriendfinder.com
127.0.0.1  adserver.adultfriendfinder.com
127.0.0.1  banners.adultfriendfinder.com
127.0.0.1  geobanner.adultfriendfinder.com
127.0.0.1  iframe.adultfriendfinder.com
127.0.0.1  ad.moscowtimes.ru
127.0.0.1  ads.nytimes.com
127.0.0.1  ads.tripod.lycos.nl
127.0.0.1  ads.tripod.lycos.co.uk
127.0.0.1  ads.tripod.lycos.de
127.0.0.1  ads.tripod.lycos.es
127.0.0.1  ads.lycos.com
127.0.0.1  ads.tripod.spray.se
127.0.0.1  adidm.idmnet.pl
127.0.0.1  onet.hit.gemius.pl
127.0.0.1  imppl.tradedoubler.com
127.0.0.1  reklama.onet.pl
127.0.0.1  www.promotion.pl
127.0.0.1  realbannerads.com
127.0.0.1  adserver.o2.pl
127.0.0.1  idm.hit.gemius.pl
127.0.0.1  a2.o2.pl
127.0.0.1  ad.media-servers.net
127.0.0.1  ad.firstadsolution.com
127.0.0.1  content.yieldmanager.com
127.0.0.1  clk.tradedoubler.com
127.0.0.1  ads3.forall.pl
127.0.0.1  popunder.paypopup.com
127.0.0.1  www.paypopup.com
127.0.0.1  paypopup.com
127.0.0.1  layer-ads.de
127.0.0.1  adserving.cpxinteractive.com
127.0.0.1  content.cpxinteractive.com
127.0.0.1  www.adbrite.com
127.0.0.1  adnet.hit.gemius.pl
127.0.0.1  s1.ad.adocean.pl
127.0.0.1  adultfriendfinder.com
127.0.0.1  alexx2.axelsfun.com
127.0.0.1  agoraua.adocean.pl
127.0.0.1  bg.adocean.pl
127.0.0.1  gg.adocean.pl
127.0.0.1  indexhu.adocean.pl
127.0.0.1  obozua.adocean.pl
127.0.0.1  s1.ad.adocean.pl
127.0.0.1  s1.advicepl.adocean.pl
127.0.0.1  s1.centrumcz.adocean.pl
127.0.0.1  s1.cz.adocean.pl
127.0.0.1  s1.czgde.adocean.pl
127.0.0.1  s1.gg.adocean.pl
127.0.0.1  s1.gojobsru.adocean.pl
127.0.0.1  s1.my.adocean.pl
127.0.0.1  s1.myao.adocean.pl
127.0.0.1  s1.pracuj.adocean.pl
127.0.0.1  s1.skgde.adocean.pl
127.0.0.1  s2.ad.adocean.pl
127.0.0.1  tmguua.adocean.pl
127.0.0.1  vbbg.adocean.pl
127.0.0.1  webgroundbg.adocean.pl
127.0.0.1  adview.pl
127.0.0.1  ad.adview.pl
127.0.0.1  ad.gazeta.pl
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
</description>
            <pubDate>Sat, 01 Nov 2014 00:00:00 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2014/11/01/jak-wylaczyc-reklamy-w-systemie.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2014/11/01/jak-wylaczyc-reklamy-w-systemie.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/disable-commercials/disable-commercials.jpg</image>
        </item>
        
        <item>
            <title>WarsawJS Meetup #2</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Drugie spotkanie organizacji WarsawJS. Zapraszam do obejrzenia zapowiedzi oraz trzech prelekcji, które wydarzyły się podczas tego meetupu.&lt;/p&gt;

&lt;!-- &lt;figure&gt;
    &lt;a href=&quot;https://www.meetup.com/WarsawJS/&quot;&gt;
        &lt;img src=&quot;/assets/images/posts/post-banner-warsawjs.jpg&quot;
             alt=&quot;WarsawJS&quot;/&gt;
    &lt;/a&gt;
&lt;/figure&gt; --&gt;

&lt;h2 id=&quot;invitation&quot;&gt;Invitation&lt;/h2&gt;

&lt;p&gt;Zapraszam w imieniu organizatorów WarsawJS.&lt;/p&gt;

&lt;div class=&quot;youtube-lazy&quot; data-youtube-id=&quot;ZMB966KkvK8&quot;&gt;&lt;/div&gt;

&lt;p class=&quot;chapter-break&quot;&gt;&amp;bull;&lt;/p&gt;

&lt;h2 id=&quot;talk-1-what-if-we-dont-have-api-en-tomasz-ducin&quot;&gt;Talk #1: What if we don’t have API? [EN] &lt;small&gt;Tomasz Ducin&lt;/small&gt;&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;Link do prelekcji: &lt;a href=&quot;https://www.youtube.com/watch?v=QJZtl6vZHvc&quot;&gt;https://www.youtube.com/watch?v=QJZtl6vZHvc&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p class=&quot;chapter-break&quot;&gt;&amp;bull;&lt;/p&gt;

&lt;h2 id=&quot;talk-2-how-do-we-structure-code-in-ember-en-piotr-zientara&quot;&gt;Talk #2: How do we structure code in Ember? [EN] &lt;small&gt;Piotr Zientara&lt;/small&gt;&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;Link do prelekcji: &lt;a href=&quot;https://www.youtube.com/watch?v=9XnNkGXnLX4&quot;&gt;https://www.youtube.com/watch?v=9XnNkGXnLX4&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p class=&quot;chapter-break&quot;&gt;&amp;bull;&lt;/p&gt;

&lt;h2 id=&quot;talk-3-oauth-in-js-daniel-kopka&quot;&gt;Talk #3: oAuth in JS &lt;small&gt;Daniel Kopka&lt;/small&gt;&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;Link do prelekcji: &lt;a href=&quot;https://www.youtube.com/watch?v=RyOiUpNSHxo&quot;&gt;https://www.youtube.com/watch?v=RyOiUpNSHxo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p class=&quot;chapter-break&quot;&gt;&amp;bull;&lt;/p&gt;

&lt;h2 id=&quot;talk-4-samsung-multiscreen-let-your-mobile-talk-to-your-tv-en-paweł-pruszkowski&quot;&gt;Talk #4: Samsung MultiScreen: let your mobile talk to your TV! [EN] &lt;small&gt;Paweł Pruszkowski&lt;/small&gt;&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;Link do prelekcji: &lt;a href=&quot;https://www.youtube.com/watch?v=26T7jX9zpDI&quot;&gt;https://www.youtube.com/watch?v=26T7jX9zpDI&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p class=&quot;chapter-break&quot;&gt;&amp;bull;&lt;/p&gt;

&lt;h2 id=&quot;aktualizacja&quot;&gt;&lt;mark&gt;[Aktualizacja]&lt;/mark&gt;&lt;/h2&gt;

&lt;p&gt;Dziękujemy za przybycie!&lt;/p&gt;

&lt;div class=&quot;youtube-lazy&quot; data-youtube-id=&quot;UX2yGpGgviQ&quot;&gt;&lt;/div&gt;
</description>
            <pubDate>Sun, 26 Oct 2014 00:00:00 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2014/10/26/warsawjs-meetup-2.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2014/10/26/warsawjs-meetup-2.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/post-banner-warsawjs.jpg</image>
        </item>
        
        <item>
            <title>WarsawJS Meetup #1</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;&lt;strong&gt;16-09-2014&lt;/strong&gt; ta data zostanie na długo w mojej pamięci, z uwagi na pierwszy meetup jako organizator, ale też jako prelegent, przed tak dużą publicznością!&lt;/p&gt;

&lt;!-- &lt;figure&gt;
    &lt;a href=&quot;https://www.meetup.com/WarsawJS/&quot;&gt;
        &lt;img src=&quot;/assets/images/posts/post-banner-warsawjs.jpg&quot;
             alt=&quot;WarsawJS&quot;/&gt;
    &lt;/a&gt;
&lt;/figure&gt; --&gt;

&lt;h2 id=&quot;invitation&quot;&gt;Invitation&lt;/h2&gt;

&lt;p&gt;W imieniu organizatorów WarsawJS serdecznie zapraszam na pierwsze spotkanie!&lt;/p&gt;

&lt;div class=&quot;youtube-lazy&quot; data-youtube-id=&quot;nF_7xdzesT8&quot;&gt;&lt;/div&gt;

&lt;p class=&quot;chapter-break&quot;&gt;&amp;bull;&lt;/p&gt;

&lt;h2 id=&quot;talk-1-the-future-of-javascript---es6-adam-babik&quot;&gt;Talk #1: The future of JavaScript - ES6 &lt;small&gt;Adam Babik&lt;/small&gt;&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;Link do prelekcji: &lt;a href=&quot;https://www.youtube.com/watch?v=ONEctd3l3Lk&quot;&gt;https://www.youtube.com/watch?v=ONEctd3l3Lk&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p class=&quot;chapter-break&quot;&gt;&amp;bull;&lt;/p&gt;

&lt;h2 id=&quot;talk-2-ember-for-multi-page-applications-krzysztof-modras&quot;&gt;Talk #2: Ember for Multi Page applications &lt;small&gt;Krzysztof Modras&lt;/small&gt;&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;Link do prelekcji: &lt;a href=&quot;https://www.youtube.com/watch?v=TljZG9wUnXs&quot;&gt;https://www.youtube.com/watch?v=TljZG9wUnXs&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p class=&quot;chapter-break&quot;&gt;&amp;bull;&lt;/p&gt;

&lt;h2 id=&quot;talk-3-commercial-openstreetmap-implementation-marcin-cimaszewski&quot;&gt;Talk #3: Commercial OpenStreetMap implementation &lt;small&gt;Marcin Cimaszewski&lt;/small&gt;&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;Link do prelekcji: &lt;a href=&quot;https://www.youtube.com/watch?v=J2Z4IRwZ3Jo&quot;&gt;https://www.youtube.com/watch?v=J2Z4IRwZ3Jo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p class=&quot;chapter-break&quot;&gt;&amp;bull;&lt;/p&gt;

&lt;h2 id=&quot;talk-4-first-app-on-samsung-smart-tv-platform-piotr-kowalski&quot;&gt;Talk #4: First app on Samsung Smart TV platform &lt;small&gt;Piotr Kowalski&lt;/small&gt;&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;Link do prelekcji: &lt;a href=&quot;https://www.youtube.com/watch?v=2ktpOVFQOe8&quot;&gt;https://www.youtube.com/watch?v=2ktpOVFQOe8&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p class=&quot;chapter-break&quot;&gt;&amp;bull;&lt;/p&gt;

&lt;h2 id=&quot;aktualizacja&quot;&gt;&lt;mark&gt;[Aktualizacja]&lt;/mark&gt;&lt;/h2&gt;

&lt;p&gt;Dziękujemy za przybycie!&lt;/p&gt;

&lt;div class=&quot;youtube-lazy&quot; data-youtube-id=&quot;z8zkyb1p7-k&quot;&gt;&lt;/div&gt;
</description>
            <pubDate>Wed, 17 Sep 2014 00:00:00 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2014/09/17/warsawjs-meetup-1.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2014/09/17/warsawjs-meetup-1.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/post-banner-warsawjs.jpg</image>
        </item>
        
        <item>
            <title>WarsawJS - Nowa organizacja w Warszawie 🎉</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Z dniem 2014-06-15 rusza nowa organizacja pod nazwą &lt;strong&gt;WarsawJS&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Razem z Krzysztofem Modrasem (&lt;a href=&quot;https://twitter.com/chrmod/&quot;&gt;@chrmod&lt;/a&gt;) oraz Marcinem Cimaszewskim (&lt;a href=&quot;https://twitter.com/mcimasz&quot;&gt;@mcimasz&lt;/a&gt;) podjęliśmy decyzję, że spróbujemy stworzyć organizację skupioną na języku JavaScript, której celem będzie dotarcie do programistów tego języka, głównie w stolicy naszego pięknego kraju - Warszawie.&lt;/p&gt;

&lt;figure&gt;
    &lt;a href=&quot;https://www.meetup.com/WarsawJS/&quot;&gt;
        &lt;img src=&quot;/assets/images/posts/post-banner-warsawjs.jpg&quot; alt=&quot;WarsawJS&quot; /&gt;
    &lt;/a&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;pytania-i-odpowiedzi&quot;&gt;Pytania i odpowiedzi&lt;/h2&gt;

&lt;p&gt;O to lista pytań skierowanych do organizatorów:&lt;/p&gt;

&lt;h3 id=&quot;1-dlaczego-powstało-warsawjs-czemu-uznaliście-że-takie-spotkania-są-potrzebne&quot;&gt;1) Dlaczego powstało WarsawJS? Czemu uznaliście że takie spotkania są potrzebne?&lt;/h3&gt;

&lt;p&gt;JavaScript to język internetu. Dzięki niemu istnieją wszystkie nowoczesne strony i aplikacje www. W ostatnich latach obserwujemy niesamowity rozwój w tej branży. Sieć się zmienia, aplikacje są szybsze, bardziej funkcjonalne, ciekawsze. JavaScript jest motorem tych zmian. Na Warszawskiej scenie istnieje wiele firm i niezależnych specjalistów, którzy tworzą produkty oparte o tą technologie na najwyższym, światowych poziomie. JavaScript rozprzestrzenia się również poza granice przeglądarki internetowej. Jest obecny jest w smartfonach, tabletach, smart tv, a nawet grach! Dla nas to wspaniały temat do dyskusji. Właśnie dlatego powstało WarsawJS.&lt;/p&gt;

&lt;h3 id=&quot;2-kogo-zapraszacie-na-wasze-spotkania---czy-macie-jakiś-klucz-doboru-uczestników&quot;&gt;2) Kogo zapraszacie na Wasze spotkania - czy macie jakiś klucz doboru uczestników?&lt;/h3&gt;

&lt;p&gt;Spotkania są otwarte i darmowe. Zapraszam wszystkich profesjonalistów i entuzjastów którzy mogą do nas dotrzeć. Staramy się, by szeroki wybór tematów zachęcał osoby o różnych specjalizacjach. Tym samym nie mamy modelowego odbiorcy. Najważniejsza jest otwartość uczestników i chęć dzielenia się wiedzą.&lt;/p&gt;

&lt;h3 id=&quot;3-co-jest-celem-spotkań&quot;&gt;3) Co jest celem spotkań?&lt;/h3&gt;

&lt;p&gt;Celem WarsawJS jest integracja środowiska programistów JavaScript. Przekłada się to na dzielenie się informacjami o nowościach, testach jakie prowadzimy czy wdrożeniach.&lt;/p&gt;

&lt;h2 id=&quot;social&quot;&gt;Social&lt;/h2&gt;

&lt;p&gt;Linki do profilu &lt;strong&gt;WarsawJS&lt;/strong&gt; w sieciach społecznościowych:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://warsawjs.com/&quot;&gt;WarsawJS&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.meetup.com/WarsawJS/&quot;&gt;Meetup&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.facebook.com/warsawjs&quot;&gt;Facebook&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://www.youtube.com/channel/UCzYf3wdKSKnR5lvkRVUyCYg/videos&quot;&gt;YouTube&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://twitter.com/warsawjs&quot;&gt;Twitter&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/orgs/warsawjs/dashboard&quot;&gt;GitHub&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
            <pubDate>Sun, 15 Jun 2014 00:00:00 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2014/06/15/warsawjs-nowa-organizacja-w-warszawie.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2014/06/15/warsawjs-nowa-organizacja-w-warszawie.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/post-banner-warsawjs-born.png</image>
        </item>
        
        <item>
            <title>Backbone.js: problem z unikalnymi właściwościami obiektowymi</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;W dniu dzisiejszym &lt;a href=&quot;http://backbonejs.org&quot;&gt;Backbone.js&lt;/a&gt; zaskoczył mnie kolejny raz. Niestety tym razem negatywnie…&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/backbonejs/backbonejs-526x275.jpg&quot; itemprop=&quot;image&quot; alt=&quot;Baner promujący artykuł&quot; /&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;właściwości&quot;&gt;Właściwości&lt;/h2&gt;

&lt;p&gt;Tworzenie “klas”, które dziedziczą po sobie właściwości jest czym naturalnym w Backbone. Nadpisywanie tychże właściwości jest równie proste. Przykład:&lt;/p&gt;

&lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;AbstractWidget&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Backbone&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;View&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;extend&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;({&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;template&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'foo.html'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;});&lt;/span&gt;

&lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;MenuWidget&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;AbstractWidget&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;extend&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;({&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;template&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'bar.html'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;});&lt;/span&gt;

&lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;v&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;MenuWidget&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
&lt;span class=&quot;nx&quot;&gt;v&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;template&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// bar.html&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Niestety, takie działanie jest tylko do właściwości prymitywnych.&lt;/p&gt;

&lt;h2 id=&quot;problem&quot;&gt;Problem&lt;/h2&gt;

&lt;p&gt;Inaczej sytuacja wygląda gdy mamy do czynienia z obiektami:&lt;/p&gt;

&lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;AbstractWidget&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Backbone&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;View&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;extend&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;({});&lt;/span&gt;

&lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;MenuWidget&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;AbstractWidget&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;extend&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;({&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;templateParams&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{},&lt;/span&gt;

    &lt;span class=&quot;na&quot;&gt;initialize&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;templateParams&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;id&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;uniqueId&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;});&lt;/span&gt;

&lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;MenuWidget&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
&lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;v&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;MenuWidget&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
&lt;span class=&quot;nx&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;templateParams&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// 2&lt;/span&gt;
&lt;span class=&quot;nx&quot;&gt;v&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;templateParams&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// 2&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Co ciekawe… gdy zamienimy kolejność wywołania ostatnich linijek:&lt;/p&gt;

&lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;MenuWidget&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
&lt;span class=&quot;nx&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;templateParams&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// 1&lt;/span&gt;

&lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;v&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;MenuWidget&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
&lt;span class=&quot;nx&quot;&gt;v&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;templateParams&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// 2&lt;/span&gt;

&lt;span class=&quot;c1&quot;&gt;// Ale gdy uruchamiamy następującą linię:&lt;/span&gt;
&lt;span class=&quot;nx&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;templateParams&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// 2&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;rozwiązanie&quot;&gt;Rozwiązanie&lt;/h2&gt;

&lt;p&gt;Problemy leży o podnóża działań JavaScript.&lt;/p&gt;

&lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;AbstractWidget&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Backbone&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;View&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;extend&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;({});&lt;/span&gt;

&lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;MenuWidget&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;AbstractWidget&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;extend&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;({&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;templateParams&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{},&lt;/span&gt;

    &lt;span class=&quot;na&quot;&gt;initialize&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;c1&quot;&gt;// czyścimy obiektowe właściwości&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;templateParams&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{};&lt;/span&gt;

        &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;templateParams&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;id&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;uniqueId&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;},&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;});&lt;/span&gt;

&lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;x&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;MenuWidget&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
&lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;v&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;MenuWidget&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
&lt;span class=&quot;nx&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;templateParams&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// 1&lt;/span&gt;
&lt;span class=&quot;nx&quot;&gt;v&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;templateParams&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;id&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// 2&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Przedstawiam 2 bardzo ważne zasady programowaniu w JavaScript:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Wartości &lt;mark&gt;prymitywne&lt;/mark&gt; &lt;code class=&quot;highlighter-rouge&quot;&gt;string, number, boolean, null, undefined&lt;/code&gt; są przekazywane przez &lt;mark&gt;wartość&lt;/mark&gt;.&lt;/li&gt;
  &lt;li&gt;Wartości &lt;mark&gt;obiektowe&lt;/mark&gt; przez &lt;mark&gt;referencję&lt;/mark&gt;!&lt;/li&gt;
&lt;/ul&gt;
</description>
            <pubDate>Fri, 18 Apr 2014 00:00:00 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2014/04/18/backbonejs-problem-z-unikalnymi-wlasciwosciami-obiektowymi.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2014/04/18/backbonejs-problem-z-unikalnymi-wlasciwosciami-obiektowymi.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/backbonejs/backbonejs-526x275.jpg</image>
        </item>
        
        <item>
            <title>Narzędzia Świata: more.js</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Duże tabele danych z duża ilością tekstu w komórkach? Czytelność takich tabel pozostawia wiele do życzenia. Jeśli ten problem spotkał i Ciebie, jest na to proste rozwiązanie: &lt;a href=&quot;https://github.com/piecioshka/more&quot;&gt;more.js&lt;/a&gt;&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/post-banner-narzedzia-swiata-more.png&quot; itemprop=&quot;image&quot; alt=&quot;Baner promujący artykuł&quot; /&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;zasada-działania&quot;&gt;Zasada działania&lt;/h2&gt;

&lt;p&gt;To proste narzędzie daj Ci zwarty układ tabelaryczny kosztem wyświetlenia całej zawartości komórki. Działa ona w ten sposób, że sprawdza każdą komórkę pod kątem długości w niej tekstu. Jeśli jest jego za dużo, skraca, do liczby znaków zdefiniowanych podczas inicjalizacji. Dodaje tym samym link &lt;em&gt;“more”&lt;/em&gt; który po kliknięciu pokazuje całą zawartość komórki oraz dodaje link &lt;em&gt;“less”&lt;/em&gt; aby móc przywrócić zawartość komórki do skróconej wersji.&lt;/p&gt;

&lt;h2 id=&quot;jak-to-wygląda-w-praktyce&quot;&gt;Jak to wygląda w praktyce?&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;Przed zastosowaniem biblioteki:&lt;/p&gt;

    &lt;p&gt;&lt;img src=&quot;/assets/images/posts/more-js/more-js-normal.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Po zastosowaniu more.js lub po kliknięciu ‘less’ (collapse):&lt;/p&gt;

    &lt;p&gt;&lt;img src=&quot;/assets/images/posts/more-js/more-js-collapse.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Po zastosowaniu more.js i kliknięciu ‘more’ (expand):&lt;/p&gt;

    &lt;p&gt;&lt;img src=&quot;/assets/images/posts/more-js/more-js-expand.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;jak-skorzystać-z-morejs&quot;&gt;Jak skorzystać z more.js?&lt;/h2&gt;

&lt;div class=&quot;language-html highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;script &lt;/span&gt;&lt;span class=&quot;na&quot;&gt;src=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;https://piecioshka.github.io/more/more.js&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;More&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'#big-table'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Jak widać, najważniejsza jest konfiguracja:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;em&gt;selektor do tabeli&lt;/em&gt; - np. #big-table, table (wtedy mechanizm zostanie zastosowany na wszystkich tabelach na stronie)&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;dozwolona liczba znaków w komórce&lt;/em&gt; - np. 10, 20&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;więcej&quot;&gt;Więcej&lt;/h2&gt;

&lt;p&gt;Demo: &lt;a href=&quot;https://piecioshka.github.io/more.js/&quot;&gt;https://piecioshka.github.io/more.js/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Źródło: &lt;a href=&quot;https://github.com/piecioshka/more&quot;&gt;github.com/piecioshka/more&lt;/a&gt;&lt;/p&gt;
</description>
            <pubDate>Thu, 30 Jan 2014 00:00:00 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2014/01/30/narzedzia-swiata-more-js.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2014/01/30/narzedzia-swiata-more-js.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/post-banner-narzedzia-swiata-more.png</image>
        </item>
        
        <item>
            <title>WRUG styczniowy o debugowaniu, Neo4j i Ember.js</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;W dniu dzisiejszym (tj. 2014/01/27) miałem przyjemność uczestniczyć w roli słuchacza na mini-konferencji o nazwie &lt;abbr title=&quot;Warsaw Ruby Users Group&quot;&gt;WRUG&lt;/abbr&gt;. Idea jest prosta, spotykamy się w luźnej atmosferze, rozmawiamy o tym co nas interesuje.&lt;/p&gt;

&lt;p&gt;Planowałem obecność ze względu na obecność talka o frameworku &lt;a href=&quot;http://emberjs.com/&quot;&gt;Ember.js&lt;/a&gt;.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/wrug/wrug-logo.jpeg&quot; alt=&quot;&quot; /&gt;

    &lt;figcaption&gt;
        &lt;a href=&quot;https://www.meetup.com/Warsaw-Ruby-Users-Group-WRUG/&quot;&gt;Warsaw Ruby Users Group (WRUG)&lt;/a&gt;
    &lt;/figcaption&gt;

&lt;/figure&gt;

&lt;h2 id=&quot;talk-1-coders-lab&quot;&gt;Talk #1: Coder’s lab&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Pierwsza prezentacja&lt;/strong&gt; zaprezentowała była przez Piotr Zientara, z wykształcenia “filozof”, który po 9-cio tygodniowym kursie &lt;a href=&quot;http://www.coderslab.pl/&quot;&gt;Coder’s lab&lt;/a&gt;, nauczył się programować. Do takiego stopnia, że firma Rebased (o ile dobrze pamiętam) nawiązała z nim współpracę 😄. Piotr świetnie zaprezentował historię oraz ideę debugowania. Najważniejszą informacją była geneza słowa &lt;em&gt;bug&lt;/em&gt; (w kontekście IT). Otóż sławna programistka &lt;a href=&quot;http://pl.wikipedia.org/wiki/Grace_Hopper&quot;&gt;Grace Hooper&lt;/a&gt; podczas problemu z maszyną na której pracowała znalazła &lt;em&gt;ćmę&lt;/em&gt; - bug’a. Od tamtej pory słowo &lt;em&gt;debugging&lt;/em&gt; oznaczało naprawę błędu.&lt;/p&gt;

&lt;p&gt;Dzięki uprzejmości Piotra załączam prezentację.&lt;/p&gt;

&lt;iframe src=&quot;http://prezi.com/embed/2pxa7gwhh-ai/?bgcolor=ffffff&amp;amp;lock_to_path=0&amp;amp;autoplay=0&amp;amp;autohide_ctrls=0&amp;amp;features=undefined&amp;amp;disabled_features=undefined&quot; width=&quot;550&quot; height=&quot;400&quot; frameborder=&quot;0&quot;&gt;&lt;/iframe&gt;

&lt;div class=&quot;clearfix&quot;&gt;&lt;/div&gt;

&lt;p&gt;Prezentację poprowadził Piotr Zientara z &lt;a href=&quot;https://www.facebook.com/Rebased/&quot;&gt;Rebased&lt;/a&gt;.&lt;/p&gt;

&lt;p class=&quot;chapter-break&quot;&gt;&amp;bull;&lt;/p&gt;

&lt;h2 id=&quot;talk-2-emberjs&quot;&gt;Talk #2: Ember.js&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Drugi speech&lt;/strong&gt; był o &lt;em&gt;Ember.js&lt;/em&gt;. Zgodnie z opisem przed spotkaniem, liczyłem, że podczas tej prezentacji zostanie mi przedstawione:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;W jaki sposób mogę napisać prościutką aplikację?&lt;/li&gt;
  &lt;li&gt;Jak działa Ember.js?&lt;/li&gt;
  &lt;li&gt;Na co zwracać uwagę podczas tworzenia aplikacji?&lt;/li&gt;
  &lt;li&gt;Jaka jest idea aplikacji opierających się na tym frameworku?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Niestety, jednak po tym speechu nie mogę powiedzieć, że znam odpowiedzi na wszystkie w.w pytania.&lt;/p&gt;

&lt;p&gt;Wiem tylko, że Ember.js nadaje się lepiej do dużych aplikacji niż Backbone.js. Najbardziej popularny na rynku framework Angular.js jest ideologicznie zbliżony do Ember.js, jednak bardzo mocno ingeruje on w kod html aplikacji. Nie każdy programista lubi mieć wymieszany kod html i js w template’ach.. Angular.js dodaje do znaczników atrybuty i to dlatego może stać się mniej komfortowy w wykorzystaniu.&lt;/p&gt;

&lt;p&gt;Prezentację poprowadził Piotr “Drogomir” Sarnacki.&lt;/p&gt;

&lt;p class=&quot;chapter-break&quot;&gt;&amp;bull;&lt;/p&gt;

&lt;h2 id=&quot;talk-3&quot;&gt;Talk #3&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Trzecie przemówienie&lt;/strong&gt; odbyło się beze mnie.&lt;/p&gt;

&lt;h2 id=&quot;podsumowanie&quot;&gt;Podsumowanie&lt;/h2&gt;

&lt;p&gt;Więcej tutaj: &lt;a href=&quot;http://wrug.eu/2014/01/20/spotkanie-styczniowe/&quot;&gt;WRUG / Spotkanie styczniowe o debugowaniu, Neo4j i Ember.js&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Do zobaczenia na &lt;strong&gt;WRUGu&lt;/strong&gt;!&lt;/p&gt;
</description>
            <pubDate>Tue, 28 Jan 2014 00:00:00 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2014/01/28/wrug-spotkanie-styczniowe-o-debugowaniu-neo4j-i-ember-js.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2014/01/28/wrug-spotkanie-styczniowe-o-debugowaniu-neo4j-i-ember-js.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/wrug/wrug-logo-526x275.jpg</image>
        </item>
        
        <item>
            <title>eval() czy JSON.parse() - porównanie szybkości</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Web aplikacje mocno wykorzystują format &lt;abbr title=&quot;JavaScript Object Notation&quot;&gt;JSON&lt;/abbr&gt; w procesie komunikacji klient (przeglądarka) - serwer. Zastanówmy się jak możemy poradzić sobie z parsowaniem danych zapisanych w tym formacie.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/post-banner-javascript.png&quot; itemprop=&quot;image&quot; alt=&quot;Baner promujący artykuł&quot; /&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;format-json&quot;&gt;Format JSON&lt;/h2&gt;

&lt;p&gt;Jest to najpopularniejszy format w aplikacjach Front-end-owych ze względu na podobieństwo formatu JSON to obiektu literałowego w JavaScript. Dodatkowo, po sparsowaniu danych, korzystanie z nich odbywa się w identyczny sposób jak byśmy używali zwykłego obiektu w JS.&lt;/p&gt;

&lt;p&gt;Silniki przeglądarek udostępniają API, które pozwala na podstawową obsługę tego formatu.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;JSON.parse()&lt;/code&gt; - konwersja z: &lt;code class=&quot;highlighter-rouge&quot;&gt;String&lt;/code&gt; do: &lt;code class=&quot;highlighter-rouge&quot;&gt;Object&lt;/code&gt;&lt;/p&gt;

    &lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;  &lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;data&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'{ &quot;foo&quot;: &quot;bar&quot; }'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

  &lt;span class=&quot;nx&quot;&gt;JSON&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;parse&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
  &lt;span class=&quot;c1&quot;&gt;// zwróci obiekt: Object { foo: &quot;bar&quot; }&lt;/span&gt;

  &lt;span class=&quot;k&quot;&gt;typeof&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;JSON&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;parse&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'object'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;c1&quot;&gt;// true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;JSON.stringify()&lt;/code&gt; - konwersja z: &lt;code class=&quot;highlighter-rouge&quot;&gt;Object&lt;/code&gt; do: &lt;code class=&quot;highlighter-rouge&quot;&gt;String&lt;/code&gt;&lt;/p&gt;

    &lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;  &lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;data&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;foo&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'bar'&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;};&lt;/span&gt;

  &lt;span class=&quot;nx&quot;&gt;JSON&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;stringify&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
  &lt;span class=&quot;c1&quot;&gt;// zwróci string: { &quot;foo&quot;:&quot;bar&quot; }&lt;/span&gt;

  &lt;span class=&quot;k&quot;&gt;typeof&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;JSON&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;stringify&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;data&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'string'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;c1&quot;&gt;// true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;

    &lt;p&gt;Ale kiedyś, kiedy IE było liderem na rynku przeglądarek i nie miało konkurencji, parsowaniem danych przychodzących z serwera zajmowała się funkcja &lt;code class=&quot;highlighter-rouge&quot;&gt;eval()&lt;/code&gt;. Wtedy jeszcze &lt;a href=&quot;https://github.com/douglascrockford/JSON-js&quot;&gt;biblioteka&lt;/a&gt; Douglasa Crockforda nie istniała.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;badania&quot;&gt;Badania&lt;/h2&gt;

&lt;p&gt;Pewnego dnia zaciekawił mnie performance dwóch metod parsowania danych: eval() oraz JSON.parse(). Skorzystałem z najpopularniejszej platformy do przeprowadzania takich testów, mianowicie skorzystałem z &lt;strong&gt;jsperf.com&lt;/strong&gt;. Link do moich badań: &lt;a href=&quot;http://jsperf.com/eval-or-json-parse&quot;&gt;jsperf.com/eval-or-json-parse&lt;/a&gt;. Testy przeprowadziłem na dość długim łańcuchu znaków, aby testy były bardziej miarodajne.&lt;/p&gt;

&lt;p&gt;Wyniki badań były &lt;em&gt;zaskakujące&lt;/em&gt;.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/eval/eval-json-parse-test.png&quot; /&gt;
&lt;/figure&gt;

&lt;p&gt;Opera, przeglądarka która ma obecnie (2014/01) 6.40% rynku lepiej radzi sobie z parsowaniem za pomocą &lt;code class=&quot;highlighter-rouge&quot;&gt;eval()&lt;/code&gt;. Przewaga pomiędzy parsowanie funkcją &lt;code class=&quot;highlighter-rouge&quot;&gt;eval()&lt;/code&gt; a &lt;code class=&quot;highlighter-rouge&quot;&gt;JSON.parse()&lt;/code&gt; na tej przeglądarce jest ogromna. Blisko 10 razy szybciej.&lt;/p&gt;

&lt;p&gt;Dane dla Opera 12.15:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;JSON.parse()&lt;/code&gt; - 7,461 ops/sec&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;eval()&lt;/code&gt; - 67,859 ops/sec&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Reszta przeglądarek (poza IE), mianowicie Chrome, Firefox, Safari (poza 7.0.1) radzi sobie lepiej z parsowanie przy użyciu &lt;code class=&quot;highlighter-rouge&quot;&gt;JSON.parse()&lt;/code&gt;.&lt;/p&gt;

&lt;h2 id=&quot;wnioski&quot;&gt;Wnioski&lt;/h2&gt;

&lt;p&gt;Gdy naszą docelową przeglądarką jest Internet Explorer lub Opera to polecam korzystać z metody &lt;code class=&quot;highlighter-rouge&quot;&gt;eval()&lt;/code&gt;. Oczywiście, jeśli aplikacja korzysta z wiarygodnego źródła danych.&lt;/p&gt;

&lt;p&gt;W przeciwnym przypadku &lt;strong&gt;rekomenduje&lt;/strong&gt; korzystać z &lt;code class=&quot;highlighter-rouge&quot;&gt;JSON.parse()&lt;/code&gt;, chociażby z powodu wydajności.&lt;/p&gt;

&lt;p&gt;Drugim punktem który stoi za korzystaniem z &lt;code class=&quot;highlighter-rouge&quot;&gt;JSON.parse()&lt;/code&gt; jest działanie tej metody. Funkcja eval() nie parsuje danych, ona po prostu uruchamia kod który zostanie jej przekazanym w postaci łańcucha znaków. To jest największe niebezpieczeństwo tej funkcji. Metoda &lt;code class=&quot;highlighter-rouge&quot;&gt;JSON.parse()&lt;/code&gt; rzuci wyjątkiem kiedy w parametrze nie będzie poprawnego formatu wg specyfikacji &lt;em&gt;JavaScript Object Notation&lt;/em&gt;.&lt;/p&gt;
</description>
            <pubDate>Sun, 26 Jan 2014 00:00:00 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2014/01/26/eval-czy-json-parse-porownanie-szybkosci.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2014/01/26/eval-czy-json-parse-porownanie-szybkosci.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/post-banner-javascript.png</image>
        </item>
        
        <item>
            <title>DevMeetings: Responsive Web Design [Relacja Live]</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Dziś DevMeetings zawitał do stolicy! Temat: &lt;em&gt;Responsive Web Design&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Miejsce: &lt;em&gt;Golden Floor Sky al. Jerozolimskie 123A (26 piętro), Warszawa&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Prowadzący: &lt;em&gt;Hubert Burdach z Front-Stream - &lt;a href=&quot;http://responsivehero.com/&quot;&gt;responsivehero.com/&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Skład: &lt;em&gt;30 osób (w tym 4 damy)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Responsive Web Design - temat bardzo ‘na czasie’. Każda szanująca się firma o profilu webdeveloperskim posiada responsywne portfolio.&lt;/p&gt;

&lt;p&gt;Przykłady:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.hypermediaisobar.pl/&quot;&gt;www.hypermediaisobar.pl&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.artegence.pl/&quot;&gt;www.artegence.pl&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.k2.pl/&quot;&gt;www.k2.pl&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Przykłady innych stron:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://jugendinfo.front-stream.com/&quot;&gt;jugendinfo.front-stream.com&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://otomoto.pl/&quot;&gt;otomoto.pl&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/post-banner-devmeetings.png&quot; itemprop=&quot;image&quot; alt=&quot;Baner promujący artykuł&quot; /&gt;
&lt;/figure&gt;

&lt;h4 id=&quot;900&quot;&gt;9:00&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;Rozpoczęcie szkolenia! Po 2 latach przerwy 😄&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;907&quot;&gt;9:07&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;prezentacja IT Crowd - Krzysztof Miksa
    &lt;ul&gt;
      &lt;li&gt;founded in 2011&lt;/li&gt;
      &lt;li&gt;7 developers&lt;/li&gt;
      &lt;li&gt;50% remote workers&lt;/li&gt;
      &lt;li&gt;web applications&lt;/li&gt;
      &lt;li&gt;Back-end systems&lt;/li&gt;
      &lt;li&gt;enterprise systems&lt;/li&gt;
      &lt;li&gt;messaging solutions&lt;/li&gt;
      &lt;li&gt;cloud computing&lt;/li&gt;
      &lt;li&gt;business process management&lt;/li&gt;
      &lt;li&gt;big data&lt;/li&gt;
      &lt;li&gt;ERP&lt;/li&gt;
      &lt;li&gt;Java&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;926&quot;&gt;9:26&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;styletiles.html - wszystkie możliwe komponenty prosto od designera, dla klienta, aby nie wysyłać *.psd’ków&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;928&quot;&gt;9:28&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;zaczynamy przygodę z RWD!&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;934&quot;&gt;9:34&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;jednostki: px, %, em, rem&lt;/li&gt;
  &lt;li&gt;em - względem kontenera w którym się znajdują&lt;/li&gt;
  &lt;li&gt;rem - względem korzenia (&amp;gt;html&amp;lt;)&lt;/li&gt;
  &lt;li&gt;target / context * 100 - pixele na procenty&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;938&quot;&gt;9:38&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;rem - nie możemy używać poniżej IE8&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;941&quot;&gt;9:41&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;Firefox - opcja “Powiększ tylko tekst” - różnica pomiędzy px i em&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;943&quot;&gt;9:43&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;co to jest BEM? Block Element Modifier - http://bem.info/method/&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;długie nazwy CSS Class&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;wydzielamy:&lt;/p&gt;
    &lt;ul&gt;
      &lt;li&gt;bloki np. box&lt;/li&gt;
      &lt;li&gt;elementy - np. box__element&lt;/li&gt;
      &lt;li&gt;modyfikatory - np. box box–wide&lt;/li&gt;
    &lt;/ul&gt;

    &lt;div class=&quot;language-html highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;  &lt;span class=&quot;c&quot;&gt;&amp;lt;!-- BLOCK --&amp;gt;&lt;/span&gt;

  &lt;span class=&quot;nt&quot;&gt;&amp;lt;div&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;class=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;box&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;

  &lt;span class=&quot;c&quot;&gt;&amp;lt;!-- ELEMENT --&amp;gt;&lt;/span&gt;

  &lt;span class=&quot;nt&quot;&gt;&amp;lt;div&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;class=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;box&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;nt&quot;&gt;&amp;lt;div&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;class=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;box__element&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;

  &lt;span class=&quot;c&quot;&gt;&amp;lt;!-- MODIFIER --&amp;gt;&lt;/span&gt;

  &lt;span class=&quot;nt&quot;&gt;&amp;lt;div&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;class=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;box box--wide&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
      &lt;span class=&quot;nt&quot;&gt;&amp;lt;div&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;class=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;box__element&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;946&quot;&gt;9:46&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;nie zwiększamy &lt;em&gt;specifity selectora&lt;/em&gt;, rozwiązaniem jest BEM!&lt;/p&gt;

    &lt;div class=&quot;language-css highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;  &lt;span class=&quot;nc&quot;&gt;.username&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;nl&quot;&gt;background&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;red&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

  &lt;span class=&quot;nc&quot;&gt;.login-box&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;.status&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;.username&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;nl&quot;&gt;background&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;green&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;950&quot;&gt;9:50&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;LESS, SASS, Compass - http://css-tricks.com/sass-vs-less/&lt;/li&gt;
  &lt;li&gt;SASS - placeholdery, są kompilowane w momencie kiedy są one potrzebne - prawdopodobnie nowy temat DevMeetingu!&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;1000&quot;&gt;10:00&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;pierwsze zadanie - konwersja pixele na remy i emy&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;1020&quot;&gt;10:20&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;Media Queries - kolejne zadanko&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;1022&quot;&gt;10:22&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.airsquirrels.com/reflector/&quot;&gt;Reflector&lt;/a&gt; - narzędzie do duplikowania ekranu&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;1024&quot;&gt;10:24&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;ustawienie viewport&lt;/p&gt;

    &lt;div class=&quot;language-html highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;  &lt;span class=&quot;nt&quot;&gt;&amp;lt;meta&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;viewport&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;content=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;width=device-width, initial-scale=1.0&quot;&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;iPad &amp;amp; iPhone domyślnie ma 981px&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;operator &lt;em&gt;not&lt;/em&gt; tylko przed &lt;em&gt;media types&lt;/em&gt; (np. screen, print, all, projectos)&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;em&gt;media queries&lt;/em&gt; features np. min-width, max, width&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;można definiować media type przy tagu&lt;/p&gt;

    &lt;div class=&quot;language-html highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;  &lt;span class=&quot;nt&quot;&gt;&amp;lt;link&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;rel=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;stylesheet&quot;&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;type=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;text/css&quot;&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;href=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;02_mq_03.css&quot;&lt;/span&gt;
      &lt;span class=&quot;na&quot;&gt;media=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;screen and (min-width:600px)&quot;&lt;/span&gt;
  &lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;zawsze pobierze plik - każda przeglądarka&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;1036&quot;&gt;10:36&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;media type &lt;em&gt;only&lt;/em&gt; - przeglądarki, które nie rozumieją media queries, zapis umowny, może być &lt;em&gt;“xxx”&lt;/em&gt;&lt;/p&gt;

    &lt;div class=&quot;language-css highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;  &lt;span class=&quot;k&quot;&gt;@media&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;only&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;screen&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;min-width&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;960px&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;nt&quot;&gt;body&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
          &lt;span class=&quot;nl&quot;&gt;background&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;no&quot;&gt;red&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;czy pisać media queries w pikselach? przy resize’owaniu font’a ma to znaczenie, gdy mamy zdefiniowany media queries w &lt;em&gt;em’ach&lt;/em&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;co jest browser nie wspiera? Z pomocą &lt;a href=&quot;https://github.com/scottjehl/Respond&quot;&gt;respond&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;CSS3 w arkuszach dla IE6 &lt;a href=&quot;http://selectivizr.com/&quot;&gt;selectivizr&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;1043&quot;&gt;10:43&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;wykrywanie w JS czy browser wspiera &lt;em&gt;media queries&lt;/em&gt;?&lt;/p&gt;

    &lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;  &lt;span class=&quot;nb&quot;&gt;window&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;matchMedia&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'(min-width: 768px)'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;matches&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://github.com/scottjehl/eCSSential&quot;&gt;eCSSential&lt;/a&gt; - dołączanie plików css tylko dla konkretnych warunków, reszta plików jest ściągana asynchronicznie&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;1050&quot;&gt;10:50&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/filamentgroup/quickconcat&quot;&gt;quickconcat&lt;/a&gt; - ściąganie jednego pliku *.php który będzie miał zawartość innych plików&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;1055&quot;&gt;10:55&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;przerwa… uff, pora na ciasteczko 😄&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;1120&quot;&gt;11:20&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;zadanie z media queries - dodanie zachowania dla 960px&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;1139&quot;&gt;11:39&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;em&gt;pierwszy!&lt;/em&gt; - prezentuję swoją przeróbkę przed grupą najlepszych developerów&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;1142&quot;&gt;11:42&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;Mobile First / Mobile Last (Desktop First)&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;1144&quot;&gt;11:44&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;każdy chwali się swoim doświadczeniem&lt;/li&gt;
  &lt;li&gt;przekrój developerów jest ogromny, są i programiści Javy, Ruby (Rails) oraz typowi Front-end-owcy i designerzy&lt;/li&gt;
  &lt;li&gt;doświadczenie niektórych jest bardzo duże, swoje&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;1159&quot;&gt;11:59&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;patterny do nawigacji
    &lt;ul&gt;
      &lt;li&gt;of canvas pattern - menu wyjeżdża z lewej strony&lt;/li&gt;
      &lt;li&gt;zamiast menu zastąpienie go &amp;lt;select&amp;gt;‘em&lt;/li&gt;
      &lt;li&gt;footer navigation - nawigacja na dole strony (link na górze przenosi nas niżej)&lt;/li&gt;
      &lt;li&gt;hamburger pattern&lt;/li&gt;
      &lt;li&gt;do nothing approach&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;1203&quot;&gt;12:03&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;trzecie zadanko - menu “of canvas pattern”&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;1236&quot;&gt;12:36&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;pierwszy - kolejny raz 😄&lt;/li&gt;
  &lt;li&gt;prezentuje swoje mini dzieło całej grupie&lt;/li&gt;
  &lt;li&gt;nie robi to piorunującego wrażenia ale zadanie zrealizowane!&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;1243&quot;&gt;12:43&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;coffee break! … pora na ciasteczko!&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;1300&quot;&gt;13:00&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;po przerwie wracamy!&lt;/li&gt;
  &lt;li&gt;content first - nigdy nie robimy na urządzenie&lt;/li&gt;
  &lt;li&gt;pomocne narzędzie &lt;a href=&quot;http://uxpin.com/&quot;&gt;uxpin.com&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.i-sklep.pl/rwdlist.html&quot;&gt;www.i-sklep.pl/rwdlist.html&lt;/a&gt; - przykład: &lt;a href=&quot;http://siglo.pl/&quot;&gt;siglo.pl&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;1310&quot;&gt;13:10&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;grid systemy:
    &lt;ul&gt;
      &lt;li&gt;&lt;a href=&quot;http://foundation.zurb.com/&quot;&gt;foundation.zurb.com&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;http://getbootstrap.com//css/#grid&quot;&gt;Twitter Bootstrap&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;http://inuitcss.com/&quot;&gt;inuitcss.com&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;http://purecss.io/&quot;&gt;purecss.io&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;1317&quot;&gt;13:17&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;pizza time - wszyscy szybko pobiegli za jedzeniem… biegnę i ja, jednak tylko na ciasteczka 😄&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;1350&quot;&gt;13:50&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;po przerwie! jedziemy dalej&lt;/li&gt;
  &lt;li&gt;problem: zaokrąglanie wartości do dołu w safari&lt;/li&gt;
  &lt;li&gt;solutions:
    &lt;ul&gt;
      &lt;li&gt;marginesy negatywne,&lt;/li&gt;
      &lt;li&gt;foundation: block grid&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;http://www.barrelny.com/blog/text-align-justify-and-rwd/&quot;&gt;barrelny.com/blog/text-align-justify-and-rwd/&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;http://susy.oddbird.net/&quot;&gt;susy.oddbird.net&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;http://css-tricks.com/snippets/css/a-guide-to-flexbox/&quot;&gt;flexbox&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;1410&quot;&gt;14:10&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;prezentacja nt. flexbox’a otwiera mi szeroko oczy na projektowanie interfejsu&lt;/p&gt;

    &lt;div class=&quot;language-css highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;  &lt;span class=&quot;nc&quot;&gt;.flex&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;nl&quot;&gt;display&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;flex&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;nl&quot;&gt;flex-direction&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;row&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;1425&quot;&gt;14:25&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;czwarte zadanie - responsywny slider&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;1435&quot;&gt;14:35&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;jak zrobić responsywne obrazki?&lt;/p&gt;

    &lt;div class=&quot;language-html highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;  &lt;span class=&quot;nt&quot;&gt;&amp;lt;img&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;src=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;http://placebear.com/200/300&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;alt=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&quot;&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;

    &lt;div class=&quot;language-css highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;  &lt;span class=&quot;nt&quot;&gt;img&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;nl&quot;&gt;max-width&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;100%&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;ale co jeśli obrazek ma określone wymiary?&lt;/p&gt;

    &lt;div class=&quot;language-html highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;  &lt;span class=&quot;nt&quot;&gt;&amp;lt;img&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;src=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;http://placebear.com/200/300&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;alt=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;width=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;200&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;height=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;300&quot;&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;

    &lt;div class=&quot;language-css highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;  &lt;span class=&quot;nt&quot;&gt;img&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;nl&quot;&gt;max-width&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;100%&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;nl&quot;&gt;height&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;auto&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;1451&quot;&gt;14:51&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;prosty temat (responsywny slider) ale jednak mnie przerósł 😄&lt;/li&gt;
  &lt;li&gt;wierzę, że po zakończeniu warsztatów zasiądę do projektu kolejny raz ale produkt będzie spełniał oczekiwania!&lt;/li&gt;
  &lt;li&gt;ciekawe kto zaprezentuje swoje dzieło? może jakaś pani?&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;1501&quot;&gt;15:01&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;przykład z &lt;a href=&quot;https://iosscripts.com/iosslider/&quot;&gt;iosSlider&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;translate3d korzysta z akceleracji sprzętowej, przerzuca proces z CPU na GPU&lt;/li&gt;
  &lt;li&gt;ale nie robimy z &lt;em&gt;* translate3d&lt;/em&gt;&lt;/li&gt;
  &lt;li&gt;Safari ma w sobie remote debugger, gdy urządzenie Apple jest podłączone&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://vanamco.com/ghostlab/&quot;&gt;ghost lab&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;wayne dalton remote control&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.browserstack.com/&quot;&gt;www.browserstack.com&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;prosta biblioteka do rozwiązać &lt;a href=&quot;http://eightmedia.github.io/hammer.js/&quot;&gt;hammer.js&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;1520&quot;&gt;15:20&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;jeśli jest powyżej 15-20 to musimy wyłączyć kosztowne efekty wizualne
    &lt;ul&gt;
      &lt;li&gt;&lt;em&gt;Show paint rectangles&lt;/em&gt;&lt;/li&gt;
      &lt;li&gt;&lt;em&gt;Force accelerated compositing / Enable continuous page repainting&lt;/em&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;badanie performance &lt;em&gt;DevTools&lt;/em&gt;&lt;/p&gt;

    &lt;div class=&quot;language-css highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;  &lt;span class=&quot;nc&quot;&gt;.box&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;nl&quot;&gt;position&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;fixed&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;c&quot;&gt;/* ciężkie dla przeglądarek */&lt;/span&gt;
      &lt;span class=&quot;nl&quot;&gt;-webkit-transform&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;translateZ&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;m&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt; &lt;span class=&quot;c&quot;&gt;/* solucja */&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;przeglądarka pobiera obrazek kiedy potrzebuje, np. media queries to stwierdzają&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;display: none; pobiera zawsze obrazki&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;background-image: -webkit…&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;https://github.com/scottjehl/picturefill&quot;&gt;picturefill.js&lt;/a&gt; polyffil dla tagu &lt;a href=&quot;http://www.w3.org/TR/html-picture-element/&quot;&gt;&amp;gt;picture&amp;lt;&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;działa tylko w nightly Google Chrome:&lt;/p&gt;

    &lt;div class=&quot;language-html highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;  &lt;span class=&quot;nt&quot;&gt;&amp;lt;img&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;srcset=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;alt=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;&quot;&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;css-tricks.com/foresight-js/&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;font-family i content - możemy przekazać dowolny string&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;resrc.it/&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;mobify.com/mobifyjs/ - proces capturingu&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;ress.io/&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;github.com/adamdbradley/focal-point&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;1541&quot;&gt;15:41&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;lekkie zmęczenie materiału&lt;/li&gt;
  &lt;li&gt;resizowanie tła: background-size: (cover, auto 100%, 100% auto, 100% 100%)&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;1544&quot;&gt;15:44&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;padding-bottom - szerokość / wysokość * 100 px&lt;/li&gt;
  &lt;li&gt;obliczanie po stronie serwera&lt;/li&gt;
  &lt;li&gt;appelsiini.net/projects/lazyload&lt;/li&gt;
  &lt;li&gt;nie trafimy linii czytania na mobile&lt;/li&gt;
  &lt;li&gt;nie mamy repaint &amp;amp; reflow&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;1546&quot;&gt;15:46&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;przerwa na wodę 😄&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;1601&quot;&gt;16:01&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;ostatnia część&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;-webkit-overflow-scrolling: touch;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;-webkit-column-count: 3;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;-webkit column-style: 1px solid red;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;pomiędzy 45 a 75 jest najlepsze do czytania oraz do 10 słów&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;przydatne narzędzie: http://nerd.vasilis.nl/code/measure-help/&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;zmiana układu strony dla różnych języków:&lt;/p&gt;

    &lt;div class=&quot;language-css highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;  &lt;span class=&quot;nd&quot;&gt;:lang&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;de&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;div&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;nl&quot;&gt;-webkit-count-column&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;nowa dyrektywa:&lt;/p&gt;

    &lt;div class=&quot;language-css highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;  &lt;span class=&quot;nc&quot;&gt;.par&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;nl&quot;&gt;font&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;-applce-system-body&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;c&quot;&gt;/* domyślna czcionka w iOS7 */&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;w iOS7 wprowadzono dynamiczne fonty, jeśli w ustawieniach urządzenia zmienimy rozmiar będzie to aktywne na wszystkich stronach z poprzednią dyrektywą&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;icomoon.io/&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;nowy iOS wprowadza “ulepszenia”:&lt;/p&gt;

    &lt;div class=&quot;language-css highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;  &lt;span class=&quot;nc&quot;&gt;.foo&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;err&quot;&gt;-webkit-font-smoothing-&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;antialiased;&lt;/span&gt;
      &lt;span class=&quot;err&quot;&gt;-moz-osx-font-smoothing-&lt;/span&gt; &lt;span class=&quot;err&quot;&gt;grayscale;&lt;/span&gt; &lt;span class=&quot;c&quot;&gt;/* OS X domyślnie pogrubia niektóre elementy elementy */&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;text-rendering: optimizeLegibility&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;l20n.org/&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;a href=&quot;http://nshipster.com/network-link-conditioner/&quot;&gt;Network Link Conditioner&lt;/a&gt; - spowolnienie łącza na macOS&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;ładowanie fontów - WebFontConfig&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;1637&quot;&gt;16:37&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;pattern dla przeglądania tabelek:&lt;/li&gt;
  &lt;li&gt;thead, tbody, tfooter - display: block&lt;/li&gt;
  &lt;li&gt;tbody - overflow: scroll&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;1642&quot;&gt;16:42&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;skalowanie materiałów wideo - &lt;a href=&quot;http://fitvidsjs.com/&quot;&gt;fitvidsjs.com&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;wykrywanie feature-rów: modernizr, &lt;a href=&quot;https://github.com/phiggins42/has.js/&quot;&gt;has.js&lt;/a&gt;&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;konfiguracja &lt;em&gt;r.js&lt;/em&gt;:&lt;/p&gt;

    &lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;  &lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;
  &lt;span class=&quot;nx&quot;&gt;has&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;s2&quot;&gt;&quot;audio-mp3&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;true&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// dołącza tylko te warunki, które są spełniane&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;1700---koniec-szkolenia&quot;&gt;17:00 - Koniec szkolenia&lt;/h4&gt;

&lt;p&gt;To było niesamowite, znowu poczuć się na warsztatach DevMeetings, choć nie było niestety, autora tego zamieszania Piotra Zwolińskiego, ani żadnego baneru reklamowego DevMeetings.&lt;/p&gt;

&lt;p&gt;Dziękuję serdecznie, za mocne przygotowanie teoretyczne oraz praktyczne.&lt;/p&gt;

&lt;p&gt;PS. Na dodatek ten certyfikat robi wrażenie:&lt;/p&gt;

&lt;figure class=&quot;social-center-block&quot;&gt;
&lt;blockquote class=&quot;twitter-tweet&quot;&gt;&lt;p lang=&quot;en&quot; dir=&quot;ltr&quot;&gt;After &lt;a href=&quot;https://twitter.com/DevMeetingsPL?ref_src=twsrc%5Etfw&quot;&gt;@DevMeetingsPL&lt;/a&gt; with certificate! Thanks! ;) &lt;a href=&quot;http://t.co/40WZzFg0Cv&quot;&gt;pic.twitter.com/40WZzFg0Cv&lt;/a&gt;&lt;/p&gt;&amp;mdash; Piotr Kowalski (@piecioshka) &lt;a href=&quot;https://twitter.com/piecioshka/status/406819269536931840?ref_src=twsrc%5Etfw&quot;&gt;November 30, 2013&lt;/a&gt;&lt;/blockquote&gt;
&lt;script async=&quot;&quot; src=&quot;https://platform.twitter.com/widgets.js&quot; charset=&quot;utf-8&quot;&gt;&lt;/script&gt;

&lt;/figure&gt;
</description>
            <pubDate>Sat, 30 Nov 2013 00:00:00 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2013/11/30/devmeetings-responsive-web-design-relacja-live.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2013/11/30/devmeetings-responsive-web-design-relacja-live.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/post-banner-devmeetings.png</image>
        </item>
        
        <item>
            <title>Git. Początki w najpopularniejszym systemie kontroli wersji</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Kilka tygodni temu miałem przyjemność zostać prelegentem na uczelni.
Miałem za zadanie wybranie dowolnego systemu kontroli wersji,
oraz przedstawienie jego swojej grupie.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/post-banner-git.jpg&quot; itemprop=&quot;image&quot; alt=&quot;Baner promujący artykuł&quot; /&gt;
&lt;/figure&gt;

&lt;p&gt;Ze względu na popularność i niezawodność (oraz aktualny trend) wybrałem
rozproszony system kontroli wersji &lt;strong&gt;Git&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Używam go już 3 rok i jestem zadowolony. Nie przypominam sobie sytuacji,
w której bym na niego narzekał.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;W sekcji &lt;a href=&quot;#bibliografia&quot;&gt;Bibliografia&lt;/a&gt; (poniżej) pierwszy odnośnik kieruje do
mojej prezentacji. Zachęcam do szybkiej weryfikacji moich opisów
poszczególnych zagadnień. Zawarłem w niej tylko skromny zalążek Gita, ale w
taki sposób, abyś po jej przeczytaniu był w stanie sobie z nim poradzić.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id=&quot;przykładowe-zadania-repozytorium&quot;&gt;Przykładowe zadania repozytorium&lt;/h2&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# ustawienie konta użytkownika&lt;/span&gt;
git config &lt;span class=&quot;nt&quot;&gt;--global&lt;/span&gt; user.name &lt;span class=&quot;s2&quot;&gt;&quot;NICK&quot;&lt;/span&gt;
git config &lt;span class=&quot;nt&quot;&gt;--global&lt;/span&gt; user.email &lt;span class=&quot;s2&quot;&gt;&quot;ADRES_EMAIL&quot;&lt;/span&gt;

&lt;span class=&quot;c&quot;&gt;# wyświetlanie listy plików zmodyfikowanych i utworzonych&lt;/span&gt;
git status

&lt;span class=&quot;c&quot;&gt;# wyświetlenie listy wszystkich rewizji&lt;/span&gt;
git log

&lt;span class=&quot;c&quot;&gt;# aplikacja okienkowa do zarządzania repozytorium&lt;/span&gt;
gitk
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Operacje na rewizjach (commit-ach):&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# dodanie wszystkich plików na changelistę&lt;/span&gt;
git add &lt;span class=&quot;nt&quot;&gt;-A&lt;/span&gt;

&lt;span class=&quot;c&quot;&gt;# zapisuje wszystkie zmodyfikowane pliki w repozytorium&lt;/span&gt;
git commit &lt;span class=&quot;nt&quot;&gt;-am&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;KOMENTARZ&quot;&lt;/span&gt;

&lt;span class=&quot;c&quot;&gt;# przywraca repozytorium gdzie HEAD jest wybraną rewizją&lt;/span&gt;
git reset ID_REWIZJI

&lt;span class=&quot;c&quot;&gt;# tworzy rewizję która wprowadza odwrotne zmiany we wskazanej rewizji&lt;/span&gt;
git revert ID_REWIZJI

&lt;span class=&quot;c&quot;&gt;# tworzy brancha gdzie HEADem jest wskazana rewizja&lt;/span&gt;
git checkout ID_REWIZJI

&lt;span class=&quot;c&quot;&gt;# usuwanie plików i katalogów, które nie zostały dodane do repozytorium,&lt;/span&gt;
&lt;span class=&quot;c&quot;&gt;# pliki nie istnieją na changeliście&lt;/span&gt;
git clean &lt;span class=&quot;nt&quot;&gt;-df&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Operacje na gałęziach (branch-ach):&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# wyświetlenie listy wszystkich branchy w repozytorium&lt;/span&gt;
git branch &lt;span class=&quot;nt&quot;&gt;-a&lt;/span&gt;

&lt;span class=&quot;c&quot;&gt;# utworzenie lokalnej gałęzi + przełączenie się na nią&lt;/span&gt;
git checkout &lt;span class=&quot;nt&quot;&gt;-b&lt;/span&gt; BRANCH

&lt;span class=&quot;c&quot;&gt;# usunięcie lokalnej gałęzi&lt;/span&gt;
git branch &lt;span class=&quot;nt&quot;&gt;--delete&lt;/span&gt; BRANCH

&lt;span class=&quot;c&quot;&gt;# usunięcie brancha z serwera&lt;/span&gt;
git push origin &lt;span class=&quot;nt&quot;&gt;--delete&lt;/span&gt; BRANCH

&lt;span class=&quot;c&quot;&gt;# włączenie wskazanego branch do aktualnego&lt;/span&gt;
git merge BRANCH
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;-plusy&quot;&gt;&lt;i class=&quot;icon-good icon-plus&quot;&gt;&lt;/i&gt; Plusy&lt;/h2&gt;

&lt;p&gt;Głównym plusem IMHO jest to, że podczas pracy nad projektem mogę tworzyć
&lt;a href=&quot;http://pl.wikipedia.org/wiki/Commit&quot;&gt;commity&lt;/a&gt; (rewizje) bez aktualizacji głównego repozytorium.
Daje to przewagę na systemami scentralizowanymi, których reprezentantem
jest &lt;a href=&quot;http://pl.wikipedia.org/wiki/Subversion&quot;&gt;SVN&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Kiedy będę gotowy to wykonam:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;git push origin main
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Wszystkie moje zmiany lądują na serwerze. W głównej gałęzi (&lt;code class=&quot;highlighter-rouge&quot;&gt;branch&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;Kiedy będę chciał pracować na najnowszej wersji projektu zapisanego w
repozytorium to uruchomię:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;git pull origin main
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;-minusy&quot;&gt;&lt;i class=&quot;icon-poor icon-minus&quot;&gt;&lt;/i&gt; Minusy&lt;/h2&gt;

&lt;p&gt;Podczas mojego skromnego doświadczenie, nie miałem żadnych problemów z
Gitem, które by wynikały z niepoprawne pracy programu.&lt;/p&gt;

&lt;h2 id=&quot;bibliografia&quot;&gt;Bibliografia&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;Link do slajdów: &lt;a href=&quot;http://www.slideshare.net/piecioshka/git-22940788&quot;&gt;http://www.slideshare.net/piecioshka/git-22940788&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Strona główna projektu: &lt;a href=&quot;http://git-scm.com/&quot;&gt;http://git-scm.com/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;!-- Resources --&gt;

</description>
            <pubDate>Sat, 14 Sep 2013 00:00:00 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2013/09/14/git-poczatki-w-najpopularniejszym-systemie-kontroli-wersji.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2013/09/14/git-poczatki-w-najpopularniejszym-systemie-kontroli-wersji.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/post-banner-git.jpg</image>
        </item>
        
        <item>
            <title>Uważaj na "use strict", czyli Strict mode w praktyce</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;W specyfikacji &lt;strong&gt;ECMAScript 5&lt;/strong&gt; pojawiło się mnóstwo technik,
które ułatwią proces developmentu każdemu programiście.
Jednym z nich jest tzw. tryb ścisły (&lt;em&gt;ang. strict mode&lt;/em&gt;).&lt;/p&gt;

&lt;p&gt;Tryb ścisły kontroluje jakość naszego kodu źródłowego.
Nie pozwala na stworzenie kodu, który jest okraszony błędnym działaniem (o tyle
o ile - nie zostaną wykryte błędy niezwiązane z logiką biznesową).&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/post-banner-javascript.png&quot; itemprop=&quot;image&quot; alt=&quot;Baner promujący artykuł&quot; /&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;jak-włączyć&quot;&gt;Jak włączyć?&lt;/h2&gt;

&lt;p&gt;Włączenie trybu ścisłego opiera się na dodaniu na początku pliku (bądź funkcji)
takiej linijki:&lt;/p&gt;

&lt;div class=&quot;language-js highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;s2&quot;&gt;&quot;use strict&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Dzięki tej linijce, interpreter użyje bardziej restrykcyjnych warunków w
swoim procesie analizy kodu i każdą niepoprawną konstrukcję potraktuje srogo.&lt;/p&gt;

&lt;h2 id=&quot;kilka-przykładów&quot;&gt;Kilka przykładów&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;Jak tego w ogóle używać?&lt;/p&gt;

    &lt;div class=&quot;language-js highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;  &lt;span class=&quot;c1&quot;&gt;// Tryb zwykły.&lt;/span&gt;

  &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;s2&quot;&gt;&quot;use strict&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;c1&quot;&gt;// Dla tej funkcji włączony jest tryb ścisłej interpretacji!&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;}());&lt;/span&gt;

  &lt;span class=&quot;c1&quot;&gt;// Tryb zwykły.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Czym włączenie trybu ścisłego skutkuje w kodzie?&lt;/p&gt;

    &lt;div class=&quot;language-js highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;  &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;nx&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// Window&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;}());&lt;/span&gt;

  &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;s2&quot;&gt;&quot;use strict&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
      &lt;span class=&quot;nx&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// undefined&lt;/span&gt;
  &lt;span class=&quot;p&quot;&gt;}());&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;zmienne-globalne&quot;&gt;Zmienne globalne&lt;/h2&gt;

&lt;p&gt;Ile razy przez przypadek zapomniałeś dodania wyrażenia &lt;code class=&quot;highlighter-rouge&quot;&gt;var&lt;/code&gt;
podczas definicji zmiennej? Raz na rok zdarza się to każdemu.&lt;/p&gt;

&lt;div class=&quot;language-js highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nx&quot;&gt;zmienna1&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// Zmienna globalna zostanie utworzona.&lt;/span&gt;
&lt;span class=&quot;c1&quot;&gt;// W tym zasięgu nie jest włączony tryb ścisły.&lt;/span&gt;

&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;s2&quot;&gt;&quot;use strict&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;zmienna2&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// ReferenceError: zmienna2 is not defined&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}());&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;To jak mam się odwołać do obiektu &lt;em&gt;globalnego?&lt;/em&gt;&lt;/p&gt;

&lt;div class=&quot;language-js highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;root&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;s2&quot;&gt;&quot;use strict&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;c1&quot;&gt;// imports&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;root&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;jQuery&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;_&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;root&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;p&quot;&gt;}(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;lub:&lt;/p&gt;

&lt;div class=&quot;language-js highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;root&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;s2&quot;&gt;&quot;use strict&quot;&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

    &lt;span class=&quot;c1&quot;&gt;// imports&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;root&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;jQuery&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;_&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;root&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;p&quot;&gt;}(&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;window&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;));&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// &amp;lt;-- wcześniej tutaj był &quot;this&quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Ten drugi sposób &lt;strong&gt;nie zawsze zadziała&lt;/strong&gt;.
Istnieją mianowicie środowiska gdzie obiekt &lt;code class=&quot;highlighter-rouge&quot;&gt;window&lt;/code&gt; nie jest dostępny.&lt;/p&gt;

&lt;p&gt;Chyba najprostszym przykładem będzie &lt;em&gt;Node.js&lt;/em&gt;, czyli aplikacja po stronie serwera.
Na serwerze nie mamy dostępu do okna przeglądarki, więc obiekt &lt;code class=&quot;highlighter-rouge&quot;&gt;window&lt;/code&gt; nie ma prawa istnieć.
Jeśli chciałbyś uzyskać dostęp do globalnego obiektu w Node.js to skorzystać z obiektu &lt;code class=&quot;highlighter-rouge&quot;&gt;global&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Drugim przykładem są silniki urządzeń, takich jak STB. Urządzenia te nie
posiadają wewnętrznej przeglądarki do uruchamiania interpretera JavaScript.&lt;/p&gt;

&lt;p&gt;Pełna lista niedozwolonych konstrukcji dostępna jest na portalu
&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Strict_mode&quot;&gt;MDN&lt;/a&gt;.
Zapraszam Cię do zapoznania się ze wszystkimi zakazanymi konstrukcjami.&lt;/p&gt;

&lt;h2 id=&quot;podsumowanie&quot;&gt;Podsumowanie&lt;/h2&gt;

&lt;p&gt;Jeśli nie używasz &lt;strong&gt;Strict mode&lt;/strong&gt; (a korzystasz ze składni ES5) to &lt;em&gt;gorąco&lt;/em&gt;
rekomenduję użycie. Pisanie aplikacji z użyciem tego trybu na pewno nie zaszkodzi
a może pomóc.&lt;/p&gt;
</description>
            <pubDate>Wed, 12 Jun 2013 00:00:00 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2013/06/12/uwazaj-na-use-strict-czyli-strict-mode-w-praktyce.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2013/06/12/uwazaj-na-use-strict-czyli-strict-mode-w-praktyce.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/post-banner-javascript.png</image>
        </item>
        
        <item>
            <title>Funkcja to czy obiekt, któż to wie?</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;W dużym projekcie występuje często spotykany problem. Mianowicie, gdy funkcję traktujemy jako konstruktor obiektu, a nie powinniśmy i przed wywołaniem funkcji dopisaliśmy operator &lt;code class=&quot;highlighter-rouge&quot;&gt;new&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Co wtedy? Jak zachowa się aplikacja? Jak to sprawdzić? Jak zapobiec?&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/post-banner-javascript.png&quot; itemprop=&quot;image&quot; alt=&quot;Baner promujący artykuł&quot; /&gt;
&lt;/figure&gt;

&lt;p&gt;Jeżeli &lt;abbr title=&quot;wzorzec&quot;&gt;pattern&lt;/abbr&gt; użyty w aplikacji korzysta z kontekstu to sytuacja może się skomplikować. Ciało funkcji, w którym jest odniesienie się do aktualnego kontekstu będzie różny w zależności w jaki sposób skorzystamy z definicji funkcji.&lt;/p&gt;

&lt;p&gt;Jeśli wywołamy funkcję w globalnym scope’ie to &lt;code class=&quot;highlighter-rouge&quot;&gt;this&lt;/code&gt; odnosi się do obiektu globalnego &lt;code class=&quot;highlighter-rouge&quot;&gt;Window&lt;/code&gt;. Jeśli jednak przez pomyłkę, bądź specjalnie użyjemy przed wywołaniem funkcji operatora &lt;code class=&quot;highlighter-rouge&quot;&gt;new&lt;/code&gt; to &lt;code class=&quot;highlighter-rouge&quot;&gt;this&lt;/code&gt; będzie referencją do obiektu, który właśnie powstał.&lt;/p&gt;

&lt;p&gt;Przykład &lt;em&gt;cross-platform-owej&lt;/em&gt; implementacji:&lt;/p&gt;

&lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;test&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kr&quot;&gt;arguments&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;callee&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;prototype&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;kd&quot;&gt;constructor&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;kd&quot;&gt;constructor&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;nx&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'obiekt'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;else&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;nx&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'funkcja'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;nx&quot;&gt;test&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// Print: &quot;funkcja&quot;&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;test&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// Print: &quot;obiekt&quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
</description>
            <pubDate>Fri, 10 Feb 2012 00:00:00 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2012/02/10/funkcja-to-czy-obiekt-ktoz-to-wie.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2012/02/10/funkcja-to-czy-obiekt-ktoz-to-wie.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/post-banner-javascript.png</image>
        </item>
        
        <item>
            <title>Wykrywanie wersji interpretera JavaScript</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Jak wykryć wersję interpretera &lt;code class=&quot;highlighter-rouge&quot;&gt;JavaScript&lt;/code&gt; w przeglądarce?&lt;/p&gt;

&lt;p&gt;Każda platforma zawiera inne dobrodziejstwa języka. Niektóre platformy
zawierają natywne rozwiązania, których w starszych wersjach silnika brakuje.
Z pomocą przychodzi tutaj &lt;a href=&quot;https://github.com/piecioshka/pklib.js&quot;&gt;pklib&lt;/a&gt;,
który uzupełnia zbiór funkcji z nowszych wersji interpretera w jednym miejscu.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/post-banner-javascript.png&quot; itemprop=&quot;image&quot; alt=&quot;Baner promujący artykuł&quot; /&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;jak-wykryć&quot;&gt;Jak wykryć?&lt;/h2&gt;

&lt;p&gt;Sposób jest prosty. Przeglądarki mają zaimplementowany tzw. &lt;code class=&quot;highlighter-rouge&quot;&gt;quirk mode&lt;/code&gt;.
Wykorzystajmy atrybut &lt;code class=&quot;highlighter-rouge&quot;&gt;language&lt;/code&gt; elementu &lt;code class=&quot;highlighter-rouge&quot;&gt;script&lt;/code&gt;.&lt;/p&gt;

&lt;div class=&quot;language-html highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;version&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mf&quot;&gt;1.0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;script &lt;/span&gt;&lt;span class=&quot;na&quot;&gt;language=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;javascript1.1&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;version&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mf&quot;&gt;1.1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;script &lt;/span&gt;&lt;span class=&quot;na&quot;&gt;language=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;javascript1.2&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;version&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mf&quot;&gt;1.2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;script &lt;/span&gt;&lt;span class=&quot;na&quot;&gt;language=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;javascript1.3&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;version&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mf&quot;&gt;1.3&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;script &lt;/span&gt;&lt;span class=&quot;na&quot;&gt;language=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;javascript1.4&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;version&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mf&quot;&gt;1.4&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;script &lt;/span&gt;&lt;span class=&quot;na&quot;&gt;language=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;javascript1.5&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;version&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mf&quot;&gt;1.5&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;script &lt;/span&gt;&lt;span class=&quot;na&quot;&gt;language=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;javascript1.6&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;version&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mf&quot;&gt;1.6&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;script &lt;/span&gt;&lt;span class=&quot;na&quot;&gt;language=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;javascript1.7&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;version&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mf&quot;&gt;1.7&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;script &lt;/span&gt;&lt;span class=&quot;na&quot;&gt;language=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;javascript1.8&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;version&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mf&quot;&gt;1.8&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;script &lt;/span&gt;&lt;span class=&quot;na&quot;&gt;language=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;javascript1.9&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;version&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mf&quot;&gt;1.9&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;script &lt;/span&gt;&lt;span class=&quot;na&quot;&gt;language=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;javascript2.0&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;version&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mf&quot;&gt;2.0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;script &lt;/span&gt;&lt;span class=&quot;na&quot;&gt;language=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;javascript2.1&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;version&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mf&quot;&gt;2.1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;script &lt;/span&gt;&lt;span class=&quot;na&quot;&gt;language=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;javascript99.0&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;version&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;null&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;script&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'JavaScript version '&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;version&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;' supported'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;demo-&quot;&gt;Demo 🎉&lt;/h2&gt;

&lt;p&gt;Nie chce Ci się tworzyć pliku HTML? Stworzyłem go za Ciebie.
Rzuć okiem na &lt;a href=&quot;https://piecioshka.github.io/display-supported-version-of-javascript/&quot;&gt;https://piecioshka.github.io/display-supported-version-of-javascript/&lt;/a&gt;&lt;/p&gt;
</description>
            <pubDate>Thu, 09 Feb 2012 00:00:00 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2012/02/09/wykrywanie-wersji-interpretera-javascript.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2012/02/09/wykrywanie-wersji-interpretera-javascript.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/post-banner-javascript.png</image>
        </item>
        
        <item>
            <title>Haki CSS na przeglądarkę Internet Explorer</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Przychodzi taka chwila w życiu każdego webmaster-a kiedy nasze rozwiązania
nie wyglądają spójnie na wszystkich przeglądarkach. Najczęstszym
przypadkiem, gdzie &lt;abbr title=&quot;pocięty projekt graficzny&quot;&gt;layout&lt;/abbr&gt;
strony odbiega od rzeczywistego pojawia się na przeglądarkach z Redmond.&lt;/p&gt;

&lt;p&gt;Przeglądarka &lt;strong&gt;Internet Explorer&lt;/strong&gt; jest bardzo nieobliczalną przeglądarką.
Świat jej nigdy nie zapomni.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/hacks/hacks-css-ie.jpg&quot; itemprop=&quot;image&quot; alt=&quot;Baner promujący artykuł&quot; /&gt;
&lt;/figure&gt;

&lt;p&gt;Zamieszczam duży zbiór kruczków jakie mogą być przydatne w “poprawianiu”
layoutu.&lt;/p&gt;

&lt;div class=&quot;language-css highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nt&quot;&gt;border&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;1px&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;solid&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;#000&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;c&quot;&gt;/* dla wszystkich, domyślnie */&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;internet-explorer-50-60-70&quot;&gt;Internet Explorer 5.0, 6.0, 7.0&lt;/h2&gt;

&lt;div class=&quot;language-css highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;o&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;border&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;1px&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;solid&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;#000&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;c&quot;&gt;/* IE: 5, 6, 7 */&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;internet-explorer-60&quot;&gt;Internet Explorer 6.0&lt;/h2&gt;

&lt;div class=&quot;language-css highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nt&quot;&gt;_border&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;1px&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;solid&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;#000&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;c&quot;&gt;/* IE: 6 */&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;internet-explorer-70&quot;&gt;Internet Explorer 7.0&lt;/h2&gt;

&lt;div class=&quot;language-css highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;err&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;border&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;1px&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;solid&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;#000&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;c&quot;&gt;/* IE: 7 */&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;~&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;border&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;1px&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;solid&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;#000&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;c&quot;&gt;/* IE: 7 */&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;border&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;1px&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;solid&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;#000&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;c&quot;&gt;/* IE: 7 */&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;?&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;border&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;1px&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;solid&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;#000&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;c&quot;&gt;/* IE: 7 */&lt;/span&gt;
&lt;span class=&quot;nf&quot;&gt;#border&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;1px&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;solid&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;#000&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;c&quot;&gt;/* IE: 7 */&lt;/span&gt;
&lt;span class=&quot;k&quot;&gt;@border&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;1px&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;solid&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;#000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;c&quot;&gt;/* IE: 7 */&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;border&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;1px&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;solid&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;#000&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;c&quot;&gt;/* IE: 7 */&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;border&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;1px&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;solid&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;#000&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;c&quot;&gt;/* IE: 7 */&lt;/span&gt;
&lt;span class=&quot;o&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;border&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;1px&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;solid&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;#000&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;c&quot;&gt;/* IE: 7 */&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;border&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;1px&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;solid&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;#000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;c&quot;&gt;/* IE: 7 */&lt;/span&gt;
&lt;span class=&quot;err&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;border&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;1px&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;solid&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;#000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;c&quot;&gt;/* IE: 7 */&lt;/span&gt;
&lt;span class=&quot;err&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;border&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;1px&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;solid&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;#000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;c&quot;&gt;/* IE: 7 */&lt;/span&gt;
&lt;span class=&quot;err&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;border&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;1px&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;solid&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;#000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;c&quot;&gt;/* IE: 7 */&lt;/span&gt;
&lt;span class=&quot;err&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;border&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;1px&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;solid&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;#000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;c&quot;&gt;/* IE: 7 */&lt;/span&gt;
&lt;span class=&quot;err&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;border&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;1px&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;solid&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;#000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;c&quot;&gt;/* IE: 7 */&lt;/span&gt;
&lt;span class=&quot;err&quot;&gt;&amp;amp;lt;&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;border&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;1px&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;solid&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;#000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;c&quot;&gt;/* IE: 7 */&lt;/span&gt;
&lt;span class=&quot;err&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;border&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;1px&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;solid&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;#000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;c&quot;&gt;/* IE: 7 */&lt;/span&gt;
&lt;span class=&quot;err&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;border&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;1px&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;solid&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;#000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;c&quot;&gt;/* IE: 7 */&lt;/span&gt;
&lt;span class=&quot;err&quot;&gt;^&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;border&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;1px&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;solid&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;#000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;c&quot;&gt;/* IE: 7 */&lt;/span&gt;
&lt;span class=&quot;err&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;border&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;1px&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;solid&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;#000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;c&quot;&gt;/* IE: 7 */&lt;/span&gt;
&lt;span class=&quot;err&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;border&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;1px&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;solid&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;#000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;c&quot;&gt;/* IE: 7 */&lt;/span&gt;
&lt;span class=&quot;err&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;border&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;1px&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;solid&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;#000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;c&quot;&gt;/* IE: 7 */&lt;/span&gt;
&lt;span class=&quot;err&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;border&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;1px&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;solid&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;#000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;c&quot;&gt;/* IE: 7 */&lt;/span&gt;
&lt;span class=&quot;err&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;nl&quot;&gt;border&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;1px&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;solid&lt;/span&gt; &lt;span class=&quot;m&quot;&gt;#000&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;c&quot;&gt;/* IE: 7 */&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;internet-explorer-80&quot;&gt;Internet Explorer 8.0&lt;/h2&gt;

&lt;div class=&quot;language-css highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nt&quot;&gt;border&lt;/span&gt; &lt;span class=&quot;c&quot;&gt;/*\**/&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;1px&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;solid&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;#000&lt;/span&gt;&lt;span class=&quot;err&quot;&gt;\&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;9&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;c&quot;&gt;/* IE: 8 */&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Bardzo dużo informacji można znaleźć na jednej z podstron na anglojęzycznej
&lt;a href=&quot;http://en.wikipedia.org/wiki/CSS_filter&quot;&gt;Wikipedii&lt;/a&gt;&lt;/p&gt;

&lt;!-- Resources --&gt;

</description>
            <pubDate>Thu, 09 Feb 2012 00:00:00 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2012/02/09/haki-css-na-internet-explorer.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2012/02/09/haki-css-na-internet-explorer.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/hacks/hacks-css-ie.jpg</image>
        </item>
        
        <item>
            <title>bind() obok call() i apply() jako piękna natura języka</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Zasada działania metody &lt;code class=&quot;highlighter-rouge&quot;&gt;bind()&lt;/code&gt; opiera się na istniejących
metodach &lt;code class=&quot;highlighter-rouge&quot;&gt;call()&lt;/code&gt; i &lt;code class=&quot;highlighter-rouge&quot;&gt;apply()&lt;/code&gt;. Funkcja &lt;code class=&quot;highlighter-rouge&quot;&gt;bind()&lt;/code&gt; różni się od &lt;code class=&quot;highlighter-rouge&quot;&gt;call()&lt;/code&gt;
w jednym aspekcie — w sumie w najważniejszym!&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/post-banner-javascript.png&quot; itemprop=&quot;image&quot; alt=&quot;Baner promujący artykuł&quot; /&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;call--apply&quot;&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;call()&lt;/code&gt; &amp;amp; &lt;code class=&quot;highlighter-rouge&quot;&gt;apply()&lt;/code&gt;&lt;/h2&gt;

&lt;p&gt;Wyżej wymienione funkcje uruchamiają od razu funkcję na której są uruchomione.&lt;/p&gt;

&lt;p&gt;Przykład poniżej:&lt;/p&gt;

&lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;book&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;Pan Tadeusz&quot;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;};&lt;/span&gt;

&lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;computer&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;s2&quot;&gt;&quot;MacBook&quot;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;};&lt;/span&gt;

&lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;getTitle&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;prefix&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;prefix&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;nx&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;getTitle&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;call&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;book&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'To jest: '&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;));&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// &quot;To jest: Pan Tadeusz&quot;&lt;/span&gt;
&lt;span class=&quot;nx&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;getTitle&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;call&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;computer&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;s1&quot;&gt;'To jest: '&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;));&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// &quot;To jest: MacBook&quot;&lt;/span&gt;

&lt;span class=&quot;nx&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;getTitle&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;apply&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;book&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'To jest: '&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]));&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// &quot;To jest: Pan Tadeusz&quot;&lt;/span&gt;
&lt;span class=&quot;nx&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;getTitle&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;apply&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;computer&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'To jest: '&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]));&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// &quot;To jest: MacBook&quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Obie funkcje oczekują pierwszego argumentu, którym będzie kontekst,
czyli nowy świat jaki będzie dostępny, gdy w funkcji &lt;code class=&quot;highlighter-rouge&quot;&gt;getTitle()&lt;/code&gt; będziemy
chcieli pobrać coś z &lt;code class=&quot;highlighter-rouge&quot;&gt;this&lt;/code&gt;-a.&lt;/p&gt;

&lt;p&gt;Słowo kluczowe &lt;code class=&quot;highlighter-rouge&quot;&gt;this&lt;/code&gt; wskazuje na kontekst uruchomienia funkcji, w której jest użyty.&lt;/p&gt;

&lt;h2 id=&quot;bind&quot;&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;bind()&lt;/code&gt;&lt;/h2&gt;

&lt;p&gt;Funkcja z nagłówka zmienia kontekst używany w naszej funkcji.&lt;/p&gt;

&lt;p&gt;Ważne jest to, że jej &lt;strong&gt;nie uruchamia&lt;/strong&gt;, tak jak robią to metody
&lt;code class=&quot;highlighter-rouge&quot;&gt;call()&lt;/code&gt; i &lt;code class=&quot;highlighter-rouge&quot;&gt;apply()&lt;/code&gt;. Funkcja &lt;code class=&quot;highlighter-rouge&quot;&gt;bind()&lt;/code&gt; zwraca tą samą funkcję, zmieniając jej
świat oraz ewentualnie definiując wartości oczekiwanych parametrów.&lt;/p&gt;

&lt;p&gt;Przykład użycia:&lt;/p&gt;

&lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;printStatus&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;console&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;isAvailable&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;contact&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;isAvailable&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kc&quot;&gt;true&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;};&lt;/span&gt;

&lt;span class=&quot;nx&quot;&gt;printStatus&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// undefined&lt;/span&gt;

&lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;printContactStatus&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;printStatus&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;bind&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;contact&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

&lt;span class=&quot;nx&quot;&gt;printContactStatus&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;ale-u-mnie-nie-działa&quot;&gt;Ale u mnie nie działa!&lt;/h2&gt;

&lt;p&gt;Podejrzewam, że używasz starej przeglądarki. Bardzo starej.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://kangax.github.io/compat-table/es5/#test-Function.prototype.bind&quot;&gt;Tutaj&lt;/a&gt; jest dostępna tablica ze wsparciem danego feature-a
w przeglądarkach. Jak widzisz, cały rekord jest zielony. Oznacza to,
że wszystkie przeglądarki wymienione w nagłówkach mają wsparcie do tej
nowości z &lt;strong&gt;ES5&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;W starszych przeglądarkach metoda &lt;code class=&quot;highlighter-rouge&quot;&gt;bind()&lt;/code&gt; niestety nie istnieje,
ale istnieje prosta implementacja przedstawiona poniżej.
Wystarczy, że uruchomimy kod zdefiniowany poniżej i już nasz kod
z &lt;code class=&quot;highlighter-rouge&quot;&gt;bind()&lt;/code&gt; zadziała.&lt;/p&gt;

&lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;nb&quot;&gt;Function&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;prototype&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;bind&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;nb&quot;&gt;Function&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;prototype&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;bind&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;that&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;method&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;slice&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;Array&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;prototype&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;slice&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
        &lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;args&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;slice&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;apply&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kr&quot;&gt;arguments&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]);&lt;/span&gt;

        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;method&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;apply&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;that&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;args&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;concat&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;slice&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;apply&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kr&quot;&gt;arguments&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;])));&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;};&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;};&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Powyższy kod to tzw. polyfill — czyli rozwiązanie, które tworzy brakujące API.&lt;/p&gt;

&lt;!-- Resources --&gt;

</description>
            <pubDate>Thu, 09 Feb 2012 00:00:00 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2012/02/09/bind-obok-call-i-apply-jako-piekna-natura-jezyka.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2012/02/09/bind-obok-call-i-apply-jako-piekna-natura-jezyka.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/post-banner-javascript.png</image>
        </item>
        
        <item>
            <title>ECMAScript 5. Kiedy będzie codziennością?</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Gdyby programista korzystał na co dzień tylko z najnowszych technologii świat byłby “zbyt” idealny. Niestety, ale zdarza się ciągle bardzo często kiedy to klienci do listy kompatybilnych przeglądarek naszego oprogramowania nadal dodają tak stare przeglądarki jak Internet Explorer 6.x, 7.x oraz 8.x.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/post-banner-javascript.png&quot; itemprop=&quot;image&quot; alt=&quot;Baner promujący artykuł&quot; /&gt;
&lt;/figure&gt;

&lt;p&gt;A teraz trochę historii. Przeglądarka &lt;em&gt;Internet Explorer 6.0&lt;/em&gt; została wydana &lt;mark&gt;27
sierpnia 2001&lt;/mark&gt;, krótko po wydaniu Windows XP. Czyli ponad 10 lat temu! I teraz pytanie, dlaczego są jeszcze ludzie którzy korzystają z tak “&lt;abbr title=&quot;starej&quot;&gt;doświadczonej&lt;/abbr&gt;” przeglądarki?! Popularność tej przeglądarki to nie cały &lt;mark&gt;1%&lt;/mark&gt; całej Polski internautów.&lt;/p&gt;

&lt;p&gt;Z kolei przeglądarka &lt;em&gt;Internet Explorer 7.0&lt;/em&gt; została wydana pod &lt;mark&gt;koniec 2006&lt;/mark&gt; roku. Popularność tej przeglądarki wynosi lekko ponad &lt;mark&gt;3%&lt;/mark&gt;. Jedynym plusem tego browsera, moim zdaniem, jest to, że wreszcie przeglądarki z Redmond mają wsparcie dla “PNG alpha channel”. Bez tego obchodzenie się z obrazkami w formacie *.png jest bardzo niewygodne dla specjalnie dedykowanej przeglądarki IE6. Trzeba stosować JavaScript’owe hacki, które nakładają obrazek półprzezroczysty na element, który to ma tło w formie obrazka `*.png`.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Wersja 8.x przeglądarki Internet Explorer&lt;/em&gt; już wspiera niewielką część specyfikacji, ale nie jest to na tyle pomocne przy tworzeniu aplikacji aby można było się tym chwalić. IE8 również wrzucamy do kosza z “odpadkami”. Niestety, ale popularność tej przeglądarki plasuje się na 3 miejscu wśród przeglądarek polskich internautów. Albowiem wynosi ona lekko ponad &lt;mark&gt;15%&lt;/mark&gt;.&lt;/p&gt;

&lt;p&gt;Wymieniłem te przeglądarki gdyż “jeszcze” mają one wpływ na użycie standardów w naszych aplikacjach, ale nie oferują żadnego z elementów nowego standardu ES5 według &lt;a href=&quot;http://kangax.github.com/&quot;&gt;kangax.github.com&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Godne polecenia są najnowsze wersje Firefox 8.x oraz Chrome 15.x które mają zaimplementowaną pełną specyfikację ECMAScript 5! Należą się gromkie brawa dla programistów z Mozilla Corporation oraz Google Inc.&lt;/p&gt;

&lt;p&gt;Najnowsza wersja specyfikacji 5.1 ujrzała światło dzienne w czerwcu 2011. Zawiera ona 258 stron w których opisuje takie cuda jak m. in:&lt;/p&gt;

&lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;Object&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;getPrototypeOf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;Object&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;getOwnPropertyDescriptor&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;Object&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;getOwnPropertyNames&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;Object&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;create&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;Object&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;defineProperty&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;Object&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;defineProperties&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;Object&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;seal&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;Object&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;freeze&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;Object&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;preventExtensions&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;Object&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;isSealed&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;Object&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;isFrozen&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;Object&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;isExtensible&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;Object&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;keys&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;

&lt;span class=&quot;nb&quot;&gt;Function&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;prototype&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;bind&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;

&lt;span class=&quot;nb&quot;&gt;Array&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;prototype&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;indexOf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;Array&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;prototype&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;lastIndexOf&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;Array&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;prototype&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;every&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;Array&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;prototype&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;some&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;Array&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;prototype&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;forEach&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;Array&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;prototype&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;map&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;Array&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;prototype&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;filter&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;Array&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;prototype&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;reduce&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;Array&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;prototype&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;reduceRight&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;

&lt;span class=&quot;nb&quot;&gt;String&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;prototype&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;trim&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;

&lt;span class=&quot;nb&quot;&gt;Date&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;now&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;Date&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;prototype&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;toISOString&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;Date&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;prototype&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;toJSON&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;źródła&quot;&gt;Źródła&lt;/h2&gt;

&lt;ul&gt;
  &lt;li&gt;https://www.slideshare.net/fgalassi/javascript-the-new-parts - Ciekawa prezentacja&lt;/li&gt;
  &lt;li&gt;https://kangax.github.io/es5-compat-table/ - Kompatybilność przeglądarek oraz silników w ramach ES 5&lt;/li&gt;
  &lt;li&gt;https://www.ecma-international.org/publications/standards/Ecma-262.htm - Strona główna specyfikacji&lt;/li&gt;
  &lt;li&gt;https://github.com/kriskowal/es5-shim/blob/master/es5-shim.js - Dobrzy ludzie postanowili napisać skrypt który emuluje obecność standardu ES5 w przeglądarce&lt;/li&gt;
  &lt;li&gt;https://ranking.pl/ - Dane statystyczne pochodzą z 2011 roku z serwisu&lt;/li&gt;
&lt;/ul&gt;
</description>
            <pubDate>Thu, 08 Dec 2011 00:00:00 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2011/12/08/ecmascript-5-kiedy-bedzie-codziennoscia.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2011/12/08/ecmascript-5-kiedy-bedzie-codziennoscia.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/post-banner-javascript.png</image>
        </item>
        
        <item>
            <title>DevMeetings: Middle-End w oparciu o Server-side JS [Relacja Live]</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Dzisiaj DevMeetings zawitał do Krakowa!&lt;/p&gt;

&lt;p&gt;Tematem będzie &lt;em&gt;middle-end&lt;/em&gt;, czyli coś co jest pomiędzy &lt;em&gt;Back-end-em&lt;/em&gt;, a &lt;em&gt;Front-end-em&lt;/em&gt;. Skład zawiera programistów doświadczonych w &lt;em&gt;Node.js&lt;/em&gt;, ale także raczkujących w tej tematyce.&lt;/p&gt;

&lt;p&gt;Miejsce: &lt;strong&gt;Hotel Kossak ****&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Prowadzący: &lt;strong&gt;Piotrek Koszuliński&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Skład: &lt;strong&gt;12 programistów&lt;/strong&gt;&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/post-banner-devmeetings.png&quot; itemprop=&quot;image&quot; alt=&quot;Baner promujący artykuł&quot; /&gt;
&lt;/figure&gt;

&lt;h4 id=&quot;1025&quot;&gt;10:25&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;Niestety nieco się spóźniłem, pociągi Warszawa - Kraków nie kursują w dogodnych godzinach&lt;/li&gt;
  &lt;li&gt;Prowadzący &lt;a href=&quot;http://code42.pl/&quot;&gt;Piotrek Koszuliński&lt;/a&gt; porusza temat &lt;em&gt;Middle-End&lt;/em&gt;, czyli warstwę pośredniczącą&lt;/li&gt;
  &lt;li&gt;Od razu w głowie pojawiło się pytanie, to czymże różni się Middle-end od Middle-ware? 😄&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;1049&quot;&gt;10:49&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;Strony w prezentacji już się skończyły ciekawe co prowadzący teraz nam przygotował?&lt;/li&gt;
  &lt;li&gt;Zadania rozdane, dzielimy się na grupy&lt;/li&gt;
  &lt;li&gt;Trwa lekka burza mózgów… co z tego wyniknie? Może w ogóle nie będziemy robili żadnych zadań?&lt;/li&gt;
  &lt;li&gt;A jednak: nasz temat to &lt;em&gt;Routing&lt;/em&gt; - &lt;a href=&quot;https://github.com/Reinmar/dm-middle-end/blob/master/pres/index.html#L816&quot;&gt;github.com/Reinmar/dm-middle-end/blob/master/pres/index.html#L816&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;1057&quot;&gt;10:57&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;Przerwa na kawkę i ciasteczka, czyli “kodujemy po kryjomu”&lt;/li&gt;
  &lt;li&gt;Piotrek wrzucił na GitHub-a prezentację, ściągamy i analizujemy 😄&lt;/li&gt;
&lt;/ul&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;git init
git clone https://github.com/Reinmar/dm-middle-end
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h4 id=&quot;1109&quot;&gt;11:09&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;Powstały grupy:
    &lt;ul&gt;
      &lt;li&gt;Routing&lt;/li&gt;
      &lt;li&gt;System szablonów&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;1126&quot;&gt;11:26&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;Projekt założony na GitHub, &lt;a href=&quot;https://github.com/psionides/devmeetings-routing&quot;&gt;github.com/psionides/devmeetings-routing&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Mamy plan aby zastosować wzorzec projektowy &lt;em&gt;fabryka&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;1211&quot;&gt;12:11&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;Specyfikacja projektu: Routing jako Middle-End:
    &lt;ul&gt;
      &lt;li&gt;Node.js&lt;/li&gt;
      &lt;li&gt;nodamon - watcher do Node-a&lt;/li&gt;
      &lt;li&gt;CoffeeScript&lt;/li&gt;
      &lt;li&gt;webmake&lt;/li&gt;
      &lt;li&gt;Mustache&lt;/li&gt;
      &lt;li&gt;jQuery&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;1316&quot;&gt;13:16&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;Każda grupa prezentuje swoje osiągnięcia&lt;/li&gt;
  &lt;li&gt;Są już pierwsze miniprojekty 😄&lt;/li&gt;
  &lt;li&gt;Obiad - wreszcie!&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;1518&quot;&gt;15:18&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;Spacerując po Krakowie podziwialiśmy Stare Miasto oraz Wawel&lt;/li&gt;
  &lt;li&gt;Wróciliśmy z obiadu i teraz &lt;em&gt;każdy&lt;/em&gt; ma 2x większy zapał do pracy&lt;/li&gt;
  &lt;li&gt;Trwa komentowanie wpisów na Twitterze i Facebook-u&lt;/li&gt;
  &lt;li&gt;Kontynuacja rozwiązywania naszych zadań…&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;1539&quot;&gt;15:39&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;Każdy &lt;strong&gt;DevMeetings&lt;/strong&gt; przynosi nowe, ciekawe doświadczenia. Tym razem była walka o to, kto jest dobry w JS-ie wykazując się w teście &lt;a href=&quot;http://perfectionkills.com/page/12/&quot;&gt;perfectionkills.com/page/12/&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;Mój wynik to 8/14 😄&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;1603&quot;&gt;16:03&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;Pierwszy zawodnik opuścił spotkanie, niestety porwały go inne prace do realizacji&lt;/li&gt;
  &lt;li&gt;Grupa Templates zawiera już tylko jednego programistę z systemem MS Windows, systemem który jest zdecydowaną rzadkością na spotkaniach developerów&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;1709&quot;&gt;17:09&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;Coraz więcej programistów przekonuje się do &lt;em&gt;CoffeeScript&lt;/em&gt;&lt;/li&gt;
  &lt;li&gt;Kolejni programiści języków takich jak &lt;em&gt;Ruby&lt;/em&gt; i &lt;em&gt;Python&lt;/em&gt; wychwalają CS za jego składnię&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;1739&quot;&gt;17:39&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;Koncert na organach orkiestry spod Wawelu&lt;/li&gt;
  &lt;li&gt;Kodowanie trwa pełna parą!&lt;/li&gt;
  &lt;li&gt;Nasz projekt zbliża się ku końcowi, korzystając z webmake-a jesteśmy na “ostatniej prostej”&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;1835&quot;&gt;18:35&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;Pierwsza relacja live: Nasz projekt!&lt;/li&gt;
  &lt;li&gt;Prezentuje: &lt;a href=&quot;http://psionides.eu/&quot;&gt;Jakub Suder&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;1918&quot;&gt;19:18&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;Wszystkie prezentacje zakończone&lt;/li&gt;
  &lt;li&gt;Wynik: 4 różne projekty&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;podsumowanie&quot;&gt;Podsumowanie&lt;/h2&gt;

&lt;p&gt;Middle-end jest wśród nas bardzo często spotykany, niestety jego rola jest przypisywana do Back-end-u - dlatego też pojęcie to jest mało popularne. Middle-End występuję pod postacią kilku kluczowych dla niego elementów:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;routing&lt;/li&gt;
  &lt;li&gt;proxy&lt;/li&gt;
  &lt;li&gt;serwowanie szablonów stron na swoim serwerze&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Jednak przypadków użycia jest wiele, choćby walidacja, identyczna po stronie serwera i Front-end-u również zaliczana jest to middle-endu.&lt;/p&gt;

&lt;h2 id=&quot;wnioski&quot;&gt;Wnioski&lt;/h2&gt;

&lt;p&gt;Kolejny &lt;em&gt;DevMeetings&lt;/em&gt; był kolejną super dawką pozytywnej energii i wspólnego kodowania w gronie programistów z całej Polski. Niestety był to już ostatni meeting w tym roku ze względu na brak poważnych tematów - próbowałem przepchnąć CoffeeScript-a, ale się nie udało - oraz brak prelegentów.&lt;/p&gt;
</description>
            <pubDate>Sat, 24 Sep 2011 00:00:00 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2011/09/24/devmeetings-middle-end-w-oparciu-o-server-side-js-relacja-live.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2011/09/24/devmeetings-middle-end-w-oparciu-o-server-side-js-relacja-live.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/post-banner-devmeetings.png</image>
        </item>
        
        <item>
            <title>Zen-Coding — szybsze pisanie w językach HTML i CSS</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;&lt;em&gt;Zen-Coding&lt;/em&gt; - taką nazwę nosi projekt dwóch developerów: pepelsbey oraz serge.che. Cała lista aktywnych programistów biorących czynny udział w projekcie znajduje się tutaj: &lt;a href=&quot;http://code.google.com/p/zen-coding/people/list&quot;&gt;code.google.com/p/zen-coding/people/list&lt;/a&gt;.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/post-banner-zen-coding.png&quot; itemprop=&quot;image&quot; alt=&quot;Baner promujący artykuł&quot; /&gt;
&lt;/figure&gt;

&lt;p&gt;Korzystanie z &lt;em&gt;Zen-Coding&lt;/em&gt; znacznie przyspiesza mozolne pisanie znaczników html i selektorów css. Lista możliwych skrótów:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;znaczników HTML - &lt;a href=&quot;http://code.google.com/p/zen-coding/wiki/ZenHTMLSelectorsEn&quot;&gt;code.google.com/p/zen-coding/wiki/ZenHTMLSelectorsEn&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;selektorów CSS - &lt;a href=&quot;http://code.google.com/p/zen-coding/wiki/ZenCSSPropertiesEn&quot;&gt;code.google.com/p/zen-coding/wiki/ZenCSSPropertiesEn&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Instalacja w środowisku Eclipse przebiega bezproblemowo. Do dostępnych &lt;abbr title=&quot;Adres strony z &quot;&gt;update-site’ów&lt;/abbr&gt; dodajemy kolejną: &lt;a href=&quot;http://zen-coding.ru/eclipse/updates/&quot;&gt;zen-coding.ru/eclipse/updates/&lt;/a&gt; Adres do katalogu, który zawiera plik &lt;code class=&quot;highlighter-rouge&quot;&gt;site.xml&lt;/code&gt; o zawartości:&lt;/p&gt;

&lt;div class=&quot;language-xml highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;site&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;description&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;name=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;Zen Coding for Eclipse updates&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;&amp;gt;&lt;/span&gt;
    Zen Coding is an editor plugin for high-speed HTML, XML, XSL (or any other structured code format) coding and editing. The core of this plugin is a powerful abbreviation engine which allows you to expand expressions&lt;span class=&quot;ni&quot;&gt;&amp;amp;#x2014;&lt;/span&gt;similar to CSS selectors&lt;span class=&quot;ni&quot;&gt;&amp;amp;#x2014;&lt;/span&gt;into HTML code.
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;/description&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;feature&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;url=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;features/ru.zencoding.eclipse_0.7.0.201103132329.jar&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;id=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;ru.zencoding.eclipse&quot;&lt;/span&gt; &lt;span class=&quot;na&quot;&gt;version=&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;0.7.0.201103132329&quot;&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;/&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;/site&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Znajduje się z nim adres do pliku &lt;em&gt;ru.zencoding.eclipse_0.7.0.201103132329.jar&lt;/em&gt; który jest głównym plikiem z całą wtyczką.&lt;/p&gt;

&lt;h2 id=&quot;zasada-działania&quot;&gt;Zasada działania&lt;/h2&gt;

&lt;ol&gt;
  &lt;li&gt;Wtyczka udostępnia listę skrótów do swojego &lt;abbr title=&quot;Integrated Development Environment&quot;&gt;IDE&lt;/abbr&gt;.&lt;/li&gt;
  &lt;li&gt;Skróty odnoszą się do prawdziwych selektorów i znaczników.&lt;/li&gt;
  &lt;li&gt;Po napisaniu skrótu i wywołaniu skrótu klawiaturowego &lt;kbd&gt;Ctrl+E&lt;/kbd&gt; (w środowisku &lt;em&gt;Eclipse&lt;/em&gt;) łańcuch znaków zamieni się w pełni zgodny z danym językiem ( html/css ) kod.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3 id=&quot;przykład&quot;&gt;Przykład&lt;/h3&gt;

&lt;p&gt;a) Skrót HTML: &lt;code class=&quot;highlighter-rouge&quot;&gt;html&amp;gt;head+body&amp;gt;p{test}&lt;/code&gt;, który zamieni się w:&lt;/p&gt;

&lt;div class=&quot;language-html highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nt&quot;&gt;&amp;lt;html&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;head&amp;gt;&amp;lt;/head&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;nt&quot;&gt;&amp;lt;p&amp;gt;&lt;/span&gt;test&lt;span class=&quot;nt&quot;&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
    &lt;span class=&quot;nt&quot;&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class=&quot;nt&quot;&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;b) Skrót CSS: &lt;code class=&quot;highlighter-rouge&quot;&gt;bgc&lt;/code&gt;, który zamieni się w:&lt;/p&gt;

&lt;div class=&quot;language-css highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nt&quot;&gt;background-color&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;#fff&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;podsumowanie&quot;&gt;Podsumowanie&lt;/h2&gt;

&lt;p&gt;Wtyczka umożliwia zdecydowanie szybsze pisanie w językach &lt;code class=&quot;highlighter-rouge&quot;&gt;HTML&lt;/code&gt; oraz &lt;code class=&quot;highlighter-rouge&quot;&gt;CSS&lt;/code&gt;. Na pierwszy rzut oka wygląda na to, że trzeba nauczyć się wielu skrótów, ale jest to mylne złudzenie gdyż skróty są bardzo zbliżone do prawdziwych znaczników oraz selektorów.&lt;/p&gt;
</description>
            <pubDate>Sun, 18 Sep 2011 00:00:00 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2011/09/18/zen-coding-szybsze-pisanie-w-jezykach-html-i-css.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2011/09/18/zen-coding-szybsze-pisanie-w-jezykach-html-i-css.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/post-banner-zen-coding.png</image>
        </item>
        
        <item>
            <title>Eclipse — skróty klawiszowe</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Skróty klawiszowe znacznie przyspieszają pracą programisty. Każdy powinien się z nimi oswoić w celu szybszej produkcji kodu. Jako zwolennik platformy Eclipse korzystam ze skrótów zamieszczonych na &lt;a href=&quot;http://eclipse.dzone.com/news/effective-eclipse-shortcut-key&quot;&gt;tej&lt;/a&gt; stronie. Skróty klawiszowe w różnych &lt;em&gt;IDE&lt;/em&gt; mają przypisane odmienne zadania.&lt;/p&gt;

&lt;p&gt;Przykładem niech będzie &lt;a href=&quot;http://www.jetbrains.com/idea/&quot;&gt;Intellij IDEA&lt;/a&gt;, gdzie skrót &lt;kbd&gt;ctrl+e&lt;/kbd&gt; służy do zaznaczanie całego kodu wewnątrz wrappera wierszu kodu w którym jest ustawiony focus.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/eclipse/eclipse-526x275.jpg&quot; itemprop=&quot;image&quot; alt=&quot;Baner promujący artykuł&quot; /&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;przykładowe-skróty&quot;&gt;Przykładowe skróty&lt;/h2&gt;

&lt;dl class=&quot;dl-horizontal&quot;&gt;
    &lt;dt&gt;&lt;kbd&gt;ctrl+d&lt;/kbd&gt;&lt;/dt&gt;
    &lt;dd&gt;
        Usuwa wiersz w którym jest ustawiony kursor. Usuwa zaznaczone linie
        tekstu.
    &lt;/dd&gt;

    &lt;dt&gt;&lt;kbd&gt;alt + up / down&lt;/kbd&gt;&lt;/dt&gt;
    &lt;dd&gt;
        Przesuwa wiersz w którym jest ustawiony kursor niżej bądź wyżej.
        Może także przesuwać linie kodu które są zaznaczone.
    &lt;/dd&gt;

    &lt;dt&gt;&lt;kbd&gt;ctrl + up / down&lt;/kbd&gt;&lt;/dt&gt;
    &lt;dd&gt;
        Przesuwa kod źródłowy w oknie do edycji.
    &lt;/dd&gt;

&lt;/dl&gt;
</description>
            <pubDate>Sun, 18 Sep 2011 00:00:00 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2011/09/18/eclipse-skroty-klawiszowe.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2011/09/18/eclipse-skroty-klawiszowe.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/eclipse/eclipse-526x275.jpg</image>
        </item>
        
        <item>
            <title>CoffeeScript + Windows</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;CoffeeScript&lt;/code&gt; jest nakładką na JavaScript, który oferuje inną składnię, przybliżoną do takich języków jak &lt;em&gt;Ruby&lt;/em&gt; czy &lt;em&gt;Python&lt;/em&gt;. Staje się on nadbudową języka prototypowego jakim jest JS, dodając tzw. &lt;a href=&quot;http://pl.wikipedia.org/wiki/Lukier_sk%C5%82adniowy&quot;&gt;lukier składniowy&lt;/a&gt;, aby programowanie opierało się na klasycznym programowaniu obiektowym, tj. klasy, metody, dziedziczenie.&lt;/p&gt;

&lt;p&gt;Sam język oferuje nie tylko lepszą składnię od popularnego dziś języka JavaScript, ale także m.in przetwarzanie tablic i dopasowywanie do wzorców. CoffeeScript posiada kompilator który w outpucie generuje plik JavaScript, ale rozmiar pliku, jak to z badań wynika, jest o 1/3 krótszy, bez strat w dziedzinie performance.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/coffeescript-on-windows/coffeescript-on-windows-526x275.jpg&quot; itemprop=&quot;image&quot; alt=&quot;Baner promujący artykuł&quot; /&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;instalacja&quot;&gt;Instalacja&lt;/h2&gt;

&lt;p&gt;Dziś przyszło mi &lt;em&gt;zainstalować&lt;/em&gt; CoffeeScript-a w systemie &lt;a href=&quot;http://www.microsoft.com/&quot;&gt;Microsoft Windows&lt;/a&gt;. Na linux-ie nie miałem problemów, a instalacja w tym systemie ogranicza się do uruchomienia kodu:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;npm &lt;span class=&quot;nb&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;nt&quot;&gt;-g&lt;/span&gt; coffee-script
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Po researchu odnośnie Coffee na Windows, znalazłem w repozytorium GitHub’a kompilator: &lt;a href=&quot;https://github.com/alisey/CoffeeScript-Compiler-for-Windows&quot;&gt;github.com/alisey/CoffeeScript-Compiler-for-Windows&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Aplikacja działa w trybie terminala (w systemie z Redmond, terminal nosi nazwę &lt;em&gt;Wiersza Poleceń&lt;/em&gt;). Aby aplikacja była dostępna z każdego katalogu, należy dodać katalog z kompilatorem do zmiennej systemowej &lt;em&gt;PATH&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Dla systemu &lt;strong&gt;Windows XP&lt;/strong&gt;, instalacja przebiega według następujących kroków:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;
    &lt;p&gt;Uruchamiamy opcje &lt;em&gt;Właściwości&lt;/em&gt; na ikonce &lt;em&gt;Mój Komputer&lt;/em&gt;.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Przechodzimy na zakładkę &lt;em&gt;Zaawansowane&lt;/em&gt;.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Klikamy button &lt;em&gt;Zmienne środowiskowe&lt;/em&gt;.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;W boksie &lt;em&gt;Zmienne systemowe&lt;/em&gt; odnajdujemy zmienną &lt;em&gt;PATH&lt;/em&gt;.&lt;/p&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Dodajemy do niej ścieżkę z katalogiem zawierającym kompilator.&lt;/p&gt;

    &lt;p&gt;W moim przypadku jest to:&lt;/p&gt;

    &lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;C:&lt;span class=&quot;se&quot;&gt;\b&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;in&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;    &lt;/div&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;p&gt;Po dodaniu należy uruchomić system ponownie, aby zmiany weszły w życie.&lt;/p&gt;
  &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Od tego momentu jesteśmy w stanie uruchomić kompilator: &lt;code class=&quot;highlighter-rouge&quot;&gt;coffee.exe&lt;/code&gt; z każdego katalogu poprzez &lt;em&gt;Wiersz poleceń&lt;/em&gt;.&lt;/p&gt;

&lt;h2 id=&quot;opcje-kompilatora&quot;&gt;Opcje kompilatora&lt;/h2&gt;

&lt;p&gt;Opcje kompilatora prezentują się następująco:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;-c, --compile&lt;/code&gt; - kompiluje plik z zawartością rekompilowanego pliku coffeescript oraz wynikową pliku z rozszerzeniem *.js&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;-o, --output [DIR]&lt;/code&gt; - ustawia globalny katalog do zapisywanie kompilowanych plików&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;-j, --join [FILE]&lt;/code&gt; - scala pliki przed kompilowaniem&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;-b, --bare&lt;/code&gt; - kompiluje pomijając globalny wrapper&lt;/li&gt;
  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;-v, --version&lt;/code&gt; - wyświetla wersję kompilatora&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;przykład&quot;&gt;Przykład&lt;/h2&gt;

&lt;p&gt;Przykład kodu napisanego w &lt;code class=&quot;highlighter-rouge&quot;&gt;CoffeeScript&lt;/code&gt; (32 znaki):&lt;/p&gt;

&lt;div class=&quot;language-coffeescript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Coffee&lt;/span&gt;

    &lt;span class=&quot;na&quot;&gt;test&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Kod wynikowy po kompilacji wygląda następująco (163 znaki):&lt;/p&gt;

&lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Coffee&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;nx&quot;&gt;Coffee&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Coffee&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{}&lt;/span&gt;
        &lt;span class=&quot;nx&quot;&gt;Coffee&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;prototype&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;test&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{};&lt;/span&gt;
        &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Coffee&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;})();&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}).&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;call&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;del&gt;Prosta matematyka doprowadza do faktu że piszemy &lt;strong&gt;5&lt;/strong&gt; razy szybciej!&lt;/del&gt; Tworzenie kodu może i zajmuje mniej czasu, ale czy oszczędzamy w ten sposób czas podczas debugowania? Trudno powiedzieć.&lt;/p&gt;

&lt;h2 id=&quot;bibliografia&quot;&gt;Bibliografia&lt;/h2&gt;

&lt;p&gt;Strona główna projektu CoffeeScript: &lt;a href=&quot;http://coffeescript.org/&quot;&gt;coffeescript.org&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Aktualna wersja projektu: 1.1.2&lt;/p&gt;

&lt;h2 id=&quot;podsumowanie&quot;&gt;Podsumowanie&lt;/h2&gt;

&lt;p&gt;Instalacja przebiega bezproblemowo, pobieramy tylko kompilator i gotowe! Jeśli chcemy być wygodni i z każdego miejsca uruchamiać kompilator do dodajemy ścieżkę do katalogu zawierający plik kompilatora i cieszymy się kompilacją gdziekolwiek byśmy nie byli w systemie.&lt;/p&gt;
</description>
            <pubDate>Wed, 14 Sep 2011 00:00:00 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2011/09/14/coffeescript-windows.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2011/09/14/coffeescript-windows.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/coffeescript-on-windows/coffeescript-on-windows-526x275.jpg</image>
        </item>
        
        <item>
            <title>HackmeMove — kolejna odsłona programistycznych łamigłówek</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Hackme - gra od programistów dla programistów, który celem jest utrudnianie dojścia do kolejnego poziomu, a tym samym do końca gry.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/hacks/hackme.png&quot; itemprop=&quot;image&quot; alt=&quot;Baner promujący artykuł&quot; /&gt;
&lt;/figure&gt;

&lt;p&gt;Dobrnięcie do ostatniego ekranu - nigdy nie wiemy ile jeszcze ekranów/stron zostało do końca - oraz wykrycie podatności na niej, wiąże się z gratulacjami i pochwałą od autora.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.uw-team.org/hackme/index.htm&quot;&gt;Hackme v1&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.uw-team.org/hm2/index.htm&quot;&gt;Hackme v2&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.uw-team.org/hm3next/&quot;&gt;Hackme v3&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Wszystkie 3 wersje są dość ciekawe, ponieważ poruszają wszelkie błędy zabezpieczeń, spotykanych w środowisku Web’owym, poprzez &lt;a href=&quot;http://niebezpiecznik.pl/post/firesheep-firefox-ataki-na-sesje/&quot;&gt;niezabezpieczone ciasteczka z hasłami&lt;/a&gt;, aż do plików &lt;code class=&quot;highlighter-rouge&quot;&gt;*.phps&lt;/code&gt; na serwerze, co wykrywane jest poprzez &lt;em&gt;forceful browsing&lt;/em&gt;.&lt;/p&gt;

&lt;hr /&gt;

&lt;p&gt;Dzisiaj ( 11.09.2011 ) &lt;a href=&quot;http://unknow.blip.pl/&quot;&gt;Unknow&lt;/a&gt; - autor wszystkich 3 gier, opublikował grę typu Hackme, lecz kierującej się innymi zasadami. Dlatego też to nie jest kolejna wersja gry, lecz inny typ gry. Nie ma poziomów, ale jest za to trudniejszy problem do rozwiązania 😄&lt;/p&gt;

&lt;p&gt;Każdy chcący spróbować swoich sił w grze HackmeMove musi posiadać konto na &lt;a href=&quot;http://www.uw-team.org/forum/&quot;&gt;forum UW-Team.org&lt;/a&gt; oraz ściągnąć plik &lt;code class=&quot;highlighter-rouge&quot;&gt;hackmemove.html&lt;/code&gt; na swój komputer.&lt;/p&gt;

&lt;p&gt;Zapraszam chętnych do spróbowania swoich sił: &lt;a href=&quot;http://www.uw-team.org/hackmemove.html&quot;&gt;uw-team.org/hackmemove.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Wynikami można się chwalić przesyłając adres strony z podsumowaniem, o unikalnym parametrze na stałe przypisanym do użytkownika.&lt;/p&gt;

&lt;p&gt;Mój wynik to lekko ponad 3 godziny. &lt;a href=&quot;http://www.uw-team.org/hm_12819_0e0d3ca2.html&quot;&gt;uw-team.org/hm_12819_0e0d3ca2.html&lt;/a&gt;&lt;/p&gt;
</description>
            <pubDate>Mon, 12 Sep 2011 00:00:00 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2011/09/12/hackmemove-kolejna-odslona-programistycznych-lamiglowek.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2011/09/12/hackmemove-kolejna-odslona-programistycznych-lamiglowek.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/hacks/hackme.png</image>
        </item>
        
        <item>
            <title>Dodawanie metody do obiektu Function poprzez "addMethod"</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Język JavaScript nie jest językiem obiektowym klasycznie, lecz prototypowo. Dodawanie metod do obiektu odbywa się w inny sposób niż jest to np. w Javie. Dlatego przez ogromną ilość programistów, którzy zaczynali od języka klasycznego transfer do składni JavaScript jest bolączką.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/post-banner-javascript.png&quot; itemprop=&quot;image&quot; alt=&quot;Baner promujący artykuł&quot; /&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;przykład&quot;&gt;Przykład&lt;/h2&gt;

&lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Carousel&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;run&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;c1&quot;&gt;// pass&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;};&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;nx&quot;&gt;Carousel&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;prototype&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;move&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;// pass&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;};&lt;/span&gt;

&lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;carousel&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Carousel&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
&lt;span class=&quot;nx&quot;&gt;carousel&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;move&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Ale zamiast tego brzydkiego zapisu jakim jest &lt;code class=&quot;highlighter-rouge&quot;&gt;Carousel.prototype.move&lt;/code&gt; &lt;a href=&quot;http://www.crockford.com/&quot;&gt;Douglas Crockford&lt;/a&gt; &lt;a href=&quot;http://www.crockford.com/javascript/inheritance.html#sugar&quot;&gt;utworzył&lt;/a&gt; ładniejszy oraz bardziej naturalny zapis dodawania metod do obiektu, pomijając tym samym słowo kluczowe &lt;code class=&quot;highlighter-rouge&quot;&gt;prototype&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Istnieje też stworzenie metody w obiekcie poprzez słowo kluczowe &lt;code class=&quot;highlighter-rouge&quot;&gt;this&lt;/code&gt;, ale po utworzeniu obiektu będzie ono na sztywno przypisane z danym obiektem. Dlatego dodanie metody prototypowo zdecydowanie wykorzystuje pełną siłę języka.&lt;/p&gt;

&lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;Function&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;prototype&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;addMethod&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;func&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;prototype&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;]&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;func&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Po dodaniu takiego rozwiązania do obiektu &lt;code class=&quot;highlighter-rouge&quot;&gt;Function&lt;/code&gt;, dodawanie metod przedstawia się następująco:&lt;/p&gt;

&lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Carousel&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;run&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;c1&quot;&gt;// pass&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;};&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;nx&quot;&gt;Carousel&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;addMethod&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'move'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;c1&quot;&gt;// pass&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;});&lt;/span&gt;

&lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;carousel&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Carousel&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
&lt;span class=&quot;nx&quot;&gt;carousel&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;run&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
&lt;span class=&quot;nx&quot;&gt;carousel&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;move&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
</description>
            <pubDate>Mon, 12 Sep 2011 00:00:00 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2011/09/12/dodawanie-metody-do-obiektu-function-poprzez-addmethod.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2011/09/12/dodawanie-metody-do-obiektu-function-poprzez-addmethod.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/post-banner-javascript.png</image>
        </item>
        
        <item>
            <title>DevMeetings: noSQL Databases [Relacja Live]</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Pierwszy raz DevMeetings w całości został poświęcony &lt;abbr title=&quot;Not used SQL&quot;&gt;noSQL&lt;/abbr&gt;‘owym &lt;em&gt;bazom danych&lt;/em&gt;. Poprawnie mówiąc storage-om dokumentów JSON.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/post-banner-devmeetings.png&quot; itemprop=&quot;image&quot; alt=&quot;Baner promujący artykuł&quot; /&gt;
&lt;/figure&gt;

&lt;p&gt;Jest to kontynuacja spotkań DevMeetings-owych bezpośrednio po &lt;a href=&quot;http://devcamps.pl/&quot;&gt;DevCapmie&lt;/a&gt;. &lt;em&gt;Kampania wrześniowa&lt;/em&gt; devcampa opiera się o &lt;strong&gt;3&lt;/strong&gt; Mocne DevMeetings-y:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://devmeetings.pl/trainings/wydajno%C5%9B%C4%87-nodejs-kontra-reszta-%C5%9Bwiata&quot;&gt;Wydajność Node.JS kontra reszta świata&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://devmeetings.pl/trainings/bazy-nosqlowe-naturalny-storage-aplikacji-jsowych&quot;&gt;Bazy NoSQL’owe - naturalny storage aplikacji JS’owych&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://devmeetings.pl/trainings/middle-end-w-oparciu-o-serverside-js&quot;&gt;Middle-End w oparciu w Server-side JS&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Miejsce: &lt;strong&gt;Millenium Plaza&lt;/strong&gt; (&lt;a href=&quot;http://milleniumplaza.pl/&quot;&gt;milleniumplaza.pl/&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;Prowadzący: &lt;strong&gt;David de Rosier&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Skład: &lt;strong&gt;22 programistów&lt;/strong&gt; piszących na co dzień w językach takich jak:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Java&lt;/li&gt;
  &lt;li&gt;Python&lt;/li&gt;
  &lt;li&gt;Ruby&lt;/li&gt;
  &lt;li&gt;JavaScript&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;cel-stworzenie-aplikacji-na-kształt-prostego-twittera&quot;&gt;Cel: Stworzenie aplikacji na kształt prostego Twittera&lt;/h2&gt;

&lt;p&gt;Zaczynamy od migracji danych z bazy MySQL’owej w celu przebadania wydajności migracji z bazy relacyjnej do bazy dokumentowej.&lt;/p&gt;

&lt;p&gt;Wykorzystywane architektur NoSQL:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;MongoDB&lt;/li&gt;
  &lt;li&gt;CouchDB&lt;/li&gt;
  &lt;li&gt;Redis&lt;/li&gt;
  &lt;li&gt;Cassandra&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Do napisania:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Migrator w Node.js z mysql do dowolnej platformy NoSQL-owej&lt;/li&gt;
  &lt;li&gt;Interfejs www, dzięki któremu użytkownicy będą mogli korzystać z aplikacji&lt;/li&gt;
  &lt;li&gt;Połączenie z &lt;a href=&quot;https://github.com/adamjodlowski/tweet-perf&quot;&gt;kodem&lt;/a&gt; Adama Jodłowskiego z poprzedniego DevMeetingu w Poznaniu&lt;/li&gt;
  &lt;li&gt;Zaprezentowanie działającej aplikacji Twitter’o podobnej&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;realizacja&quot;&gt;Realizacja&lt;/h2&gt;

&lt;h4 id=&quot;925&quot;&gt;9:25&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;Zaczynamy! Czyli czas start: 12 godzin!&lt;/li&gt;
  &lt;li&gt;Na sali są ludzie, którzy posiadają olbrzymią wiedzę nt. związany z NoSQL-em&lt;/li&gt;
  &lt;li&gt;Jak i (&lt;em&gt;begginerzy&lt;/em&gt;) tacy, którzy posiadają wiedzę o JS, Java, Python, Ruby, a chcą się dowiedzieć “czegoś” o bazach danych NoSQL’owych i zastosować w praktyce&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;1013&quot;&gt;10:13&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;Pytania (już kilkanaście) - istny &lt;em&gt;flame&lt;/em&gt; się rozpoczął. Dobrze jeśli już od początku u uczestników szkolenia wyczuwa się zapał i chęci do współpracy.&lt;/li&gt;
  &lt;li&gt;David omawia widoki tymczasowe w &lt;a href=&quot;http://couchdb.apache.org/&quot;&gt;CouchDB&lt;/a&gt; (wołamy funkcje na wszystkich dokumentach ), czyli tzw. persistent view&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;1024&quot;&gt;10:24&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;Krótkie przedstawienie najbardziej popularnej architektury NoSQL - MongoDB&lt;/li&gt;
  &lt;li&gt;“MongoDB - try it” - ciekawa aplikacja webowa dzięki której piszemy w MongoDB bez konieczności posiadania dodatkowego oprogramowania, kod pisany w polu uruchamia się online’owo &lt;em&gt;w locie&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;1036&quot;&gt;10:36&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;Nowy temat wzbudzający srogą ciszę na sali - Apache Cassandra. Jak się później okazało, nikt, absolutnie nikt, poza David’em nie miał styczności z tą technologią.&lt;/li&gt;
  &lt;li&gt;Założenia Cassandry - Gromadzenie ogromnej ilości danych&lt;/li&gt;
  &lt;li&gt;Główne pytanie: jak definiuje się czas “t” ? Odpowiedź: w dniach&lt;/li&gt;
  &lt;li&gt;Cassandra w swojej naturze posiada oddzielny protokół do komunikacji pomiędzy węzłami&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;1040&quot;&gt;10:40&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;Slajdy się skończyły&lt;/li&gt;
  &lt;li&gt;What next?&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;1043&quot;&gt;10:43&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;Witamy nowego prowadzącego z sali&lt;/li&gt;
  &lt;li&gt;David na chwilę usiadł na krzesełku oddając głos uczestnikowi który podobno miał już doświadczenie w Redis’ie - jako jedyny pracował na tego rodzaju bazie danych ze wszystkich biorących udział w DevMeetings’ie&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;1048&quot;&gt;10:48&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;Burza mózgów dot. Redis’a&lt;/li&gt;
  &lt;li&gt;Po przedstawieniu pokrótce wszelkich głównych właściwości Redis’a można stwierdzić, że prelegent dość mocno wykorzystywał w praktyce tę bazę w swoich aplikacjach&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;1104---1124&quot;&gt;11:04 - 11:24:&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;Przerwa. A po przerwie… kodowanie&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;1213&quot;&gt;12:13&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;Nasz projekt:
    &lt;ul&gt;
      &lt;li&gt;mysql&lt;/li&gt;
      &lt;li&gt;cassandra&lt;/li&gt;
      &lt;li&gt;Node.js&lt;/li&gt;
      &lt;li&gt;express&lt;/li&gt;
      &lt;li&gt;Node.js razem z bazą: cassandra - &lt;a href=&quot;https://github.com/yukim/node_cassandra&quot;&gt;node_cassandra&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;Node.js razem z bazą: mysql - &lt;a href=&quot;https://github.com/felixge/node-mysql&quot;&gt;node-mysql&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;CoffeeScript&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;Doszedłem do porozumienia z kolegą z teamu, że CoffeeScript jest milion razy szybszy!&lt;/li&gt;
  &lt;li&gt;Pierwsze zadanie - migracja danych z bazy mysql do cassandra&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;1312&quot;&gt;13:12&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;Szybki re-search sterowników - pewnie będzie trudno coś znaleźć&lt;/li&gt;
  &lt;li&gt;Po kilku minutach znalazłem 3 różne implementacje sterowników. Zaczynamy od &lt;a href=&quot;https://github.com/wadey/node-thrift&quot;&gt;node-thrift&lt;/a&gt;!&lt;/li&gt;
  &lt;li&gt;Kompilacja thrift’a - sterownik do łączenia do cassandra&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;1354&quot;&gt;13:54&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;CONNECTED! - i think so 😄&lt;/li&gt;
  &lt;li&gt;Po testach kilku sterowników, wreszcie udało się połączyć z Cassandrą przez NodeJS&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;1408&quot;&gt;14:08&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;Czas na przerwę obiadową.&lt;/li&gt;
  &lt;li&gt;Nie wiem, czy pizza jest dobrym pomysłem na obiad ale idziemy kolokwialnie “wrzucić coś na ząb”&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;1518&quot;&gt;15:18&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;Powoli wszyscy się schodzą.&lt;/li&gt;
  &lt;li&gt;Planowany czas rozpoczęcia drugiej części to &lt;em&gt;15:45&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;1747&quot;&gt;17:47&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;Node + Cassandra - sterowniki jak i dokumentacja są blee!&lt;/li&gt;
  &lt;li&gt;Teraz widzę, jak bardzo potrzebna jest dobra dokumentacja do projektu!&lt;/li&gt;
  &lt;li&gt;Będę musiał pomyśleć nad lepszą dokumentacją do &lt;a href=&quot;https://github.com/piecioshka/pklib.js&quot;&gt;pklib&lt;/a&gt;‘a&lt;/li&gt;
&lt;/ul&gt;

&lt;h4 id=&quot;1900&quot;&gt;19:00&lt;/h4&gt;

&lt;ul&gt;
  &lt;li&gt;Niestety nie udało się, polegliśmy na sterowniku Node.js do cassandry&lt;/li&gt;
  &lt;li&gt;Na koniec David zaprezentował przykład ostatniego &lt;abbr title=&quot;Kod który jest kompletnie nie czytelny&quot;&gt;brainfuck’a&lt;/abbr&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Analizujcie (bez uruchomienia w Firebugu) jaki będzie rezultat tego jednolinijkowego skryptu.&lt;/p&gt;

&lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;39595885326972&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;).&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;toString&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;-~-~&lt;/span&gt;&lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;podsumowanie-i-wnioski&quot;&gt;Podsumowanie i wnioski&lt;/h2&gt;

&lt;p&gt;Kolejne szkolenie z serii DevMeetings, dzięki któremu nasz poziom umiejętności radykalnie się powiększył. Dzisiejsza odsłona miała na celu zaprezentowanie plusów i minusów konkretnych środowisk bazodanowych.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Sterownik dla NodeJS do Cassandry zawiódł&lt;/li&gt;
  &lt;li&gt;Prawdopodobnie najlepsze sterowniki są napisane w Javie&lt;/li&gt;
  &lt;li&gt;Najszybciej do zaimplementowania dzisiejszej aplikacji przyszło zespołowi, który używał jako bazy NoSQL’owej systemu &lt;em&gt;Redis&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
            <pubDate>Sat, 10 Sep 2011 00:00:00 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2011/09/10/devmeetings-nosql-databases-relacja-live.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2011/09/10/devmeetings-nosql-databases-relacja-live.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/post-banner-devmeetings.png</image>
        </item>
        
        <item>
            <title>Własna biblioteka cross-platform w JavaScript</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Cykl życia programisty charakteryzuje się tym, że po skończonym projekcie
przychodzi następny. W każdy projekcie piszemy kod JavaScript który wykonuje
konkretną pracę.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/post-banner-javascript.png&quot; itemprop=&quot;image&quot; alt=&quot;Baner promujący artykuł&quot; /&gt;
&lt;/figure&gt;

&lt;p&gt;Bardzo często jednak zdarza się sytuacja, że kod który piszemy musimy
wykorzystać ponownie. Dobry podejściem jest, aby ten kod zamknąć w prostą
bibliotekę, którą będziemy używali w miarę potrzeb.&lt;/p&gt;

&lt;h2 id=&quot;po-pierwsze-nazwa-biblioteki&quot;&gt;Po pierwsze: &lt;code class=&quot;highlighter-rouge&quot;&gt;Nazwa biblioteki&lt;/code&gt;&lt;/h2&gt;

&lt;p&gt;W każdym projekcie zalecaną praktyką jest stworzenie
&lt;abbr title=&quot;Przestrzeń nazw&quot;&gt;namespace’a&lt;/abbr&gt; o skróconej (jednowyrazowej)
nazwie projektu.&lt;/p&gt;

&lt;p&gt;Przykładem niech będzie artykuł &lt;a href=&quot;http://suszynski.org/&quot;&gt;Krzyśka
Suszyńskiego&lt;/a&gt; na blogu technologicznym jego firmy
&lt;a href=&quot;http://mediovski.pl&quot;&gt;Mediovski&lt;/a&gt; - artykuł:
&lt;a href=&quot;http://technology.mediovski.pl/2011/08/17/sesja-a-aktywnosc-uzytkownika/lang/pl/&quot;&gt;Sesja,
a aktywność użytkownika&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Krzysiek napisał funkcję do przedłużania żywotności sesji:&lt;/p&gt;

&lt;div class=&quot;language-js highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nx&quot;&gt;pl&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;mediovski&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;technology&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;FormSessionHolder&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Pierwszą przestrzenią nazw jest tu język - &lt;code class=&quot;highlighter-rouge&quot;&gt;pl&lt;/code&gt;. Według mnie jest to
opcjonalny parametr, bo przecież zamysłem programisty jest
napisanie funkcjonalności, a nie słownika, dlatego też język jest
opcjonalny.&lt;/p&gt;

&lt;p&gt;Kolejną przestrzenią jest &lt;code class=&quot;highlighter-rouge&quot;&gt;mediovski&lt;/code&gt; - nazwa firmy.
Następnym &lt;code class=&quot;highlighter-rouge&quot;&gt;technology&lt;/code&gt; - nazwa produktu (tak mniemam).
W ostatnim namespace’ie znajduje się klu sprawy - funkcja &lt;code class=&quot;highlighter-rouge&quot;&gt;FormSessionHolder&lt;/code&gt;.&lt;/p&gt;

&lt;h2 id=&quot;po-drugie-wzorzec-projektowy&quot;&gt;Po drugie: &lt;code class=&quot;highlighter-rouge&quot;&gt;Wzorzec projektowy&lt;/code&gt;&lt;/h2&gt;

&lt;p&gt;Musimy się zastanowić w jaki sposób będziemy pisali swoją bibliotekę, tj. z
jakiego wzorca skorzystamy podczas budowania prototypu naszej biblioteki.&lt;/p&gt;

&lt;p&gt;Bardzo popularny wzorcem do tego rodzaju jest
&lt;a href=&quot;http://pl.wikipedia.org/wiki/Singleton_(wzorzec_projektowy)&quot;&gt;Singleton&lt;/a&gt;.
Dla początkujących programistów jest to zalecany wzorzec.&lt;/p&gt;

&lt;p&gt;Przykład biblioteki dla projektu &lt;code class=&quot;highlighter-rouge&quot;&gt;Foo&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&quot;language-js highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nx&quot;&gt;foo&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;na&quot;&gt;bar&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;na&quot;&gt;baz&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;c1&quot;&gt;// do something&lt;/span&gt;
        &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Lista najważniejszych wzorców znajduje się
&lt;a href=&quot;http://pl.wikipedia.org/wiki/Wzorzec_projektowy_(informatyka)&quot;&gt;tutaj&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;-uwaga-komentarze&quot;&gt;&lt;i class=&quot;icon-average&quot;&gt;&lt;/i&gt; Uwaga: Komentarze&lt;/h2&gt;

&lt;p&gt;Komentowanie swojego kodu jest niepodważalnie właściwą praktyką.
Mając na uwadze fakt, że często kod który piszemy nie my będziemy utrzymać,
chęć komentowania spada, ale jeśli to by będziemy głównymi odbiorcami to musimy
robić zapiski w kodzie źródłowym.&lt;/p&gt;

&lt;p&gt;Do prawie każdego języka wysokiego poziomu powstał system dokumentacji.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Java - &lt;a href=&quot;http://pl.wikipedia.org/wiki/Javadoc&quot;&gt;JavaDoc&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;PHP - &lt;a href=&quot;http://en.wikipedia.org/wiki/PHPDoc&quot;&gt;PHPDoc&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;JavaScript - &lt;a href=&quot;http://en.wikipedia.org/wiki/JSDoc&quot;&gt;JSDoc&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Przykład prosto z Wiki: komentowanie zgodne z JSDoc:&lt;/p&gt;

&lt;div class=&quot;language-js highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;cm&quot;&gt;/**
 * Creates an instance of Circle.
 *
 * @constructor
 * @this {Circle}
 * @param {number} r The desired radius of the circle.
 */&lt;/span&gt;
&lt;span class=&quot;kd&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Circle&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;p&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;cm&quot;&gt;/** @private */&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;radius&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;cm&quot;&gt;/** @private */&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;circumference&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;mi&quot;&gt;2&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;Math&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;PI&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;*&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;p&quot;&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;-uwaga-wywołania-zwrotne-callbacks&quot;&gt;&lt;i class=&quot;icon-average&quot;&gt;&lt;/i&gt; Uwaga: Wywołania zwrotne (&lt;code class=&quot;highlighter-rouge&quot;&gt;callbacks&lt;/code&gt;)&lt;/h2&gt;

&lt;p&gt;Dobra praktyką związaną ze zdarzeniową naturą języka JavaScript jest
umieszczanie ostatniego argumentu jako &lt;code class=&quot;highlighter-rouge&quot;&gt;callback&lt;/code&gt; - funkcja, która uruchomi się
po zakończeniu działania zdefiniowanej.&lt;/p&gt;

&lt;p&gt;Wszystko to, co opisałem pojawiło się w moich realiach programistycznych.
Nie raz miałem zadanie napisania zawsze wycentrowanego kontenera - typu
&lt;code class=&quot;highlighter-rouge&quot;&gt;pklib.message&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;W pewnym momencie zatrzymałem się na chwilę i zastanowiłem… po co kolejny
raz piszę to samo? Dlatego kiedy napisałem to ostatni raz, zapisałem kod do swojej
biblioteki wieloplatformowej i nazwałem ją
(&lt;strong&gt;p&lt;/strong&gt;)iotr (&lt;strong&gt;k&lt;/strong&gt;)owalski (&lt;strong&gt;lib&lt;/strong&gt;)rary tj:
&lt;a href=&quot;https://github.com/piecioshka/pklib.js&quot;&gt;pklib&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&quot;podsumowanie&quot;&gt;Podsumowanie&lt;/h2&gt;

&lt;p&gt;Pisanie własnej biblioteki znacznie przyspieszy pracę przy kolejnych
zadaniach. Kod raz napisany powinien być reużywalny, tj. wielokrotnie używany.&lt;/p&gt;
</description>
            <pubDate>Tue, 06 Sep 2011 00:00:00 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2011/09/06/wlasna-biblioteka-javascript-cross-platform.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2011/09/06/wlasna-biblioteka-javascript-cross-platform.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/post-banner-javascript.png</image>
        </item>
        
        <item>
            <title>Node vs Element</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Bardzo często początkujący programiści pracujący z &lt;abbr title=&quot;Document Object Model&quot;&gt;DOM&lt;/abbr&gt;-em, mają problem z odróżnieniem &lt;em&gt;Element&lt;/em&gt;-u od &lt;em&gt;Node&lt;/em&gt;-a. Chciałbym wytłumaczyć prostymi słowami jaka jest różnica.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/post-banner-javascript.png&quot; itemprop=&quot;image&quot; alt=&quot;Baner promujący artykuł&quot; /&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;różnice&quot;&gt;Różnice&lt;/h2&gt;

&lt;dl&gt;
    &lt;dt&gt;Node&lt;/dt&gt;

    &lt;dd&gt;
        &lt;em&gt;Node&lt;/em&gt; to jest dowolny element, komentarz, pusty znak, węzeł
        &lt;em&gt;CDATA&lt;/em&gt; a nawet fragment dokumentu.
    &lt;/dd&gt;

    &lt;dt&gt;Element&lt;/dt&gt;

    &lt;dd&gt;
        &lt;em&gt;Element&lt;/em&gt; jest to &lt;em&gt;Node&lt;/em&gt; o typie &lt;strong&gt;1&lt;/strong&gt;
        oraz nazwie systemowej &lt;em&gt;ELEMENT_NODE&lt;/em&gt;.
    &lt;/dd&gt;

&lt;/dl&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/dom/dom-schema.svg&quot; alt=&quot;&quot; /&gt;

    &lt;figcaption&gt;
        Uproszczony diagram ukazujący relacje między Node a Element.
    &lt;/figcaption&gt;

&lt;/figure&gt;

&lt;h3 id=&quot;co-zawiera-node&quot;&gt;Co zawiera Node?&lt;/h3&gt;

&lt;p&gt;W przyrodzie istnieje 12 typów NODE-ów. Poniżej ich lista:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;&lt;em&gt;ELEMENT_NODE&lt;/em&gt; - &lt;code class=&quot;highlighter-rouge&quot;&gt;document.createElement&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;ATTRIBUTE_NODE&lt;/em&gt; - &lt;code class=&quot;highlighter-rouge&quot;&gt;document.createAttribute&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;TEXT_NODE&lt;/em&gt; - &lt;code class=&quot;highlighter-rouge&quot;&gt;document.createTextNode&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;CDATA_SECTION_NODE&lt;/em&gt; - &lt;code class=&quot;highlighter-rouge&quot;&gt;document.createCDATASection&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;ENTITY_REFERENCE_NODE&lt;/li&gt;
  &lt;li&gt;ENTITY_NODE&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;PROCESSING_INSTRUCTION_NODE&lt;/em&gt; - &lt;code class=&quot;highlighter-rouge&quot;&gt;document.createProcessingInstruction&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;COMMENT_NODE&lt;/em&gt; - &lt;code class=&quot;highlighter-rouge&quot;&gt;document.createComment&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;DOCUMENT_NODE&lt;/li&gt;
  &lt;li&gt;DOCUMENT_TYPE_NODE&lt;/li&gt;
  &lt;li&gt;&lt;em&gt;DOCUMENT_FRAGMENT_NODE&lt;/em&gt; - &lt;code class=&quot;highlighter-rouge&quot;&gt;document.createDocumentFragment&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;NOTATION_NODE&lt;/li&gt;
&lt;/ol&gt;

&lt;h2 id=&quot;mięso&quot;&gt;Mięso&lt;/h2&gt;

&lt;p&gt;Dla przykładu dodam trochę kodu, który rozjaśni sprawę:&lt;/p&gt;

&lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;nb&quot;&gt;document&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;createComment&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'my comment'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;instanceof&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Node&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// true&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;document&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;createComment&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'my comment'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;instanceof&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Element&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// false&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;document&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;createComment&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'my comment'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;instanceof&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Comment&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// true&lt;/span&gt;

&lt;span class=&quot;nb&quot;&gt;document&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;createElement&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'style'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;instanceof&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Node&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// true&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;document&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;createElement&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'style'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;instanceof&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Element&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// true&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;document&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;createElement&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'style'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;instanceof&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;HTMLElement&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// true&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;document&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;createElement&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'style'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;instanceof&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;HTMLStyleElement&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// true&lt;/span&gt;

&lt;span class=&quot;nb&quot;&gt;document&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;createTextNode&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'piw paw!'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;instanceof&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Node&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// true&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;document&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;createTextNode&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'piw paw!'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;instanceof&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Element&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// false&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;document&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;createTextNode&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'piw paw!'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;instanceof&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Text&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// true&lt;/span&gt;

&lt;span class=&quot;nb&quot;&gt;document&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;createDocumentFragment&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;instanceof&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Node&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// true&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;document&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;createDocumentFragment&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;instanceof&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Element&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// false&lt;/span&gt;
&lt;span class=&quot;nb&quot;&gt;document&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;createDocumentFragment&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;()&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;instanceof&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;DocumentFragment&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// true&lt;/span&gt;

&lt;span class=&quot;nb&quot;&gt;document&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;createAttribute&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'a'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;k&quot;&gt;instanceof&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;Attr&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// true&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;-błąd-w-mojej-bibliotece-pklib&quot;&gt;&lt;i class=&quot;icon-average&quot;&gt;&lt;/i&gt; Błąd w mojej bibliotece &lt;code class=&quot;highlighter-rouge&quot;&gt;pklib&lt;/code&gt;&lt;/h2&gt;

&lt;p&gt;W bibliotece &lt;a href=&quot;https://github.com/piecioshka/pklib.js&quot;&gt;pklib&lt;/a&gt; znajduje się metoda &lt;em&gt;isNode&lt;/em&gt; która sprawdza, czy dany obiekt, przesłany jako parametr, jest obiektem typu &lt;em&gt;node&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Niestety wykorzystuje ona “Duck typing” zamiast wykorzystać operator &lt;code class=&quot;highlighter-rouge&quot;&gt;instanceof&lt;/code&gt; - dlatego też biblioteka &lt;strong&gt;NIE DZIAŁA&lt;/strong&gt; poprawnie!&lt;/p&gt;

&lt;p&gt;Przykładowy kod:&lt;/p&gt;

&lt;div class=&quot;language-javascript highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;kd&quot;&gt;var&lt;/span&gt; &lt;span class=&quot;nx&quot;&gt;$div&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;nb&quot;&gt;document&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;createElement&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s1&quot;&gt;'div'&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt;

&lt;span class=&quot;nx&quot;&gt;pklib&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;dom&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;isElement&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;$div&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// true - wszystko jest zgadza...&lt;/span&gt;
&lt;span class=&quot;nx&quot;&gt;pklib&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;dom&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;isNode&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;nx&quot;&gt;$div&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;);&lt;/span&gt; &lt;span class=&quot;c1&quot;&gt;// false - no i tu jest zonk!&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Jak możesz zobaczyć w przykładzie funkcja &lt;code class=&quot;highlighter-rouge&quot;&gt;isNode&lt;/code&gt; nie zwraca poprawnej wartości gdy podajemy jako parametr &lt;em&gt;HTMLElement&lt;/em&gt;, który jest przecież elementem pochodnym &lt;em&gt;Node&lt;/em&gt;-a.&lt;/p&gt;

&lt;p&gt;Ta biblioteka ma wiele błędów. Dlatego uznaje ją jako &lt;strong&gt;DEPRECATED&lt;/strong&gt; i proszę drogi czytelniku o nie używanie jej - no chyba, że chcesz przetestować jak źle działa 😄.&lt;/p&gt;

&lt;h2 id=&quot;podsumowanie&quot;&gt;Podsumowanie&lt;/h2&gt;

&lt;p&gt;Mam nadzieje, że szybko wyjaśniłem Ci jaka jest różnica między &lt;em&gt;Node&lt;/em&gt;-a.&lt;/p&gt;

&lt;p&gt;W razie pytań zostaw komentarz.&lt;/p&gt;

&lt;p&gt;Ze swojego doświadczenia polecam &lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/API/Document&quot;&gt;MDN&lt;/a&gt;, gdzie jest dobra dokumentacja.&lt;/p&gt;
</description>
            <pubDate>Tue, 06 Sep 2011 00:00:00 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2011/09/06/node-vs-element.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2011/09/06/node-vs-element.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/post-banner-javascript.png</image>
        </item>
        
        <item>
            <title>Klient FTP — plugin czy program?</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Publikacja aplikacji na zewnętrzne serwery bardzo często przysparza programistom wiele problemów z ich klientami FTP - &lt;code class=&quot;highlighter-rouge&quot;&gt;Fire Transfer Protocol&lt;/code&gt;. Niektóre się wyłączają, inne nie mają przydatnej opcji “edycji w locie”.&lt;/p&gt;

&lt;p&gt;W locie oznacza edycję plików bezpośrednio na serwerze, bez konieczności kopiowania pliku do edycja na nasz dysk twardy.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/ftp/ftp.jpg&quot; itemprop=&quot;image&quot; alt=&quot;Baner promujący artykuł&quot; /&gt;
&lt;/figure&gt;

&lt;h2 id=&quot;total-commander&quot;&gt;Total Commander&lt;/h2&gt;

&lt;p&gt;Moim początkom z wgrywaniem plików na serwer zawsze towarzyszył &lt;a href=&quot;http://www.google.com/search?q=total+commander&quot;&gt;Total Commander&lt;/a&gt;. Aplikacja darmowa do użytku prywatnego. Za komercyjną licencję należy zapłacić. Istnieją dwie opcję licencji do kupienia:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;standardowa&lt;/li&gt;
  &lt;li&gt;dla studenta&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Więcej informacji pod &lt;a href=&quot;http://totalcmd.pl/zakup&quot;&gt;tym&lt;/a&gt; adresem.&lt;/p&gt;

&lt;p&gt;Total Commander do kombajn, nie ma co ukrywać, posiada bardzo dużo opcji konfiguracyjnych, ale czy podczas kopiowania plików na serwer są one nam potrzebne?&lt;/p&gt;

&lt;h2 id=&quot;plugin-do-przeglądarki-mozilla-firefox&quot;&gt;Plugin do przeglądarki Mozilla Firefox&lt;/h2&gt;

&lt;p&gt;Dla mnie nie, więc poszukałem czegoś &lt;em&gt;lżejszego&lt;/em&gt;. Znalazłem plugin do Firefox-a o nazwie &lt;a href=&quot;http://fireftp.mozdev.org/&quot;&gt;FireFTP&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Plugin instaluje się jak inne dowolne pluginy. Jest kompatybilny ze wszystkimi wersjami FF. Znajduję się w repozytorium pluginów pod adresem: &lt;a href=&quot;https://addons.mozilla.org/pl/firefox/addon/fireftp/&quot;&gt;https://addons.mozilla.org/pl/firefox/addon/fireftp/&lt;/a&gt;, więc instalacja polega na wpisaniu nazwy wtyczki do okienka: `Narzędzia → Dodatki`&lt;/p&gt;

&lt;p&gt;Możliwości pluginu są dla mnie wystarczające. Konfiguracja nie odstrasza, tak jak w przypadku &lt;em&gt;TC&lt;/em&gt;. Do codziennego upload-owania plików to jest wystarczający.&lt;/p&gt;

&lt;p&gt;Może istnieje jeszcze inne narzędzie? Nie wiem.&lt;/p&gt;
</description>
            <pubDate>Sat, 03 Sep 2011 00:00:00 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2011/09/03/klient-ftp-plugin-czy-program.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2011/09/03/klient-ftp-plugin-czy-program.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/ftp/ftp.jpg</image>
        </item>
        
        <item>
            <title>Gotowe szablony na stronę WWW</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Od pewnego momentu naszła mnie ochota aby troszeczkę zmienić layout mojej
strony oraz homepage-u mojej biblioteki JavaScript
&lt;a href=&quot;https://github.com/piecioshka/pklib.js&quot;&gt;pklib&lt;/a&gt;.
Dlatego zabrałem się za poszukiwanie nowych layoutów w serwisach
oferujących darmowe albo płatne layouty.&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/template-master/template-master.jpg&quot; itemprop=&quot;image&quot; alt=&quot;Baner promujący artykuł&quot; /&gt;
&lt;/figure&gt;

&lt;p&gt;Zrobiłem krótki research w środowisku grafik designerów i jak się okazało
koszt layoutu zaczyna się od 1500 pln,- 😄 Cena jest dość wysoka,
ale za przelanie swojego wyobrażenia strony internetowej
do formatu &lt;a href=&quot;http://pl.wikipedia.org/wiki/Photoshop_Document&quot;&gt;PSD&lt;/a&gt; nie jest
szybko i łatwą sprawą.&lt;/p&gt;

&lt;p&gt;Postawiłem jednak, że poszukam gotowego layouty zrobionego przez
freelancerów którzy sprzedali swoje layouty serwisom, które je oferują na
sprzedaż.&lt;/p&gt;

&lt;p&gt;Jednym z takich serwisów jest &lt;a href=&quot;http://www.4templates.com&quot;&gt;http://www.4templates.com&lt;/a&gt;. Baza
layoutów jest dość obszerna i ma ponad 90 stron z różnego rodzaju
layoutami. Sądzę że, każdy znajdzie tu coś dla siebie. Koszt za
pojedynczy egzemplarz zaczyna się od 5 dolarów, a górna granica to około 30$.&lt;/p&gt;

&lt;p&gt;Jako przykład mogę podać layout który zakupiłem dla strony głównej
biblioteki &lt;code class=&quot;highlighter-rouge&quot;&gt;pklib&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Krótkie poszukiwania darmowego layoutu szybko skłoniły mnie do stwierdzenia,
że to, co darmowe w tym przypadku nie jest dobre, niestety.&lt;/p&gt;

&lt;h2 id=&quot;podsumowanie&quot;&gt;Podsumowanie&lt;/h2&gt;

&lt;p&gt;Polecam zakup layouty ze względu na:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;jakość wykonania projektu graficznego&lt;/li&gt;
  &lt;li&gt;nowoczesny układ&lt;/li&gt;
  &lt;li&gt;dobra jakość kodu&lt;/li&gt;
  &lt;li&gt;możliwość dowolnej przeróbki&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Na koniec zamieszczam kilka wartościowych linków:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.buytemplates.net&quot;&gt;http://www.buytemplates.net&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.templatemonster.com&quot;&gt;http://www.templatemonster.com&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.templateworld.com/buy_templates.html&quot;&gt;http://www.templateworld.com/buy_templates.html&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.templates.com&quot;&gt;http://www.templates.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
            <pubDate>Fri, 02 Sep 2011 00:00:00 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2011/09/02/gotowe-szablony-na-strone-www.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2011/09/02/gotowe-szablony-na-strone-www.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/template-master/template-master.jpg</image>
        </item>
        
        <item>
            <title>Jak stworzyć przyjazne linki w WordPress?</title>
            <dc:creator>Piotr Kowalski</dc:creator>
            <description>&lt;p&gt;Podczas tworzenia swojego bloga napotkałem się na taki element w konfiguracji
jak &lt;strong&gt;Bezpośrednie odnośniki&lt;/strong&gt;. Dzięki temu panelowi możemy w dowolny sposób
modelować wygląd adresów naszego bloga.&lt;/p&gt;

&lt;p&gt;Mój przykład: &lt;a href=&quot;https://piecioshka.pl/blog/info/witaj-swiecie&quot;&gt;piecioshka.pl/blog/info/witaj-swiecie&lt;/a&gt;&lt;/p&gt;

&lt;figure&gt;
    &lt;img src=&quot;/assets/images/posts/wordpress/wordpress.jpg&quot; itemprop=&quot;image&quot; alt=&quot;Baner promujący artykuł&quot; /&gt;
&lt;/figure&gt;

&lt;p&gt;Zaraz po adresie bloga jest nazwa kategorii, a następnie &lt;a href=&quot;https://you.tools/slugify/&quot;&gt;slugowana&lt;/a&gt;
tytuł posta. Zapis w konfiguracji wygląda następująco:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;/%category%/%postname%
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Wybrałem opcję &lt;strong&gt;Własny format&lt;/strong&gt; i wklepałem kod powyżej do input-a.
Następnie w głównym katalogu utworzyłem plik &lt;code class=&quot;highlighter-rouge&quot;&gt;.htaccess&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;O następującej zawartości:&lt;/p&gt;

&lt;div class=&quot;language-bash highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c&quot;&gt;# BEGIN WordPress&lt;/span&gt;
RewriteEngine On
RewriteBase /
RewriteCond %&lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;REQUEST_FILENAME&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-f&lt;/span&gt;
RewriteCond %&lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;REQUEST_FILENAME&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;nt&quot;&gt;-d&lt;/span&gt;
RewriteRule &lt;span class=&quot;nb&quot;&gt;.&lt;/span&gt; /index.php &lt;span class=&quot;o&quot;&gt;[&lt;/span&gt;L]
&lt;span class=&quot;c&quot;&gt;# END WordPress&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Po tych dwóch krokach linki są zdecydowanie bardziej przyjazne niż
&lt;strong&gt;https://piecioshka.pl/blog/?page=3&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Właściwa dokumentacja znajduje się tutaj: &lt;a href=&quot;http://codex.wordpress.org/Using_Permalinks&quot;&gt;codex.wordpress.org/Using_Permalinks&lt;/a&gt;&lt;/p&gt;

&lt;!-- Resources --&gt;

</description>
            <pubDate>Sat, 27 Aug 2011 00:00:00 +0000</pubDate>
            <link>https://piecioshka.pl/blog/2011/08/27/jak-stworzyc-przyjazne-linki-w-wordpress.html</link>
            <guid isPermaLink="true">https://piecioshka.pl/blog/2011/08/27/jak-stworzyc-przyjazne-linki-w-wordpress.html</guid>
            <image>https://piecioshka.pl/assets/images/posts/wordpress/wordpress.jpg</image>
        </item>
        
    </channel>
</rss>
