Commit 535d8eae authored by Robert Husák's avatar Robert Husák
Browse files

Aktualizace před cvičením

parent c2bbc7cf
No preview for this file type
......@@ -4,9 +4,13 @@
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<meta name="author" content="Robert Husák" />
<meta name="robots" content="index,follow" />
<title>Cvičení z C++, Robert Husák</title>
<title>Robert Husák: Cvičení z C++, témata studentských projektů</title>
</head>
<body>
<h1>Stránky Roberta Husáka</h1>
<hr />
<h2>ZS 2021/2022: Cvičení z NPRG041 - Programování v C++</h2>
<h3>Kontakt</h3>
......@@ -32,7 +36,7 @@
<h3>Cvičení</h3>
<ul>
<!-- <li>Bude probíhat na plaformě Zoom: Meeting ID <a href="https://matfyz.zoom.us/j/99296875087">992 9687 5087</a>, heslo je na Nástěnce předmětu v SISu (je stejné jako k přednášce)</li> -->
<li><a href="CppCviceni.pptx">Slajdy - aktualizováno 10.12.2021</a> (neprobrané slajdy se ještě mohou změnit)</li>
<li><a href="CppCviceni.pptx">Slajdy - aktualizováno 7.1.2022</a> (neprobrané slajdy se ještě mohou změnit)</li>
<li>Pro splnění aktivity je potřeba se v <a href="https://recodex.mff.cuni.cz">ReCodExu</a> přihlásit do skupiny <em>Programování v C++ (Pá, 12:20, SW2)</em> a vypracovávat průběžné úlohy (vizte tabulka níže).
Za tyto úlohy nejsou body ke zkoušce, ty budou jen za dva domácí úkoly zadané v průběhu semestru v ReCodExové skupině <em>Domácí úkoly</em> (více info ve slajdech).</li>
<!-- <li>Videozáznamy cvičení naleznete v soukromé skupině na serveru Microsoft Stream <a href="https://web.microsoftstream.com/group/59ff7ad8-771f-426e-851a-4dc06157cf9f">zde</a>.
......@@ -100,11 +104,11 @@
<td>Konstruktory a destruktory, virtuální metody, double dispatch</td>
<td>Polymorfní konverze</td>
</tr>
<!-- <tr>
<tr>
<td>12. (7.1.2022)</td>
<td>Oprava 2. DÚ, revize parsování, výjimky, streamy, manipulátory, analýza řešení <a href="http://forum.matfyz.info/viewtopic.php?f=423&t=11594">zkoušky z 31.1.2018</a></td>
<td>Oprava 2. DÚ, revize polymorfismu a správy paměti, příprava na zkoušku</td>
<td></td>
</tr>-->
</tr>
</table>
<ul>
......@@ -119,5 +123,123 @@
<li><a href="1920/">ZS 2019/2020</a></li>
<li><a href="2021/">ZS 2019/2020</a></li>
</ul>
<hr />
<h2 id="projekty">Témata studentských projektů</h2>
<p>
Pokud máte zájem o vedení ročníkového projektu, bakalářské práce, diplomové práce či (individuálního) softwarového projektu, <a href="mailto:husak@ksi.mff.cuni.cz">kontaktujte mě</a>.
Mé oblasti zájmu:
</p>
<ul>
<li>Kompilátory</li>
<li>Analýza kódu</li>
<li>Nástroje pro vývojáře</li>
<li>Cloudové aplikace a web</li>
<li>Lego (nevěřili byste, jak rozsáhlý ekosystém různých softwarových nástrojů pro něj existuje...)</li>
</ul>
<p>Volba programovacího jazyka je na vás, ale s těmito mohu pomoci nejvíce: C#, F#, C++, PHP, JavaScript</p>
<p>Pro inspiraci naleznete níže náměty na projekty, ale je možné přijít i s vlastním:</p>
<h3>Pomocník pro výhodné nakupování kostek Lego (pracovní název "Kostkočmuch")</h3>
<p>
Kdo někdy kupoval Lego, ví, že jednotlivé sety bývají zatraceně drahé.
To ale mnohdy není nic proti cenám jednotlivých kostek, které shánějí stavitelé při vytváření vlastních modelů.
Existuje několik různých zdrojů, na nichž se mohou kostky výrazně lišit cenou i dostupností:
<a href="https://www.bricklink.com" target="_blank">Bricklink</a>,
<a href="https://www.lego.com/cs-cz/page/static/pick-a-brick" target="_blank">Pick a Brick</a>,
<a href="https://www.lego.com/cs-cz/service/replacementparts" target="_blank">Bricks & Pieces</a>,
<a href="https://www.ebay.com/b/LEGO-Bricks-Building-Pieces/183448/bn_16564827" target="_blank">eBay</a>,...
Nejvýhodnější cestou, jak určitou množinu kostek získat, může být nákup jejich kombinace z několika různých zdrojů.
Momentálně však neexistuje žádný nástroj, který by toto umožňoval, proto čas volá "Kostkočmucha".
Možné featury (podle jejich výběru lze téma naškálovat od ročníkového projektu až po skupinový softwarový projekt):
</p>
<ul>
<li>Parsování dat z různých zdrojů</li>
<li>Rozpoznávání konkrétních kostek ve fotkách a videích (např. u inzerátů či při procházení kostek doma)</li>
<li>Přehled o vývoji ceny každé z kostek</li>
<li>Optimalizační algoritmus pro výběr kombinace různých zdrojů</li>
</ul>
<p>
Téma je vhodné pro procvičení vývoje cloudových aplikací s architekturou mikroslužeb, ale stejně tak dobře jej lze naimplementovat jako desktopovou aplikaci.
</p>
<h3>GitHub pro Lego modely</h3>
<p>
Ačkoliv komunita stavitelů Lego modelů <a href="https://rebrickable.com" target="_blank">je značná</a>, momentálně si většina z nich tak nějak "hraje na vlastním písečku", tj. tvoří si vlastní modely a sem tam je upravuje na základě zpětné vazby z okolí.
U veřejně dostupných Lego modelů chybí možnosti, které známe ze světa programování a open source: trasování změn pomocí verzovacího systému a jejich vizualizace, možnost "forknout" si model, upravit ho a změny zpětně začlenit pomocí pull requestu, kontinuální integrace (např. vyrenderování aktuální verze modelu) apod.
Možné featury (jako téma si lze vybrat i jen jednu z nich):
</p>
<ul>
<li>Vizuální "Diff and Merge Tool" pro Lego modely - zobrazování lze vyřešit např. <a href="https://github.com/LasseD/buildinginstructions.js" target="_blank">touto</a> knihovnou, ale je potřeba zejména navrhnout samotné porovnání rozdílů</li>
<li>Webový front-end nad verzovacím systémem (nejlépe Gitem)</li>
<li>Vytvoření workflow pro "kontinuální integraci" - např. renderování obrázků a videí z modelů, skládání více modelů dohromady, <a href="https://github.com/jncraton/connectiongrammar" target="_blank">generování částí modelů</a></li>
<li>Online editor/prohlížeč modelů (<a href="https://www.mecabricks.com" target="_blank">inspirace</a>)</li>
</ul>
<h3>Rozšíření nástroje <a href="http://www.askthecode.net" target="_blank">AskTheCode</a> pro zjišťování příčin chyb v kódu</h3>
<p>
Zjišťování chyb typu "jak se do této proměnné mohla sakra dostat -1" bývá často velmi náročné a ubíjející.
<a href="http://www.askthecode.net" target="_blank">AskTheCode</a> je rozšíření do IDE, které si klade za cíl s tímto problémem programátorům pomoci.
Za tímto účelem používá techniku zvanou "zpětná symbolická exekuce", více info o fungování nástroje naleznete např. v <a href="https://github.com/roberthusak/AskTheCode/raw/master/docs/InterAVT_2019_paper.pdf" target="_blank">tomto článku</a>.
Možná témata pro vývoj:
</p>
<ul>
<li>Implementace nových technik do nástroje pro jeho zefektivnění (např. použitých v nástroji <a href="https://manu.sridharan.net/files/snugglebug.pdf" target="_blank">Snugglebug</a>) - možné v C# či F#</li>
<li>Přidání podpory pro složitější jazykové konstrukty v C#</li>
<li>Reimplementace či rozšíření pro jiný programovací jazyk (momentálně analyzuje C# pomocí <a href="https://docs.microsoft.com/en-us/dotnet/csharp/roslyn-sdk/" target="_blank">Roslynu</a>)</li>
<li>Reimplementace pro jiné IDE (třeba VS Code)</li>
</ul>
<h3>Implementace vysoce výkonných knihoven v .NETu</h3>
<p>
Ačkoliv je C# i platforma .NET poměrně populární, existuje poměrně zažité přesvědčení "pokud potřebuješ něco udělat opravdu efektivně, naprogramuj to v C++".
Při programování v C# či F# se pak setkáváme s tím, že některé knihovny je nutné volat pomocí P/Invoke či v separátním procesu, což přináší režii navíc a znesnadňuje to i distribuci výsledných nástrojů.
Posledních pár let se Microsoft v C# a .NET Core významně zaměřuje na optimalizaci výkonu (více info např. konference <a href="https://conf.dotnetos.org" target="_blank">Dotnetos</a>), což otevírá možnost programovat výkonné knihovny přímo v C# (do jisté míry i v F#).
Konkrétní téma je možné si vybrat vlastní, zde jsou nápady z oblasti analýzy kódu:
</p>
<ul>
<li><a href="https://en.wikipedia.org/wiki/Satisfiability_modulo_theories" target="_blank">SMT řešič</a>, t.j. nástroj schopný ověřit platnost výrazu v určité podmnožině predikátové logiky, např. ∃ x: x > 10 ∧ x < 15</li>
<li><a href="https://en.wikipedia.org/wiki/Datalog" target="_blank">Datalog</a> - zjednodušený Prolog, vhodný pro statickou analýzu kódu (zajímavý je např. projekt <a href="https://souffle-lang.github.io" target="_blank">Soufflé</a>)</li>
</ul>
<h3>Pořádná nullability analýza pro C#</h3>
<p>
Obecně se soudí, že možnost přiřadit Null do referencí je <a href="https://www.infoq.com/presentations/Null-References-The-Billion-Dollar-Mistake-Tony-Hoare" target="_blank">"chyba za miliardu dolarů"</a> kvůli nepřehlednosti a potenciálním chybám, co způsobila.
Aby se její dopad o něco zmírnil, v C# verze 8 byla <a href="https://docs.microsoft.com/en-us/dotnet/csharp/nullable-references" target="_blank">přidána možnost reference explicitně označovat jako nullable a "ne-nullable"</a>.
Tato nullability analýza má ale své hranice a ne vždy funguje dobře (např. při psaní kódu pro .NET Standard 2.0).
Cílem tohoto projektu je proto tuto analýzu zpřesnit, aby pokrývala více situací a pro různé typy projektů.
Vzhledem k vyšší náročnosti analýzy oproti té zabudované může být zajímavé rovněž "offloadování" výpočtu na jiný počítač či možnost "předpočítat" si určité části analýzy předem.
</p>
<h3>Analýza běžících aplikací v .NETu</h3>
<p>
Analýza běžícího programu nám může dát užitečné informace o jeho sémantice a případných chybách.
Nápady na témata v této oblasti:
</p>
<ul>
<li>Open source reimplementace <a href="https://docs.microsoft.com/en-us/visualstudio/test/generate-unit-tests-for-your-code-with-intellitest?view=vs-2022">IntelliTestu</a> či jeho části (například Extended Reflection)</li>
<li>Automatická kontrola zachování sémantiky kódu po jeho refactoringu</li>
<li>Chytřejší příkaz Go To Implementation, který zohledňuje i aktuální typy objektů</li>
</ul>
<h3>Doménově specifické jazyky (DSL)</h3>
<p>
Narozdíl od obecných programovacích jazyků, jako je C# či C++, je každý doménově specifický jazyk určený pouze pro určitou podúlohu, typicky v nějakém větším systému.
DSL jsou ideální pro zájemce o kompilátory, neboť mohou s rozumně vynaloženým úsilím přinášet vysokou přidanou hodnotu díky potenciálnímu zjednodušení a zefektivnění kódu.
Nápady na témata v této oblasti:
</p>
<ul>
<li>DSL pro <a href="https://github.com/dotnet/roslyn-analyzers/blob/main/docs/Writing%20dataflow%20analysis%20based%20analyzers.md" target="_blank">analýzu datového toku v Roslynu</a> (kompilátor Microsoftu pro C# a VB)</li>
<li>"Továrna" na DSL - rozšíření do IDE umožňující uživatelům jednoduše vyvíjet vlastní DSL, automaticky poskytující např. tooltipy, IntelliSense, debugování apod. (implementace možná v různých jazycích, ideální by to ale bylo asi v .NETu, případně JavaScriptu)</li>
</ul>
<h3>Asistent pro <a href="https://en.wikipedia.org/wiki/Sid_Meier%27s_Colonization" target="_blank">Sid Meier's Colonization</a></h3>
<p>
Pomocný nástroj pro správu uložených her a jejich vizualizace, případně provádění statistik.
Základní nástřel v F# naleznete <a href="https://github.com/roberthusak/ColonizationAssistant" target="_blank">zde</a>.
V rámci projektu je možné buď tento nástroj rozvinout o další featury, nebo jej celý naimplementovat znovu (v libovolném jazyce).
Zajímavý projekt je rovněž <a href="https://github.com/eb4x/viceroy" target="_blank">Viceroy</a>, který obsahuje např. strukturu souboru uložené hry.
</p>
</body>
</html>
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment