<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>szogun1987 &#8211; Strona Szoguna</title>
	<atom:link href="https://szogun1987.pl/show/author/szogun1987/feed/" rel="self" type="application/rss+xml" />
	<link>https://szogun1987.pl</link>
	<description>Jeszcze wstawię tutaj jakiś głęboki cytat</description>
	<lastBuildDate>Sun, 01 Nov 2020 21:13:48 +0000</lastBuildDate>
	<language>pl-PL</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.8.1</generator>
	<item>
		<title>ESP8266 &#8211; Obsługa WebSockets</title>
		<link>https://szogun1987.pl/show/esp8266-obsluga-websockets/782/</link>
					<comments>https://szogun1987.pl/show/esp8266-obsluga-websockets/782/#respond</comments>
		
		<dc:creator><![CDATA[szogun1987]]></dc:creator>
		<pubDate>Sun, 01 Nov 2020 09:44:48 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Arduino]]></category>
		<category><![CDATA[esp8266]]></category>
		<category><![CDATA[Iot]]></category>
		<guid isPermaLink="false">https://szogun1987.pl/?p=782</guid>

					<description><![CDATA[W artykule o podłączeniu ESP8266 do internetu wspomniałem opisałem rozwiązanie, w którym urządzenie w kółko odpytywało serwer o porządany stan. Rozwiązanie to, które nazywa się polingiem, jest proste ale powoduje pewne problemy. Alternatywą jest technologia WebSockets. Po pierwsze każde wywołanie http jest na tyle powolne, że jest dostrzegalne i denerwujące w użytkowaniu. Dzieje się tak &#8230; <p class="link-more"><a href="https://szogun1987.pl/show/esp8266-obsluga-websockets/782/" class="more-link">Czytaj dalej<span class="screen-reader-text"> „ESP8266 &#8211; Obsługa WebSockets”</span></a></p>]]></description>
										<content:encoded><![CDATA[
<p>W artykule o <a href="https://szogun1987.pl/show/podlaczenie-esp8266-do-internetu/579">podłączeniu ESP8266 do internetu</a> wspomniałem opisałem rozwiązanie, w którym urządzenie w kółko odpytywało serwer o porządany stan. </p>



<p>Rozwiązanie to, które nazywa się polingiem, jest proste ale powoduje pewne problemy. Alternatywą jest technologia WebSockets.</p>



<span id="more-782"></span>



<p>Po pierwsze każde wywołanie http jest na tyle powolne, że jest dostrzegalne i denerwujące w użytkowaniu. Dzieje się tak ponieważ wiąże się nawiązaniem połączenia na nowo.</p>



<p>Po drugie moja aplikacja serwerowa jest uruchomiona w chmurze Google i jest chroniona przez mechanizmy powiązane z jej load-balancerem. Mechanizmy te dość szybko odcięły moje ESP8266 od aplikacji, ponieważ uznały je za próbę ataku DoS (Denial of Service) Wydłużenie czasu pomiędzy wywołaniami do 1.5 sekundy, sprawiało że mój domowy adres IP otrzymywał bana raz tydzień, a nie kilka razy dziennie.<br>Ban sprawiał że albo płytka odbierająca sygnał z pilota nie mogła go dostarczyć do aplikacji w chmurze, albo płytka sterująca diodami LED nie była w stanie odebrać oczekiwanego stanu.</p>



<p>Technologia WebSockets zamiast wielu krótkich połączeń, nawiązywane jest jedno połączenie długo-żyjące, umożliwiające komunikację dwustronną dzięki temu</p>



<ul class="wp-block-list"><li>praca routerów związana z całym stosem TCP wykonywana jest rzadziej </li><li>brama ogniowa jest odpytywana znacznie rzadziej o pozwolenie na wejście, więc nie traktuje tych zapytań jako ataku.</li></ul>



<p>Obsługa webSockets nie jest może super-skomplikowana ale po co to robić jak istnieje kilka bibliotek pomagających obsłużyć tą technologię. Pierwszą, która mi zadziałała i miała fajne API, była WebSockets2_Generic.</p>



<p>Podobnie jak inne biblioteki, instaluje się ją klikając w Arduino studio Sketch -&gt; Include library -&gt; Manage libraries.</p>



<figure class="wp-block-image size-large"><img fetchpriority="high" decoding="async" width="756" height="253" src="https://szogun1987.azureedge.net/wp-content/esp8266-websockets-install.png" alt="" class="wp-image-792"/></figure>



<p>Na wyświetlonej liście powinien znajdować się element WebSockets2_Generic</p>



<figure class="wp-block-image size-large"><img decoding="async" width="786" height="443" src="https://szogun1987.azureedge.net/wp-content/esp8266-websockets-install-2.png" alt="" class="wp-image-793"/></figure>



<p>Aby wykorzystać tą bibliotekę należy zaimportować biblioteki związane z konfiguracją WiFi oraz bibliotekę WebSockets2_Generic. </p>



<p>Biblioteka zawiera przestrzeń nazw websockets2_generic, a ta klasę WebsocketsClient.</p>



<pre class="wp-block-code"><code>
#include &lt;WebSockets2_Generic.h&gt;

#include &lt;ESP8266WiFi.h&gt;
#include &lt;ESP8266WiFiMulti.h&gt;
#include &lt;WiFiClient.h&gt;

ESP8266WiFiMulti WiFiMulti;

using namespace websockets2_generic;

WebsocketsClient client;

void setup() {
  WiFi.mode(WIFI_STA);
  WiFiMulti.addAP(<code>"&lt;SSID&gt;", "&lt;Password&gt;"</code>);

  pinMode(3, OUTPUT);

  client.onMessage(onClientMessage);
}

void onClientMessage(WebsocketsMessage message) {
  if(message.data() == "true") {
    digitalWrite(3, HIGH);
  } else {
    digitalWrite(3, LOW);
  }
}

void loop() {
  if (WiFiMulti.run() != WL_CONNECTED) {
    return;
  }
  if (!client.available()) 
  {
    if(!client.connect("&lt;server-dns-name-or-ip&gt;", 80, "&lt;path&gt;")) {
      return;
    }
  }

  client.poll();
}


</code></pre>



<p>Klasa posiada 5 metod:</p>



<ul class="wp-block-list"><li>available &#8211; sprawdza czy połączenie z serwerem jest nawiązane</li><li>connect &#8211; otwiera połączenie z serwerem, niestety metoda nie przyjmuje url tylko 3 argumenty: adres serwera, port na którym nasłuchuje serwer, ścieżka na serwerze</li><li>send  &#8211; wysyła wiadomość do serwera &#8211; w tym kodzie nie używana</li><li>onMessage &#8211; przyjmuje jako parametr metodę wywołaną gdy serwer nada wiadomość</li><li>poll &#8211; wywoływana w metodzie loop &#8211; zawiera komunikację z serwerem</li></ul>



<p>To w zasadzie wszystkie zmiany po stronie urządzenia, pozostaje tylko tak zmienić kod serwera.</p>



<div class="wp-block-image"><figure class="aligncenter size-large"><img decoding="async" width="431" height="235" src="https://szogun1987.azureedge.net/wp-content/esp8266-websockets-sequence.png" alt="" class="wp-image-797"/></figure></div>



<p>Po zastosowaniu tych zmian odbiornik reaguje praktycznie natychmiastowo.</p>



<figure class="wp-block-video"><video controls src="https://szogun1987.azureedge.net/wp-content/esp8266-websockets.mp4"></video></figure>



<p class="has-cyan-bluish-gray-background-color has-background">Inne artykuły związane z&nbsp;<a href="https://szogun1987.pl/artykuly-o-iot/">Internetem rzeczy</a></p>
]]></content:encoded>
					
					<wfw:commentRss>https://szogun1987.pl/show/esp8266-obsluga-websockets/782/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		<enclosure url="https://szogun1987.azureedge.net/wp-content/esp8266-websockets.mp4" length="2557016" type="video/mp4" />

			</item>
		<item>
		<title>ESP8266 &#8211; Obsługa podczerwieni</title>
		<link>https://szogun1987.pl/show/esp8266-obsluga-podczerwieni/765/</link>
					<comments>https://szogun1987.pl/show/esp8266-obsluga-podczerwieni/765/#respond</comments>
		
		<dc:creator><![CDATA[szogun1987]]></dc:creator>
		<pubDate>Sun, 30 Aug 2020 18:36:21 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Arduino]]></category>
		<category><![CDATA[esp8266]]></category>
		<category><![CDATA[Iot]]></category>
		<guid isPermaLink="false">https://szogun1987.pl/?p=765</guid>

					<description><![CDATA[Pomimo rozwoju technologii, piloty wykorzystujące podczerwień do dzisiaj są powszechnie wykorzystywane. Moim zdaniem wynika to z faktu iż ta forma komunikacji łączy w sobie wygodę i bezpieczeństwo. Urządzenia oparte o ESP8266 mogą bardzo łatwo korzystać z dobrodziejstw tego rozwiązania. Pod względem sprzętowym wystarczy jeden czujnik podczerwieni. Przykładem takiego czujnika jest VS1838B. Układ ten jest fotorezystorem &#8230; <p class="link-more"><a href="https://szogun1987.pl/show/esp8266-obsluga-podczerwieni/765/" class="more-link">Czytaj dalej<span class="screen-reader-text"> „ESP8266 &#8211; Obsługa podczerwieni”</span></a></p>]]></description>
										<content:encoded><![CDATA[
<p>Pomimo rozwoju technologii, piloty wykorzystujące podczerwień do dzisiaj są powszechnie wykorzystywane. Moim zdaniem wynika to z faktu iż ta forma komunikacji łączy w sobie wygodę i bezpieczeństwo.</p>



<p>Urządzenia oparte o ESP8266 mogą bardzo łatwo korzystać z dobrodziejstw tego rozwiązania.</p>



<span id="more-765"></span>



<p>Pod względem sprzętowym wystarczy jeden czujnik podczerwieni. Przykładem takiego czujnika jest VS1838B. Układ ten jest fotorezystorem opakowanym w plastik, który znacznie lepiej przepuszcza podczerwień niż światło widzialne. Dodatkowo układ ten zawiera serię filtrów i wzmacniaczy, których zadaniem jest oddzielić sygnał wysłany przez pilot od innych źródeł podczerwieni w otoczeniu (np. nagrzewającej się elektroniki).</p>



<p>Całość zamknięta jest w metalową obudowę, która wpuszcza tylko promieniowanie biegnące od przodu układu, co zabezpiecza przed odbieraniem sygnałów odbitych od ścian.</p>



<p>Najważniejszą zaletą tego układu jest cena. W Polsce można go dostać poniżej złotówki za sztukę, a na znanym chińskim portalu bez problemu udało mi się znaleźć ofertę po 25 groszy przy zakupie 100 sztuk.</p>



<div class="wp-block-image"><figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="461" height="541" src="https://szogun1987.azureedge.net/wp-content/ESP8266-VS1838B.jpg" alt="" class="wp-image-768"/></figure></div>



<p>Układ posiada 3 nóżki (od lewej): zasilanie, masa i wyjście. Ich podłączenie jest dość intuicyjne: nóżkę zasilania należy połączyć z zasilaniem ESP8266, masę z masą układu, a wyjście z dowolnym wejściem.</p>



<div class="wp-block-image"><figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="869" height="204" src="https://szogun1987.azureedge.net/wp-content/ESP8266-VS1838B-circuit.png" alt="" class="wp-image-770"/></figure></div>



<p>Producent zaleca dodatkowo dodanie trzech elementów, nie znalazłem jednak uzasadnienia ich użycia (działa bez nich). Elementy te to:</p>



<ul class="wp-block-list"><li>Opornik 100 Ohm między źródłem zasilania, a wejściem VCC &#8211; prawdopodobnie służy ograniczeniu prądu płynącego przez układ</li><li>Opornik 20 kOhm między nóżkami VCC i OUT &#8211; wiele układów cyfrowych potrafi się nie uruchomić jeżeli któreś jego wejście jest połączone z masą, w przypadku ESP8266 są to złącza IO2, IO4 i RX &#8211; przy czym nie sam nie zaobserwowałem tego problemu w połączeniu z VS1828B</li><li>Kondensator 100 mikro-Farad między zasilaniem, a masą &#8211; absolutnie nie mam pojęcia jaką rolę w tym układzie pełni ten element &#8211; pewnie jakbym miał oscyloskop to mógłbym sprawdzić.</li></ul>



<div class="wp-block-image"><figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="871" height="222" src="https://szogun1987.azureedge.net/wp-content/ESP8266-VS1838B-circuit-up.png" alt="" class="wp-image-772"/></figure></div>



<p>Układ wysyła szeregowo otrzymaną treść. Dekodowanie tej treści nie jest łatwym zadaniem na szczęście, są gotowe biblioteki, które to robią.</p>



<p>Dla układów Arduino istnieje biblioteka IRremote, niestety nie można jej wykorzystać przy pracy z ESP8266, istnieje jednak jej port <a rel="noreferrer noopener" href="https://github.com/crankyoldgit/IRremoteESP8266" data-type="URL" data-id="https://github.com/crankyoldgit/IRremoteESP8266" target="_blank">IRremoteESP8266</a>. </p>



<p>Aby ją zainstalować otworzyłem Arduino studio i kliknąć Sketch -&gt; <em>Include Library</em> -&gt; Manage Libraries. </p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="758" height="667" src="https://szogun1987.azureedge.net/wp-content/ESP8266-IRRemote-install-1.png" alt="" class="wp-image-773"/></figure>



<p>W polu wyszukiwania wpisałem &#8222;IRremoteESP8266&#8221; i kliknąć przycisk &#8222;Install&#8221;.</p>



<div class="wp-block-image"><figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="796" height="443" src="https://szogun1987.azureedge.net/wp-content/ESP8266-IRRemote-install-2.png" alt="" class="wp-image-774"/></figure></div>



<p>Biblioteka zawiera dużą ilość klas i narzędzi, jednak do odbioru sygnału z pilota wystarczy moduł IRrecv, który zawiera klasy IRrecv oraz decode_results. Instancję pierwszej należy zainicjować oraz zadeklarować instancję drugiej.</p>



<pre class="wp-block-code"><code>#include &lt;IRrecv.h>

IRrecv irrecv(2);
decode_results results;

void setup() {
  irrecv.enableIRIn();
}

void loop() {
  if (irrecv.decode(&amp;results)){
    int resVal = results.value;

    // TODO: Do something with resVal

    irrecv.resume();
  }
  delay(100);
}</code></pre>



<p>Metoda setup zawiera wywołanie enableIRIn, która przygotowuje układ i klasę do odbioru sygnału. Metoda loop zawiera wywołanie metody decode, metoda ta zwraca true jeżeli klasie udało się zdekodować sygnał.</p>



<p>Metoda przyjmuje jako parametr wskaźnik na pole typu decode_results w które wpisywane są wyniki dekodowania sygnału.</p>



<p>Najważniejszym polem wyników jest value &#8211; kod wciśniętego przycisku.</p>



<p>Po zakończeniu obsługi sygnały należy wywołać metodę resume &#8211; dającą bibliotece sygnał, że można dekodować kolejną wartość. </p>



<figure class="wp-block-video aligncenter"><video controls src="https://szogun1987.azureedge.net/wp-content/ESP8266-VS1838B.mp4"></video></figure>



<p class="has-black-color has-cyan-bluish-gray-background-color has-text-color has-background">Inne artykuły związane z <a href="https://szogun1987.pl/artykuly-o-iot/">Internetem rzeczy</a></p>
]]></content:encoded>
					
					<wfw:commentRss>https://szogun1987.pl/show/esp8266-obsluga-podczerwieni/765/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		<enclosure url="https://szogun1987.azureedge.net/wp-content/ESP8266-VS1838B.mp4" length="1723770" type="video/mp4" />

			</item>
		<item>
		<title>ESP8266 &#8211; wincyj mocy</title>
		<link>https://szogun1987.pl/show/esp8266-wincyj-mocy/703/</link>
					<comments>https://szogun1987.pl/show/esp8266-wincyj-mocy/703/#respond</comments>
		
		<dc:creator><![CDATA[szogun1987]]></dc:creator>
		<pubDate>Sun, 19 Jul 2020 18:37:52 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Arduino]]></category>
		<category><![CDATA[esp8266]]></category>
		<category><![CDATA[Iot]]></category>
		<guid isPermaLink="false">https://szogun1987.pl/?p=703</guid>

					<description><![CDATA[Wcześniejsze projekty były mało efektowne. Mruganie małą diodą LED nie robi dzisiaj wrażenia. Niestety moc, wynikająca z napięcia i wydajności prądowej, układów cyfrowych (w przypadku ESP8266 jest to 3.3V i znacznie poniżej 0,5A czyli około Watta) pozwala na niewiele więcej. Na szczęście istnieją sposoby na wzmocnienie sygnału cyfrowego. Skoro mikrokontroler nie jest w stanie zasilić &#8230; <p class="link-more"><a href="https://szogun1987.pl/show/esp8266-wincyj-mocy/703/" class="more-link">Czytaj dalej<span class="screen-reader-text"> „ESP8266 &#8211; wincyj mocy”</span></a></p>]]></description>
										<content:encoded><![CDATA[
<p>Wcześniejsze projekty były mało efektowne. Mruganie małą diodą LED nie robi dzisiaj wrażenia. Niestety moc, wynikająca z napięcia i wydajności prądowej, układów cyfrowych (w przypadku ESP8266 jest to 3.3V i znacznie poniżej 0,5A czyli około Watta)  pozwala na niewiele więcej.</p>



<p>Na szczęście istnieją sposoby na wzmocnienie sygnału cyfrowego.</p>



<span id="more-703"></span>



<p>Skoro mikrokontroler nie jest w stanie zasilić odbiornika, odbiornik musi mieć swoje własne źródło zasilania, które jest podłączane gdy mikrokontroler dostarczy sygnału i odłączone gdy sygnał ustaje. Urządzeniem które tak działa jest przekaźnik.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1024" height="445" src="https://szogun1987.azureedge.net/wp-content/ESP8266-relay-1024x445.jpg" alt="" class="wp-image-714"/></figure>



<p>Na zdjęciu widać 3 urządzenia po lewej znajduje się przekaźnik elektromagnetyczny, po środku znajduje się urządzenie sprzedawane jako &#8222;moduł przekaźnika&#8221; czyli przekaźnik opakowany w kilka elementów elektronicznych sprawiających że łatwiej go użyć majsterkowiczom. Trzecim urządzeniem jest moduł przekaźnika półprzewodnikowego SSR (solid-state-relay).</p>



<p>Przekaźniki elektromagnetyczne zawierają przełącznik i cewkę, po podaniu napięcia na cewkę przełącznik zostaje włączony/wyłączony, a po odjęciu zasilania wraca na pierwotną pozycję.</p>



<p>Przekaźniki półprzewodnikowe nie posiadają ruchomych części, dzięki czemu podczas pracy nie wydają dźwięku i się mniej psują. Dodatkowo nie posiadają też elementów magnetycznych . Niestety mają trochę wyższą cenę. Należy też je dobierać do zastosowania, ponieważ mają wąsko określony typ sterowanego prądu (stały, zmienny) oraz moc. przekaźnik elektromagnetyczny jest bardziej elastyczny.</p>



<p>Standardowym układem pokazującym pracę przekaźnika jest sterowanie napięciem 220V przy pomocy małego przycisku i baterii.</p>



<div class="wp-block-image"><figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="505" height="143" src="https://szogun1987.azureedge.net/wp-content/esp8266-basic-relay.png" alt="" class="wp-image-716"/></figure></div>



<p>Osobiście zbudowałem podobny układ w którym mały przełącznik przez który może płynąć do 50mA steruje listwami LED wymagającymi 2A.</p>



<div class="wp-block-image"><figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="551" height="190" src="https://szogun1987.azureedge.net/wp-content/esp8266-wardrobe-1.png" alt="" class="wp-image-718"/></figure></div>



<p>Cały układ można by zbudować bez przekaźnika, wykorzystując większy przełącznik, jednak w tym przypadku musiał on się zmieścić w szczelinie drzwi szafy. Aby ograniczyć prąd płynący przez przełącznik wystarczyło zastosować silny opornik. Jako ciekawostkę podam, że moduły przekaźników zazwyczaj posiadają taki opornik.</p>



<div class="wp-block-image"><figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="768" height="1024" src="https://szogun1987.azureedge.net/wp-content/IMG_20200712_195302646-1-768x1024.jpg" alt="" class="wp-image-720"/></figure></div>



<figure class="wp-block-video aligncenter"><video controls src="https://szogun1987.azureedge.net/wp-content/InShot_20200712_212022353-1.mp4"></video></figure>


]]></content:encoded>
					
					<wfw:commentRss>https://szogun1987.pl/show/esp8266-wincyj-mocy/703/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		<enclosure url="https://szogun1987.azureedge.net/wp-content/InShot_20200712_212022353-1.mp4" length="3390534" type="video/mp4" />
<enclosure url="https://szogun1987.azureedge.net/wp-content/InShot_20200712_211958511.mp4" length="2152902" type="video/mp4" />

			</item>
		<item>
		<title>Podłączenie ESP8266 do internetu</title>
		<link>https://szogun1987.pl/show/podlaczenie-esp8266-do-internetu/579/</link>
					<comments>https://szogun1987.pl/show/podlaczenie-esp8266-do-internetu/579/#comments</comments>
		
		<dc:creator><![CDATA[szogun1987]]></dc:creator>
		<pubDate>Wed, 22 Jan 2020 07:14:06 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Arduino]]></category>
		<category><![CDATA[esp8266]]></category>
		<category><![CDATA[Iot]]></category>
		<guid isPermaLink="false">https://szogun1987.pl/?p=579</guid>

					<description><![CDATA[Artykuł o sterowaniu diodą oraz odczycie stanu przycisku pokazały w jaki sposób kod może sterować urządzeniami, oraz badać ich stan. Żaden z projektów nie wykorzystywał jednak połączenia z internetem, więc ciężko mówić że były to przykłady implementacji internetu rzeczy. Czas to poprawić. Kolejny projekt będzie polegał na sterowaniu przełączaniu diody w jednym ESP po naciśnięciu &#8230; <p class="link-more"><a href="https://szogun1987.pl/show/podlaczenie-esp8266-do-internetu/579/" class="more-link">Czytaj dalej<span class="screen-reader-text"> „Podłączenie ESP8266 do internetu”</span></a></p>]]></description>
										<content:encoded><![CDATA[
<p><a href="https://szogun1987.pl/show/iot-z-wykorzystaniem-esp8266/560/">Artykuł o sterowaniu diodą</a> oraz <a href="https://szogun1987.pl/show/esp8266-podlaczenie-przycisku/600/">odczycie stanu przycisku</a> pokazały w jaki sposób kod może sterować urządzeniami, oraz badać ich stan. Żaden z projektów nie wykorzystywał jednak połączenia z internetem, więc ciężko mówić że były to przykłady implementacji internetu rzeczy. Czas to poprawić. Kolejny projekt będzie polegał na sterowaniu przełączaniu diody w jednym ESP po naciśnięciu przycisku podpiętego do drugiego.</p>



<span id="more-579"></span>



<h2 class="wp-block-heading">Cyfrowy bliźniak</h2>



<p>Podczas projektowania systemów IoT często wykorzystuje się wzorzec architektoniczny &#8222;Cyfrowy bliźniak&#8221;. </p>



<p>Polega on na stworzeniu cyfrowego modelu fizycznego przedmiotu, zawierającego jego oczekiwany stan oraz opis zachowań w reakcji na zdarzenia. Model ten może ulegać częstym zmianom i poprawkom więc umieszczenie go na serwerze dostawcy albo w chmurze obliczeniowej jest rozsądnym rozwiązaniem.</p>



<p>Fizyczny obiekt jest opleciony czujnikami, pozwalającymi obserwować zarówno jego samego jak i jego otoczenie, oraz elementami sterującymi (silniki, grzałki, chłodnice, diody) pozwalającymi ten obiekt zmieniać. Elementy te są połączone z kilkoma układami cyfrowymi. Kod na tych układach jest dość prosty: pobrać dane z serwera na temat oczekiwanego stanu sterowanych elementów, ewentualnie wysłać na serwer informacje o istotnych odczytach z czujników (zdarzeniach).</p>



<h2 class="wp-block-heading">Kod serwera</h2>



<p>W przypadku tego projektu kod serwera jest prosty. Serwer ma mieć dwa kanały komunikacji: jeden pozwalający lampce dowiedzieć się czy jest włączona i drugi którym przycisk przekazuje informację że został wciśnięty. Ważną zaletą tego rozwiązania jest fakt że przycisk nie wie że lampa istnieje i vice versa. Pozwala to rozszerzać układ o dodatkowe elementy (czujniki ruchu, nauczanie maszynowe) bez konieczności zmiany kodu na urządzeniach.</p>



<p>Serwer zrealizowałem jako aplikację web, wykorzystującą protokół http, która posiada dwa punkty końcowe: /led i /button odpowiadające urządzeniom.</p>



<p>Oczekiwany stan urządzenia jest zwracany jako odpowiedź na wywołanie GET, ponieważ układ z przyciskiem nie posiada oczekiwanego stanu jest on zaimplementowany tylko dla diody. Punkt /led zwraca wartość &#8222;ON&#8221; albo &#8222;OFF&#8221; w zależności od tego czy w danym momencie dioda ma być włączona czy zgaszona.</p>



<p>Zdarzenia są rejestrowane w obsłudze wywołań POST, która pozwala na przesłanie szczegółów zdarzenia w ciele metody. Układ z diodą LED nie generuje żadnych zdarzeń, więc punkt działa tylko dla przycisku. Wciśnięcie przycisku przycisku nie niesie ze sobą żadnych dodatkowych informacji więc ciało wywołania jest ignorowane. Stan diody jest przechowywany w pamięci  RAM co ułatwia implementację.</p>



<p>Aplikację można zrealizować w dowolnej nowoczesnej technologii, ja zdecydowałem się ASP.Net MVC Core. Można ją jednak zaimplementować w dowolnej technologii.</p>



<p class="has-background has-very-light-gray-background-color">Drobna uwaga dotycząca technologii PHP. Zmienne statyczne w tej technologii są dostępne w zakresie wywołania, przez co stan diody nie może być przechowywany w pamięci należy ją przechowywać w zewnętrznym magazynie np. plik, cache Redis albo baza danych.</p>



<p>Aplikację stworzyłem tworząc katalog Twin, otwierając w nim okno poleceń i wpisując w nią:</p>



<pre class="wp-block-code"><code>dotnet new webapi</code></pre>



<p class="has-background has-very-light-gray-background-color">Polecenie wymaga wcześniejszego zainstalowania środowiska .Net core dostępnego na stronie <a href="https://dotnet.microsoft.com/download">https://dotnet.microsoft.com/download</a> pod przyciskiem &#8222;Download .Net Core SDK&#8221;</p>



<p>Następnie usunąłem klasę ValueController znajdującą się w katalogu Controllers oraz dodałem klasę IndexController.</p>



<pre class="wp-block-code"><code>using Microsoft.AspNetCore.Mvc;

namespace Twin.Controllers
{
    &#91;ApiController]
    public class ValuesController : ControllerBase
    {
        private static string _ledState = "ON";
        
        &#91;HttpGet("led")]
        public ActionResult&lt;string> Get()
        {
            return _ledState;
        }

        
        &#91;HttpPost("button")]
        public void Post()
        {
            _ledState = _ledState == "ON" ? "OFF" : "ON";
        }
    }
}
</code></pre>



<p>Szablony w .net core domyślnie wymuszają szyfrowaną komunikację (https), co jest wskazane dla rozwiązań produkcyjnych, jednak nadmiarowo komplikuje ten przykład.  Aby wyłączyć to zachowanie należy z pliku Startup.cs usunąć linijkę:</p>



<pre class="wp-block-code"><code>app.UseHttpsRedirection();</code></pre>



<p>Natomiast w pliku Program.cs zmienić metodę CreateWebHostBuilder na:</p>



<pre class="wp-block-code"><code>public static IWebHostBuilder CreateWebHostBuilder(string&#91;] args) =>
    WebHost.CreateDefaultBuilder(args)
        .UseKestrel(opt => { opt.ListenAnyIP(5000); })
        .UseStartup&lt;Startup>();
}</code></pre>



<p>Ostateczna wersja programu jest do pobrania pod tym linkiem<a href="https://szogun1987.azureedge.net/wp-content/Twin.zip">: Twin.zip</a>. Aby go uruchomić należy rozpakować archiwum, otworzyć wiersz poleceń w katalogu gdzie je rozpakowano i wpisać:</p>



<pre class="wp-block-code"><code>dotnet run</code></pre>



<p>Aplikacja zacznie nasłuchiwać na połączenia na porcie 5000.</p>


]]></content:encoded>
					
					<wfw:commentRss>https://szogun1987.pl/show/podlaczenie-esp8266-do-internetu/579/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		<enclosure url="https://szogun1987.azureedge.net/wp-content/ESP_Remote_mrug.mov" length="609226" type="video/quicktime" />

			</item>
		<item>
		<title>Gdy Logstash przestaje działać po dwóch tygodniach.</title>
		<link>https://szogun1987.pl/show/gdy-logstash-przestaje-dzialac-po-dwoch-tygodniach/680/</link>
					<comments>https://szogun1987.pl/show/gdy-logstash-przestaje-dzialac-po-dwoch-tygodniach/680/#comments</comments>
		
		<dc:creator><![CDATA[szogun1987]]></dc:creator>
		<pubDate>Fri, 17 Jan 2020 20:51:40 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<guid isPermaLink="false">https://szogun1987.pl/?p=680</guid>

					<description><![CDATA[Niedawno postawiłem świeży stos ELK (Elastic Search, Logstash, Kibana). Wszystko fajnie śmigało przez trochę ponad 2 tygodnie aż przestało. Nowe wpisy przestały się pojawiać w Elastic search. Sprawdziłem czy procesy działają, ale działały. Następnie zajrzałem do logów Logstasha i znalazłem tam wpis z komunikatem: Był tam też drugi wpis wskazujący, że chodzi o index nazywający &#8230; <p class="link-more"><a href="https://szogun1987.pl/show/gdy-logstash-przestaje-dzialac-po-dwoch-tygodniach/680/" class="more-link">Czytaj dalej<span class="screen-reader-text"> „Gdy Logstash przestaje działać po dwóch tygodniach.”</span></a></p>]]></description>
										<content:encoded><![CDATA[
<p>Niedawno postawiłem świeży stos ELK (Elastic Search, Logstash, Kibana). Wszystko fajnie śmigało przez trochę ponad 2 tygodnie aż przestało.</p>



<span id="more-680"></span>



<p>Nowe wpisy przestały się pojawiać w Elastic search. Sprawdziłem czy procesy działają, ale działały. Następnie zajrzałem do logów Logstasha i znalazłem tam wpis z komunikatem:</p>



<pre class="wp-block-code"><code>"reason"=>"blocked by: &#91;FORBIDDEN/12/index read-only / allow delete (api)];"</code></pre>



<p>Był tam też drugi wpis wskazujący, że chodzi o index nazywający się logstash-2019.12.28-0002. Logstash tworzy domyślnie politykę w ES, która ustawia flagę &#8222;read_only_allow_delete&#8221; na starych indeksach. Stwierdziłem, że któraś z usług wygenerowała dziwny wpis, z datą z przeszłości i że wskazany powyżej index należy odblokować. Tak też zrobiłem, co odblokowało cały mechanizm.</p>



<p>Niestety na drugi dzień problem się powtórzył. Okazało się że mam tylko dwa indeksy z przedrostkiem &#8222;logstash-&#8221; i oba z 28-go grudnia. Śledztwo doprowadziło mnie do <a href="https://github.com/logstash-plugins/logstash-output-elasticsearch/issues/876">tego błędu zgłoszonego na Github</a>. Okazuje się, że domyślny format nazwy indeksu używany przez Logstash &#8211; &#8222;logstash-%{+YYYY.MM.dd}&#8221;, zawiera duże litery Y, co oznacza, że nazwa indeksu powinna zawierać rok bieżącej epoki, w przypadku naszego kręgu kulturowego jest  to ilość lat od błędnie wyznaczonej daty narodzenia Chrystusa. Okazuje się, że na niektórych platformach ten format nie działa, a ja miałem pecha używać takowej.</p>



<p>Rozwiązaniem jest zmiana formatu indeksu na taki zawierający małe litery y.</p>



<pre class="wp-block-code"><code>index => "logstash-%{+yyyy.MM.dd}"</code></pre>



<p>Także na zakończenie tego wpisu, życzę wam wszystkim żeby ludzkość jak najszybciej przeszła na UTC.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://szogun1987.pl/show/gdy-logstash-przestaje-dzialac-po-dwoch-tygodniach/680/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>ESP8266 &#8211; podłączenie przycisku</title>
		<link>https://szogun1987.pl/show/esp8266-podlaczenie-przycisku/600/</link>
					<comments>https://szogun1987.pl/show/esp8266-podlaczenie-przycisku/600/#comments</comments>
		
		<dc:creator><![CDATA[szogun1987]]></dc:creator>
		<pubDate>Sun, 29 Dec 2019 17:50:30 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Arduino]]></category>
		<category><![CDATA[esp8266]]></category>
		<category><![CDATA[Iot]]></category>
		<guid isPermaLink="false">https://szogun1987.pl/?p=600</guid>

					<description><![CDATA[W pierwszym artykule opisałem jak sterować diodą led wbudowaną w płytkę ESP01. Rzeczy w internecie to jednak nie tylko sterowanie, ale także obserwacja urządzenia i jego otoczenia. W tym artykule opiszę jak zbudować i zaprogramować układ w którym wbudowana dioda zapala się lub gaśnie przy naciśnięciu przycisku. Ponieważ istnieje pewna grupa ludzi czepiająca się definicji, &#8230; <p class="link-more"><a href="https://szogun1987.pl/show/esp8266-podlaczenie-przycisku/600/" class="more-link">Czytaj dalej<span class="screen-reader-text"> „ESP8266 &#8211; podłączenie przycisku”</span></a></p>]]></description>
										<content:encoded><![CDATA[
<p>W pierwszym artykule opisałem jak sterować diodą led  wbudowaną w płytkę ESP01. Rzeczy w internecie to jednak nie tylko sterowanie, ale także obserwacja urządzenia i  jego otoczenia. W tym artykule opiszę jak zbudować i zaprogramować układ w którym wbudowana dioda zapala się lub gaśnie przy naciśnięciu przycisku.</p>



<span id="more-600"></span>



<p>Ponieważ istnieje pewna grupa ludzi czepiająca się definicji, doprecyzuję, że jako przycisk w dalszej części artykułu rozumiem: przełącznik monostabilny &#8211; czyli taki który po naciśnięciu wraca do oryginalnego stanu: np. dzwonek do drzwi albo klawisz w klawiaturze. </p>



<p>Osobom którzy chcą nauczyć się czegoś więcej o przełącznikach i przyciskach polecam <a href="https://www.youtube.com/watch?v=2o5kHDp7CNc">ten klip z kanału RS Elektronika</a>. </p>



<p>O ile poprzedni projekt dało się zrealizować posiadając tylko układ i programator. Płytka nie posiada jednak wbudowanego przycisku, należy więc podłączyć zewnętrzny.  W mojej szafie znalazłem takie dwa:</p>



<div class="wp-block-image"><figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="768" src="https://szogun1987.azureedge.net/wp-content/esp-buttons-1024x768.jpg" alt="" class="wp-image-627"/></figure></div>



<p>Przycisk po lewej ma cztery nóżki. W stanie spoczynku prąd może przepływać pomiędzy nóżką 1 i 3 oraz między 2 i 4, po wciśnięciu prąd przepływa z dowolnej do dowolnej.</p>



<p>Przycisk jest tak naprawdę dwoma przyciskami powiązanymi mechanicznie. W stanie spoczynku prąd przepływa między nóżkami 1 i 3 oraz 2 i 4, po wciśnięciu prąd przepływa między przyciskami 3 i 5 oraz 4 i 6. Prąd nigdy nie przepływa między prawą i lewą kolumną. Na rynku dostępne są różne konstrukcje, dlatego w dalszej części założę, że przycisk jest podpięty tak aby przewodził prąd między wejściem i wyjściem gdy jest wciśnięty.</p>



<p>Ponieważ poprzedni projekt nie wymagał dodatkowych elementów, mogłem wykorzystać programator jako źródło zasilania, tym razem musiałem zdecydować się na koszyczek do baterii z lampki rowerowej, wykorzystałem trzy, połączone szeregowo, akumulatorki AA o napięciu 1,2V.</p>



<p>Do złożenia układu pomocna  też była płytka prototypowa (tzw. breadboard). Płytka taka posiada wiele dziurek pozwalających na podłączenie przewodów lub elementów elektronicznych. Dziurki te są połączone ze sobą tak jak przedstawiono na zdjęciu: dwie boczne kolumny są połączone pionowo, a pozostałe zaś poziomo. Skrajne kolumny są, zwyczajowo, wykorzystywane do podłączenia zasilania. W sprzedaży są dostępne kable z końcówkami pasującymi do takich płytek.</p>



<div class="wp-block-image"><figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="768" src="https://szogun1987.azureedge.net/wp-content/ESP-breadboard-1024x768.jpg" alt="" class="wp-image-637"/></figure></div>


]]></content:encoded>
					
					<wfw:commentRss>https://szogun1987.pl/show/esp8266-podlaczenie-przycisku/600/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>IoT z wykorzystaniem ESP8266</title>
		<link>https://szogun1987.pl/show/iot-z-wykorzystaniem-esp8266/560/</link>
					<comments>https://szogun1987.pl/show/iot-z-wykorzystaniem-esp8266/560/#comments</comments>
		
		<dc:creator><![CDATA[szogun1987]]></dc:creator>
		<pubDate>Sat, 26 Oct 2019 19:50:09 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Arduino]]></category>
		<category><![CDATA[esp8266]]></category>
		<category><![CDATA[Iot]]></category>
		<guid isPermaLink="false">https://szogun1987.pl/?p=560</guid>

					<description><![CDATA[IoT (ang. Internet of Things &#8211; Internet rzeczy ) jest koncepcją w której otaczające nas urządzenia będą wykorzystywać internet aby komunikować się między sobą, żeby lepiej spełniać swoje zadania. Każde urządzenie musi zawierać podłączony do internetu komputer z zestawem wejść i wyjść aby móc to urządzenie monitorować i nim sterować. Komputer ten musi być tani, &#8230; <p class="link-more"><a href="https://szogun1987.pl/show/iot-z-wykorzystaniem-esp8266/560/" class="more-link">Czytaj dalej<span class="screen-reader-text"> „IoT z wykorzystaniem ESP8266”</span></a></p>]]></description>
										<content:encoded><![CDATA[
<p>IoT  (ang. Internet of Things &#8211;  Internet rzeczy ) jest koncepcją w której otaczające nas urządzenia będą wykorzystywać internet aby komunikować się między sobą, żeby lepiej spełniać swoje zadania. </p>



<p>Każde urządzenie musi zawierać podłączony do internetu komputer z zestawem wejść i wyjść aby móc to urządzenie monitorować i nim sterować. Komputer ten musi być tani, mały, pobierać niewiele energii i być programowalny.</p>



<p>Raspberry Pi oraz Arduino spełniają te wymagania, jest jednak układ który spełnia je bardziej: ESP8266 &#8211;  chiński programowalny mikrokontroler wspierający TCP IP, WiFi, posiadający porty wejścia i wyjścia, niski pobór mocy. Jest on też naprawdę tani: od $0.50 w hurcie do  $1 w detalu. Dodatkowo układ ten jest częściowo kompatybilny z Arduino dzięki czemu narzędzia stworzone dla tej popularnej płytki.</p>



<span id="more-560"></span>



<p>Sam chip nie nadaje się do zastosowań amatorskich ze względu na obudowę wymagającą montażu powieszchownego (SMD). Na szczęście są firmy sprzedające ten moduł przylutowany do płytki zawierającej prymitywną antenę wifi oraz bardziej przyjazne złącza. Przykładami takich płytek są NodeMCU oraz ESP01, Płytki te można w Polsce kupić między 10 a 20zł, w Chinach poniżej $3.  Ja zdecydowałem się na zakup ESP01.</p>



<p>Płytka posiada 8 złączy:</p>



<div class="wp-block-image"><figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="436" height="544" src="https://szogun1987.azureedge.net/wp-content/ESP-porty.jpg" alt="" class="wp-image-572"/></figure></div>



<ul class="wp-block-list"><li>3V3 &#8211; zasilanie zalecane napięcie to 3.3 Volt, zgodnie <a href="https://forum.makehackvoid.com/t/esp8266-operating-voltage-range-and-sleep-current/286">z tym wątkiem</a> urządzenie działa stabilnie w zakresie 2.5-3.8V</li><li>GND &#8211; masa</li><li>Rx,Tx &#8211; Wykorzystywane do transmisji szeregowej, mogą też być przełączone w tryb &#8222;zwykłych&#8221; wejść/wyjść</li><li>IO0, IO2 &#8211; piny wejścia/wyjścia</li><li>RST &#8211; podanie napięcia na ten pin resetuje układ</li><li>EN(CH_PD) &#8211; podanie napięcia na ten pin i reset pozwala przejść w tryb programowania.</li></ul>



<h2 class="wp-block-heading">Przygotowanie stanowiska pracy</h2>



<p>Programy uruchamiane na ESP8266 można pisać w języku LUA albo w C++ w Arduino IDE. Ja wybrałem tą drugą opcję. Arduino IDE jest do pobrania na stronie:  <a href="https://www.arduino.cc/en/Main/Software">https://www.arduino.cc/en/Main/Software</a>. </p>



<p class="has-background has-very-light-gray-background-color">Arduino IDE instaluje sterowniki urządzeń USB, co wymaga uprawnień administratora.</p>



<p>Domyślnie Arduino IDE nie wspiera ESP, aby wspierało należy doinstalować &#8222;zarządcę płytków&#8221;. W oknie Arduino IDE należy wybrać File &gt; Preferences i w polu &#8222;Additional board managers&#8221; wkleić:</p>



<pre class="wp-block-code"><code>https:&#47;&#47;arduino.esp8266.com/stable/package_esp8266com_index.json</code></pre>



<div class="wp-block-image"><figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="1024" height="434" src="https://szogun1987.azureedge.net/wp-content/ESP-board-manager-1024x434.png" alt="" class="wp-image-564"/></figure></div>



<p>Po restarcie Arduino IDE należy kliknąć &#8222;Tools &gt; Board: &#8222;XXXXXXXXXXXXXX&#8221; &gt; Boards Manager &#8230;&#8221;, w polu tekstowym wpisać &#8222;ESP8266&#8221; i kliknąć install na elemencie: &#8222;esp8266 by ESP8266 Community&#8221;.</p>



<div class="wp-block-image"><figure class="aligncenter size-large"><img loading="lazy" decoding="async" width="774" height="1024" src="https://szogun1987.azureedge.net/wp-content/ESP-board-manager-02-774x1024.png" alt="" class="wp-image-565"/></figure></div>



<p>Na koniec należy kliknąć &#8222;Tools &gt; Board: XXXXXXXX &gt; Generic ESP8266 Module&#8221;.</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="675" height="594" src="https://szogun1987.azureedge.net/wp-content/ESP-board-manager-03.png" alt="" class="wp-image-566"/></figure>


]]></content:encoded>
					
					<wfw:commentRss>https://szogun1987.pl/show/iot-z-wykorzystaniem-esp8266/560/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>Niezmienny obiekt i budowniczy</title>
		<link>https://szogun1987.pl/show/niezmienny-obiekt-i-budowniczy/544/</link>
					<comments>https://szogun1987.pl/show/niezmienny-obiekt-i-budowniczy/544/#comments</comments>
		
		<dc:creator><![CDATA[szogun1987]]></dc:creator>
		<pubDate>Mon, 16 Sep 2019 20:02:47 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Wzorce projektowe]]></category>
		<guid isPermaLink="false">https://szogun1987.pl/?p=544</guid>

					<description><![CDATA[Niespodziewana zmiana stanu obiektu jest jedną z częstszych przyczyn błędów programistów.]]></description>
										<content:encoded><![CDATA[
<p>Niespodziewana zmiana stanu obiektu jest jedną z częstszych przyczyn błędów programistów. Dwoma, moim zdaniem, najczęstszymi przypadkami, w których zmiana może być zaskoczeniem są:</p>



<ul class="wp-block-list"><li>Zmiana stanu obiektu gdy jest on przekazany do metody, zwłaszcza funkcji, której nazwa sugeruje że jest to bezpieczne</li><li>Zmiana stanu w wyniku współbieżnego dostępu do jednego obiektu</li></ul>



<span id="more-544"></span>



<p>Z pierwszym przypadkiem można sobie poradzić przez bardzo restrykcyjne pilnowanie innych członków zespołu na przeglądach kodu, to rozwiązanie zawodzi gdy korzystamy z zewnętrznych bibliotek.</p>



<p>Drugi problem nie występuje do puki nie współdzielimy obiektów między wątkami. Z taką sytuacją mamy do czynienia na początku rozwoju każdej aplikacji. Wystarczy jednak wprowadzić dodatkowy wątek (np. przez użycie niektórych metod asynchronicznych), albo dodać statyczne pole do kontrolera aby się na niego narazić.</p>



<p>Rozwiązaniem obu problemów są obiekty niezmienne, czyli takie, czyli takie których pola nie ulegają zmianie po utworzeniu. W C# i Javie aby stworzyć klasę, której instancje będą niezmienne należy zadeklarować wszystkie pola jako prywatne, ustawić je w konstruktorze i nie udostępnić żadnej metody je modyfikujące.</p>



<pre class="wp-block-code"><code>public class Address 
{
	private readonly string addressLine1;
	private readonly string addressLine2;
	private readonly string zipCode;
	private readonly string city;
	private readonly string stateArea;
	private readonly string country;

	public Address(string addressLine1, string addressLine2, string zipCode, string city, string stateArea, string country)
	{
		 this.addressLine1 = addressLine1;
		 this.addressLine2 = addressLine2;
		 this.zipCode = zipCode;
		 this.city = city;
		 this.stateArea = stateArea;
		 this.country = country;
	}

	public string AddressLine1 { get { return addressLine1; } }
	public string AddressLine2 { get { return addressLine2; } }
	public string ZipCode { get { return zipCode; } }
	public string City { get { return city; } }
	public string StateArea { get { return stateArea; } }
	public string Country { get { return country; } }
}</code></pre>



<h2 class="wp-block-heading">Problemy językowe</h2>



<p>Obiekty niezmienne są jednak słabo wspierane przez C# i Javę.</p>



<p>Pierwszym problemem są pola opcjonalne, domyślnie konstruktor musi ustawić wszystkie, więc albo użytkownik takiego obiektu musi przekazać wartości domyślne do takiego obiektu.</p>



<p>Jeżeli obiekt ma wiele pól to konstruktor staje się długi, a pomyłki związane z przekazaniem wartości do złego pola trudno zauważalne. Poniższy kod zawiera błąd, jednak wcale nie wygląda podejrzanie:</p>



<pre class="wp-block-code"><code>var address = new Address (
	"Konwaliowa 31/20",
	"20036",
	"Lublin",
	"",
	"",
	"");</code></pre>



<p>Jakimś rozwiązaniem jest zastosowanie przeciążeń konstruktora i wartości domyślnych dla jego parametrów, to rozwiązanie sprawdza się gdy klasa ma do 3-4 opcjonalnych pól, przy większej ilości szybko prowadzi do eksplozji kombinatorycznej ilości konstruktorów.</p>



<p>Problem staje się jeszcze bardziej dotkliwy gdy pojawia się potrzeba &#8222;zmodyfikowania&#8221; takiego obiektu, ponieważ obiektu nie da się zmienić, należy utworzyć nowy obiekt i przekazać do niego zarówno wartości zmienionych pól jak i tych, które zostają bez zmian.</p>



<pre class="wp-block-code"><code>var templateAddress = new Address(
	"Konwaliowa 31/20",
	"",
	"20036",
	"Lublin",
	"Lubelskie",
	"Polska");

var modifedAddress = new Address(
	"Konwaliowa 31/21",
	templateAddress.AddressLine2,
	templateAddress.ZipCode,
	templateAddress.City,
	templateAddress.StateArea,
	templateAddress.Country);</code></pre>


]]></content:encoded>
					
					<wfw:commentRss>https://szogun1987.pl/show/niezmienny-obiekt-i-budowniczy/544/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>Immutable Map &#8211; modyfikowanie wielu pól</title>
		<link>https://szogun1987.pl/show/immutable-map-modyfikowania-wielu-pol/529/</link>
					<comments>https://szogun1987.pl/show/immutable-map-modyfikowania-wielu-pol/529/#respond</comments>
		
		<dc:creator><![CDATA[szogun1987]]></dc:creator>
		<pubDate>Mon, 29 Jul 2019 17:46:23 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Browser side]]></category>
		<category><![CDATA[immutable]]></category>
		<category><![CDATA[react-js]]></category>
		<category><![CDATA[redux]]></category>
		<guid isPermaLink="false">https://szogun1987.pl/?p=529</guid>

					<description><![CDATA[Klasa Map z pakietu immutable jest obecnie popularnie wybierana jako kontener dla globalnego stanu w aplikacjach wykorzystujących redux. Zauważyłem też że powszechną, ale błędną, praktyką jest modyfikowanie wielu pól przy pomocy łańcucha poleceń set. const newState = oldState .set('field1', 'value1') .set('field2', 'value2') .set('field3', 'value3'); Podejście to sprawia, że za każdym wywołaniem metody set tworzona jest &#8230; <p class="link-more"><a href="https://szogun1987.pl/show/immutable-map-modyfikowania-wielu-pol/529/" class="more-link">Czytaj dalej<span class="screen-reader-text"> „Immutable Map &#8211; modyfikowanie wielu pól”</span></a></p>]]></description>
										<content:encoded><![CDATA[
<p>Klasa Map z pakietu <a href="https://www.npmjs.com/package/immutable">immutable</a> jest obecnie popularnie wybierana jako kontener  dla globalnego stanu w aplikacjach wykorzystujących <a href="https://www.npmjs.com/package/redux">redux</a>. </p>



<p>Zauważyłem też że powszechną, ale błędną, praktyką jest modyfikowanie wielu pól przy pomocy łańcucha poleceń set.</p>



<pre class="prettyprint">const newState = oldState
    .set('field1', 'value1')
    .set('field2', 'value2')
    .set('field3', 'value3');
</pre>



<span id="more-529"></span>



<p>Podejście to sprawia, że za każdym wywołaniem metody set tworzona jest nowa, na szczęście płytka, kopia mapy ze zmienionym jednym polem.</p>



<p>Poprawę wydajności można uzyskać wykorzystując metodę <a href="https://immutable-js.github.io/immutable-js/docs/#/Map/withMutations">withMutations</a>.</p>



<pre class="prettyprint">const newState = oldState.withMutations(map =&gt; {
    map
    	.set('field1', 'value1')
        .set('field2', 'value2')
        .set('field3', 'value3');
    });
</pre>



<h3 class="wp-block-heading">Mierz wyniki</h3>



<p>Użycie tej metody nie gwarantuje jednak poprawy wydajności. Poniższy test zawiera 2 skraje przypadki użycia obu podejść:</p>



<pre class="prettyprint">const Map = require('immutable').Map;
const {
  performance
} = require('perf_hooks');

function test(tested) {
	const before = performance.now();
	for (let i = 0; i < 1000; i++) {
		tested();
	}
	return performance.now() - before;
}

let map = new Map();
const mapSet1 = test(function() {
	map.set("field1", "value");
});

map = new Map();
const mapWithMutations1 = test(function() {
	map.withMutations(map2 => {
		map2.set("field1", "value");
	})
});

map = new Map();
const mapSet2 = test(function() {
	map
		.set("field1", "value1")
		.set("field2", "value2")
		.set("field3", "value3")
		.set("field4", "value4")
		.set("field5", "value5")
		.set("field6", "value6")
		.set("field7", "value7")
		.set("field8", "value8")
		.set("field9", "value9");
});

map = new Map();
const mapWithMutations2 = test(function() {
	map.withMutations(map2 => {
		map2.set("field1", "value1");
		map2.set("field2", "value2");
		map2.set("field3", "value3");
		map2.set("field4", "value4");
		map2.set("field5", "value5");
		map2.set("field6", "value6");
		map2.set("field7", "value7");
		map2.set("field8", "value8");
		map2.set("field9", "value9");
	})
});

console.log({
	mapSet1,
	mapWithMutations1,
	mapSet2,
	mapWithMutations2
});
</pre>



<p>Na mojej maszynie uzyskałem następujący wynik:</p>



<pre class="prettyprint">{
  mapSet1: 0.9362990260124207,
  mapWithMutations1: 1.4729009866714478,
  mapSet2: 23.789600014686584,
  mapWithMutations2: 13.4621000289917
}
</pre>
]]></content:encoded>
					
					<wfw:commentRss>https://szogun1987.pl/show/immutable-map-modyfikowania-wielu-pol/529/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Budżet domowy a delegacja w USA &#8211; dwa problemy</title>
		<link>https://szogun1987.pl/show/budzet-domowy-a-delegacja-w-usa-dwa-problemy/520/</link>
					<comments>https://szogun1987.pl/show/budzet-domowy-a-delegacja-w-usa-dwa-problemy/520/#comments</comments>
		
		<dc:creator><![CDATA[szogun1987]]></dc:creator>
		<pubDate>Tue, 16 Jul 2019 11:48:39 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[budżet domowy]]></category>
		<guid isPermaLink="false">https://szogun1987.pl/?p=520</guid>

					<description><![CDATA[Dzisiaj krótki wpis z dwiema poradami dla ludzi prowadzących budżet osobisty domowy, którym zdaża się dłuższy wyjazd służbowy do Stanów. Sales Tax W Stanach ceny na półkach sklepowych nie zawierają podatku od sprzedaży (ST &#8211; Sales Tax). Podatek ten jest nawet wyliczony w podsumowaniu paragonu. Ludzie żyjący w Stanach wrzucają ten podatek w kategorię &#8222;Podatki&#8221;. &#8230; <p class="link-more"><a href="https://szogun1987.pl/show/budzet-domowy-a-delegacja-w-usa-dwa-problemy/520/" class="more-link">Czytaj dalej<span class="screen-reader-text"> „Budżet domowy a delegacja w USA &#8211; dwa problemy”</span></a></p>]]></description>
										<content:encoded><![CDATA[
<p>Dzisiaj krótki wpis z dwiema poradami dla ludzi prowadzących budżet osobisty domowy, którym zdaża się dłuższy wyjazd służbowy do Stanów.</p>



<span id="more-520"></span>



<h2 class="wp-block-heading">Sales Tax</h2>



<p>W Stanach ceny na półkach sklepowych nie zawierają podatku od sprzedaży (ST &#8211; Sales Tax). Podatek ten jest nawet wyliczony w podsumowaniu paragonu.</p>



<p>Ludzie żyjący w Stanach wrzucają ten podatek w kategorię &#8222;Podatki&#8221;. Z punktu widzenia konsumenta podatek ten jest podobny do VAT.  Postanowiłem więc, za poradą Michała Szafrańskiego, doliczać go do poszczególnych kategorii.</p>



<p>Operacja ta robi się złożona, gdy kupujemy produkty różnych kategorii na raz. Część sklepów nie podaje nawet stawki ST przy produkcie, co sprawia że nawet żmudne, ręczne liczenie podatku jest niemożliwe. Dlatego sumę podatku rozdzielałem proporcjonalnie pomiędzy kategorie.</p>



<h2 class="wp-block-heading">Wahania kursów walut</h2>



<p>Podczas swojego pobytu, na potrzeby budżetu, stosowałem sztywny kurs dolara ustalony na przełomie miesięcy. Dzięki temu było mi łatwo utrzymać auto-walidację  budżetu (cecha sprawiająca, że każdy zgubiony zarobek, bądź wydatek jest widoczny w budżecie).</p>



<p>Problem pojawiał się na koniec miesięca albo gdy musiałem kupić dolary za złotówki. Dodawałem wtedy jedną operację, która bilansowała mój stan posiadania z bierzącym kursem dolara.</p>



<h3 class="wp-block-heading">Złotówkowe karty kredytowe i płatnicze</h3>



<p>Czytając artykuły o finansach można znaleźć wiele powodów żeby nie używać złotówkowych kart za granicą. Nie znalazłem jednak informacji, że kwota zablokowana na karcie jest różna od tej, która zostaje zaksięgowana. Psuje to auto-walidację budżetu, albo zmusza nas do spisywania wydatków po kilku dniach od ich dokonania.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://szogun1987.pl/show/budzet-domowy-a-delegacja-w-usa-dwa-problemy/520/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
	</channel>
</rss>
