Gala „Daj się poznać” – czyli parę słów od zdobywczyni drugiego miejsca

W ostatnią sobotę – 18 czerwca odbyła się uroczysta Gala wieńcząca trzy miesiące zmagań w konkursie „Daj się poznać” zorganizowanym przez Maćka Aniserowicza.

Wydarzenie składało się z trzech części (nie licząc oczywiście wstępu, w którym Maciek powitał wszystkich bardzo ciepłymi i energetyzującymi słowami) – najpierw były dwie prezentacje przedstawicieli partnerów konkursu – czyli mBanku i SoftwareHut. Po nich nastąpiły prelekcje uczestników z przerwą na obiad i rozdanie nagród. Ostatnim punktem programu było afterparty, które miało miejsce w Beerokracji… i nie tylko:)

Laureatem nagrody głównej został Piotr Gankiewicz ze swoim projektem o nazwie Warden – czyli narzędziem do monitorowania. Projekt był naprawdę świetnie przygotowany, towarzyszy mu również dedykowana strona i wyczerpujące wiki. Pełen profesjonalizm jednym słowem. Aplikacja jest dostępna jako Open Source na Githubie.

Pierwsze, co przychodzi mi na myśl w związku z tym wydarzeniem, to naprawdę świetna atmosfera, jaka towarzyszyła prezentacjom uczestników. Każdy został przyjęty ciepło bez względu na pomysł, technologię i poziom doświadczenia w wystąpieniach publicznych. Zresztą jeśli już o poziomach mowa, to mimo, iż wiele osób prezentowało się po raz pierwszy na scenie, wszystko wyszło to naprawdę świetnie.
Przyznam, że nawet troszkę żałowałam, iż nie zdecydowałam się na zaprezentowanie rezultatu swoich prac. Wszystko to dlatego, że do samego końca myślałam sobie – gdzie ja tam z tą moją aplikacją będę wyskakiwać – przecież nawet jej nie skończyłam. Tymczasem jednak, jak się okazało podczas rozdania nagród, mój projekt przyniósł mi drugie miejsce. W ten oto sposób wygrałam wypasioną klawiaturę mechaniczną Das Keyboard Szczegółowe wyniki wraz z punktacją oraz relację Maćka można znaleźć tutaj.

Na nagrodzie w postaci klawiatury się nie skończyło, ponieważ otrzymałam również w ramach nagrody specjalnej od jednego z partnerów – mBanku zegar/budzik w postaci robota z Gwiezdnych Wojen. Wydaje bardzo pocieszne dźwięki i wygląda tak:

Robot

Już wcześniej pisałam, że bardzo się cieszę, że dotrwałam do końca konkursu spełniając warunki znalezienia się wśród 70 innych osób, które je spełniły. Pisałam też, że bardzo się cieszę, że trafiłam do szczęśliwej 16stki. Ale teraz cieszę się niewyobrażalnie, bo gdy wysyłałam zgłoszenie na konkurs, nawet przez myśl mi nie przeszło, że mogę zajść tak daleko i tak wysoko. To było niesamowite wyzwanie a rezultat dał mi teraz tak pozytywnego kopa, o jakim nawet nie marzyłam. Mam nadzieję, że ta pozytywna energia zostanie ze mną na długo i uda mi się ją zainwestować w nowe fajne wyzwania.

Jeszcze raz wielkie DZIĘKUJĘ dla Maćka jako organizatora oraz dla wszystkich, którzy na mnie głosowali, bo ilość tych głosów naprawdę mnie zaskoczyła.

Jeśli przed jakąś przyszłą edycją „Daj się poznać” ktoś będzie się zastanawiał czy warto – odpowiadam warto! Nigdy nie wiesz co fajnego z tego wyjdzie:) I nie dowiesz się jeśli nie spróbujesz:)

P.S. Zabawne jest to, że zarówno Piotr – zwycięzca, jak i ja jesteśmy z Krakowa:) Z kolei w pierwszej trójce zwycięzców są dwie dziewczyny:)

Zaawansowana analiza kodu z NDepend – część 1

W ostatnim czasie dzięki uprzejmości Patricka Smacchia, miałam okazję zapoznać się z narzędziem do analizy kodu jakim jest NDepend.

Ponieważ jednak ma on tak dużo możliwości, iż wyrósł by z tego całkiem spory artykuł, postanowiłam podzielić go na mniejsze i niniejszym zapraszam na pierwszy odcinek cyklu poświeconego temu narzędziu.

Zacznijmy zatem od tego czym jest NDepend, jak zacząć pracę z nim i Co nam daje?

Narzędzie służy do zaawansowanej analizy kodu, wspomaga przyglądanie się strukturze projektu, zależnościom, dbanie o czystość i wydajność kodu. Dostarcza nam przy tym wielu wizualizacji przedstawiających co się dzieje w projekcie na różne sposoby. To i wiele innych możliwości chciałabym opisać w tej i kolejnych częściach cyklu.

NDepend możemy pobrać tutaj. Niestety jest on płatne, ale możemy skorzystać z 14 dniowego okresu próbnego, aby dowiedzieć się czy to jest to czego naprawdę potrzebujemy. Jeśli chodzi o informację na temat cen, znajdziemy je tutaj. Jest możliwość zakupu licencji dla programisty jak również licencji przeznaczonej na serwer budujący. Im więcej licencji tym oczywiście taniej. Ceny zaczynają się zatem od 239 euro i sięgają aż do 299 jeśli chodzi o licencję dla konkretnego programisty. Ceny dla serwera budującego to od 479 euro do 599 euro. Jest to dość sporo, jednak narzędzie ma naprawdę dużo możliwości i koszt przy dużych projektach z pewnością się zwraca.

Po tym jak zainstalujemy NDepend pojawi nam się on w górnym pasku Visual Studio jak poniżej:ndepend_afterinstall

By przetestować możliwości narzędzia postanowiłam na tapetę wziąć Octokit.net. Jest to dotnetowa biblioteka do komunikacji z API GitHub. Odkryłam ją jakiś czas temu dzięki stronie 24 Pull Requests, która gromadzi informacje o różnego rodzaju projektach Open Source, które poszukują współpracowników.

Zatem, gdy już otworzymy konkretny projekt (w moim przypadku będzie to wlaśnie Octokit.net) i znów klikniemy w opcję NDepend menu będzie wyglądało następująco:ndepend_octokit

Opcją, która nas interesuje jest pierwsza od góry: „Attach new NDepend project to Current VS Solution”. Wybranie jej spowoduje otwarcie następującego okna:

ndepend_select

Możemy tutaj wybrać w jakim miejscu ma zostać utworzony projekt NDepend a także jakie pliki dll mają być brane pod uwagę przy analizie. Ja pozostawię to okienko bez zmian. Zatem klikamy przycisk Analyze 7 .NET Assemblies.Wówczas pojawi się kolejne okno – tym razem z wyborem wyników raportu jakie chcemy zobaczyć.

ndepend_report_select

W pierwszej części cyklu chciałabym skupić się na tej pierwszej opcji czyli NDepend Dashboard. Zatem ją wybieram i wówczas w Visual Studio otwiera się zakładka o nazwie Dashboard, która pokazuje nam wiele istotnych informacji. W przypadku tego projektu wygląda to następująco:

Najpierw mamy informacje na temat ilości kodu, komentarzy i reguł jakie kod powinien spełniać:

NDepend Dashboard 1

Poniżej (podzieliłam zrzuty ekranu na części, ponieważ na jednym nie zmieściłyby się wszystkie informacje) mamy dane na temat złamanych reguł w postaci wykresów:

NDepend dashboard 2

Każdy z wykresów ma szereg opcji, które widzimy w prawym górnym rogu:
Pierwsza ikonka, to możliwość zmiany położenia wykresu – na przykład zamiany prawego z lewym itp. Druga ikonka to tak naprawdę checkbox, który pozwala nam włączyć lub wyłączyć pokazywanie tego wykresu w raporcie. Trzecia – pozwala na edycję wykresy i dostarcza nam tym samym kolejny szereg opcji. Dla wykresu Rules Violated wygląda to następująco:

NDepend Dashboard Edit Chart

Czwarta ikonka to możliwość wyeksportowania wykresu a ostatnia to usunięcie go z tablicy.

Kolejne wykresy jakie mamy do dyspozycji to:

NDepend Dashboard 3

Wykres Percentage Coverage By Tests jest pusty, ponieważ nie zaimportowaliśmy danych na temat pokrycia testami. Zrobimy to w jednym z kolejnych artykułów. Wykres Max prezentuje nam różnego rodzaju maksymalne wartości dla naszego kodu.

Ostatnie wykresy to:

NDepend Dashboard 4

Średnia na temat tych samych danych co wykres Max oraz wykres z informacjami na temat użycia obcych bibliotek od zewnętrznych dostawców.

Prawie każdą z tych informacji możemy kliknąć, by uzyskać więcej informacji (np w przypadku Rules Violated) lub by wyedytować metrykę (np w przypadku Max).

Raport w pliku HTML

W tym samym momencie, gdy powstaje Dashboard w lokalizacji, którą określiliśmy na początku powstaje plik html z raportem na temat projektu. U mnie został utworzony folder o nazwie NDependOut w folderze głównym solucji. A w nim plik o nazwie NDependReport.html
W raporcie znajdują się diagramy, metryki oraz lista złamanych reguł mniej lub bardziej krytycznych:

Diagrams

Application Metrics

Rules

Jeśli chcecie zobaczyć ten raport „w akcji” – umieściłam go tutaj. Można po nim klikać i zobaczyć jak to wygląda na żywo.  W kolejnych częściach wrócimy do tego raportu a także tablicy Dashboard w Visual Studio, by przyjrzeć się bliżej poszczególnym opcjom.

Przetwarzanie plików CSV w C# stało się przyjemniejsze – CsvHelper

Dziś chciałabym się podzielić znaleziskiem, którego dokonałam ostatnio – mianowicie bardzo fajną biblioteką do przetwarzania plików CSV. Generalnie nie jest to przyjemna robota, ale z tym narzędziem zrobiło się naprawdę fajnie. Nazywa się CsvHelper a więcej informacji na jej temat można znaleźć tutaj.

By skorzystać z biblioteki musimy ją ściągnąć z NuGeta albo korzystając z wersji okienkowej czyli opcji „Manage NuGet Packages…” albo za pomocą „Package Manager Console” (dostępna z menu Tools->NuGet Package Manager)

Żeby nie przepisywać oryginalnej dokumentacji, która jest dostępna na stronie biblioteki chciałabym raczej pokazać jak to działa w praktyce dlatego też od razu zapraszam do moich przykładów dostępnych na Githubie.

Czytanie plików CSV

Przypadek 1 (Najprostszy): Mamy obiekt, którego pola mają takie same nazwy jak kolumny w pliku csv.

Przykładowy plik:

Name,Surname,Age
Jack,Sparrow,25
Hektor,Barbossa,30

Przykładowy obiekt:

Aby zczytać taki plik i zamapować dane na kolekcję takich obiektów wystarczy, że zrobimy coś takiego:

Jak to działa?

W pierwszej linijce otwieramy plik z danymi i go wczytujemy a w drugiej obiekty są automatycznie mapowane na obiekt User i na koniec dostajemy kolekcję tychże obiektów.

Jednak w życiu nie zawsze bywa tak prosto, więc jeśli takie automagiczne mapowanie u nas z jakiegoś powodu nie znajdzie zastosowania (choćby jeśli nazwy kolumn zawierają spację), możemy zdefiniować je sami.

Przypadek 2: Załóżmy, że model nadal mamy taki jak wyżej ale kolumny w pliku CSV mają nieco inne nazwy.

Przykładowy plik:

UserName,UserSurname,UserAge
Jack,Sparrow,25
Hektor,Barbossa,30

Biblioteka pozwala nam na mapowanie pól obiektu z kolumnami po indeksie kolumny. Czyli możemy zrobić coś takiego:

W drugiej linijce rejestrujemy mapę. Natomiast samo mapowanie będzie wyglądało tak:

Biblioteka pozwala nam na mapowanie pól obiektu z kolumnami również po nazwie kolumny. Czyli możemy zrobić również taką konfigurację:

Jeśli chodzi o mapowanie dostępne są jeszcze bardziej rozbudowane opcje takie jak możliwość konwersji typów, mapowanie w trakcie działania aplikacji lub ustawienie domyślnych wartości dla niektórych pól.

Tworzenie plików CSV

Jednak biblioteka nie ogranicza swoich możliwości tylko do odczytywania plików CSV. Umożliwia nam również ich tworzenie.

Przypadek 1 (Najprostszy): Tworzymy plik CSV w którym nazwy kolumn są takie same jak nazwy pól naszej klasy.

W efekcie otrzymamy plik CSV takiej postaci:

Name,Surname,Age
Jack,Sparrow,23
Davy,Jones,25
Hektor,Barbossa,23

Przypadek 2: Wykorzystujemy mapowanie aby dostosować nazwy kolumn do naszych potrzeb.

Ma to miejsce podobnie jak w przypadku odczytywania plików czyli konfigurujemy mapowanie jak poniżej:

I definiujemy je dokładnie tak samo jak przy odczytywaniu plików.

Konfiguracja

Do tej pory powiedzieliśmy sobie tylko o konfiguracji na potrzeby mapowania, ale opcji dostępnych jest dużo więcej. Możemy ustawić m.in.

  • delimiter czyli znak którym mają być oddzielane wartości w wierszu. Tutaj na przykład ustawiamy jako delimiter średnik:
    reader.Configuration.Delimiter = ";"
  • culture info czyli ustawienia formatowania, daty, czasu itp. odpowiednie dla danego regionu/kraju (kultury)
  • Has Header Record – ważne by było ustawione na True, gdy mapujemy po nazwach kolumn, gdyż jeśli tego nagłówka nie będzie całość nie będzie mogła działać poptawnie.
  • Trim Fields i Trim Headers – pozwala nam automatycznie pozbywać się pustych znaków.

To tyle mojego małego wprowadzenia do biblioteki CSVHelper do której używania zachęcam.

Omawiane przykłady znajdziecie na moim Githubie.

Android Studio + Visual Studio czyli emulator Androida wydany przez Microsoft

Przy pracy nad moją aplikacją Shopping Advisor, postanowiłam wypróbować emulator Androida wydany przez Microsoft. Najpierw zapowiadało się fajnie – uruchamia się w miarę szybko, wyglądem nie ustępuje orginalnemu ani Genymotion. Natomiast znów brakuje mi opcji wyczyszczenia danych. Jednak to nie jest najgorsze – najgorsze jest to, że co rusz przestaje działać wprowadzanie tekstu z klawiatury a klawiatura urządzenia się nie pojawia;)

I jeszcze namnożyło mi różnych takich:

emulatory

No cóż, zatem pozostaje mi jednak po prostu testować aplikację na „żywym” urządzeniu;) Mam już dość tych wszystkich emulatorów:)

Jeśli chodzi o bieżącą pracę, to właśnie walczę jeszcze z ekranami wizarda dla użytkowników, którzy pierwszy raz biorą do ręki aplikację. Nie jest źle, ale póki co nie panuję nad przyciskiem wstecz, który chciałabym by wracał do poprzedniego kroku wizarda a nie na pusty ekran:(

Tak przy okazji – nie przyzwyczajajcie się do nazwy aplikacji – ulegnie zmianie jak tylko wymyślę jakąś nową sensowną:)

Windows + Docker + RabbitMQ – jak zacząć?

Po obejrzeniu różnych prezentacji z konferencji na temat Dockera i jego możliwości, postanowiłam wreszcie spróbować jak to wygląda w praktyce – zwłaszcza jeśli chodzi o Docker Hub

Co na temat Dockera mówi Wikipedia?

„Docker jest określany jako narzędzie, które pozwala umieścić program oraz jego zależności w lekkim, przenośnym, wirtualnym kontenerze, który można uruchomić na prawie każdym serwerze z systemem Linux”

Troszkę się myli, bo już powodzeniem Docker działa również na Windows o czym za chwilę.

Co nam daje Docker Hub?

Otóż powiedzmy, że potrzebujemy zrobić jakiś proof of concept w PHP z MySQL, ale nie mamy go zainstalowanego na komputerze, bo na przykład na co dzień pracujemy w Ruby:) Zakładam, że jest to Windows, więc wszystko wyżej wymienione musimy zainstalować od zera albo przynajmniej w formie gotowca jak WampServer itp. Przyjmijmy jednak tą czarną wersję – instalujemy po kolei – Apache, MySQL, PHP… Często po drodze coś się poknoci, coś trzeba dokonfigurować i tak zamiast zajmować się upragnionym projektem nadal męczymy się z konfiguracją.

I tutaj z pomocą przychodzi nam Docker Hub, który to jest zbiorem obrazów różnych środowisk i ma w swoich zasobach tysiące najbardziej popularnych konfiguracji. I tak znajdziemy tutaj zarówno obrazy oficjalne jak i utworzone przez użytkowników. Wśród takich można znaleźć m.in. właśnie obraz z wspomnianym wyżej środowiskiem – na przykład tutaj. Oprócz tego dostępnych jest całe mnóstwo innych: środowisko z NodeJS, Ruby, MariaDB czy Perl.

Zatem teraz, gdy zapragniemy się pobawić czymś, nie musimy już żmudnie instalować wszystkiego od zera narażając się na konfiguracyjny koszmar, ale możemy skorzystać z Dockera, dzięki czemu nie zaśmiecimy sobie komputera kolejnym frameworkiem, bazą danych czy językiem.

Jako, że ostatnio świeżo zainstalowałam system, postanowiłam, iż spróbuję obrazów Dockera, by właśnie nie bawić się w instalowanie tymczasowych rzeczy. Wybór padł na RabbitMQ, ponieważ wymaga zainstalowania nie tylko samego siebie, ale również Erlanga co już czyni instalację go na komputerze nieco skomplikowaną.

Krok 1 – Instalacja Dockera (Windows)

Zaczynamy od ściągnięcia instalatora ze strony Dockera i uruchomienia go. Po przejściu przez ekrany instalatora na których właściwie możemy się ograniczyć do klikania po kolei bez zmieniania niczego, Docker nam się uruchomi – w trayu obok zegara pojawi nam się animowana ikonka orki. Przestanie się ona animować po uruchomieniu.

Krok 2 – Pobranie i uruchomienie obrazu RABBITMQ

Następnie w dowolnej konsoli – może to być cmd.exe lub PowerShell możemy zweryfikować działanie Dockera na naszym systemie. Robimy to za pomocą komendy

docker version

albo

docker info

U mnie efekt wykonania tych dwóch poleceń w Powershellu wygląda tak:

PS C:\Users\Maga> docker version
Client:
Version: 1.12.0-rc2
API version: 1.24
Go version: go1.6.2
Git commit: 906eacd
Built: Fri Jun 17 20:35:33 2016
OS/Arch: windows/amd64
Experimental: true

Server:
Version: 1.12.0-rc2
API version: 1.24
Go version: go1.6.2
Git commit: a7119de
Built: Fri Jun 17 22:09:20 2016
OS/Arch: linux/amd64
Experimental: true

PS C:\Users\Maga> docker info
Containers: 3
Running: 1
Paused: 0
Stopped: 2
Images: 3
Server Version: 1.12.0-rc2
Storage Driver: aufs
Root Dir: /var/lib/docker/aufs
Backing Filesystem: extfs
Dirs: 28
Dirperm1 Supported: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
Volume: local
Network: host null bridge overlay
Swarm: inactive
Runtimes: default
Default Runtime: default
Security Options: seccomp
Kernel Version: 4.4.13-moby
Operating System: Alpine Linux v3.4
OSType: linux
Architecture: x86_64
CPUs: 2
Total Memory: 1.951 GiB
Name: moby
ID: GDGQ:RKGE:TAAR:PJBY:7USG:WRRO:RO34:WJFC:CNFN:TJ2Q:D6Q3:MCTV
Docker Root Dir: /var/lib/docker
Debug Mode (client): false
Debug Mode (server): false
Registry: https://index.docker.io/v1/
Experimental: true
Insecure Registries:
127.0.0.0/8

Powiedzmy zatem, że chcielibyśmy pobawić się RabbitMQ, w związku z czym wykonujemy na przykład komendę:

docker run -d --hostname my-rabbit --name some-rabbit -p 15672:15672 -p 5672:5672 rabbitmq:3-management

Pozwala ona na ściągnięcie i uruchomienie obrazu z Rabbitem wyposażonym już w dodatek w postaci panelu administracyjnego dostępnego z okna przeglądarki. Ułatwia on zarządzanie kolejkami i wszystkim co z Rabbitem związane. Dodatkowo interesująca jest opcja -p, która to umożliwia wystawienie z Dockera na zewnątrz portów z których chcemy korzystać. W naszym przypadku są to: port 15762 – port panelu administracyjnego oraz port 5762 – domyślny port na którym działa RabbitMQ. Jeśli chodzi o opcje –name i –hostname pozwalają nam one nazwanie obrazu (przydatne przy późniejszym zarządzaniu nim – np. usuwaniu czy zatrzymywaniu) a także ustawienie nazwy hosta dla obrazu. Szczególnie ważne w tej komendzie są właśnie porty, ponieważ ta konfiguracja pozwala nam na dostęp do Rabbita w kontenerze z zewnątrz. Dodatkowo potrzebujemy wiedzieć jaki jest adres naszego kontenera. Możemy go uzyskać wydając komendę:

docker inspect

Na samym końcu w sekcji Network Settings mamy Ports, które to nam pokazują pod jakim adresem dostępny jest nasz kontenerowy RabbitMQ.

"NetworkSettings": {
"Bridge": "",
"SandboxID": "354fe7fe505b0348c644fa2310e061eb2485c736aef2803bef01cc9cf5bf249e",
"HairpinMode": false,
"LinkLocalIPv6Address": "",
"LinkLocalIPv6PrefixLen": 0,
"Ports": {
"15672/tcp": [
{
"HostIp": "10.0.75.2",
"HostPort": "15672"
}
],
"5672/tcp": [
{
"HostIp": "10.0.75.2",
"HostPort": "5672"
}
]
},
"SandboxKey": "/var/run/docker/netns/354fe7fe505b",
"SecondaryIPAddresses": null,
"SecondaryIPv6Addresses": null,
"EndpointID": "63e61764bfcfab2ea0cc86ad347eae8700bb19b8586379e65fb1970773f8ba3f",
"Gateway": "172.17.0.1",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"IPAddress": "172.17.0.2",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"MacAddress": "02:42:ac:11:00:02",
"Networks": {
"bridge": {
"IPAMConfig": null,
"Links": null,
"Aliases": null,
"NetworkID": "ea74a2753b20bd4f8b1e974b2611df9091c23b4110ee3fa469da6ecffd1752e1",
"EndpointID": "63e61764bfcfab2ea0cc86ad347eae8700bb19b8586379e65fb1970773f8ba3f",
"Gateway": "172.17.0.1",
"IPAddress": "172.17.0.2",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "02:42:ac:11:00:02"
}
}
}

I teraz by z naszego komputera otworzyć na przykład panel administracyjny RabbitMQ wystarczy wejść na adres, który wyświetla się w Ports – w moim przypadku będzie to http://10.0.75.2:15762