Programista_83.pdf

(13249 KB) Pobierz
JAK NIE NAUCZYĆ SIĘ PROGRAMOWAĆ
HAZELCAST – COŚ WIĘCEJ NIŻ ROZPROSZONY CACHE
STREFA CTF
Index: 285358
www
programistamag
pl
Magazyn
programistów
i
liderów
zespołów
IT
4
/
2019
(
83
)
Cena 23,90 zł (w tym VAT 5%)
lipiec / sierpień 2019
JAKA SIŁA
DRZEMIE W
POWERSHELLU
AWS IoT Core. Telemetria i zdalna
kontrola urządzeń IoT
Programowanie reaktywne.
Do widzenia MVC?
Nowoczesne aplikacje webowe
z NestJS
OPC-UA jako podstawa komunikacji
Industry 4.0
Reproducible Builds
Ostatnie 30 lat w programowaniu
(z mojej perspektywy)
„May you live in interesting times”
Niedawno zdałem sobie sprawę, że programuję już 5/6 życia. I w sumie sporo
się w tym czasie zmieniło, zarówno od strony mocy obliczeniowej czy dostęp-
nej pamięci, programowania, jak i samej
nauki
programowania. Patrząc w prze-
szłość, zastanawiam się, czy teraz jest łatwiej, czy trudniej zostać programistą.
Jeśli pod koniec lat '80 szczęśliwi posiadacze 8-bitowców zapragnęli
uczyć się programowania, wystarczyło, że włączą komputer (i np. poczekają
aż pojawi się sławne READY interpretera języka BASIC) i wezmą do ręki instruk-
cję obsługi, w której zapewne znajdzie się kilka przykładowych programów do
przepisania i poeksperymentowania (ewentualnie zakupią wychodzący wtedy
magazyn Bajtek). W przypadku pojawiających się trudności przestawało być
wesoło – materiały do nauki były relatywnie trudno dostępne, Internet miał
być w Polsce dostępny dopiero za kilka lat, a w okolicy było niewielu kompute-
rowców (chyba że ktoś mieszkał w dużym mieście przy uczelni technicznej).
Obecnie takich problemów w zasadzie nie ma – Internet jest przepełniony
materiałami do nauki w najróżniejszych formach, a znalezienie osoby, która może
nam pomóc, jest często kwestią wejścia na odpowiedni serwis (np. StackOverflow)
lub kanał na Slacku/Discordzie/IRCu.
Z drugiej jednak strony zacząć faktycznie programować jest zdecydowa-
nie trudniej. Trzeba podjąć decyzję co do wyboru języka („który wybrać?”), po-
brania i instalacji odpowiedniego środowiska („jak się to obsługuje?”), a często
również utworzenia „nowego projektu” („które opcje pozaznaczać?”) – niby
brzmi trywialnie, ale dla osoby kompletnie zielonej jest to pewna dawka bólów
głowy nawet przed faktycznym napisaniem choćby linijki kodu.
Niemniej jednak historia i tutaj zatoczyła koło. Tekst ten piszę, korzystając
z przeglądarki internetowej i serwisu Google Docs – gdybym nacisnął jeden
z kilku skrótów klawiszowych (np. F12), to pojawiłoby się okno interpretera
JavaScript (można by się wręcz pokusić o nazwanie tego środowiskiem pro-
gramistycznym), które z powodzeniem, acz w ograniczonym zakresie, można
użyć do nauki programowania.
Inną sprawą jest kwestia zrozumienia tego, jak działa komputer. Co tu
dużo pisać – kiedyś było prościej. Komputery były stosunkowo nieskom-
plikowane: prosty procesor (kilkanaście-kilkadziesiąt RISCowych instrukcji
assemblera), kilka jeszcze prostszych układów scalonych obsługujących
układ graficzny, dźwiękowy czy I/O – i w sumie tyle. W zasadzie posiadając
trochę wiedzy o elektronice, można było całość zrozumieć, a i drobne mody-
fikacje sprzętu wymagały jedynie lutownicy i w miarę stabilnej ręki (vide Baj-
tek 08/1986, strona 12). Nawet od strony oprogramowania było dużo łatwiej
– „systemy operacyjne” 8-bitowców zajmowały kilka kilobajtów i w zasadzie
z odrobiną uporu można było je całe „przeczytać”.
Wracając do teraźniejszości, zastajemy ultra-skomplikowane systemy
komputerowe. Procesory mają po kilkaset instrukcji CISCowych (które pod
spodem są tłumaczone na pseudo-RISCowe), kilka różnych trybów działania
i poziomów uprzywilejowania, a nawet własny firmware (w postaci mikroko-
du). Co więcej, w zasadzie każde urządzenie ma swój własny procesor (dyski
twarde, karty sieciowe i graficzne czy nawet płyty główne i monitory) – niektóre
z nich można nawet [prawie] dowolnie oprogramowywać (np. GPU, choć po
prawdzie pierwsze programowalne w C karty graficzne wyszły w 1985 r. – vide
Texas Instruments Graphics Architecture).
A na tym wszystkim działają „ważące” gigabajty systemy operacyjne
(czasem nawet po kilka, jeśli mamy do czynienia z wirtualizacją, np. WSL 2)
i jeszcze większe pakiety programów (które i tak częściowo są wypierane
przez chmurę, patrz np. Google Stadia).
Brzmi strasznie, ale w praktyce nie jest to oczywiście problematyczne, po-
nieważ wraz z upływem czasu „codzienne” programowanie odsunęło się rów-
nież od sprzętu, i to na całkiem znaczną odległość. Na przykład pisząc grę 3D
w JavaScript na przeglądarki, mamy w zasadzie pewność, że zadziała ona bez
żadnych zmian zarówno na komputerze PC opartym na procesorze x86 z kartą
graficzną z rodziny GeForce RTX, jak i na telefonie komórkowym z procesorem
ARM i układem graficznym Mali.
Co ciekawe, nie oznacza to, że wysokopoziomowe języki programowa-
nia są powolne. Wręcz przeciwnie! Stosowane obecnie i ciągle udoskonalane
mechanizmy typu JIT pozwalają na generowanie w locie bardzo wydajnego
kodu maszynowego, który dodatkowo może być optymalizowany wielokrot-
nie w trakcie działania aplikacji na podstawie stale napływających informacji
o tym, na jakiego rodzaju danych pracuje. Porównując to np. ze wspomnianym
na początku interpreterem, bądź co bądź, wysokopoziomowego języka BASIC
z 8-bitowych komputerów, który trzymał program w pamięci, jak i listę „skom-
presowanych słownikowo” linii, i który parsował każdą linię na nowo przy każ-
dym jej wykonaniu, progres zdecydowanie jest widoczny.
Parafrazując pewne internetowe powiedzenie i zarazem podsumowując,
kiedyś to były czasy! Teraz też są czasy, tylko ciekawsze!
Gynvael Coldwind
REKLAMA
SpiS treści
BIBLIOTEKI I NARZĘDZIA
Jaka siła drzemie w PowerShellu?
Michał Zbyl
6
PROGRAMOWANIE SYSTEMÓW OSADZONYCH
OPC-UA jako podstawa komunikacji Industry 4.0
Rafał Slany
12
PROGRAMOWANIE APLIKACJI WEBOWYCH
Programowanie reaktywne. Do widzenia MVC?
Michał Jawulski
22
30
Nowoczesne aplikacje webowe z NestJS
Konrad Dysput
PRZETWARZANIE RÓWNOLEGŁE I ROZPROSZONE
Hazelcast – coś więcej niż rozproszony cache
Wojciech Kurda
36
PROGRAMOWANIE W CHMURZE
AWS IoT Core. Telemetria i zdalna kontrola urządzeń IoT
Dawid Borycki
38
ALGORYTMIKA
Wybrane algorytmy i struktury danych. Część 6
Wojciech Sura
44
BEZPIECZEŃSTWO
Reproducible Builds
Mariusz Zaborski
52
STREFA CTF
Writeup Gothic – CONFidence 2019 Finals
Jarosław Jedynak
58
FELIETON
Jak nie nauczyć się programować?
Wojciech Sura
66
KLUB DOBREJ KSIĄŻKI
Programowanie w języku Rust
Paweł “KrzaQ” Zakrzewski
68
R E DA KC JA
Magazyn Programista wydawany jest przez Dom Wydawniczy Anna Adamczyk
Wydawca/Redaktor naczelny:
Anna Adamczyk (annaadamczyk@programistamag.pl).
Redaktor prowadzący:
Mariusz „maryush” Witkowski (mariuszwitkowski@programistamag.pl).
Korekta:
Tomasz Łopuszański.
Kierownik produkcji:
Havok.
DTP:
Havok.
Dział reklamy:
reklama@programistamag.pl,
tel. +48 663 220 102, tel. +48 604 312 716.
Prenumerata:
prenumerata@programistamag.pl.
Współpraca:
Michał Bartyzel, Mariusz Sieraczkiewicz, Dawid Kaliszewski, Marek Sawerwain, Łukasz Mazur, Łukasz
Łopuszański, Jacek Matulewski, Sławomir Sobótka, Dawid Borycki, Gynvael Coldwind, Bartosz Chrabski, Rafał Kocisz,
Michał Sajdak, Michał Bentkowski, Paweł „KrzaQ” Zakrzewski, Radek Smilgin, Jarosław Jedynak.
Adres wydawcy:
Dereniowa 4/47, 02-776 Warszawa.
Druk:
http://www.edit.net.pl/,
Nakład: 4500 egz.
Projekt okładki:
Sebastian Rosik
Nota prawna
Redakcja zastrzega sobie prawo do skrótów i opracowań tekstów
oraz do zmiany planów wydawniczych, tj. zmian w zapowiadanych
tematach artykułów i terminach publikacji, a także nakładzie
i objętości czasopisma.
O ile nie zaznaczono inaczej, wszelkie prawa do materiałów i znaków
towarowych/firmowych zamieszczanych na łamach magazynu
Programista są zastrzeżone. Kopiowanie i rozpowszechnianie ich bez
zezwolenia jest Zabronione.
Redakcja magazynu Programista nie ponosi odpowiedzialności za
szkody bezpośrednie i pośrednie, jak również za inne straty i wydatki
poniesione w związku z wykorzystaniem informacji prezentowanych
na łamach magazynu Programista.
Z A M Ó W P R E N U M E R AT Ę M A G A Z Y N U P R O G R A M I S TA
przez formularz na stronie:
http://programistamag.pl/typy-prenumeraty/
lub zrealizuj ją na podstawie faktury Pro-forma. W spawie faktur Pro-forma prosimy kontaktować się z nami drogą mailową:
redakcja@programistamag.pl.
Prenumerata realizowana jest także przez
RUCH S.A.
Zamówienia można składać bezpośrednio na stronie:
www.prenumerata.ruch.com.pl
Pytania prosimy kierować na adres e-mail:
prenumerata@ruch.com.pl
lub kontaktując się telefonicznie z numerem:
801 800 803
lub
22 717 59 59,
godz. 7 : 00 – 18 : 00 (koszt połączenia wg taryfy operatora).
Zgłoś jeśli naruszono regulamin