Autor: Adam Trojnar

Spring Security

 JWT (JSON Web Token) jest otwartym standardem, który określa w jaki sposób ma przebiegać zabezpieczona transmisja informacji pomiędzy systemami. Informacje na ten temat zaszyfrowane są w JSON. Można podpisywać informacje za pomoc klucza (algorytm HMAC) lub klucza prywatnego i publicznego (RSA lub ECDSA).

Najlepszym źródłem do nauki JWT (JSON Web Token) jest oficjalna strona https://jwt.io/

src: Spring security part 3 : What is JWT? When and why should we use it?

Budowanie mikro serwisów -porady

W tej notce opisze kilka ciekawych rozwiązań, które ułatwiają pisanie, testowanie i  wsparcie obsługi mikro serwisów.

Odporne mikro serwisy (resilient microservces)

Kontrakty

Podejście typu: Consumer-Driven Contracts

Definicje:

Dostawca (Provider) -serwis, który wystawia API/ wysyła wiadomości

Konsument(Consumer) -serwis odbierający wiadomości od Producenta/nasłuchuje czy Producent nie wysyła wiadomości

Kontrakt jest umową pomiędzy producentem i konsumentem na temat tego w jaki sposób API . wiadomości wysyłane mają wyglądać (jaka ma być ich struktura)

Kontrakty możemy definiować na przykład w: WSDL, YML

Testy

 Piramida pokazująca jak powinna wyglądać ilość każdego z typów testów.

Testy kompatybilności wstecznej serwisu

Testy zmian w struktutrze bazy danych.

Wdrożenie aplikacji

Deployment pipline example with Spinnaker

Distributed Tracing

Logging

Kibana -Narzędzie do wyświetlania logów

Metrics and alerting

Zipkin pokazuje w jaki sposób serwisy komunikują się ze sobą.

src: 

  1. https://martinfowler.com/articles/consumerDrivenContracts.html
  2. „Building Resilient Microservices” wideo https://www.youtube.com/watch?v=5YaRDUVac9c

Java JDK 15 co nowego?

 Nowe wydanie Javy JDK 15 z 15 września 2020 zawiera wiele nowych ciekawych i poprawionych funkcji. 

JEP 339: Edwards-Curve Digital Signature Algorithm (EdDSA)

JEP 360: Sealed Classes (Preview) 
JEP 371: Hidden Classes 
JEP 372: Remove the Nashorn JavaScript Engine 
JEP 374: Disable and Deprecate Biased Locking 
JEP 375: Pattern Matching for instanceof (Second Preview) 
JEP 377: ZGC: A Scalable Low-Latency Garbage Collector 
JEP 378: Text Blocks 
JEP 379: Shenandoah: A Low-Pause-Time Garbage Collector J
EP 381: Remove the Solaris and SPARC Ports 
JEP 383: Foreign-Memory Access API (Second Incubator)
JEP 384: Records (Second Preview) 
JEP 385: Deprecate RMI Activation for Removal

Programowanie funkcyjne z użyciem Angulara i GraphQL

Programowanie funkcyjne na przykładzie aplikacji CRUD pobierającej listę krajów i szczegółowe informacje o krajach.

REST:
Pobieranie szczegółowych informacji o krajach
https://restcountries.eu/rest/v2Capital
Subregion
Timezones
Currencies
Translations

Aplikacja i kod źródłowy jest dostępna tutaj: https://stackblitz.com/edit/jssample?file=src%2Fapp%2Fapi.service.ts
src:

Git przydatne komendy do codziennej pracy

Git jest to narzędzie do zarządzania repozytorium kodu, nad którym pracujemy. Powszechnie używany system kontroli wersji. Wiele osób na co dzień wykorzystuje tylko podstawowe komendy jednak to narzędzie ma masę innych, które musimy znać i biegle używać aby wydajnie programować. 


 git rebase -i

Pojawi się notatnik z listą zmian. Słowo „squash” or „fixup” zamieniamy ze słowem pick, w miejscu wysłanej zmiany którą chcemy połączyć z ostatnią zmianą (na samej górze listy). 


git stash 

Stashowanie umożliwia zapisanie kodu, nad którym jeszcze pracujemy. Jest on na tyle niekompletny, że nie można go pokazać kolegom ale jednak chcemy go zachować lokalnie. Dzięki tej komendzie możemy zostawić jedną rzecz w trakcie i przeskoczyć do innej, która wymaga natychmiastowego naprawienia. Poniżej przykład użycia krok po kroku:

  1. Załóżmy, że mamy zmiany do zapisania aby sprawdzić jakie konkretnie wykonujemy komendę: git status
  2. Chcąc zapisać zmiany bez commitowania ich wykonujemy: git stash. Pojawi się komunikat:
  3. Twoje lokalne repozytorium jest teraz bez żadnych zmodyfikowanych plików. Możesz rozpocząć pracę nad innym zadaniem. Możesz pracować na głównej gałęzi, przełączać się między gałęziami, tworzyć nowe itd.
  4. Domyślnie rzeczy zestashowane są definiowane jako WIP czyli work in progress
Co zrobić aby wrócić do pracy, którą pozostawiliśmy w trakcie?
Git stash jest tylko tymczasowym miejscem do przechowywania zmian. W przypadku gdy jesteśmy gotowi do kontynuowania zmian wykonujemy komendę: git stash pop. Przywraca ostatnio zestashowane zmiany. 

Wyświetlanie listy zmian tymczasowych
Kiedy wykonasz komendę git stash system kontroli wersji Git utworzy obiekt z nazwą i zapisze go w lokalnym repozytorium. W celu wyświetlenia listy zapisanych rzeczy wykonujemy: git stash list. Wyświetli się lista zestashowanych rzeczy. 



Pozostałe przydatne komendy:

  • tools
  • init
  • local add, commit
  • what add means ?
  • git interlnals
  • git show
  • shortcuts
  • amend
  • unstage
  • unmodifing
  • tag
  • stash
  • bare repo
  • remotes
  • clone
  • branch
  • merge
  • diff
  • clean-up
  • fetch
  • rebase
  • configs
  • ignores
  • reflogs
  • interactive-rebase
  • bisect
  • revert
  • cherry-pick
  • gitflow

Tworzenie od zera nowego projektu Angular z użyciem CLI

Jednym ze sposobów utworzenia projektu Angular, który umożliwia utworzenie szkieletu projektów według zalecanego standardu.

Bardzo wygodne jest korzystaniez Angular CLI aby w szybki sposób mieć możliwość utworzenia struktury aplikacji:
npm install -g @angular/cli

Rozszerzona wersja.
Do utworzenia struktury nowej aplikacji Angular można wykorzystać polecenie z Nx toolkit. Na poczatek zainstalujmy pakiet Schematics:
npm install -g @nrwl/schematics

a następnie aby utworzyć projekt:
npm init nx-workspace


angular console

Uruchamianie projektu Angular

W celu uruchomienia projektu Angular musimy przejść do katalogu projektu:

cd nowy_projekt_angular

i uruchomić aplikację za pomocą polecenia

ng serve 

Jeżeli aplikacja poprawnie się uruchomi możemy przejść na adres: http://localhost:4200/
i zobaczymy informację, że aplikacja działa.

Wyjątki -informacje warte zapamiętania

W poście tym zebrałem informacje, które warto zapamiętać na temat wyjątków w Javie. Wyjątek wskazuje na to, że coś nieoczekiwanego zostało wykonane w programie. Metoda tego typu służy do zaprogramowania to w jaki sposób aplikacja ma na tego typu zachowanie reagować.

Wyjątki w naszym kodzie tworzymy za pomocą throw new exception()

Typy wyjątków

Errors

Rozszerzają klasę  java.lang.Error . Są wywoływane przez JVM. Programista nie powinien zajmować się obsługą błędów tego typu. Błędy z klasy Error są rzadkie, przykłady:
1. ExceptionInInitializerError
2. StackOverflowError
3. NoClassDefFoundError

UNCHECKED exception czyli  java.lang.RuntimeException

Subklasy dziedziczące po klasie java.lang.RuntimeException są wyjątkami typu UNCHECKED. Jest wywoływana przez programistę lub JVM. Jeżeli są wywoływane przez JVM to programista nie powinien zajmować się ich dodatkowa obsługą. W momencie gdy wystąpią w naszej aplikacji łatwiej będzie znaleźć kontekst ich wystąpiania. Popularne wyjątki:
    a. ArithmeticException
    b. ArrayIndexOutOfBoundsException
    c. ClassCastException
    d. IllegalArgumentException
    e. NullPointerException
    f. NumberFormatException
IllegalArgumentException oraz NumberFormatException są wyjątkami typowo wywoływanymi przez programistę, pozostałe są wywoływane przez JVM.

CHECKED exception czyli  java.lang.Exception 

Tego typu wyjątki zawierają wszystkie wyjątki typu java.lang.Exception
oprócz wyjątków typu RuntimeExceptionjava.lang.Exception  są wyjątkami typu CHECKED. Java wymaga aby wyjątki typu CHECKED były obsłużone w naszej aplikacji. Mogą zostać wywołane przez JVM lub programistę. Popularne wyjątki:
1. FileNotFoundException
2. IOException
Inne zasady warte zapamiętania:
1. W przypadku gdy wyrażenie try posiada wiele bloków typu catch może zostać wywołany jedynie ten jeden, który jest zadeklarowany wcześniej.W przypadku gdy występuje blok try i finally to finally ma większy priorytet i to on zostaje wywołany.
2. Kiedy metoda nadpisuje metodę w superklasie lub interfejsie nie można dodawać wyjątków typu Checked exception (java.lang.Exception). Nie można też w klasie dziedziczącej deklarować mniejszą ilość wyjątków
3. Wyjątki w metodach deklarujemy za pomocą słowa: throws.