Navigation
Page categories
Outline:
Last modification
2025-09-04
This is smol web. If you don't like it, fix your browser.

Ročníkové projekty (NPRG045)#

Vhodné okruhy témat#

Hodí se projekty co obsahují hodně tvrdé použití C, funkcionální programování, Haskell, SIMD/paralelní/cache-efficient (nebo jinak vysoce výkonné a efektivní) algoritmy, hodně UNIXu, internety/sítě/distribuované věci, kryptografii. Dostatečně akční nebo zajímavé hry jsou vítány (viz. sekce níže). Bioinformatika je OK.

Prakticky každý ročníkový projekt je vhodné rozšířit na bakalářskou práci, oddělené RP a BP jsou spíše výjimka kterou rozhodně nejde doporučit.

Dostatečné rozšíření jakéhokoliv (i vyřešeného) tématu je možné použít i na diplomovou práci.

Jak se pozná bakalářská práce?#

Volně přeloženo: Jak poznat bakaláře z MFF/Informatiky od náhodného člověka, který umí počítat a programovat?

Cílem bakalářské práce je (1.) provést mírnou rešerši současného (nebo nedávného) výzkumu o jednom konkrétním informatickém tématu, (2.) pomocí získaných vědomostí vyřešit nějaký úzce specializovaný a dobře definovaný problém, následně (3.) standardnímí a reprodukovatelnými metodami určit, jak moc dobré je vzniklé řešení, a konečně (4.) celý příběh srozumitelně a přehledně vyjádřit ve zhruba 20- až 60-tistránkové monografii, které se říká bakalářská práce. Bakalář odevzdáním práce prokazuje, že dokáže rozumět výsledkům současného výzkumu, podle nich vědecky řídit a analyzovat svou vlastní práci, a výsledek srozumitelně předat dál.

V rámci ročníkového projektu se většinou připravujete na hlavní část programování na práci, tj. vyzkoušíte si všechny knihovny co budete potřebovat, prozkoumáte cílové prostředí, vyrobíte prototyp, načtete si odbornou literaturu, apod.

Před výběrem tématu ročníkového projektu je vhodné si položit otázky odpovídající bodům 1-4 výše, a pokusit se na ně odpovědět:

Obraz o očekávaném výsledku si můžete udělat průzkumem bakalářek, které už jsou obhájené. Důrazně doporučuju podívat se do Repozitáře závěrečných prací aspoň na 3 různé práce (včetně hodnocení oponentů).

Témata#

Ve většině případů mám konkrétní představu o tom, jak by práce měla vypadat a jak splní body uvedené nahoře. V případě zájmu a dotazů mi napište mail.

Pozn.: Nejsem příznivce programování “do šuplíku”, výsledky projektů je vhodné publikovat (např. jako opensource). Většina témat má po dokončení RP/BP potenciál být poměrně užitečná a začít žít vlastním životem.

Machine learning, redukce dimenzionality#
Embedding#

Na světě je hodně zajímavých databází s obrovským objemem vysokodimenzionálních dat, které by bylo fajn nakreslit jako jeden přehledný obrázek pomocí embedování do 2D. Třeba pomocí něčeho jako t-SNE nebo UMAP . Některé databáze jsou bohužel na tyto metody příliš velké nebo příliš mnohadimenzionální (typickým příkladem je PubChem, ve kterém je přes 200 milionů chemických struktur, které mají přes milion identifikovatelných “featurových” domenzí). Vizualizace celého PubChemu která je dostatečně úsporná na to, aby šla např. spočítat na notebooku, je fajn bakalářská až diplomová práce.

Jiné nápady k vizualizaci: celý obsah wikipedie, data z scRNAseq, diskografie nějaké kapely z 80tých let, celý obsah githubu, všechny série Simpsonů, apod.

Jakákoliv práce na samoorganizačních mapách a/nebo EmbedSOMu je OK.

Vyhledávání v multimediálních datech#

Řešení problému automatické anotace videa. Například: Na internetu se vyskytuje obrovská hromada nahraných přednášek a slajdů, v nich ale není možné moc dobře vyhledávat. Bylo by fajn je převést na text a nějakou prohledávatelnou obrázkovou informaci (metody na extrakci těchto dat už existují), a nechat je uživatele prohledávat textově.

Velice dobré a dobře obhajitelné téma s okamžitým praktickým využitím.

Search engines/Big data#
  1. Běžná datová struktura pro ukládání dat v search enginech jsou skip-listy, s různými vylepšeními (především delta-encoding, zmenšování indexů slovníkem, Elias gamma coding, …). Cíl: Implementovat pěknou a moderní (a drasticky rychlejší) alternativu Apache Lucene/Lucy. Poměrně jednoduché téma s velmi dobrým využitím. Velmi vhodné pro počítačovou lingvistiku, potenciální aplikace v bioinformatice. (vyřešeno)

  2. Hlavní nevýhoda invertovaných indexů je nemožnost efektivně zkombinovat skiplistovou metodu filtrování a “join” známy z SQL. Cíl: Prozkoumat co se s tím běžně dělá a naimplementovat/změřit/vylepšit nějaké existující řešení. Distribuované vyhodnocování podobných dotazů je super téma na diplomovou práci.

  3. Asi nejrozumnější open-source distribuovaný search-engine (ElasticSearch) je napsaný v Javě a docela (dost) tím trpí. Cíl: Z dostupných lokálních C search enginů (Apache Lucy? CLucene? Xapian? Nebo předchozí nápady?) a nevelkého množství distribuovaných algoritmů udělat něco škálovatelného a podstatně úspornějšího než ES.

  4. Dost lidí má na disku velké množství velmi důležitých PDFek, typicky článků, ve kterých se nejde moc vyznat. Vyhledat v takové hromadě název článku, autora nebo text není úplně jednoduchá zábava. Co takhle nějakou malou aplikaci (commandline a/nebo GUI) na textové indexování a prohledávání PDF? Co takhle to spojit s bibtexem a udělat z toho funkční reference management system?

Použitelný uživatelský interface na e-mail#

GoogleMail/Inbox killer: Interface na maily který umí tagy, pořádný fulltext search (jako např. notmuch-web), a má interface co vypadá jako z aktuálního tisícíletí (dobrý příklad: Google Inbox, špatný příklad: gmail, outlook).

Aktuálnost tématu je navíc zvýšená tím, že google se v březnu 2019 rozhodl Inbox přestat provozovat.

Poměrně jednoduché téma s dobrým využitím, velmi vhodné na BP. Je potřeba umět programovat pro web, tj. znát javaskript a nějaký “backendový” jazyk. Nebo to napsat v haskellu .

(téma už bylo částečně vyřešené ale je možné volně pokračovat, především prací na serverové části)

wdiff, wpatch, wmeld#

(většinově vyřešeno)

Běžné UNIXové utility diff a patch se hodí na zpracovávání line-by-line patchů, které jsou dost vhodné na zdrojový kód a podobné dobře odřádkované věci. Existuje i hromada nástrojů usnadňujících mergování, kromě tradičního gitu i vizuální, např. kdiff3 nebo meld.

Pokud ale gitem zpracováváte např. “lidský” text, ve kterém rozdělení na víc řádků nemá velký význam, používat standardní diff, patch na mergování je dost otrava. Typická problémová situace nastává při mergování dvou malých změn v jednom odstavci textového dokumentu — výstup standardního diffu v obou případech nahradí celý odstavec a vznikne automaticky neřešitelný konflikt.

Naštěstí existuje wdiff (který místo nahrazování celých řádek v souboru ukazuje rozdíly na úrovni jednotlivých slov), případně git diff --word-diff (který je navíc pěkně barevný). Odpovídající nástroje pro patchování pomocí takovýchto patchů (wpatch) ani pro mergování (např. wmeld) bohužel zatím neexistují. Cílem projektu by samozřejmě bylo je prozkoumat, vhodně navrhnout a vytvořit.

Autotools z aktuálního století#

Pokud používáte UNIX, asi jste si všimli, že většina “ručně” nainstalovatelného software se instaluje trojkombinací ./configure; make; make install. Konfigurační skript (který je napsaný v čistém shellu a produkuje Makefile) je v 99.999% softwaru výsledkem použití programů autoconf a automake (dohromady autotools) které se zabývají tím, jak software dostatečně dobře zabalíkovat tak, aby šel postavit na jakémkoliv unixu, cross-kompilovat, přizpůsobovat, konfigurovat na místě, portovat, atd. apod. Interface configure je poměrně přímočarý a na všech platformách víceméně stejný, a výsledek je jednoduché použít správně i pro velice složité věci.

Hlavní vlastností systému je naprostá nezávislost na softwarovém vybavení cílového počítače: configure jde spustit na jakémkoliv počítači kde je POSIXový shell, bez jakékoliv nutnosti instalovat cokoliv dalšího.

Dokonalost tohoto systému je bohužel překonána jen jeho zastaralostí — autotools jsou napsány v divném template-shellu, který se jmenuje m4 a pro programátory narozené po roce 1900 je značně neprůhledný. Za léta používání se navíc nabalila tradiční hromada kompatibilitních pomůcek, které dnes už nejsou úplně potřebné.

Pokusy autotools překonat skončily fiaskem (scons apod.), nepřenositelností a vyrobením úplně nového spektra potíží následovaných progresivním neuchopitelným fiaskem (cmake apod.) nebo totálním zapomenutím kvůli různým hloupostem v návrhu (mkconfigure, bmake, apod.).

m4 je každopádně jen poměrně jednoduchý generativní jazyk, pomocí kterého se (s dodatkem poměrně velké knihovny triků) seskládá shellový configure. Ten je následně schopný zkontrolovat cílovou platformu a podle výsledku z nějakého vzoru Makefile.in sestavit výsledný Makefile. Požadavek na shellovost je daný přenositelností — shell je jediný jazyk, který smíte očekávat na opravdu každém unixu.

Takže — co takhle z procesu vytrhnout m4 a kompilátor configure-skriptu napsat v něčem rozumnějším, modernějším, typovaném a hezkém? Co třeba v Haskellu, který je na psaní DSL naprosto nepřekonatelný? Nebo to přestřelit a celý systém vyrobit jen v make (protože standardní make je taky na každém unixu)?

Téma je extrémně vhodné pro UNIXově smýšlející studenty, výsledek má šanci posunout open-source svět o dost dopředu.

Kompilátory a programovací jazyky#

Typový systém Haskellu kupodivu není složité implementovat — základní verze je mnohem jednodušší než např. typový systém C a vejde se na zhruba 250 řádků kódu.

Cílem práce by bylo zkombinovat C s typovým systémem Haskellu; výsledný jazyk by částečně kombinoval výhody obojího (rychlost a značnou odolnost proti chybám).

Na výsledku lze stavět další práce — např.:

Simulace/fyzika#
  1. Vírníky (a.k.a. autogyro a.k.a. gyrocopter) vypadají jako vrtulníky, s tím rozdílem, že vrchní vrtule není poháněná motorem, ale fyzikální magií. Jejich pohyb se od klasických letadel a vrtulníků následně odlišuje v několika podstatných a značně neintuitivních detailech (např. “zatočit dolů” je poměrně nebezpečné a je potřeba to dělat jinak). Kvalitní softwarová simulace letu vírníku zatím není k dispozici.
  2. Dostatečně dobrá simulace pískových přesýpacích obrázků co se prodávají kolem Václaváku je ve skutečnosti dost složitá a výpočetně náročná zábava. Simulaci by bylo vhodné provést na GPU.
  3. Kvalitní/otevřený software na simulaci a počítání parametrů rádiových antén v současnosti úplně chybí (téma návrhu antén je obecně považováno za temnou černou magii, což je samozřejmě potřeba vyvrátit kvalitní bakalářkou). Inspirace: proč funguje tohle?
  4. Dnešní fotorealistický ray-tracing není fotorealistický, protože ignoruje rychlost světla! ( :D ) Co takhle nasimulovat, jak vypadá průlet nějaké výkonné stíhačky Malostranským náměstím rychlostí 0.8c, 1c a 1.5c (zevnitř i zvenku)? Inspirace zde.
Networking#

QoS v různých ad-hoc sítích. Jaké předpoklady jsou potřeba k dosažení optimálního rozložení kvality komunikace např. v dynamických hejnech robotů/dronů/družic?

Umí se roboti vůbec domluvit na vhodném adresování celého hejna?

Jde to udělat bezpečně? Umí se dostatečně velký počet robotů vůbec na něčem spolehlivě domluvit?

Je možné volně pokračovat v předchozí bakalářce na téma QoS.

Immediate-mode GUI#

Styl programování uživatelských rozhraní známý z ImGui je, mírně řečeno, s obrovským odstupem nepřekonaný způsob výroby GUI. Immediate-mode interfacy se ale moc nehodí na běžné desktopoviny, protože je potřeba je pořád dokola překreslovat.

Nešlo by vymyslet immediate-mode GUI, které by fungovalo i s pomalejšími kreslícími metodami? Konkrétně: Nebylo by možné (za použití několika extra předpokladů o uživatelském kódu) kreslící funkci rozumně pozastavovat, případně spouštět jen částečně, aby nemuselo docházet k takovému množství kreslení?

Nešlo by ImGui předělat do terminálovité podoby? Tím by se výroba kvalitních terminálových aplikací mohla v porovnání s běžným ncurses značně zjednodušit. (Téma je hodně unixové a určitě dobrý kandidát na užitečný open-source.)

Jak udělat podobné super GUI v čistém Haskellu (bez blbostí jako IORef nebo Ptr)? Nebudou na to náhodou potřeba Lensy?

Hry#

Předem, uvědomte si, že “obyčejná hra typu X” není dobré téma na bakalářskou práci. Hry už umí programovat každý. Pokud chcete dělat hru, je potřeba do ní propašovat nějakou zajímavost — třeba algoritmus, který je výsledkem současného vývoje, není moc známý (ideálně neexistuje veřejně dostupná implementace) a neotřele a efektivně dělá něco extrémně užitečného a/nebo složitého. O související teorii budete muset napsat cca 20 nenudných stránek.

To ale určitě neznamená, že hry vhodné pro RP/BP neexistují! Nápady:

OpenStreetMap#

Práce s mapami je poměrně zábavná — kvalitních dat je hodně a výsledek je okamžitě užitečný a pěkný. Moje nápady jsou biasované směrem k cyklistice, ale je možné pracovat na čemkoliv jiném:

Pro podobné “veřejně užitečné” projekty je většinou možné sehnat finanční podporu na provoz výsledku.

Grafová databáze#

Malá a rychlá grafová databáze (tj. bez Javy, ne jako Neo4J apod.) která transparentně řeší problém lokality dat pomocí líné volné hierarchie. (Myšlenka je (velmi implicitně) podobná dynamickému hledání malých separátorů.)

Kryptografie/bezpečnost#

Existuje kategorie “low-tech” šifer, které jdou poměrně pohodlně a dostatečně spočítat “ručně” bez pomoci počítače. Například ElsieFour, nebo moje oblíbená varianta LS47. Cílem práce by bylo vytvořit low-tech hashovací funkci, následně např. low-tech podpis (pomocí např. Merkleho stromů) nebo v extrémním případě přijít na nějakou low-tech metodu výroby společného tajemství (a.k.a. Key exchange, podobně jako Diffie-Hellman) nebo úplné asymetrické šifry (ale to už je dost obtížné).

Kdysi jsem zpracovával postkvantovou kryptografii ( https://github.com/exaexa/codecrypt ). Na MFF už vznikla i částečná post-kvantová náhrada SSL, knihovna využívající SIDH se kterou jde jednoduše vyrobit postkvantové bezpečná komunikace, konkrétně třeba něco jako SSH. Na RP/BP je možné jeden z projektů rozšířit o novou funkcionalitu.

Vhodné pro studenty s určitým přehledem/zájmem o bezpečnost a související matematiku (stačí si pamatovat něco málo z lineární a obecné algebry a z pravděpodobnosti). Konkrétní nápady:

CPU/FPGA#

Vývoj nějaké netradiční, rozumně výkonné architektury, kde neexistují anomálie typu Meltdown/Spectre a je vhodná na provozování mikrokernelů.

Detekce anomálií#

Software který dostává (velké) hromady nějak označených časových dat (např. výstupy z nějakého monitorovacího systému, pingy, teploty nebo přenosové rychlosti různých počítačů v čase) nějak je zpracovává aby neukládal všechno, a je schopný upozornit na anomálie chování (náhlé změny, jiný průběh než minulý týden) nebo předpovědět problém (např. že něco postupně roste a vypadá že za nějaký čas přeroste nějakou nastavenou hodnotu).

Cíl: zjednodušit audit rozsáhlých systémů tím, že se program o systému naučí všechno sám a oznámí např. top 100 aktuálně nejvíc podezřelých věcí.

Možno pojmout statisticky, entropicky, nebo nervovo-síťově.

Decentralizace (internetu apod.)#

Je zajímavé a vhodné vyrábět bezpečné P2P alternativy tradičně centrálních systémů jako DNS, vyhledávače, sociální sítě, mail, herní lobby, atd. Extrémem je decentralizace celé administrativní monstrozity IANA/ICANN/RIRs.

Další zajímavý problém: Efektivní automatický routing v obrovské nestabilní síti —- Internet s jedinou obrovskou, pokudmožno spolehlivou a proti nepřátelům odolnou routovací doménou, dynamická adresace pro minimalizaci velikosti routovací tabulky, proof-of-work-like důkaz existence. (Nápad: setrvačnost jde vyrobit pomocí onetime/fewtime signatures)