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)#

Aktualizované informace o pravidlech, podmínkách a průběhu NPRG045 jsou vždy k dispozici na https://teaching.mff.cuni.cz/nprg045-web/.

Tato stránka obsahuje především informace o tom, co typicky očekávám u projektů, u kterých jsem vedoucí – tj. především vhodné okruhy témat a návaznost na bakalářskou práci.

Seznam témat dole je dost obecný, dostatečné rozšíření jakéhokoliv (i vyřešeného) tématu je možné použít i na diplomovou práci, softwarový projekt, apod.

Obecné informace#

Vhodnost témat#

Téma projektu by mělo souviset se specializací nebo odborným zájmem vedoucího. V mém případě ideálně zamiřte na Google Scholar nebo GitHub, najděte si nějaké projekty na kterých jsem pracoval a příbuzná/rozšiřující/podobně tvarovaná témata budou nejspíš OK. Velmi vhodné okruhy témat pro RP/BP jsou:

Budu preferovat ročníkové projekty, u kterých se počítá s rozšíření na BP.

Níže témata najdete prozepsaná, okomentovaná, a s příklady.

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í číst, psát, 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. Zásadním cílem RP je materializovat jistotu o tom, že vypsaný bakalářský projekt je možné úspěšně dokončit (a obhájit). V ideálním případě je výsledkem RP prototyp programu a finalizované zadání bakalářky.

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í alespoň na 3 různé práce (včetně hodnocení oponentů).

Materiál#

Co napsat do mailu?#

Nevhodná témata#

Konkrétní témata#

Ve většině případů uvedených níže mám konkrétní představu o tom, jak by práce měla vypadat a jak splní požadavky “bakalářskosti” shrnuté nahoře. Některá témata jsou dost ad-hoc a jde mi hlavně o efektní výsledek (hlavně v případě her a simulací), což pro účely BP nemusí být úplně vhodné, ale většinou v nich jde najít zajímavý problém.

V případě zájmu a dotazů mi každopádně napište mail.

Pozn.: Nejsem příznivce programování “do šuplíku”, výsledky projektů je vhodné publikovat (typicky jako open-source). 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.

Haskell#

BIKE key encapsulation#

Implementace post-kvantové výměny klíčů v Haskellovém ekosystému, např. do balíku Crypton, podobně jako už existující MLKEM.

Metabolic modelling#

Reimplementace částí COBREXA.jl a ConstraintTrees.jl v Haskellu (kvůli rychlosti a spolehlivosti).

Funkcionální ggplot#

Něco co dokáže rychle a jednoduše z CSV-style dat produkovat vizualizace na úrovni COW Fundamentals.

Pravděpodobně může navazovat/stavět na hgg.

Kompilátory#

Zlepšení libovolného programovaciho jazyka pomocí Haskellového (nebo podobného) typověho systému.

Nějaká extrémně odlehčená varianta LLVM by se dost hodila. (téma je zabrané)

Reprezentace a kompilace arrayových výpočtů, podobně jako v Accelerate. Práce na Accelerate je taky super.

DSL pro specifikaci a design fontů#

Výroba fontů je pořád dost manuální práce. Cílem by bylo vyrobit nějaký metajazyk na popis a kombinování glyfů, kterým by fonty (a hlavně jejich varianty jako light/bold, slanted/deslanted, condensed/wide, a kombinované glyfy (čěšťíňá)) šly generovat rozumně automaticky a bez větších manuálních úprav. Pravděpodobně hodně 2D matematiky, CADovítých prostorových constraintů a složitých křivek. Nejspíš včetně nějakého uživatelského rozhraní (freeCAD-like?) na prohlížení a mírnou editaci.

Praktickým cílem by asi bylo vyrobit dobrý regenerovatelný a parametrizovatelný open-source DIN font.

mini-git#

Haskellová nativní knihovna pro ovládání gitových úložišť už existuje. Pěkná práce by se mohla pokusit vytvořit maličký alternativní gitový interface, ideálně specializovaný na trochu jiný workflow než kanonický git (tj. s indexem a jedinou větví) ale pořád poněkud kompatibilní s normálním gitem.

Zajímavé experimenty:

Open-source#

FOSS reimplementace jakéhokoliv softwaru, který je dostupný jen jako služba nebo closed-source.

Vhodné nápady:

RDF, Data linking & management#

Strukturované indexování kódu#

Kód je možné si představit jako DAG – skoro jako AST, ale stejné větve (např. stejná použití jedné proměnné) se sloučí. Z takového DAGu je možné vytrhávat malé kousky (malinké podgrafy) a používat je podobně jako n-gramy v textu, na počítání strukturální podobnosti kódu a na indexování.

Aplikace:

Research software#

Machine learning, redukce dimenzionality#

Aplikace samoorganizačních map a/nebo EmbedSOMu jsou super.

MaBoSS (maboss.curie.fr) je stochastický simulátor signálních sítí, výsledky jsou bohužel příliš stochastické než aby šly jednoduše prohledávat. Co taky zkusit samoorganizační mapy? (relwork)

Networking#

Několik témat je na webu DecentraLabu.

Fungování a bezpečnost v různých chaoticky vytvořených ad-hoc sítích.

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? Nebo něco vlastního v Haskellu?) 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 dobře 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í bibliography/reference management system?

  5. V “normálních” souborových systémech se invertované indexy musí ukládat do speciálního souboru, který typicky musí nějak obsluhovat ostatní uložená data. Co takhle mít souborový systém který adresářovou strukturu už ukládá invertovaně “sám”, a umí nějaké jednoduché dotazy vyhodnotit sám? Tj. každý soubor může patřit do nějakého nenulového velkého množství adresářů (stovek až tisíců), a uživatel pokládá dotazy na průnik adresářů a jejich podadresářů, např. “najdi všechny soubory otagované fotky/*, datum/2025/říjen/* a geo/Praha/*”.

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.

Potenciálně vhodné 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: