Pytania inżynierskie PDF - Egzamin dyplomowy WI - Studia
Document Details
![ThrivingSugilite3921](https://quizgecko.com/images/avatars/avatar-19.webp)
Uploaded by ThrivingSugilite3921
Tags
Summary
Dokument zawiera zestaw pytań na egzamin dyplomowy dla kierunku informatyka. Pytania obejmują szeroki zakres tematów, w tym algorytmy, struktury danych, programowanie obiektowe w Javie i C++, bazy danych oraz zarządzanie oprogramowaniem. Zawiera również pytania rekurencyjne i iteracyjne oraz wzorce projektowe.
Full Transcript
Zestaw zagadnień na egzamin dyplomowy WI Całka nieoznaczona, oznaczona, zastosowanie i techniki obliczania. 11 Całka nieoznaczona 11 Całka oznaczona 11 Różnica mi...
Zestaw zagadnień na egzamin dyplomowy WI Całka nieoznaczona, oznaczona, zastosowanie i techniki obliczania. 11 Całka nieoznaczona 11 Całka oznaczona 11 Różnica między oznaczoną a nieoznaczoną 11 Techniki obliczania 12 Wielomian i szereg Taylora funkcji rzeczywistej. 12 Układy równań liniowych: różne metody rozwiązywania, liczba rozwiązań. 13 Wartości własne macierzy i ich zastosowania w informatyce 14 Grafy i ich typy, metody reprezentacji grafów 15 Relacje binarne, własności i metody reprezentacji 15 Zasada indukcji matematycznej 15 Twierdzenie Bayesa 15 Testowanie hipotez statystycznych 15 Wyznaczanie przedziałów ufności 15 Podstawowe cechy relacyjnych baz danych. 15 Podstawowe elementy i znaczenie diagramów związków encji oraz zasady prawidłowego projektowania schematów bazy danych. 15 Mechanizm współbieżności pracy wielu użytkowników w systemie zarządzania bazami danych. 16 Podstawowe obiekty, konstrukcje i znaczenie języka SQL. 17 Podstawowe zasady optymalizacji zapytań, w tym rodzaje i znaczenie indeksów w bazie danych. 18 Model architekturalny komputera wg. von Neumanna a model obliczeniowy komputera na podstawie maszyny Turinga i ich rola w informatyce. 19 Komputer von Neumanna 19 Maszyna Turinga 20 Porównanie z modelem von Neumanna 21 Logika boolowska i jej zastosowania w warstwie sprzętowej komputerów 21 1. Projektowanie bramek logicznych 24 2. Realizacja pamięci i rejestrów 24 3. Arytmetyka binarna 24 4. Kodowanie i dekodowanie 25 5. Przełączniki logiczne i obwody sterujące 25 6. Projektowanie procesorów i układów FPGA 25 7. Automatyzacja i sterowanie 25 Zapis binarny liczb całkowitych, zapis zmiennoprzecinkowy liczb rzeczywistych, arytmetyka komputerowa. 25 Miary efektywności obliczeniowej procesorów, pojemności pamięci komputerowej oraz wydajności systemów obliczeniowych. 26 Procesory 26 Pamięć komputerowa 26 Efektywność ogólna 27 Prawo Moore’a i implikacje z niego wynikające w kontekście rozwoju sprzętu komputerowego. 27 Szacowanie złożoności algorytmów, klasy złożoności problemów algorytmicznych. 29 Najważniejsze algorytmy wyszukiwania i sortowania, przegląd i zastosowania. 30 Charakterystyka i zastosowania podstawowych struktur danych: stos, kolejka, kolejka priorytetowa, struktura Find-Union, słownik oraz Drzewa binarne i drzewa n-arne w algorytmice. Charakterystyka, sposoby implementacji i zastosowania 31 Stos (Stack): 31 Kolejka (Queue): 31 Kolejka Priorytetowa (Priority Queue): 32 Find-Union: 32 Słownik (Dictionary/Map/Hashmapa) 32 Implementacje: 32 ○ Tablica z haszowaniem: 32 ○ Drzewo BST: 33 ○ Drzewo AVL (lepsze do wyszukiwań): 33 ○ Drzewo czerwono-czarne (lepsze do modyfikacji): 33 Drzewa n-arne 33 Przykłady zastosowań 33 Algorytmy rekurencyjne vs algorytmy iteracyjne, porównanie i omówienie podstawowych założeń konstrukcyjnych. 34 Algorytmy rekurencyjne vs iteracyjne - kluczowe różnice i założenia: 34 Podejście do rozwiązania problemu: 34 Charakterystyka implementacji: 34 Przykłady zastosowań: 35 Aspekty wydajnościowe: 35 Możliwości wzajemnej zamiany: 35 Konstrukcja obiektów i zarządzanie pamięcią operacyjną w Javie i C++. 36 Rola klas, interfejsów i mixinów w programowaniu na przykładzie języka Java. 38 Kompozycja nad dziedziczenie 38 Pojęcie dziedziczenia na przykładzie języków Java i C++ 40 Definicja i cel: 40 Dziedzicznie w Javie vs C++ 40 Podstawowa składnia: 40 Mechanizmy kontroli dostępu: 40 Metody wirtualne: 40 Konstruktory i destruktory: 41 Słowa kluczowe: 41 Problemy i wyzwania: 41 Istota i zastosowania polimorfizmu na przykładzie języków Java i C++. 41 Rodzaje polimorfizmu: 41 Różnice między Javą a C++: 42 Kluczowe wnioski 43 Użycie tablic oraz innych struktur danych w Javie i C++. Java Collections Framework 44 Java Collections Framework: 44 C++ - Standard Template Library (STL): 44 Główne różnice: 44 Kluczowe zalety: 44 Programowanie współbieżne ? mechanizmy i narzędzia na przykładzie języka Java. 45 Kluczowe mechanizmy: 45 Mechanizmy zaawansowane: 46 Kluczowe zasady: 46 Typy i metody sparametryzowane (generics) w Javie. Szablony (templates) w C++. 46 Java - Generics: 46 C++ - Szablony: 47 Kluczowe różnice 47 Główne zastosowania: 47 Lambda-wyrażenia i interfejsy funkcyjne w języku Java. 48 Główne charakterystyki: 48 Interfejsy funkcyjne: 48 Najczęstsze zastosowania: 48 Kluczowe zalety: 49 Przetwarzanie strumieniowe (środki pakietu java.util.stream). 49 Kluczowe cechy Stream API: 49 Podstawowe operacje: 49 Rodzaje operacji: 50 Kluczowe zastosowania: 50 Główne zalety: 50 Narzędzia programowania operacji wejście-wyjścia w języku Java. 50 Główne pakiety: 50 Strumienie wejściowe/wyjściowe: 50 Zaawansowane mechanizmy NIO: 51 Kluczowe operacje: 51 Zalety nowoczesnych narzędzi: 51 Zarządzanie projektem budowy oprogramowania: rodzaje działań, dobór metodyki oraz kontekst pozatechniczny. 51 Język UML – charakterystyka oraz sposób wsparcia różnorodnych modeli danych. 52 Charakterystyka: 52 Główne rodzaje diagramów: 52 Kluczowe zastosowania: 52 Zalety UML: 52 Przykładowe narzędzia: 53 Główne cele: 53 Wzorce projektowe oraz ramy programistyczne (frameworks) – charakterystyka, przykłady, zastosowania. 53 Po co stosować wzorce projektowe? 53 Wzorce projektowe: 53 Różnica między wzorcami a algorytmami 54 Najpopularniejsze wzorce - Kreacyjne 54 Metoda wytwórcza (Factory Method) 54 Budowniczy (Builder) 54 Singleton 54 Najpopularniejsze wzorce - Strukturalne 55 Fasada 55 Kompozyt (Composite) 55 Dekorator 55 Adapter 55 Most (Bridge) 55 Proxy 55 Najpopularniejsze wzorce - Behawioralne 56 Łańcuch zobowiązań (Chain of Responsibility) 56 Iterator 56 Polecenie (Command) 56 Mediator 56 Memento 56 Obserwator (Observer) 56 Strategia (Strategy) 56 Metoda szablonowa (Template Method) 57 Frameworki: 57 Przykładowe frameworki: 57 Zalety: 57 Kluczowe zastosowania: 57 Zapewnienie jakości oraz testowanie oprogramowania – normy, metody, kryteria. 57 Normy jakości: 58 Rodzaje testów: 58 Kryteria jakości: 58 Metody testowania: 58 Narzędzia: 58 Kluczowe cele: 59 Rodzaje, metody specyfikowania oraz rola wymagań w procesie wytwarzania oprogramowania. 59 Rodzaje wymagań: 59 1. Funkcjonalne 59 2. Niefunkcjonalne 59 3. Biznesowe 59 Metody specyfikowania: 59 1. Dokumentacja tekstowa 59 2. Prototypowanie 59 3. Wywiady i warsztaty 59 Rola wymagań: 60 Kluczowe zasady: 60 Narzędzia: 60 Etapy pracy z wymaganiami: 60 Rezultat: 60 Usługi warstwy transportu na przykładzie protokołu TCP. 62 Kluczowe charakterystyki: 62 Główne mechanizmy: 62 1. Ustanawianie połączenia 62 2. Transmisja danych 62 3. Kontrola przepływu 62 Flagi TCP - kluczowe znaczenie: 62 1. SYN (Synchronize) 62 2. ACK (Acknowledge) 62 3. FIN (Finish) 62 4. RST (Reset) 63 5. PSH (Push) 63 6. URG (Urgent) 63 Zalety protokołu: 63 Zastosowania: 63 Przykładowy scenariusz transmisji: 63 Protokoły rutingu warstwy sieci na przykładzie protokołu OSPF. 63 Kluczowe charakterystyki: 64 Mechanizmy działania: 64 1. Odkrywanie topologii sieci 64 2. Wyznaczanie tras 64 Obszary OSPF: 64 Topologie 64 1. Topologia Gwiazdy (Star) 64 2. Topologia Magistrali (Bus) 64 3. Topologia Pierścienia (Ring) 64 4. Topologia Siatki (Mesh) 65 5. Topologia Drzewa (Tree) 65 Zalety protokołu: 65 Zastosowania: 65 Usługi warstwy łącza na przykładzie protokołu Ethernet lub protokołów z rodziny 802.11 (WiFi). 65 Ethernet - charakterystyka: 65 1. Fizyczne aspekty transmisji 65 2. Kluczowe mechanizmy 65 Protokoły WiFi (802.11): 66 1. Architektura bezprzewodowa 66 2. Mechanizmy dostępu 66 Wspólne cechy: 66 Zastosowania: 66 Kluczowe standardy: 66 Metody ochrony informacji stosowane w bankowości Internetowej. 66 Autoryzacja i uwierzytelnienie: 66 1. Wieloskładnikowe logowanie (Multi-Factor Authentication) 66 2. Mechanizmy identyfikacji 67 Szyfrowanie: 67 1. Protokoły bezpieczeństwa 67 2. Ochrona danych 67 Zabezpieczenia infrastrukturalne: 67 Dodatkowe metody: 67 Kluczowe zasady: 67 Modele barw 68 Podstawowe modele barw: 68 1. Model RGB 68 2. Model CMYK 68 3. Model HSV/HSL 68 4. Model Lab 68 Techniki cieniowania (shadery). 69 Rodzaje shaderów: 69 1. Vertex Shader 69 2. Fragment/Pixel Shader 69 3. Geometry Shader 69 4. Compute Shader 69 Zastosowania: 69 Kluczowe techniki: 69 Zalety: 70 Metody kompresji w standardzie MPEG. 70 Kluczowe rodzaje kompresji: 70 1. Kompresja wewnątrzklatek (Intra-frame) 70 2. Kompresja międzyklatek (Inter-frame) 70 Główne standardy MPEG: 70 Mechanizmy kompresji: 71 Zastosowania: 71 Kluczowe zalety: 71 Efekt aliasingu i metody jego zwalczania. Aliasing a częstotliwość próbkowania. 71 Istota aliasingu: 71 Mechanizm powstawania: 71 Przykłady aliasingu: 71 Metody zwalczania: 72 1. Filtrowanie dolnoprzepustowe 72 2. Antyaliasing 72 3. Zwiększenie częstotliwości próbkowania 72 Zastosowania: 72 Kluczowe zasady: 72 Zasady interakcji człowiek-komputer: przedstaw i omów heurystyki Nielsena-Molicha. 72 10 zasad heurystycznych: 72 1. Widoczność stanu systemu 72 2. Zgodność systemu ze światem rzeczywistym 72 3. Kontrola użytkownika i swoboda działania 73 4. Konsekwencja i standardy 73 5. Zapobieganie błędom 73 6. Rozpoznawanie zamiast przypominania 73 7. Elastyczność i wydajność 73 8. Estetyczny i minimalistyczny design 73 9. Pomoc w rozpoznawaniu, diagnozowaniu i usuwaniu błędów 73 10. Pomoc i dokumentacja 73 Praktyczne zastosowanie: 73 Kluczowe cele: 73 Implementacje podstawowych elementów pasywnych (rezystorów, kondensatorów i cewek). 74 Rezystor 74 Cewka 74 Kondensator 75 Filtr dolnoprzepustowy RC. Co to jest częstotliwość graniczna i pasmo przenoszenia filtru. 75 Struktura filtru: 76 Częstotliwość graniczna (fc): 76 Pasmo przenoszenia: 76 Mechanizm działania: 76 Charakterystyka filtru: 76 Przykładowe zastosowania: 76 Kluczowe wnioski: 76 Architektura harwardzka a architektura von Neumana. 77 Architektura von Neumanna: 77 1. Struktura podstawowa 77 2. Kluczowe cechy 77 Architektura harwardzka: 77 1. Struktura fundamentalna 77 2. Kluczowe zalety 77 Podstawowe różnice: 77 Zastosowania: 77 Ewolucja: 78 Kluczowe wnioski: 78 Sposoby obsługi zdarzeń w mikrokontrolerze. 78 Rodzaje obsługi zdarzeń: 78 1. Przerwania sprzętowe 78 2. Metoda poolingowa (odpytywanie) 78 3. Zdarzenia programowe 78 Kluczowe mechanizmy: 78 Przykładowe zdarzenia: 78 Zasady projektowania: 79 Popularne interfejsy komunikacyjne w mikrokontrolerze. 79 Popularne interfejsy: 79 1. UART (Universal Asynchronous Receiver-Transmitter) 79 2. SPI (Serial Peripheral Interface) 79 3. I2C (Inter-Integrated Circuit) 79 4. CAN (Controller Area Network) 79 5. USB (Universal Serial Bus) 79 Kluczowe parametry: 80 Zastosowania: 80 Klasyfikacja systemów operacyjnych. 80 Klasyfikacja ze względu na liczbę użytkowników: 80 1. Systemy jednozadaniowe 80 2. Systemy wielozadaniowe 80 Klasyfikacja ze względu na rodzaj interfejsu: 81 1. Systemy tekstowe (CLI) 81 2. Systemy graficzne (GUI) 81 Klasyfikacja ze względu na architekturę: 81 1. Systemy monolityczne 81 2. Systemy mikrojądrowe 81 3. Systemy hybrydowe 81 Klasyfikacja ze względu na środowisko: 81 1. Systemy sieciowe 81 2. Systemy rozproszone 81 3. Systemy czasu rzeczywistego 81 Specjalistyczne kategorie: 81 Klasyfikacja systemów operacyjnych ze szczególnym uwzględnieniem głównych rodzin systemowych: 82 1. Systemy UNIX / UNIX-podobne 82 a. Charakterystyka: 82 b. Główni przedstawiciele: 82 c. Kluczowe cechy: 82 2. Systemy DOS / MS-DOS 82 a. Charakterystyka: 82 b. Główni przedstawiciele: 82 c. Kluczowe cechy: 82 3. Systemy MS Windows 82 a. Charakterystyka: 82 b. Główni przedstawiciele: 83 c. Kluczowe cechy: 83 Porównanie systemów: 83 Ewolucja systemów: 83 Współczesne trendy: 83 Problem szeregowania procesów/wątków w systemach operacyjnych. 83 Istota szeregowania: 83 Algorytmy szeregowania: 84 1. FCFS (First Come, First Served) 84 2. SJF (Shortest Job First) 84 3. Algorytm Round Robin 84 4. Algorytmy priorytetowe 84 5. Wielopoziomowe kolejki szeregowania 84 Kluczowe parametry oceny algorytmów: 84 Dodatkowe mechanizmy: 84 Wyzwania: 84 Praktyczne przykłady: 85 Współczesne trendy: 85 Problem synchronizacji procesów/wątków w programach komputerowych oraz przedstaw jakie wsparcie w tym zakresie oferują systemy komputerowe i operacyjne. 85 Istota problemu synchronizacji: 85 Mechanizmy synchronizacji oferowane przez systemy operacyjne: 85 1. Semafory 85 2. Mutexy (Mutual Exclusion) 86 3. Monitors 86 4. Zmienne warunkowe 86 5. Mechanizmy atomowe 86 Strategie unikania problemów: 86 1. Wzajemne wykluczanie 86 2. Algorytmy bez blokad (Lock-free) 86 3. Transakcyjna pamięć współbieżna 86 Przykładowe problemy synchronizacyjne: 86 Wsparcie systemowe: 86 Narzędzia diagnostyczne: 87 Kluczowe zasady: 87 Mechanizmy obsługi pamięci operacyjnej wykorzystywane w systemach operacyjnych. 87 Podstawowe koncepcje zarządzania pamięcią: 87 1. Przestrzeń adresowa 87 2. Rodzaje adresacji: 87 Mechanizmy alokacji pamięci: 87 1. Przydział ciągły 87 2. Przydział dynamiczny 87 3. Stronicowanie 88 4. Segmentacja 88 Pamięć wirtualna: 88 Algorytmy wymiany stron: 88 Ochrona pamięci: 88 Strategie optymalizacji: 88 Kluczowe wyzwania: 88 Współczesne trendy: 89 Istota mechanizmu pamięci wirtualnej - wady i zalety tego rozwiązania. 89 Istota mechanizmu: 89 1. Koncepcja podstawowa 89 2. Mechanizm działania 89 Zalety pamięci wirtualnej: 89 1. Zwiększenie dostępnej pamięci 89 2. Izolacja procesów 89 3. Elastyczność zarządzania 89 4. Wsparcie wielozadaniowości 89 Wady pamięci wirtualnej: 90 1. Narzut wydajnościowy 90 2. Złożoność implementacji 90 3. Problemy z wydajnością dysku 90 Algorytmy zarządzania: 90 Kluczowe mechanizmy: 90 Współczesne trendy: 90 Matematyka Całka nieoznaczona, oznaczona, zastosowanie i techniki obliczania. Całka nieoznaczona W dużym uproszczeniu jest to wzór na pole powierzchni pod krzywą. Chat: to operacja matematyczna, gdzie szukamy funkcji pierwotnej dla danej funkcji. Zastosowanie: próbujemy znaleźć ogólne rozwiązanie równania. Da nam przybliżony wynik. ∫f(x)dx=F(x)+C f(x) to funkcja podcałkowa, F(x)F(x)F(x) to funkcja pierwotna (całka), C to stała całkowania, ponieważ pochodna stałej wynosi 0, więc dla każdej wartości stałej C, F(x)+CF(x) + CF(x)+C jest poprawną całką. Całka oznaczona Chat: pozwala obliczyć pole pod wykresem funkcji na pewnym przedziale. Zastosowanie: Obliczenie pola pod wykresem Różnica między oznaczoną a nieoznaczoną Nieoznaczona da nam ogólny/przybliżoną wartość, a oznaczona da nam konkretną wartość. Techniki obliczania Przez podstawianie Kiedy: widzimy że jedna z części ma w sobie drugą część np.: e^(2x^2) to możemy wziąć to 2x^2 wyliczyć z niej pochodną podstawić to co mamy podstawić i zapewne coś skrócić przez części Kiedy: w każdym innym przypadku, np gdy jedna z części wygląda jakby była zrobiona z niech pochodna np e^x zawsze daje e^x co pozwala nam czy zmniejszyć czy też usunąć kompletnie jedną z części całki Wielomian i szereg Taylora funkcji rzeczywistej. Wielomian: Funkcja algebraiczna złożona z Sum składników F(x) = a₀ + a₁x + a₂x² +... + a xⁿ Szereg Taylora: Nieskończona suma Oszacowywania (zgadywania) wyglądu funkcji To też wielomian f(x) = f(a) + f'(a)(x-a) + f''(a)(x-a)²/2! + … Pozwala na aproksymację (oszacowanie) Układy równań liniowych: różne metody rozwiązywania, liczba rozwiązań. Twierdzenie Kroneckera-Capellego Robisz macierz, macierz A, macierz dopełnień, liczysz rząd (ilość schodków w eliminacji Gaussa) macierzy A, rząd macierzy A | B i: ○ Układ ma przynajmniej jedno rozwiązanie gdy rząd(A) == rząd(B) Liczba niewiadomych = n Układ ma dokładnie jedno rozwiązanie gdy: rząd(A) == rząd(B) == n Układ ma nieskończenie wiele rozwiązań gdy: rząd(A) == rząd(B) < n ○ Układ jest sprzeczny gdy rząd(A) != rząd(B). Powiązanie (koniunkcja) pewnej liczby równań liniowych Wartości własne macierzy i ich zastosowania w informatyce Grafy i ich typy, metody reprezentacji grafów Relacje binarne, własności i metody reprezentacji Zasada indukcji matematycznej Twierdzenie Bayesa Testowanie hipotez statystycznych Wyznaczanie przedziałów ufności Bazy danych Podstawowe cechy relacyjnych baz danych. To dwuwymiarowa tabela składająca się z kolumn - atrybutów i wierszy - rekordów Dane w tej bazie są przechowywane w tabelach ○ Tabele składają się z rekordów ○ Rekordy składają się z pól Ograniczenia integralności (zapewniające poprawność) ○ Klucz podstawowy/główny (Wartości są unikatowe i wystarczalne dla jednoznacznej identyfikacji) ○ Klucz obcy (opcjonalny) ○ Klucz alternatywny (opcjonalny) Musi być obsługiwana wartość NULL Integralność danych Podstawowe elementy i znaczenie diagramów związków encji oraz zasady prawidłowego projektowania schematów bazy danych. Encja (tabela) - Reprezentują obiekty lub pojęcia w modelu danych, które mają znaczenie biznesowe (np. Klient, Produkt, Zamówienie). Związek / Relacja - Określają zależności między encjami (np. Klient składa Zamówienie). Atrybut - Charakterystyki encji lub relacji, np. imię, data urodzenia. Znaczenie diagramów związków encji 1. Wizualizacja struktury bazy danych 2. Precyzyjne określenie wymagań 3. Optymalizacja projektowania bazy 4. Generowanie fizycznych schematów I, II, III, 3.5 postać normalna [Boyce-Codd] good, unikamy zbyt dużej ilości kolumn (rozbijamy na oddzielne tabele i robimy asocjacje), każda encja ma @klucz główny. Jeśli coś da znormalizować (np. rozbić na oddzielne tabele, zmniejszyć zależności atrybutów), to do tego dążymy. Tl;dr; ograniczyć zależność atrybutów do klucza głównego. Mechanizm współbieżności pracy wielu użytkowników w systemie zarządzania bazami danych. Mechanizm transakcji przypomina zwykłe funkcje z języków programowania. Transakcje służą do pilnowania stanu bazy danych czy jej tabel. Jeżeli kilka użytkowników naraz uruchomi transakcję, to nie pojawi się problem jednoczesnego modyfikowania potencjalnie tego samego elementu. Podstawowe obiekty, konstrukcje i znaczenie języka SQL. Język SQL w swoich podstawach składa się z kilku kluczowych elementów: 1. Obiekty bazodanowe: ○ Tabele (Tables): Podstawowa struktura przechowywania danych, składająca się z wierszy i kolumn. ○ Widoki (Views): Wirtualne tabele utworzone na podstawie wyniku zapytania SELECT. ○ Indeksy (Indexes): Struktury optymalizujące wydajność wyszukiwania danych. ○ Procedury składowane (Stored Procedures): Predefiniowane zestawy instrukcji SQL. ○ Triggery (Triggers): Automatycznie wykonywane operacje w odpowiedzi na określone zdarzenia w bazie danych. 2. Podstawowe konstrukcje języka: ○ Klauzula SELECT: Wybieranie danych z jednej lub wielu tabel. ○ Klauzula WHERE: Filtrowanie wyników na podstawie określonych warunków. ○ Klauzula JOIN: Łączenie danych z różnych tabel. ○ Klauzula GROUP BY: Grupowanie wyników według określonych kryteriów. ○ Klauzula ORDER BY: Sortowanie wyników. ○ Operatory agregujące: SUM(), AVG(), COUNT(), MAX(), MIN(). 3. Typy operacji dzielimy na 3 główne kategorie: ○ DDL (Data Definition Language): Definiowanie struktury bazy danych CREATE: Tworzenie obiektów bazodanowych ALTER: Modyfikacja istniejących obiektów DROP: Usuwanie obiektów ○ DML (Data Manipulation Language): Manipulacja danymi INSERT: Dodawanie nowych rekordów UPDATE: Aktualizacja istniejących rekordów DELETE: Usuwanie rekordów ○ DCL (Data Control Language): Zarządzanie uprawnieniami GRANT: Nadawanie uprawnień REVOKE: Odbieranie uprawnień 4. Kluczowe koncepcje: ○ Klucz główny (Primary Key): Unikalny identyfikator rekordu w tabeli. ○ Klucz obcy (Foreign Key): Powiązanie między tabelami. ○ Normalizacja: Organizacja danych minimalizująca redundancję. ○ Transakcje: Sekwencja operacji traktowana jako pojedyncza jednostka przetwarzania. Podstawowe zasady optymalizacji zapytań, w tym rodzaje i znaczenie indeksów w bazie danych. W kontekście optymalizacji zapytań w bazach danych kluczowe jest rozumienie zarówno strategii projektowania efektywnych zapytań, jak i wykorzystania indeksów. Podstawowe zasady optymalizacji zapytań: 1. Analiza planu wykonania zapytania - każde zapytanie posiada plan wykonania, który pokazuje, w jaki sposób silnik bazy danych przetwarza dane. Kluczowe jest: Minimalizacja skanowania pełnotabelarycznego Maksymalizacja wykorzystania indeksów Redukcja liczby operacji łączenia (join) 2. Strategie optymalizacyjne Ograniczanie zwracanych rekordów poprzez precyzyjne warunki WHERE Unikanie nadmiarowych operacji JOIN Stosowanie podzapytań wydajnościowych Grupowanie i agregacja danych możliwie wcześnie w procesie przetwarzania Rodzaje indeksów i ich znaczenie: 1. Indeks B-drzewa (B-Tree) Najpopularniejszy typ indeksu: Optymalizuje wyszukiwanie zakresu Efektywny dla operatorów: =, >, (divide and conquer, pl. dziel i rządź) wybieramy element rozdzielający, dzielimy tablice na 2 fragmenty. Do 1: elementy nie większe, do 2: większe. Sortujemy je oddzielnie. Rekurencyjnie. Stosowany w wielu bibliotekach (bo szybki) Bubble sort -> porównujesz 2 elementy i zamieniasz Heap Sort (Kopiec). wykorzystuje strukturę kopca - specjalnego drzewa binarnego, gdzie każdy rodzic jest większy od swoich dzieci. Oferuje gwarantowaną złożoność O(n log n) bez dodatkowej pamięci, choć w praktyce często jest wolniejszy od Quick Sorta. Wyszukiwanie: Liniowe → liniowe iterowanie przez kontener. Polega na sekwencyjnym sprawdzaniu każdego elementu. Jest proste i działa na nieuporządkowanych danych, ale ma złożoność O(n). Binarne (wymaga posortowanego kontenera) → iterowanie logarytmiczne, analizujemy środek reszty kontenera, dziel i zwyciężaj. Znajdowanie elementu w tablicy. Wymaga posortowanego zbioru, ale oferuje znacznie lepszą złożoność O(log n). Istnieją też bardziej wyspecjalizowane algorytmy wyszukiwania, jak wyszukiwanie interpolacyjne, które jest udoskonaleniem binarnego dla równomiernie rozłożonych danych, czy wyszukiwanie z haszowaniem, oferujące teoretycznie stały czas dostępu. Charakterystyka i zastosowania podstawowych struktur danych: stos, kolejka, kolejka priorytetowa, struktura Find-Union, słownik oraz Drzewa binarne i drzewa n-arne w algorytmice. Charakterystyka, sposoby implementacji i zastosowania Stos (Stack): Zasada LIFO (Last In First Out): ○ Elementy zdejmowane są w odwrotnej kolejności niż były dodawane ○ Jak stos talerzy - możemy zdjąć tylko górny talerz ○ Dostęp tylko do elementu na szczycie stosu Kluczowe operacje: ○ push: dodanie elementu na szczyt (O(1)) ○ pop: zdjęcie elementu ze szczytu (O(1)) ○ peek/top: podejrzenie elementu na szczycie bez zdejmowania (O(1)) ○ isEmpty: sprawdzenie czy stos jest pusty (O(1)) Zastosowania: ○ Zarządzanie wywołaniami funkcji w programach ○ Sprawdzanie poprawności nawiasowania ○ Implementacja funkcji "cofnij" (undo) w programach ○ Obliczanie wyrażeń w notacji postfiksowej ○ Przechodzenie drzew w głąb (DFS) Kolejka (Queue): Zasada FIFO (First In First Out): ○ Elementy obsługiwane w kolejności dodawania ○ Jak kolejka w sklepie - pierwszy przyszedł, pierwszy obsłużony ○ Dostęp tylko do początku i końca kolejki Kluczowe operacje: ○ enqueue: dodanie elementu na koniec (O(1)) ○ dequeue: pobranie elementu z początku (O(1)) ○ front: podejrzenie pierwszego elementu (O(1)) ○ isEmpty: sprawdzenie czy kolejka jest pusta (O(1)) Warianty i zastosowania: ○ Kolejka cykliczna (ring buffer): efektywne wykorzystanie pamięci ○ Deque (double-ended queue): możliwość dodawania/usuwania z obu końców ○ Zastosowania w systemach operacyjnych do szeregowania zadań ○ Implementacja algorytmu przeszukiwania wszerz (BFS) ○ Buforowanie danych w komunikacji sieciowej Kolejka Priorytetowa (Priority Queue): Podstawowe cechy: ○ Każdy element ma przypisany priorytet ○ Element o najwyższym priorytecie obsługiwany pierwszy ○ Najczęstsza implementacja: kopiec binarny (binary heap) Kluczowe operacje: ○ insert: wstawienie elementu (O(log n)) ○ extract_max/min: pobranie elementu o najwyższym/najniższym priorytecie (O(log n)) ○ peek: podejrzenie najwyższego priorytetu bez usuwania (O(1)) Zastosowania: ○ Planowanie zadań w systemach operacyjnych ○ Algorytm Dijkstry (znajdowanie najkrótszej ścieżki) ○ Kodowanie Huffmana (kompresja danych) ○ Symulacje zdarzeń dyskretnych Find-Union: Charakterystyka: ○ Zarządza zbiorami rozłącznymi elementów ○ Każdy zbiór reprezentowany przez jeden element ○ Pozwala na efektywne łączenie zbiorów i sprawdzanie przynależności Kluczowe operacje: ○ find: znalezienie reprezentanta zbioru (prawie O(1) z optymalizacjami) ○ union: połączenie dwóch zbiorów (prawie O(1)) ○ makeSet: utworzenie nowego jednoelementowego zbioru (O(1)) Optymalizacje i zastosowania: ○ Kompresja ścieżek: spłaszczanie drzewa podczas operacji find ○ Łączenie według rangi: zachowanie zbalansowanego drzewa ○ Wykrywanie cykli w grafach ○ Algorytm Kruskala (minimalne drzewo rozpinające) ○ Grupowanie elementów w klastry Słownik (Dictionary/Map/Hashmapa) Podstawowa charakterystyka: ○ Przechowuje pary klucz-wartość ○ Klucze są unikalne ○ Szybki dostęp do wartości po kluczu Implementacje: ○ Tablica z haszowaniem: Średnia złożoność O(1) dla wszystkich operacji Wymaga dobrej funkcji haszującej Problem kolizji rozwiązywany przez łańcuchowanie lub adresowanie otwarte ○ Drzewo BST: Złożoność O(log n) dla zbalansowanego drzewa Może zdegenerować się do O(n) Prostsza implementacja niż haszowanie ○ Drzewo AVL (lepsze do wyszukiwań): Pierwsze historycznie drzewo samo-balansujące się Gwarantowana złożoność O(log n) dla wszystkich operacji Utrzymuje różnicę wysokości lewego i prawego poddrzewa ≤ 1 Szybsze wyszukiwanie niż w drzewie czerwono-czarnym Wolniejsze wstawianie/usuwanie (więcej rotacji) Zastosowania: Bazy danych gdzie częściej wyszukujemy niż modyfikujemy Słowniki z dużą liczbą operacji wyszukiwania Implementacje zbiorów wymagające uporządkowania ○ Drzewo czerwono-czarne (lepsze do modyfikacji): Gwarantowana złożoność O(log n) Automatyczne balansowanie Bardziej skomplikowana implementacja Zastosowania: Bazy danych (indeksowanie) Pamięć podręczna (cache) Implementacja zbiorów Zliczanie wystąpień elementów Przechowywanie konfiguracji i ustawień Drzewa n-arne Drzewa n-arne to istotne rozszerzenie koncepcji drzew binarnych, które warto uwzględnić w temacie podstawowych struktur danych. W przeciwieństwie do drzew binarnych, gdzie każdy węzeł może mieć maksymalnie dwóch potomków, w drzewie n-arnym każdy węzeł może mieć do n potomków. Jest to znacznie bardziej elastyczna struktura, która lepiej odzwierciedla wiele rzeczywistych hierarchii. Przykłady zastosowań 1. System plików - katalog może zawierać dowolną liczbę plików i podkatalogów 2. Struktura organizacyjna firmy - manager może mieć wielu podwładnych 3. Menu w aplikacjach - każda kategoria może mieć wiele podkategorii 4. Drzewa B i B+ w bazach danych - specjalne przypadki drzew n-arnych zoptymalizowane pod kątem systemów bazodanowych Szczególnym i często używanym przypadkiem drzewa n-arnego jest drzewo trie (często nazywane też prefiksowym), które służy do przechowywania i wyszukiwania ciągów znaków. W tym przypadku n jest równe rozmiarowi alfabetu, a każdy węzeł reprezentuje jeden znak. Drzewa n-arne można zaimplementować na kilka sposobów: Lista potomków dla każdego węzła "Lewe dziecko - prawy brat" (binary tree representation of n-ary tree) Tablica dla drzew zbalansowanych Ta struktura jest szczególnie ważna w kontekście baz danych i systemów plików, gdzie binarne ograniczenie byłoby zbyt restrykcyjne dla efektywnego działania systemu. Algorytmy rekurencyjne vs algorytmy iteracyjne, porównanie i omówienie podstawowych założeń konstrukcyjnych. Algorytmy rekurencyjne vs iteracyjne - kluczowe różnice i założenia: Podejście do rozwiązania problemu: Rekurencyjne: ○ Problem rozbijany na mniejsze podproblemy tego samego typu (naturalnie implementuje strategię "dziel i zwyciężaj") ○ Rozwiązanie bazuje na wywołaniach samego siebie ○ Wymaga warunku bazowego (przypadku końcowego) Iteracyjne: ○ Problem rozwiązywany krok po kroku ○ Wykorzystuje pętle i zmienne sterujące ○ Warunek końcowy oparty na iteratorze lub stanie ○ Wprost opisuje sekwencję kroków do wykonania Charakterystyka implementacji: Rekurencyjne: ○ Zazwyczaj krótszy i bardziej czytelny kod ○ Każde wywołanie tworzy nową ramkę stosu ○ Zużywa więcej pamięci na stos wywołań ○ Ryzyko przepełnienia stosu przy głębokiej rekurencji ○ Możliwość optymalizacji przez tail recursion Iteracyjne: ○ Często dłuższy, ale bardziej przewidywalny kod ○ Stałe zużycie pamięci (zwykle kilka zmiennych) ○ Lepsze zarządzanie pamięcią ○ Większa kontrola nad przebiegiem wykonania ○ Łatwiejsze debugowanie Przykłady zastosowań: Naturalne dla rekurencji: ○ Przechodzenie drzew i grafów ○ Problemy typu "dziel i zwyciężaj" (QuickSort, MergeSort) ○ Problemy kombinatoryczne ○ Obliczenia na strukturach rekurencyjnych Naturalne dla iteracji: ○ Proste pętle i sekwencje ○ Operacje na tablicach liniowych ○ Algorytmy z licznikami ○ Procesy wymagające dokładnej kontroli zasobów Aspekty wydajnościowe: Rekurencja: ○ Narzut na tworzenie ramek stosu ○ Potencjalnie wykładnicza złożoność pamięciowa ○ Możliwość optymalizacji przez kompilator ○ Problemy z bardzo głębokimi wywołaniami Iteracja: ○ Mniejszy narzut pamięciowy ○ Przewidywalna złożoność pamięciowa ○ Często szybsza w praktyce ○ Lepsza kontrola nad zużyciem zasobów Możliwości wzajemnej zamiany: Każdy algorytm rekurencyjny można przekształcić na iteracyjny Konwersja z rekurencji na iterację często wymaga własnej implementacji stosu Niektóre problemy są naturalnie rekurencyjne i ich iteracyjna implementacja jest znacznie bardziej skomplikowana Wybór metody zależy od: ○ Charakteru problemu ○ Wymagań wydajnościowych ○ Czytelności i łatwości w dalszym utrzymywaniu kodu ○ Ograniczeń środowiska wykonania (np. niektóre języki programowania nie implementują mechanizmu pętli) METODY PROGRAMOWANIA, ZAGADNIENIA PODSTAWOWE Konstrukcja obiektów i zarządzanie pamięcią operacyjną w Javie i C++. W Javie tworzymy obiekt przez konstruktor klasy. Pamięć operacyjna jest zarządzana przez wirtualną maszynę, do której należy m.in. garbage collector, który dynamicznie alokuje i dealokuje w niej (pamięci) zasoby. Obiekt tworzymy za pomocą słowa kluczowego “new”. Konstrukcja obiektów C++: tworzysz klasę, używasz klasy przykład poniżej https://www.oracle.com/java/technologies/object-oriented.html W Javie wszystko (poza prymitywami) jest obiektem! W C++ nie ma takiego odpowiednika jak w Javie (tj. zasoby dealokują się po zakończeniu programu, ale nie dochodzi do ich dealokacji w trakcie jego runtime’a, o ile instrukcje do ich uwolnienia nie zostały podane). Obiekty możemy tam stworzyć na stosie (stack) za pomocą konstruktora oraz na kopcu (heap) czyli alokując pamięć dynamicznie (za pomocą operatora `new`). Zarządzanie pamięcią w Javie: Java stosuje model zarządzania pamięcią z automatycznym garbage collection (odśmiecaniem), co zasadniczo różni ją od C++. Pamięć dzieli się na: Stertę (Heap): Dynamicznie alokowana pamięć dla obiektów Stos (Stack): Przechowuje zmienne lokalne i referencje Pamięć metadanych: Przechowuje informacje o klasach Zarządzanie pamięcią w C++: Model pamięci C++ wymaga ręcznego zarządzania pamięcią: Bezpośredni dostęp do pamięci Konieczność jawnej alokacji i dealokacji Większa kontrola, ale ryzyko błędów Zwalnianie pamięci Java: Garbage Collector C++: Ręczne usuwanie lub inteligentne wskaźniki Wydajność Java: Narzut garbage collection, więc większe obciążenie podzespołów C++: Bezpośredni dostęp do pamięci, więc lepsza wydajność (przy poprawnej implementacji) Różnice w zarządzaniu pamięcią między Javą a C++ wynikają z ich fundamentalnych założeń projektowych. Java oferuje większe bezpieczeństwo i wygodę, C++ zaś zapewnia maksymalną kontrolę i wydajność. Rola klas, interfejsów i mixinów w programowaniu na przykładzie języka Java. 1. Klasa a. Definiowanie obiektów, struktur danych b. Enkapsulacja zachowań i własności (dedykowanych dla obiektów tego samego typu) c. Ma w sobie dane (pola) i operacje (metody) d. Mechanizm dziedziczenia umożliwia rozszerzanie funkcjonalności (słowo kluczowe extends) 2. Interfejs a. do definiowania funkcjonalności, które klasa musi mieć (Interfejs definiuje kontrakt, który klasy muszą implementować). Wykorzystywana m.in po to, gdy musimy dziedziczyć po wielu klasach, co w javie normalnie jest niemożliwe b. Interfejs nie powinien zawierać żadnej implementacji 3. Mixiny a. metoda modyfikacji kodu java podczas jego działania poprzez uruchomienie dodatkowych eventów b. Symulują wielodziedziczenie Kluczowe zasady projektowania: 1. Zasada odpowiedzialności (Single Responsibility) Każda klasa powinna mieć jedną, dobrze zdefiniowaną odpowiedzialność Łatwość w utrzymaniu i rozbudowie kodu 2. Programowanie do interfejsu Definiowanie współpracy poprzez interfejsy Większa elastyczność i możliwość wymiany implementacji Praktyczne wskazówki: Używaj interfejsów do definiowania kontraktów Stosuj klasy abstrakcyjne dla częściowej implementacji Unikaj zbyt skomplikowanych hierarchii dziedziczenia Preferuj kompozycję nad dziedziczeniem Kompozycja nad dziedziczenie Kompozycja nad dziedziczeniem (Composition over Inheritance) to kluczowa zasada projektowania oprogramowania, która promuje bardziej elastyczne i modularne podejście do budowania struktur klas. Zamiast tworzyć rozbudowane hierarchie dziedziczenia, preferuje się tworzenie obiektów poprzez składanie (kompozycję) mniejszych, wyspecjalizowanych komponentów. To podejście pozwala na większą elastyczność i łatwość modyfikacji kodu. Przykład ilustrujący różnicę: // Hierarchia dziedziczenia class Ptak extends Zwierzę { public void lataj() { // Implementacja latania } } class Pingwin extends Ptak { @Override public void lataj() { // Pingwin nie potrafi latać - problem! throw new UnsupportedOperationException(); } } Kompozycja: // Interfejs zachowania interface Latanie { void lataj(); } // Konkretne implementacje zachowań class PrawidłoweLatanie implements Latanie { public void lataj() { System.out.println("Lecę swobodnie"); } } class NieLatanie implements Latanie { public void lataj() { System.out.println("Nie umiem latać"); } } // Klasa korzystająca z kompozycji class Ptak { private Latanie sposobLatania; public Ptak(Latanie sposobLatania) { this.sposobLatania = sposobLatania; } public void wykonajLatanie() { sposobLatania.lataj(); } } Pojęcie dziedziczenia na przykładzie języków Java i C++ Definicja i cel: Dziedziczenie to fundamentalny mechanizm programowania obiektowego, który pozwala na tworzenie nowych klas w oparciu o istniejące, umożliwiając wielopoziomowe rozszerzanie i specjalizację kodu. Mechanizm pozwalający tworzyć nowe klasy na bazie istniejących Wspiera ponowne użycie kodu i hierarchiczną organizację klas Realizuje relację "jest" (samochód jest pojazdem) Dziedzicznie w Javie vs C++ Dla Javy, Domyślnie wszystkie klasy dziedziczą po klasie Object C++ umożliwia dziedziczenie wielokrotne, Java nie (obsługuje tylko dziedziczenie pojedyncze, ale obsługuje wielokrotną implementację interfejsów) Podstawowa składnia: Java: `class Pochodna extends Bazowa` C++: `class Pochodna : public/private/protected Bazowa` Mechanizmy kontroli dostępu: public: dostęp dla wszystkich protected: dostęp w klasie, podklasach i pakiecie private: dostęp tylko w obrębie klasy (C++) friend - umożliwia dostęp wybranym klasom/funkcjom Metody wirtualne: Java: wszystkie metody domyślnie wirtualne C++: wymaga słowa kluczowego `virtual` Umożliwiają polimorfizm Realizują late binding (późne wiązanie) Konstruktory i destruktory: Java: automatyczne wywołanie konstruktora bazowego C++: wymaga jawnego wywołania C++: destruktory wirtualne dla poprawnego czyszczenia pamięci Słowa kluczowe: super/base - dostęp do członków klasy bazowej final/sealed - zapobieganie dalszemu dziedziczeniu abstract/virtual - definiowanie metod abstrakcyjnych override - jawne oznaczenie nadpisywania metody Problemy i wyzwania: Problem diamentu w C++ (wielokrotne dziedziczenie) Prawidłowa inicjalizacja obiektów złożonych Właściwe zarządzanie pamięcią (zwłaszcza w C++) Unikanie zbyt głębokiej hierarchii klas Istota i zastosowania polimorfizmu na przykładzie języków Java i C++. Polimorfizm to jeden z fundamentalnych mechanizmów programowania obiektowego, który pozwala na bardziej elastyczne i dynamiczne projektowanie oprogramowania. Jego istota sprowadza się do możliwości traktowania obiektów różnych typów w sposób jednolity poprzez wspólny interfejs lub klasę bazową. Rodzaje polimorfizmu: 1. Polimorfizm statyczny (wczesne wiązanie / przeciążenie - ang. overloading) - Realizowany poprzez przeciążanie metod w czasie kompilacji class Kalkulator { // Przeciążone metody public int dodaj(int a, int b) { return a + b; } public double dodaj(double a, double b) { return a + b; } } 2. Polimorfizm dynamiczny (późne wiązanie / nadpisywanie - ang. overriding) Kluczowy mechanizm w Javie i C++, realizowany poprzez przesłanianie metod // Java - klasyczny przykład abstract class Zwierzę { // Metoda abstrakcyjna public abstract void wydajDźwięk(); } class Pies extends Zwierzę { @Override public void wydajDźwięk() { System.out.println("Hau hau!"); } } class Kot extends Zwierzę { @Override public void wydajDźwięk() { System.out.println("Miau!"); } } // Przykład użycia public class Main { public void dajGłos(Zwierzę zwierzę) { // Polimorficzne wywołanie metody zwierzę.wydajDźwięk(); } } Różnice między Javą a C++: 1. Mechanizm wirtualności a. Java: Domyślnie wszystkie metody są wirtualne b. C++: Wymaga jawnego użycia słowa kluczowego virtual c. W C++ Słowo kluczowe override jako opcjonalne (w nowszych standardach) 2. Interfejsy vs Klasy abstrakcyjne a. Java: i. Interfejsy mogą zawierać metody domyślne (od Java 8) ii. Wielokrotna implementacja interfejsów iii. Metody w interfejsach domyślnie publiczne i abstrakcyjne b. C++: i. Brak bezpośredniego odpowiednika interfejsu ii. Używa czystych klas abstrakcyjnych iii. Więcej możliwości definiowania złożonych kontraktów 3. Parametryzacja polimorfizmu a. Java: i. Typy generyczne z wymazywaniem (type erasure) ii. Ograniczone możliwości refleksji dla typów generycznychJednopoziomowa parametryzacja. b. C++: i. Pełna parametryzacja typów (szablony) ii. Możliwość metaprogramowania iii. Generowanie kodu w czasie kompilacji iv. Bardziej zaawansowane mechanizmy parametryzacji 4. Obsługa wyjątków a. Java: i. Wyjątki sprawdzane (checked exceptions) ii. Wymóg jawnego deklarowania lub łapania wyjątków iii. Bardziej restrykcyjny system obsługi błędów. b. C++: i. Wyjątki niestwierdzane (unchecked) ii. Dowolność w propagacji wyjątków iii. Mechanizm noexcept iv. Możliwość bardziej niskopoziomowej obsługi błędów 5. Modyfikatory dostępu a. Java: i. public, protected, private, brak modyfikatora (dostęp pakietowy) ii. Bardziej restrykcyjny model hermetyzacji iii. Silniejsze egzekwowanie modyfikatorów dostępu b. C++: i. public, protected, private ii. Możliwość bardziej złożonych scenariuszy dziedziczenia iii. Friend functions i classes iv. Bardziej elastyczny dostęp do składowych 6. Realizacja polimorfizmu a. Java: i. Zawsze oparta na referencjach lub interfejsach ii. Jednoznaczny, przewidywalny mechanizm iii. Ograniczenia narzucone przez JVM b. C++: i. Polimorfizm przez wskaźniki, referencje i obiekty ii. Możliwość bardziej niskopoziomowych optymalizacji iii. Bezpośredni dostęp do mechanizmów wirtualności Kluczowe wnioski Java oferuje prostszy, bardziej przewidywalny model polimorfizmu C++ zapewnia większą kontrolę i możliwości niskopoziomowe Oba języki realizują polimorfizm, ale w odmienny sposób Polimorfizm w obu językach służy tym samym celom: Zwiększenie elastyczności kodu Umożliwienie rozszerzalności Redukcja zależności między komponentami Użycie tablic oraz innych struktur danych w Javie i C++. Java Collections Framework Tablice: Java: statyczna, stały rozmiar, typy proste i obiektowe C++: dynamiczna alokacja, wskaźnikowe operacje, bezpośredni dostęp do pamięci Java Collections Framework: 1. Kolekcje bazowe: List (ArrayList, LinkedList) Set (HashSet, TreeSet) Map (HashMap, TreeMap) 2. Charakterystyka: Generyczne struktury Automatyczne zarządzanie pamięcią Bogaty zestaw metod manipulacji C++ - Standard Template Library (STL): Wzorce kontenerów (vector, list, map) Wymagana ręczna alokacja/dealokacja Większa kontrola niskopoziomowa Główne różnice: Java: bezpieczeństwo i wygoda C++: wydajność i kontrola Kluczowe zalety: Abstrakcja złożonych operacji Wydajne algorytmy Możliwość rozbudowy własnych struktur Programowanie współbieżne ? mechanizmy i narzędzia na przykładzie języka Java. Programowanie współbieżne w Javie to mechanizm równoległego wykonywania zadań, pozwalający na efektywne wykorzystanie zasobów systemowych. Kluczowe mechanizmy: 1. Wątki (Threads) a. Klasa Thread b. Interfejs Runnable c. Zarządzanie cyklem życia wątku d. Metody: start(), run(), sleep(), join() Przykład: class MójWątek extends Thread { public void run() { // Kod wykonywany współbieżnie } } 2. Synchronizacja Słowo kluczowe synchronized Blokowanie dostępu do krytycznych sekcji Zapobieganie wyścigom danych 3. Narzędzia współbieżności java.util.concurrent - Pakiet zawierający zaawansowane narzędzia do programowania współbieżnego, oferujący wysokopoziomowe mechanizmy synchronizacji i zarządzania wątkami. ExecutorService - Interfejs zarządzający pulą wątków, umożliwiający efektywne planowanie i wykonywanie zadań współbieżnych bez ręcznego zarządzania wątkami. Callable i Future Callable to interfejs pozwalający na wykonanie zadania zwracającego wynik, podczas gdy Future reprezentuje wynik operacji asynchronicznej, którą można odebrać w dowolnym momencie. Semafory - Mechanizm kontrolujący dostęp do zasobów współdzielonych poprzez ograniczanie liczby wątków mogących jednocześnie korzystać z danego zasobu. Blokady (Locks) - Zaawansowany mechanizm synchronizacji zapewniający bardziej elastyczną kontrolę nad współbieżnym dostępem do zasobów niż tradycyjne słowo kluczowe synchronized. Mechanizmy zaawansowane: Pule wątków - Mechanizm zarządzania grupą wątków, który pozwala na ponowne wykorzystanie wątków i ograniczenie narzutu związanego z ich tworzeniem i niszczeniem. Atomowe operacje - Operacje gwarantujące niepodzielność wykonania, zabezpieczające przed równoczesnym dostępem wielu wątków i zapewniające spójność danych bez użycia jawnej synchronizacji. Zmienne współdzielone - Zmienne dostępne dla wielu wątków, wymagające specjalnego traktowania (np. słowo kluczowe volatile) aby zagwarantować aktualność ich wartości we wszystkich wątkach. Mechanizmy blokujące - Zaawansowane struktury synchronizacyjne pozwalające na bardziej precyzyjną kontrolę dostępu do zasobów współdzielonych niż proste mechanizmy synchronizacji. Przykład puli wątków: ExecutorService executor = Executors.newFixedThreadPool(4); executor.submit(() -> { // Zadanie współbieżne }); Kluczowe zasady: Minimalizacja rywalizacji wątków Unikanie zakleszczań Bezpieczny dostęp do zasobów współdzielonych (przez np. Semafory) Typy i metody sparametryzowane (generics) w Javie. Szablony (templates) w C++. Typy sparametryzowane (generics) w Javie oraz szablony w C++ to mechanizmy pozwalające na tworzenie bardziej elastycznego i wielokrotnego użycia kodu. Java - Generics: Wprowadzają parametryzację typów podczas kompilacji Operują na zasadzie wymazywania typów (type erasure) Zapewniają bezpieczeństwo typów Stosowane w kolekcjach, interfejsach i klasach Przykład w Javie: class Lista { private T[] elementy; public void dodaj(T element) { // Logika dodawania } } C++ - Szablony: Mechanizm generowania kodu w czasie kompilacji Pełna parametryzacja typów Możliwość tworzenia złożonych metaprogramów Bardziej zaawansowane niż generics w Javie Przykład w C++: template class Lista { T* elementy; void dodaj(T element) { // Bardziej niskopoziomowa implementacja } }; Kluczowe różnice Java: bezpieczeństwo i prostota C++: zaawansowane możliwości metaprogramowania Oba języki zwiększają elastyczność i ponowne użycie kodu Główne zastosowania: Tworzenie generycznych struktur danych Implementacja algorytmów niezależnych od typu Zwiększenie abstrakcji i modularności kodu Lambda-wyrażenia i interfejsy funkcyjne w języku Java. Lambda-wyrażenia w Javie to mechanizm wprowadzony w wersji 8, stanowiący istotny krok w kierunku programowania funkcyjnego. Główne charakterystyki: Zwięzły zapis anonimowych funkcji Umożliwienie przekazywania zachowań jako parametrów Ścisłe powiązanie z interfejsami funkcyjnymi Interfejsy funkcyjne: Posiadają dokładnie jedną metodę abstrakcyjną Oznaczane adnotacją @FunctionalInterface Stanowią podstawę dla lambda-wyrażeń Klasyczny przykład: // Interfejs funkcyjny interface Operacja { int wykonaj(int a, int b); } // Użycie lambda-wyrażenia Operacja dodawanie = (x, y) -> x + y; Najczęstsze zastosowania: Obsługa zdarzeń Przetwarzanie kolekcji Implementacja wątków Funkcje wyższego rzędu Kluczowe zalety: Redukcja kodu Większa czytelność Funkcyjne podejście do programowania Łatwość równoległego przetwarzania danych Przykład z Stream API: lista.stream() .filter(x -> x > 10) .map(x -> x * 2) .forEach(System.out::println); Przetwarzanie strumieniowe (środki pakietu java.util.stream). Przetwarzanie strumieniowe w Javie to zaawansowany mechanizm manipulacji kolekcjami wprowadzony w Java 8. Jest podobny do metod należących do interfejsu IEnumerable w C#. Kluczowe cechy Stream API: Deklaratywne przetwarzanie danych Leniwe (odroczone) wykonywanie operacji Wsparcie dla operacji funkcyjnych Łatwe operacje równoległe Podstawowe operacje: Filtrowanie (filter) Mapowanie (map) Redukcja (reduce) Agregacja (collect) Przykład przetwarzania: List wyniki = lista.stream() .filter(x -> x > 0) // Filtrowanie .map(x -> x * 2) // Transformacja .sorted() // Sortowanie .collect(Collectors.toList()); // Kolekcjonowanie Rodzaje operacji: Pośrednie (zwracają nowy strumień) Terminalne (kończące strumień) Kluczowe zastosowania: Przetwarzanie kolekcji Analiza danych Równoległe operacje Funkcyjne przekształcenia danych Główne zalety: Zwięzłość kodu Czytelność Wydajność Możliwość równoległego przetwarzania Narzędzia programowania operacji wejście-wyjścia w języku Java. Narzędzia programowania operacji wejścia-wyjścia w Javie to kompleksowy zestaw mechanizmów obsługi strumieni danych. Główne pakiety: java.io: klasyczne mechanizmy I/O java.nio: nowoczesne narzędzia nieblokujące java.nio.file: operacje na plikach i katalogach Strumienie wejściowe/wyjściowe: InputStream/OutputStream: podstawowe klasy bazowe FileInputStream/FileOutputStream: operacje na plikach BufferedReader/BufferedWriter: buforowane operacje tekstowe Przykładowy odczyt pliku try (FileReader fr = new FileReader("plik.txt"); BufferedReader br = new BufferedReader(fr)) { String linia; while ((linia = br.readLine()) != null) { System.out.println(linia); } } catch (IOException e) { // Obsługa błędów } Zaawansowane mechanizmy NIO: Kanały (Channels) Bufory (Buffers) Selektory (Selectors) Ścieżki i pliki (Paths, Files) Kluczowe operacje: Odczyt/zapis plików Serializacja obiektów Obsługa strumieni sieciowych Manipulacja systemem plików Zalety nowoczesnych narzędzi: Wydajność Nieblokujące operacje Prostsza obsługa błędów Wsparcie dla operacji asynchronicznych INŻYNIERIA OPROGRAMOWANIA Zarządzanie projektem budowy oprogramowania: rodzaje działań, dobór metodyki oraz kontekst pozatechniczny. 1. Rodzaj działań: a. Określ cel projektu b. Ustal zasoby (ludzkie, pieniężne) c. Stwórz harmonogram i wymagania d. Zarządzaj projektem 2. Dobór metodyki:: a. Zwinna: i. SCRUM ii. Kanban b. Ciężka: i. Waterfall (wodospadowa) ii. PRINCE2 3. Kontekst pozatechniczny: a. Komunikacja z interesariuszami b. Zarządzanie zespołem Język UML – charakterystyka oraz sposób wsparcia różnorodnych modeli danych. UML (Unified Modeling Language) to standardowy, graficzny język modelowania stosowany w inżynierii oprogramowania. Nie ma dokładnych, żelaznych zasad, zamiast tego cały należy traktować jako szereg zaleceń do projektowania schematów projektowych. Charakterystyka: Zunifikowany język notacji dla systemów informatycznych Służy do wizualnego przedstawiania, specyfikacji i dokumentacji projektów Niezależny od konkretnych języków programowania Główne rodzaje diagramów: 1. Strukturalne: a. Diagram klas b. Diagram obiektów c. Diagram komponentów 2. Behawioralne: a. Diagram przypadków użycia b. Diagram sekwencji c. Diagram stanów d. Diagram aktywności Kluczowe zastosowania: Projektowanie systemów informatycznych Analiza wymagań Dokumentacja architektury oprogramowania Komunikacja między zespołami programistycznymi Zalety UML: Standaryzacja notacji Wsparcie dla różnych paradygmatów programowania Możliwość modelowania złożonych systemów Niezależność od technologii Przykładowe narzędzia: Enterprise Architect StarUML Visual Paradigm Microsoft Visio Główne cele: Wizualizacja struktury systemu Specyfikacja zachowań Dokumentacja architektury Komunikacja między uczestnikami projektu Wzorce projektowe oraz ramy programistyczne (frameworks) – charakterystyka, przykłady, zastosowania. Wzorce projektowe to sprawdzone, wielokrotnie testowane rozwiązania typowych problemów w projektowaniu oprogramowania. Można je porównać do gotowych "przepisów" dla programistów, które pokazują jak efektywnie rozwiązywać często spotykane wyzwania. Po co stosować wzorce projektowe? Przyspieszają proces rozwoju oprogramowania Zapewniają sprawdzone rozwiązania Ułatwiają komunikację między programistami Zwiększają czytelność i maintainability (poziom trudności utrzymania i rozwoju) kodu Pomagają uniknąć typowych błędów projektowych Dostarczają wspólnego słownictwa dla zespołu programistów Wzorce projektowe nie są gotowymi fragmentami kodu do skopiowania. Są to ogólne rozwiązania problemów, które należy dostosować do konkretnego przypadku. Wzorce projektowe: Sprawdzone rozwiązania typowych problemów projektowych Podzielone na kategorie: 1. Kreacyjne - Wzorce kreacyjne zajmują się mechanizmami tworzenia obiektów. Pomagają uczynić system niezależnym od sposobu tworzenia, kompozycji i reprezentacji obiektów. 2. Strukturalne - Wzorce strukturalne opisują, jak składać obiekty i klasy w większe struktury, zachowując przy tym elastyczność i efektywność. 3. Behawioralne - Wzorce behawioralne zajmują się efektywną komunikacją między obiektami i przydzielaniem odpowiedzialności. Różnica między wzorcami a algorytmami Wzorce projektowe skupiają się na rozwiązywaniu problemów projektowych na poziomie architektonicznym, podczas gdy algorytmy są konkretnymi procedurami obliczeniowymi. Wzorce projektowe nie są przywiązane do konkretnego języka programowania (choć pewne języki mogą wymagać ich stosowania). Można je implementować w dowolnym języku obiektowym. Należy unikać nadmiernego stosowania wzorców projektowych. Czasami prostsze rozwiązanie może być lepsze niż wprowadzanie złożonego wzorca. Każdy wzorzec powinien rozwiązywać konkretny problem w projekcie. Najpopularniejsze wzorce - Kreacyjne Metoda wytwórcza (Factory Method) Definiuje interfejs do tworzenia obiektów, ale pozwala podklasom decydować, której klasy obiekty będą tworzone. Przykład: Fabryka dokumentów, która może tworzyć różne typy dokumentów (PDF, Word, TXT) w zależności od potrzeb Budowniczy (Builder) Pozwala na tworzenie złożonych obiektów krok po kroku, używając tego samego kodu konstrukcyjnego. Przykład: Tworzenie różnych konfiguracji komputera (gaming, biurowy, domowy) z tych samych podstawowych komponentów. Wzorzec Builder jest szczególnie przydatny, gdy obiekt musi być zbudowany w kilku krokach i gdy chcemy uniknąć konstruktora z wieloma parametrami. Możemy go kojarzyć m.in. z aplikacjami ASP.NET Core, gdzie przy tworzeniu aplikacji webowych korzystamy z tego wzorca w builderze. Singleton Gwarantuje, że klasa ma tylko jedną instancję i zapewnia globalny punkt dostępu do niej, ze wspólnym stanem. Przykład: Menedżer konfiguracji aplikacji, połączenie z bazą danych. Najpopularniejsze wzorce - Strukturalne Fasada Dostarcza uproszczony interfejs do złożonego systemu. Przykład: Jednolity interfejs do systemu rezerwacji biletów, który wewnętrznie komunikuje się z wieloma podsystemami. Fasada jest idealna, gdy chcemy ukryć złożoność systemu i zapewnić prosty interfejs dla klienta. Zmniejsza to zależności między kodem klienta a systemem. Kompozyt (Composite) Pozwala traktować grupy obiektów tak samo jak pojedyncze obiekty. Przykład: Struktura katalogów, gdzie zarówno katalog jak i plik są traktowane jako elementy systemu plików. Dekorator Umożliwia dynamiczne dodawanie nowych zachowań do istniejących obiektów. Przykład: Dodawanie ramek, scrollbarów do komponentów interfejsu użytkownika. Adapter Pozwala na współpracę obiektów o niekompatybilnych interfejsach. Przykład: Adapter umożliwiający używanie starego API w nowym systemie. Most (Bridge) Oddziela abstrakcję od implementacji, pozwalając na ich niezależną zmianę. Przykład: System rysowania kształtów w różnych programach graficznych. Proxy Dostarcza zastępnik innego obiektu, kontrolując dostęp do niego. Przykład: Lazy loading obrazów na stronie internetowej. Najpopularniejsze wzorce - Behawioralne Łańcuch zobowiązań (Chain of Responsibility) Przekazuje żądania wzdłuż łańcucha obiektów obsługujących. Przykład: System obsługi zgłoszeń helpdesku. Iterator Zapewnia sposób sekwencyjnego dostępu do elementów obiektu złożonego. Przykład: Przeglądanie elementów kolekcji bez ekspozycji jej wewnętrznej struktury. Polecenie (Command) Hermetyzuje żądanie jako obiekt, pozwalając na parametryzowanie klientów różnymi żądaniami. Wzorzec Command jest często wykorzystywany w połączeniu z wzorcem Mediator, w ramach wzorca CQRS (ang. Command Query Responsibility Segregation). Przykład: System do obsługi operacji Undo/Redo w edytorze tekstu. Mediator Definiuje obiekt enkapsulujący sposób interakcji zbioru obiektów. Przykład: System kontroli lotów koordynujący komunikację między samolotami. Mediator jest szczególnie przydatny w systemach, gdzie wiele obiektów musi się ze sobą komunikować. Zamiast bezpośredniej komunikacji między obiektami, wszystkie interakcje przechodzą przez mediator, co zmniejsza zależności między komponentami. Memento Pozwala na zapisanie i przywrócenie wcześniejszego stanu obiektu. Przykład: System zapisywania stanu gry. Obserwator (Observer) Definiuje zależność jeden-do-wielu między obiektami. Przykład: System powiadomień w aplikacji mobilnej. Strategia (Strategy) Definiuje rodzinę algorytmów i hermetyzuje je, umożliwiając ich wymienne stosowanie. Przykład: Różne metody płatności w sklepie internetowym. Metoda szablonowa (Template Method) Definiuje szkielet algorytmu, pozwalając podklasom na zmianę określonych kroków. Przykład: Framework do budowania aplikacji. Frameworki: Gotowe szkielety aplikacyjne Przyśpieszają rozwój oprogramowania Zazwyczaj narzucają pewną strukturę i konwencje projektowe Przykładowe frameworki: 1. Java: Spring (aplikacje enterprisowe) Hibernate (ORM) JavaServer Faces (web) 2. Web: React (frontend) Angular (frontend) Node.js (backend) Zalety: Standaryzacja rozwiązań Redukcja powtarzalnego kodu Zwiększenie wydajności programowania Rozwiązywanie typowych problemów projektowych Kluczowe zastosowania: Projektowanie złożonych systemów Zapewnienie skalowalności Separacja odpowiedzialności Ułatwienie współpracy zespołowej Zapewnienie jakości oraz testowanie oprogramowania – normy, metody, kryteria. Zapewnienie jakości i testowanie oprogramowania to kluczowe procesy w cyklu wytwarzania oprogramowania. Normy jakości: ISO 9001 - systemowe zarządzanie jakością ISO/IEC 25010 - modele jakości oprogramowania CMMI - dojrzałość procesów informatycznych Rodzaje testów: 1. Testy jednostkowe (ang. Unit-Tests) Sprawdzanie pojedynczych komponentów Weryfikacja poprawności małych fragmentów kodu 2. Testy integracyjne (ang. Integration Tests) Testowanie współpracy między modułami Weryfikacja interfejsów i przepływu danych 3. Testy systemowe Całościowe sprawdzenie systemu Weryfikacja wymagań funkcjonalnych 4. Testy akceptacyjne Ostateczna weryfikacja przed wdrożeniem Potwierdzenie spełnienia wymagań klienta 5. Testy End-to-End (E2E) Symulacja rzeczywistych scenariuszy użycia Sprawdzanie systemu jak całości z perspektywy użytkownika Kryteria jakości: Funkcjonalność Niezawodność Wydajność Użyteczność Bezpieczeństwo Metody testowania: Testy manualne Testy automatyczne Testy statyczne Testy dynamiczne Narzędzia: JUnit, xUnit (testy jednostkowe) Selenium, Puppeteer (testy webowe) JMeter (testy wydajnościowe) Kluczowe cele: Minimalizacja błędów Poprawa jakości oprogramowania Redukcja kosztów utrzymania Satysfakcja użytkownika Rodzaje, metody specyfikowania oraz rola wymagań w procesie wytwarzania oprogramowania. Wymagania w procesie wytwarzania oprogramowania to fundamentalny element determinujący sukces projektu informatycznego. Rodzaje wymagań: 1. Funkcjonalne Opisują zachowanie systemu Definiują konkretne funkcje i operacje Odpowiadają na pytanie "CO system ma robić?" 2. Niefunkcjonalne Określają jakościowe aspekty systemu Wydajność, bezpieczeństwo, użyteczność Odpowiadają na pytanie "JAK system ma działać?" 3. Biznesowe Wyrażają cele organizacji Definiują kontekst ekonomiczny Uzasadniają sens realizacji projektu Metody specyfikowania: 1. Dokumentacja tekstowa Scenariusze użycia Opisy przypadków Diagramy UML 2. Prototypowanie Wstępne modele systemu Wizualizacja wymagań Weryfikacja z zainteresowanymi stronami 3. Wywiady i warsztaty Bezpośrednie pozyskiwanie informacji Analiza potrzeb użytkowników Rozpoznanie ukrytych wymagań Rola wymagań: Komunikacja między interesariuszami Podstawa projektowania architektury Narzędzie zarządzania ryzykiem Punkt odniesienia dla testów Kluczowe zasady: Precyzyjność Mierzalność Jednoznaczność Kompletność Narzędzia: CASE (Computer-Aided Software Engineering) Modelowanie biznesowe Zarządzanie wymaganiami Etapy pracy z wymaganiami: 1. Identyfikacja 2. Analiza 3. Specyfikacja 4. Walidacja 5. Zarządzanie zmianami Rezultat: Dokument specyfikacji wymagań (SRS - Software Requirements Specification) stanowiący umowę między zamawiającym a wykonawcą. SIECI KOMPUTEROWE Usługi i protokoły warstwy aplikacji na przykładzie protokołu HTTP. HTTP (HyperText Transmission Protocol) - protokół wymiany dokumentów tekstowych pomiędzy serwerem a klientem (np. przeglądarką internetową). HTTP działa w trybie żądanie - odpowiedzi. Klient (np. przeglądarka) wysyła żądanie do serwera; Serwer przetwarza żądanie i wysyła odpowiedź, zwykle zawierającą dokument HTML, CSS, JavaScript, i/lub inne zasoby (np. zwykły tekst / json / xml, etc.) Inne protokoły warstwy aplikacji to (na przykład): HTTPS (HTTP Secure) ○ Dane są szyfrowane ○ Certyfikaty SSL/TLS DNS (Domain Name System) ○ tl;dr; zamienia nazwy domen na adresy IP, które są zrozumiałe dla sieci SMTP (Simple Mail Transfer Protocol) ○ Działa w modelu klient-serwer, serwery SMTP komunikują się między sobą, by dostarczyć mail FTP (File Transfer Protocol) Telnet SSH ○ Bezpieczny protokół do zdalnego logowania i przesyłania plików Usługi warstwy transportu na przykładzie protokołu TCP. Protokół TCP (Transmission Control Protocol) to kluczowy protokół warstwy transportowej modelu OSI, zapewniający niezawodną, uporządkowaną komunikację sieciową. Kluczowe charakterystyki: Połączeniowy protokół transmisji danych Gwarantuje niezawodność przekazu Zapewnia sekwencyjność pakietów Realizuje mechanizmy kontroli przepływu Główne mechanizmy: 1. Ustanawianie połączenia Trzystopniowe navwiązanie (three-way handshake) Synchronizacja numerów sekwencyjnych Wymiana flag SYN, ACK 2. Transmisja danych Podział na segmenty Numerowanie pakietów Potwierdzanie odebrania każdego segmentu 3. Kontrola przepływu Mechanizm okna przesuwnego Zapobieganie przeciążeniom sieci Regulacja szybkości transmisji Flagi TCP - kluczowe znaczenie: 1. SYN (Synchronize) Inicjuje nawiązanie połączenia Sygnalizuje chęć rozpoczęcia komunikacji Synchronizuje numery sekwencyjne 2. ACK (Acknowledge) Potwierdza odebranie pakietu Informuje o poprawnym otrzymaniu danych Żąda następnych segmentów 3. FIN (Finish) Sygnalizuje zakończenie transmisji Zamyka połączenie Inicjuje procedurę zamykania sesji 4. RST (Reset) Natychmiastowe zerwanie połączenia Sygnalizuje błąd lub odrzucenie połączenia Używana przy nieoczekiwanych sytuacjach 5. PSH (Push) Wymusza natychmiastowe przesłanie bufora Przyspiesza transmisję danych Pomija buforowanie 6. URG (Urgent) Oznacza dane pilne Wskazuje na pierwszeństwo transmisji Pozwala na przerwanie normalnego strumienia Zalety protokołu: Wysoka niezawodność Gwarancja dostarczenia danych Odporność na błędy transmisji Automatyczne wznawianie połączeń Zastosowania: Strony WWW Poczta elektroniczna Transfer plików Zdalne połączenia Przykładowy scenariusz transmisji: 1. Klient wysyła żądanie SYN 2. Serwer odpowiada SYN-ACK 3. Klient potwierdza ACK 4. Następuje wymiana danych 5. Zamknięcie połączenia Protokoły rutingu warstwy sieci na przykładzie protokołu OSPF. Protokół OSPF (Open Shortest Path First) to zaawansowany protokół routingu wewnętrznego stosowany w sieciach IP. Kluczowe charakterystyki: Protokół stanu łącza (link-state) Algorytm Dijkstry do wyznaczania najkrótszej ścieżki (OSPF opiera się na Dijkstrze) Szybka konwergencja sieci Hierarchiczna struktura obszarów Mechanizmy działania: 1. Odkrywanie topologii sieci Wymiana informacji o stanie połączeń Budowa pełnej mapy sieci Ciągła aktualizacja informacji routingowych 2. Wyznaczanie tras Obliczanie najkrótszej, najbardziej efektywnej trasy Uwzględnienie parametrów łącza (przepustowość, opóźnienie) Dynamiczne przystosowanie do zmian w sieci Obszary OSPF: Obszar szkieletowy (Backbone Area) Obszary graniczne Obszary zwykłe Topologie W kontekście sieci komputerowych, topologie sieciowe to różne sposoby fizycznego lub logicznego połączenia urządzeń sieciowych. Oto główne rodzaje topologii: 1. Topologia Gwiazdy (Star) Centralne urządzenie (hub/switch) łączące wszystkie węzły Wysoka niezawodność Łatwe zarządzanie Awaria węzła nie wpływa na całą sieć Jeden punkt potencjalnej awarii (centralne urządzenie) 2. Topologia Magistrali (Bus) Wszystkie urządzenia podłączone do wspólnego kabla Prosta struktura Tania implementacja Problemy przy dużej liczbie węzłów Ryzyko całkowitej awarii przy uszkodzeniu magistrali 3. Topologia Pierścienia (Ring) Każdy węzeł połączony z dwoma sąsiednimi Transmisja danych w jednym kierunku Wydajna przy małej liczbie węzłów Problemy przy awarii pojedynczego węzła 4. Topologia Siatki (Mesh) Każdy węzeł połączony z wieloma innymi Wysoka redundancja Duża niezawodność Skomplikowana infrastruktura Wysoki koszt implementacji 5. Topologia Drzewa (Tree) Hierarchiczna struktura Rozgałęzienia podobne do gałęzi drzewa Łatwe zarządzanie Ograniczona skalowalność Każda topologia ma swoje zalety i wady, wybór zależy od konkretnych wymagań sieci. Zalety protokołu: Wysoka wydajność Szybkie dostosowanie do zmian Minimalne zużycie pasma Skalowalność Zastosowania: Sieci korporacyjne Duże sieci operatorów Infrastruktura internetowa Usługi warstwy łącza na przykładzie protokołu Ethernet lub protokołów z rodziny 802.11 (WiFi). Protokół Ethernet oraz standard 802.11 (WiFi) to kluczowe protokoły warstwy łącza danych w modelach komunikacyjnych sieci komputerowych. Ethernet - charakterystyka: 1. Fizyczne aspekty transmisji Przewodowa technologia sieciowa Wykorzystanie kabli miedzianych i światłowodowych Standardowe prędkości: 10/100/1000 Mbps 2. Kluczowe mechanizmy Metoda CSMA/CD (Carrier Sense Multiple Access/Collision Detection) Adresacja MAC (Media Access Control) Ramkowanie danych Kontrola przepływu i błędów Protokoły WiFi (802.11): 1. Architektura bezprzewodowa Transmisja radiowa Pasma częstotliwości: 2.4 GHz, 5 GHz Zasięg kilkudziesięciu metrów 2. Mechanizmy dostępu CSMA/CA (Collision Avoidance) Dynamiczny wybór kanałów Mechanizmy szyfrowania (WPA2, WPA3) Wspólne cechy: Segmentacja sieci Kontrola dostępu do medium Identyfikacja urządzeń Wykrywanie i korekcja błędów Zastosowania: Sieci lokalne Połączenia przewodowe i bezprzewodowe Transmisja danych w sieciach biurowych i domowych Kluczowe standardy: Ethernet: IEEE 802.3 WiFi: IEEE 802.11 a/b/g/n/ac/ax Metody ochrony informacji stosowane w bankowości Internetowej. Metody ochrony informacji w bankowości internetowej objemują najczęściej zaawansowany, wielowarstwowy system zabezpieczeń. Autoryzacja i uwierzytelnienie: 1. Wieloskładnikowe logowanie (Multi-Factor Authentication) Hasło Jednorazowe kody SMS Tokeny sprzętowe Biometria (odcisk palca, rozpoznawanie twarzy) 2. Mechanizmy identyfikacji Silne, złożone hasła Blokowanie kont po nieprawidłowych próbach logowania Weryfikacja tożsamości przez dodatkowe pytania Szyfrowanie: 1. Protokoły bezpieczeństwa SSL/TLS (szyfrowanie transmisji) HTTPS Szyfrowanie end-to-end 2. Ochrona danych Szyfrowanie symetryczne i asymetryczne Certyfikaty cyfrowe Kluczowanie: publiczny/prywatny Zabezpieczenia infrastrukturalne: Zaawansowane zapory sieciowe Systemy wykrywania włamań (IDS) Regularne aktualizacje oprogramowania Monitorowanie aktywności transakcyjnej Połączenia przez wirtualne sieci prywatne (VPN) dla pracowników Dodatkowe metody: Tokenizacja danych płatniczych Mechanizmy antyfraudowe Geolokalizacja transakcji Behawioralna analiza ryzyka Kluczowe zasady: Ochrona poufności Integralność danych Rozliczalność transakcj