Programista_88.pdf

(14613 KB) Pobierz
WSPÓŁCZESNE SIECI KOMPUTEROWE, CZYLI CO DO CZEGO PASUJE • STREFA CTF
Index: 285358
www
programistamag
pl
Magazyn
programistów
i
liderów
zespołów
IT
1
/
2020
(
88
)
luty/marzec 2020
Cena 23,90 zł (w tym VAT 8%)
„Młodszy brat” OpenCV, czyli
biblioteka Emgu CV
Jak zbudować własną
kryptowalutę
Nie samym Angularem
i Reactem frontend żyje
Klasyfikacja obrazów
z TensorFlow
Niedociągnięcia są wszędzie
„S” in IoT stands for „security”
Czasami zastanawiam się, czy jestem w stanie policzyć wszystkie pro-
cesory i mikrokontrolery działające wokół mnie. Część z tych urządzeń ma
nieprzerwany dostęp do sieci Internet, do czego z biegiem lat zdążyliśmy
się przyzwyczaić. Stworzone zostały, aby uczynić życie łatwiejszym, a nieraz
i bezpieczniejszym. Naturalną częścią ewolucji i rozwoju cywilizacji jest imple-
mentowanie nowych rozwiązań tam, gdzie przyniosą one udogodnienia. I tak
dzień za dniem postępuje proces uzależniania się społeczeństwa od wyników
obliczeń, które nie zawsze dadzą oczekiwane wartości. Powodów może być
wiele. Jeden z nich to fakt, że procesor wykona to, co programista napisał,
a to niekoniecznie musi pokrywać się z tym, co chciał napisać lub myślał, że
napisał. Programowanie nie należy do czynności prostych. Wymaga specyficz-
nego sposobu myślenia, wiedzy na temat środowiska, w którym kod ma dzia-
łać, a także pamiętania o ograniczeniach, które niesie za sobą system binarny.
Przekładając rozwiązywany problem ze świata rzeczywistego o ciągłej naturze
na model komputerowy, binarny i skwantowany, łatwo pokusić się o uprosz-
czenia i pewne założenia mające daleko idące konsekwencje.
Problematycznym zagadnieniem w programowaniu są wszelkie wielkości
fizyczne, z których rodzą się różne błędy, które można by uznać za komiczne,
gdyby nie jeden aspekt – bywa, że konsekwencjami niedopatrzeń w interak-
cjach oprogramowania ze światem zewnętrznym są straty finansowe, porażki
ważnych projektów naukowych, a nawet ofiary.
Czas systemowy obrazuje upływ czasu w systemie komputerowym. Lecz
nie jest to zagadnienie tak trywialne, jakby się mogło wydawać na pierwszy
rzut oka. Obecnie przyjęło się, że oprogramowanie tworzone na systemy
kompatybilne z POSIX stosuje „unix epoch”, licząc upływ sekund od godziny
00:00:00 czasu uniwersalnego 1 stycznia 1970 roku. Natomiast systemy z ro-
dziny Windows wykorzystują do tego strukturę SYSTEMTIME, składającą się
z pól przechowujących reprezentacje roku, miesiąca, dnia, godziny, minuty,
sekundy i nanosekund. SYSTEMTIME nie powinien być wykorzystywany do
obliczania różnic w datach, a w systemie obecnych jest jeszcze kilka innych
sposobów zapisywania czasu, jak struktura FILETIME reprezentująca wielo-
krotność stu nanosekundowych taktowań od 1 stycznia 1601 roku 00:00:00
UT, co jest zgodne z… kalendarzem gregoriańskim. Dokładając do tego lata
i sekundy przestępne, robi się jeszcze ciekawiej. Ale nie zawsze tak było.
W drugiej połowie XX wieku, gdy komputery były jeszcze w powijakach, pamięć
była luksusem, o który należało dbać. W wyniku optymalizacji i utrzymywania
wstecznej kompatybilności epoka we wczesnych wersjach Excela zaczynała
się w nic nieznaczącej dacie 0 stycznia 1900 roku, a rok ten był traktowany jako
przestępny. Jeszcze wcześniej popularny mainframe PDP-10 potrzebował łat-
ki, którą określono kryptonimem „DATE75”, gdyż w wyniku zastosowania 12-bi-
towego pola do przechowywania znacznika czasu można było zaprezentować
daty do 4 stycznia 1975 roku.
Do katastrofy mającej nastąpić w wyniku błędu w 2000 roku na szczęście
nie doszło. Zagrożenie to zawisło nad rozwijającym się światem, ponieważ
REKLAMA
część programów przechowywała tylko dwie ostatnie cyfry w reprezentacji
roku. Tym samym 1 stycznia 2000 roku według podatnej części oprogramo-
wania wypadał przed 31 grudnia 1999 roku. Wchodząc w nowy dwutysięczny
rok, czas systemowy cofnął się do 1900 roku albo przeskoczył do 19100 roku.
Dzięki wdrożonym akcjom, do końca świata, jaki znamy, nie doszło, ale pro-
blem nie został całkowicie zażegnany. W roku 2038 ponownie przyjdzie się ludz-
kości zmierzyć z przekręcającym się 31-bitowym licznikiem (32-bitowa zmienna
ze znakiem). Mam nadzieję, że i tym razem uda się uniknąć katastrofy.
Nie udało się jej, niestety, uniknąć 25 lutego 1991 roku w Zatoce Perskiej
w trakcie operacji Pustynna Burza. System Patriot w mieście Az-Zahran dzia-
łał od 100 godzin. PAC operował w arytmetyce 24-bitowej. Czas zapisywany
był jako liczba całkowita dziesiętnych sekundy. Następnie taką wartość za-
mieniano na 48-bitową liczbę zmiennoprzecinkową. W wyniku odkładającego
się w trakcie pracy błędu zaokrąglenia i wykorzystaniu w obliczeniach dwóch
pomiarów czasu, których błędy nawzajem się nie zniwelowały, obliczono trajek-
torię przelotu pocisku. Gdy okazało się, że nowy pomiar radaru nie potwierdza
obliczeń, system potraktował alarm jako fałszywy i zaniechał dalszej akcji. Błąd
wyniósł około 0.3433 sekundy. W tym czasie SCUD przebyła ponad 600 me-
trów. Założenie, z jakim budowano systemy PAC, czyli działanie maksymalnie
przez osiem godzin w jednym miejscu, kosztowało życie 28 żołnierzy. Najsmut-
niejsze w całej historii jest to, że patch był gotowy… i trafił do bazy 26 lutego.
Niedawno podobny, na szczęście w porę wykryty błąd wymagał od prze-
woźników restartowania komputera pokładowego samolotu Boeing 787. Licz-
nik w oprogramowaniu sterującym przepełniał się po 248 dniach, skutkując
wyłączeniem generatora. To mogło doprowadzić do odcięcia prądu zmienne-
go w statku powietrznym, jeśli silniki zostałyby uruchomione jednocześnie.
Czas to nie jedyna trudna jednostka. Reprezentacja odległości i położenia
w przestrzeni również może prowadzić do niespodziewanych skutków oraz
czegoś, co określamy błędami bizantyjskimi. Niech przykładem będzie Boeing
737 Next Generation, którego ekrany mogą stać się czarne w przypadku podej-
ścia do pasów o określonych współrzędnych.
Mówi się, że państwa można podzielić na te, które wykorzystują system
imperialny, i te, które na Księżycu nie były. Misja sondy Mars Climate Orbiter
chciała połączyć te dwa światy w dalszym podboju Kosmosu. Niestety, wyko-
rzystanie dwóch systemów metrycznych zakończyło się zniszczeniem sondy.
Komputery pomogły wysłać pierwszych ludzi na Księżyc, codziennie ob-
sługują tryliony zdarzeń, wykonując miliardy linijek kodu w służbie ludzkości.
Czasami błędne założenia i niedopatrzenia prowadzą do zamiany misji ko-
smicznej w drogie fajerwerki albo zagrażającej życiu pacjenta nieplanowanej
liczby naświetleń. W obliczu tak powszechnej dostępności mikroprocesorów,
które każdy z nas może programować, może lepiej wstrzymać się czasami
z wydaniem następnej funkcjonalności i upewnić się, czy algorytmy nie opie-
rają się na zbyt wielu założeniach i uproszczeniach, których naruszenie może
doprowadzić do katastrofy.
foxtrot_charlie
SpiS treści
BIBLIOTEKI I NARZĘDZIA
WPF Deep Dive
Wojciech Sura
6
16
20
„Młodszy brat” OpenCV, czyli biblioteka Emgu CV
Mateusz Rus
Klasyfikacja obrazów z TensorFlow
Dawid Borycki
PROGRAMOWANIE SYSTEMOWE
Mikroprocesor w stylu „retro” (część 2)
Robert Jaremczak
26
PROGRAMOWANIE APLIKACJI WEBOWYCH
Nie samym Angularem i Reactem frontend żyje
Oleksandr Tkachov
34
INŻYNIERIA OPROGRAMOWANIA
Jak zbudować własną kryptowalutę
Jakub Kozioł
38
STREFA CTF
Dragon CTF 2019 – Arcane Sector
Jarosław Jedynak
44
PLANETA IT
Współczesne sieci komputerowe, czyli co do czego pasuje
Wojciech Macek
56
64
Glossofobia – co nas przeraża w roli prelegenta
Monika Malinowska
KLUB DOBREJ KSIĄŻKI
Programowanie w języku Kotlin. The Big Nerd Ranch Guide
Rafał Kocisz
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