Organizacja i Architektura Komputerów PDF

Summary

This document provides a comprehensive overview of computer architecture, including representation of information, combinational and sequential logic circuits, central processing units, memory, and parallel organization. It covers fundamental concepts and principles in a structured manner.

Full Transcript

1. Reprezentacja informacji w komputerze - arytmetyka i logika. Organizacja i architektura 2. Układy kombinacyjne i sekwencyjne (analiza działania i projektowanie). komputerów 3. Jednostka centralna i pamięć. 4. Organizacja równoległa...

1. Reprezentacja informacji w komputerze - arytmetyka i logika. Organizacja i architektura 2. Układy kombinacyjne i sekwencyjne (analiza działania i projektowanie). komputerów 3. Jednostka centralna i pamięć. 4. Organizacja równoległa. Organizacja i architektura komputerów 1. Reprezentacja informacji w komputerze – arytmetyka i logika Komputer przechowuje i przetwarza informacje w postaci liczb binarnych, czyli w systemie dwójkowym. Podstawą jest reprezentacja bitów (“0” i “1”), które odpowiadają stanom niskiego i wysokiego napięcia w układach elektronicznych. Informacje są reprezentowane na kilka sposobów:  Liczby całkowite: w systemie binarnym (np. 101 = 5 w dziesiętnym).  Liczby zmiennoprzecinkowe: używane do reprezentacji wartości rzeczywistych, korzystają z formatu IEEE 754 (mantysa, wykładnik).  Kodowanie znaków: tekst jest reprezentowany przy pomocy kodów, np. ASCII lub Unicode (każda litera ma swój kod binarny). Arytmetyka komputerowa: Komputery wykonują operacje matematyczne takie jak dodawanie, odejmowanie, mnożenie czy dzielenie w systemie binarnym. Ważne zagadnienia obejmują:  Dodawanie i odejmowanie: przy pomocy sumatorów binarnych.  Liczby ze znakiem: wykorzystują zapis w kodzie U2 (dwójkowy dopełnieniowy), gdzie pierwszy bit oznacza znak (0 - dodatni, 1 - ujemny). Logika komputerowa: Działa na bramkach logicznych (“AND”, “OR”, “NOT”, “XOR”), które służą do wykonywania operacji logicznych. To podstawa działania układów elektronicznych i procesorów. 2. Układy kombinacyjne i sekwencyjne  Układy kombinacyjne – pozbawione właściwości pamiętania stanów, realizujące funkcje logiczne w oparciu o bramki i inne proste układy cyfrowe. Układy sekwencyjne - posiadają własność pamiętania stanów logicznych, zbudowane dodatkowo z przerzutników. Układy kombinacyjne: To układy, w których wyjście zależy tylko od aktualnych wartości na wejściach, bez uwzględnienia poprzednich stanów. Działanie tych układów opisuje się za pomocą tabeli prawdy, gdzie dla każdej kombinacji wejściowej zdefiniowane jest wyjście. Typowe układy kombinacyjne to:  Sumator: układ realizujący operację dodawania bitów (prosty sumator jednobitowy lub bardziej złożone sumatory wielobitowe).  Dekoder: przekształca kod binarny na sygnały na wyjściu, np. 2-bitowy kod wejściowy aktywuje jedno z 4 wyjść.  Multiplekser: pozwala wybrać jeden sygnał z wielu wejściowych i przekazać go na wyjście w zależności od sygnałów sterujących. Układy sekwencyjne: To układy, których działanie zależy od aktualnych wejś oraz stanu poprzedniego. Używane są w systemach, które wymagają zapamiętywania informacji, takich jak liczniki, rejestry czy sterowniki procesowe. Ważne elementy to:  Przerzutniki: podstawowe elementy układów sekwencyjnych. Mogą przechowywać pojedynczy bit i zmieniać swój stan pod wpływem sygnału zegarowego (np. RS, D, JK, T).  Liczniki: zliczają impulsy zegarowe, co pozwala np. na realizację odliczania czasu.  Rejestry: przechowują grupy bitów i umożliwiają ich przesuwanie lub przełączanie w ramach procesów. W projektowaniu układów sekwencyjnych ważne jest stosowanie diagramów stanów, które pokazują przejścia między stanami w zależności od sygnałów wejściowych i obecnego stanu. 3. Jednostka centralna i pamięć Jednostka centralna (CPU): Główny element komputera odpowiedzialny za wykonywanie obliczeń i zarządzanie procesami. Składa się z:  Jednostki arytmetyczno-logicznej (ALU): wykonuje operacje matematyczne i logiczne.  Rejestrów: mała, szybka pamięć do przechowywania tymczasowych danych.  Jednostki sterującej: zarządza przepływem danych i wykonywaniem instrukcji.  Cache: pamięć podręczna, która przyspiesza dostęp do często używanych danych. Pamięć komputera: Przechowuje dane i instrukcje. Podział:  RAM (pamięć operacyjna): szybka, ulotna (traci dane po wyłączeniu zasilania).  ROM: stała pamięć tylko do odczytu (zawiera np. BIOS).  Pamięci masowe: dyski HDD, SSD – przechowują dane na stałe.  Hierarchia pamięci: od najszybszej (rejestry, cache) do najwolniejszej (dyski). ***Dodatkowo o magistralach: Magistrale to systemy ścieżek komunikacyjnych w komputerze, które służą do przesyłania danych pomiędzy CPU, pamięcią i urządzeniami wejścia-wyjścia. Rodzaje magistral:  Magistrala danych: przenosi dane między CPU a pamięcią.  Magistrala adresowa: określa miejsce zapisu lub odczytu danych.  Magistrala sterująca: przesyła sygnały sterujące do różnych komponentów systemu. 4. Organizacja równoległa Organizacja równoległa to technika poprawy wydajności komputerów poprzez jednoczesne wykonywanie wielu zadań. Realizowana jest na kilku poziomach: 1. Równoległość na poziomie instrukcji: Procesor może wykonywać kilka instrukcji naraz dzięki potokowaniu (pipeline). Każdy etap instrukcji (pobieranie, dekodowanie, wykonywanie) może być przetwarzany jednocześnie dla różnych instrukcji. 2. Równoległość danych: Wykonywanie tej samej operacji na wielu elementach danych jednocześnie, np. w obliczeniach macierzowych. Jest to realizowane za pomocą SIMD (Single Instruction, Multiple Data). 3. Równoległość zadań: Każdy rdzeń lub procesor wykonuje inne zadanie, np. w systemach wielozadaniowych czy serwerach. Kluczowe elementy organizacji równoległej:  Procesory wielordzeniowe: Współczesne CPU posiadają wiele rdzeni, co pozwala na jednoczesne wykonywanie wielu procesów. Każdy rdzeń ma własne jednostki wykonawcze i dzieli pamięć podręczną z innymi rdzeniami.  Wątki: To lekkie procesy wewnątrz rdzeni, które pozwalają na wykonywanie wielu zadań w ramach jednego procesu.  GPU (procesory graficzne): Wyspecjalizowane układy do masowego przetwarzania równoległego, np. dla grafiki 3D czy obliczeń AI. Problemy i wyzwania:  Synchronizacja między procesami.  Unikanie konfliktów dostępu do wspólnej pamięci.  Efektywne podziały zadań, by uniknąć marnowania zasobów (tzw. load balancing). Dzięki organizacji równoległej możliwe jest znaczne zwiększenie wydajności obliczeń, szczególnie w aplikacjach wymagających przetwarzania dużych ilości danych, takich jak symulacje, uczenie maszynowe czy przetwarzanie grafiki. 1. Podstawowe elementy kryptografii. 2. Schematy algorytmów szyfrowania symetrycznego. 3. Szyfrowanie i schematy podpisów cyfrowych. Kryptografia 4. Kryptograficzne funkcje Skrótu. 5. Schematy identyfikacji i uwierzytelniania. 6. Kryptografia na krzywych eliptycznych. 1. Podstawowe elementy kryptografii Kryptografia to nauka zajmująca się zabezpieczaniem informacji przed nieuprawnionym dostępem. Jej podstawowe elementy obejmują pojęcia i techniki stosowane w celu ochrony danych. Kluczowymi pojęciami w kryptografii są: Szyfrowanie i deszyfrowanie  Szyfrowanie to proces przekształcania danych w taki sposób, aby były one niezrozumiałe dla osób nieuprawnionych. Dane wejściowe nazywane są tekstem jawnym (plaintext), a dane wyjściowe – szyfrogramem (ciphertext).  Deszyfrowanie to proces odwrotny do szyfrowania, mający na celu odzyskanie oryginalnej postaci danych z szyfrogramu. Klucz kryptograficzny  Klucz to parametr używany w procesach szyfrowania i deszyfrowania. Może być to samo klucz (kryptografia symetryczna) lub dwa różne klucze (kryptografia asymetryczna). Podział kryptografii  Kryptografia symetryczna: ten sam klucz jest używany do szyfrowania i deszyfrowania.  Kryptografia asymetryczna: wykorzystuje parę kluczy – klucz publiczny i prywatny. Podstawowe cele kryptografii 1. Poufność (confidentiality): zapewnienie, że dane są dostępne tylko dla uprawnionych osób. 2. Integralność (integrity): gwarancja, że dane nie zostały zmodyfikowane. 3. Uwierzytelnianie (authentication): potwierdzenie tożsamości użytkownika lub systemu. 4. Niezaprzeczalność (non-repudiation): zapewnienie, że nadawca nie może zaprzeczyć swojej roli w wysłaniu danych. 2. Schematy algorytmów szyfrowania symetrycznego Kryptografia symetryczna jest jedną z podstawowych metod szyfrowania. Wymaga użycia tego samego klucza do szyfrowania i deszyfrowania. Algorytmy symetryczne dzielą się na dwa typy: szyfry blokowe i szyfry strumieniowe. Szyfry blokowe (block ciphers)  Przetwarzają dane w blokach o stałej długości (np. 64 bity, 128 bitów).  Przykładowe algorytmy: o DES (Data Encryption Standard): wykorzystuje bloki o długości 64 bitów i klucz o długości 56 bitów. Obecnie uznawany za przestarzały. o AES (Advanced Encryption Standard): bardziej zaawansowany, obsługuje długości klucza 128, 192 lub 256 bitów. Powszechnie stosowany w zabezpieczaniu danych. Szyfry strumieniowe (stream ciphers)  Przetwarzają dane jako strumień bitów lub bajtów.  Przykładowy algorytm: RC4 – szybki, ale podatny na pewne rodzaje ataków. Tryby pracy szyfrów blokowych  ECB (Electronic Codebook): każdy blok danych jest szyfrowany niezależnie. Może prowadzić do ujawnienia wzorców danych.  CBC (Cipher Block Chaining): każdy blok jest szyfrowany z wykorzystaniem wyników poprzedniego bloku.  CFB, OFB i inne: różne tryby pozwalające na większe bezpieczeństwo i elastyczność. Zalety i wady szyfrowania symetrycznego  Zalety: wysoka szybkość, efektywność.  Wady: trudności w bezpiecznej dystrybucji klucza. 3. Szyfrowanie i schematy podpisów cyfrowych Kryptografia asymetryczna  Wykorzystuje parę kluczy: publiczny (public key) i prywatny (private key).  Klucz publiczny jest udostępniany publicznie, a klucz prywatny pozostaje tajny. Schemat szyfrowania asymetrycznego  Algorytmy: RSA, ElGamal.  Przykład działania RSA: 1. Wygenerowanie pary kluczy na podstawie dużych liczb pierwszych. 2. Szyfrowanie wiadomości za pomocą klucza publicznego. 3. Odszyfrowanie wiadomości za pomocą klucza prywatnego. Podpisy cyfrowe  Podpis cyfrowy to metoda uwierzytelniania dokumentów i wiadomości.  Proces: 1. Tworzenie skrótu (hash) wiadomości. 2. Szyfrowanie skrótu kluczem prywatnym nadawcy – to jest podpis cyfrowy. 3. Odbiorca odszyfrowuje podpis za pomocą klucza publicznego nadawcy i porównuje skrót z wiadomością. 4. Kryptograficzne funkcje skrótu Funkcje skrótu (hash functions) to algorytmy, które przekształcają dowolnie długie dane wejściowe na wyjście o stałej długości. Właściwości funkcji skrótu 1. Deterministyczność: dla tych samych danych wejściowych zawsze ten sam skrót. 2. Odporność na kolizje: trudność w znalezieniu dwóch różnych danych o tym samym skrócie. 3. Odporność na preimages: trudność w odtworzeniu danych wejściowych na podstawie skrótu. 4. Odporność na drugie preimages: trudność w znalezieniu innego wejścia o tym samym skrócie. Przykłady funkcji skrótu  MD5: historyczny, obecnie niezalecany z powodu podatności na kolizje.  SHA-1: uznawany za przestarzały.  SHA-2, SHA-3: bardziej zaawansowane i bezpieczne. Zastosowania  Uwierzytelnianie wiadomości.  Generowanie podpisów cyfrowych.  Przechowywanie haseł. 5. Schematy identyfikacji i uwierzytelniania Identyfikacja i uwierzytelnianie są kluczowymi procesami zapewnienia bezpieczeństwa w systemach komputerowych. Identyfikacja  Proces, w którym użytkownik przedstawia swoją tożsamość, np. przez podanie nazwy użytkownika. Uwierzytelnianie  Proces weryfikacji tożsamości użytkownika. Wyróżnia się trzy podstawowe metody: 1. Coś, co użytkownik zna (np. hasło). 2. Coś, co użytkownik posiada (np. karta, token). 3. Coś, czym użytkownik jest (np. odcisk palca, skan twarzy). Protokoły uwierzytelniania  PAP (Password Authentication Protocol): prosty, ale podatny na podsłuchanie.  CHAP (Challenge-Handshake Authentication Protocol): bezpieczniejszy, wykorzystuje wyzwania i odpowiedzi.  Kerberos: wykorzystuje bilety i serwery uwierzytelniające. 6. Kryptografia na krzywych eliptycznych Kryptografia na krzywych eliptycznych (ECC) to zaawansowana metoda kryptografii asymetrycznej. Opiera się na własnościach algebraicznych punktów na krzywych eliptycznych. Podstawy matematyczne  Krzywa eliptyczna: zbiór punktów spełniających równanie: y2=x3+ax+by^2 = x^3 + ax + b.  Operacje na punktach: dodawanie i mnożenie punktów na krzywej. Zalety ECC  Wyższe bezpieczeństwo przy mniejszych kluczach (np. ECC-256 jest tak samo bezpieczne jak RSA-3072).  Mniejsze wymagania obliczeniowe, co sprawia, że ECC jest idealne dla urządzeń o ograniczonej mocy obliczeniowej. Zastosowania ECC  Protokoły szyfrowania (np. ECDH – Elliptic Curve Diffie-Hellman).  Podpisy cyfrowe (np. ECDSA – Elliptic Curve Digital Signature Algorithm). ECC jest współcześnie powszechnie stosowana w kryptografii mobilnej i IoT. 1. Wielowątkowość w Javie (Runnable i callable). Programowanie 2. Aplikacje klient – serwer. sieciowe 3. Wybrane mikro usługi i sposoby ich działania. 1. Wielowątkowość w Javie (Runnable i Callable) Wielowątkowość to mechanizm pozwalający na równoczesne wykonywanie wielu zadań w jednym programie. W języku Java istnieje wiele sposobów implementacji wielowątkowości, a wśród najważniejszych są interfejsy Runnable i Callable. Runnable  Runnable to interfejs funkcyjny zawierający jedną metodę: void run().  Jest najprostszym sposobem na utworzenie wątku. Użytkownik definiuje logikę w metodzie run() i uruchamia ją za pomocą klasy Thread.  Przykład: class MyRunnable implements Runnable { @Override public void run() { System.out.println("Wątek uruchomiony: " + Thread.currentThread().getName()); } } public class Main { public static void main(String[] args) { Thread thread = new Thread(new MyRunnable()); thread.start(); } } Callable  Callable to bardziej zaawansowany interfejs, który w odróżnieniu od Runnable może zwracać wynik oraz zgłaszać wyjątki. Zawiera jedną metodę: V call() throws Exception.  Aby użyć Callable, należy korzystać z klasy ExecutorService do zarządzania wątkami.  Przykład: import java.util.concurrent.*; class MyCallable implements Callable { @Override public String call() throws Exception { return "Wynik z wątku: " + Thread.currentThread().getName(); } } public class Main { public static void main(String[] args) throws ExecutionException, InterruptedException { ExecutorService executor = Executors.newSingleThreadExecutor(); Future future = executor.submit(new MyCallable()); System.out.println(future.get()); // Oczekiwanie na wynik executor.shutdown(); } } Różnice między Runnable a Callable Runnable Callable Nie zwraca wyniku. Zwraca wynik (typ generyczny). Nie obsługuje wyjątków kontrolowanych. Obsługuje wyjątki kontrolowane. Prostszy w implementacji. Wymaga użycia ExecutorService. 2. Aplikacje klient – serwer Aplikacje klient-serwer to model komunikacji, w którym dwie aplikacje – klient i serwer – wymieniają dane przez sieć. Model klient-serwer  Klient: wysyła żądania do serwera i oczekuje odpowiedzi.  Serwer: odbiera żądania, przetwarza je i zwraca odpowiedzi. Tworzenie aplikacji klient-serwer w Javie 1. Serwer: Wykorzystuje klasę ServerSocket, aby nasłuchiwać połączeń od klientów. 2. Klient: Używa klasy Socket do nawiązania połączenia z serwerem. Przykład Kod serwera: import java.io.*; import java.net.*; public class Server { public static void main(String[] args) throws IOException { ServerSocket serverSocket = new ServerSocket(12345); System.out.println("Serwer nasłuchuje na porcie 12345"); Socket clientSocket = serverSocket.accept(); BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true); String message = in.readLine(); System.out.println("Otrzymano od klienta: " + message); out.println("Witaj, kliencie!"); clientSocket.close(); serverSocket.close(); } } Kod klienta: import java.io.*; import java.net.*; public class Client { public static void main(String[] args) throws IOException { Socket socket = new Socket("localhost", 12345); PrintWriter out = new PrintWriter(socket.getOutputStream(), true); BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream())); out.println("Cześć, serwerze!"); String response = in.readLine(); System.out.println("Odpowiedź serwera: " + response); socket.close(); } } Zalety modelu klient-serwer  Centralizacja danych i logiki.  Ułatwiona konserwacja i zarządzanie. Wady  Możliwe wąskie gardło na poziomie serwera.  Wymaga stabilnego połączenia sieciowego. 3. Wybrane mikro usługi i sposoby ich działania Mikro usługi (microservices) to architektura aplikacji, w której funkcjonalność jest podzielona na niewielkie, niezależne usługi komunikujące się przez API (zwykle REST lub gRPC). Cechy mikro usług  Niezależność wdrażania: każda usługa może być rozwijana i wdrażana niezależnie od innych.  Skalowalność: możliwość skalowania tylko tych usług, które tego wymagają.  Różne technologie: każda usługa może być napisana w innym języku programowania. Przykłady mikro usług 1. Autoryzacja i uwierzytelnianie: usługa obsługuje logowanie i zarządzanie użytkownikami. 2. Zarądzanie płatnościami: usługa obsługuje transakcje finansowe. 3. Zarądzanie katalogiem produktów: usługa udostępnia informacje o produktach w sklepie internetowym. Jak działają mikro usługi?  Każda mikro usługa posiada swój własny model danych i bazę danych.  Mikro usługi komunikują się przez: o REST API: Proste, niezależne od języka. o gRPC: Szybkie i efektywne, wymaga zdefiniowania protokołu (Protobuf). o Kolejki wiadomości: np. RabbitMQ, Apache Kafka – ułatwiają asynchroniczną komunikację. Zalety mikro usług  Elastyczność i szybkie wdrażanie zmian.  Odporność: awaria jednej usługi nie wpływa na inne. Wady  Większa złożoność zarządzania.  Wyzwania w zapewnieniu spójności danych. Przykład technologii do mikro usług  Spring Boot: Framework w Javie do tworzenia REST API.  Docker: Umożliwia konteneryzację mikro usług.  Kubernetes: Narzędzie do orkiestracji kontenerów. Podsumowując, mikro usługi umożliwiają budowę elastycznych i skalowalnych aplikacji, ale wymagają zaawansowanego zarządzania i doświadczenia w projektowaniu systemów rozproszonych. 1. Zapytania zagnieżdżone. 2. Indeksy i transakcje. 3. Procedury składowane, funkcje użytkownika, wyzwalacze i widoki. 4. Projektowanie baz danych dla aplikacji webowych. Bazy danych w aplikacjach 5. Bezpieczeństwo baz danych w aplikacjach webowych. internetowych 6. Wzorzec projektowy MVC. 1. Zapytania zagnieżdżone Zapytania zagnieżdżone (subqueries) to zapytania SQL, które są wstawiane w innych zapytaniach, zwykle w klauzulach takich jak WHERE, FROM lub SELECT. Są one szczególnie przydatne, gdy wynik jednego zapytania jest wykorzystywany jako wejście dla innego. Rodzaje zapytań zagnieżdżonych:  Jednowartościowe (scalar subqueries): zwracają jedną wartość, np. liczbę lub tekst.  Wielościowe (multi-value subqueries): zwracają więcej niż jeden wiersz lub kolumnę, np. lista identyfikatorów.  Skorelowane (correlated subqueries): każda iteracja zapytania zagnieżdżonego jest uzależniona od danych z zapytania głównego. Przykład zapytania zagnieżdżonego: Znalezienie pracowników, których pensja jest wyższa niż średnia pensja w firmie: SELECT name FROM employees WHERE salary > (SELECT AVG(salary) FROM employees); Zalety zapytań zagnieżdżonych:  Upraszczają złożone operacje.  Mogą zastąpić bardziej skomplikowane operacje, takie jak JOIN w niektórych przypadkach. Wady:  Wolniejsze działanie w porównaniu do alternatywnych metod (np. JOIN) przy dużych zbiorach danych. 2. Indeksy i transakcje Indeksy Indeksy są strukturami danych, które przyspieszają wyszukiwanie i operacje na tabelach w bazach danych. Działają podobnie do spisu treści w książce, pozwalając szybko zlokalizować potrzebne informacje. Rodzaje indeksów: 1. Indeks podstawowy (primary index): tworzony automatycznie na podstawie klucza głównego. 2. Indeks unikalny: zapewnia, że wartości w danej kolumnie są unikalne. 3. Indeks wielokolumnowy: obejmuje więcej niż jedną kolumnę. 4. Indeksy typu FULLTEXT: stosowane do wyszukiwania tekstu. Zalety:  Przyspieszenie operacji SELECT. Wady:  Większe zużycie pamięci.  Spowolnienie operacji INSERT, UPDATE i DELETE z powodu konieczności aktualizacji indeksów. Transakcje Transakcje to jednostki pracy w bazach danych, składające się z jednej lub więcej operacji SQL, które są wykonywane jako całość. ACID: Zasady transakcji: 1. Atomicity (atomowość): transakcja jest niepodzielna; albo wszystkie jej operacje zostaną wykonane, albo żadna. 2. Consistency (spójność): dane pozostają w spójnym stanie po zakończeniu transakcji. 3. Isolation (izolacja): transakcje nie wpływają na siebie nawzajem. 4. Durability (trwałość): wyniki transakcji są trwale zapisane. Przykład transakcji: BEGIN; UPDATE accounts SET balance = balance - 100 WHERE id = 1; UPDATE accounts SET balance = balance + 100 WHERE id = 2; COMMIT; 3. Procedury składowane, funkcje użytkownika, wyzwalacze i widoki Bazy danych pozwalają na przechowywanie i wykonywanie skomplikowanych operacji w postaci kodu SQL. Można do tego używać procedur składowanych, funkcji użytkownika, wyzwalaczy i widoków. Procedury składowane (Stored Procedures) Są to zestawy instrukcji SQL zapisane w bazie danych, które można wielokrotnie uruchamiać. Pozwalają automatyzować powtarzalne zadania i zmniejszyć liczbę zapytań wysyłanych do bazy. Zalety:  Przyspieszają działanie aplikacji, bo kod jest wykonywany bezpośrednio w bazie.  Zmniejszają ruch między aplikacją a bazą danych.  Zwiększają bezpieczeństwo, bo użytkownicy mogą mieć dostęp tylko do procedur, a nie do całych tabel. Funkcje użytkownika (User-defined Functions - UDFs) Podobnie jak procedury, ale różnią się tym, że zawsze zwracają wartość i można ich używać w zapytaniach SQL. Wyzwalacze (Triggers) To specjalne instrukcje SQL, które uruchamiają się automatycznie po wykonaniu określonych operacji na tabeli (np. INSERT, UPDATE, DELETE). Zalety:  Pomagają w automatyzacji kontroli i logiki biznesowej.  Zapewniają integralność danych. Widoki (Views) Widok to wirtualna tabela, która nie przechowuje danych samodzielnie, ale przechowuje zapytanie SQL, które zwraca dane. Zalety:  Upraszczają dostęp do danych.  Mogą ukrywać skomplikowaną logikę SQL.  Poprawiają bezpieczeństwo (można dać dostęp do widoku zamiast do całej tabeli). 4. Projektowanie baz danych dla aplikacji webowych Projektowanie bazy danych to kluczowy etap, który wpływa na wydajność i skalowalność aplikacji internetowej. Najważniejsze zasady: 1. Normalizacja – poprawia strukturę bazy, eliminując nadmiarowe dane. o Każda informacja powinna być zapisana tylko raz. o Dane dzielimy na tabele powiązane kluczami. 2. Denormalizacja – czasami używana, aby poprawić szybkość działania. o Niektóre dane mogą być powielane, aby uniknąć skomplikowanych zapytań. 3. Skalowalność – baza powinna być przygotowana na duży ruch. o Podział na mikroserwisy – np. zamiast jednej dużej bazy, możemy mieć kilka mniejszych baz dla różnych funkcji aplikacji. o Replikacja – tworzenie kopii bazy do odczytu, co odciąża serwer główny. 5. Bezpieczeństwo baz danych w aplikacjach webowych Dobrze zaprojektowana baza danych musi być bezpieczna. Najczęstsze zagrożenia: 1. SQL Injection – atak, w którym ktoś może zmieniać zapytania SQL. o Niebezpieczne: SELECT * FROM users WHERE username = 'admin' OR '1'='1'; o Bezpieczne (użycie parametrów): SELECT * FROM users WHERE username = ?; 2. Brak szyfrowania danych – np. zapisanie haseł w bazie jako zwykły tekst. Bezpieczne podejście: import bcrypt hashed = bcrypt.hashpw(password.encode(), bcrypt.gensalt()) Jak zabezpieczyć bazę?  Walidacja danych wejściowych – sprawdzanie, czy użytkownik nie wpisuje złośliwego kodu.  Szyfrowanie danych wrażliwych (hasła, numery kart).  Ograniczenie dostępu – np. użytkownicy powinni mieć dostęp tylko do potrzebnych tabel. 6. Wzorzec projektowy MVC Jest to sposób organizacji aplikacji webowej, który oddziela dane, logikę i interfejs użytkownika. Elementy MVC: 1. Model (Dane) o Odpowiada za operacje na bazie danych. o Przykład: Klasa w Pythonie obsługująca użytkowników. 2. View (Widok) o Prezentacja danych dla użytkownika (HTML, CSS, JavaScript). 3. Controller (Kontroler) o Obsługuje interakcje użytkownika i łączy Model z View. Zalety MVC:  Lepsza organizacja kodu.  Łatwiejsza rozbudowa aplikacji.  Możliwość pracy wielu zespołów równocześnie. 1. Podstawowe typy danych oraz instrukcje warunkowe. 2. Działanie różnych typów pętli w Java. 3. Zagadnienie tworzenia klas, obiektów oraz korzystanie z konstruktorów. Wstęp do 4. Mechanizm dziedziczenia i kompozycji. programowania 5. Interfejsy, wyrażenia lambda i klasy wewnętrzne. w języku Java 6. Obsługa wyjątków, asercji. 7. Zagadnienia związane z programowaniem generycznym. 8. Kolekcje w Java. 1. Podstawowe typy danych oraz instrukcje warunkowe Podstawowe typy danych w Javie:  Typy prymitywne: o Liczby całkowite: byte (1 bajt), short (2 bajty), int (4 bajty), long (8 bajtów). o Liczby zmiennoprzecinkowe: float (4 bajty), double (8 bajtów). o Inne: char (pojedynczy znak, 2 bajty), boolean (wartości true lub false).  Typy referencyjne: Klasy, interfejsy, tablice. Instrukcje warunkowe: if-else: Pozwala na wykonanie kodu w zależności od spełnienia warunku: int number = 10; if (number > 5) { System.out.println("Liczba jest większa od 5"); } else { System.out.println("Liczba nie jest większa od 5"); } switch: Wykonuje różne bloki kodu w zależności od wartości zmiennej: int day = 3; switch (day) { case 1: System.out.println("Poniedziałek"); break; case 2: System.out.println("Wtorek"); break; case 3: System.out.println("Środa"); break; default: System.out.println("Nieznany dzień"); } 2. Działanie różnych typów pętli w Javie Pętle w Javie: for: Powtarza kod określoną liczbę razy: for (int i = 0; i < 5; i++) { System.out.println("Iteracja: " + i); } while: Powtarza kod, dopóki warunek jest spełniony: int i = 0; while (i < 5) { System.out.println("Iteracja: " + i); i++; } do-while: Wykonuje kod co najmniej raz, a potem sprawdza warunek: int i = 0; do { System.out.println("Iteracja: " + i); i++; } while (i < 5); for-each: Iteruje przez elementy kolekcji lub tablicy: int[] numbers = {1, 2, 3, 4}; for (int number : numbers) { System.out.println(number); } 3. Tworzenie klas, obiektów oraz korzystanie z konstruktorów Klasy i obiekty:  Klasa to szablon obiektu, definiujący jego właściwości i zachowanie.  Obiekt to instancja klasy. Przykład klasy i obiektu: class Car { String brand; int speed; // Konstruktor Car(String brand, int speed) { this.brand = brand; this.speed = speed; } void displayInfo() { System.out.println("Marka: " + brand + ", Prędkość: " + speed); } } public class Main { public static void main(String[] args) { Car car = new Car("Toyota", 120); car.displayInfo(); } } 4. Mechanizm dziedziczenia i kompozycji Dziedziczenie:  Pozwala klasie pochodnej (subclass) dziedziczyć właściwości i metody klasy bazowej (superclass).  Używa słowa kluczowego extends. Dziedziczenie: Dziedziczenie jest mechanizmem pozwalającym na tworzenie nowych klas na bazie już istniejących. Klasa dziedzicząca (subclass) automatycznie przejmuje wszystkie właściwości i metody klasy bazowej (superclass), co pozwala na ponowne wykorzystanie kodu i ułatwia jego organizację. Dziedziczenie umożliwia również nadpisywanie metod klasy bazowej, co pozwala na dostosowanie ich do specyficznych potrzeb klasy pochodnej. Główne korzyści dziedziczenia to:  Ponowne wykorzystanie kodu: Klasa bazowa może zawierać metody i pola wspólne dla wielu klas pochodnych, co redukuje duplikację kodu.  Polimorfizm: Dzięki dziedziczeniu można tworzyć hierarchie klas i definiować ogólne interfejsy dla wielu klas.  Łatwiejsza rozbudowa systemu: Nowe funkcjonalności można dodawać poprzez tworzenie nowych klas dziedziczących istniejące klasy. Przykład dziedziczenia: class Animal { void eat() { System.out.println("Jedzenie"); } } class Dog extends Animal { void bark() { System.out.println("Szczekanie"); } } public class Main { public static void main(String[] args) { Dog dog = new Dog(); dog.eat(); dog.bark(); } } Kompozycja:  Polega na używaniu obiektów jako atrybutów innych klas. Kompozycja: Kompozycja polega na używaniu obiektów jednej klasy jako pól w innej klasie. Zamiast tworzyć hierarchię dziedziczenia, klasa "komponuje" się z innych obiektów, które realizują określone funkcjonalności. Kompozycja jest bardziej elastyczna od dziedziczenia, ponieważ pozwala na dynamiczne zmienianie zachowań klasy w trakcie działania programu. Zalety kompozycji:  Większa elastyczność: Można zmieniać zachowanie obiektu w trakcie działania programu przez wymianę komponentów.  Brak sztywnego powiązania: Obiekty mogą być łatwo ponownie wykorzystywane w różnych kontekstach.  Łatwość testowania: Komponenty można testować niezależnie od klasy, która z nich korzysta. Przykład kompozycji: class Engine { void start() { System.out.println("Silnik uruchomiony"); } } class Car { Engine engine = new Engine(); void drive() { engine.start(); System.out.println("Samochód jedzie"); } } public class Main { public static void main(String[] args) { Car car = new Car(); car.drive(); } } 5. Interfejsy, wyrażenia lambda i klasy wewnętrzne Interfejsy: Interfejsy definiują zestaw metod, które muszą być zaimplementowane przez klasy je realizujące. Są wykorzystywane do definiowania kontraktów (umów) między różnymi częściami systemu. Interfejsy w Javie mogą zawierać metody domyślne (default) i statyczne (static), co pozwala na dodanie pewnych implementacji bez konieczności ich definiowania w każdej klasie. Używa słowa kluczowego interface. Zastosowania interfejsów:  Tworzenie wielokrotnego dziedziczenia zachowania, którego nie można osiągnąć za pomocą klas.  Rozdzielenie definicji od implementacji, co ułatwia testowanie i rozszerzanie systemu. Wyrażenia lambda: Wyrażenia lambda w Javie są uproszczoną formą definiowania metod w miejscu, gdzie są one potrzebne. Są szczególnie użyteczne w programowaniu funkcyjnym i w pracy z interfejsami funkcyjnymi (interfejsy mające dokładnie jedną metodę abstrakcyjną). Wyrażenia lambda zmniejszają ilość kodu potrzebnego do definiowania prostych zachowań. Przykład: interface Calculator { int calculate(int a, int b); } public class Main { public static void main(String[] args) { Calculator add = (a, b) -> a + b; System.out.println("Wynik: " + add.calculate(5, 3)); } } Klasy wewnętrzne: Klasy wewnętrzne to klasy zdefiniowane wewnątrz innej klasy. Mają dostęp do pól i metod klasy zewnętrznej, co pozwala na tworzenie bardziej powiązanych struktur. Klasy wewnętrzne mogą być używane w celu ograniczenia widoczności pewnych klas tylko do ich klasy zewnętrznej lub w celu uproszczenia organizacji kodu 6. Obsługa wyjątków, asercji Obsługa wyjątków: Wyjątki to mechanizm radzenia sobie z błędami lub sytuacjami wyjątkowymi, które mogą wystąpić podczas działania programu. Obsługa wyjątków w Javie polega na wykrywaniu błędów i ich kontrolowanym obsługiwaniu, aby zapobiec awariom programu. Główne elementy obsługi wyjątków to:  try: Blok, w którym umieszcza się kod mogący generować wyjątki.  catch: Blok, w którym obsługuje się wyjątki.  finally: Blok kodu, który zawsze jest wykonywany, niezależnie od tego, czy wyjątek został obsłużony.  throw: Służy do ręcznego generowania wyjątków. Przykład: try { int result = 10 / 0; } catch (ArithmeticException e) { System.out.println("Nie można dzielić przez zero"); } Asercje: Asercje w Javie są używane do sprawdzania założeń w trakcie działania programu. Służą głównie do celów diagnostycznych podczas fazy testowania i debugowania. Jeśli warunek asercji nie zostanie spełniony, program zgłasza wyjątek AssertionError. np. assert x > 0;. 7. Programowanie generyczne Generyczność: Programowanie generyczne pozwala na definiowanie klas, metod i interfejsów, które mogą działać na różnych typach danych, zamiast być ograniczone do jednego konkretnego typu. Dzięki generyczności można pisać bardziej uniwersalny i bezpieczny kod, unikając błędów związanych z rzutowaniem typów. Zalety programowania generycznego:  Bezpieczeństwo typów: Kompilator wykrywa błędy związane z niezgodnością typów w czasie kompilacji.  Uniwersalność: Jedna implementacja może działać na różnych typach danych.  Czytelność: Kod staje się bardziej przejrzysty, ponieważ unika się rzutowania typów. Przykład: class Box { T value; void set(T value) { this.value = value; } T get() { return value; } } public class Main { public static void main(String[] args) { Box box = new Box(); box.set("Hello"); System.out.println(box.get()); } } 8. Kolekcje w Javie Kolekcje: Kolekcje w Javie to zestaw klas i interfejsów umożliwiających przechowywanie i zarządzanie grupami obiektów. Kolekcje są częścią biblioteki standardowej Java Collections Framework i oferują gotowe struktury danych, takie jak listy, zestawy i mapy. Główne interfejsy kolekcji:  List: Umożliwia przechowywanie elementów w określonej kolejności (np. ArrayList, LinkedList).  Set: Przechowuje unikalne elementy (np. HashSet, TreeSet).  Map: Przechowuje pary klucz-wartość (np. HashMap, TreeMap). Kolekcje oferują wiele metod do zarządzania danymi, takich jak dodawanie, usuwanie, wyszukiwanie i sortowanie elementów. Dzięki temu programowanie staje się prostsze i bardziej efektywne. Przykład kolekcji: import java.util.*; public class Main { public static void main(String[] args) { List list = new ArrayList(); list.add("A"); list.add("B"); for (String s : list) { System.out.println(s); } } }

Use Quizgecko on...
Browser
Browser