Eksperyment 001

Bazy danych
W innej części tego serwisu przedstawiłem w zarysie co to są bazy danych. Stwierdziłem tam również że współcześnie powszechnie są w użyciu interentowe bazy danych z którymi można się komunikować przez internet znając ich interfejs API. Zanim przejdziesz do tego ćwiczenia polecam Ci zapoznanie się z tymi informacjami - znajdziesz je tutaj.

Środowisko eksperymentu
Wyobraź sobie, że masz 6 urządzeń w różnych miejscach świata, które są sprzężone z czujnikami temperatury. Każde urządzenie jest połączone z czterema takimi czujnikami. Zmierzone wartości temperatur są zapisywane do bazy danych. Ta baza zainstalowana jest na serwerze znajdującym się gdzieś w tak zwanej chmurze. Na serwerze jest zestaw danych zapisanych w jednej tabeli, takiej jak na rysunku poniżej. Serwer jest wyposażony w odpowiednią aplikację pełniącą rolę systemu zarządzania bazą danych DBSM.

database

Jak widzisz baza danych zawiera tabelę z sześcioma rekordami (0 - 5). Każdy rekord bazy danych (wiersz tabeli) składa się z 7 pól (kolumny tabeli 0 - 6). Są tam pola do przechwywania danych liczbowych (ID, Temp1, Temp2, Temp3, Temp4) i danych tekstowych (Pass, Localisation). Pole Pass jest zadedykowane do przechowywania hasła.

Do danych jest dostęp przez Internet, bowiem system DBSM ma opracowany do tego celu odpowiedni interfejs API (część oprogramowania serwerowego), który jest upubliczniony dla uprawnionych użytkowników tego systemu. Jesteśmy użytkownikami, którzy mają tylko prawa do odczytu danych. Jak zapisywać informacje do bazy danych nie wiemy, to jest normalnie spotykana sytuacja.
Podano nam informację, że Web API tej bazy umożliwia klientom HTTP wykonywanie zapytań dotyczących odczytu danych z tabeli za pomocą dwu funkcji. Oto one.

1.

http://db.noerrors.pl/Ex001/read.php?id=x&pass=y
gdzie: id - numer identyfikacyjny rekordu, pass - hasło do danego rekordu.
Funkcja zwraca dane z pięciu pól rekordu, od 2 do 6.

2.
http://db.noerrors.pl/Ex001/readf.php?id=x&pass=y&field=z
gdzie: id - numer identyfikacyjny rekordu, pass - hasło, field - nr pola (2 - 6).
Funkcja zwraca dane z jednego wskazanego w zapytaniu pola rekordu, od 2 do 6.


Zadanie do wykonania
   Odczytaj wszystkie dane z tabeli.



Rozwiązanie zadania

Z polecenia wywołania pierwszej funkcji API, przykładowo:

http://db.noerrors.pl/Ex001/read.php?id=101&pass=data1

możemy odczytać, że żadanie obsługi ma być wysłane z użyciem protokołu internetowego HTTP i ma być skierowane do hosta o nazwie domenowej noerrors.pl.
Czyli mamy następującą sytuację. My posługując się aplikacją typu klient zaimplementowaną na hoście (maszynie) też tego typu powinniśmy wysłać protokołem HTTP żądanie do serwera, na którym jest zainstalowany interesujący nas system bazodanowy.

Web App

Aby taką operację zrealizować musimy posłużyć się adresem numerycznym IP, a nie adresem domenowym DNS, jakim jest noerrors.pl.

Zatem trzeba wysłać zapytanie do odpowiedniego serwera DNS. Ten serwer odeśle nam numer IP odpowiadający adresowi IP i wtedy będziemy mogli właściwie skierować nasze żądanie odczytu danych. Reasumując, aplikacja klienta musi wykonać następujące operacje:
• wysłać do serwera DNS zapytania o IP.
• poczekać na odpowiedź serwera DNS określającą adres IP (przykładowo IP = 195.78.67.46).
• wysłać zapytanie do bazy danych.
Procedura może nam się teraz wydawać dość skomplikowana, ale wkrótce się wyjaśni, że to jest proste.
DNS server

Popatrzmy raz jeszcze na nasze wywołanie funkcji API:

http://db.noerrors.pl/Ex001/read.php?id=101&pass=data1

Zawarta jest w nim informacja dla serwera, że ma w swoich zasobach odnaleźć lokację określoną jako db. To jest jakiś folder na dysku serwera, nie znamy jego nazwy, ale serwer zna. W tym folderze znajduje się podfolder o nazwie Ex001, a w nim zasób read.php. W zasadzie nie musi to nas specjalnie interesować, ale wyjaśnię co to oznacza. W tym podfolderze jest po prostu plik read.php, który zawiera kod aplikacji napisanej w języku PHP. Może zastanawia Cię, skąd się ten plik tam znalazł? Otóż ja napisałem ten kod i tam go zapisałem, bowiem mam dostęp do tego serwera.

• • •

Przedstawiłem Ci już cały mechanizm dostępu do bazy danych. Ale zapewne myślisz już o tym jak to można praktycznie zrealizować. Czas zatem na praktyczne ćwiczenia.


Eksperyment 1

Zaczniemy od tego, że nie musisz pisać żadnej aplikacji. Możesz skorzytać z gotowego narzędzia jakie z pewnością masz. Myślę o Twojej przeglądarce internetowej. Ona wykona wszystkie operacje, które wyżej opisałem.
Wpisz tylko do jej paska adresowego następujący ciąg:

http://db.noerrors.pl/Ex001/read.php?id=101&pass=data1

Jeśli jesteś leniwy, to po prostu kliknij na powyższy link :)
Web browser

Przeglądarka zwróci się do serwera DNS, a następnie wyśle zapytanie do serwera bazodanowego i gdy przyjdzie z niego odpowiedź, to Ci ją wyświetli. Zobaczysz na ekranie zawartość sześciu pól rekordu 101, a więc lokalizację urządzenia sprzężonego z czterema czujnikami temperatury oraz wartości zmierzone przez te czujniki.
Tak długi opis mechanizmu działania, a taki prosty w realizacji :)
Odczytaj teraz pozostałe rekordy tej mini bazy danych (zmieniaj w pasku adresowym przeglądarki tylko argumenty funkcji, czyli wartości id i pass).


Eksperyment 2

Poprzedni eksperyment mógł wydać Ci się nieco za prosty. Możemy go teraz rozwinąć nieco. Jeśli używasz choć trochę języka HTML, to wiesz co to są tak zwane formularze. One są często stosowane na stronach internetowych w celu dania użytkownikowi możliwości wysyłania danych lub zapytań do serwerów. Jaka może to być aplikacja? Przygotowałem dwie wersje kodu:
Formularz 1 (wywołanie funkcji read(), czyli skryptu read.php)
Formularz 2 (wywołanie funkcji readf() czyli skryptu readf.php)
Kod każdej z tych aplikacji możecie sobie łatwo wyświetlić, bowiem większość przeglądarek internetowych ma opcję "Wyświetl źródło strony". Kod jest bardzo prosty, ale wymaga troszkę znajomości języka HTML.


Eksperyment 3

Możemy być w sytuacji gdy chcielibyśmy odczytać jakieś dane z internetowgo serwera bazodanowego i je odpowiednio przetworzyć. Wyobraźmy sobie, że dane w używanej tutaj tabeli bazy danych określają temperaturę w skali Fahrenheita, a my chcemy je wyświetlić w skali Celsjusza. Nie zadowolą nas wtedy rozwiązania pokazane w eksperymentach powyżej.
Potrzebna nam bardziej rozbudowana aplikacja, która na życzenie jej użytkownika pobierze dane z internetowej bazy danych i odpowiednio je przetworzy. Co wtedy zrobić?
Zależy jaki znasz język programowania. W większości języków wysokiego poziomu (C++, C#, Java, Python, itp.) są odpowiednie narzędzia do realizacji tego zadania. Ja w tym serwisie najczęściej używam języka JavaScript, który w połączeniu z kodem HTML daje całkiem duże możliwości tworzenia ciekawych aplikacji. Zakładam, że znasz nieco ten język programowania.
Zdecydowałem się na przykłady aplikacji napisanych w językach HTML i JavaScript.
Aplikacja 1,
Aplikacja 2.
W tych aplikacjach zastosowałem technikę AJAX (AJAX = Asynchronous JavaScript And XML). W tutorialu o tej technice dostępu do internetowych baz danych jest napisane: "AJAX to marzenie programisty". Ja napiszę inaczej: AJAX znakomicie ułatwia komunikację z internetowymi bazami danych.
Wyświetl i przeanalizuj kod aplikacji. Może stwórz jakąś własną aplikację, ciekawszą.



Następne eksperymenty

Proponuję Wam jak najwięcej poćwiczyć z obiema przestawionymi wyżej funkcjami API.

• • •

Jest w internecie bardzo wiele serwisów z upublicznionym API. Z wieloma z nich można eksperymentować za darmo. Ich twórcy podają dostępne funkcje oraz składnię jakiej trzeba używać w komunikacji. Nie zawsze to musi być taka składnia jaka była prezentowana wyżej.
Dlatego proponuję Wam poeksperymentować z jeszcze jedną bazą korzystając z jej API.
Wyobraźmy sobię bazę danych z jedną tabelą jak niżej.

Calendar

Jak widzicie, w tej wirtualnej tabeli mamy zawarte dane dotyczące wszystkich dni kalendarzowych od 1 stycznia 1930 roku do 31 grudnia 2050 roku. To jest ponad 44 tysiące rekordów. Dla każdego dnia (w każdym rekordzie) są pola określające: "Dzień tygodnia" (kolumna 2), "Nazwa dnia tygodnia" (kolumna3), "Który to dzień w danym roku" (kolumna 4) oraz "Który to tydzień w danym roku" (kolumna 5).
API do tej bazy danych to tylko jedna funkcja:

http://db.noerrors.pl/Ex001/Calendar.php?pass=x&m=y&d=y-m-d
gdzie:
pass - password ( student, albo studentka),
m - rodzaj zapytania (dopuszczalne wartości: 0 - 3),
y-m-d - data w formacie rok-miesiąc-dzień (przykładowo: 1930-01-01).
Zatem przykładowe zapytanie może mieć postać:

http://db.noerrors.pl/Ex001/Calendar.php?pass=student&m=0&d=2024-03-21

Mamy więc jedno hasło (student lub studentka) dające dostęp do wszystkich rekordów bazy. W zależności jaki wybierzemy tryb zapytania, to w odpowiedzi otrzymamy:
dla m = 0 - dzień tygodnia i nazwę dnia,
dla m = 1 - numer tygodnia w danym roku dla podanej daty,
dla m = 2 - numer dnia w danym roku dla podanej daty,
dla m = 3 - komplet danych w formacie JSON.
Format JSON jest bardzo często stosowany w wymianie danych i jest łatwo zrozumiały dla ludzi (JSON = JavaScript Object Notation).

Odczyt informacji z bazy danych jest następujący. Wysyłamy zapytanie do bazy danych. Oprogramowanie DBSM (Bazodanowy System Zarządzania) przeszukuje kolumnę 1 i gdy znajdzie rekord z datą odpowiadającą naszemu zapytaniu, to wygeneruję odpowiedź. W odpowiedzi będą zawate dane zapisane w odpowiednich polach intersującego nas rekordu.
Jak wysłać zapytania do takiej bazy? Możesz to zrobić dokładnie tak samo jak w poprzednich eksperymentach. Możesz wpisać zapytanie w pasku adresu przeglądarki.

Web browser

Możesz też opracować w języku HTML aplikację typu formularz, przykładowo jak ta tutaj.
Myślę, że dzięki tym ćwiczeniom będziesz swobodnie korzystał z interfejsów API różnych internetowych baz danych.

Uwaga dla znających język PHP
W języku PHP jest bardzo dobry zestaw funkcji operujących na dacie i czasie. Można więc łatwo zasymulować bazę danych identyczną jak przedstawiona wyżej. Nie ma jednak znaczenia czy baza z której odczytujecie dane jest symulacją czy rzeczywistą bazą danych, bowiem moim celem jest danie Wam okazji do wdrażania się w korzystanie z interfejsu API
.

★ ★ ★

Może czujesz niedosyt, bowiem mogłeś w proponowanych ćwiczeniach tylko odczytywać dane. Możesz mieć przecież pomysły na opracowanie aplikacji wymagających tak odczytu jak i zapisu danych. Jeśli chcesz poeksperymentować z bazą danych umożliwiającą również zapis danych, to polecam Ci moją stronę "Eksperyment 002".