Scott Tiger Tech Blog

Blog technologiczny firmy Scott Tiger S.A.

Elixir

Autor: Piotr Karpiuk o wtorek 3. Marzec 2020

Otwartoźródłowy język programowania Elixir można, mocno upraszczając, potraktować jak zestaw makr tworzących lukier syntaktyczny nad składnią Erlanga (uwaga: chodzi o makra w stylu Lispa działające na drzewie składni AST, a nie makra tekstowe jak w C). Program Elixira może korzystać z bibliotek Erlanga i jest kompilowany do bajtkodu wykonywanego na maszynie wirtualnej BEAM Erlanga. Wszystko co da się zrobić w Erlangu, można wykonać w Eliksirze i na odwrót. W pewnym sensie Elixir ma się do Erlanga tak jak Kotlin/Scala/Groovy/Clojure do Javy/JVM czy F# do C#/.NET.

Elixir czyni programowanie w Erlangu znacznie bardziej przystępnym dla przeciętnego programisty. W związku z tym pytanie dlaczego ktoś miałby chcieć programować w Eliksirze na dobrą sprawę sprowadza się do pytania dlaczego w dzisiejszych czasach ktoś mógłby chcieć używać technologii z lat 80-tych ubiegłego tysiąclecia, takiej jak Erlang.

Cóż, okazuje się że czasy Internetu, serwisów społecznościowych i chmur obliczeniowych bardzo sprzyjają rozpowszechnieniu Erlanga. W czasach gdy ten język powstawał, w powszechnym użyciu królowały aplikacje desktopowe z interfejsem użytkownika, takie jak MS Excel czy MS Word. Erlang jako język programowania współbieżnego będący w stanie elegancko wykorzystać wiele rdzeni procesora i klastry maszyn miał zastosowanie początkowo w zasadzie tylko w telekomunikacji (firma Ericsson). Dziś zapotrzebowanie na stabilne, wydajne i skalowalne usługi serwerowe będące w stanie obsługiwać miliony połączeń klienckich jednocześnie jest już powszechne. Stąd też znajdziemy Erlanga w serwerach WhatsAppa, rozproszonej bazie danych Riak, usłudze chmurowej Heroku, systemie automatyzacji Chef, kolejce komunikatów RabbitMQ czy w systemach finansowych i serwerach gier sieciowych, ale też w aplikacjach biurowych czy systemach wbudowanych.

Spełnianie wyśrubowanych wymogów standardów telekomunikacyjnych i długi czas dojrzewania technologii przekładają się na cechy funkcjonalne bardzo pożądane na dzisiejszym rynku:

  • Krótki czas reakcji niezależnie od liczby podłączonych klientów. Na jednej maszynie wirtualnej Erlanga działa zwykle jeden proces OS, w jego ramach zaś kilka wątków OS i potencjalnie nawet miliony tzw. procesów Erlanga (zwanych dalej eprocesami, można je przyrównać do gorutyn w języku Go). Eprocesy nie współdzielą pamięci RAM i porozumiewają się między sobą za pomocą asynchronicznych komunikatów. Dzięki temu sprzątanie pamięci po takich obiektach nie jest czasochłonne i nie wymaga wstrzymywania całego systemu (jeden rdzeń CPU może błyskawicznie przeprowadzić operację czyszczenia pamięci gdy tymczasem pozostałe są zajęte standardowym przetwarzaniem). Operacje I/O są wewnętrznie delegowane do osobnych wątków lub – jeżeli jest dostępna – do odpowiedniej usługi w systemie operacyjnym; w rezultacie żaden eproces oczekujący na zakończenie operacji I/O nie blokuje wykonania innych eprocesów.
  • Błąd w obsłudze jednego połączenia ma minimalny wpływ na cały system. Znowu, pomaga w tym architektura całkowitej niezależności eprocesów od siebie.
  • Aktualizacja w czasie rzeczywistym. Z założenia taki system nie powinien przestawać działać nigdy, nawet aktualizacja oprogramowania czy rozszerzanie klastra o dodatkowe maszyny nie powinna zrywać istniejących połączeń klienckich a tym bardziej wymuszać restart systemu
  • Skalowalność i rozproszenie. Ponieważ jedynym sposobem na komunikację międzyprocesową są komunikaty asynchroniczne, nie istnieją złożone mechanizmy takie jak blokady, czy semafory, co upraszcza programowanie. Co więcej, komunikacja między eprocesami zachodzi tak samo niezależnie od tego, czy eprocesy działają na tej samej instancji maszyny wirtualnej BEAM, czy na dwóch różnych maszynach. Bardzo ułatwia to rozpraszanie systemu w klastrze maszyn.

Erlang to nie tylko język programowania, ale rozbudowana platforma programistyczna, w skład której wchodzą

  • Język,
  • Maszyna wirtualna,
  • Framework OTP (Open Telecom Platform) – udostępnia abstrakcje na typowe zadania takie jak wzorce współbieżności i rozproszenia, wykrywanie i usuwanie błędów w systemach współbieżnych, pakowanie kodu do bibliotek, wdrażanie systemów czy aktualizacja w czasie rzeczywistym
  • Narzędzia, np. do kompilowania kodu, tworzenia paczek do wdrożeń, obsługi interaktywnej powłoki itp.

Zarówno Erlang, jak i Elixir są językami cały czas wspieranymi a kod źródłowy jest dostępny na GitHubie. Procesem produkcji Erlanga nadal zarządza firma Ericsson i wypuszcza regularnie nową wersję języka co roku.

Wady

Programy Erlanga są wykonywane na maszynie wirtualnej BEAM, przez co nie są w stanie osiągnąć prędkości języków kompilowanych maszynowo, takich jak C/C++. Celem platformy nie jest jednak wyciśnięcie jak największej liczby żądań na sekundę, ale utrzymanie wydajności na przewidywanym poziomie (np. system nie spowalnia wyraźnie po włączeniu się odśmiecania pamięci). Erlang idealnie nadaje się do tworzenia systemów odpornych na błędy, które mogą działać bardzo długo bez żadnych przestojów. Jest to zarazem duże wyzwanie i aspekt, na którym skupia się platforma Erlanga.

Kolejną wadą jest ilość bibliotek, których jest znacząco mniej niż w wielu współczesnych językach programowania. W GitHubie jest blisko 5 mln projektów Javy, ale ledwie 20 tys. projektów Erlanga i ok. 40 tys. Eliksira. Powoduje to, że możesz spędzić więcej czasu nad czymś, co w przypadku innych języków trwa kilka minut. Można się spotkać z żartobliwym powiedzeniem, że Erlang czyni rzeczy trudne prostymi i komplikuje rzeczy proste.

Literatura

Elixir w akcji, Saša Jurić, 2020

Napisany w Języki programowania | Brak komentarzy »

Logstash

Autor: Piotr Karpiuk o piątek 20. Grudzień 2019

Wprowadzenie

Logstash to narzędzie będące swoistą stacją przekaźnikową i rozgałęziaczem do przetwarzania strumieni danych. Typowy potok przetwarzania (ang. pipeline) Logstasha łączy wiele strumieni wejściowych w jeden strumień wyjściowy, przy okazji uzupełniając przepływające rekordy danych o nowe informacje. Strumień danych wejściowych jest tu rozumiany bardzo szeroko i obejmuje takie źródła jak pliki dzienników (np. Apache, syslog), brokery komunikatów, usługi HTTP, skrzynka emailowa, wyniki cyklicznie uruchamianych poleceń shella lub zapytań do baz danych, kanały RSS, a nawet strumień postów z Twittera. Typowym wyjściem jest NoSQLowa baza danych Elasticsearch, ale możliwych dodatkowych miejsc docelowych jest wiele, np. możemy sobie zażyczyć aby wszystkie dane dodatkowo zrzucać do pliku lub przekazywać na wejście do jakiegoś skryptu Pythona, wysyłać do aplikacji Graphite, StatsD, itd.

Typowym przykładem transformacji danych dokonywanej przez Logstash jest konwersja rekordu dziennika Apache:

83.149.9.216 - - [04/Jan/2015:05:13:42 +0000] "GET /images/kibana-search.png HTTP/1.1" 200 203023 "/logstash-monitorama-2013/" \
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.77 Safari/537.36"

na format JSON, z jednoczesnym ustaleniem nazwy domenowej dla adresu IP i przybliżonej lokalizacji geograficznej adresu IP:

{
        "request" => "/images/kibana-search.png",
          "agent" => "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.77 Safari/537.36",
         "offset" => 325,
           "auth" => "-",
          "ident" => "-",
           "verb" => "GET",
         "source" => "/path/to/file/logstash-tutorial.log",
        "message" => "83.149.9.216 - - [04/Jan/2015:05:13:42 +0000] GET /images/kibana-search.png HTTP/1.1 ...",
       "referrer" => "/logstash-monitorama-2013/",
     "@timestamp" => 2017-11-09T02:51:12.416Z,
       "response" => "200",
          "bytes" => "203023",
       "clientip" => "83.149.9.216",
     "client_dns" => "gprs-client-83.149.9.216.misp.ru",
          "geoip" => {
              "timezone" => "Europe/Moscow",
                    "ip" => "83.149.9.216",
              "latitude" => 55.7485,
        "continent_code" => "EU",
             "city_name" => "Moscow",
          "country_name" => "Russia",
         "country_code2" => "RU",
         "country_code3" => "RU",
           "region_name" => "Moscow",
              "location" => {
                   "lon" => 37.6184,
                   "lat" => 55.7485
              },
           "postal_code" => "101194",
           "region_code" => "MOW",
             "longitude" => 37.6184
       },
       "@version" => "1",
           "host" => "My-MacBook-Pro.local",
    "httpversion" => "1.1",
      "timestamp" => "04/Jan/2015:05:13:42 +0000"
}
    

Gwoli ścisłości, pod wejście i wyjście Logstasha możemy podpiąć tzw. kodeki które dekodują/kodują dane do określonego formatu (np. protobuf, JSON, itp.).

Czytaj więcej »

Tags:
Napisany w ELK | Brak komentarzy »

Amazon Sumerian

Autor: Piotr Karpiuk o poniedziałek 14. Styczeń 2019

Amazon Sumerian to usługa chmury AWS pozwalająca tworzyć wirtualne światy 3D (w tym VR: Oculus Go, Oculus Rift, HTC Vive, HTC Vive Pro, Google Daydream, and Lenovo Mirage) w przeglądarce i na urządzenia mobilne. Oprócz własnoręcznie zaprojektowanych przedmiotów można w wygenerowanym świecie umieścić wirtualny awatar człowieka (tzw. host, kilkanaście do wyboru spośród kobiet i mężczyzn, białych, czarnoskórych itp.) i programować jego zachowanie oraz wypowiedzi.

Przykład takiej aplikacji mamy po prawej stronie. Otworzy się ona w nowoczesnej przeglądarce Chrome lub Firefox, przy czym tylko Firefox na Windows obsługuje WebVR, w pozostałych przeglądarkach dostaniemy ostrzeżenie „Your browser is not fully compatible with Amazon Sumerian” które można zignorować jeśli nie korzystamy z VR.

Kobieta czyta odpowiednio otagowany gestami tekst:

<speak>I can gesture while I speak. Some of my available gestures are:
<mark name="gesture:generic_a"/>generic a<break time="1500ms"/>,
<mark name="gesture:generic_b"/>generic b<break time="1500ms"/>,
<mark name="gesture:generic_c"/>generic c<break time="1500ms"/>,
<mark name="gesture:defense"/>defense<break time="2500ms"/>,
<mark name="gesture:wave"/>wave<break time="1500ms"/>,
<mark name="gesture:you"/>you<break time="2500ms"/>,
<mark name="gesture:many"/>many<break time="2500ms"/>,
<mark name="gesture:aggressive"/>aggressive<break time="1500ms"/>,
<mark name="gesture:in"/>in<break time="2500ms"/>,
<mark name="gesture:big"/>big<break time="4000ms"/>,
<mark name="gesture:one"/>one<break time="2500ms"/>,
<mark name="gesture:movement"/>movement<break time="3500ms"/>,
<mark name="gesture:heart"/>heart<break time="2000ms"/>, and
<mark name="gesture:self"/>self.<break time="1500ms"/></speak>

Host zawsze patrzy na rozmówcę, scenę można obracać (wciśnięty prawy klawisz myszki podczas ruszania, albo lewy i SHIFT).



Kolejna aplikacja (proszę kliknąć zdjęcie niżej) to przykład chatbota do zamawiania hotelu lub wypożyczania samochodu. Trzeba zgodzić się na udostępnienie swojego mikrofonu. Żeby mówić przyciskamy SPACJĘ i zwalniamy klawisz gdy skończymy mówić.

Rozmowę zaczynamy tak:

Zamawianie hotelu:

  "Book a hotel"
  "I want to make hotel reservations"
  "Book a {Nights} stay in {Location}"

Zamawianie samochodu:

  "Book a car"
  "Reserve a car"
  "Make a car reservation"

Bot jest realizowany przez usługę AWS Amazon Lex. Z kolei zamiana tekstu na mowę to usługa Amazon Polly.

Tags: , , ,
Napisany w AWS, Cloud computing, HTML5, Nowoczesne przeglądarki WWW, Wizualizacja, WWW | Brak komentarzy »

Software Galaxies

Autor: Piotr Karpiuk o poniedziałek 17. Grudzień 2018

Interaktywna wizualizacja pakietów języka Go i powiązań między nimi, przypominająca podróż przez galaktykę. Bardzo dobry przykład jak za pomocą WebGL można osiągnąć w przeglądarce przyzwoitą wydajność. Poruszamy się za pomocą klawiatury (klawisze W,Q,E,S,D,A, strzałki, Shift) – miłośnicy gier na pewno szybko się odnajdą. Zdecydowanie polecam pełny ekran. Dostępne są też wizualizacje repozytoriów pakietów innych języków programowania.

Napisany w HTML5, Nowoczesne przeglądarki WWW, Wizualizacja | Brak komentarzy »

Wizualizacja grafów

Autor: Piotr Karpiuk o piątek 30. Listopad 2018

Pojawia się coraz więcej bibliotek JavaScriptu do wizualizacji grafów. Moją szczególną uwagę przykuły dwie z nich: 3d-force-graph (patrz interaktywna ilustracja obok, ewentualnie na pełnym ekranie) oraz force-graph renderujące grafy odpowiednio w 3D i 2D. W przypadku 3D wykorzystywane jest wspomaganie sprzętowe (GPU) co wspaniale przekłada się na wydajność i pozytywne wrażenia użytkownika.

Listę innych wartych spojrzenia bibliotek znajdziemy na stronie github.com/anvaka/graph-drawing-libraries. Spodobała mi się też biblioteka viz-js (javascriptowa wersja kultowego GraphViz firmy AT&T Labs), a także WebCola.

Napisany w datavis, HTML5, Nowoczesne przeglądarki WWW, Wizualizacja, WWW | Brak komentarzy »