środa, 4 października 2017

Październik - czas na Hacktoberfest!

W październiku mamy różne oktoberfest'y. Jest piwny - który co prawda zaczyna się we wrześniu ale jest także programistyczny!


Ale o co chodzi?

"Impreza" Hactkoberfest ma być celebracją projektów open source. Mają one bowiem bardzo duże znaczenie w naszej codziennej pracy. A jeśli myślisz że jest inaczej to przejrzyj swoje narzędzia, edytory,  używane biblioteki w projektach i zobacz ile z nich jest rozwijana jako OSS?! Więc w tym miesiącu październiku jest czas kiedy zakasamy rękawy, zaczynamy działać i pomagamy w ich rozwoju.

Co mi to da?

A naklejeczkę albo koszuleczkę 😜 To z rzeczy materialnych. Ja wiem co już mi dała po dosłownie 3 dniach! Wyliczając:

  1. Rozwój - programistyczny oraz miękki poprzez kooperację z innymi ludźmi
  2. Możliwość poznania nowych ludzi (póki co wirtualnie)
  3. Ogromną satysfakcję kiedy ktoś rzuci kilka ciepłych słów za to co zrobiłeś. Taki bonus poklepus.

I jeszcze jedna myśl, idąc ciemnym rankiem do pracy, mi przyszła do głowy! Taki udział w projekcie OSS może na nowo dać ci kopa do pracy. Jeśli z jakiś względów obecny projekt przy którym pracujesz i dostarcza $$$ nie daje Ci już satysfakcji, za dużo legacy code, znów robisz te same rzeczy ale nie chcesz lub nie możesz go od tak porzucić czy zmienić pracy to właśnie kontrybuowanie może być taką odskocznią, która doda Ci skrzydeł. Ja poczułem się jakbym znalazł się w nowej pracy. Poznałem ludzi, którzy opiekują się repozytorium, zapoznałem się z projektem, jego założeniami, obecnym stanem i tym co jest do zrobienia. Dokładnie te same czynności, które wykonujesz w pierwszych dniach, tygodniach nowej pracy. No może bez zapoznawczej kawki i pogaduszek 😉

Od czego zacząć?


  1. Zapoznaj się z Hacktoberfest
  2. Znajdź projekt, zadania, problemy które chciałbyś pomóc rozwiązać. Wszystkie zadania, które biorą udział w Hacktoberfest posiadają taką właśnie etykietę. Podrzucam URL, na którym zobaczysz całą listę otwartych zadań: GitHub Hacktoberfest
  3. Nie bój się pytać! Póki co nie spotkałem się z nonszalancją i gburami. Ludzie pomagają sobie nawzajem. W końcu mają w tym jakiś cel!
Jeśli nadal nie czujesz idei, celu w tym wszystkim to polecam prezentację Adama Sitnika "My awesome journey with Open Source". Dla mnie była ona katalizatorem do działania. Bardzo dobrym wprowadzniem w świat OSS. 

Tyle ode mnie. A teraz czas zakasać rękawy i do roboty!

poniedziałek, 25 września 2017

4Developers Gdańsk

18 września uczestniczyłem w konferencji 4Developers w Gdańsku nie tylko jako uczestnik ale również jako prelegent! O tak! Pierwszy wykon na konfie za mną 👏 Więc zdam Wam krótką relację z obu stron.

Dodam tylko, że edycja w Gdańsku jest jedną z wielu organizowanych w różnych miastach w Polsce. Można powiedzieć, że jest "lokalna". W najbliższym czasie będzie edycja w Łodzi

Miejsce, sale czyli infrastruktura


Hotel Focus, w którym się odbywała był wystarczający aby pomieścić zgłoszonych uczestników w salach aczkolwiek w przerwach było tłoczno na holu oraz sali z cateringiem gdzie dodatkowo miejsce zabrały firmy, które się wystawiały. Coś nie do końca grało z klimatyzacją. Na niektórych salach duchota na innych sympatycznie. Typowe problemy i wiadomo każdemu się nie dogodzi w tym temacie. Na plus sala restauracyjna gdzie był lunch. Dobre jedzenie, jeszcze lepsze desery!

Prelekcje


Konferencja była podzielona na cztery ścieżki tematyczne: C++, Architektura, .Net, SoftSkills. Co mnie zaintrygowało to ta ścieżka C++ - dawno nie widziałem konferencji, która by ten temat poruszała. I to jak dla mnie duży plus bo mamy aktualnie masę ścieżek związanych z  JS&Frontend - wiadomo temat ssie!
W związku z tym, że występowałem pod koniec dnia nie przeznaczyłem całego czasu na prelekcje innych ale pojawiłem się na:
ETW  w słuzbie programisty .NET Konrad Kosa
You are using the wrong database! Szymon Warda
Orchestrate your choreography! Daniel Pokusa
Cryptocurrencies, blockchains and things Adam Hartka

Wszystkie prezentację pod kątem merytorycznym oceniam bardzo dobrze. Jeśli chodzi o wykonanie to typowe rzeczy. Konradowi trochę demo się wywaliło (ach ten sprzęt). Szymon jak to ma w zwyczaju szybko leciał z tematem. Daniel Pokusa bardzo dobrze się zaprezentował! Prezentacja Adama Hartka o blockchain trochę nie miała tempa. Temat trudny do przekazania i dodatkowo odbywała się w j. angielskiem, z którym bardzo dobrze sobie radził ale jednak zmęczenie dawało się we znaki.

Czas na mnie

O 15:00 zrobiłem sobie przerwę aby przygotować się do swojej prelekcji, odprężyć się, przewietrzyć. I tak jakbym poszedł na którąś ścieżkę to bym się nie mógł skupić. Bardzo przeżywałem to wystąpienie już na kilka dni przed. Ale jak się okazało z dużej chmury mały deszcz. A to dlatego, że pomimo iż była to Konferencja to jak uczestniczy podzielili się po salach to u mnie chyba pojawiło ok 30 osób. Bardzo fajne, kameralne warunki. Po szybkiej instalacji miałem jeszcze 10 min więc żeby nie stać jak kołek to porozmawiałem trochę z uczestnikami, którzy pojawiali się na sali. Uznałem to za dobrą opcję skrócenia dystansu, poznania trochę siebie. Z samej prelekcji niewiele pamiętam (ach ten stres). Po czasie w jakim skończyłem wiem, że za szybko mówiłem. Ale miałem przygotowany dodatkowy temat, historię - właśnie na taką okoliczność. Niestety otrzymałem tylko jedną opinię lub bardziej bym powiedział kontrargumenty do przedstawionych tematów ale to dobrze. Musi być miejsce na dyskusję, nie musimy się zgadzać ze wszystkim i nawet prelegent ma prawo do błędu!

Minusy

Konferencja od strony technicznej była wspierana przez aplikację Eventory. I pomimo, iż mi jakoś nie przeszkadzało jej używanie to wielu ludzi marudziło, że trzeba się rejestrować itd. Można było w niej ocenić prelekcje ale bardzo mało uczestników skorzystało z tej opcji. Ja pomimo prośby otrzymałem 6 głosów. Szkoda. Można by ten element poprawić, spróbować jakoś bardziej zaangażować uczestników.

Podsumowując

Cieszę się, że otrzymałem możliwość wystąpienia na 4Developers. Moje CFP nie zostało przyjęte w pierwszej turze ale to nie zawsze oznacza, że już nie ma szans (ale o tym kiedy indziej). Jak zawsze takie spotkania są okazją do poznania nowych ludzi. Tak! Nie bójcie się rozmawiać, pytać. Kiedyś sam stałem w rogu pijąc kawkę. Dziś staram się zagadywać dzięki czemu poznałem osobiście Adama Sitnika i wymieniliśmy kilka ciekawych spostrzeżeń na temat naszej branży. Jako prelegent uważam że takie lokalne konferencje (prócz innych meetupów, warsztatów) są fajną opcją do zdobywania doświadczenia. Dzięki 4Developers!





sobota, 2 września 2017

Logowanie wyższego poziomu z Serilog + Elasticsearch + Kibana

Dzisiaj szybki tutorial jak skorzystać z dobrodziejstw strukturalnego logowania (structured logging) określanego również mianem logowania semantycznego (semantic logging).



Na początek mój przypadek użycia z codziennej pracy. Korzystamy z klasycznych, obytych już przez lata bibliotek do logowania jak log4j, log4net czy wbudowane w .NET Trace. Jednak, jak to bywa często z logami, zaglądamy do nich tylko w przypadku gdy coś padnie i potrzebujemy kompletny stack trace czy przejrzeć kroki operacji. Są bo są. Tak na czarną godzinę. Ostatnio pojawiła się potrzeba bardziej szczegółowego monitorowania metod z warstwy repozytorium, które są wywoływane do bazy danych. Ale nie tylko logowanie! Również późniejsza ich analiza. I w tym miejscu wkracza na scenę pierwszy aktor - Serilog!

Serilog

Serilog, który jak wyżej wspomniane "loggery" także posiada możliwość wypluwania danych do plików ma jedną przeważającą cechę! Logowanie strukturalnych danych. Co to oznacza? W skrócie możliwość logowania obiektów wraz z ich właściwościami. Dodatkowo dostępnych jest wiele tzw. sink (z ang. zlew) czegoś w rodzaju miejsc gdzie dane mają trafiać. Ich listę znajdziecie tutaj.
W moim przypadku wykorzystałem Elasticsearch. 

Elasticsearch

Elasticsearch jest silnikiem, który umożliwia gromadzenie danych, ich przetwarzanie oraz analizę. Komunikacja odbywa się poprzez REST a zapytania formułuję się w formacie JSON. Jest to bardzo popularna platforma (szczególnie z wykorzystaniem całego pakietu Elastic Stack) często wykorzystywana w środowiskach rozproszonych.

Kibana

Ostatni etap - przeglądanie, wizualizacja danych. Kibana jest stworzona do pracy z Elasticsearch. Przy naprawdę niewielkiej konfiguracji uzyskałem kilka wiele mówiących wykresów. A to tylko początek. Nawet nie dotarłem do zapytań i bardziej zaawansowanych funkcjonalności.

Quick Start

Poniżej przedstawiam dosyć prostą konfigurację Serilog. Skonfigurowałem dwa wyjścia:
- Plik tekstowy
- Elasticsearch


_logger = new LoggerConfiguration()
                .WriteTo
                .File(@"..\__logs\DBPerf\sdmstruct.log")
                .WriteTo
                .Elasticsearch(new ElasticsearchSinkOptions(new Uri("http://localhost:9200"))
                    {
                        AutoRegisterTemplate = true,
                        MinimumLogEventLevel = Serilog.Events.LogEventLevel.Information
                    })
                .Destructure.ByTransforming<DbMethodCallInfo>(r =>
                {
                    return new
                    {
                        r.RequestId,
                        r.Module,
                        r.FirstCaller,
                        r.LastCaller,
                        r.DBMethod
                    };
                })
                .CreateLogger();

Dodatkowo ważne jest wskazanie w jaki sposób ma zostać zserializowana struktura logowanego obiektu. Generyczna metoda Destructure.ByTransforming<T> umożliwia wskazanie docelowego typu i definicji nowego obiektu, który trafi do loga. Dzięki temu możemy pominąć pewne właściwości, lub zmienić ich format.

Tak utworzoną instancję logera wywołujemy podobnie jak w innych tego typu bibliotekach poprzez metody Info, Warn, Debug itd. z tą różnicą, że tutaj występuje coś w rodzaju szablonu (template).


_dglogger.Information("DB Call {@DbMethodCallInfo}", dbMethodCallInfo);

Bardzo dobrze zostały one opisane na stronie projektu Writing Log Events. W moim przykładzie poprzez symbol @ wskazałem aby przekazany obiekt został z serializowany. Brak jakiegokolwiek operatora lub użycie $ wskazuje na wykorzystanie metody ToString().

Elasticsearch + Kibana

Tutaj nie ma chyba lepszej opcji niż użycie Dockera. Są gotowe, skonfigurowane obrazy które do celów testowych w zupełności wystarczą. Ja użyłem obrazów z bardzo popularnego repozytorium na
GitHub: https://github.com/deviantony/docker-elk. Wskład wchodzi tutaj cały Elastic Stack: Elasticsearch, Logstach oraz Kibana. Logstach nie miałem potrzeby użyć i nie będę go omawiał.
Szyki klon repo i jedziemy z compose ;)


Kotfis@RUMIA D:\Prv\GitHub\docker-elk
$ docker-compose up

Przy odrobienie szczęścia (tak Docker się potrafić wywalić :) ) otrzymuje instancję serwisów do których możemy się dostać przez przeglądarkę:

Elasticsearch http://localhost:9200/
Kibana http://localhost:5601

Żeby upewnić się, że cokolwiek trafia do Elastica polecam wpisać w przeglądarce adres:


http://localhost:9200/_cat/indices?v

W ten sposób otrzymamy listę indeksów wraz z ilością dokumentów:


health status index               uuid                   pri rep docs.count docs.deleted store.size pri.store.size
yellow open   logstash-2017.09.02 At15lEHnQJ20qQVju9Ledg   5   1     213004            0     39.1mb         39.1mb
yellow open   .kibana             ZOD1LlKvT6Sht8ZtcCyoCQ   1   1          7            1     48.5kb         48.5kb
yellow open   logstash-2017.09.01 nov4uz4oTPmKzVSVtKQnEg   5   1      20514            0      4.8mb          4.8mb

Ale co z Kibaną zapytacie? Temat na osobny post. Ale żeby wasze oczy ucieszył chodź jeden mały wykresik to podaję kilka istotnych informacji! Przy automatycznym zarejestrowanym szablonie (co zostało uczynione w konfiguracji logera) Serilog utworzy indeks w formacie "logstash-*". Posługując się nim w pierwszym kroku dodajemy wizualizację wybierając pośród różnego rodzaju wykresów, tabelach itp. Opcjonalnie możemy także stworzyć Dashboard, do którego można podpiąć kilka reprezentacji danych.

Linki do wszystkich wspomnianych produktów, repozytoriów:
Serilog
Elastic Stack
Docker
Docker-Elk (Elasticsearch, Logstach, Kibana)


Na koniec chciałbym polecić rozszerzenie do Chrome Check my links Umożliwia automatyczne przejście po wszystkich linkach dostępnych na stronie co w moim przypadku spełniło rolę automatu i wygenerowało sporo requestów. Więc w krótkim okresie czasu wygenerowałem sporo ruchu.


wtorek, 1 sierpnia 2017

Dev Session - autorski kanał na youtube

Idę za ciosem! Nie planowałem tego i pomysł wpadł do głowy całkiem spontanicznie ale oto przedstawiam Wam mój kanał na youtube DEV SESSION!

Dev Session

A od czego się zaczęło? Tak po prostu miałem pomysły na małą serię postów i pomyślałem, że było by dużo w nich "kodowania" oraz treści i że chyba łatwiej jest mi to Wam przekazać w formie video tutoriala, live coding, opowiadając przy tym co mam na myśli. No tak idea była prosta realizacja okazał się trochę trudniejsza. Ale o tym kiedy indziej. Dziś cieszę się, że mogę Wam zaprezentować pierwszy oficjalny powitalny film! Zapraszam do śledzenia, dzielenia się opiniami i pomysłami na tematy odcinków.



Youtube: DEV SESSION
Twitter: @devsessionpl
Facebook: Dev Session

Pomocna dłoń

Każdy z nas kiedyś zaczynał czy to jako programista, blogger, prelegent. Jedni zaszli dalej, inni porzucili obraną ścieżkę a pozostali może dalej tkwią w miejscu i nie mogą pójść dalej.
Dziś krótki post a może bardziej przesłanie aby na każdym kroku swojej kariery nie zapominać o swoich początkach, o tym ile pracy kosztowało nas znalezienie się w aktualnym miejscu i o osobach, które nam w tym pomogły i doceniły nasz wysiłek. Jeśli osiągnąłeś już "coś" i na drodze do tego celu otrzymałeś pomocną dłoń to może teraz jest czas na Ciebie aby wyciągnąć ją również do tych osób które są na początku tej drogi?!
Twój jeden tweet, jedno polubienie, subskrypcja może zdziałać wiele dla takich osób! Dodać skrzydeł, zmotywować, docenić.


wtorek, 20 czerwca 2017

Debiut prelegencki - o wrażeniach, o tym jak się przygotowywałem i co mi pomogło

Zwieńczeniem mojego udziału w tegorocznej edycji "Daj się poznać" było wystąpienie na gali finałowej, która odbyła się w siedzibie Microsoft w Warszawie. Zgłosiłem się jako ochotnik wiedząc, że jest to ogromna szansa do zaprezentowania siebie a zarazem bo zawsze chciałem to zrobić. Mam w sobie taki pociąg do dzielenia się wiedzą, lubię rozmawiać - dyskutować w grupie, prezentować swoje poglądy. Jak mi poszło, czy się stresowałem, jak wyglądały przygotowania o tym w poniższym wpisie.
Gala konkursu "Daj się poznać" - Microsoft Warszawa czerwiec 2017


W międzyczasie ukazały się nagrania z prezentacji. Zapraszam do oglądania!

Wrażenia

Na początek moje wrażenia bo cały czas jestem nabuzowany :) Było bardzo dobrze. Na luzie z odrobiną humoru. Otrzymałem wiele pozytywnych opinii i to z ust nawet doświadczonych prelegentów! Lepszej nagrody nie mogłem sobie wymarzyć. Prezentacja była miękka - motywująca. Poruszała się po dwóch obszarach jakie już opisywałem na blogu:
1. Teoria rozbitych okien
2. Personifikacja kodu

Zachęcam do zapoznania się z tymi tematami.

Wiele osób nie mogło uwierzyć, że było to moje pierwsze wystąpienie :) Tak! Jako prelegent występowałem pierwszy raz. Poświęciłem wiele czasu na przygotowania, próby ale jest jedna rzecz, która bardzo mi pomogła na scenie. Mianowicie ...

Hobbystycznie zajmuję się muzyką (pierwotnie grałem na pianinie, syntezatorach). Od jakiegoś czasu pogrywam jako DJ a więc kontakt z publicznością czy bycie w centrum kiedy to oczy ludzi skierowane są na Ciebie nie robią już na mnie takiego wrażenia.



Przygotowania

W sieci znajduję się bardzo dużo materiałów na temat sztuki prezentacji. Ja niczego nowego, rewolucyjnego nie powiem jedynie podzielę się z Wami czym się inspirowałem i jak wyglądały moje przygotowania.

Wybór tematu

Pierwsza rzecz nad jaką myślałem, zaraz po wysłaniu zgłoszenia z chęcią wystąpienia. Mieliśmy na to kilka dni i przez ten okres spisywałem w notatniku pomysły, które wpadły mi do głowy. Były to tematy techniczne z różnych dziedzin IT oraz miękkie. Drogą eliminacji zostałem przy miękkim - w tym czuje się dobrze. Prezentacja miała trwać maksymalnie 20 min i uznałem, że temat techniczny ciężko było by zaprezentować. Ostatecznie zgłosiłem temat "Mój kod, moja dzielnica" - szyfrując w nim trochę o czym będę mówić. Wpływ na ten wybór miał także pozytywny feedback, który otrzymałem od różnych osób dotyczący posta o "Teorii rozbitych okien".

Zarys prezentacji, scenariusz

Kolejnym etapem było spisanie czegoś w rodzaju scenariusza prezentacji. Wziąłem kartkę A4 na której wypisywałem kolejno punkty, złote myśli. Co chciałbym przekazać. 

Jedna mała uwaga. Na tym etapie tworzenie slajdów nie jest potrzebne a wręcz przeszkadza. 

Tak spisane kwestie nie stanowiły jeszcze tego jak będzie przebiegała prezentacja. To zmieniało się w czasie i nawet modyfikowałem jeszcze trochę kolejność poszczególnych kwestii po pierwszych próbach. W związku z tym, że było to moje pierwsze wystąpienie pozwoliłem sobie trochę bardziej rozbudować kwestię przedstawienia siebie, swojej biografii. Większość zasad mówi, że ludzi nie interesuje to kim jesteś, co robisz, tylko temat prezentacji. W tym przypadku mogłem jednak zrobić mało odstępstwo od tej normy.

Slajdy

Dla mnie chyba jedna z trudniejszych rzeczy do przygotowania. Postanowiłem trzymać się tu kilku znanych zasad, które się sprawdzają:
  • Proste slajdy, bez zbędnych grafik, logo i bajerów w postaci kwiatków, wężyków i innych dupereli. 
  • Czcionka i jej wielkość. Bezszeryfowa, duże rozmiary nagłówków i napisów. Tak żeby każdy mógł przeczytać tekst.
  • Mało treści - tylko same hasła przewodnie. W tym zakresie chyba wszyscy są zgodni, że im mniej tym lepiej. Ludzi przyszli ciebie słuchać. Rzadko kiedy chce się komu czytać ściany tekstu, zestawienia tabel itd.
  • Czasem jedna grafika, obrazek może zdziałać bardzo wiele! Działają na ludzką wyobraźnię. Szczególnie jeśli nie jesteś w stanie (lub nie czujesz się na siłach) aby dotrzeć do słuchaczy bezpośrednio poprzez obrazowanie pewnych sytuacji, opowiadanie o nich. Budujesz napięcie, zapowiadasz coś po czym "Bum!" pokazuję się super fajny mem na który cała sala reaguje śmiechem 😄
  • Notatki do slajdów. Coś co może uratować Ci tyłek jeśli się zatniesz. PowerPoint ma tą możliwość i korzystając z widoku prezentera będziesz mógł do nich zerknąć. Jednak rób to tylko w sytuacjach awaryjnych.

Próby, ćwiczenia, poznanie swoich problemów

Mając skomponowany scenariusz oraz slajdy przystąpiłem do ćwiczenia prezentacji. Swoją prezentację podzieliłem na kilka głównych części:
  • O mnie
  • Motyw przewodni, przedstawienie tematu
  • I temat - personifikacja kodu
  • II temat - teroria rozbitych okien
  • Podsumowanie
Szczególnie ważne są dwa pierwsze punkty. Jak to mówią liczy się pierwsze wrażenie. Bardziej doświadczenie prelegenci często je ze sobą zamieniają i zaczynają od tzw. mocnego wejścia, powiedzenia czegoś kontrowersyjnego, czegoś co da do myślenia. Ja pozostałem przy takim układzie nie wrzucając sobie za dużo jak na pierwszy raz. Ale wchodząc na scenę, można rzucić jakimś małym żartem, anegdotą - pozwoli to trochę rozładować napięcie. Ok ale jak wyglądały te ćwiczenia?
  • Ćwiczyłem poszczególne elementy prezentacji osobno. Nie próbowałem od początku przejść przez wszystkie slajdy. Jeśli ułożyłem jakąś sensowną kwestię, ciąg słów, zdań zapisywałem to w notatkach. Nie chciałem improwizować i za każdą kolejną próbą mówić co innego.
  • Założyłem, że pierwsze dwa punkty muszą być wykute na blachę! Niektórzy mówią, że ma to być pierwsze 30sek.
  • Nagrywałem siebie (video + audio) po czym oglądałem. Ale żeby to przyniosło jeszcze lepszy rezultat podzieliłem się tym materiałem. Mi bardzo pomógł Szymon Kulec, któremu jeszcze raz serdecznie dziękuje! Odezwałem się na slacku DevsPL na kanale #sztuka-prezentacji z moimi pytaniami, wątpliwościami. Szymon zaproponował pomoc. Przejrzał nagranie po czym wrócił z cennymi uwagami! Problemami, których sam nie dostrzegałem! A było to:
    • Chodzenie. Nie byłem w stanie ustać w miejscu
    • Kręcenie młyneczków rękoma
    • Intonacja głosu
  • Gdy już wypracowałem mówienie poszczególnych kwestii dopracowałem przerzucanie slajdów tak aby trafiać w punkt. Nie wyprzedzić lub nie spóźnić się. Niby mała rzecz ale może spalić efekt lub gdy dorzuccisz "o tutaj slajd, który właśnie obrazuje to co powiedziałem" 😃
  • Kontrola czasu, tempa mówienia. Miałem 20 minut, których musiałem się trzymać. Pisząc scenariusz, slajdy nie wiedziałem ile opowiedzenie tego mi zajmie. Takie próby pokazują to. Czy możemy mówić trochę wolniej, szybciej, czy jest miejsce na pauzę albo czy nie trzeba wyrzucić czegoś. Lepiej skończyć wcześniej i zostawić kilka minut na ewentualne pytania niż przeciągnąć i pędzić na samym końcu.
Próby były intensywne, po kilku godzinach gardło dało znać o sobie! Więc polecam jakieś landrynki lub inne cukierki do ssania na gardło.

Eliminacja problemów

Jak już wspomniałem największymi problemami u mnie okazało się:
  • Chodzenie. Z jednego miejsca na drugie, nie mające celu. U innych może to być bujanie, tańcowanie itp. 
  • Kręcenie młyneczków rękoma, nadmierna gestykulacja.
  • Intonacja głosu. Największe zaskoczenie jak dla mnie! Okazało się, że często zdania twierdzące kończę podnosząc głos do góry, tak jakbym pytał 😊 Dopiero gdy ktoś mi to uświadomił zobaczyłem jakie to jest irytujące (a moja kochana żona mi potem powiedziała, że tak zawsze było ale już się przyzwyczaiła 😜)
Na pierwsze dwa problemy nie byłem wstanie sam znaleźć rozwiązania więc szukałem ich w internecie. Tutaj mogę polecić filmy Pana Wiktora Niedzickiego. Starsze pokolenie z pewnością go pamięta.To są krótkie acz bardzo rzeczowe filmy:
  1. Wiktor Niedzicki SZTUKA PREZENTACJI - Ręce
  2. Wiktor Niedzicki SZTUKA PREZENTACJI - Mowa ciała
Niestety kanał nie udostępnia playlist ale pozostałe filmy poruszające ten temat bez problemu znajdziecie a polecam je wszystkie.

Wyeliminować problemy można tylko poprzez ćwiczenia, ćwiczenia i jeszcze raz ćwiczenia! Pomogła mi w tym również znajomość tematu, treści którą chcę powiedzieć. Wtedy, jeśli już nie skupiasz się na tekście prezentacji możesz się skupić na swojej postawie, mowie ciała czy dbaniu o wymowę, intonację. Wszystkich rzeczy nie da się wyeliminować całkowicie od razu więc wpierw postaraj się zapanować nad rękoma czy chodzeniem. I tak po kolei eliminuj następne problemy. Jeśli jest ich dużo a czasu mało nie staraj się poprawić wszystkiego na raz. Efekt może być mizerny.


Moje inspiracje

Na koniec chciałbym podzielić się z Wami filmami, osobami, z których czerpałem inspirację dotyczące "sztuki prezentacji".

James Whittaker - ewangelista Microsoftu. Prawdziwy "wymiatacz". Nie wiem dlaczego wcześniej nie widziałem jego prezentacji.

Miałem okazję raz być na prezentacji Kamila. Było to kilka lat temu, coś o projektach informatycznych i nie przypadła mi do gustu. Jednak ten film polecam bo jest krótki i punktuje najważniejsze kwestie no i jest w stylu TED'owym a kto nie chciałby wystąpić na scenie TEDx? 😁

Coś dla młodszego pokolenia bo w głównej mierze zwrócona jest do maturzystów. Jednak część przekazu jest uniwersalna.

Bardzo fajny panel dyskusyjny. Dyskutują osoby z poza świata IT (jednak związane mocno ze sceną) oraz "nasz" przedstawiciel w osobie Jakuba Nabrdalika.

Podsumowując

I na tym można powiedzieć skończyła się tegoroczna przygoda z "Daj się poznać" ale na pewno zapoczątkowała u mnie coś nowego. Dała kopa, motywację do dalszych działań. Nowo poznane osoby okazały się bardzo inspirujące! Jeszcze raz dzięki za wszystkie opinie otrzymane po prezentacji. A jeśli nie miałeś okazji jej do tej pory wyrazić to nie zwlekaj. Jest ona dla mnie bardzo ważna.

ps. Ten weekend był ważny także z innego powodu.  Po wielu miesiącach oczekiwania nareszcie zawitała do Polski grupa Coldplay. Koncert był niesamowity!!! Co za weekend ...

Coldplay Warszawa 2017

środa, 31 maja 2017

Dogevents - wyszukiwanie wydarzeń wg lokalizacji

Jedną z głównych funkcjonalności w projekcie Dogevents jest wyszukiwanie wydarzeń wg lokalizacji. MongoDB natywnie udostępnia taką funkcjonalność, należy tylko posiadać dane geolokalizacyjne w odpowiednim formacie, przygotować odpowiedni indeks i wywołać odpowiednie zapytanie.

Format danych

MongoDB wspiera wiele typów GeoJSON takich jak punkt, linia, wielokąt. W moim przypadku ten pierwszy ma znaczenie gdyż miejsce wydarzenia to nic innego jak wskazanie na koordynaty (współrzędne) w postaci szerokości i długości geograficznej, np. [54.4760932,18.5446327]. 
W bazie muszą one zostać zapisane w postaci:
  • tablicy: [54.4760932,18.5446327]
  • dokumentu, np.: { lat: 54.4760932, lng: 18.5446327 }
U mnie właśnie ten wymóg okazał się barierą i musiałem dokonać zmiany w modelu. Dane na temat miejsca pobrane z Facebook graphApi zwracane są w postaci:

"place": {
    "name": "Psia Kość - szkolenie psów w Skoczowie",
    "location": {
      "city": "Skoczów",
      "country": "Poland",
      "latitude": 49.80972,
      "longitude": 18.79726,
      "street": "Wiejska 2",
      "zip": "43-430"
    },
    "id": "519318824878019"
  }

i przy próbie założenia wymaganego indeksu otrzymywałem błąd związany z brakiem możliwości rozpoznania danych lokalizacyjnych.

Transformacja danych

Aby rozwiązać powyższy problem zmieniłem mój model domenowy dodając nową klasę zgodną z formatem MongoDB i zmodyfikowałem strukturę location: 

public class Coordinates
{
    public double lng { get; set; }
    public double lat { get; set; }
}


public class Location
{
    public string City { get; set; }
    public string Country { get; set; }

    //For MongoDB geospatial search
    public Coordinates Coordinates { get; set; }

    public float Latitude { get; set; }
    public float Longitude { get; set; }
    public string Street { get; set; }
    public string Zip { get; set; }

    public Location()
    {
        this.Coordinates = new Coordinates();
    }
}

Aby dane zostały wprowadzone do nowej właściwości Coordinates dodałem metodę, która jest wołana w momencie deserializacji:

[OnDeserialized]
public void OnDeserialized(StreamingContext context)
{
    if (this.Place?.Location != null)
    {
        this.Place.Location.Coordinates.lat = this.Place.Location.Latitude;
        this.Place.Location.Coordinates.lng = this.Place.Location.Longitude;
    }
}

Jest to trochę mało eleganckie wyjście i powoduje duplikowanie danych. Ale chciałem na szybko uzyskać działający efekt. Na pewno jest to miejsce do optymalizacji, transformacji modelu. Końcowy dokument przyjął następującą formę:

"Place" : {
                "Name" : "Ośrodek Wypoczynkowy Omega",
                "Location" : {
                        "City" : "Przywidz",
                        "Country" : "Poland",
                        "Coordinates" : {
                                "lng" : 18.326669692993164,
                                "lat" : 54.193641662597656
                        },
                        "Latitude" : 54.193641662597656,
                        "Longitude" : 18.326669692993164,
                        "Street" : "Wczasowa 11",
                        "Zip" : "83-047"
                }
        },

Geospatial indeks

Kolejnym krokiem było utworzenie indeksów, który umożliwią tworzenie zapytań wykorzystujących dane lokalizacyjne. W swojej funkcjonalności będę wykorzystywał funkcję $near która wymaga tylko jednego indeksu typu 2d.

db.Events.createIndex({ "Place.Location.Coordinates":"2d" })

Przykładowe zapytanie

Tak przygotowana baza danych umożliwia rozpoczęcie wyszukiwania wydarzeń wg lokalizacji. Możliwości jest naprawdę wiele, mój przykład użycia jest jednym z prostszych! Poniższy przykład pokazuję zapytanie zwracające wydarzenia w odległości 50km od wskazanego miejsca:


db.Events.find({
    "Place.Location.Coordinates": {
        $near: {
            $geometry: {
                type: "Point",
                coordinates: [18.3737986, 54.5792772]
            },
            $maxDistance: 50 * 1000
        }
    }
}).pretty()

Koordynaty muszą zostać podane w postaci [długość_geograficzna (lng), szerokość_geograficzna (lat)]. Możemy określić maksymalny dystans (w metrach) jak również minimalny poprzez wskazane $minDistance.

Podsumowując. W bardzo prosty sposób możemy dodać do aplikacji funkcjonalność, która w połączeniu z bieżącą lokalizacją użytkownika umożliwi dostarczanie interesujących wydarzeń w w jego okolicy. Nie spodziewałem się tak szybkiego rozwiązania tego problemu. Jedynym z jakim się spotkałem to w dużej mierze brak danych lokalizacyjnych lub wpisanie samego miasta jako lokalizacji wydarzenia. Także wynik końcowy jest w dużej mierze zależny od osoby tworzącej wydarzenie.