DSP2017

Java Switch Case

Java Switch Case | Kurs Java

Switch case – Każdego dnia dokonujemy wyborów, które są podyktowane określonymi warunkami. Wyobraź sobie poranną sytuację, kiedy chcesz zrobić sobie śniadanie. Opcji masz naprawdę sporo: omlet, kanapka 🥖, jajecznica 🍳, tost itd. Najpierw jednak sprawdzasz, co tak naprawdę masz w lodówce – i to pomaga podjąć Ci ostateczną decyzję. Przy wielokrotnych wyborach w Javie warto sięgnąć po instrukcję switch case, ponieważ idealnie się do tego nadaje.

W tym materiale porozmawiamy o jednym z typów instrukcji warunkowych – switch case. Przedstawię Ci strukturę tej konstrukcji oraz dowiesz się jakie argumenty ona przyjmuje.

Java – Switch case – wprowadzenie

Z tego materiału dowiesz się:

  • Czym jest switch case?
  • Czym jest wartość domyślna w switch case?
  • Jak działa break w switch case?
  • Jakie argumenty przyjmuje switch case?
  • Co jest lepsze switch case czy if else?

Java – Switch case

Switch case to instrukcja wielokrotnego wyboru, dzięki której można warunkowo wykonać pewne fragmenty kodu.

Jest to swego rodzaju rozszerzenie instrukcji if else. Jednak od pierwowzoru różni się przede wszystkim typem przyjmowanych argumentów wejściowych, możliwością wykonania kilku bloków kodu i samą czytelnością zapisu.

Java – If else

W ramach tego materiału zajęliśmy się przede wszystkim instrukcją switch case – natomiast jeżeli chcesz poznać bliżej temat instrukcji if else zachęcam Cię do zapoznania się z poniższych materiałem: 

➡ ZOBACZ 👉: Instrukcja warunkowa IF ELSE

Java Switch Case – Podstawowa struktura

Switch nie jest typową instrukcją warunkową, a raczej swego rodzaju przełącznikiem. Przy jego pomocy można  „przełączyć” wykonywanie kodu aplikacji na różne tory w zależności od zaistniałej sytuacji.

 
int number = 1;
switch (number) {
    case 1:
        System.out.println("jeden");
}

Przykład powyżej prezentuje możliwie prostą konstrukcję Switch z jednym warunkiem Case. Jeżeli argument wejściowy będzie równy jeden (1), zostanie wyświetlony napis  „jeden”. W przeciwnym wypadku cały blok switch zostanie pominięty.

Java Switch Case – Warianty Case

W instrukcji Switch, w przeciwieństwie do If Else, nie określamy warunków, które muszą być spełnione, aby dany kod został wykonany. W przypadku tej instrukcji określamy wyrażenie wejściowe oraz warianty (ang. cases)  kodu, które mają być wykonane w zależności od jego wartości. Poszczególne warianty oznaczamy słowem kluczowym case, po którym następuje wartość obsługiwanego argumentu wejściowego i fragment przypisanego kodu do wykonania.

Ilość poszczególnych warunków Case jest dowolna.

 
int number = 1;
switch (number) {
}

switch (number) {
    case 1:
        System.out.println("jeden");
    case 2:
        System.out.println("dwa");
}

Java Switch Case Default – Wartość domyślna

Instrukcja Switch daje również możliwość określenia opcjonalnego wariantu domyślnego, który zostanie wywołany, jeżeli argument wejściowy nie zostanie dopasowany do żadnego warunku case.

 
switch (number) {
    case 1: {
        System.out.println("jeden");
    }

    default: {
        System.out.println("default");
    }
}

Wariant domyślny określamy słowem kluczowym default. Zazwyczaj taki warunek umieszcza się na samym końcu instrukcji switch, jednak nie jest to konieczne.

Java Switch Case – Instrukcja break

Poszczególne warianty case nie muszą być całkowicie niezależnymi fragmentami kodu i wcale nie muszą się wykluczać. Powinny być raczej rozumiane jako początkowe punkty wejścia do instrukcji switch.

Jeżeli aplikacja wejdzie do jakiegoś warunku case, to będzie wykonywała kaskadowo wszystkie kolejne bloki kodu.

switch case

Wykonywanie kolejnych bloków kończy się dopiero instrukcją break lub końcem całej instrukcji switch.

To właśnie dlatego kolejność poszczególnych bloków oraz odpowiednie umieszczenie instrukcji break ma zasadnicze znaczenie.

switch case break

 
switch (number) {
    case 1:
        System.out.println("jeden");

    case 2:
        System.out.println("dwa");
        break;

    default: {
        System.out.println("default");
    }
}

Powyższy przykład możemy rozbić na 3 sytuacje wg wartości zmiennej number:

  1. number == 1
    Zostanie wyświetlony napis ’jeden’ oraz ’dwa’ i dopiero wtedy zakończy się wykonanie kodu na instrukcji break;
  2. number == 2
    Zostanie wyświetlony tylko napis ’dwa’;
  3. W każdym innym wypadku zostanie wyświetlony napis ’default’;

Java Switch Case – Argument wejściowy

Java wymaga, aby wartości porównywane do zmiennej wejściowej (warunki case) były znane już podczas kompilacji.

W praktyce oznacza to, że nie mogą tam pojawić się:

  • zmienne,
  • metody zwracające wartość.

Porównywana zmienna musi być typu:

  • byte,
  • short,
  • char,
  • int,
  • Enum,
  • String,
  • jednym z klas osłonowych : Character, Byte, Short, Integer.

⚠️ Pamiętaj, że wartości null nie można przekazać jako argumentu do instrukcji switch. Jeżeli to zrobimy otrzymamy NullPointerException ⚠️

Java – Klasy osłonowe

W ramach tego materiału zajęliśmy się przede wszystkim instrukcją switch case – natomiast jeżeli chcesz poznać bliżej temat klas osłonowych, to zachęcam Cię do zapoznania się z poniższych materiałem: 

➡ ZOBACZ 👉: Klasy osłonowe / opakowujące

Switch case – Argumenty wejściowe – Wartości numeryczne

Jako wartości numeryczne rozumiany jest int oraz typy proste, które mogą być na niego zamienione: byte, short, char i ich klasy osłonowe.

 
byte number = 1;

switch (number) {
    case 1:
        System.out.println("jeden");
}

Java – Typy proste

W ramach tego materiału zajęliśmy się przede wszystkim instrukcją switch case – natomiast jeżeli chcesz poznać bliżej temat typów prostych, to zachęcam Cię do zapoznania się z poniższych materiałem: 

➡ ZOBACZ 👉: Typy proste

Switch case – Argumenty wejściowe – Typ wyliczeniowy enum

Wyrażenie switch w Javie bardzo dobrze współgra z typem wyliczeniowym enum.

 
enum Type {
    A, B, C
}
    
Type type = Type.A;
switch (type) {
    case A:
        break;
    case B:
        break;
    case C:
        break;
    default:
}

Jeżeli porównywana zmienna będzie pusta, otrzymamy wyjątek: java.lang.NullPointerException.

Java – Enum

W ramach tego materiału zajęliśmy się przede wszystkim instrukcją switch case – natomiast jeżeli chcesz poznać bliżej temat typu wyliczeniowego Enum, to zachęcam Cię do zapoznania się z poniższych materiałem: 

➡ ZOBACZ 👉: Java Enum

Switch case – Argumenty wejściowe – String

Java od wersji 7 dopuszcza również ciągi znaków (klasa String) jako argument wejściowy dla switch.

 
String v = "a";
switch (v) {
    case "a":
    case "b":
    case "c":
        break;
}

Java – String

W ramach tego materiału zajęliśmy się przede wszystkim instrukcją switch case – natomiast jeżeli chcesz poznać bliżej temat String’a, to zachęcam Cię do zapoznania się z poniższych materiałem: 

➡ ZOBACZ 👉: String – najważniejszy typ danych

Java – Switch vs If else

Kiedy wykorzystać Switch, a kiedy instrukcję If Else?

Nie ma jasno zdefiniowanych reguł o tym decydujących. Te dwie instrukcje są praktycznie wymienne i to czytelność kodu powinna zadecydować, z której z nich w danym momencie skorzystać.

Zazwyczaj dla prostych porównań lepiej sprawdza się instrukcja if, a dla bardziej rozbudowanych switch. W takich wypadkach nawet IDE podpowiada, by zamienić jedną konstrukcję na drugą.

Switch bardzo dobrze sprawdza się też w przypadku zmiennych typu enum.

 
// 1
if (number == 1) {
} else if (number == 2) {
} else if (number == 3) {
} else if (number == 4) {
} else if (number == 5) {
} else {
}

// 2
switch (number) {
    case 1:
        break;
    case 2:
        break;
    case 3:
        break;
    case 4:
        break;
    case 5:
        break;
    default:
        break;
}

Jeżeli jednak ilość warunków dalej się rozrasta, warto pomyśleć o przebudowaniu kodu, ponieważ przy dużej ilości warunków, niezależnie czy będzie to switch, czy if, kod będzie zwyczajnie nieczytelny.

Java – Switch Expression

Z każdą kolejną wersją Javy pojawiają się różne ulepszenia. Switch case również doczekał się tuningu i tak od wersji JDK 12 (potem jeszcze ulepszonego w JDK 13) dostępny jest tzw. switch expression.

Co wprowadza switch expression?💡

  • operator -> zamiast dwukropka,
  • brak słowa kluczowego break (wyrażenie switch nie przechodzi przez przypadki),
  • możliwość większej ilości przypadków w jednym case – przypadki odgraniczone są wtedy przecinkami,
  • możliwość przypisania wyniku switch’a do zmiennej.
 
String season = switch (month) {
case APRIL, MAY, JUNE -> "Spring";
case JULY, AUGUST, SEPTEMBER -> "Summer";
case OCTOBER, NOVEMBER, DECEMBER -> "Autumn";
case JANUARY, FEBRUARY, MARCH -> "Winter";
default -> "Not a season";
};

Switch expression jest przyjemnym odświeżeniem konstrukcji switch. Jednak nie stoi na przeszkodzie używania ciągle klasycznej wersji switch case.  Przy bardziej rozbudowanych przypadkach, switch expression nadaje większej czytelności i zdecydowanie zmniejsza ilość linii kodu w porównaniu do zastosowania klasycznego switch’a.

 
String season1;
switch (month) {
    case APRIL:
    case MAY:
    case JUNE:
        season1 = "Spring";
        break;
    case JULY:
    case AUGUST:
    case SEPTEMBER:
        season1 = "Summer";
        break;
    case OCTOBER:
    case NOVEMBER:
    case DECEMBER:
        season1 = "Autumn";
        break;
    case JANUARY:
    case FEBRUARY:
    case MARCH:
        season1 = "Winter";
        break;
    default:
        season1 = "Not a season";
};

Java – Switch Expression – yield

Od JDK 14 pojawia się słowo kluczowe yield. Jest to słowo, które można powiedzieć, że jest połączeniem break i return. Yield przerywa wykonywanie switch’a, jednocześnie zwracając wartość.

Yield jest również przydatny w sytuacji, w której po wejściu do danego warunku chcemy wykonać bardziej złożony blok kodu, w którym na końcu chcemy zwrócić wartość.

String season = switch (month) {
case APRIL, MAY, JUNE -> "Spring";
case JULY, AUGUST, SEPTEMBER -> "Summer";
case OCTOBER, NOVEMBER, DECEMBER -> "Autumn";
case JANUARY, FEBRUARY, MARCH -> {
String nameOfMonth = month.name();
yield nameOfMonth + " is the Winter month";
}
default -> "Not a season";
};

Java – Switch case – podsumowanie

W ramach tego materiału dowiedzieliśmy się, czym jest instrukcja warunkowa switch case. Bliżej poznaliśmy konstrukcję tej instrukcji warunkowej i typy argumentów jakie przyjmuje. Jeżeli chcesz kontynuować swoją przygodę z Javą i poznać inne struktury, które oferuję ten język programowania – to zapraszam do kolejnego tematu z serii o Javie. Przedstawię Ci typ wyliczeniowy – enum.

➡ ZOBACZ 👉: Java enum

Kierunek Java

W serii o Javie zapoznajesz się z podstawowymi tematami o Javie. Jeżeli chcesz bardziej kompleksowo zagłębić się w temat Javy, poczytać, posłuchać o Javie, to zachęcam Cię do zapoznania się z moim kursem „Kierunek Java”:

➡ ZOBACZ 👉: Kierunek Java

2 komentarze
Share:
IF ELSE

Instrukcja warunkowa IF ELSE | Kurs Java

Instrukcje warunkowe if – Jeśli dzisiaj jest niedziela tzn. że jest weekend, a co jeśli nie ? Trzeba iść do pracy. Jak często zadajesz sobie pytanie Jeśli coś … to? Jeśli mam wystarczająco pieniędzy 💰 to .. Jeśli jutro będzie ładna pogoda ☀️ to … W Javie takie konstrukcje to tzw. instrukcje warunkowe, które pozwalają wykonywać fragmenty kodu w zależności czy podany warunek jest prawdą, czy nie.

W tym materiale przedstawię Ci zagadnienie instrukcji warunkowych. Poznasz bliżej instrukcje if i jej różne warianty.

Java – If – wprowadzenie

Z tego materiału dowiesz się:

  • Czym jest instrukcja warunkowa?
  • Jak działa if?
  • Jak działa if else?
  • Jak działa else?
  • Czym jest zagnieżdżona instrukcja warunkowa?
  • Jak działa operator ternary?

Java – Instrukcje warunkowe (ang. conditional statements)

Instrukcje warunkowe IF ELSE to konstrukcja języka, dzięki której można rozwidlić ścieżkę wykonywania programu.

Przy jej pomocy możemy określić warunki, jakie mają zajść, żeby dany fragment kodu został wykonany.

W wolnym tłumaczeniu można przeczytać ją jako:
jeżeli zajdzie pewien warunek, to zrób 'to’, w przeciwnym wypadku zrób 'tamto’.

Java – If

Instrukcja if to podstawowa i najprostsza instrukcja warunkowa. Jej działanie polega na wykonaniu kodu z jej ciała, jeżeli warunek został spełniony lub ich pominięciu w przeciwnym wypadku.

java if instrukcje warunkowe

 
if (10 > 0) {
    System.out.println("+");
}

W tym konkretnym wypadku, ponieważ 10 jest większe od 0, na ekranie zostanie wyświetlony plus (+).

Warunek w instrukcji if to dowolne wyrażenie, które wylicza się do wartości typu boolean.

Java – Else

Instrukcja else określa fragment kodu wykonywany alternatywnie, jeżeli żaden z wcześniejszych warunków nie został spełniony.

java if else instrukcje warunkowe

 
if (number == 0) {
    System.out.println("0");

} else {
    System.out.println("");
}

Ten fragment kodu wyświetli zero (0), jeżeli liczba jest równa zero, a w przeciwnym wypadku pusty ciąg znaków.

Blok else jest opcjonalny, ale jeżeli już wystąpi, to może być tylko jeden.

Java – Else If

Rozwinięciem podstawowej instrukcji if jest instrukcja else if.

Dzięki niej można określić szereg opcjonalnych warunków oraz określić, co się wtedy ma wydarzyć.

java else if instrukcje warunkowe

 
int number = 10;

if (number > 0) {
    System.out.println("+");

} else if (number < 0) {
    System.out.println("-");

} else if (number == 0) {
    System.out.println("0");
}

Powyższy kod wyświetli :

  • plus (+) jeżeli liczba jest większa od zera;
  • minus (-) jeżeli mniejsza;
  • zero (0) jeżeli równa 0.

Kolejne warunki w instrukcji else if są sprawdzane po kolei aż do momentu, gdy któryś z nich nie zwróci prawdy (true). Wykonywany jest wtedy przypisany mu fragment kodu. Pozostałe warunki, nawet jeżeli byłyby prawdziwe, nie będą nawet sprawdzane.

Ilość bloków else if jest dowolna.

Java – Zagnieżdżony if (ang. Nested if statement)

Możliwe jest również użycie instrukcji if lub jakiejkolwiek jej wariacji wewnątrz innej instrukcji if. Nazywa się to zagnieżdżoną instrukcją if. Zalecam jednak stosowanie instrukcji zagnieżdżonych z rozwagą, ponieważ pogarszają one czytelność kodu.

 
if (number < 30) {
   if (number % 2 == 0) {
     System.out.println("Liczba parzysta: " + number);
    } else {
  System.out.println("Liczba nieparzysta: " + number);
   }
} else {
   System.out.println("");
}

Java – Operator Ternary

Operator ternary to skondensowana forma instrukcji if-else, która jednocześnie sprawdza warunek i zwraca wartość.

Operator ternary, przyjmuję trzy argumenty:

wyrażenie boolean ? wyrażenie 1 : wyrażenie 2

  1. Pierwszy argument musi być wyrażeniem boolean,
  2. drugi i trzeci argument może być dowolnym wyrażeniem zwracającym jakąś wartość.

Konstrukcja ta zwraca „wyrażenie 1”, jeśli „wyrażenie boolean” zwraca prawdę, w przeciwnym wypadku zwraca „wyrażenie 2”.

Przykładowo poniższą instrukcję warunkową:

int number = 10;
String typeOfNumber = "";

if (number%2==0) {
typeOfNumber = „Liczba parzysta”;
}
else {
typeOfNumber = „Liczba nieparzysta”;
}

Można zastąpić operatorem ternary:

String typeOfNumber = number%2==0 ? „Liczba parzysta” : „Liczba nieparzysta”;

Nie jest możliwe zastąpienie każdej konstrukcji if-else operatorem ternary. Jednak gdy jest taka możliwość, warto z niego skorzystać, ponieważ jak pokazuje powyższy przykład, zmniejsza on znacznie ilość linii kodu oraz zwiększa czytelność.

Java – If – podsumowanie

W ramach tego materiału dowiedzieliśmy się, czym jest instrukcja warunkowa. Bliżej poznaliśmy konstrukcję if i jej wariacje oraz operator ternary. Jeżeli chcesz kontynuować swoją przygodę z Javą i poznać inne struktury, które oferuję ten język programowania – to zapraszam do kolejnego tematu z serii o Javie. Zapoznasz się z kolejną instrukcją warunkową – switch case.

➡ ZOBACZ 👉: Java Switch Case

Kierunek Java

W serii o Javie zapoznajesz się z podstawowymi tematami o Javie. Jeżeli chcesz bardziej kompleksowo zagłębić się w temat Javy, poczytać, posłuchać o Javie, to zachęcam Cię do zapoznania się z moim kursem „Kierunek Java”:

➡ ZOBACZ 👉: Kierunek Java

No comments
Share:
Pętla for, while, do while

Pętla (for, while, do while, foreach) pętle | Kurs Java

Pętle (ang. loops) – Wyobraź sobie sytuację, w której musisz odświeżyć dane wszystkich uczniów w szkole 🏫. Mogą to być nawet setki uczniów 👩‍🎓👨‍🎓 – a co jeżeli jakiś uczeń odejdzie ze szkoły? A może ktoś nowy przeniesie się z innego miasta 🏢? Brzmi jak syzyfowa praca 🤯, i to w dodatku podatna na błędy… Nie zachęca? Całe szczęście, że Java oferuję różne pętle ➿ – narzędzie, które pozwala wykonać fragment kodu określoną ilość razy.

W tym materiale poopowiadam Ci o pętlach. Dowiesz się o dostępnych rodzajach pętli i sposobach ich przerywania.

Java – Pętle – wprowadzenie

Z tego materiału dowiesz się:

  • Czym jest pętla?
  • Jak działa pętla while?
  • Jak działa pętla do while?
  • Jak działa pętla for?
  • Jak działa pętla for each?
  • Jak działają słowa kluczowe break i continue?
  • Czym jest nieskończona pętla?
  • oraz – dlaczego pętle są podstawowym narzędziem programisty.

Java – Pętla (ang. loop)

Pętle są jednym z podstawowych narzędzi ⚒️ wykorzystywanych przez programistę. Dzięki nim można wywołać określoną funkcjonalność podaną ilość razy, zamiast za każdym razem wywoływać ją ręcznie.

Przykładowo, zamiast wypisywać kolejno dni tygodnia w 7 instrukcjach, możemy wykorzystać do tego pętlę. W przypadku tygodnia mamy tylko 7 instrukcji, ale gdybyśmy chcieli wyświetlić dni z miesiąca, roku albo nawet kilku lat? W takich sytuacjach pętle okazują się niezrównane.

 
System.out.println("Poniedziałek"); 
System.out.println("Wtorek"); 
System.out.println("Środa"); 
System.out.println("Czwartek"); 
System.out.println("Piątek"); 
System.out.println("Sobota"); 
System.out.println("Niedziela"); 

Java – Rodzaje pętli

W Javie mamy do dyspozycji kilka rodzajów pętli:

  • while,
  • do while,
  • for,
  • foreach.

Funkcjonalność wszystkich jest wymienna, a decyzja, którą należy użyć w danym momencie, zależy głównie od kontekstu, w jakim ma być wykorzystana oraz od preferencji programisty.

Java – Pętla while (ang. while loop)

Pętlę while najczęściej wykorzystuję się, gdy nie można określić konkretnej ilości powtórzeń do wykonania. Znane są nam jednak warunki określające, jak długo dana sytuacja będzie zachodziła. Przykładowo: „dopóki licznik nie przekroczy zakresu tablicy, wypisz jej kolejny element”. Pętla jest wykonywana tak długo, póki warunek jest spełniony. Jeżeli warunek od początku nie będzie spełniony, taka pętla nie zostanie wywołana ani razu.

java pętla java loop java while loop

String[] days = {"Poniedziałek", "Wtorek", "Środa", "Czwartek", "Piątek", "Sobota", "Niedziela"};

int index = 0;
while (index < days.length) {
    System.out.println(days[index]);
    index++;
}

Na przykładzie widać, że najpierw została zadeklarowana tablica przechowujące wszystkie dni tygodnia oraz zmienna pomocnicza index przechowująca aktualnie wyświetlany klucz z tablicy. W zmiennej days.length przechowana jest ilość elementów tablicy, czyli w tym wypadku 7.

W pierwszym kroku sprawdzany jest warunek pętli (czy indeks jest mniejszy od rozmiaru tablicy), jeżeli tak, to wyświetlany jest element z tego indeksu, a sam indeks jest zwiększany o 1. Następnie znowu sprawdzany jest warunek pętli i tak dalej, aż do momentu niespełnienia warunku.

Java – Pętla do while (ang. do while loop)

Pętla do while jest to modyfikacja pętli while. Głowna różnica polega na tym, że ciało pętli zostanie wykonane przynajmniej raz, nawet jeżeli warunek zawsze jest niespełniony. Najpierw wykonywane są instrukcje zdefiniowane wewnątrz pętli, a dopiero potem sprawdzany jest jej warunek.

java do while loop pętla

int index = 0;
do {
    System.out.println(days[index]);
    index++;
} while (index < days.length);

Przykład powyżej realizuje to samo zadanie co poprzednio pętla while. Tym razem najpierw wywoływane jest ciało pętli, a dopiero potem sprawdzany jest jej warunek.

Warto zwrócić uwagę, że po warunku pętli niezbędny jest średnik, o którym na początku często się zapomina.

Java – Pętla for (ang. foor loop)

Pętla for zazwyczaj wykorzystywana jest, gdy z góry znamy ilość wykonania kolejnych iteracji pętli.
Jej schematyczny zapis wygląda w ten sposób:

for([inicjalizacja]; [warunek]; [modyfikacja]){
[ciało pętli – instrukcje do wykonania] }

Wszystkie cztery elementy pętli są opcjonalne, jednak dla wygody i czytelności kodu warto z nich korzystać.

  1. inicjalizacja – służy do zainicjowania zmiennych początkowymi wartościami, np. utworzenie i zainicjowanie licznika;
  2. warunek – w warunku należy sprawdzić, czy ciało pętli ma być wykonane;
  3. modyfikacja – ten element pętli jest wykonywany po ciele funkcji, można tu np. zmodyfikować licznik pętli;
  4. ciało pętli – czyli wszystkie instrukcje, które chcemy, żeby były wykonane określoną ilość razy;

java for loop pętlaNa listingu poniżej pokazane są dwa przykłady z wykorzystaniem pętli for. W pierwszym wykorzystano wszystkie elementy pętli, w drugim natomiast wszystkie instrukcje zostały umieszczone w ciele pętli. Oba przykłady podobnie jak poprzednie realizuję to samo zadanie i różnią się głównie czytelnością.

// 1
for (int index = 0; index < days.length; index++) {
System.out.println(days[index]);
}

// 2
int index = 0;
for (;;) {
if (index < days.length) {
System.out.println(days[index]);
index++;
} else {
break;
}
}

Java – Pętla foreach (ang. foreach loop)

Pętla for each jest modyfikacją pętli for. Za jej pomocą w bardzo prosty i czytelny sposób można przeglądać wszystkie elementy różnych zbiorów, np. tablic.

Pętlę można przeczytać jako: „dla każdego elementu tablicy zrób coś…”.

foreach loop java pętla foreach

for (String day : days) {
System.out.println(day);
}

Na przykładzie widać jak dla każdego elementu tablicy tworzona jest zmienna lokalna: day. Dzięki wykorzystaniu tego rodzaju pętli kod uprościł się o licznik oraz o warunek sprawdzający rozmiar pętli.

Java – Polecenia break i continue

Korzystając z pętli, czasami zachodzi potrzeba ominięcia wykonywania danej iteracji lub przerwanie całej pętli. W takim przypadku z pomocą przychodzą nam dwie instrukcje: break oraz continue.

  • continue – kończy wykonywanie aktualnej iteracji pętli. Jeżeli warunek w pętli będzie dalej spełniony, aplikacja przejdzie do wykonywania dalszych iteracji.

java loop foreach do while for while loop continue

  • break – po wykonaniu instrukcji break kończone jest wykonywanie aktualnej iteracji oraz całej pętli. Niezależnie od wartości warunku pętli kolejna iteracja nie będzie już wykonana – warunek pętli nie będzie w tym wypadku już nawet sprawdzany.

java loop foreach do while for while loop break

for (int i = 1; i <= 10; i++) {
if (i % 2 == 0) {
continue;
}
if (i >= 5) {
break;
}
System.out.println(i);
}

Fragment kodu przedstawia pętlę for z licznikiem i o wartościach od 1 do 10 oraz dwoma warunkami w ciele pętli.

  1. Pierwszy warunek: i % 2 == 0 sprawdza, czy licznik jest parzysty, jeżeli tak, kończy wykonywanie aktualnej iteracji.
  2. Drugi warunek: i >= 5 sprawdza, czy licznik nie przekroczył liczby 5, jeżeli tak, kończy wykonywanie całej pętli.

Podsumowując, przedstawiony przykład wyświetla liczby nieparzyste od 1 do 10, ale nie większe niż 5, czyli program wyświetli tylko liczbę: 1 i 3.

Java – Nieskończona pętla (ang. infinite loop)

Pętle to super narzędzie, jednak chcę przestrzec Cię ⚠️ przed błędem, który może wydać się banalny, ale w skutkach już taki nie jest.

⚠️ Korzystając z pętli, trzeba uważać, określając warunki zakończenia wykonywania iteracji. Jeżeli zrobimy to niewłaściwie, możemy otrzymać nieskończoną pętlę ♾️.⚠️

// 1
while (true) {
}

// 2
for (;;) {
}

// 3
int i = 0;
while (i > 10) {
}

Powyższy kod nigdy nie zakończy swojego działania i doprowadzi do zawieszenia się aplikacji.

Java – Pętle – podsumowanie

W ramach tego materiału dowiedzieliśmy się, czym są pętle. Bliżej poznaliśmy ich różne rodzaje  oraz dwa istotne słowa kluczowe: break i continue . Jeżeli chcesz kontynuować swoją przygodę z Javą i poznać inne struktury, które oferuję ten język programowania – to zapraszam do kolejnego tematu z serii o Javie. Przedstawię Ci instrukcję warunkową „if” i jej różne wariacje.

➡ ZOBACZ 👉: Instrukcja warunkowa IF ELSE

Kierunek Java

W serii o Javie zapoznajesz się z podstawowymi tematami o Javie. Jeżeli chcesz bardziej kompleksowo zagłębić się w temat Javy, poczytać, posłuchać o Javie, to zachęcam Cię do zapoznania się z moim kursem „Kierunek Java”:

➡ ZOBACZ 👉: Kierunek Java

5 komentarzy
Share:
React Native vs Ionic

Ionic vs React Native -> StormSnapshot #5

Jako podsumowanie artykułów wprowadzających do React Native oraz Ionic przygotowałem zbiorcze porównanie tych technologii. Pomoże mi to podjąć decyzję, która z nich lepiej będzie nadawała się do projektu StormSnapshot.

Wybór nie jest łatwy, ponieważ oba rozwiązania spisały się bardzo dobrze i z powodzeniem można by je wykorzystać do dalszego rozwijania projektu.

Żeby decyzja była bardziej wiarygodna, wróćmy na chwilę do tekstu: mobilne aplikacje hybrydowe i prześledźmy kolejno zebrane wtedy wymagania.

Stos technologiczny

  • Ionic: Angular, Apache Cordova, HTML, JavaScript, CSS
  • React Native: React, HTML, JavaScript

Oba frameworki wykorzystują bardzo popularne i sprawdzone technologie. To, które rozwiązanie wybrać, to raczej kwestia indywidualnych preferencji oraz posiadanych już umiejętności.

Na korzyść pierwszego przemawia prostota stylowania, za sprawą wykorzystania istniejących standardów webowych. Natomiast dzięki Reactovi otrzymujemy w pełni natywną aplikację.

W tym starciu nie ma jednoznacznego zwycięzcy.

Wydajność aplikacji

Ponieważ Ionic wykorzystuje wbudowaną przeglądarkę, a React Native generuje natywną aplikację, spodziewałem się dość wyraźnych różnic w prędkości działania wynikowego produktu.

Sam moment uruchomienia aplikacji w przypadku natywnej aplikacji jest znacząco krótszy. Na testowanym telefonie (LG G3) była to aż ponad dwukrotna różnica (2 s. natywna i 5 s. webview).

Jednak już podczas samego działania aplikacji obu technologiom nie miałem nic do zarzucenia. W obu przypadkach aplikacja chodziła płynnie i nie przycinała się.

W tym starciu jednak wygrywa React Native.

Szybkość i prostota developmentu

Obie technologie wychodzą z całkowicie innych założeń.

  • W przypadku Ionic z założenia piszemy jedną aplikację, która będzie działała na wszystkich obsługiwanych systemach.
  • W przypadku React Native dostajemy technologię, przy pomocy której możemy pisać aplikacje na różne systemy. Dzięki jednej spójnej technologii znaczna część kodu może być współdzielona.

Podejście React Native wymaga trochę więcej wysiłku, jednak pozwala lepiej dopasować aplikacje do specyficznych funkcjonalności na danej platformie.

Ponieważ frameworki realizują to wymaganie w całkowicie inny sposób, nie można ich w prosty sposób porównać.

Prostota debugowania i testowania aplikacji

  • Ionic: Bezproblemowe i bardzo szybkie debugowanie zmian z poziomu przeglądarki. W moim odczuciu ogromny plus za możliwość edytowania wyglądu aplikacji w locie.
  • React Native: Ponieważ kod aplikacji jest kompilowany do natywnej wersji, testowanie zmian jest trochę utrudnione. Jednak dzięki zastosowaniu hotdeployu komponentów, nie stanowi to aż tak dużego problemu.

W tym starciu nieznacznie wygrywa Ionic.

Możliwość dopisania własnych komponentów

Oba rozwiązania dają możliwość dopisania własnych niestandardowych pluginów. Nie testowałem jednak tego w przykładowych aplikacjach.

Społeczność

W obu przypadkach za projektem stoi bardzo silna i dynamiczna społeczność. Baza dostępnych pluginów jest tak duża, że z powodzeniem można w niej znaleźć większość potrzebnych dodatków.

Dla obu stron ogromny plus.

Ogólne odczucia

Mimo iż z obu technologii korzystało mi się dobrze, React Native sprawiał wrażenie rozwiązania dużo bardziej dopracowanego. Poczynając od samej instalacji, do developmentu i debugowania aplikacji, odniosłem wrażenie, że w technologi od Facebooka wszystko jest dobrze dopieszczone i działa tak, jak powinno.

Podsumowanie React JS vs Ionic: który wybrać?

Niewątpliwie obie technologie stoją na bardzo wysokim poziomie i z czystym sumieniem mogę polecić obie.

Rozwiązania wykorzystują całkowicie inne założenia i inne technologie, dlatego mogą lepiej sprawdzić się w różnych projektów. W moim przypadku decyduję się na dalsze rozwijanie projektu StormSnapshot z wykorzystaniem React Native.

Linki

No comments
Share:
Ionic pierwsza aplikacja

Ionic pierwsza aplikacja -> StormSnapshot #4

Ostatecznie, po dość nierównej walce (więcej na ten temat możesz przeczytać we wpisie: CO ROBIĆ, gdy nic nie działa i wszystko się wali!?) zapraszam do lektury artykułu o Ionic Framework.

Podobnie jak we wcześniejszym tekście o React Native zamierzam przeprowadzić Cię krok po kroku przez przygotowanie niezbędnego środowiska oraz development przykładowej aplikacji, demonstrującej możliwości biblioteki.

Ionic

Ionic to kompletne SDK do wytwarzania mobilnych aplikacji hybrydowych. Biblioteka zbudowana jest z wykorzystaniem znanych technologii, takich jak: AngularJS oraz Apache Cordova.

Mimo iż aplikacje pisane są z wykorzystaniem HTML, JavaScript i CSS, to jako mobilne aplikacje hybrydowe mogą być dystrybuowane jak każda inna aplikacja natywna.

Ionic vs PhoneGap

No dobrze, ale skoro Ionic wykorzystuje PhoneGap, to czemu nie korzystać z samego PhoneGap?

Decydując się na Ionic, dostajemy nie tylko narzędzie do budowania aplikacji hybrydowych, ale również gotowe biblioteki JavaScript i cały zbiór stylów definiujących ostateczny wygląd.

Sprawia to, że powstały produkt wyglądem jest bardziej zbliżony do aplikacji natywnych, a my nie musimy zaczynać projektu całkowicie od zera. Chcąc osiągnąć podobny efekt korzystając tylko z Apache Cordova, na starcie trzeba by włożyć sporo więcej pracy.

Instalacja Ionic

Do instalacji niezbędnych komponentów skorzystamy z menagera pakietów npm, który zainstalowaliśmy już przy konfiguracji środowiska dla React Native.

Przy jego pomocy instalujemy pakiety Cordova i Ionic:

npm install -g cordova ionic

Warto również sprawdzić, czy nodejs oraz npm są aktualne. Niestety niezgodność wersji może powodować dość dziwne błędy. Ja doinstalowałem również pakiety: reflect-metadataangular-cli.

Całe proces instalacji można prześledzić w dokumentacji: Installing Ionic and its Dependencies.

Pierwszy projekt Ionic

Przy pomocy wiersza poleceń generujemy strukturę przykładowej aplikacji.

sudo ionic start IonicSampleProject tabs --v2

Na ten moment domyślnie generowany jest projekt w wersji Ionic 1 dlatego, żeby wymusić korzystanie z wersji 2 koniecznie jest dodanie argumentu: –v2.

Aplikacja generowana jest na podstawie predefiniowanych szablonów. Domyślnie mamy do wyboru: tabs, sidemenu oraz blank.

Więcej o szablonach oraz samym generowaniu projektu przeczytasz w rozdziale: Starting an Ionic App.

Struktura projektu Ionic

Struktura projektu jest zbliżona do czystego projektu Apache Cordova. Projekt poza głównym plikiem config.xml zawiera również pliki konfiguracyjne specyficzne dla Ionic.

Ionic struktura projektu

Ionic struktura projektu

./src/index.html

Plik index.html to główny punkt wejścia do aplikacji. Z jego poziomu załączone są wszystkie pliki niezbędne do działania kodu z PhoneGap oraz uruchamiany jest główny komponent Ionic, ładujący całą aplikację:

<ion-app></ion-app>

Uruchomienie i testowanie aplikacji Ionic

Ponieważ aplikacja jest specyficzną stroną www, można ją uruchomić w zwykłej przeglądarce internetowej.

W tym celu skorzystamy z wbudowanego serwera. Z poziomu katalogu projektu uruchamiamy poniższą komendę:

ionic serve

W zależności od wybranego wcześniej szablonu, w przeglądarce możemy zobaczyć np. taki widok.

Ionic pierwsza aplikacja

Ionic pierwsza aplikacja

Uruchomienie aplikacji na emulatorze i urządzeniu fizycznym

Przed uruchomieniem aplikacji na konkretnej platformie, musimy najpierw dodać ją do projektu.

ionic platform add android

Po tym kroku projekt można już spokojnie zbudować i przetestować jego działanie na emulatorze lub na fizycznym urządzeniu.

ionic run android
Ionic emulator

Ionic emulator

Aplikacja

Aplikacja realizująca zbliżone funkcjonalności do tej napisanej w React Native. Dla przypomnienia: mamy 3 widoki:

  • ekran powitalny;
  • lista przechowująca wiele elementów;
  • lista generowana na podstawie kanału RSS;

Nawigacja w aplikacji

Ponieważ skorzystałem z szablonu tabs, znaczna część pracy była już gotowa.

Ionic zakładki

Ionic zakładki

Całość logiki aplikacji podzielona jest na strony, które są przechowywane w katalogu: src/pages.

Przejściami między poszczególnymi stronami zarządza sekcja tabs, a tag <ion-tabs /> generuje menu widoczne w dole aplikacji.

Kod każdej ze stron podzielony jest na 3 pliki:

  • *.html
    szablon zawierający tagi Ionic i HTML
  • *.scss
    style Sass
  • *.ts
    plik TypeScript zawierający właściwą logikę

Stylowanie [Sass – syntactically awesome stylesheets]

Stylowanie aplikacji niewiele różni się od pracy ze zwykłą stroną. Do dyspozycji mamy rozszerzoną składnię Sass, co w praktyce sprawia, że osoba znająca przynajmniej podstawy CSS nie powinna mieć najmniejszych problemów z tym zadaniem.

Poszczególne pliki SCSS są kompilowane i dołączane w wynikowej formie do aplikacji.

Jest to ogromny plus tej technologii. Wygląd można edytować w czasie rzeczywistym, np. korzystając z Google Chrome Developer Tools i dopiero po uzyskaniu zamierzonego efektu nanieść zmiany na kod aplikacji.

Lista danych

Ionic lista danych

Ionic lista danych

Listę danych przygotowałem z wykorzystaniem komponentu ion-list. W tym celu w pliku z szablonem (list.html) dodajemy tag: ion-list oraz w pętli wyświetlamy wszystkie elementy tej listy.

<ion-content>
  <ion-list>
    <ion-list-header>List</ion-list-header>
    <ion-item *ngFor="let item of items">
      <h2>{{item.title}}</h2>
    </ion-item>
  </ion-list>
</ion-content>

Wykorzystaną w szablonie zmienną: items trzeba jeszcze zadeklarować w pliku komponentu (list.ts)

import { Component } from '@angular/core';
import { NavController } from 'ionic-angular';

@Component({
  selector: 'page-list',
  templateUrl: 'list.html'
})
export class ListPage {

  items : any;

  constructor(public navCtrl: NavController) {
      this.items = [];
      for(let i=0; i<100; i++){
        let item = {
            title: 'Row item numer : ' + i
          };
        this.items.push(item);
      }
  }
}

RSS – pobranie danych z Internetu

Do samego wyświetlenia danych, podobnie jak w przypadku zwykłej listy, wykorzystałem komponent: ion-list. W pliku szablonu deklarujemy tagi jak poprzednio i przechodzimy do pliku z TypeScript, żeby zasilić listę danymi.

constructor(public navCtrl: NavController, public http: Http) {
    this.http.get('https://stormit.pl/feed').map(res => res.text()).subscribe(data => {
        this.parseXML(data).then((data) => {
            this.items = data
        });
    });
}

Samo pobranie danych z Internetu jest stosunkowo proste. Korzystamy w tym celu ze standardowego komponentu Angulara: HTTP oraz metody map.

Obie metody trzeba jeszcze załączyć do naszego pliku poniższymi importami.

import { Http } from '@angular/http';
import 'rxjs/add/operator/map';

Parsowanie XML [xml2js]

Do parsowania pobranego pliku XML skorzystamy z zewnętrznej biblioteki: xml2js.

Bibliotekę trzeba najpierw doinstalować, a potem dołączyć do projektu:

npm install xml2js
import xml2js from 'xml2js';

Następnie przy jej pomocy można napisać już właściwą metodę parsującą dane.

parseXML(data) {
    return new Promise(resolve => {
        var arr = [],
            parser = new xml2js.Parser({
                trim: true,
                explicitArray: true
            });

        parser.parseString(data, function(err, result) {
            for (let i in result.rss.channel[0].item) {
                var item = result.rss.channel[0].item[i];
                arr.push({
                    title: item.title[0]
                });
            }

            resolve(arr);
        });
    });
}

Ionic Proxy i No 'Access-Control-Allow-Origin’

Testując aplikację lokalnie, np. z wykorzystaniem ionic serve, można wygenerować błąd typu CORS. Ponieważ aplikacja jest uruchamiana w wewnętrznej przeglądarce (serwer localhost), w ramach bezpieczeństwa, żądania ajax do innych domen są blokowane.

XMLHttpRequest cannot load https://stormit.pl/feed. Redirect from 'https://stormit.pl/feed' to 'https://stormit.pl/feed/' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:8100' is therefore not allowed access.

Można to obejść na dwa sposoby:

  1.  Zmieniając ustawienia bezpieczeństwa np. przez dodanie na serwerze hostującym usługę odpowiedniego nagłówka http.
  2. Skorzystać z lokalnego serwera proxy.

Ja skorzystałem z proxy. Całe szczęście mamy do tego przygotowany już gotowy mechanizm.

Wystarczy zrobić dwie rzeczy:

  • w głównym pliku konfiguracyjnym: ionic.config.json dodać odpowiedni wpis mapujacy lokalny adres na zewnętrzną domenę;
  • oraz w kodzie aplikacji podmienić wszystkie wywołania na adres proxy, w tym wypadku będzie to: http://localhost:8100/rss.
"proxies": [
  {
    "path": "/rss",
    "proxyUrl": "https://stormit.pl/feed"
  }
]

Żeby co chwilę nie zmieniać adresów usługi, najlepiej przenieść je do stałych i ich wartość uzależnić od tego, czy aplikacja jest uruchamiana testowo, czy już produkcyjnie.

Obsługa błędów i debugowanie

Do debugowania można wykorzystać konsolę z Google Chrome, a sam framework udostępnia również fajne wsparcie do wyświetlania błędów z aplikacji.

Ionic błąd

Ionic błąd

Podsumowanie

Ionic już na samym starcie dość mocno mi dokuczył. Jednak dla mnie dużo większe znaczenie ma to, jak z danej technologii się korzysta, a nie to jak ją się instaluje.

Tutaj Ionic zdecydowanie nadrobił początkowe straty. Nie miałem najmniejszych problemów ze zrealizowaniem wszystkich zamierzonych funkcjonalności.

Sam proces developmentu jest dość prosty i przyjemny. Dużym plusem szczególnie na starcie jest możliwość edytowania szablonów i stylów bez konieczności nauki dodatkowych technologii.

Technologia świetnie się sprawdza szczególnie dla małych projektów, ponieważ dzięki wbudowanym szablonom lub korzystając z kreatora bardzo szybko można przygotować proste widoki i funkcjonalności.

Aplikacja na testowych danych działała płynnie i nie przycinała się. Nie odbiegała jakością działania od innych programów zainstalowanych na moim telefonie.

Linki

5 komentarzy
Share:
Rozmowa kwalifikacyjna po angielsku

Rozmowa kwalifikacyjna po angielsku

Język angielski jest już nieodzownym elementem pracy każdego programisty. Dlatego jeśli szukasz pracy w tej branży, prawdopodobnie nie ominie Cię rozmowa kwalifikacyjna po angielsku.

Jeżeli znasz angielski bardzo dobrze, to należysz do tych szczęśliwców, dla których kolejna rozmowa prawdopodobnie nie będzie stanowiła większego problemu.

Co jednak zrobić, jeżeli z angielskiego korzystamy tylko sporadycznie i to głównie czytając dokumentację?

Zapraszam do dyskusji. Poniżej zebrałem informacje, które pomogły mi odnaleźć się w takiej sytuacji.

Jak przygotować się do rozmowy kwalifikacyjnej po angielsku?

Przede wszystkim trzeba zacząć od tego, że warto i wręcz należy przygotować się do takiej rozmowy.

Jeżeli do rozmowy zostały dni lub tylko godziny, to nie ma co liczyć, że nagle nauczysz się języka na tip-top. Skoro do tej pory tego nie zrobiłeś, to niby czemu teraz miałoby Ci się to udać? To jednak powinien być wystarczający czas, by nadrobić najbardziej palące braki i chociaż zwiększyć swoje szanse na rozmowie kwalifikacyjnej.

Wszystkie rozmowy wyglądają podobnie, dlatego w tym ograniczonym zakresie można zdziałać całkiem sporo.

Przebieg rozmowy kwalifikacyjnej

Zacznij od ułożenia hipotetycznego scenariusza rozmowy. Można to przygotować w formie prostego dialogu, czy pytań z odpowiedziami.

Ważne jest to, że robiąc to teraz, a nie dopiero na samej rozmowie kwalifikacyjnej, masz zdecydowanie więcej czasu na zastanowienie się nad odpowiedziami.

Przećwicz dobrze rozmowę

Samo zebranie potrzebnych informacji to jedno, a poradzenie sobie ze stresem podczas konkretnej rozmowy to już całkiem co innego. Niestety, na to nie ma innego sposobu, jak tylko dobrze wszystko przećwiczyć i oswoić się ze stresem. Zapanowanie nad własnymi emocjami podczas rozmowy kwalifikacyjnej czasem przychodzi bardzo ciężko nawet w ojczystym języku, a co dopiero, gdy dochodzi dodatkowy stres związany z brakami w komunikacji.

Zacznij od lustra

Żółta kaczuszka lustro

Żółta kaczuszka lustro

Niezależnie od tego, czy wybierzesz osławione lustro, czy ekran monitora, ucz się, czytając i opowiadając na głos!

Tylko w ten sposób oswoisz się z dźwiękiem swojego głosu po angielsku.

Czas na prawdziwego przeciwnika

Jeżeli czujesz się już swobodnie opowiadając o swoim doświadczeniu po angielsku w samotności, czas spróbować czegoś trudniejszego.

  1. Na pierwszy ogień polecam rodzinę i znajomych. Jednak żeby zbytnio ich nie eksploatować 😉 warto szybko przejść do kolejnego kroku.
  2. Partnerzy językowi. W Internecie można znaleźć całą masę portali skupiających ludzi zainteresowanych wspólną nauką języka.
    Osobiście korzystam i polecam Italki. Za pośrednictwem tego portalu można znaleźć ludzi, którzy w ramach wymiany językowej chętnie porozmawiają z nami praktycznie w dowolnym języku. Dla trochę bardziej wymagających użytkowników, za niewielką opłatą jest również możliwość wynajęcia profesjonalnych nauczycieli. Rejestrując się z tego linku, otrzymasz bonus w wysokości 10$ po pierwszej lekcji.

Próba generalna

Nie znam skuteczniejszego sposobu na przećwiczenie swoich umiejętności niż wypróbowanie ich w praktyce.

Przygotowując się do odbycia właściwej rozmowy kwalifikacyjnej, zdecydowanie polecam odbycie niejako „próbnej” rozmowy. Przy obecnym natłoku ogłoszeń o pracę w IT nie powinno stanowić problemu znalezienie firmy, która zaprosi nas na taką rozmowę.

Kto wie, może taka rozmowa na próbę, spowoduje, że jednak zdecydujemy się podjąć współpracę właśnie z tą firmą.

Najczęstsze błędy na rozmowie kwalifikacyjnej

Mówienie po polsku.

Podczas rozmowy nigdy sami nie powinniśmy przejść na język polski. To rekruter decyduje o tym, kiedy możemy to zrobić.
Niedopuszczalne jest również pytanie, czy w razie czego będzie można powiedzieć coś po polsku. A co, jeżeli druga osoba nie będzie wcale znała polskiego?

Krępująca cisza

Nic bardziej nie denerwuje podczas rozmowy jak długie momenty niezręcznej ciszy. Jeżeli zapomnisz jakiegoś słowa, nie przerywaj, tylko postaraj się wytłumaczyć, o co Ci chodzi. Oczywiście po angielsku!

Na jednej z moich rozmów całkowicie się zablokowałem i zapomniałem słowa: analityk (ang. analyst). Niby proste, ale w tamtym momencie nie mogłem sobie przypomnieć. Zamiast tego słowa, po chwili ciszy przeprosiłem i powiedziałem pierwszą frazę jaka przyszła mi do głowy: woman with documentation. Oczywiście wywołało to salwę śmiechu po drugiej stronie, ale mi dało chwilę na opanowanie emocji i wygrzebanie się z kłopotliwej sytuacji. Sprawiło również, że zostałem lepiej zapamiętany.

Brak zrozumienia pytania

Bywa, że czasem nie zrozumiemy pytania, co wtedy zrobić?

Zwyczajnie powiedzieć o tym naszemu rozmówcy i to najlepiej zawczasu przygotowanym zwrotem, np.:

„Excuse me, I am not sure if I understood your question. Could you rephrase it, please?”

Niezależnie od tego, czy nie zrozumiałeś pytania z powodu braków językowych, czy braku wystarczającej wiedzy z danej dziedziny, najlepiej jest poprosić o wyjaśnienie pytania. Nie spotkałem się jeszcze, by ktokolwiek odmówił w takiej sytuacji.

Trema, trema, trema…

Jesteś tak zdenerwowany, że nawet nie usłyszałeś pytania, co robić!?

Trzy głębokie wdechy i kolejna wcześniej przygotowana formułka rozwiąże problem 🙂

„Excuse me, I am feeling really stressed because this job interview is very important to me. Would you mind repeating this question once again, please?”

Różne akcenty

Niby angielski jest jeden, ale…

To, że jesteś w stanie dogadać się z Polakiem mówiącym po angielsku wcale nie znaczy, że tak samo płynnie uda Ci się porozumieć z Chińczykiem, czy Brazylijczykiem. Polacy uczący się angielskiego robią te same błędy językowe co my, dlatego łatwiej jest tam zrozumieć siebie wzajemnie.

Tu znów z pomocą mogą przyjść ludzie z Italki. Spróbuj skontaktować się z ludźmi z kraju, z którego pochodzi Twój przyszły rozmówca i przećwicz z nimi rozmowę.

Oszustwo w CV

Jeżeli wcześniej oszukałeś w CV, że mówisz płynnie po angielsku, a w rzeczywistości ledwo jesteś w stanie złożyć zdanie… no cóż, nie dziw się w takim razie, że ktoś teraz zakłada, że znasz ten język.

Rozmowa kwalifikacyjna przez telefon po angielsku

Rozmowa kwalifikacyjna przez telefon

Rozmowa kwalifikacyjna przez telefon

Coraz częstszą praktyką jest przeprowadzanie rozmów kwalifikacyjnych przez telefon. Szczególnie jeżeli na danym stanowisku wymagana jest bardzo dobra znajomość angielskiego.

Ponieważ przeciętna rozmowa kwalifikacyjna trwa około 1 – 1.5 godziny, żeby zaoszczędzić czas kandydata i osoby rekrutującej, przeprowadza się krótką rozmowę po angielsku przez telefon.

Niezbędnik

Przed taką rozmową przygotuj sobie odpowiednie warunki. Przede wszystkim spokojne i ciche miejsce. Uprzedź też domowników, żeby Ci przypadkiem nie przeszkadzali.

Przyda się również naładowany telefon, rozmowa może chwilę potrwać.

Najczęściej zadawane pytania na rozmowie kwalifikacyjnej

Jedno z pierwszych pytań, których możesz się spodziewać, na pewno będzie dotyczyło Twojego doświadczenia oraz projektu, w którym obecnie uczestniczysz.

Nie zmarnuj tej okazji i przygotuj się z tego zakresu, by zrobić dobre pierwsze wrażenie. Możesz sobie przygotować jakiś uniwersalny wstęp zawierający najistotniejsze informacje o Tobie oraz o Twojej dotychczasowej karierze.

Lepiej nie uczyć się takiej rozmowy na pamięć, a raczej przygotować mapę myśli z zebranymi informacjami i przydatnymi zwrotami. Pozwoli to uniknąć zacięcia się jeśli zapomnisz jakiegoś fragmentu, czy inaczej zdefiniowanych pytań.

Jeżeli chodzi natomiast o same pytania, to można spodziewać się praktycznie tego samego, co na rozmowie w języku polskim. Przykładowe pytania znajdziesz poniżej oraz w podlinkowanych artykułach ([1], [2])

Can you tell me something more about yourself?
Could you describe your strengths and weaknesses, please?
What was your greatest accomplishment / achievement?
Where do you see yourself in 5 years’ time?
What are your hobbies?

Rozmowa kwalifikacyjna podsumowanie

Jestem już po swojej rozmowie i z przekonaniem mogę powiedzieć, że jestem zadowolony z wyników, jakie udało mi się osiągnąć przez kilka dni wytężonych starań.

Ze swojej strony życzę Ci powodzenia i koniecznie pochwal się, jak Ci poszło.

 

Chcesz przygotować fantastyczne CV i zabłysnąć na rozmowie kwalifikacyjnej? Sprawdź  najnowsze e-booki:

CV Programisty oraz Rozmowa kwalifikacyjna Programisty

2 komentarze
Share:
Podsumowanie I kwartału 2017

Podsumowanie I kwartału 2017

Pierwszy pełen kwartał prowadzenia bloga oficjalnie uważam za zamknięty.

Jeszcze kilka miesięcy temu nawet nie pomyślałbym, że może coś z tego wyjść. Nawet nie dopuszczałem do siebie myśli, że ja sam mógłbym coś napisać, cokolwiek…

A dziś? A dziś piszę już dość regularnie i ze zdumieniem stwierdzam, że nawet sprawia mi to przyjemność.

Zacznijmy jednak od samego początku.

Kiedy to się wszystko zaczęło?

Pierwsza myśl, żeby coś zmienić pojawiła się pod koniec 2016 roku. Nie bardzo jeszcze wiedziałem, co dokładnie chcę robić. Wiedziałem natomiast, że potrzebuję trochę świeżości w moim życiu zawodowym. Miałem już na swoim koncie kilka nieudanych projektów robionych po godzinach i myśl o kolejnej porażce wcale nie była zachęcająca.

Główny wniosek, który wyciągnąłem ze swoich dotychczasowych wysiłków był prosty. Zdecydowanie za długo trzymałem w domowej ciemnicy wszystkie swoje pomysły. Może trochę ze strachu przed oceną? Niezależnie od tego, czy był to dobry, czy tylko średni pomysł, w nieskończoność przeciągałem moment jego publikacji. Z czasem traciłem zainteresowanie projektem i docierało do mnie, że nic z tego już nie będzie.

Blog jako wybawienie

Blog miał być rozwiązaniem wszystkich tych problemów. Każdy większy wpis to przecież osobny projekt. Można go zamknąć w skończonym i stosunkowo łatwym do oszacowania czasie.

A co z nieudanymi projektami?

Prowadzenie bloga to genialne rozwiązanie! Nawet nieudany projekt można przekuć w swój sukces. Wystarczy odpowiednio wyciągnąć wnioski i podzielić się swoimi spostrzeżeniami.

Czas zacząć

Pierwsze dość nieregularne wpisy pojawiły się już pod koniec roku. Nie oszukujmy się. Były one straszne! Napisanie każdej kolejnej linijki sprawiało mi praktycznie ból fizyczny… Uzyskany efekt pozostawiał również wiele do życzenia. Było źle do tego stopnia, że zwyczajnie wstydziłem się komuś to pokazać.

Konsekwencja i cierpliwość

Dałem sobie jednak trochę czasu i zacisnąłem zęby. Pierwszy checkpoint był połączony z końcem roku. Miałem do tego czasu napisać kilka tekstów – to był właściwie jedyny wymóg. Wpisy miały zwyczajnie powstać i zostać opublikowane w sieci. Każdy, kto pierwszy raz publikował coś w Internecie, wie, że wcale nie jest to łatwe zadanie.

Po wielu przepracowanych godzinach i kilku przeczytanych książkach, dziś jest kolejny moment, w którym mówię „sprawdzam”.

Podsumowanie w liczbach

  • 50 tekstów na blogu
  • 60 fanów na Facebooku
  • 63 wpisy na FB
  • 20 lekcji z serii kurs java
  • 20 komentarzy na blogu (+ kilka razy tyle w social media)
  • 9168 odsłon bloga
  • 3962 sesji
  • 1963 użytkowników
    Podsumowanie I kwartału 2017 - użytkownicy

    Podsumowanie I kwartału 2017 – użytkownicy

Trochę o samych użytkownikach

Nie od dziś wiadomo, że w IT dominują „młodzi mężczyźni”. Moje statystyki również to potwierdzają.

Podsumowanie I kwartału 2017 – płeć

Podsumowanie I kwartału 2017 – płeć

Podsumowanie I kwartału 2017 – wiek

Podsumowanie I kwartału 2017 – wiek

Najlepsze kanały

Największy ruch w tym okresie wygenerowały wejścia z social media oraz ze stron odsyłających – jest to przede wszystkim Facebook oraz Wykop.

Kolejną dużą grupę stanowią wejścia z Google. Nie jest to zaskoczenie, ponieważ sam blog nie był nigdzie reklamowany, a poszczególne wpisy były dość dobrze zoptymalizowane pod kątem SEO.

Podsumowanie I kwartału 2017 - kanały

Podsumowanie I kwartału 2017 – kanały

Rachunek zysków i strat

Koszty

W tym wypadku nazwałbym tę kategorię raczej „inwestycje”. Tak też traktowałem całe to przedsięwzięcie.

Największą inwestycją był oczywiście poświęcony czas. Składa się na to nie tylko czas przeznaczony na pisanie, ale również na promocję treści w Internecie i zdobywanie nowej wiedzy.

Pozostałe koszty są właściwie pomijalne i łącznie zamknęły się w kilkuset złotych. Były to między innymi hosting, domena, szablon i logo.

Korzyści

Materialne?

Liczone w złotówkach to ZERO. Była co prawda próba odpalenia Google Adsense, ale uznałem, że jeszcze nie miejsce i nie czas na to. Nie to było również moim celem w tamtym momencie.

Co mnie jednak bardzo pozytywnie zaskoczyło: blog przyniósł mi bardzo dużo pośrednich korzyści.

  • przez stronę odezwało się do mnie kilka osób z propozycją współpracy, co ostatecznie przerodziło się w dwa nieduże płatne zlecenia;
  • udało mi się usystematyzować wiedzę z opisywanych tematów. Żeby powstał spójny tekst trzeba odpowiednio ułożyć sobie wiedzę w głowie;
  • poprawiłem swój warsztat pisarski. Powstałym treściom brakuje do ideału jeszcze bardzo dużo, jednak już sam proces ich tworzenia nie sprawia mi tak wielkiego bólu 🙂
  • sam fakt prowadzenia bloga okazał się również ciekawym tematem na rozmowę. Odezwało się do mnie kilka osób, z którymi dość dawno nie miałem kontaktu, nawiązałem też  kilka nowych znajomości.

Co dalej?

Plan na II kwartał 2017 jest raczej prosty. Przede wszystkim przetrwać 🙂

Wiem, że w tym okresie będę miał zdecydowanie mniej czasu na pisanie, dlatego plan jest raczej zachowawczy. Zaczynam też odczuwać koszty czasowe związane z prowadzeniem tego projektu.

Chciałbym dalej publikować wpisy z kursu java, zostało tam jeszcze dużo ciekawych zagadnień do omówienia. Naprzemiennie z tymi wpisami powinny pojawiać się treści dotyczące aplikacji mobilnych, czyli projekt StormSnapshot.

Jeżeli chodzi o samą częstotliwość, to chciałbym osiągnąć średnio przynajmniej jeden wpis tygodniowo. Więcej, niestety, nie jestem w stanie publikować nie tracąc na jakości.

Powoli też przymierzam się do wydania swojego pierwszego produktu, a właściwie usługi. Będzie to porównywarka usług hostingowych. Więcej na ten temat napiszę jak uda mi się sprecyzować wymagania.

Zależy mi również na polepszeniu interakcji z czytelnikami. Blog, którego nikt nie czyta i nie komentuje, jest martwy… Zacznę prawdopodobnie od ustalenia bardziej spójnego planu działań w social media.

Podsumowanie

To czy udało się osiągnąć dużo, czy nie, jest tak naprawdę względne. Dziś wiem, że chciałoby się więcej i takie też są dalsze plany. Pamiętam jednak, że kilka miesięcy temu nawet nie przeszłoby mi przez myśl, że to, co mam teraz jest możliwe.

Ciebie również zachęcam do zrobienia takiego podsumowania i podzielenia się wnioskami. Warto co jakiś czas zatrzymać się i sprawdzić, czy zmierzamy w dobrym kierunku.

No comments
Share:
CO ROBIĆ, gdy nic nie działa i wszystko się wali!?

CO ROBIĆ, gdy nic nie działa i wszystko się wali!?

Miał się pojawić kolejny wpis o StormSnapshot, ale … No właśnie, jeszcze go nie ma.

Co robić, gdy nic nie działa i kończą Ci się pomysły jak to naprawić?

Każdemu programiście czasem zdarza się dojść do takiego momentu, że mimo usilnych starań nie może rozwiązać jakiegoś, wydawałoby się prostego problemu.

Ty też tak czasem masz, prawda?

Najpierw kontekst

Po straconych dwóch popołudniach na bezowocnej „walce z maszynami” postanowiłem zmienić trochę podejście, zebrać do kupy dotychczasowe doświadczenia i trochę się pożalić…

Przez poprzedni wpis na temat React Native przeszedłem bez większych problemów. Tym razem miałem pochylić się nad Ionic. Nie spodziewałem się większych problemów, zwłaszcza że miałem już do czynienia z PhoneGap.

Niestety… Mimo usilnych starań, po kilkugodzinnej walce jestem dalej bez działającego środowiska. Można powiedzieć, że nawet nie zacząłem.

Teoretycznie wszystko powinno działać, ale dziwnym trafem nie chce.

Teoria i praktyka

Teoria i praktyka

Standardowe początki

Sytuacja zazwyczaj rozwija się w bardzo standardowy sposób. Wykonujemy spokojnie swoje zadanie, realizując kolejne punkty dokumentacji, czy jakiegoś tutoriala.

Oczywiście pojawiają się błędy i problemy, ale co to dla nas! Przecież jesteśmy programistami, taka nasza praca. Chwila zastanowienia, szybkie przeskoczenie do google i znowu jesteśmy w grze.

Problem zaczyna się wtedy, gdy standardowe rozwiązania nie przynoszą spodziewanego rezultatu, a my denerwujemy się coraz bardziej.

Programistyczna ŚCIANA i chwila zwątpienia

Kolejne godziny mijają coraz szybciej, a rozwiązania jak nie było, tak nie ma.

Człowiek robi się coraz bardziej poddenerwowany, a świadomość, że to powinno być przecież takie proste i nawet stażysta poradziłby sobie z tym problemem w kilka chwil, wcale nie pomaga.

W takim stanie naprawdę ciężko podejmować jakieś sensowne decyzje.

STOP! Zatrzymaj się, złap oddech i zbierz myśli

Najlepsze, co można zrobić w takiej sytuacji, to zatrzymać się i wyrwać się z tego zamkniętego kręgu.

Albert Einstein

Albert Einstein

Czasem nie wystarczy już zwykłe podejście do okna, czy popatrzenie w sufit.

Głowa, która dosłownie pęka od nadmiaru informacji i pretensji do siebie, potrzebuje więcej czasu, by odpocząć. Mnie najlepiej pracuje się rano, gdy jeszcze nie mam mętliku w głowie od codziennych obowiązków. Dlatego właśnie staram się zaczynać dzień od najtrudniejszych zadań.

A mówią, że programowanie to taka łatwa praca…

Nowy plan

Nowy plan działania wcale nie musi oznaczać „ciśnięcia” tematu dalej do upadłego.

Odpuść sobie „Let It Go!”

Let It Go!

Let It Go!

Nie można zapominać, że nasza praca i nasz czas ma swoją wartość. To właśnie efekt, jaki ona przynieście, zazwyczaj jest najważniejszy, a nie satysfakcja, że po spędzonym całym weekendzie przed komputerem znajdziemy wreszcie brakujący średnik, czy nadmiarową spację w pliku…

Odpuścić można na wiele sposobów i wcale nie jest to przyznanie się do porażki.

  • Sygnalizacja zagrożenia! To podstawa, jeżeli pracujemy w zespole. Jeżeli widzisz, że nie dowieziesz danego tematu na czas, to Twoim obowiązkiem jest poinformowanie innych członków zespołu o tym jak najszybciej. Może się okazać, że w naszym bliskim otoczeniu jest ktoś, kto miał taki sam problem lub ma większe doświadczenie w tej kwestii.
  • Rezygnacja z zadania. Jeżeli spędzimy nad danym problemem zbyt dużo czasu, może się okazać, że potencjalne korzyści przewyższą koszty. Jeżeli oczywiście jest to możliwe, warto rozważyć rezygnacją z takiego zadania i uciąć potencjalne straty, póki są jeszcze akceptowalne.

Jednak dam radę

No dobra. Nie możemy lub nie chcemy porzucić takiego kłopotliwego zadania. Jak w takim razie je ugryźć? Zebrałem poniżej trochę potencjalnych rozwiązań na takie specjalnie sytuacje.

Google Twoim przyjacielem

Niby wszyscy (no dobra, prawie wszyscy) korzystają z Google, jednak jak pokazują statystyki [1] przeszło 90% ludzi ogranicza się tylko do pierwszej strony wyników wyszukiwania.

Google 2 strona

Google 2 strona

Google udostępnia szereg rozwiązań, które pozwolą doprecyzować to, czego szukamy.

Wyszukiwanie ścisłego dopasowania

Jeżeli chcesz wyszukać konkretną frazę z zachowaniem kolejności poszczególnych słów, umieść ją w cudzysłowie („”). Bardzo dobrze to się sprawdza w przypadku fragmentów kodu, czy stack trace.

Pamiętaj jednak, że w ten sposób ograniczasz się tylko do wyników, które posiadają dokładnie tę frazę.

„konkretne hasło”

Wykluczenie słów

Jeżeli nie chcesz, żeby jakieś frazy pojawiły się w wynikach wyszukiwania, wstaw przed nimi znak minus (-).

To bardzo przydatny operator, zwłaszcza gdy w wynikach znajdziemy dwie całkowicie różne rzeczy o takiej samej nazwie. Wyobraźcie sobie moje zdziwienie, gdy przeszukując Internet po haśle: Ionic znalazłem suszarki do włosów! Co ciekawsze okazało się, że mam nawet taką w domu 😉

-suszarka

Wyszukiwanie wszystkich słów w tekście

Przy pomocy operatora allintext: można znaleźć strony, które zawierają wszystkie podane przez nas zwroty.

allintext: java react native stormit

Łączenie zapytań

Poszczególne zapytania można ze sobą łączyć przy pomocy operatora OR

stormit OR java

Wyszukiwanie w obrębie strony

Wyniki wyszukiwania można również ograniczyć do konkretnej strony lub do końcówki domeny jak .pl

site:stormit.pl java

Ciekawe wyniki można uzyskać również, łącząc ze sobą poszczególne operatory. Można np. wykluczyć z wyników wszystkie wyniki z wybranej strony:

java -site:java.com -site:wikipedia.org

Więcej przykładów operatorów znajdziecie w pomocy Google.

Alternatywne wyszukiwarki

Na Google świat się nie kończy. Niby w Polsce [2] pozostałe wyszukiwarki stanowią niespełna 3%, jednak na świecie sytuacja wygląda trochę lepiej.

Wyszukiwarki świat

Wyszukiwarki świat
(źródło: statcounter.com)

Jeżeli człowiek jest odpowiednio zdesperowany, warto rozważyć wszystkie opcje.

  • Bing (bing.com)
  • Yahoo (yahoo.com)
  • Baidu (baidu.com)
  • Yandex (yandex.ru)
  • Ask (ask.com)

Dokumentacja

Tak, takie coś czasami też istnieje 🙂

Na stronie różnych bibliotek często można znaleźć pomocną dokumentację. Java także posiada opis swojego API, do którego czasem warto zajrzeć.

Źródła

Niektórzy, w tym ja, preferują czytanie źródeł aplikacji ponad dokumentację. Dobrze napisany kod zawsze prawdę Ci powie, a dokumentacja niestety już nie zawsze…

Podpięcie źródeł

Jeżeli tylko wykorzystuję zewnętrzną bibliotekę w swoim projekcie, staram się mieć podpięte jej pełne źródła oraz Javadoc w IDE. Jeżeli jakaś metoda nie działa zgodnie z moimi oczekiwaniami, zawsze można zajrzeć do jej wnętrza lub ją zdebugować.

Dekompilacja

W ramach pakietu JDK dostępne jest narzędzie javap, przy pomocy którego możemy dekompilować klasy, które posiadamy tylko w skompilowanej wersji. Nie jest to tak wygodne, jak przeglądanie samego kodu, ale czasem może okazać się pomocne.

GrepCode

W ramach projektu grepcode.com indeksowane są źródła publicznie dostępnych bibliotek. Przy pomocy tej strony można też przeszukać bazę źródeł po fragmencie kodu.

Zmień środowisko i zacznij od zera

A restart robiłeś?

Takie pytanie pada dość często w takich sytuacjach. Niby półżartem, ale jednak coś w nim jest. Dla świętego spokoju warto spróbować i tego.

Zmień komputer

Żyjemy już w takich  czasach, że w domu często jest więcej niż jeden komputer. Jak kończą mi się pomysły, to przesiadam się na laptopa i tam próbuję swoich sił. Czasem nowe środowisko, nowa konfiguracja, może odmienić losy naszego problemu.

Zrób sobie przerwę i idź na piwo

Zrób sobie przerwę i idź na piwo

Zrób sobie przerwę i idź na piwo

Skoro i tak nic nie działa, to po co się zarzynać?

Z czystą głową lepiej rozwiązuje się problemy. Bywa, że lepiej przeznaczyć ten czas na inne zadanie lub na spacer/piwo…

Zapytaj kolegów

Nie jesteśmy sami na świecie, zawsze można skorzystać z pomocy jakiegoś znajomego, czy to siedzącego biurko obok, czy wirtualnego.

  • współpracownicy
  • fora internetowe
  • stackoverflow.com

Alternatywne rozwiązania

Na zakończenie jeszcze dwie mniej techniczne propozycje. Ostatecznie mówi się przecież, że informatyka ma w sobie trochę magii.

Odczaruj urok

Spluń przez lewe ramię, okręć się trzy razy na pięcie i stukaj obiema rękami w niemalowane drewno.

Koniecznie w tej kolejności!

św Ryta z Cascii patronka trudnych spraw

O potężna i sławna Święta Rito, oto u twoich stóp nędzna dusza potrzebująca pomocy, zwraca się do ciebie z nadzieją, że zostanie wysłuchana.

Ponieważ jestem niegodny z tytułu niewierności mojej, nie śmiem spodziewać się, że moje prośby będą zdolne ubłagać Boga. Dlatego wyczuwam potrzebę, aby mieć za sobą potężną orędowniczkę, więc ciebie wybieram sobie, Święta Rito, ponieważ ty właśnie jesteś niezrównaną Świętą od spraw trudnych i beznadziejnych.

O droga Święta, weź do serca moją sprawę, wstaw się do Boga, aby uprosić mi łaskę, której tak bardzo potrzebuję i o którą tak gorącą proszę (tutaj wyrazić łaskę, o którą się prosi) 

Nie pozwól mi odejść od ciebie nie będąc wysłuchanym. Jeżeli jest we mnie coś, co byłoby przeszkodą w otrzymaniu łaski, o którą proszę, pomóż mi usunąć tę przeszkodę: poprzyj moją prośbę swymi cennymi zasługami i przedstaw ją swemu niebieskiemu Oblubieńcowi, łącząc ją z twoją prośbą. W ten sposób moja prośba zostanie przedstawiona przez ciebie, wierną oblubienicę spośród najwierniejszych. Ty odczuwałaś boleść Jego męki, jak mógłby on odrzucić twą prośbę i nie wysłuchać jej?

Cała moja nadzieja jest więc w tobie i za twoim pośrednictwem czekam ze spokojnym sercem na spełnienie moich życzeń. O droga Święta Rito, spraw, aby moja ufność i moja nadzieja nie zostały zawiedzione, aby moja prośba nie była odrzuconą. Uproś mi u Boga to, o co proszę, a postaram się, aby wszyscy poznali dobroć twego serca i wielką potęgę twego wstawiennictwa.

O Najsłodsze Serce Jezusa, które zawsze okazywało się tak bardzo czułe na najmniejszą nędzę ludzkości, daj się wzruszyć moimi potrzebami i nie bacząc na moją słabość i niegodność, zechciej wyświadczyć mi łaskę, która tak leży mi na sercu i o którą prosi Cię dla mnie i ze mną Twoja wierna  oblubienica, Święta Rita.

O tak, za wierność, jaką Święta Rita zawsze okazywała łasce Bożej, za wszystkie zalety, którymi uhonorowałeś jej duszę, za wszystko co wycierpiała w swym życiu jako żona, matka i zakonnica, i w ten sposób uczestniczyła w Twej bolesnej męce i wreszcie z tytułu nieograniczonej możliwości wstawiania się, przez co chciałeś wynagrodzić jej wierność, udziel mi Twej łaski, która jest mi tak bardzo potrzebna.

A Ty, Maryjo Dziewico, nasza najlepsza Matko Niebieska, która przechowujesz skarby Boże i rozdzielasz wszelkie łaski, poprzyj Twoim potężnym wstawiennictwem modły Twej wielkiej czcicielki Świętej Rity, aby łaska o którą proszę Boga, została mi udzielona.
Amen.

Na koniec

Prędzej czy później każdy z nas trafi na taką ścianę. Ważne jest to, by mieć świadomość, że takie rzeczy czasem się zdarzają i wiedzieć jak sobie z tym radzić.

Powodzenia i wytrwałości, ja walczę dalej 🙂

A Ty jak radzisz sobie w takich sytuacjach?

No comments
Share:
React Native pierwsza aplikacja

React Native pierwsza aplikacja -> StormSnapshot #3

Witam w kolejnej części serii StormSnapshot. W poprzednim wpisie mobilne aplikacje hybrydowe zebraliśmy podstawowe informacje o dostępnych technologiach oraz wybraliśmy dwa najlepiej rokujące frameworki: Ionic, oraz React native.

Dzisiaj przyjrzymy się bliżej technologii React Native i przygotujemy prostą aplikację testową.

React i React Native

React (nazywany również React.js lub ReactJS) to biblioteka JavaScript, rozwijana na licencji open source, do budowania interfejsu użytkownika. Projekt wspierany jest głównie przez ludzi z Facebooka i Instagrama.

Dzięki React Native można budować mobilne aplikacje, korzystając tylko z JavaScriptu. Powstała aplikacja nie jest typową aplikacją hybrydową wykorzystującą webview do prezentacji strony mobilnej, jak robi to np. PhoneGap. Zamiast tego na podstawie komponentów napisanych w składni React budowane są natywne komponenty w Javie na Androida, czy w Objective-C na iOS.

Motto React Native

Motto React Native

Większości frameworków hybrydowych przyświeca motto: „Write once, run anywhere” (napisz raz, uruchom wszędzie), jednak w przypadku Reacta zostało ono sparafrazowane na: „Learn once, write anywhere” (naucz się raz, pisz wszędzie).

„Write once, run anywhere”

Oddaje to dobrze ideę, która przyświeca temu projektowi. Zamiast pisać jeden kod, który będziemy mogli bez modyfikacji uruchomić na wszystkich dostępnych platformach, dostajemy jedno narzędzie, które możemy wykorzystać niezależnie czy piszemy stronę www, czy aplikację mobilną. Takie podejście teoretycznie wymaga trochę więcej wysiłku, ale pozwala uzyskać bardziej dopasowane aplikacje.

Learn once, write anywhere

W efekcie tego, migrując np. projekt z Androida na iOS, trzeba będzie pochylić się jedynie nad częścią komponentów, ale zdecydowana większość kodu może zostać wykorzystana jako część wspólna. Resztę kodu stanowią komponenty i funkcjonalności dostępne tylko na danym systemie operacyjnym.

Wprowadzenie do JSX

Komponenty dostępne w React pisane są zazwyczaj przy pomocy składni JSX. JSX to rozszerzenie składni JavaScript o możliwość prostego wykorzystywania tagów HTML. Użyte tagi są przetwarzane i zamieniane na odpowiednie wywołania biblioteki js.

const element = <h1>Hello, Java!</h1>;

Powyższy fragment kodu to prosta konstrukcja JSX. Składnia trochę przypomina sam widok HTML, przy jego pomocy można jednak w pełni korzystać z możliwości JavaScript.

Osadzenie wyrażeń w JSX

W JSX można wykorzystać dowolne wyrażenia JavaScript, osadzając je w nawiasach klamrowych:

function format(obj){
   return 'Hello '+obj.title.toUpperCase();
}
return (<Text>{format({title: 'jsx'})}</Text>);

IDE

Początkowo projekt chciałem realizować z wykorzystaniem Netbeans IDE. Niestety w obecnej wersji (8.2) Netbeans ma jeszcze bardzo słabe wsparcie dla składni JSX, nie znalazłem też żadnego pluginu spełniającego moje oczekiwania. Nie wyobrażam sobie pisania większego projektu w dowolnej technologii bez przynajmniej podstawowego wsparcia w podpowiadaniu składni.

Między innymi dlatego zdecydowałem się skorzystać z IntelliJ IDEA. Niestety IntelliJ ma wsparcie dla JavaScript i składni JSX tylko w pełnej płatnej wersji. Można jednak pobrać 30-dniową wersję próbną.

Pierwszy projekt

Przed rozpoczęciem pracy musimy przygotować środowisko programistyczne oraz wszystkie niezbędne narzędzia. Pierwsza wersja aplikacji będzie dostępna na Androida, natomiast system operacyjny, z którego korzystam to Linux Ubuntu.

Niezbędne narzędzia

Ponieważ aplikacja będzie dostępna na Androidzie, musimy zacząć od instalacji Android Studio.

React Native wykorzystuje Node.js jako silnik do budowania kodu JavaScript, dlatego potrzebujemy również jego.

sudo apt-get update
sudo apt-get install nodejs
sudo apt-get install npm

Kolejnym narzędziem, którego potrzebujemy, jest: React Native Command Line Interface (CLI):

sudo npm install -g react-native-cli

Więcej na temat niezbędnych narzędzi można przeczytać na React Native Getting Started.

Struktura projektu

Po instalacji wszystkich niezbędnych narzędzi możemy przejść do wygenerowania struktury przykładowego projektu. Przechodzimy do docelowego katalogu i poniższym poleceniem generujemy strukturę naszej aplikacji:

react-native init ReactNativeSampleProject

Wygenerowane pliki zawierają wszystko, co potrzeba do uruchomienia pierwszej aplikacji w React Native.

Projekt React Native

Projekt React Native

W katalogu głównym projektu znajduje się plik: index.android.js, który jest punktem wejścia dla aplikacji. W tym samym katalogu znajdziemy jeszcze katalog: node_modules zawierający pliki biblioteki React Native oraz katalog android z kodem specyficznym dla tej platformy.

Uruchomienie aplikacji na symulatorze i urządzeniu

Zaczynamy od uruchomienia serwera React Native, który będzie przechowywał pliki JavaScript. Przechodzimy do katalogu z wygenerowanym wcześniej projektem i odpalamy poniższą komendę:

sudo react-native start

W osobnej konsoli możemy już zbudować i uruchomić przygotowany projekt:

react-native run-android

Jeżeli wszystko poszło dobrze, program powinien zainstalować na dostępnym symulatorze oraz fizycznym urządzeniu nową aplikację.

React Native emulator

React Native emulator

Aplikacja

Nasza aplikacja ma jedno proste zadanie, mianowicie przetestowanie podstawowych możliwości React Native. W tym celu przygotujemy kilka widoków:

  • ekran powitalny
    Na tym widoku wyświetlimy logo oraz damy możliwość przejścia do pozostałych widoków.
  • lista
    Wyświetlenie przewijanej listy 100 elementów.
  • rss
    Pobranie z Internetu oraz wyświetlenie listy najnowszych postów z bloga. Poszczególne wpisy będą miały tytuł i obrazek.

Navigator – przejścia w aplikacji

Całą aplikację podzielimy na poszczególne widoki reprezentujące osobne funkcjonalności. Natomiast główny plik index.android.js będzie zawierał komponent Navigator odpowiedzialny za przejścia w aplikacji.

import React, {Component} from 'react';
import {AppRegistry, Navigator} from 'react-native';

import StartScreen from './screens/StartScreen';
import ListScreen from './screens/ListScreen';
import RssScreen from './screens/RssScreen';
import SettingsScreen from './screens/SettingsScreen';

class StartApp extends Component {
    renderScene(route, navigator) {
        if (route.name == 'StartScreen') {
            return <StartScreen navigator={navigator}/>
        }
        if (route.name == 'SettingsScreen') {
            return <SettingsScreen navigator={navigator}/>
        }
        if (route.name == 'ListScreen') {
            return <ListScreen navigator={navigator}/>
        }
        if (route.name == 'RssScreen') {
            return <RssScreen navigator={navigator}/>
        }
    }

    render() {
        return (
            <Navigator
                initialRoute={{name: 'StartScreen'}}
                renderScene={this.renderScene.bind(this)}
            />
        );
    }
}

AppRegistry.registerComponent('ReactNativeSampleProject', () => StartApp);

Początek kodu to import wszystkich potrzebnych komponentów z frameworka oraz zdefiniowanych przez nas widoków. Poszczególne widoki zebrałem dla porządku w katalogu screens.

W metodzie renderScene na podstawie przekazanej nazwy generujemy odpowiedni widok. Do wszystkich widoków przekazujemy obiekt navigatora, żeby również z nich można było robić przejścia.

import React, {Component} from 'react';

export default class Screen extends Component {
    redirect(routeName) {
        this.props.navigator.push({
            name: routeName
        });
    }

    back() {
        this.props.navigator.pop();
    }
}

Wszystkie widoki dziedziczą z tej samej klasy Screen, dzięki czemu można było wydzielić w jedno miejsce zarządzenie przejściami.

Menu aplikacji [TouchableHighlight]

ReactNativeSampleProject-startScreen

ReactNativeSampleProject-startScreen

Jako menu wykorzystałem obrazki oraz abstrakcyjny komponent TouchableHighlight przechwytujący kliknięcia. Po wybraniu konkretnego obrazka wywoływana jest metoda onPress, która zwraca przygotowaną metodę z przekierowaniem do nowego widoku.

export default class StartScreen extends Screen {
    render() {
        return (<View style={styles.container}>
            <Image style={styles.logo} source={require('../img/logo.png')}/>
            <Text style={styles.title}>ReactNativeSampleProject</Text>
            <View style={styles.images}>
                <TouchableHighlight onPress={this.redirect.bind(this, 'SettingsScreen')}>
                    <Image style={styles.image} source={require('../img/settings.png')}/>
                </TouchableHighlight>
                <TouchableHighlight onPress={this.redirect.bind(this, 'ListScreen')}>
                    <Image style={styles.image} source={require('../img/list.png')}/>
                </TouchableHighlight>
                <TouchableHighlight onPress={this.redirect.bind(this, 'RssScreen')}>
                    <Image style={styles.image} source={require('../img/rss.png')}/>
                </TouchableHighlight>
            </View>
        </View>);
    }
}

Stylowanie aplikacji [StyleSheet]

Stylowanie aplikacji w React Native przebiega podobnie jak w zwykłych kaskadowych stylach CSS. W wypadku wielu właściwości wystarczy zamienić argumenty z myślnikiem, jak background-color, na konwencję camelCase backgroundColor.

Style można definiować inline jednak zazwyczaj lepszym pomysłem jest wydzielenie ich z kodu do stałych.

const styles = StyleSheet.create({
    wrapper: {
        backgroundColor: '#3399ff',
        flex: 1,
        justifyContent: 'center',
        alignItems: 'center'
    },
    logo: {
        flex: 1,
        width: 150,
        height: 150,
        resizeMode: 'contain'
    },
    images: {
        flexDirection: 'row'
    },
    image: {
        margin: 10,
        width: 50,
        height: 50,
    },
    title: {
        color: 'white'
    }
});

To rozwiązanie może nie jest tak wygodne jak wykorzystanie samych styli CSS. Jednak nawet podstawowa znajomość CSS powinna wystarczyć do w miarę bezbolesnego wykorzystania tego podejścia.

Lista danych [ListView]

Ten widok ma na celu przetestowanie długiej listy rekordów dostępnej z komponentu ListView.

export default class ListScreen extends Screen {

    constructor(props) {
        super(props);
        this.prepareRows();
    }

    prepareRows() {
        const ds = new ListView.DataSource({rowHasChanged: (r1, r2) => r1.title !== r2.title});
        const images = [
            require('../img/list.png'),
            require('../img/rss.png'),
            require('../img/settings.png')];
        let rows = [];
        for (let i = 0; i < 100; i++) {
            let image = images[i % images.length];
            rows.push({image: image, title: 'Row item number : ' + i});
        }
        this.state = {
            dataSource: ds.cloneWithRows(rows),
        };
    }

    render() {
        return (
            <View>
                <ListView
                    dataSource={this.state.dataSource}
                    renderRow={(rowData) => <View style={styles.row}>
                            <Image style={styles.image} source={rowData.image}/>
                            <Text>{rowData.title}</Text>
                        </View>}
                    renderFooter={() =>                 <View style={styles.back}>
                            <TouchableHighlight onPress={this.back.bind(this)}>
                                <Text>Wróć</Text>
                            </TouchableHighlight>
                        </View>}
                />
            </View>
        );
    }
}

Komponent ListView umożliwia proste operowanie na przewijanej liście rekordów. Wystarczy podać źródło danych oraz zdefiniować metodę renderRow, odpowiedzialną za wygenerowanie jednego wiersza listy.

RSS – pobranie danych z Internetu

ReactNativeSampleProject-rssScreen

ReactNativeSampleProject-rssScreen

Kolejny widok aplikacji to przykład pobrania danych z Internetu oraz parsowania XML-a. Na podstawie danych pobranych z sieci (kanał RSS) budowana jest lista z wykorzystaniem ListView.

fetchData() {
    fetch('https://stormit.pl/feed')
        .then((response) => response.text())
        .then((responseText) => {
            ...
        })
        .done();
}

Parsowanie XML

Do sparsowania pobranego pliku XML wykorzystałem zewnętrzny komponent DOMParser, który należy doinstalować do projektu poniższą komendą.

npm install react-native-html-parser

W podobny sposób można zainstalować inne komponenty. Pokaźna lista komponentów dostępna jest w katalogu.

var DOMParser = require('react-native-html-parser').DOMParser;
const domParser = new DOMParser();
const doc = domParser.parseFromString(responseText, 'text/xml');

let items = doc.getElementsByTagName('item');

let objs = []
for (var i = 0; i < items.length; i++) {
    const parsedDescription = domParser.parseFromString(items[i].getElementsByTagName('description')[0].textContent, "text/xml");
    objs.push({
        title: items[i].getElementsByTagName('title')[0].textContent,
        uri: items[i].getElementsByTagName('link')[0].textContent,
        image: this.getSmallestSrc(parsedDescription.getElementsByTagName('img')[0].getAttribute('srcset'))
    })
}

Podsumowanie

W moim odczuciu framework przeszedł bardzo dobrze ten test. Mimo iż jest to moja pierwsza styczność z tą technologią, nie miałem większych problemów z realizacją podstawowych funkcjonalności. Na stronie projektu można znaleźć bardzo pomocną dokumentację, która praktycznie krok po kroku wprowadza programistę w tajniki frameworka.

Powstała aplikacja działa płynnie i nie przycina się. Ciężko mieć tu jakieś zastrzeżenia, nawet przy dużej ilości danych.

Dopracowanie wyglądu samej aplikacji wymaga trochę wysiłku, ale bez większego trudu w sieci można znaleźć gotowe przykłady ostylowanych komponentów.

Podsumowując, z React Native korzysta się naprawdę dobrze, technologia stoi na wysokim poziomie, a powstała z jej pomocą aplikacja nie odbiega jakością od natywnych odpowiedników.

Jestem bardzo ciekaw, jak w tym porównaniu wyjdzie Ionic, ale już teraz widzę, że nie będzie miał łatwego zadania.

Linki

 

kierunek java

 

No comments
Share:
Darmowy certyfikat SSL

Darmowy certyfikat SSL | Rozdajemy zielone kłódki!

Jeszcze jakiś czas temu certyfikaty SSL dla stron WWW były dość trudne we wdrożeniu i przede wszystkim kosztowne w utrzymaniu. W efekcie większość stron zwyczajnie rezygnowała z bezpiecznego połączenia htts i zostawała przy standardowym http.

Z bezpiecznych połączeń przy pomocy certyfikatów SSL korzystały głównie duże serwisy, sklepy internetowe lub banki.

Dzisiaj sytuacja znacząco się zmieniła, przede wszystkim za sprawą Google i Let’s Encrypt.

Co to jest HTTPS i SSL/TLS?

HTTPS (Hypertext Transfer Protocol Secure) to szyfrowana wersja standardowego protokołu HTTP przeznaczonego do przesyłania stron www.

Podczas przesyłania strony przez HTTPS najpierw następuje wymiana kluczy TLS (Transport Layer Security), a dopiero później samo żądanie HTTP. Standardowo protokół https działa na porcie 443, a w przeglądarce możemy go zobaczyć jako zieloną kłódkę.

Natomiast TLS i SSL (Secure Socket Layer) to protokoły kryptograficzne zapewniające bezpieczną komunikację w sieci komputerowej.

Obie nazwy często wykorzystywane są zamiennie, jednak protokół TLS jest rozwinięciem SSL, wersja TLS 1.0 powstała po SSL 3.0.

StormIT https

StormIT https

Dlaczego powinniśmy się tym przejmować?

Idźmy dalej. Fajnie, że to jest, ale czemu właściwie powinniśmy się tym zainteresować?

Jeżeli prowadzimy sklep lub dowolną inną stronę, która przechowuje wrażliwe dane użytkownika, to raczej nie ma coś się zastanawiać. Pod tym względem ludzie są już na tyle wyedukowani, że nawet osoby typowo nietechniczne przed zalogowaniem się do banku sprawdzają, czy w adresie jest „zielona kłódeczka”.

Sprawa jest mniej oczywista, jeżeli zastanawiamy się nad wdrożeniem https dla strony firmowej lub bloga, gdzie jedyny formularz w systemie to formularz kontaktowy.

Bezpieczeństwo przesyłanych danych

Ponieważ podczas przesyłania danych po https najpierw następuje wymiana kluczy, przynajmniej teoretycznie zabezpieczamy się przed podsłuchaniem transmisji przez osoby trzecie oraz atakami typu „man in the middle”.

Widoczność w wyszukiwarkach

Google już oficjalnie potwierdziło, że https jest jednym z czynników rankingowych. Co prawda nie ma on jeszcze większego znaczenia, ale w przyszłości może się to zmienić.

Dobre wrażenie

Ludzie cały czas mają dobre skojarzenia z https i czują się bezpieczniej na takich stronach. Dodatkowo nasza strona wydaje się ważniejsza, bardziej „podobna do banku”, zaufana.

Ile kosztuje certyfikat SSL?

Wszystko zależy od  tego, jaki typ certyfikatu wybierzemy. Jednak u najbardziej znanych polskich dostawców (home, kei, az) w promocji podstawową wersję można dostać już od -nastu złotych w pierwszym roku.

To nie wydaje się dużo, jednak jeżeli jednak szukamy jeszcze tańszej alternatywy, warto zainteresować się projektem Let’s Encrypt.

Let’s Encrypt

Let’s Encrypt

Let’s Encrypt

W ramach projektu Let’s Encrypt na początku 2016 roku udostępniono użytkownikom darmowe certyfikaty TLS (X.509 Transport Layer Security). Cały proces wydawania certyfikatów jest w pełni zautomatyzowany, a same certyfikaty mają ważność tylko 90 dni.

Dlaczego tylko 90 dni?

To pytanie nasuwa się większości osób po zapoznaniu się z projektem. Jednak jak się chwilę nad tym zastanowić, przekłada się to na dwie bardzo ważne cechy tego rozwiązania:

  1. skradzione certyfikaty szybko stracą swoją ważność
    Nawet jeżeli dojdzie do utraty certyfikatu, zagrożenie będzie występowało tylko do momentu wygenerowania nowych kluczy. Dodatkowo zawsze można skrócić ten okres.
  2. wymuszenie automatyzacji
    Do tej pory większość certyfikatów miała okres ważności jednego roku. Jest to czas na tyle długi, że wiele osób zwyczajnie zapominało o odnowieniu certyfikatu, w efekcie czego stare klucze traciły ważność.
    Tak krótki okres ważności certyfikatu wymusza wprowadzenie rozwiązań automatycznych, które będą odnawiały certyfikaty bez ręcznej ingerencji użytkownika.

Jak wdrożyć Let’s Encrypt?

Projekt cieszy się coraz większą popularnością, dlatego coraz więcej dostawców usług hostingowych deklaruje automatyczne wsparcie dla tej usługi. Jeżeli natomiast nie mamy tyle szczęścia i na naszym hostingu nie możemy zrobić tego automatycznie, zawsze możemy skonfigurować usługę ręcznie.

DirectAdmin

Popularny panel administracyjny DirectAdmin od wersji 1.50.1 wspiera już Let’s Encrypt. Wystarczy w konfiguracji przestawić flagę letsencrypt=1 i użytkownik z poziomu panelu administracyjnego będzie mógł aktywować usługę dla swojej domeny [1].

Certbot

Certbot to rekomendowane na stronie projektu oprogramowanie do zarządzania certyfikatami [2].

Ten klient jednak do swego działania potrzebuje dostępu do SSH oraz uprawnień roota, przez co nie można z niego skorzystać na wielu współdzielonych hostingach.

acme-client

Acme-client od Certbot różni się przede wszystkim tym, że do swojego działania nie potrzebuje uprawnień roota.

Wygenerowanie certyfikatu

  1. Pobieramy najnowsze źródła klienta z repozytorium git:
    git clone https://github.com/kelunik/acme-client
    cd acme-client/
  2. Pobranie i instalacja systemu zarządzania pakietami Composer dla PHP
    php -version
    wget --output-document=composer-setup.php https://getcomposer.org/installer
    php composer-setup.php
    php composer.phar install --no-dev

    Biblioteka wymaga PHP w wersji co najmniej 5.5 lub 7 dlatego warto najpierw sprawdzić jaka wersja PHP jest podlinkowana.

  3. Wygenerowanie certyfikatu SSL
    php bin/acme setup --server letsencrypt --email kontakt@stormit.pl
    php bin/acme issue --domains stormit.pl:www.stormit.pl --path /home/[username]/domains/stormit.pl/public_html:/home/[username]/domains/stormit.pl/public_html --server letsencrypt

    Wygenerowane klucze będą dostępne w poniższej lokalizacji:

    • certyfikat
      data/certs/acme-v01.api.letsencrypt.org.directory/stormit.pl/fullchain.pem
    • klucz prywatny
      data/certs/acme-v01.api.letsencrypt.org.directory/stormit.pl/key.pem

Ustawienie certyfikatu w panelu administracyjnym hostingu

Każdy panel administracyjny będzie miał ten krok rozwiązany inaczej. W przypadku DirectAdmina trzeba najpierw włączyć obsługę SSL dla domeny, a następnie wkleić wygenerowane wcześniej klucze.

DirectAdmin SSL dla domeny

DirectAdmin SSL dla domeny

Klucze wklejamy w zakładce Zaawansowane opcje -> Certyfikaty SSL

DirectAdmin certyfikat SSL

DirectAdmin certyfikat SSL

Odnowienie certyfikatu

Po instalacji certyfikatu nie można zapomnieć, że ma on ograniczony czas ważności. Najlepiej zawczasu przygotować automatyczne mechanizmy do odnawiania kluczy.

Certbot udostępnia w tym celu specjalną komendę certbot renew [3], którą należy uruchamiać w cronie.

Natomiast w przypadku DirectAdmina, jeżeli mamy uruchomione natywne wsparcie dla Let’s Encrypt, będzie to odbywało się już bez naszego udziału. Można również przygotować skrypt generujący na nowe klucze, według kroków pokazanych wcześniej i aktualizować je przez API CMD_API_SSL[4].

Wdrożenie HTTS dla strony WordPress

Po odpowiednim skonfigurowaniu serwera możemy przejść do przystosowania naszej strony. W przypadku WordPress mamy do zrobienia prawie to samo, co w przypadku każdej innej strony. Przede wszystkim trzeba zaktualizować wszystkie odwołania z http na https i zapewnić odpowiednie przekierowania.

Zapewnienie tylko jednego adresu

Jest to szczególnie ważne z punktu widzenia SEO. Nasza strona powinna być dostępna tylko pod jednym adresem. Dlatego wszystkie odwołania przekierowujemy na nowy adres.

Najłatwiej będzie to zrobić przy pomocy pliku .htaccess. Ważne jest to, żeby zapewnić stałe przekierowania 301, a nie tymczasowe. Jest to jeden z częstszych błędów.

<IfModule mod_rewrite.c>
        RewriteEngine On
        RewriteCond %{SERVER_PORT} 80
        RewriteRule ^(.*)$ https://stormit.pl/$1 [R=301,L]
</IfModule>

Zmiana adresu w konfiguracji WordPress

W konfiguracji musimy jeszcze zmienić adres strony: Ustawienia -> Ogólne 

WordPress zmiana url

WordPress zmiana url

Aktualizacja starych odnośników

Pozostaje nam jeszcze aktualizacja wszystkich starych odwołań. Dla WordPress będą to przede wszystkim zaszyte w szablonie odwołania do obrazków oraz adresy url w treści postów.

Treść postów można zmienić jednym zapytaniem SQL. Zrób tylko najpierw kopię bezpieczeństwa i podmień adres domeny na swój.

UPDATE wp_posts SET `post_content` = REPLACE (`post_content`, 'src="http://www.your-site.com', 'src="https://www.your-site.com');

Jeżeli tego nie zrobisz, w przeglądarce będzie pojawiało się ostrzeżenie, że nie wszystkie treści są poprawnie zabezpieczone.

Warto również zaktualizować wszystkie linki prowadzące do naszego serwisu, jednak ponieważ mamy zrobione przekierowanie 301 nie jest to konieczne.

Weryfikacja poprawności certyfikatu

Podstawowy test wykona za nas już sama przeglądarka. Jeżeli widzimy zieloną kłódkę i nie pojawiają się żadne ostrzeżenia, to możemy przejść dalej. Najczęściej ostrzeżenia powodują obrazki, dla których nie został zmieniony adres url.

Do przetestowania samego certyfikatu możemy wykorzystać jeden z testerów online, np. ssllabs.

Przekierowania

Powinniśmy też sprawdzić poprawność przekierowań. Można to zrobić np. przy pomocy Google Chrome i narzędzi dla programistów. Wpisujemy adres z http i sprawdzamy przekierowania w zakładce Network.

Chrome SSL

Chrome SSL

Podsumowanie

Bezpieczeństwo transakcji w Internecie to temat, któremu poświęca się coraz więcej uwagi. Dopóki takie firmy jak Google będą swoimi działaniami to wspierały i będą powstawały takie projekty jak Let’s Encrypt, możemy liczyć, że sytuacja będzie cały czas się zmieniała, z korzyścią dla wszystkich użytkowników sieci.

Niezależnie od tego, czy prowadzisz sklep internetowy, czy prywatnego bloga warto przynajmniej zapoznać się z najnowszymi trendami, zwłaszcza jeżeli nie wiąże się to z dodatkowymi kosztami.

Linki

No comments
Share: