Witaj w ekscytującym świecie programowania w systemie Linux!
Jeśli znasz już jakieś książki z tej dziedziny, to przygotuj się na następną radosną przygodę z Linuksem. Jeżeli jest to Twoje pierwsze spotkanie z książkami o programowaniu w tym systemie, to bardzo szybko przekonasz się, że dokonałeś właściwego wyboru.
Książka jest adresowana do zaawansowanych programistów w systemie Linux oraz tych, którzy chcą tworzyć programy działające w tym najbardziej ekscytującym systemie operacyjnym. Przedstawiony w niej materiał został starannie dobrany na podstawie znajomości zagadnień najczęściej spotykanych w zawodowej praktyce programistów. Obejmuje on praktyczne informacje o bibliotekach, metodologii, narzędziach i aplikacjach przeznaczonych dla programistów linuksowych.
Wszechstronność i możliwość wyboru dają każdemu szansę na znalezienie czegoś szczególnie interesującego. Wyczerpujące omówienie zagadnień zyska uznanie nawet zawodowych programistów studiujących tę książkę. Dołożyliśmy wszelkich starań, aby zachować równowagę między zakresem omawianych zagadnień a ich szczegółowością.
Niezależnie od tego, czy jesteś doświadczonym programistą linuksowym, czy też masz zamiar takim się stać — jest to książka dla Ciebie.
W książce przedstawiamy wiele narzędzi, bibliotek i technik programowania, które powinien znać każdy programista linuksowy, jak również bardziej zaawansowane zagadnienia, z którymi w systemie Linux spotka się programista zawodowy.
Skoncentrujemy się na praktyce — tam gdzie jest to konieczne, zamieszczamy przykłady wspomagające i objaśniające rozważania teoretyczne. Książka skupia się wokół przykładowej aplikacji, która będzie budowana stopniowo w kolejnych rozdziałach. Wprowadzając różne narzędzia, biblioteki i techniki programowania, będziemy tworzyć aplikację do obsługi wypożyczalni płyt DVD.
Wyróżniliśmy tu dwie kategorie rozdziałów: rozdziały tematyczne, w których omówione są zagadnienia ściśle związane z tematem przewodnim książki (czyli aplikacją do obsługi wypożyczalni płyt DVD), oraz rozdziały rozszerzające, w których przedstawiono szereg problemów interesujących zawodowych programistów. Celowo nie zachowaliśmy tu osobnej kolejności obydwu rodzajów rozdziałów, ale wstawiliśmy rozdziały rozszerzające pomiędzy rozdziały tematyczne, tworząc swoiste „przystanki”.
Rozróżnienie dwóch rodzajów rozdziałów nie oznacza, że zagadnienia poruszane w jednej grupie są ważniejsze niż zagadnienia omawiane w drugiej grupie rozdziałów. Rozdziały tematyczne różnią się także między sobą zakresem materiału opisującego temat przewodni. Każdy rozdział stanowi podręcznik zawierający wiele przykładów praktycznego zastosowania teorii. Czegóż więc należy się spodziewać?
Rozdział 1. rozpoczniemy od przeglądu zagadnień występujących podczas projektowania aplikacji. Następnie omówimy aplikację do obsługi wypożyczalni płyt DVD, która będzie kanwą rozdziałów tematycznych. Wyjaśnimy sposoby definiowania i formalizowania wymagań naszej aplikacji. Cel tego rozdziału zostanie osiągnięty po przekształceniu tych wymagań na API.[1]
Podczas pracy przy dowolnej aplikacji zawsze trzeba rejestrować zmiany dokonywane w kodzie. Można to czynić ręcznie, jeżeli pracujemy nad własnym projektem i gdy zakres projektu nie jest zbyt obszerny. Zarządzanie dużym projektem lub praca zespołowa wymagają jednak bardziej efektywnych narzędzi. W rozdziale 2. omówimy taki wydajny system kontroli kodu źródłowego o nazwie Concurrent Versions Systems (CVS). Pokażemy w nim sposób instalacji i użytkowania CVS oraz zbadamy jedną z największych zalet tego systemu: możliwość pracy sieciowej, obejmującej nawet działanie w Internecie.
Po podjęciu decyzji o wyborze relacyjnej bazy danych do obsługi wypożyczalni płyt DVD, w rozdziale 3. przedstawimy krótkie omówienie i porównanie baz mSQL, MySQL oraz PostgreSQL. Wybrawszy bazę PostgreSQL, pokażemy sposób jej instalacji i uruchomienia oraz omówimy jej podstawowe polecenia. Następnie zajmiemy się normalizacją relacyjnych baz danych i przedstawimy kilka poleceń do zarządzania danymi.
W rozdziale 3. pokażemy sposób dostępu do bazy PostgreSQL za pomocą narzędzia wiersza poleceń o nazwie psql, zaś w rozdziale 4. omówimy sposób dostępu do bazy z kodu w języku C, z zastosowaniem biblioteki libpq i wbudowanego języka SQL. Na zakończenie rozdziału utworzymy już podstawę bazy danych obsługującej wypożyczalnię płyt DVD.
Rozdział 5. jest pierwszym rozdziałem rozszerzającym. Wybraliśmy wprawdzie PostgreSQL jako bazę danych dla naszej aplikacji, ale istnieją inne, równie efektywne bazy, jak np. MySQL. Baza ta sprawdza się doskonale w wielu zastosowaniach. Omówimy więc tutaj instalację i konfigurację bazy MySQL oraz zarządzanie nią, a także sposób dostępu do przechowywanych w niej danych z poziomu kodu w języku C.
Podczas tworzenia aplikacji nie można się uchronić od błędów w kodzie. Rozdział 6. zawiera omówienie niektórych narzędzi i technik programowania stosowanych przy oczyszczaniu kodu z błędów. Efektywna sygnalizacja błędów bardzo pomaga przy ich usuwaniu. Opiszemy tu różne sposoby umieszczania deklaracji debuggera w kodzie programu, omówimy także zastosowanie zakotwiczeń. Następnie pokażemy sposób uzyskiwania informacji o wynikach śledzenia działań programu. Ostatnia część tego rozdziału jest poświęcona debuggerowi GNU (GDB) i opisuje niektóre jego polecenia.
Czasami wygodniej jest skorzystać z usług serwera LDAP niż z bazy danych. Następny rozdział rozszerzający opisuje więc różne rodzaje serwerów LDAP, koncentrując się na bezpłatnym pakiecie o nazwie OpenLDAP. Omówimy instalację, konfigurację i uruchamianie tego serwera oraz objaśnimy strukturę przechowywanych w nim danych. Oprócz tego pokażemy sposób dostępu do serwera OpenLDAP z poziomu własnego kodu, w tym manipulację danymi i ich wyszukiwanie.
W rozdziale 8. omówimy zestaw wydajnych bibliotek używanych do tworzenia GUI, a mianowicie GTK+ i GNOME. Na początku zajmiemy się biblioteką glib, dzięki której możliwe jest zarządzanie danymi z innych bibliotek GTK+ i GNOME. Pokażemy również zastosowanie GTK+ i GNOME do budowy prostego, lecz zarazem funkcjonalnego graficznego interfejsu programu. Zamieścimy tu także strukturę źródłową pakietu GNOME i opiszemy zarządzanie sesją.
Na podstawie informacji o pakietach GTK+/GNOME możemy w następnym rozdziale tematycznym zająć się budową interfejsu graficznego dla aplikacji obsługującej wypożyczalnię płyt DVD. Na początku omówimy pakiet do budowy interfejsów o nazwie Glade, a następnie podamy szczegółowy opis naszego własnego interfejsu graficznego zbudowanego za pomocą tego pakietu.
Następnie nadejdzie pora na kolejny „przystanek”, na którym zajmiemy się programami Flex i Bison. Flex służy do tworzenia programów do analizy leksykalnej, czyli skanerów, a Bison jest wykorzystywany do budowy analizatorów składni. W rozdziale 10. omówimy zastosowania tych nadzwyczaj wydajnych programów narzędziowych.
Kolejny rozdział jest poświęcony różnym metodom i narzędziom używanym do testowania tworzonej aplikacji. Opiszemy w nim testy wykorzystania pamięci i testy wydajności oraz instalację i sposób użycia biblioteki mpatrol.
W rozdziale 12. należącym do kategorii rozdziałów rozszerzających zajmiemy się programowaniem zabezpieczeń w Linuksie. Omówimy w nim bezpieczeństwo systemu plików, potwierdzanie tożsamości użytkownika, tzw. Pluggable Authentication Modules (PAM), zagadnienia kryptograficzne i bezpieczeństwo oprogramowania sieciowego. Opiszemy również pewne zagadnienia związane z bezpieczeństwem w językach C/C++, Perl, Python i PHP.
GTK+ i GNOME nie są jedynymi pakietami, które można wykorzystać w Linuksie do budowy interfejsu graficznego. Równie wydajne i popularne są biblioteki Qt i KDE wykorzystujące język C++. W rozdziale 13. zajmiemy się ich instalacją i zastosowaniami.
Na następnym „przystanku” omawiany będzie Python. Jest to popularny, interpretowany i obiektowy język wysokiego poziomu. Opiszemy tu instalację i różne tryby działania tego pakietu, a następnie używane w nim typy danych i składnię poleceń.
W rozdziale 16. opiszemy jeden z najbardziej popularnych języków skryptowych używanych na serwerach, czyli PHP. Pokażemy sposób instalacji i konfiguracji PHP oraz składnię jego poleceń. Następnie omówimy sposób wykorzystania PHP do zbudowania interfejsu dla naszej aplikacji obsługującej wypożyczalnię płyt DVD.
W następnym rozdziale, wykorzystując informacje o języku Python podane w rozdziale 15., przedstawimy sposób jego rozszerzenia za pomocą C++. Posłużymy się pakietem SWIG (Simplified Interface Wrapper Generator) oraz API języka Python.
W rozdziale 18. najpierw pokażemy sposób komunikowania się aplikacji za pomocą gniazd sieciowych, a następnie zajmiemy się głównym problemem, czyli zdalnym wywoływaniem procedur (Remote Procedure Calls, w skrócie RPC). Pokażemy zastosowanie RPC do tworzenia aplikacji obsługującej nowy oddział wypożyczalni płyt DVD, korzystający z jednej scentralizowanej bazy danych.
W rozdziale 19. zajmiemy się oprogramowaniem obsługującym multimedia. Jest to jedyna dziedzina, w której Linux zostaje w tyle za innymi systemami operacyjnymi, głównie z powodu braku sterowników do urządzeń. Przedstawimy tu sposób obsługi urządzeń dźwiękowych oraz skrótowo omówimy linuksowe programy do obsługi filmów i animowanej grafiki.
Użycie RPC bywa efektywne, ale do budowy rozproszonych aplikacji obiektowych znacznie bardziej nadaje się CORBA. Rozdział 20. stanowi wstęp do opisu tego modelu. Zapoznamy w nim czytelnika z różnymi składnikami i warstwami modelu CORBA, pokazując ich wzajemne oddziaływania.
W następnym rozdziale, wykorzystując wcześniej podane informacje o modelu CORBA, posłużymy się pakietem ORBit z GNOME do budowy naszej przewodniej aplikacji. Omówimy także usługi CORBAServices.
W rozdziale 22. przerwiemy na chwilę tworzenie naszej aplikacji do obsługi wypożyczalni i opiszemy systemy bezdyskowe oraz sposób ich wykorzystania w Linuksie.
W rozdziale 23. przedstawimy jedno z najciekawszych współczesnych zagadnień, czyli język XML. Wprowadzenie do struktury i składni dokumentów XML podamy na przykładzie katalogu naszej wypożyczalni DVD. Język ten jest idealnym rozwiązaniem dla importu katalogów do naszej bazy płyt DVD. Omówimy podstawy języka XML i wyjaśniamy, czym jest DTD, a następnie pokażemy sposób przetwarzania dokumentów XML za pomocą pakietu SAX (Simple API for XML).
W następnym przerywniku zapoznamy Czytelnika z architekturą i konfiguracją oprogramowania dla klastrów o nazwie Beowulf. Omówimy także tworzenie programów dla klastrów Beowulf z wykorzystaniem dwóch popularnych bibliotek przekazujących komunikaty: Message Passing Interface (MPI) i Parallel Virtual Machine (PVM).
Odpowiednia dokumentacja jest bardzo ważną częścią projektu oprogramowania. W rozdziale 25. objaśnimy różne rodzaje dokumentacji wymagane dla różnych kategorii użytkowników. Opiszemy w nim wiele formatów dokumentacji: strony podręcznika systemowego (man), HTML, XML, TeX, DocBook, czysty tekst (POD, czyli Plain Old Document) i PDF. Rozdział ten zawiera również informację na temat tzw. „programowania literackiego”.
Rozdział 26. jest poświęcony ważnemu zagadnieniu w programach tworzących jądro systemu, a mianowicie sterownikom urządzeń. Wyjaśnimy w nim również sposób obsługi magistrali PCI przez jądro Linuksa.
Przygotowanie aplikacji do rozpowszechnienia interesuje każdego twórcę programu. W rozdziale 27. zajmiemy się więc programem do zarządzania pakietami o nazwie RPM (RedHat Package Manager), opisując instalowanie, aktualizację i odinstalowywanie pakietów RPM. Na przykładzie naszej aplikacji przewodniej pokażemy także sposób budowy pakietu. Omówimy zastosowania poleceń configure, autoconf i automake do tworzenia standardowego katalogu źródłowej dystrybucji oraz sposób tworzenia łat.
Na końcu naszej wyprawy do świata programowania w systemie Linux znajduje się tworzenie różnych wersji językowych. W rozdziale 28. przedstawimy różne modele, techniki i zagadnienia związane z przystosowaniem aplikacji do pracy w różnych środowiskach językowych.
Czytelnik musi mieć dostęp do komputera z systemem Linux i zestawem pakietów oprogramowania opisywanych w różnych rozdziałach naszej książki. Są to między innymi pakiety GTK+, GNOME, Glade, Qt, KDE, PostgreSQL, MySQL, LDAP, Flex, Bison, Python, SWIG, ORBit-Python, MPICH i wiele innych. Rzadko kiedy wszystkie te pakiety są dołączone do spotykanych powszechnie dystrybucji Linuksa, a więc trzeba je pobrać z sieci we własnym zakresie. Informacje o adresach serwerów udostępniających te programy podajemy w stosownych miejscach książki.
Chcąc dysponować pełnym kodem źródłowym opisywanym w poszczególnych rozdziałach książki bez potrzeby wpisywania tego kodu, czytelnik musi także mieć dostęp do Internetu.
Zakładamy również, że czytelnik potrafi programować w języku C i zna system Linux. Niektóre rozdziały wymagają pewnej znajomości języka C++.
Przykładowe programy i fragmenty kodu naszej aplikacji najlepiej ilustrujące omawiane zagadnienia zamieszczamy w treści książki. Pełny kod źródłowy można uzyskać pod adresem:
ftp://ftp.helion.pl/przyklady/zaprli.zip
Zalecamy pobranie tego kodu w celu zaoszczędzenia czasu traconego na jego ręczne wpisywanie (prawie cały kod zawarty jest w książce).
Chcąc ułatwić czytanie i śledzenie poszczególnych zagadnień, zastosowaliśmy w treści książki następujące oznaczenia:
W taki sposób oznaczamy dodatkowe informacje odbiegające od tematu głównego.
Dla wyróżnienia niektórych nazw używamy różnych krojów czcionki:
q Nazwy plików oraz słowa wpisywane w wierszu poleceń, w kodzie źródłowym lub plikach konfiguracyjnych są wyróżniane następująco: struct pci_driver, main.c lub rpcinfo -p localhost.
q Adresy sieciowe zapisywane są jako: www.gnome.org.
Wpisywane przez użytkownika polecenia oznaczone są następująco:
$ gcc -I/usr/include/xml sax1.c -lxml -lz -o sax1
Jeżeli polecenie wpisuje root, to znak zachęty zmieni się na #:
# make install
Jeżeli podajemy zawartość plików, to używamy następującej konwencji oznaczeń:
Wiersze dotyczące bezpośrednio sąsiedniego tekstu książki mają szare tło.
Wiersze, które nie zawierają niczego nowego lub wiersze zawierające wcześniej omówioną treść, nie mają tła.
[1] API jest skrótem od Application Programming Interface i oznacza interfejs aplikacji dla programisty. W dalszych częściach książki skrót ten będzie konsekwentnie stosowany bez rozwijania, podobnie jak inne skróty tego rodzaju, np. GUI oznaczający graficzny interfejs programu (przypis tłumacza).
SacrA