Tematyka prac magisterskich
Jestem otwarty na wszelkie pomysły pochodzące od magistrantów, a w szczególności dotyczące tematów związanych z:
- bazami danych,
- Graficznymi Interfejsami Użytkownika (ang. GUI),
- wizualnym programowaniem,
- wizualną analizą danych,
- narzędziami CASE,
- Zintegrowanymi Środowiskami Programistycznymi (ang. IDE),
- systemami rozproszonymi,
- wyszukiwaniem danych (np. systemy podobne do Google'a),
- portalami/usługami internetowymi,
- aplikacjami mobilnymi (Android, iOS, ...),
- zastosowaniami Web API,
- technologie chmurowe (np. Azure),
- systemy wykorzystujące mikroserwisy,
- rozwiązaniami ze świata IoT, mikrokontrolerów (np. Arduino) oraz Raspberry Pi.
Ogólne informacje dotyczące seminarium magisterskiego.
Niektóre prace magisterskie wykonane pod moim kierunkiem.
Poniżej znajdują się przykładowe tematy prac magisterskich. Ze względu na ich "hasłowość", należy je traktować jako inspirację dla własnych pomysłów, a nie gotowe rozwiązania.
- Wrappery do różnego rodzaju źródeł danych (relacyjnych, XML, pełnotekstowych, itp.) dla Mavigatora. Przedmotem pracy jest stworzenie wrappera, który odczyta dane w natywnym formacie (np. relacyjnym) i "prześle" je do Mavigatora w formacie rozumianym przez tę przeglądarkę.
- Narzędzie CASE ułatwiające projektowanie struktury danych w bazie danych czy repozytorium (np. Virtual Schemas obsługiwanych przez Mavigatora). Przedmiotem pracy jest stworzenie aplikacji umożliwiającej graficzne zaprojektowanie struktury bazy danych (klasy, asocjacje, itp.), a następnie wygenerowanie odpowiedniego pliku konfiguracyjnego (np. XML).
- Narzędzia CASE ułatwiające tworzenie oprogramowania.
- Aplikacje do graficznego projektowania struktury (i zachowania) systemów komputerowych, np. rysujemy diagram klas (diagram dynamiczny) i generujemy odpowiadający mu kod.
- Aplikacje generujące diagramy na podstawie istniejącego kodu źródłowego (lub pośredniego dla np. MS .NET).
- Systemy "heavy-duty". Przedmiotem pracy jest stworzenie dedykowanego systemu (dla konkretnych zastosowań, np. fakturującego), który umożliwia pracę pod bardzo dużym obciążeniem rzędu setek tysięcy (milionów) jednostek danych i wielu użytkowników. W celu uzyskania takiego efektu, dopuszczalne jest poświęcenie "generyczności" rozwiązania, na rzecz wąskiej specjalizacji.
- Tematy związane z projektami eGov-Bus (wirtualne repozytorium) oraz VIDE ("graficzny język programowania" związany z MDA). Zalecana bardzo dobra znajomość języka angielskiego.
- Kontekstowy system wspomagający dla zintegrowanego środowiska programistycznego ODRA-IDE. Praca polega na dodaniu, do istniejącego edytora, funkcjonalności znanej z Eclipse, MS Visual Studio, a polegającej na kontekstowym "podpowiadaniu" przez edytor, np. napisanie kropki po nazwie klasy powoduje wyświetlenie jej składników. Zalecane rozwiązanie należy stworzyć jako plugin dla edytora jEdit obsługującego SBQL. Pomocą mogą być podobne pluginy działające z kodem Java.
- Dodatek (ang. plugin) dla środowiska Eclipse. Przedmiotem pracy jest wykonanie dodatku modyfikującego lub rozszerzającego system Eclipse. W efekcie Eclipse byłoby w stanie pracować np. z jakimś nowym językiem programowania.
- Prototyp aplikacji do zarządzania Media Center PC (lub HTPC) dla systemu Linux. W pracy należy skoncentrować się na opracowaniu silnika do tworzenia Graficznego Interfejsu Użytkownika (ang. GUI) wykorzystującego istniejące komponenty do odtwarzania multimediów (np MPlayer). Zaproponowane rozwiązanie powinno obsługiwać plugin'y umożliwiające dodawanie nowej funkcjonalności oraz wykorzystywanie nowych efektów graficznych (do przejścia pomiędzy poszczególnymi ekranami). Ze względu na konieczność zachowania minimalnych wymagań sprzętowych zaleca się zastosowanie języka C++ oraz biblioteki SDL. Przykładowe systemy tego typu to: Kodi (XBMC), Media Portal.
- Silnik do wyświetlania na pulpicie komputera PC widget'ów działający w oparciu o modyfikowalne plugin'y. Prototyp systemu podobnego do Desktop Sidebar czy Ave Desk.
- Narzędzie do generowania animacji np. JavaScript/CSS3 Flash, np. zawierających banery, reklamy, itp. Może być wykonane jako aplikacja desktopowa lub działająca poprzez www. Użytkownik miałby możliwość graficznego zdefiniowania różnych parametrów animacji, np. dla reklamy: logo, tekst, sposób animowania, itp.
- Generyczny system do analizy zawartości portali, np. narzędzie umożliwiające przetwarzanie informacji pochodzących z Allegro. Przykładowo użytkownik może sprawdzić średnią cenę jakiegoś towaru czy łączną liczbę sztuk. Dzięki dwóm systemom wtyczek (pluginów) system może pracować z różnymi portalami oraz dokonywać na nich różnych analiz. Aplikacja może być zrealizowanay przy użyciu technologii webowych lub desktopowych.
- Analogicznie jak powyższy pkt., ale język zapytań umożliwiający odpytywanie w/w źródeł danych (portali) lub np. plików tekstowych. Może być oparty na np. podejściu stosowym SBA/SBQL i/lub podobny do np. narzędzia q.
- Silnik do wyświetlania widgetów (podobnie jak pkt. 9), ale działający na urządzeniach przenośnych, np. Android, iOS.
- Stworzenie języka wysokiego poziomu (deklaratywnego) ułatwiającego tworzenie oprogramowania na którąś z platform (np. Java, .NET, Ruby). Może to być jakiś język zapytań (coś w rodzaju LINQ) lub do deklaratywnego tworzenia GUI (coś jak GCL). Teoretycznie wymaga to modyfikacji kompilatora (jeżeli chcemy zintegrować nową składnię/możliwości z istniejącymi, a nie przesyłać je przez String'i), ale można wykorzystać pomysł dotyczący specyficznej notacji zrealizowany np. w projekt quaere. W skrócie polega on na odpowiednim zaprojektowaniu klas, metod, dziedziczeń, interfejsów.
- Dodanie własnej funkcjonalności do istniejących kompilatorów poprzez modyfikację ich kodu źródłowego. W przypadku Javy interesujący może być projekt Open JDK (realizowany w oparciu o upublicznione oryginalne JDK Suna), a szczególnie grupa zajmująca się modyfikacjami kompilatora. Ciekawy przykład pokazujący m.in dodanie własnego operatora.
- Stworzenie systemu CMS z bardzo dobrym GUI (AJAX) w oparciu o technologie Google App Engine (darmowy hosting) oraz Google Web Toolkit (wykorzystanie "czystej" Javy do implementacji aplikacji webowych). Przy odpowiedniej organizacji praca może być początkiem interesującego projektu open-source lub komercyjnego. Ze względu na rozmiary zadania dopuszcza się pracę w grupie. Przykładowy system CMS dla GAE: Vosao.
- Opracowanie IDE (Integrated Development Environment) działającego w oparciu o technologie webowe i obsługiwanego przez przeglądarkę. Można wykorzystać nowoczesne technologie JavaScript i własną konstrukcję części serwerowej (przykłady: GitHub Codespaces, Goorm, phpanywhere, CodeMirror, Eclipse's Orion, ideone).
- Stworzenie pluginu do IDE obsługującego platformę ODRA/SBQL. W przypadku Eclipse'a warto rozważyć użycie Xtext - a programming language framework; podobnie jak zrobiłem to w ODRA eIDE2.
- System do generowania portali, np. podobny do Wix. Chodzi o uzyskanie dość zaawansowanej funkcjonalności przez osoby bez wykształcenia IT.
- Język zapytań do wydobywania informacji ze źródeł danych stosowanych w systemach Web 2.0. Może być oparty na np. podejściu stosowym (SBA/SBQL) i umożliwiać odpytywanie np. strumieni RSS.
- Framework webowy umożliwiający wyświetlanie GUI strony/portalu w postaci zoptymalizowanej dla urządzeń mobilnych (np. podobny do rozwiązań Nitobi (Complete UI, PhoneGap)). W zależności od rodzaju urządzenia na którym przeglądana jest witryna, jej GUI zostanie wyświetlone w sposób "klasyczny" (standardowy PC) lub jako widgety obsługiwane kciukiem (tak jak aplikacje Android/iPhone). Pomocny może okazać się projekt Mobile Boilerplate.
- Witryna internetowa (lub aplikacja desktopowa) umożliwiająca przeglądanie treści dostępnych w Internecie (np. strumieni RSS) w sposób zbliżony do tradycyjnej gazety (np. podobny do wykorzystanego w oprogramowaniu Flipboard, Surfboard, Zite, Taptu, Pulse, Feedly, FeedSquares). Oprócz funkcjonalności związanych z przeglądaniem może też sugerować nowe źródła informacji (np. na podstawie dotychczasowych wyborów użytkownika).
- Framework do tworzenia aplikacji webowych dla środowiska, np. ODRA (np. podobny do WebODRA2). Może wzorować się na popularnych rozwiązaniach takich jak: Ruby on Rails, MS ASP.NET MVC, czy Grails.
- Dedykowana aplikacja dla urządzeń mobilnych ułatwiająca zarządzanie jakimś systemem on-line. Np. dzięki różnym wtyczkom ułatwia administrowanie systemami CMS lub forami internetowymi. W odróżnieniu od klasycznego dostępu przez www jest zoptymalizowana dla małych ekranów i interfejsu dotykowego (np. gesty).
- Generyczny system do tworzenia aplikacji mobilnych (np. Android, iOS, WP) działających np. w oparciu o treści dystrybuowane jako WWW. Narzędzie może być wykonane w wersji on-line (np. AppInstitute, Shoutem, Andromo) lub jako aplikacja instalowana lokalnie (np. podobna do iBuildApp).
- Narzędzie do projektowania witryn i/lub tworzenia prototypów oraz badania użyteczności. Może być podobne np. do InVision, AppGyver.
- Opracowanie założeń frameworku i/lub portalu umożliwiającego rozwiązanie jakiegoś ogólnego problemu. Może być wykonane w postaci np. szablonu projektu ASP.NET MVC dla Visual Studio.
- Framework/narzędzie do tworzenia aplikacji multimedialnych (gier) w oparciu o nowoczesne technologie webowe (HTML5, CSS3), np. podobny do PlayCanvas, Scirra Construct 2.
- Narzędzie do wizualnego programowania (aplikacji webowych, mobilnych, itp.), np. podobne do Touch Develop.
- Generyczny system do pobierania danych (web scrapping'u) z portali. Może być tak zaprojektowany aby cały proces był dostępny dla użytkowników nie mających dużej wiedzy informatycznej (patrz np. Web Scraping Tools for Non-Developers).
- Efektowny (np. 3D i WebGL) i efektywny interfejs (np. webowy) umożliwiający wygodny dostęp do baz danych. Różne przykłady zastosowania WebGL.
- Modyfikacja języka programowania i/lub narzędzie wspierające pracę z IDE (np. ciekawe refaktoringi). Pomocny może być np. Project Roslyn (nowy kompilator dla C# z otwartym kodem i bogatym API), platforma Xtext (dla Eclipse).
- Rozwiązania realizujące ideę IoT (Internet of Things) czyli różnego rodzaju (małe) urządzenia (np. Raspberry Pi, Intel Galileo, Intel Edison, Arduino) podłączone do Sieci i komunikujące się ze sobą. Szczególnie interesujące, i w miarę łatwe do realizacji, może być wykorzystanie Raspberry Pi razem z Windows 10.
- Generyczne rozwiązanie umożliwiające podłączenie mikrokontrolera (np. Arduino) do Sieci/Chmury. Może to być jakiś prosty serwer www (pozwalający np. na zwracanie stanu czujników) lub framework do realizacji Web API. Oczywiście wyzwaniem jest takie zaprojektowanie prototypu aby uwzględnić bardzo ograniczone zasoby (m.in. pamięć rzędu KB, a nie MB/GB).
- Wsparcie systemów chmurowych wykorzystujących mikroserwisy.
- Alternatywne (inne niż C/C++) sposoby programowania mikrokontrolerów/urządzeń IoT (np. Arduino), np. z wykorzystaniem zdarzeń (np. podobne do QM), języków wizualnych (np. XOD), czy DeviceScript (TypeScript dla urządzeń IoT).
- Praktyczne omówienie i/lub porównanie różnych technologii/rozwiązań/framework'ów/wzorców projektowych/sposobów realizacji funkcjonalności. Ważne aby nie ograniczać się tylko do przepisania specyfikacji, ale samodzielnie zaimplementować np. te same wymagania korzystając z różnych rozwiązań. Następnie porównujemy je z różnych punktów widzenia, np. nakład pracy, wydajność, bezpieczeństwo, łatwość użycia, modyfikowalność, generyczność, błędogenność, elastyczność, koszty, zużycie zasobów, itp.
- Rozwiązanie umożliwiające pisanie zapytań dla np. Hibernate korzystające z Fluent API (strumienie/interfejsy funkcyjne w Java 8+) co zapewni mocną kontrolę typologiczną. Podobne podejście funkcjonuje w Entity Framewwork i LINQ, gdzie zapytania są tłumaczone na SQL.
- Zagadnienia związane z tworzeniem oprogramowania (prawie) bez pisania kodu (Low-Code Development Platform - LCDP, No-Code Development Platform - NCDP).
- Tworzenie oprogramowania bez użycia serwera (Serverless computing, Function as a service).
- Wykorzystanie/porównanie wektorowych baz danych mających zastosowanie m. in. w obszarze AI RAG (Retrieval-Augmented Generation).
- Systemy inspirowane Wojnami Rdzeniowymi (Core Wars). W skrócie chodzi o tworzenie programów walczących pomiędzy sobą na określonej arenie.
- Wtyczka/dodatek/modyfikacja IDE ułatwiająca korzystanie z np. architektury heksagonalnej (np. generowanie odpowiednich interfejsów, klas, itp.).
- Oprogramowanie do zarządzania wiedzą (Personal Knowledge Management - PKM), czy notatkami zrealizowane jako aplikacja webowa, z możliwością samodzielnego hostingu (self-hosting), podobna do np. Obsidian, Notion, Memotron.