Programowanie aplikacyjne
  • Kody kursów: ETD003085W, ETD003085P
  • Forma zajęć: 30h wykład + 30h projekt
  • Opiekun kursu: dr inż. Krzysztof Urbański

Cel kursu

...to opanowanie umiejętności zaprojektowania i wykonania prostych aplikacji użytkowych na potrzeby inżyniera kierunku elektronika i telekomunikacja. Nie jest to zaawansowany kurs języków C++, w Javie czy w C#. Nie jest koniecznie wymagane zgłębienie wszystkich tajników programowania zorientowanego obiektowo (OOP) - temu będzie poświęcony inny kurs na specjalności EC. Po zaliczeniu kursu PA powinniście natomiast wiedzieć, czym się różnią od strony programisty aplikacje okienkowe sterowane zdarzeniami od aplikacji konsolowych, jak w praktyce użyć wielowątkowości, komunikacji sieciowej, wymiany danych z układami peryferyjnymi, składowania danych w SQL oraz XML. 

Tematyka kursu

Większość materiału dotyczy C#/.NET, ale pierwsza część kursu (3 wykłady) jest poświęcona podsystemowi Win32/WinAPI i używany jest wtedy język C. Dlaczego tak jest, wyjaśnię na pierwszym wykładzie. Docelowe platformy to zarówno komputery stacjonarne, jak i urządzenia mobilne. Na tych zajęciach nie wchodzi w grę użycie języków Python, JavaScript, PHP - od tego macie inne kursy.
Dla zaawansowanych jest możliwość realizacji projektu z dodatkiem prawdziwych urządzeń (mikrokontrolery z peryferiami, np. iMX53, RPi, Arduino). Szczegóły należy uzgodnić indywidualnie z prowadzącymi zajęcia projektowe.
Materiał kursu postarałem się zorganizować w taki sposób, abyście nauczyli się korzystać z poziomu waszych własnych aplikacji z baz danych, programowania sieciowego, wielowątkowości oraz technologii webowych.
Specyficzne dla kierunku elektronika i telekomunikacja zagadnienia obejmują programowanie komunikacji z zewnętrznymi układami elektronicznymi (mikrokontrolery z interfejsem Ethernet, UART, modemy GSM/GPRS/Bluetooth).

Literatura

Na dobry początek warto zapoznać się z książkami Petzolda (C/C++/C#) - ich lista jest tutaj, w tym bezpłatnie dostępne .NET Zero Book czy Programming Windows Phone 7
Przedatną wiedzę znajdziecie też w starym, ale wciąż jarym Od Zera do Gier Kodera

Literatura podstawowa
  1. Schildt, Herbert, Java: kompendium programisty, Helion, 2012
  2. Friesen, Geoff, Java: przygotowanie do programowania na platformę Android, Helion, 2012
  3. Petzold, Charles, Programming Microsoft Windows with C#, Microsoft Press, 2001
  4. Kernighan, Brian W., Lekcja programowania : najlepsze praktyki, Helion, 2011
  5. Rasheed, Faraz, Programmer-s Heaven C# School Book, 2012 [PDF]
  6. Lis, Marcin, C#: praktyczny kurs, Helion, 2012

Literatura uzupełniająca
  1. Komatineni, Satya, Android 3: tworzenie aplikacji, Helion, 2012
  2. Michalska, Katarzyna, Application programming - Java and XML technologies, PRINTPAP, 2011
  3. Karwin, Bill., Antywzorce języka SQL : jak uniknąć pułapek podczas programowania baz danych, Helion, 2012
  4. Domka, Przemysław, Programowanie strukturalne i obiektowe, WSiP, 2010

Projekt

Ta forma zajęć zakłada - w odróżnieniu od laboratorium - więcej swobody i samodzielności dla studentów. Obecność na wszystkich zajęciach nie jest obowiązkowa, ale zdecydowanie lepiej będzie, kiedy przynajmniej na początku semestru pojawicie się na zajęciach co tydzień. Pod koniec semestru nadrobienie zaległości będzie bardzo trudne, szczególnie kiedy dojdzie do tego materiał całego wykładu.
Prowadzący na pierwszych zajęciach organizacyjnych przedstawią konkretne wymagania i kryteria zaliczenia. Zawsze sprowadza się to do realizacji przez was projektów w formie działających aplikacji, różna może być jednak strona organizacyjna i założenia funkcjonalne.
Typowo jest to praktyczna realizacja 2 niezbyt skomplikowanych programów: aplikacji okienkowej lub konsolowej w C/C++ oraz okienkowej C#/.NET lub Java/Android. Wszelkie własne pomysły są mile widziane i doceniane, oczywiście w granicach rozsądku i zgodności z tematyką kursu.
Może to być przykładowo: 
- konsolowa aplikacja C++ (Linux, Windows) będąca wielowątkowym serwerem TCP lub UDP
- okienkowa aplikacja C# + demon TCP w C#/C++
- okienkowa aplikacja C# + komunikacja z MCU przez port szeregowy
- aplikacja konsolowa C/C++ (daemon) na RPi odbierający datagramy UDP z czujników LAN/WiFi i zapisujący w bazie SQL. Aplikacja webowa/okienkowa pobierająca dane z bazy.
- apka mobilna sterująca urządzeniami domowymi (dioda RGB, przekaźniki, ...)
- itp.
Projekt rozpoczyna się od realizacji podstawowego zadania (np. aplikacji w C#), kolejne etapy projektu polegają na dodaniu do tej aplikacji wybranych funkcjonalności (XML, SQL, TCP, wątki, ...). 
Możliwych kombinacji jest sporo, obejmują także praktyczną komunikację z zewnętrznymi urządzeniami takimi jak port szeregowy czy mikrokontroler z interfejsem Ethernet. Ta część 'praktyczna' zazębia się z drugim kursem wybieralnym poświęconym programowaniu niskopoziomowemu który w tym semestrze nie został uruchomiony, ale część z was miała już do czynienia z mikrokontrolerami wcześniej.

Możliwa jest realizacja większych projektów w grupach 2-osobowych, nie należy jednak przesadzać z sępieniem. Zwykle bardziej opłaca się samodzielnie wykonać prosty projekt, niż pasożytować na kimś zaawansowanym i próbować ogarnąć skomplikowany kod napisany przez nerda.

Mile widziane jest posłużenie się systemem kontroli wersji, np. GitHub.

Przykładowe tematy projektów

  1. Cyfrowy oscyloskop (dane pozyskiwane przez port szeregowy albo Ethernet/UDP). Sterowanie pracą urządzenia, odczytywanie i archiwizacja danych.
  2. Karta analogowego i cyfrowego wejścia/wyjścia (analizator stanów logicznych). Programowanie, archwizacja danych.
  3. Przetwarzanie i graficzna prezentacja danych pomiarowych (aplikacja okienkowa)
  4. Analiza i graficzna prezentacja statystyki odwiedzin strony (na podstawie pliku access_log)
  5. Program rysujący funkcję dwóch zmiennych na podstawie zapisu symbolicznego
  6. Dla zaawansowanych: Przetwarzanie obrazów, analiza ruchu obiektów, rozpoznawanie twarzy, wykrywanie obiektów itp. 
  7. Autoryzacja. Skrypt CGI realizujący bezpieczną wymianę danych. Algorytmy RSA / SHA / SHS / DES.
  8. Zdalne sterowanie elementami wykonawczymi (przekaźniki, przetworniki AC/CA) za pośrednictwem aplikacji okienkowej
  9. Symulator silnika krokowego (aplikacja graficzna)
  10. Gra logiczna lub zręcznościowa
  11. „Własna” przeglądarka WWW, która obsługuje wybrany serwis (np. notowania giełdowe, kursy walut, stan zapisów w Edukacja.CL, listy pytań na kolokwium z Programowania aplikacyjnego…)
  12. Baza danych (tym razem prawdziwa!) z odwołaniem do serwera SQL
  13. Zdalne sterowanie aplikacją na komputerze domowym (z telefonu, z innego komputera)

Lista zagadnień

Nie wszystkie poniżej wymienione zagadnienia będą omawiane na wykładzie. Zależy to od poziomu zaawansowania grupy i wybranych przez was tematów projektów.
  • graficzny interfejs użytkownika: WinAPI i programowanie sterowane zdarzeniami - zasada działania
  • język C# jako nowoczesny język obiektowy. Organizacja projektu. Definiowanie własnych klas
  • podstawowe aplikacje okienkowe w C#: użycie standardowych kontrolek
  • język C# w programowaniu GUI. Praktyczne użycie GDI+
  • pozyskiwanie danych z otoczenia i ich przetwarzanie: pliki, zdarzenia klawiatury, myszy i interfejsu HID
  • składowanie danych - programowanie podstawowych baz danych SQL (ADO.NET, PGSQL)
  • język XML jako uniwersalny sposób przechowywania i przekazywania danych
  • C# - kontrolki WebBrowser i użycie i strony HTML jako interfejsu w aplikacjach
  • C# - wielowątkowość a platforma .NET
  • programowanie portu szeregowego i praktyczne użycie wielowątkowości
  • przenośność danych między systemami o różych architekturach, serializacja
  • komunikacja z innymi aplikacjami oraz urządzeniami z użyciem Ethernet/TCP/IP
  • umiejętność implementacji podstawowych usług sieciowych - oprogramowanie klienta i serwera protokołów TCP, UDP, HTTP (i wielowątkowość)
  • bezpieczeństwo i kontrola spójności danych z użyciem mechanizmów kryptograficznych (CRC, MD5)
  • wizualizacja danych 2D i 3D - skalowanie, maski kolorów, podstawy OpenGL
  • silniki 3D w praktyce: Ogre3D, Irrlicht oraz Unreal

Lista pytań / zagadnień do kolokwium

  • Standardowa aplikacja okienkowa WinAPI: rejestrowanie klasy okna, tworzenie okna, funkcja obsługi komunikatów okienkowych, pętla komunikatów. Jaką rolę pełnią wymienione elementy składowe?
  • Czym są komunikaty okienkowe w programowaniu WinAPI? ...i na czym polega programowanie sterowane zdarzeniami?
  • Co oznacza słowo CALLBACK w prototypie funkcji?
  • Wielowątkowość: jak w WinAPI utworzyć i uruchomić wątek?
  • Co to w ogóle jest wątek? Czym z punktu widzenia języka C jest wątek?
  • Jak realizuje się sekcje krytyczne w winAPI? ...patrz też: wybrany sposób realizacji sekcji krytycznej w C# lub Javie
  • Do czego służy słowo kluczowe 'volatile' ?
  • Techniczne aspekty przenośności danych bitowych w języku C. Omówione były 3 główne źródła tych problemów: architektura procesora (8/16/32/64-bitowa), kolejność kodowania bajtów lub bitów (endianness), kodowanie pól struktur/klas w pamięci (structure member alignment). Jak te problemy rozwiązywać lub ich unikać? [patrz też: serializacja]
  • Co to jest biblioteka DLL? Kiedy warto używać tego mechanizmu?
  • Podobieństa i różnice w użyciu DLL: biblioteki używane jako 'run-time' oraz 'load-time'
  • Jak odwoływać się do funkcji DLL z poziomu aplikacji C#? Podaj 1 przykład (wskazówka: na wykładzie pojawił się sposób polegający na dodaniu specjalnych atrybutów przez nagłówkiem metody).
  • Na czym polega 'obfuskacja' aplikacji napisanej w Javie lub C#? Kiedy stosujemy i w jakim celu?
  • Cechy języka XML (jak jest zbudowany dokument, jakie warunki musi spełniać, aby był formalnie poprawny?)
  • Zapisz przykładowy dokument XML na podstawie dostarczonych danych (np. struktura Student zawiera pola Imie o wartości 'Jasiu' oraz Wiek o wartości 20. Zapisz to w języku XML. Rozwiązania: lepsze - 3 znaczniki, Imie oraz Wiek zagnieżdżone w Student. Gorszy pomysł: znacznik Student z atrybutami Wiek oraz Imie).
  • Zastosowania XML do przechowywania, przesyłania danych: wady i zalety w porównaniu z innymi sposobami (np. w porównaniu z plikami tekstowymi lub binarnymi których używaliście na kursie Informatyka albo w porównaniu z danymi zapisanymi w bazach SQL. Wskazówka: istnienie standardu opisującego zasady tworzenia takich dokumentów, przenośność danych między różnymi systemami, skalowalność, zgodność wstecz, skomplikowany parser lub dostępność gotowych bibliotek realizujących to zadanie).
  • Zastosowania SQL w programowaniu aplikacyjnym. Kiedy warto stosować, dlaczego bazy danych są tak popularne - zalety tych rozwiązań. W jakich rodzajach aplikacji NIE warto stosować SQL? Warto pamietać, że SQL to nie tylko zdalne serwery bazodanowe, ale także np. bliblioteki SQLite, które można wkompilować we własną aplikację.
  • Podstawowe cechy języków C# oraz Java w porównaniu do C++ (np. typy danych, przenośność kodu, mechanizmy wspierające OOP - programowanie zorientowane obiektowo, zarządzanie pamięcią).
  • Czym jest 'garbage collector' w Java / C#?
  • Na czym polega polimorfizm w programowaniu obiektowym? Można opisać i/lub zademonstrować na prostym przykładzie, który pojawił się na wykładach.
  • W jaki sposób jest realizowany polimorfizm w C++, a jak w Javie lub C#? (przede wszystkim pojawi się dziedziczenie, a dodatkowo w C++ należy pamiętać o magicznym słowie kluczowym virtual)
  • Czym jest JVM (lub platforma .NET)? Tutaj bardzo ogólnie, bez wnikania w szczegóły techniczne związane z implementacją. Rola obu tych platform jest podobna, wystarczy poczytać o jednej z nich. Chodzi o uświadomienie sobie tego, że oprócz systemu operacyjnego i bibliotek programistycznych (takich jak np. libc w języku C) może istnieć dodatkowa warstwa (mechanizm, rozwiązanie...) pomiędzy aplikacją a sprzętem, na którym została ona uruchomiona. 
  • Do czego służą i czym są metody 'native' w Javie?
  • W jaki sposób zrealizować sekcję krytyczną (zapewnić wzajemne wykluczanie) w wielowątkowej aplikacji C#? a w aplikacji Java? - w obu tych językach wystarczy użyć konkretnego słowa kluczowego (synchronized albo lock), w odróżnieniu od C/C++ wsparcie dla wzajemnego wykluczania jest oferowane przez sam język programowania.
  • Wielowątkowość a kontrolki/okno w aplikacji C#: zastosowanie 'delegate' (delegatów) - co to w ogóle jest delegat i co by się mogło wydarzyć, gdyby z 'obcego' wątku bezpośrednio modyfikować zawartość kontrolek, np. list rozwijanych czy pól tekstowych.
  • Architektura (model) klient-serwer w programowaniu - skąd wynika ta asymetria (tzn. jedna z aplikacji jest umownie nazywana klientem, druga serwerem) - najbardziej oczywista przyczyna to względy historyczne i sama zasada działania protokołu TCP, który jest najczęściej stosowany do transportu danych. Na marginesie: dzisiaj coraz popularniejsze (i modne) są konkurencyjne modele: peer-to-peer oraz cloud computing, jednak wykracza to poza zakres materiału wykładowego. Warto jednak wiedzieć, jakie są rozwiązania konkurencyjne - łatwiejsze może być określenie na tej podstawie cech charakterystycznych modelu klient-serwer.
  • Wzorce projektowe (podstawy: klasyfikacja, wymienić i umieć opisać zasadę działania kilku popularnych).
  • Dalvik/ANT: co to takiego? Co oznacza API Level w Androidzie? Do czego służy SDK, a do czego NDK?