Čtvrtý semestr na FIT ČVUT

Další semestr ukončen. Je vidět, že nejtěžší předměty už mám asi za sebou, protože tentokrát jsem zakončil zatím nejlepším průměrem za celé studium. Ale úplně bez práce to také nebylo. A co že jsem tento semestr studoval?

[BI-BEZ] Bezpečnost → B

Předmět se zabývá především kryptografií (věda o šifrování). Nejdříve se proberou matematické principy různých typů historických i v současnosti běžně používaných šifer, nahlédne se i do budoucnosti úvodem do kvantové kryptografie. Potom se prakticky jednotlivé šifrovací techniky vyzkouší při programovacích úlohách v C s využitím knihovny openssl, např. k zašifrování obrázkového souboru nebo ručnímu navázání šifrovaného spojení přes internet.

[BI-EP2] Efektivní programování 2 → A

Volné pokračování volitelného předmětu EP1. Tentokrát témata velmi úzce souvisí s paralelně zapsaným předmětem BI-GRA, takže jeho absolvování pomůže pochopit většinu algoritmů probíraných na přednáškách v onom předmětu. Forma je stejná jako u první části předmětu – řešení úloh z minulých ročníků programovací soutěže a následná diskuse různých řešení studentů. Předmět je ukončen semestrální prací, která spočívá ve vytvoření zadání vlastní úlohy, napsání referenčního řešení a přípravě testovacích dat. Je zajímavé se podívat na věci i z té druhé strany.

[BI-GRA] Grafové algoritmy a základy teorie složitosti → B

Docela zajímavý oborový předmět zabývající se různými grafovými algoritmy, které mají v praxi široké využití, od hledání nejkratší cesty na mapě po optimální rozvržení přednášek do místností. Bojoval jsem s ním však do poslední chvíle. Testy na cvičeních během semestru mi přišly dost těžké, především tím, že se na ně nedalo moc připravit. Nakonec jsem ale body dohnal na dvou programovacích úlohách, teoretickém midtermu a první části zkoušky. Na druhou část zkoušky se totiž také moc připravit nedalo, úkolem bylo analyzovat problém a navrhnout algoritmus pro co nejefektivnější řešení. Problém byl ale dost nepřiměřený tomu, co jsme dělali v semestru. A nebyl to jen můj pocit, úplně správné řešení totiž neměl nikdo.

[BI-OSY] Operační systémy → A

Základní principy fungování všech operačních systémů – komunikace mezi procesy a vlákny, přidělování výpočetního výkonu vláknům, stránkování operační paměti, principy fungování různých souborových systémů. Součástí hodnocení byly 2 programovací úlohy – implementace vícevláknového programu typu producent–konzument a simulace stránkování paměti. U zkoušky pak počítací příklady zaměřené na přesné pochopení jednotlivých oblastí.

[BI-PJP] Programovací jazyky a překladače → A

Další oborový předmět, kde pochopíte, k čemu byla všechna ta teorie v BI-AAG. Výstupem je semestrální práce, jejíž náplní je implementace frontend části překladače pro zjednodušený jazyk Pascal – tedy vytvoření lexikální analyzátoru, syntaktického analyzátoru a překlad do abstraktního syntaktického stromu backendu gcc. Pro plné bodové hodnocení bylo potřeba v jazyce podporovat základní konstrukty jako deklarace a přiřazení proměnné, pole, podmínky, cykly, funkce s parametry a rekurzivní volání.

[BI-PSI] Počítačové sítě → B

Tady jsme se naučili, jak funguje internet a prošli detailně všechny vrstvy modelu ISO/OSI. V laboratořích jsme pak teorii procvičovali konfigurací Cisco routerů. Programovací úlohy spočívaly v napsání TCP klienta a UDP serveru.

Zbývá mi teoreticky poslední rok, ale už teď vím, že si studium ještě o rok prodloužím. Na další dva semestry totiž odjíždím studovat do zahraničí. O tom ale asi napíšu více v dalším článku.

Třetí semestr na FIT ČVUT

Mám za sebou třetí semestr, což také znamená, že už jsem v polovině bakalářského studia. Třetí semestr je doba, kdy je dobré mít vybraný svůj studijní obor, protože tady se začínají lišit doporučené průchody studijním programem. Ještě před nástupem na FIT jsem měl představu, že budu studovat Softwarové inženýrství, praktický obor zaměřený na práci v týmu na reálných projektech.

Nakonec jsem se ale rozhodl pro obor Teoretická informatika. Proč? Nevěnuje se tu tolik času tomu, jak programovací jazyky a nástroje používat k tvorbě aplikací, ale spíše jak skutečně fungují a třeba i jak si vytvořit jazyk vlastní nebo rozšířit existující. Neučí se tedy věci, které mohou být jinak ještě než školu vystudujete, ale základy, na kterých to všechno stojí. Naučit se postavit něco nad tím už je pak podle mě záležitost samostudia a praxe.

[BI-AAG] Automaty a gramatiky → C

aag-strip Z tohoto předmětu je mezi studenty asi největší respekt. Jeho cílem je seznámit s hierarchií formálních jazyků, gramatik, kterými se dají tyto jazyky zapsat, a výpočetních modelů, které tyto jazyky přijímají. Od konečných automatů, přes zásobníkové automaty až k Turingovu stroji. Nakonec základy teorie složitosti a vymezení problémů, které už počítač vyřešit neumí.

Zkouška se skládá z rozstřelu, písemné části a ústní zkoušky. Je to první předmět, u kterého je ústní zkouška povinná součást a neslouží jen k vylepšení známky. Je tedy potřeba opravdu dobře všemu rozumět, umět formálně zapsat, ale i vysvětlit.

[BI-DBS] Databázové systémy → A

Calkem jednoduchý předmět pro každého, kdo někdy pracoval s databází. Začne se uvedením formálního systému relační algebry, která poskytuje teoretický aparát, který je základem všech relačních databázových systémů. Hlavním cílem předmětu je pak naučit se jazyk SQL a vyzkoušet si návrh a implementaci databáze v databázovém stroji Oracle.

[BI-EFA] Efektivní algoritmy → B

První oborový předmět, pojmenoval bych jej spíše Datové struktury. Po zopakování polí a spojových seznamů jsme se vrhli na rozptylovací tabulky, binomiální a Fibonacciho haldy, vyvažované vyhledávací stromy (B–stromy, AVL a Červeno-černé stromy). Během semestru nás čekaly 3 domácí úlohy v Progtestu, při kterých jsme si některé struktury zkusili implementovat. Jsou to sice věci, které člověk neprogramuje každý den, ale hodí se vědět, díky čemu fungují indexy databází nebo file systémů.

[BI-EP1] Efektivní programování 1

Na povinných programovacích předmětech mi vadilo, že nikdy nebylo zveřejněno vzorové řešení. Člověk tedy skoro vždy za úlohy nějaké body získal, ale nikdy se vlastně nedozvěděl, v čem spočívalo efektivní řešení. A říká se, že nejvíce se člověk naučí právě čtením cizího kódu.

I z tohoto důvodu se mi tak líbil tento volitelný předmět. Každých 14 dní je zveřejněno několik úloh převzatých z mezinárodní programovací soutěže ACM. První týden je na každém, aby zkusil vyřešit, co zvládne. Poté jsou na přednášce vysvětleny principy možných řešení, včetně ukázky kódu, a zveřejněna vstupní data. Další týden je pak možnost za menší počet bodů úlohy dopsat.

[BI-SI1] Softwarové inženýrství 1 → B

flowchartNa začátku semestru jsme se rozdělili do týmů, ve kterých jsme si pak vyzkoušeli kompletní proces vývoje informačního systému od sběru a analýzy požadavků, přes návrh až po jeho implementaci. Pro některé studenty je to asi první zkušenost s prací v týmu, používáním verzovacího nástroje a vývoje nějaké reálné aplikace. Já si z toho odnesl jen seznámení s UML notací a potvrdilo se mi, že Softwarové inženýrství jako obor by pro mě nebyla šťastná volba. Většinu těhle věcí se člověk zvládne naučit sám, nebo během prvních pár dní práce ve firmě.

[BI-ZDM] Základy diskrétní matematiky → B

Oproti předchozím semestrům celkem pohodová matematika. Prochází se základy z různých oblastí matematiky, které se nám mohou hodit v jiných předmětech. Matematická indukce, teorie množin, binární relace, kombinatorika, rekurentní rovnice a základy teorie čísel.

[BI-3DT] 3D Tisk → A

Zábavný volitelný předmět, kde si zkusíte postavit 3D tiskárnu, naučíte se programovat parametrické modely v OpenSCAD a pomocí slicovacího nástroje Slic3r připravovat modely pro tisk. Po absolvování předmětu se vám otevřou dveře do 3Dprint Labu, kam si můžete přijít cokoliv vytisknout.

Abych to shrnul, třetí semestr mi přišel v mnohém jednodušší a zajímavější než druhý, ale nic není zadarmo. Pokud však něčemu věnujete dostatečný čas, i zprvu obtížná látka nakonec začne dávat smysl a všechno do sebe zapadne.

Druhý semestr na FIT ČVUT

V červnu jsem zakončil první ročník na FITu. Druhý semestr už byl v mnohém náročnější než ten první, ale také zajímavější. Pojďme si rozebrat jednotlivé předměty.

[LIN] Lineární algebra → E

Zatím nejtěžší předmět, s jakým jsem se setkal. Už jen pro získání zápočtu je potřeba vynaložit nemalé úsilí, i když zápočtové testy jdou napsat stylem nevím co to je, ale umím to spočítat. Před zkouškou jsem se věnoval nepřetržité skoro dva týdny studiu teorie a počítání všech možných typů příkladů. I přes skvělou podporu od vyučujících (konzultační hodiny, odpovídání na dotazy na FB) zápočet dostala jen asi polovina studentů, z nichž polovina u zkoušky neprošla. Předmět je náročný asi hlavně svojí obsáhlostí a množstvím teorie, kterou je potřeba znát.

Linda

[PA2] Programování a algoritmizace → C

Úvod do C++, objektového programování a abstraktních datových typů. Každý týden dvě programovací úlohy odevzdávané a automaticky hodnocené v Progtestu. Zkouškou je obhajoba semestrální práce, na které student samostatně pracuje během semestru. Téma dostal každý náhodně přiřazené, já vytvářel karetní hru Bang! s hrou po síti a umělou inteligencí. Předpokládá se dost samostudia, jelikož náročnost většiny zadání byla mnohonásobně vyšší, než cokoliv, co jsme se učili.

[SAP] Struktura a architektura počítačů → A

Praktické uplatnění některých znalostí z matematické logiky – návrh a minimalizace logických a sekvenčních obvodů, jejich sestavování v Xilinx ISE, následné nahrávání do FPGA přípravku. V druhé polovině semestru jsme poznávali Assembler v AVR Studiu. Při samostatných úlohách se programoval např. displej s posuvným textem nebo časovač bomby s využitím přerušení.

[TED] Tvorba elektronické dokumentace → A

Jeden s lehčích předmětů, naučili jsme se sázet text v LaTEXu, tvořit diagramy v Graphviz, grafy v Gnuplot a generovat dokumentaci ze zdrojového kódu pomocí Doxygen. Také jsme se seznámili se základy typografie.

[ZUM] Základy umělé inteligence → B

Volitelný předmět, který rozhodně můžu doporučit. Postupně se na přednáškách projdou různé oblasti umělé inteligence, některé se i prakticky vyzkouší na cvičeních – prohledávání stavového prostoru, evoluční výpočetní techniky, plánování, multiagentní systémy, teorie her, strojové učení, umělé neuronové sítě. Semestrální prací bylo řešení NP-úplného problému minimálního vrcholového pokrytí grafu pomocí genetického algoritmu (algoritmus inspirovaný biologickou evolucí, který implementuje křížení, mutaci, selekci a některé další pokročilé metody pro diverzifikaci populace).

Líbilo se mi propojení některých předmětů, Doxygen z TED jsem využil při dokumentaci semestrálky z PA2, LaTEX pro semestrálku ze ZUM, kterou jsem pak upravil na semestrálku pro TED. A ZUM se hodily i při programování AI pro semestrálku z PA2 a jeden úkol.

Už se začínám těšit na druhý ročník, který bude určitě zase trochu zajímavější. Ale do té doby musím trochu vydechnout, ještě zbývají 2 měsíce prázdnin.

První semestr na FIT ČVUT

Své osmileté působení na gymnáziu jsem úspěšně završil maturitou. Po trochu delších prázdninách jsem přesídlil do velkoměsta a poprvé vstoupil do budovy FIT ČVUT jako její student. Nyní mám první semestr na fakultě informatiky za sebou. Jak takové čtyři měsíce vypadají z pohledu prváka?

[ČAO] Číslicové a analogové obvody → A

Asi nejlehčí technický předmět. Jde spíše o seznámení se softwarem Wolfram Mathematica. Pomocí různých metod se zapisují jednoduché elektrické obvody a počítá napětí na součástkách. Při testech jsou k dispozici jakékoli materiály včetně internetu. Říká se, že pokud student nedá tohle, tak ani nic jiného.

[MLO] Matematická logika → B

Captain "Tarski" Obvious

Cílem je naučit se základy výrokové a predikátové logiky. Na přednáškách, jejichž náplní je čtení prezentace plné důkazů, ve kterých se ztrácí i přednášející, se to moc nedá. Že na cvičení se toho probere polovina, tomu nijak nepomáhá. Ale samostudiem ve zkouškovém se dá většina látky pochopit.

[PAI] Právo a informatika → C

Právní úpravy, které se hodí v odvětví IT znát. Smluvní právo, elektronický podpis, autorské právo, licence, právo doménových jmen. Zkouška je zaškrtávací formou, výběr ze 4 odpovědí. Jestli se to dá natipovat, chtěl zjistit Joe Reacher.

[PA1] Programování a algoritmizace 1 → B

Progtest. Každý týden nové zadání algoritmické úlohy, každý víkend strávený vymýšlením algoritmu, následnou implementací v jazyku C a debuggováním memory leaků ve Valgrindu. V průběhu semestru malé teoretické testy zaměřené na právě probíranou problematiku. IMHO fail byl ale zkouškový teoretický test, kvůli kterému ještě v průběhu zkoušky museli snižovat hranici, aby vůbec někdo prošel. Jeho obsahem byly všemožné záludnosti Céčka, debuggování rekurzivních funkcí a hledání memory leaků bez použití překladače. Ale Lenka Bártů dostala áčko, tak asi cajk.

[PS1] Programování v shellu 1 → A

Naučíte se ovládat libovolný UNIXový operační systém z příkazové řádky na úrovni pokročilého uživatele. Skrytým účelem je zřejmě nenásilně studenty donutit opustit Windows a přejít na Linux. Pro mě asi nejhodnotnější předmět semestru.

PSnF11

[ZMA] Základy matematické analýzy → D

Limity posloupností, derivace, integrály a hromada teorie k tomu. Bylo pro mě trochu překvapení, když jsme na první hodině probrali látku, co by na gymplu vyšla tak na rok. Časem se člověk do tempa ale dostane, nic jiného ani nezbývá. Taky jsem nikdy dřív nebyl nucen se učit definice nazpaměť. Ale složení zkoušky se mi líbilo, teoretické otázky doplněné o příklady, ve kterých se právě vyslovené definice využijí v praxi. Přesto v rozložení známek Gaussova křivka nějak není vidět.

Takže druhý semester, here we come!

Jak jsem programoval HTML5 hru

Před pár měsíci jsem se zúčastnil výukového on-line kurzu HTML5 Game Developement na Udacity.com. Colt McAnlis a Peter Lubbers z Google v něm vysvětlují základy vývoje her v JavaScriptu s využitím HTML5 elementu <canvas>. Všechny popisované praktiky si lze rovnou prakticky vyzkoušet na připravených úkolech s automatickou kontrolou. Závěrečnou fází kurzu byla soutěž, do které se mohl každý účastník přihlásit s hrou, kterou na základě získaných dovedností vyvinul.

Přišlo mi to zajímavé, tak jsem během týdne vytvořil klon staré známé klasiky Bomberman a nazval jej Bombergirl. Při vývoji jsem použil knihovnu EaselJS, která usnadňuje práci s <canvas> elementem, PreloadJS pro načítání obrázků a SoundJS pro přehrávání zvuků. Mohl jsem se tak soustředit na samotnou funkčnost hry a za relativně krátký čas jsem ji měl hotovou.

Hra má jak single player mód, tak i multi player pro 2 hráče na jednom počítači. Největší výzva byla vytvoření botů. Bylo potřeba vyvážit jejich inteligenci tak, aby se nenechali zabít na první ránu, ale bylo možné je při troše štěstí nebo lsti odpálit.

Můžete si ji zkusit zahrát a prohlédnout si zdrojový kód.

Hra měla u poroty úspěch. Obdržela ocenění v kategorii Most Fun a dokonce se o ní zmínili v pravidelné relaci Coffee Break. Jako výhru mi z Mountain View poslali Chromebook. Můj krátký pohled na něj si můžete přečíst v příspěvku na Google+.

Do kurzu je možné se kdykoliv připojit, takže pokud vás vývoj her zajímá, můžu doporučit. Ačkoliv jsem nikdy předtím žádnou hru neprogramoval, ani netušil jak začít, po dokončení kurzu pro mě nebyl problém během týdne funkční hru napsat.

A určitě doporučuji zkusit i další kurzy na Udacity, já jsem třeba absolvoval Interactive 3D Graphics seznamující s knihovnou three.js a trochu pokročilejší Design of Computer Programs.