Odpowiedzi na obrone scalone


1) Projektowanie cyfrowych układów sekwencyjnych.

2) Wymienić i omówić źródła pomiaru czasu w systemie komputerowym PC.

3) Przedstaw klasy problemów algorytmicznych (zadania rozstrzygalne i nierozstrzygalne, zadania klasy P, NP, NP-trudne i NP-zupełne).

4) Czym jest polimorfizm i jaką rolę pełnią metody wirtualne?

5) Obsługa procesów w systemie UNIX.

6) Protokół HTTP.

7) XML (eXtensible Markup Language).

8) Mechanizm wyzwalaczy w bazach danych.

9) Modele hurtowni danych.

10) Metoda MRP.

11) Cykl życia systemu informatycznego.

12) Schematy ERD.

13) Podaj schemat deklaracji funkcji w języku C.

14) Wyjaśnić na czym polega proces teksturowania. Problemy związane z tym zagadnieniem. Filtrowanie tekstur.

15) Opisz algorytmy stosowane podczas kompresji wideo.

16) Tablice i operacje z nimi związane. Metody sortowania tablic.

17) Kursory - tworzenie, zastosowanie, atrybuty kursora jawnego i ukrytego.

18) Wzorzec projektowy MVC.

19) Metody komunikacji między procesami w systemie PVM.

20) Opisz zadania protokołu IPv4. Wyjaśnij pojęcie adresu IP (czy różni się adres unicastowy od broadcastowego), maski (do czego służy), klas adresów (czym różnią się klasy między sobą), adresów prywatnych i publicznych oraz routingu. Podaj dwie dowolne cechy różnice protokół IPv6 od IPv4.

---------------------------------------------------------------------------------------------------------

Ad. 1

1) Projektowanie cyfrowych układów sekwencyjnych.

Układ sekwencyjny jest jednym z rodzajów układów cyfrowych. Charakteryzuje się tym, że stan wyjść Y zależy od stanu wejść X oraz od poprzedniego stanu, zwanego stanem wewnętrznym, pamiętanego w zespole rejestrów (pamięci). Jeżeli stan wewnętrzny nie ulega zmianie pod wpływem podania różnych sygnałów X, to taki stan nazywa się stabilnym.

Rozróżnia się dwa rodzaje układów sekwencyjnych:

1. asynchroniczne

2. synchroniczne

Opis układu sekwencyjnego

Układ sekwencyjny może być opisany za pomocą dwóch funkcji:

1. Y = f(X,A)

2. Y = f(A)

gdzie A to stan wewnętrzny, X i Y to odpowiednio sygnał wejściowy i wyjściowy. Pierwsza funkcja dotyczy tzw. automatu Mealy'ego, druga automatu Moore'a - oba automaty są sobie równoważne.

Zachowanie układu sekwencyjnego może być opisane następująco:

- słownie;

- przebieg czasowy - pokazujący zależności czasowe pomiędzy X i Y;

- grafy przejść (ich wygląd zależy od rozpatrywanego automatu);

- tablice przejść i wyjść.

W układach asynchronicznych zmiana sygnałów wejściowych X natychmiast powoduje zmianę wyjść Y. W związku z tym układy te są szybkie, ale jednocześnie podatne na zjawisko hazardu i wyścigu. Zjawisko wyścigu występuje, gdy co najmniej dwa sygnały wejściowe zmieniają swój stan w jednej chwili czasu (np. 11_b \to 00_b). Jednak, ze względu na niezerowe czasy przełączania bramek i przerzutników, zmiana jednego z sygnałów może nastąpić [trochę] wcześniej niż innych, powodując trudne do wykrycia błędy. Dlatego też w analizie układów asynchronicznych uznaje się, że jednoczesna zmiana kilku sygnałów jest niemożliwa.

W układach synchronicznych zmiana sygnału wyjściowego następuje wyłącznie w określonych chwilach, które wyznacza sygnał zegarowy (ang. clock). Każdy układ synchroniczny posiada wejście zegarowe oznaczane zwyczajowo symbolami C, CLK lub CLOCK. Charakterystyczne dla układów synchronicznych, jest to, iż nawet gdy stan wejść się nie zmienia, to stan wewnętrzny - w kolejnych taktach zegara - może ulec zmianie.

Jeśli układ synchroniczny nie ma wejść, a jedynie charakteryzuje go stan wewnętrzny, to taki układ nazywany jest autonomicznym (dobrym przykładem takich układów są liczniki stosowane w popularnych zegarkach elektronicznych).

Jeśli układ reaguje na określony stan (logiczny) zegara, to mówi się że układ jest statyczny (wyzwalany poziomem), jeśli zaś układ reaguje na zmianę sygnału zegarowego jest dynamiczny (wyzwalany zboczem). Układ dynamiczny może być wyzwalany zboczem (ang. edge) opadającym lub narastającym, albo impulsem.

-----------------------------------

Ad. 2

2) Wymienić i omówić źródła pomiaru czasu w systemie komputerowym PC.

W typowym komputerze PC do pomiaru czasu przeznaczone są układy:

1. Zegar czasu rzeczywistego.

Komputer PC standardowo posiada podtrzymywany bateryjnie zegar czasu rzeczywistego RTC (Real Time Clock) MC146818. Zegar ten pracuje nawet gdy komputer jest wyłączony. Czas rzeczywisty uzyskany z zegara RTC przy starcie systemu używany jest do ustawiania czasu systemowego. Rozdzielczość pomiaru = 1 sek.

2. Układ oparty na generatorze kwarcowym, liczniku programowalnym i systemie przerwań.

Pierwotnym źródłem częstotliwości jest generator kwarcowy o częstotliwości 1.19318 MHz.

Generowana przez ten układ fala prostokątna podawana jest na wejście układu.

Licznik 0 dołączony jest do linii wejściowej IRQ0 głównego kontrolera przerwań systemowych.

Układ ten z kolei dołączony jest do wejścia INT procesora.

Im wyższa częstotliwość przerwań zegarowych tym większa dokładność pomiaru czasu w systemie (w większości systemów częstotliwość przerwań leży pomiędzy 10Hz a 1000Hz.

Rozdzielczość pomiaru = 1ms - 10 ms.

3. Dodatkowo w niektórych procesorach układy liczące cykle procesora.

Wewnętrzny 64 bitowy licznik cykli procesora nazywany TSC (Time-Stamp Counter). Przy restarcie sprzętowym licznik ten ustawiany jest na zero, a następnie zwiększany o 1 co każdy cykl procesora. W procesorze 1GHz licznik zwiększany będzie o 1 nanosekundę.

Rozdzielczość pomiaru = 1ns - 100 ns.

4. Protokół NTP

NTP (Network Time Protocol) umożliwia precyzyjną synchronizację czasu pomiędzy komputerami. Wzorcowy czas UTC może pochodzić bezpośrednio z zegarów atomowych lub pośrednio ze specjalizowanych serwerów czasu (ang. Time Server NTP).

Protokół NTP jest coraz powszechniej uznawany za światowy standard synchronizacji czasu w urządzeniach teleinformatycznych i telekomunikacyjnych.

NTP pozwala na synchronizację czasu z bardzo dużą precyzją, jest rozwiązaniem bardzo stabilnym i bezpiecznym. Kalibruje czas płynnie - bez skoków czasu i konieczności przestawiania. Już przy zastosowaniu standardowego sprzętu komputerowego klasy PC, precyzja ta może wynosić kilka milisekund. Obecnie protokół ma swoje implementacje dla większości współczesnych systemów operacyjnych i urządzeń sieciowych.

Zaletą protokołu NTP jest możliwość jednoczesnej synchronizacji bardzo dużej liczby komputerów (rzędu dziesiątek tysięcy) bez przeciążenia łączy i procesorów. Implementacja protokołu nie wymaga wydajnych komputerów, procesorów ani szybkich łączy transmisyjnych.

-----------------------------------

Ad. 3

3) Przedstaw klasy problemów algorytmicznych (zadania rozstrzygalne i nierozstrzygalne, zadania klasy P, NP, NP-trudne i NP-zupełne).

Zadania nierozstrzygalne to takie dla których nie istnieje żadna metoda postępowania tzn., że nie da się napisać programu, który by je rozwiązywał. Nie z powodu, że nikomu się jeszcze nie udało tylko dlatego, że da się w prosty sposób udowodnić, że to się nie uda np. sprowadzeniem badanego problemu do jakiegoś innego problemu nierozstrzygalnego. Przykładem zadania jest domino z klocków.

P (deterministic Polynomial) - klasa algorytmów wielomianowych. Problem decyzyjny dla którego rozwiązanie można znaleźć w czasie wielomianowym. Każdy problem P jest NP lecz nie każdy problem NP jest P.

NP (nondeterministic polynomial) -. Problem decyzyjny, dla którego rozwiązanie można sprawdzić w czasie wielomianowym. Istnieje również definicja mówiąca, że: problem jest w klasie NP jeśli może być rozwiązany w wielomianowym czasie na niedeterministycznej maszynie Turinga.

NP-zupełne (NPC-nondeterministic polynomial complete) - wielomianowy niedeterministycznie, zupełny. Problem klasy NP oraz dowolny problem należący do NP może być do niego zredukowany w czasie wielomianowym. Czasami zamiast redukcji w czasie wielomianowym używa się redukcji w postaci logarytmicznej.

NP-trudny (NPH-nondeterministic polynomial hard) - problem obliczeniowy, którego rozwiązanie jest co najmniej tak trudne jak rozwiązanie każdego problemu z klasy NP. Definicja: problem jest NP-trudny jeżeli pewien problem NP-zupełny jest do niego redukowalny wielomianową transformacją Turinga. Problem optymalizacyjny, którego wersja decyzyjna jest NP-zupełna jest problemem NP-trudnym. Problem NP-trudny jest co namniej tak trudny jak problem NP-zupełny.

-----------------------------------

Ad. 4

4) Czym jest polimorfizm i jaką rolę pełnią metody wirtualne?

Polimorfizm (z gr. wielopostaciowość) to mechanizmy pozwalające programiście używać wartości, zmiennych i podprogramów na kilka różnych sposobów - inaczej to możliwość wyabstrahowania wyrażeń od konkretnych typów. Umożliwia korzystanie z różnych danych w taki sam sposób. Na przykład gdy chcemy wydrukować liczbę lub napis, lepiej jest gdy taka operacja nazywa się po prostu drukuj, a nie drukuj_liczbę i drukuj_napis.

Jednak napis musi być drukowany inaczej niż liczba, dlatego będą istniały dwie implementacje polecenia drukuj ale nazwanie ich wspólną nazwą tworzy wygodny abstrakcyjny interfejs niezależny od typu drukowanej wartości. Czasami nawet nie trzeba dostarczać różnych implementacji, przykładowo podczas implementacji stosu nie jest bardzo istotne jakiego typu wartości będą na nim przechowywane. Można napisać ogólne algorytmy obsługujące stos i ewentualne ukonkretnienie pozostawić systemowi. Mechanizmy umożliwiające takie udogodnienia nazywane są właśnie polimorfizmem.

Metoda wirtualna to metoda, której wywołanie jest polimorficzne.

- Metoda wirtualna nie może być zadeklarowana jako statyczna (static).

- Jeśli metoda wirtualna została zaimplementowana w jakimkolwiek wyższym poziomie dziedziczenia (w szczególności w klasie bazowej całej struktury dziedziczenia), nie jest konieczne podawanie implementacji w klasie pochodnej.

- Jeśli w klasie jest zadeklarowana jakakolwiek metoda wirtualna, zaleca się aby destruktor w tej klasie również określić jako wirtualny.

- Rozszerzalność kodu. Polimorfizm umożliwia rozszerzanie nawet skompilowanych fragmentów kodu.

* Pozwala na rozszerzalność kodu również wtedy, gdy dostępna jest jedynie skompilowana wersja klasy bazowej.

- Zwalnia programistę od niepotrzebnego wysiłku.

* Programista nie musi przejmować się tym, którą z klas pochodnych aktualnie obsługuje, a jedynie tym, jakie operacje chce na tej klasie wykonać.

* Programista myśli co ma wykonać a nie jak to coś wykonać - nie musi się przejmować szczegółami implementacyjnymi.

-----------------------------------

Ad. 5

5) Obsługa procesów w systemie UNIX.

Proces - jedno z najbardziej podstawowych pojęć w informatyce, definiowane jako egzemplarz wykonywanego programu, jednak każdy nowo powstały proces otrzymuje unikalny numer, który go jednoznacznie identyfikuje, tzw. numer PID (ang. process IDentifier).

W celu wykonania programu system operacyjny przydziela procesowi zasoby (pamięć, czas procesora i itp.), ale także może być konieczne współbieżne wykonywanie pewnych fragmentów programu. Aby to zrealizować program może zażądać utworzenia określonej liczby wątków, wykonujących wskazane części programu - o ich współbieżne wykonanie dba system operacyjny (albo sam program, wówczas mówi się o zielonych wątkach). Wątki współdzielą prawie wszystkie zasoby zarezerwowane dla danego procesu, wyjątkiem jest czas procesora, który jest przydzielany indywidualnie każdemu wątkowi.

Za zarządzanie procesami odpowiada jądro systemu operacyjnego, sposób ich obsługi jest różny dla różnych systemów operacyjnych. W systemie operacyjnym każdy proces posiada proces nadrzędny, z kolei każdy proces może, poprzez wywołanie funkcji systemu operacyjnego, utworzyć swoje procesy potomne; w ten sposób tworzy się swego rodzaju drzewo procesów. Każdy proces otrzymuje od systemu operacyjnego odrębne zasoby, w tym odrębną przestrzeń adresową, listę otwartych plików, urządzeń itp.

W skład procesu wchodzi:

- kod programu,

- licznik rozkazów,

- stos,

- sekcja danych.

Każdemu procesowi przydzielone zostają zasoby, takie jak:

- procesor,

- pamięć,

- dostęp do urządzeń wejścia-wyjścia,

- pliki.

* Użytkownik za pomocą powłoki zleca uruchomienie programu, proces wywołujący wykonuje polecenie fork, lub jego pochodną.

* System operacyjny tworzy przestrzeń adresową dla procesu oraz strukturę opisującą nowy proces w następujący sposób:

- wypełnia strukturę opisującą proces,

- kopiuje do przestrzeni adresowej procesu dane i kod, zawarte w pliku wykonywalnym,

- ustawia stan procesu na działający,

- dołącza nowy proces do kolejki procesów oczekujących na procesor (ustala jego priorytet),

- zwraca sterowanie do powłoki użytkownika.

Dany proces rozpoczyna wykonywanie w momencie przełączenia przez Jądro systemu operacyjnego przestrzeni adresowej na przestrzeń adresową danego procesu oraz takie zaprogramowanie procesora, by wykonywał kod procesu. Wykonujący się proces może żądać pewnych zasobów, np. większej ilości pamięci. Zlecenia takie są na bieżąco realizowane przez system operacyjny.

Wykonanie procesu musi przebiegać sekwencyjnie. Może przyjmować kilka stanów:

Obsługa procesów w systemie UNIX.

Proces jest jednostką aktywną, kontrolowaną przez SO i związaną z wykonywanym programem. W zakresie obsługi system UNIX udostępnia mechanizm tworzenia nowych procesów, usuwania procesów oraz uruchamiania programów. Każdy proces z wyjątkiem procesu systemowego o identyfikatorze 1, tworzony jest przez inny proces, który staje się jego przodkiem, zwanym procesem rodzicielskim (rodzicem).

Fork - tworzy potomka, kończy go exit bądź systemowe wysłanie sygnału zabicia procesu.

Wait - zawieszenie potomka w wykonywaniu. Gdy rodzic skończy się szybciej niż potomek to potomek jest sierotą i przejmuje go proces sytemowy init. Jeśli proces potomny skończy się przed zamierzonym wywołaniem wait pozostanie on w stanie zombie zwalniając wszystkie zasoby, pozostając jedynie w kolejce procesów do momentu wywołania funkcji wait lub zakończenia procesu macierzystego.

Exec - rodzina funkcji służących do wywołania nowego programu w ramach działającego procesu. Powrót do procesu, który wywołał program jest niemożliwy chyba, że w programie wywołanym wystąpi błąd czyli również nie powodzenie procesu uruchamiającego.

Getpid() - funkcja zwracająca własny identyfikator.

-----------------------------------

Ad. 6

6) Protokół HTTP. (RFC 2616)

HTTP (ang. Hypertext Transfer Protocol) Jest to jednostronny, bezpołączeniowy, bezstanowy protokół służący do transportu dokumentów udostępnianych przez serwery WWW. Działa w modelu klient-serwer w stylu żądanie-odpowiedź. Po dostarczeniu dokumentu połączenie jest zamykane.

Protokół HTTP udostępnia znormalizowany sposób komunikowania się komputerów ze sobą. Określa on formę żądań klienta dotyczących danych oraz formę odpowiedzi serwera na te żądania.

HTTP standardowo korzysta z portu nr 80 (TCP). Nie zachowuje żadnych informacji o poprzednich transakcjach z klientem. Zmniejsza to obciążenie serwera. W przypadku potrzeby przechowywania takich informacji można się posłużyć mechanizmem ciasteczek lub przekazywaniem informacji w adresie URL.

1. GET - pobranie zasobu wskazanego przez URI, może mieć postać warunkową jeśli w nagłówku występują pola warunkowe takie jak "If-Modified-Since"

2. HEAD - pobiera informacje o zasobie, stosowane do sprawdzania dostępności zasobu

3. PUT - przyjęcie danych w postaci pliku przesyłanych od klienta do serwera

4. POST - przyjęcie danych przesyłanych od klienta do serwera (np. wysyłanie zawartości formularzy)

5. DELETE - żądanie usunięcia zasobu, włączone dla uprawnionych użytkowników

6. OPTIONS - informacje o opcjach i wymaganiach istniejących w kanale komunikacyjnym

7. TRACE - diagnostyka, analiza kanału komunikacyjnego

8. CONNECT - żądanie przeznaczone dla serwerów pośredniczących pełniących funkcje tunelowania

Budowa żądania:

Metoda URL wersja_HTTP protokół://[użytkownik[:haslo]@]serwer[:nr_portu]/[sciezka[?argumenty]]

Dodatkowe pola nagłówka

<pusta linia>

Dane

Wersja_HTTP Kod_stanu Wynik_operacji 1-informacja, 2-poprawne, 3-poprawne, dalsze kroki

4- żądanie niekompletne, 5-błąd w pracy serwera

Dodatkowe pola nagłówka

<pusta linia>

Dane

Przykład (żądanie - odpowiedź)

GET /index.html http/1.1 HTTP/1.1 200 OK.

Host: 10.0.1.2 Date: Mon, 8 Feb 2010 12:00:00 GMT

Server: Apache/2.0.59 (Win32) PHP/5.1.6

Last-Modified: ……

Content-Length: 50

Content -Type: text/html

<html><body>Tresc</body></html>

-----------------------------------

7) XML (eXtensible Markup Language).

XML (ang. Extensible Markup Language, w wolnym tłumaczeniu Rozszerzalny Język Znaczników) - uniwersalny język formalny przeznaczony do reprezentowania różnych danych w strukturalizowany sposób.

XML jest niezależny od platformy, co umożliwia łatwą wymianę dokumentów pomiędzy heterogenicznymi (różnymi) systemami i znacząco przyczyniło się do popularności tego języka w dobie Internetu. XML jest standardem rekomendowanym oraz specyfikowanym przez organizację W3C.

Koncepcja XML-a polega na znacznych uproszczeniu zawiłego SGML-a, co pozwoliło na budowę prostszych parserów (procesorów XML). XML jest podzbiorem standardu SGML eliminując jego zbyt skomplikowany charakter tam gdzie się tylko dało. Większość dokumentów XML jest także zgodna z SGML, ale nie na odwrót. Istnieją dokumenty XML, które nie są poprawnymi dokumentami SGML (względnie: przetwarzane zgodnie z regułami SGML mogą zostać zinterpretowane wbrew intencji autora) - za sprawą sposobu zamykania pustych znaczników (jak np. <p/>, które w XML-u jest równoważne <p></p>), kolidującego ze skróconą notacją znaczników SGML znaną jako Null End Tag (np. <p/abc/, co w dokumentach SGML może być równoważne <p>abc</p> lub być niepoprawne, jeśli definicja dokumentu zabrania stosowania NET).

Vide: <p/>abc/ w XML-u odpowiada <p></p>abc/, podczas gdy w SGML-u <p>>abc</p>. Notabene cecha ta jest jednym z argumentów wysuwanych przeciwko tezie o kompatybilności opartego o XML języka XHTML z opartym o SGML językiem HTML.

Istnieją również inne cechy różniące te dwa metajęzyki.

Mówimy o dokumencie, że jest poprawny składniowo (ang. well-formed), jeżeli jest zgodny z regułami składni XML. Reguły te obejmują m.in. konieczność domykania wszystkich znaczników. Dokument niepoprawny składniowo nie może być przetworzony przez parser XML.

Mówimy o dokumencie, że jest poprawny strukturalnie (ang. valid), jeżeli jest zgodny z definicją dokumentu, tzn. dodatkowymi regułami określonymi przez użytkownika. Do precyzowania tych reguł służą specjalne języki. Najpopularniejszymi są DTD, XML Schema oraz RELAX NG.

Poprawny składniowo (ang. well-formed) dokument XML powinien być tworzony zgodnie z kilkoma zasadami:

* powinien zawierać deklarację XML, która musi być umieszczona na samych początku pliku (nie może być poprzedzona np. komentarzem) oraz musi posiadać atrybut version (dopuszczalne wartości to 1.0 albo 1.1) oraz opcjonalnie atrybuty:

1. encoding - deklaruje zestaw znaków używanych w dokumencie XML, wartością domyślną jest kodowanie UTF-8 w systemie Unicode.

2. standalone - określa tryb dokumentu XML, może przyjmować wartość yes lub no. Jeśli ustawimy wartość na yes to będzie oznaczało, że dokument nie zawiera innych plików, które muszą zostać przetworzone wraz z dokumentem. Może to być np. zewnętrzny arkusz stylów lub definicja DTD;

* musi zawierać dokładnie jeden element główny zwany root element, w naszym przypadku elementem głównym jest element o nazwie newsy;

* każdy element musi zaczynać się znacznikiem początku elementu np. <data> oraz kończyć identycznym znacznikiem końca elementu np. </data>, wyjątek stanowią elementy puste (<element-pusty />), czyli takie które nie zawierają żadnych danych, ani innych elementów, mogą zawierać atrybuty;

* nazwy elementów mogą zawierać znaki alfanumeryczne (litery a-z, A-Z oraz cyfry 0-9), znaki ideograficzne (ą, ó, ń jednak należy unikać takich konstrukcji) oraz 3 znaki interpunkcyjne (podkreślenie _, łącznik -, kropka.). Znak dwukropka zarezerwowany jest dla identyfikacji przestrzeni nazw, której nazwa dopisywana jest przed nazwą elementu np. <przestrzeń1:element>,

* nazwy elementów nie mogą zaczynać się od znaku łącznika -, kropki, czy cyfry. Dodatkowo nie mogą zaczynać się od xml, XML, xML itp. (wielkość liter bez znaczenia).

* elementy można zagnieżdżać w sobie i wtedy każdy element znajdujący się wewnątrz innego elementu jest nazywany "dzieckiem" tego elementu, a element wewnątrz którego znajdują się inne elementy zwany jest "rodzicem" tych elementów, element <newsy> jest rodzicem elementu <news>, element <news> jest dzieckiem elementu <newsy>, a zarazem rodzicem elementów <data>, <autor>, <e-mail>, <tresc>. Nie można stosować konstrukcji takiego typu: <news><data></data><tresc></news></tresc>, ponieważ element <tresc> nie jest prawidłowo zagnieżdżony w elemencie <news>;

* każdy element może zawierać atrybuty, które definiuje się w znaczniku początku elementu np. atrybutem elementu <news potw="yes"> jest atrybut o nazwie potw oraz wartości yes. Wartości atrybutów podaje się w cudzysłowach albo apostrofach (pojedynczych cudzysłowach).

* informacje, które zawiera element muszą być zapisane pomiędzy znacznikiem początku i końca elementu,

* w danych, atrybutach oraz nazwach elementów nie mogą pojawiać się niektóre znaki. Przykładem może być znak mniejszości (<), lub ampersand (&). Znaków tych nie można używać, ponieważ parsery XML "widząc" np. znak mniejszości wewnątrz elementu stwierdzą, że jest to początek znacznika i dokument zostanie błędnie zinterpretowany. Specyfikacja XML daje możliwość używania takich znaków z wykorzystaniem predefiniowanych odniesień jednostki. Jeśli np. chcemy wstawić znak mniejszości (<) wpisujemy zamiast niego sekwencję &lt; znak ampersand - &amp; znak większości (>) &gt;

* jeżeli nie chcemy używać predefiniowanych odniesień jednostek możemy część danych, które zawierają np. kod html lub xml zapisać w sekcji danych znakowych, która nie będzie przetwarzana przez analizator składni XML. Znacznik początku sekcji danych znakowych to: <![CDATA[, a znacznik końca: ]]>.

* w dokumencie XML możemy wykorzystywać komentarze, które zaczynają się znakami: <!--, a kończą: -->. Przykład: <!-- To jest komentarz -->,

* specyfikacja XML zezwala na wstawianie instrukcji przetwarzania, które są wykorzystywane do przeniesienia informacji do aplikacji. Instrukcje przetwarzania rozpoczynają się znakami: <?, a kończą: ?>. Przykładem takiej instrukcji może być odniesienie do arkusza stylów, który jest powiązany z dokumentem XML: <?xml-stylesheet type="text/xsl" href="newsy.xsl"?>.

Równocześnie z czwartą odsłoną wersji 1.0 W3C opublikowało drugą odsłonę wersji 1.1. Wprowadza ona zmiany w zestawie dopuszczanych znaków, co ma związek z modyfikacjami standardu Unicode przeprowadzanymi już po publikacji wersji 1.0.

Korzyści ze zmian wprowadzonych w nowej wersji są zazwyczaj znikome w porównaniu ze stratą, jaką jest brak zgodności z wersją 1.0. Samo W3C nie traktuje tej wersji jako następcy dla 1.0, raczej jako jego odmianę do bardzo specyficznych zastosowań[potrzebne źródło]. Wciąż zalecane jest korzystanie z wersji 1.0 wszędzie, gdzie to możliwe.

Obie wersje wciąż są wspierane i rozwijane przez W3C, a kolejne ich edycje, jak dotąd, pojawiają się w tym samym czasie.

XML

Extensible markup language - rozszerzalny język znaczników - otwarty standard opracowany przez W3C język opisujący dane (metajęzyk), służy do tworzenia aplikacji XML przechowujących informacje. XML oddziela dane od sposobu ich publikowania. Dane opisywane są w sposób tekstowy opisywany za pomocą znaczników.

Prolog dokumentu - umieszcza się w nim zwykłe deklaracje np. standardowa deklaracja XML (<?xml version=”1.0” encoding=”UTF-8” standalone=”yes”?>, deklaracja arkusza stylów. Deklaracje najczęściej są instrukcjami przetwarzania.

Dodawanie danych za pomocą podelementów lub atrybutów. W XML rozróżniana jest wielkość liter.

Kontrola poprawności aplikacji XML za pomocą DTD (Document Type Definition) lub XML Schema.

Oglądanie (odtwarzanie) danych za pomocą CSS lub XSL.

<?xml-stylesheet type="text/css" href="arkusz.css"?>

<?xml-stylesheet type="text/xml" href="default.xsl"?>

-----------------------------------

Ad. 8

8) Mechanizm wyzwalaczy w bazach danych.

Wyzwalacz (ang. trigger) jest to procedura wykonywana automatycznie jako reakcja na pewne zdarzenia w tabeli bazy danych. Wyzwalacze mogą ograniczać dostęp do pewnych danych, rejestrować zmiany danych lub nadzorować modyfikacje danych.

Bazy danych posiadające wyzwalacze: Microsoft SQL Server, PostgreSQL, Sybase, Oracle, Firebird, SQLite, InterBase SQL, MySQL (od wersji 5.0.2)

Standard języka SQL zdefiniował wyzwalacze dość późno, bo dopiero od wersji 99. Z tego powodu różne systemy bazodanowe opracowały własną składnię tworzenia wyzwalaczy. Dość blisko standardu jest Oracle oraz Firebird, natomiast system bazodanowy Microsoftu używa składni w wielu miejscach różniącej się od wytycznych.

Istnieje kilka typów wyzwalaczy.

Wyzwalacze BEFORE - wykonywane przed instrukcją generującą zdarzenie.

Wyzwalacze AFTER są wykonane po instrukcji generującej zdarzenie.

W niektórych bazach danych są również wyzwalacze INSTEAD OF - są one wykonywane zamiast instrukcji generującej zdarzenie.

Istnieją trzy typowe zdarzenia powodujące wykonanie wyzwalaczy:

* dopisanie nowego rekordu do bazy danych w wyniku wykonania instrukcji INSERT,

* zmiana zawartości rekordu w wyniku wykonania instrukcji UPDATE oraz

* usunięcie rekordu w wyniku wykonania instrukcji DELETE.

Główne cechy wyzwalaczy to:

* nie mogą mieć parametrów (ale mogą zapisywać dane w tabelach tymczasowych)

* nie mogą zatwierdzać transakcji (COMMIT) ani ich wycofywać (ROLLBACK) ponieważ działają w kontekście

instrukcji SQL, która spowodowała ich uruchomienie

* mogą generować dodatkowe błędy, jeżeli są źle napisane.

Wyzwalacze (PL/SQL)

Nazwane bloki PL/SQL związane z tabelą, widokiem, schematem lub bazą danych, uruchamiane zdarzeniowo podczas zajścia operacji na bazie danych.

Zdarzenia:

- każdy wiersz związany z instrukcją DML (wykorzystanie FOR EACH ROW),

- użycie instrukcji DML (INSERT, UPDATE, DELETE)

- użycie instrukcji DDL (CREATE, DROP, ALTER)

- zdarzenie bazodanowe (SERVERERROR, LOGON, LOGOFF, STARTUP, SHUTDOWN).

Procedury wyzwalania:

- Before/After - uruchamiane przed/po zdarzeniu,

- Instead of - uruchamiane zamiast polecenia INSERT, UPDATE, DELETE,

- systemowe - uruchamiane po zajściu określonego zdarzenia w schemacie lub bazie danych.

Składnia wyzwalacza:

CREATE [OR REPLACE] TRIGGER nazwa

[BEFORE|AFTER] [INSTEAD OF] [rodzaj instrukcji]

ON [tabela|widok|DATABASE|SCHEMA]!

[FOR EACH ROW]

[WHEN (warunek logiczny)]

Blok PL/SQL

Specjalne zmienne systemowe typu BOOLEAN informują o typie operacji:

INSERTING - wyzwalacz uruchomiony dla INSERT

DELETING - wyzwalacz uruchomiony dla DELETE

UPDATING - wyzwalacz uruchomiony dla UPDATE

Przykład If INSERTING then dbms_output.put_line(`DODAWANIE'); end if;

Operacje na wyzwalaczach:

ALTER TABLE trigger_name [ENABLE|DISABLE]!; - włącz/wyłącz wyzwalacz

DROP TRIGGER trigger_name; - usuń wyzwalacz

ALTER TRIGGER trigger_name COMPILE; - kompiluj wyzwalacz.

-----------------------------------

Ad. 9

9) Modele hurtowni danych.

Modele hurtowni danych.

Hurtownia danych (data warehouse) to trwała analityczna baza danych, która staje się podstawą systemu wspomagania podejmowania decyzji. Jest projektowana dla dużej liczby danych stałych. Zapewnia stały dostęp do danych w trakcie podejmowania decyzji.

Modele danych :

ROLAP (relational OLAP) model relacyjny, jest implementowany w postaci tabel których schemat posiada najczęściej strukturę gwiazdy lub płatka śniegu (ewentualnie konstelacji faktów lub struktura gwiazda-płatek śniegu). Tabela centralna nazywana jest tabelą faktów, tabele poboczne to tabele wymiarów.

MOLAP, MDOLAP (multidimensional OLAP) model wielowymiarowy wykorzystujący wielowymiarowe tablice (multidimensional arrays, datacubes). Tabele zawierają wstępnie przetworzone dane pochodzące z wielu źródeł, złożone są z trzech wymiarów.

HOLAP (hybrid OLAP) model mieszany ROLAP i MOLAP.

-----------------------------------

Ad. 10

10) Metoda MRP.

Planowanie zapotrzebowania materiałowego (ang. Material requirements planning (MRP)) - jest to zbiór technik, które pomagają w zarządzaniu procesem produkcji. Techniki te często wspomagane są odpowiednimi aplikacjami komputerowymi.

Głównym celem jest zmniejszenie nakładów finansowych potrzebnych przez organizację produkcyjną. Jest to osiągane przez optymalizację zapasów oraz samego procesu produkcyjnego.

Do systemu wprowadza się informację o zaplanowanej produkcji, lub wielkość sprzedaży lub przyjętych zamówieniach na wyroby gotowe. Na tej podstawie system planuje produkcję poszczególnych elementów oraz dostawy podzespołów i materiałów. Planowanie może być wykonane wprzód lub wstecz (tzn. od zadanego dnia obliczenie, kiedy wymagana produkcja zostanie wykonana lub kiedy trzeba rozpocząć proces aby uzyskać wymaganą produkcję na zadaną datę). System przewiduje czasy produkcyjne, czasy dostaw. W procesie planowania może następować optymalizacja kosztów, czasu wykonania, opłacalności. Do różnych typów produkcji stosuje się inne algorytmy obliczeń.

* redukcja zapasów

* dokładne określenie czasów dostaw surowców i półproduktów

* dokładne wyznaczenie kosztów produkcji

* lepsze wykorzystanie posiadanej infrastruktury (magazynów, możliwości wytwórczych)

* szybsze reagowanie na zmiany zachodzące w otoczeniu

* kontrola realizacji poszczególnych etapów produkcji

Metoda MRP

MRP I (Material Requirement Planning) - Planowanie Potrzeb Materiałowych jest metodą zarządzania produkcją i zapasami produkcyjnymi obejmującą działania związane z wyprzedzającym ustaleniem rodzaju i wielkości zadań dla komórek produkcyjnych przedsiębiorstwa. Obejmuje planowanie potrzeb materiałowych oraz sposobów ich zaspokajania związany z realizowanymi zaleceniami produkcyjnymi. Inaczej mówiąc służy do racjonalizacji planowania, poprzez wydawanie zleceń zakupu i produkcji dokładnie w takim momencie, aby żądany produkt pojawił się w potrzebnej chwili i w wymaganej ilości.

Główne cele MRP I:

- redukcja zapasów materiałowych i operacyjnych,

- dokładne określenie czasów dostaw surowców i półproduktów,

- dokładne wyznaczenie kosztów produkcji,

- lepsze wykorzystanie posiadanej infrastruktury (magazyny, możliwości wytwórcze),

- szybsze reagowanie na zmiany zachodzące w otoczeniu,

- kontrola poszczególnych etapów produkcji.

10 lat później (1980) opracowana została kontynuacja metody MRP I - MRP II. Dodano dalsze sprzężenia zwrotne między wykonywanymi operacjami technologicznymi oraz uzupełnienie informacjami kosztowymi.

-----------------------------------

Ad 11

11) Cykl życia systemu informatycznego.

Cykl życia systemu (ang. business system life cycle) - strukturalne podejście do zadania opracowania

systemu dla przedsiębiorstwa. Możemy wyróżnić siedem głównych etapów, które tworzą ten cykl:

1. opracowanie strategii

2. analiza

3. projektowanie

4. budowa

5. dokumentowanie

6. wdrożenie

7. eksploatacja

Cykl życia systemu informatycznego

Przez cykl życia systemu informatycznego należy rozumieć proces złożony z ciągu wzajemnie spójnych etapów, umożliwiających pełne i skuteczne stworzenie, a następnie użytkowanie systemu.

Fazy podstawowe:

- określenie wymagań - określane są cele oraz szczegółowe wymagania wobec tworzonego systemu,

- projektowanie - powstaje szczegółowy projekt systemu spełniającego ustalone wcześniej wymagania,

- implementacja oprogramowania - projekt zostaje zaimplementowany w konkretnym środowisku programistycznym oraz wykonywane są testy poszczególnych modułów,

- integracja i testowanie SI - następuje integracja poszczególnych modułów połączona z testowaniem poszczególnych podsystemów oraz całego SI, tworzenie dokumentacji.

- wdrożenie i utrzymanie - producent wdraża system, prowadzi szkolenia oraz dokonuje konserwacji SI (wykonuje modyfikacje polegające na usuwaniu błędów, zmianach i rozszerzaniu funkcji systemu).

-----------------------------------

Ad 12

12) Schematy ERD.

Diagram związków encji lub Diagram ER (od ang. Entity-Relationship) - rodzaj graficznego przedstawienia związków pomiędzy encjami używany w projektowaniu systemów informacyjnych do przedstawienia konceptualnych modeli danych używanych w systemie.

Systemy CASE, które wspierają tworzenia tych diagramów, mogą na ich podstawie automatycznie tworzyć bazy danych odpowiadające relacjom na diagramie.

Diagram pokazuje logiczne związki pomiędzy różnymi encjami, związki te mają dwie cechy:

1. Opcjonalność, która mówi o tym, czy każda encja musi czy też może wystąpić równocześnie z inną. Np. TOWAR musi zostać zakupiony przez co najmniej jednego KLIENTA, ale KLIENT może być nabywcą TOWARU. W reprezentacji graficznej linia przerywana oznacza opcjonalność związku, natomiast ciągła wymóg związku.

2. Krotność,

W przypadku związków M:N często stosuje się normalizację diagramu, która polega na dodaniu encji pośredniczącej i zastąpienie związku M:N dwoma związkami 1:N z nową encją.

Schematy ERD

Metodyka schematu ERD jest analitycznym sposobem projektowania struktury informacyjnej (schematu bazy danych). Istnieje wiele metod rysowania schematów m.in. Chen i Martin.

Występują trzy elementy składowe schematu:

- obiekt jest pewną całością, posiadającą cechy i odróżniającą się od innych. Każdy obiekt powinien być opisany.

- związek określa relację pomiędzy obiektami. Charakteryzują go dwie cechy: liczność (związki jednoznaczne, wieloznaczne) i opcjonalność.

- atrybut jest elementem realcji.

Istnieją systemy wspomagania tworzenia schematów ERD - narzędzia typu CASE. Np. StarUML, EASYCASE.

-----------------------------------

Ad 13

13) Podaj schemat deklaracji funkcji w języku C. (chyba trywialne !!!)

Funkcja w języku C ma postać:

[typ] nazwa([lista_parametrów])

{

instrukcje;

[return wartość;]

}

Deklarowanie może odbyć się na dwa główne sposoby. Z tzw. Prototypem funkcji lub bez. Z prototypem funkcji na początku pliku jest praktyczniejsze dlatego, że sam kod funkcji może się wtedy znajdować w dowolnym (prawie) miejscu kodu źródłowego.

Funkcje mogą być globalne oraz lokalne. Lokalne obowiązują tylko w obszarze ich utworzenia czyli wewnątrz jakiejś funkcji, funkcje globalne obejmują obszar globalny czyli są dostępne w całym programie.

-----------------------------------

Ad 14

14) Wyjaśnić na czym polega proces teksturowania. Problemy związane z tym zagadnieniem. Filtrowanie tekstur.

Teksturowanie - technika stosowana w grafice trójwymiarowej, której celem jest przedstawienie szczegółów powierzchni obiektów przestrzennych za pomocą obrazów bitmapowych (tekstur) lub funkcji matematycznych (tekstur proceduralnych). Mapowanie tekstury określa w jaki sposób powiązać piksele (nazywane w tym kontekście tekselami) lub wartości funkcji z powierzchnią obiektu. Tekstury niosą informacje o barwie powierzchni, jak również innych parametrach generowanego obrazu, związanych np. z modelem oświetlenia: barwa światła odbitego, rozproszonego, stopień przezroczystości, współczynnik załamania światła itp.

Tekstury bitmapowe to na ogół zdjęcia powierzchni rzeczywistych przedmiotów (ścian, tkanin, kory drzew, desek, itp.); tekstury proceduralne to parametryzowane wzory generowane programowo, np. szachownica, marmur, drewno, granit, chmury. Tekstury mogą być jedno, dwu i trójwymiarowe.

Teksturowanie jest alternatywą dla modelowania geometrycznego, bowiem przedstawienie wszystkich detali za pomocą geometrii jest trudne, niepraktyczne i w większości przypadków niemożliwe. Specjalnym przypadkiem teksturowania jest bumpmapping, gdzie tekstura wpływa na sposób obliczania natężenia światła, symulując niewielkie nierówności powierzchni.

Odwzorowanie współrzędnych dwuwymiarowej tekstury na współrzędne obiektu trójwymiarowego nazywane jest mapowaniem (mapowaniem tekstury):

1. Odwzorowanie może zostać utworzone automatycznie, w procesie generacji obiektu przez oprogramowanie.

2. Jeśli obiekt jest reprezentowany przez siatkę wielokątów projektant może określić współrzędne tekstury dla każdego wierzchołka - jest to tzw. UV mapping.

3. Tekstura mapowana jest najpierw na jakąś prostą figurę przestrzenną, a następnie konkretne punkty są rzutowane na teksturowaną figurę. Używane figury:

* płaszczyzna (mapowanie płaskie),

* sfera lub elipsoida (mapowanie sferyczne),

* powierzchnia walca (mapowanie cylindryczne),

* sześcian (mapowanie sześcienne, ang. box mapping).

Odwzorowanie jest wykonywane w lokalnym układzie współrzędnych obiektu, co sprawia, że tekstura jest "przyklejona" na stałe do obiektu, nadając jego powierzchni pożądany charakter.

Rzadziej tekstura jest ruchoma względem obiektu; w grafice czasu rzeczywistego (np. grach komputerowych) w ten sposób symuluje się metaliczne obiekty, które odbijają otoczenie (jest to tzw. mapowanie środowiska, ang. environment mapping).

Wyjaśnić na czym polega proces teksturowania. Problemy związane z tym zagadnieniem. Filtrowanie tekstur.

Teksturowanie - technika stosowana w grafice trójwymiarowej, której celem jest przedstawienie szczegółów powierzchni obiektów przestrzennych za pomocą obrazów bitmapowych (tekstur). Poszczególne elementy tekstury to tekstele.

Odwzorowanie tekstury składa się z dwóch etapów:

- odwzorowanie czterech rogów piksela ekranu na powierzchnię obiektu,

- odwzorowanie rogów piksela z powierzchni obiektu do współrzędnych tekstury.

Jeśli współrzędne tekstury przekraczają jej rozmiar jest ona powielana.

Mipmapping do teksturowania obiektów wykorzystuje cały zestaw tych samych tekstur o różnych rozmiarach. Odpowiednia tekstura jest wybierana automatycznie co znacznie przyspiesza operacje odwzorowywania, oraz jej jakość.

Filtrowania tekstur: (w zależnośći od uśredniania ilości teksteli dookoła)

- próbkowanie punktowe,

- filtrowanie dwuliniowe,

- filtrowanie trójliniowe,

- filtrowanie anizotropowe. (przydatne przy zmianie kształtu obiektu dążącego do trapezu).

Tekstury wolumetryczne - tekstury do których dodano trzecią współrzędna mapowania, złożone z wekseli.

-----------------------------------

Ad 15

15) Opisz algorytmy stosowane podczas kompresji wideo.

Opisz algorytmy stosowane podczas kompresji wideo.

Kodowanie obrazów statycznych (JPEG)

- dyskretna transformata cosinusowa - podział przetwarzanego obrazu na bloki o określonym rozmiarze (np. 8x8), po czym przeprowadzenie na nich DCT Dyskretnej Transformaty Kosinusowej.

- kwantyzacja (stratna) zmniejsza precyzję współczynników przez odpowiadające im wartości ze specjalnych tablic kwantyzacji, a następnie zaokrągleniu otrzymanych wyników. Przy odbiorze następuje operacja odwrotna (dekwantyzacja) dając wynik zbliżony do oryginału.

- kodowanie - (Huffmana) po kwantyzacji współczynniki ułożone są w charakterystyczny sposób, z dużą ilością zer. Im więcej jest grup zer tym lepiej można zakodować, możliwe jest uzyskanie jak najdłuższego ciągu zer.

- kodowanie koloru - barwy przedstawione zazwyczaj w przestrzeni kolorów RGB zmieniane są na przestrzeń luminancji i chrominancji. Spowodowane jest to większą czułością oka na luminancję niż na kolor obrazu.

Kodowanie ruchu (tylko w filmach)

- wektory ruchu - dla każdego makrobloku w aktualnej klatce estymacja ruchu polega na znalezieniu w poprzednio kodowanej klatce (klatce odniesienia) obszaru najbardziej podobnego, pod względem przyjętego kryterium podobieństwa - np. minimalnej średniej różnicy pomiędzy pikselami. Następnie wektor ruchu określa przestrzenne przesunięcie, jakie wykonuje danych blok przy zmianie klatki. Klatka odniesienia nie zawsze jest klatką poprzedzającą. Algorytmy wideo często kodują klatki w innym porządku niż są wyświetlane, potrafią przeskakiwać kilka klatek w przód po czym wraca z powrotem.

-----------------------------------

Ad 16

16) Tablice i operacje z nimi związane. Metody sortowania tablic.

Tablice i operacje z nimi związane. Metody sortowania tablic.

Tablica to specyficzna struktura danych, pewien kontener jednorodnych danych w którym poszczególne komórki dostępne są za pomocą indeksu. Indeks może być numeryczny (zazwyczaj) bądź słowny (tablice asocjacyjne). Tablice statyczne mają z góry określony rozmiar. Tablice dynamiczne tworzone przy użyciu wskaźników mogą mieć rozmiar zmienny w trakcie trwania programu.

Deklaracja:

a:array[1..10] of integer; // Pascal

int a[10]; // C

Operacje na tablicach wspomaga pętla for lub ewentualnie while, pozwalają przeskakiwać kolejno po komórkach tablicy.

Sortowanie - proces ustawienia zbioru obiektów w określonym porządku.

- sortowanie przez wstawianie, gra w karty wstawianie efektywniej połówkowe wstawianie

- sortowanie przez wybieranie, wybór najmniejszego elementu i wstawienie na początek.

- sortowanie przez zamianę. - sortowanie bąbelkowe, sortowanie mieszane.

- sortowanie za pomocą malejących przyrostów (shell sort) modyfikacja sortowania przez wstawianie, sortowanie co 4, 2 i 1 elementy.

- sortowanie drzewiaste - mniejsze elementy kierowane są na lewo większe na prawo, aż dojdą do wolnego miejsca na drzewie (zostaną liściem). Pierwszy element poddany sortowaniu jest korzeniem.

- sortowanie przez podział (quicksort) - sortowanie przez element wyznaczany jako miejsce podziału na dwie części sortowane symetrycznie. Istnieją metody rekurencyjne oraz iteracyjne.

Złożoność czasowa sortowań: n2 lub n*log(n).

-----------------------------------

Ad 17

17) Kursory - tworzenie, zastosowanie, atrybuty kursora jawnego i ukrytego. (rozszerzyć!!!)

Kursor - w systemach zarządzania bazą danych jest to tymczasowa struktura służąca do pobierania wyniku zapytania SQL. Kursor umożliwia pobieranie rekordów sekwencyjnie, po jednym lub więcej na raz, a także przemieszczanie się po wynikach zapytania.

Kursor może być zdefiniowany i działać po stronie serwera baz danych, jak i po stronie klienta. Ten drugi typ kursora jest rodzajem iteratora umożliwiającego poruszanie się po poszczególnych rekordach zwróconych przez serwer klientowi.

Kursory jawne są jedyną metodą, umożliwiającą w programie PL/SQL odczyt zbioru rekordów.

Aby kursor jawny mógł być użyty w programie, konieczne jest wykonanie szeregu operacji. Pierwszą z nich jest zadeklarowanie kursora w sekcji deklaracji bloku PL/SQL. Deklarując kursor programista podaje jego nazwę i zapytanie, które odczyta z bazy danych rekordy, jakie kursor ma udostępniać. Następnie, już w sekcji wykonywalnej programu, kursor musi zostać otwarty. W tym momencie zostaje wykonane zapytanie związane z kursorem, zbiór rekordów, odczytany z bazy danych przez zapytanie, zostaje składowany w związanym z kursorem obszarze pamięci. Po otwarciu kursora można pobierać kolejno rekordy z odczytanego zbioru. Gdy kursor przestaje być potrzebny, należy go zamknąć, co powoduje zwolnienie obszaru pamięci, uprzednio przydzielonego do kursora.

Kursory niejawne są tworzone automatycznie dla każdego z poleceń UPDATE, INSERT, DELETE i SELECT INTO, jakie zostaje umieszczone w programie. Kursory niejawne najczęściej służą do sprawdzenia stanu polecenia, dla którego kursor niejawny został utworzony.

[Oracle PL/SQL]

Możliwości oferowane przez podstawowe instrukcje języka SQL takie jak: INSERT, UPDATE, DELETE, SELECT i LOCK TABLE zwiększają się znacznie na skutek zastosowania kursorów jawnych. Wraz z każdą operacją w tablicy, ORACLE rezerwuje obszar roboczy i kursor, który uaktywnia kolejne wiersze w podzbiorze tablicy, wynikającym z zakresu operacji. Po wykonaniu operacji w ostatnim wierszu kursor jest zamykany.

Kursor ten jednak jest niejawny co oznacza, że z zewnątrz nie jest dostępna informacja, który wiersz jest aktualnie aktywny. Sytuacja ta ulega zmianie, jeśli zastosować mechanizm używania kursorów jawnych. Kursor jawny można zadeklarować w każdej części deklaracyjnej programu PL/SQL'a . Jest on dostępny wszędzie tam, gdzie dostępne są zmienne deklarowane równolegle z nim. Ogólna postać deklaracji kursora jawnego jest następująca:

CURSOR nazwa_kursora IS zdanie_select

Następujące trzy instrukcje pozwalają przetwarzać kursor jawny:

Następujący program stanowi prosty przykład zastosowania mechanizmu kursorów jawnych:

DECLARE

imie przykl_tab1.imie % TYPE ;

nazwisko przykl_tab1.nazwisko % TYPE;

wiek przykl_tab1.wiek % TYPE;

CURSOR moj_kursor IS SELECT imie, nazwisko, wiek

FROM przykl_tab1

WHERE imie = 'JAN'

ORDER BY imie ;

BEGIN

OPEN moj_kursor;

LOOP

FETCH moj_kursor INTO imie, nazwisko, wiek ;

PROMPT imie, nazwisko, wiek ,'\n';

PROMPT '***********************************************';

EXIT WHEN ( moj_kursor % NOTFOUND);

END LOOP ;

CLOSE moj_kursor;

END;

-----------------------------------

Ad 18

18) Wzorzec projektowy MVC.

MVC (ang. Model-View-Controller) - Model-Widok-Kontroler to architektoniczny wzorzec projektowy w informatyce, którego głównym założeniem jest wyodrębnienie trzech podstawowych komponentów aplikacji:

* modelu danych,

* interfejsu użytkownika,

* logiki sterowania.

Wzorzec umożliwia separację logiki programu (modelu) od tego, w jaki sposób użytkownik wprowadza zmiany w danych oraz od tego, jak dane są prezentowane użytkownikowi. W ten sposób modyfikacje jednego komponentu wcale lub minimalnie wpływają na pozostałe.

1. Model - opisuje dane i całą logikę programu - wszystkie zależności między poszczególnymi danymi.

2. Widok - wyświetla dane przechowywane w modelu, w pożądanej przez użytkownika formie; może istnieć wiele widoków tego samego modelu.

3. Kontroler - przekształca żądania użytkownika na żądania zrozumiałe dla modelu; może istnieć wiele różnych kontrolerów dla tego samego modelu.

Schemat działania w modelu MVC:

1. kontroler modyfikuje dane modelu

2. model stosownie do zmian weryfikuje i ewentualnie zgodnie z zależnościami uaktualnia inne swoje dane;

3. model informuje wszystkie widoki, że nastąpiły zmiany (może także wyszczególniać, które dane zostały zmienione);

4. widoki są odświeżane stosownie do aktualnych danych modelu.

Użycie MVC można przedstawić na przykładzie aplikacji bazodanowej. Wtedy:

* modelem jest encja (lub ich zbiór) z bazy danych,

* widokiem tabela danych pokazywana użytkownikowi,

* kontrolerem przyciski do manipulacji.

Kontroler jest odpowiedzialny za odczyt danych z bazy danych (utworzenie modelu) i przekazanie ich do warstwy widoku (interfejsu użytkownika). Gdy użytkownik wybierze pokaż kolejne, wtedy odwołanie jest przekazywane do kontrolera, który ponownie pobiera dane i przekazuje do widoku tą samą drogą.

Dzięki takiej strukturze można budować warstwy niezależnie. Dzięki odpowiednim interfejsom widok można dowolnie podmieniać - zamiast kontrolki w aplikacji okienkowej, można zastosować ten sam kod do aplikacji www lub nawet generatora plików pdf.

Wzorzec Model-Widok-Kontroler jest często także używany we frameworkach do szybkiego tworzenia aplikacji internetowych. Istnieje kilkanaście dużych frameworków PHP stosujących ten wzorzec jak np. Code Igniter, Kohana, CakePHP, Zend Framework, Symfony, ale też zupełnie prostych i "lekkich" jak np. TinyMVC - bardzo pomocny w zrozumieniu idei MVC. W Ruby jest napisany bardzo popularny Ruby on Rails, w Perlu Catalyst, a w Pythonie TurboGears, Pylons, Django (ten ostatni stosuje MTV, ang. Model-Template-View). Popularność wzorca MVC wynika z jego przydatności.

Frameworki MVC do operacji na bazach danych używają modeli i mapowania relacyjno-obiektowego, ORM (ang. object-relational mapping) - w Railsach jest to ActiveRecord, w Catalyscie np. DBIx::Class, a framework Spring w Javie używa Hibernate. Zwykle jest też możliwe użycie baz danych przez bezpośrednie zapytania SQL. Użycie modeli upraszcza typowe operacje - wyświetlanie z paginacją, edycję danych, a także uniezależnia od konkretnego typu bazy danych.

Właściwy kod programu zwykle jest umieszczany w kontrolerze, a przetworzone dane przekazywane są do odpowiedniego widoku - tu przy pomocy bibliotek szablonów (Smarty, Template Toolkit czy też JSP w przypadku Springa) generowany jest HTML, inny rodzaj widoku może generować PDF albo XML.

Wspólną cechą wielu webowych frameworków MVC jest narzucanie pewnych praktyk programistycznych - samo użycie wzorca MVC jest tego przejawem, zwykle też narzuca się pewną konwencję nazw pól w bazie danych, strukturę katalogów i plików w projekcie, konwencję nazw klas, szablonów. Dzięki temu można uniknąć żmudnej konfiguracji każdego aspektu takiej aplikacji (choć zwykle można te konwencje zmienić), a powstające projekty są spójne i łatwiejsze do zrozumienia przez nowe osoby.

Praktycznie każda aplikacja WWW korzysta z baz danych - operacje na bazach stanowią modele danych. Szablony HTML odpowiedzialne za wygląd i wyświetlanie danych są częścią widoków (np. Smarty). Kod odpowiedzialny za wykonanie określonych operacji (spinający wszystko razem) tworzy sterowniki.

Wykształciło się kilka modyfikacji wzorca MVC, w szczególności:

MVC (Model-View_Controler) jest jednym z najczęściej stosowanych wzorców projektowych w informatyce. Głównym założeniem tego wzorca jest podzielenie kodu aplikacji na 3 moduły:

- model reprezentujący dane (np. pobieranie z BD czy parsowanie z plików XML), zapewnia sposób dostępu do danych, stosowaniy do przygotowywania wyników np. z bazy danych.

- widok reprezentujący interfejs użytkownika, zarządza wyglądem aplikacji co pozwala na bezinwazyjną zmianę grafkiki w dowolnym momencie.

- kontroler czyli logika sterująca aplikacją, najważniejsza część kodu, kontroler odpowiada za pobranie danych z wartwy modelu i przekazaniu ich do widoku. W kontrolerze odbywają się wszystkie konieczne obliczenia i podejmowane są odpowiedznie akcje w zależności od działań użytkownika.

Najważniejszym cele modelu MVC:

- podział pozwala w prosty sposób rozdzielić zadania pomiędzy programistów,

- programiści poszczególnych zadań nie muszą ściśle znać pozostałych a jedynie sposób komunikacji między warstwami.

-----------------------------------

Ad 19

19) Metody komunikacji między procesami w systemie PVM.

(zredukować czy rozszerzyć?)

W dużym uproszczeniu PVM pozwala na "połączenie" większej ilości komputerów w jeden. Odbywa się to na zasadzie dołączania kolejnych hostów (komputerów), na których został zainstalowany i skonfigurowany pvm. Podłączanie hosta jest w uproszczeniu procedurą połączenia przez rsh, uruchomieniu demona pvm i dostarczenia mu informacji o tym, kto jest jego "rodzicem" oraz o parametrach istniejącej sieci.

W momencie, kiedy cała "maszyna wirtualna" już jest skonfigurowana, rola pvm sprowadza się do stanowienia pomostu wymiany informacji pomiędzy procesami, które się w pvm "zarejestrują", oraz umożliwienia administrowania stanem zarejestrowanych w pvm procesów. Z takiego punktu widzenia pvm można nazwać raczej "demonem komunikacji międzyprocesowej" i można to podeprzeć najprostszym argumentem, mianowicie pvm nie stanowi interfejsu do systemu operacyjnego lub maszyny, na której działa dany proces.

PVM pozwala zautomatyzować proces uruchamiania aplikacji na innych komputerach. Jeżeli uruchomimy z poziomu normalnej konsoli program, który następnie zarejestruje się w pvm i użyje funkcji pvm_spawn(), aby uruchomić dowolną ilość procesów, to już rolą PVM będzie zatroszczenie się, gdzie zostaną one uruchomione oraz samo ich uruchomienie (możliwe jest podanie parametru uściślającego lokalizacje docelową uruchomienia). W przypadkach obliczeń, gdzie procesy-dzieci, rodzą się i umierają w bliżej nieokreślonych interwałach i zjawiska te przeplatają się, zautomatyzowanie dostarczane przez PVM okazuje się bardzo pomocne, ponieważ odciąża programistę z potrzeby troski o prawidłowe rozłożenie obliczeń na hosty.

Identyfikacja w PVM odbywa się przez oddzielne numery identyfikacyjne przydzielane procesom w momencie rejestrowania się w PVM. Numery te stanowią zupełną abstrakcję od systemu operacyjnego i sprzętu, na którym uruchomiony jest dany proces. Numer identyfikacyjny jest bardzo istotnym elementem PVM, ponieważ stanowi on niejako adres danego procesu i jest on niepowtarzalny w zakresie pojedynczej maszyny PVM. Adres ten jest wykorzystywany przy wszystkich procedurach dotyczących innych procesów - można przesłać informacje pod dany adres, można "zabić" zdalny adres i wykonać wiele innych czynności.

Przesyłanie informacji pomiędzy programami

W pvm wyróżniamy dwa rodzaje wysyłania informacji: blokujące i nieblokujące. Przesyłanie blokujące to takie, które blokuje program wysyłający na procedurze wysłania do momentu aż program (lub programy) odbierający wywoła procedurę otrzymywania informacji i na odwrót, blokuje program odbierający na procedurze odbierania do momentu, aż zostaną mu wysłane jakieś informacje przez program nadający. Przesyłanie nieblokujące - jak wynika z nazwy - jest pozbawione tych negatywnych czynników, jednakże wymaga ono nieraz wsparcia przez "procesy zewnętrzne (proces pvmmsg)", oraz niejednokrotnie wymaga synchronizacji procesów w celu ich skomunikowania. Dlatego dla prostych programów przeważnie wykorzystuje się przesyłanie blokujące.

Do przesyłania informacji w PVM stosuje się "bufory". Każdy proces, który zarejestruje się w PVM wywołując dowolną jego procedurę (najczęściej stosuje się wywołanie pvm_mytid()), zostaje wyposażony w jeden bufor nadawczy i jeden bufor odbiorczy. Możliwe jest użycie buforów innych niż domyślne, jednakże wymaga to ich utworzenia.

Procedura przesyłania dzieli się na:

1. Wysłanie informacji przez program "nadający"

- inicjalizację bufora wysyłania

- spakowanie danych do bufora

- wysłanie wiadomości

2. Odebranie informacji przez programy "odbierające"

- odebranie wiadomości

- rozpakowanie informacji z bufora

Do bufora można spakować więcej niż jedną informację w celu wysłania ich większej ilości na raz, jednakże należy pamiętać o ich rozpakowaniu z bufora odbiorczego w odpowiedniej kolejności.

Niektóre funkcje do komunikacji

Komunikacja punkt-punkt

- pvm_send

int retval = pvm_send(int tid ,int msgtag);

Parametry

tid - identyfikator procesu, do którego ma zostać wysłany komunikat.

msgtag - liczba całkowita definiowana przez użytkownika jako etykieta komunikatu (powinna być >=0).

retval - kod statusu zwracany przez funkcję (retval < 0 oznacza błąd podczas wykonania operacji).

- pvm_recv

int retval = pvm_recv(int tid ,int msgtag);

Parametry

tid - identyfikator procesu, od którego ma zostać odebrany komunikat.

msgtag - liczba całkowita definiowana przez użytkownika jako etykieta komunikatu (powinna być >=0).

retval - kod statusu zwracany przez funkcję (retval < 0 oznacza błąd podczas wykonania operacji).

Komunikacja grupowa

- pvm_mcast

int retval = pvm_mcast( int *tids, int ntask, int msgtag );

Parametry

tids - tablica liczb całkowitych o ntask elementach zawierających identyfikatory zadań procesów, do których ma zostać wysłany komunikat.

ntask - ilość procesów, do których będzie wysłany komunikat.

msgtag - liczba całkowita definiowana przez użytkownika jako etykieta komunikatu (powinna być >=0).

retval - kod statusu zwracany przez funkcję (retval < 0 oznacza błąd podczas wykonania operacji).

Uwagi Funkcja wysyła komunikat asynchronicznie do wszystkich procesów, których identyfikatory zadań są zapamiętane w tablicy tids, z wyjątkiem procesu wysyłającego. Etykieta msgtag jest wprowadzona dla rozróżniania przesyłanych komunikatów. Proces odbierający komunikat może zrobić to albo funkcją pvm_recv() albo pvm_nrecv().

- pvm_bcast

int retval = pvm_bcast( char *group, int msgtag );

Parametry:

group - nazwa grupy (łańcuch znakowy).

msgtag - etykieta komunikatu określana przez użytkownika. Etykieta msgtag musi być >=0 i pozwala programowi rozróżniać rodzaje komunikatów.

retval - kod statusu zwracany przez funkcję (retval < 0 oznacza błąd podczas wykonania operacji).

Uwagi:

Funkcja wysyła komunikat zapamiętany w aktywnym buforze komunikatów do wszystkich procesów danej grupy. Komunikat nie jest przesyłany do procesu wysyłającego (jeżeli należy do tej grupy). Funkcja może zostać wywołana przez proces, który nie należy do tej grupy. Wysłanie komunikatu jest asynchroniczne (ale realizacja jest sekwencyjna - nie jest to typowy 'broadcast'). Funkcja w pierwszej kolejności określa identyfikatory zadań procesów danej grupy a następnie rozpoczyna wysyłanie do tych procesów komunikatu. Jeżeli w trakcie wykonania tej funkcji grupa się zmieni, to nie będzie to miało wpływu na to, do których procesów zostanie wysłany komunikat.

-----------------------------------

Ad 20

20) Opisz zadania protokołu IPv4. Wyjaśnij pojęcie adresu IP (czy różni się adres unicastowy od broadcastowego), maski (do czego służy), klas adresów (czym różnią się klasy między sobą), adresów prywatnych i publicznych oraz routingu. Podaj dwie dowolne cechy różnice protokół IPv6 od IPv4.

Internet Protocol (IP) - protokół komunikacyjny warstwy sieciowej modelu OSI (warstwy internet w modelu TCP/IP). Używany powszechnie w Internecie i sieciach lokalnych. Dane w sieciach IP są wysyłane w formie bloków określanych mianem pakietów. W przypadku protokołu IP, przed rozpoczęciem transmisji nie jest zestawiana wirtualna sesja komunikacyjna pomiędzy dwoma hostami, które nie komunikowały się ze sobą wcześniej. Protokół IP jest protokołem zawodnym - nie gwarantuje, że pakiety dotrą do adresata, nie zostaną pofragmentowane, czy też zdublowane, a ponadto mogą dotrzeć do odbiorcy w innej kolejności niż zostały nadane. Niezawodność transmisji danych jest zapewniana przez protokoły warstw wyższych (np. TCP), znajdujących się w hierarchii powyżej warstwy sieciowej.

IPv4 (ang. Internet Protocol version 4) - czwarta wersja protokołu komunikacyjnego IP przeznaczonego dla Internetu. Identyfikacja hostów w IPv4 opiera się na adresach IP. Dane przesyłane są w postaci standardowych datagramów. Wykorzystanie IPv4 jest możliwe niezależnie od technologii łączącej urządzenia sieciowe - sieć telefoniczna, kablowa, radiowa, itp. IPv4 znajduje się obecnie w powszechnym użyciu. Dostępna jest również nowsza wersja - IPv6. Dokładny opis czwartej wersji protokołu IP znajduje się w RFC 791. W modelu TCP/IP protokół IPv4 znajduje się w warstwie sieciowej.

Aby możliwa była komunikacja w protokole IP konieczne jest nadanie każdemu hostowi adresu IP czyli unikalnego identyfikatora, który pozwoli na wzajemne rozpoznawanie się poszczególnych uczestników komunikacji. Użytkownicy Internetu nie muszą znać adresów IP. Nazwa www.wikipedia.org jest tłumaczona na adres IP dzięki wykorzystaniu protokołu DNS. Adres IP jest dostarczany każdemu użytkownikowi przez dostawcę internetu (ISP). Może być przydzielany statycznie lub dynamicznie. Zapotrzebowanie na adresy IP jest tak duże, że pula nieprzydzielonych adresów zaczyna się wyczerpywać.

W IPv4, czyli obecnym standardzie adresowania internetu, adres IP to liczba 32-bitowa (od 0 do 4294967295), zapisywana w porządku big endian (najbardziej znaczący bajt, zwany też grubym bajtem, z ang. high-order byte, umieszczony jest jako pierwszy). Liczby w adresie IP nazywają się oktetami, ponieważ w postaci binarnej mają one osiem bitów. Te osiem bitów daje w sumie 256 kombinacji, więc każdy oktet przedstawia liczbę od 0 do 255.

Najpopularniejszy sposób zapisu adresów IP, to przedstawianie ich jako 4 dziesiętnych liczb od 0 do 255 oddzielonych kropkami. W rzeczywistości komputery traktują adres jako liczbę 32-bitową np.:

3482223596

Taki zapis jest mało czytelny, wobec czego stosuje się podział adresu IP na cztery oktety. Adres zapisujemy binarnie:

11001111 10001110 10000011 11101100

po czym każdą grupę 8-bitów przekształcamy do postaci dziesiętnej:

207 142 131 236

Z adresowaniem IP wiąże się pojęcie maski sieciowej. Wyobraźmy sobie sieć złożoną z 3 komputerów o adresach:

Komputer 1: 192.168.1.1

Komputer 2: 192.168.1.2

Komputer 3: 192.168.1.3

Łatwo zauważyć, że początek adresu dla wszystkich z nich jest ten sam, a końcówka się zmienia. Aby ściśle zdefiniować adresy przynależne do danej sieci wymyślono pojęcie maski podsieci. Umawiamy się, że określona ilość pierwszych bitów adresu IP ma być taka sama, a pozostałe bity w sieci mogą się różnić. W ten sposób powstaje proste kryterium, pozwalające komputerom na określenie swojego położenia na podstawie adresu. Maskę sieci zapisuje się podobnie jak adres IP. Dla przykładu

255.255.255.0

co binarne daje:

11111111 11111111 11111111 00000000

255 255 255 0

Jeżeli komputery oprócz komunikacji w swojej sieci lokalnej mają łączyć się z internetem, to maska sieciowa staje się bardzo ważna. Gdy urządzenie sieciowe stwierdzi, że adres docelowy, z którym chce wymieniać dane nie pasuje do maski, to próbuje się z nim łączyć przez bramę sieciową. Porównywanie opiera się na zerowaniu w adresie bitów równych zeru w masce (logiczny AND bitów maski i adresu IP). Jeżeli komputer 3 łączy się komputerem 2, to wykonuje następujące operacje:

Maska 11111111 11111111 11111111 00000000

255 255 255 0

Mój IP 11000000 10101000 00000001 00000011

192 168 1 3

Wynik a 11000000 10101000 00000001 00000000

192 168 1 0

Maska 11111111 11111111 11111111 00000000

255 255 255 0

Docelowy IP 11000000 10101000 00000001 00000010

192 168 1 2

Wynik b 11000000 10101000 00000001 00000000

192 168 1 0

Wynik a oraz Wynik b są równe wobec czego komputer 3 wie, że komputer 2 jest w tej samej podsieci. Jeżeli komputer 3 będzie chciał pobrać stronę z serwera w Internecie to operacja porównania będzie następująca:

Maska 11111111 11111111 11111111 00000000

255 255 255 0

Mój IP 11000000 10101000 00000001 00000011

192 168 1 3

Wynik a 11000000 10101000 00000001 00000000

192 168 1 0

Maska 11111111 11111111 11111111 00000000

255 255 255 0

Internet IP 11001111 10001110 10000011 11101100

207 142 131 236

Wynik b 11001111 10001110 10000011 00000000

207 142 131 0

Jak widać wynik a, oraz wynik b są różne. W takiej sytuacji komputer 1 będzie się próbował połączyć z adresem w Internecie przez skonfigurowaną w nim bramę sieciową.