Artykuł ten stanowi rozwinięcie artykułu „Przetwarzanie i analiza danych obserwacji Ziemi w Pythonie”, który ukazał się w numerze 3/2018 (70) magazynu „Programista”. W tamtym artykule zajmowaliśmy się podstawami: pozyskiwaniem danych i ich eksploracją. Tym razem temat zostanie rozwinięty o zagadnienia, z którymi zawsze mamy do czynienia przy przetwarzaniu danych satelitarnych: przekształceniami przestrzennego układu odniesienia i prawidłowym wyborem obszaru analizy oraz chmurami przysłaniającymi fragmenty obrazów.
Rejestracja obrazów polega na ich wyrównywaniu. Z tego powodu jest ona ściśle powiązana z problemem śledzenia obiektów, gdyż w obu przypadkach należy rozpoznać przesunięcie, obrót oraz zmianę skali pomiędzy danymi obrazami lub ich wybranymi fragmentami. W tym artykule pokażę, w jaki sposób zaimplementować oba te algorytmy z wykorzystaniem wybranych detektorów i deskryptorów cech dostępnych w bibliotece OpenCV. Całość rozwiązania utworzę w Visual Studio 2019 Preview przy użyciu języka Python.
W drugiej części artykułu o projekcie „małego rysownika” zajmiemy się przede wszystkim implementacją obsługi programów cieniujących (tzw. shaderów). Oczywiście nie będziemy implementować całego nowego języka, a tylko sam mechanizm w postaci odpowiednich funkcji. Omówimy też implementację systemów oświetlenia takich jak np. cieniowanie płaskie czy cieniowanie Phonga. Ponadto dodamy obsługę map normalnych, co pozwoli na odwzorowanie wypukłości tekstury obiektu i istotnie poprawi jakość otrzymanej grafiki.
Tworząc aplikacje pracujące w systemach współbieżnych, jak i rozproszonych, każdy programista wcześniej czy później stanie przed problemem synchronizacji dostępu wątków/procesów do obszaru zasobów współdzielonych, zwłaszcza pamięci, czy to w celu komunikacji między procesami, czy w celu odczytu/modyfikacji współdzielonych danych. Żądanie dostępu do danych może nastąpić jednocześnie w kilku wątkach, co wprowadza problem rywalizacji o zasoby. Sytuacja taka wymusza synchronizację dostępu do zasobów przez wątki, tak aby z jednej strony wykluczyć modyfikowanie wspólnych zasobów jednocześnie przez kilka wątków, a z drugiej strony zagwarantować pełną współbieżność.
W poprzedniej części artykułu skupiliśmy się na kilku algorytmach operujących na tablicy, a także na sposobie implementacji tablicy haszującej. Kontynuujemy nasze rozważania na temat struktur danych; tym razem poznamy listy i ich pochodne oraz ciekawą strukturę zbudowaną na tablicy – kopiec. Zobaczymy też, jak można wykorzystać część poznanych struktur w praktyce.
W tym artykule przyjrzymy się zaawansowanej analizie złożoności obliczeniowej bardzo popularnego algorytmu sortującego o nazwie QuickSort. Zbadamy nie tylko złożoność pesymistyczną, ale również złożoność optymistyczną i oczekiwaną. Algorytm QuickSort jest ciekawym przypadkiem ze względu na to, że na pozór wydaje się być algorytmem wolnym, ale w praktyce jest to jedna z najszybszych metod sortowania.
Dragon CTF to kontynuacja tradycji CONFidence CTF. Organizowane przez Dragon Sector (najstarszy aktywny polski zespół CTFowy) zawody odbyły się w tym roku na konferencji Security PWNing i trzymały bardzo wysoki poziom. Na zawodników jak zwykle czekały interesujące zadania sieciowe, błędy kryptograficzne do wykorzystania, niszowe architektury do analizy oraz usługi czekające tylko, żeby ktoś je wyeksploitował. Nowością w tym roku była gra, w której było trochę z wszystkiego – i to ją opiszemy w tym numerze.