pondělí 23. ledna 2012

VUT FIT - INP projekty

Projekt 1 (maticový displej):
Download projekt 1: http://cejky.xf.cz/all/VUT/INP/xmarec12-svitici_display.zip
Donwload projekt 1 mirror1: https://docs.google.com/open?id=0BzEavpv8QogcNTQyYzcwNjctNzA1YS00YTMzLTk4OWQtMzMyNjcxYzY2Mjcx

Projekt 2 (Brainfuck processor):

Download projekt 2: http://cejky.xf.cz/all/VUT/INP/xmarec12-Brainfuck_precossor.zip
Donwload projekt 2 mirror1: https://docs.google.com/open?id=0BzEavpv8QogcM2I0MTY1MzUtMjJlYi00MGE0LThkNGMtYTFjMGRlOWMwYzQy



VUT FIT - IAL projekty

Vyřešené úlohy jsou z roku 2011/2012. Za všechny jsem získal plný počet bodů.

Projekt 1:
Download projekt 1: http://cejky.xf.cz/all/VUT/IAL/DU1.zip
Download projekt 1 mirror1: https://docs.google.com/open?id=0BzEavpv8QogcOWZmZDk5ZjQtNWZlYy00MmU3LWI1ZDYtMGRjN2YwZmE0YmM4

Projekt 2:
Download projekt 2: http://cejky.xf.cz/all/VUT/IAL/DU2.zip
Download projekt 2 mirror1: https://docs.google.com/open?id=0BzEavpv8QogcOGFkN2JiZmEtODkwMC00MjVlLWJhYmUtMWUwYTkwZWYzY2Uy

VUT FIT - ISS projekt

Filtrace obrazu v Matlabu. Kód je tady:




%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%ZAOSTRENI OBRAZU
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
iptsetpref('UseIPPL', false);
obrazekOrig = imread('xmarec12.bmp'); %nacteni originalniho obrazku
obrazekSoucasny = imread('xmarec12.bmp');
vystupniImg = 'step1.bmp' %ulozeni vystupniho jmena do promenne


maticeZaostreni = [ -0.5 -0.5 -0.5; -0.5 5 -0.5; -0.5 -0.5 -0.5];
zaostrenyImg = imfilter(obrazekSoucasny, maticeZaostreni);


imwrite(zaostrenyImg, vystupniImg); %ulozeni obrazku


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%OTOCENI OBRAZU
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
vystupniImg = 'step2.bmp'; %ulozeni vystupniho jmena do promenne
preklopenyImg = fliplr(zaostrenyImg); %preklopim obrazek


imwrite(preklopenyImg, vystupniImg); %ulozeni obrazku


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%MEDIAN OBRAZU
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
vystupniImg = 'step3.bmp';
medianImg = medfilt2(preklopenyImg, [5 5]);


imwrite(medianImg, vystupniImg); %ulozeni obrazku


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%ROZMAZANI OBRAZU
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
vystupniImg = 'step4.bmp';
maticeRozmazani = [1 1 1 1 1; 1 3 3 3 1; 1 3 9 3 1; 1 3 3 3 1; 1 1 1 1 1] / 49;
rozmazanyImg = imfilter(medianImg, maticeRozmazani);


imwrite(rozmazanyImg, vystupniImg); %ulozeni obrazku


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%CHYBA V OBRAZE
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
porovnavanyImg = fliplr(rozmazanyImg);


porovnavanyImgDouble = im2double(porovnavanyImg);
obrazekOrigDouble = im2double(obrazekOrig);


chyba = 0;


velikostObrazku = size(obrazekOrig);
velikostObrazkuX = min(velikostObrazku);
velikostObrazkuY = max(velikostObrazku);


for(i=1:velikostObrazkuX)
for(j=1:velikostObrazkuY)
chyba = chyba + abs(obrazekOrigDouble(i, j) - porovnavanyImgDouble(i, j));
end;
end;


vyslednaChyba = (chyba / (velikostObrazkuX * velikostObrazkuY))*255


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%ROZTAZENI HISTOGRAMU
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
rozmazanyImgDouble = im2double(rozmazanyImg);
vystupniImg = 'step5.bmp';


min1 = min(rozmazanyImgDouble);
vstupL = min(min1);
max1 = max(rozmazanyImgDouble);
vstupH = max(max1);


vystupL = 0.0;
vystupH = 1.0;


roztazenyImg = imadjust(rozmazanyImg, [vstupL vstupH], [vystupL vystupH]);
imwrite(roztazenyImg, vystupniImg); %ulozeni obrazku


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%MERODATNA ODCHYLKA
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
rozmazanyImgDouble = im2double(rozmazanyImg);
stredniHodnaBezHist = mean2(rozmazanyImgDouble)*255
smerodatnaOdchylkaBezHist = std2(rozmazanyImgDouble)*255


roztazenyImgDouble = im2double(roztazenyImg);
stredniHodnaSHist = mean2(roztazenyImgDouble)*255
smerodatnaOdchylkaSHist = std2(roztazenyImgDouble)*255


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%KVANTIZACE OBRAZU
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
N = 2;
a = 0;
b = 255;


vystupniImg = 'step6.bmp';
vysledekKvantizace = zeros(velikostObrazkuX, velikostObrazkuY);
tmpImg = double(roztazenyImg);
for(i=1:velikostObrazkuX)
for(j=1:velikostObrazkuY)
vysledekKvantizace(i,j) = round(((2^N)-1)*(tmpImg(i, j)-a)/(b-a))*(b-a)/((2^N)-1) + a;
end;
end;


vysledekKvantizace2 = uint8(vysledekKvantizace);
imwrite(vysledekKvantizace2, vystupniImg); %ulozeni obrazku


Download: http://cejky.xf.cz/all/VUT/ISS/xmarec12-ISS_project.zip 
Download mirror1: https://docs.google.com/open?id=0BzEavpv8QogcMDBhNjc5ZDUtMzc3Ni00ZjM1LTk2MTctNzNhNDc2ZWZiNDMy

VUT FIT – 3. semestr

Třetí semestr byl na VUT FIT asi nejtěžší od doby, co tam jsem. V tomto semestru je hodně učení, teamový projekt do IFJ a času málo. Jednoduchá rada, která se vám bude hodit, zní: začněte s projekty co nejdříve. Člověk si totiž ani nestačí zvyknout na školu a už se píší půlsemestrálky. Přibližný počet je 1 písemka na týden, tedy měsíc učení a potom už budete do Vánoc dělat jenom na projektech. Vánoce strávíte přípravou na ISS a INM, potom se celý leden učíte na zbytek. Když obětujete tolik času učení, nakonec s trochou štěstí dáte všechno na poprvé a můžete si užívat dva týdny volna jako já… A potom hurá do letního semestru.



IAL (Algoritmy):
Předmět, o kterém jsem si myslel, že mi toho hodně dá. A v zásadě. Něco mi dal. Datové struktury, standardní vyhledávací a řadící algoritmy atd. To všechno jsem se tam naučil. Teď jde o to, jakým způsobem. Předmět je sám o sobě poměrně dobře koncipován, ovšem vyučuje jej… No koukněte se na stránky předmětu. Přednášky jsou nezáživné, půlka výkladu je o tom, jak bylo na vojně, jak panu profesorovi svítilo slunce do očí, když jel autem a Hitler-like projevy o tom, že „Cečko je mor, který se rozšířil po světě“, „Pascal je matematicky čistý a správný programovací jazyk“ a podobné nesmysly.

Slidy a opora jsou samozřejmě s Pascalovskými ukázkami algoritmů a plné chyb. Pokud se z těchto materiálů učíte a nechápete, jak nějaký algoritmus může fungovat, tak je prezentován, tak máte dost vysokou pravděpodobnost, že chyba není ve vaší hlavě, nýbrž ve studijních materiálech. Chcete-li na chybu upozornit a doufáte-li, že bude opravena, tak jste opravdu naivní. :-D V tomto předmětu se takové věci nevedou. Když se na nějaké chyby ve slidech přijde přímo na přednášce, tak se to odbude slovy, že ti co jsou na přednášce, o té chybě ví a zbytek má smůlu.

A jak se připravit na zkoušku? Algoritmy se naučte z Wikipedie a to, co je v opoře se naučte jen nazpaměť jako básničku. Není třeba informace z opory chápat, ale jen se našprtat. V zadání se totiž objevují příklady typu „máte algoritmus a najděte chybu, doplňte řádek atd.“ a jelikož je to jen zkopírované z opory a navíc i s chybami o kterých se neví, tak se vám může jednoduše stát, že přestože perfektně chápete Shell-Sort, tak nebudete schopni daný příklad vyřešit, jelikož nevíte, jak to je v opoře. Navíc, jak nám bylo řečeno na přednáškách „Tento předmět není o vaší kreativitě.“, tak to vezměte jako fakt a ani se nesnažte na tom cokoli měnit. Myslete si o tom, můžete svoje.
Projekty: http://matejmarecek.blogspot.com/2012/01/vut-fit-ial-projekty.html
Hodnocení: obsah=6/10, vyučující=1/10.

IFJ (Formální jazyky a překladače):
Bezpochyby nejpřínosnější předmět tohoto semestru. Slidy opravdu vynikající (dělal je ještě nebožtík Roman Lukáš R.I.P.). Přednášky, na ty se opravdu vyplatí chodit už jenom kvůli přednášejícímu. Meduna do vás tu látku dostane, i kdybyste sami nechtěli (pozor ovšem na Burgetovou. Ta je sice chytrá, snaživá atd., ale okamžitě u ní usnete.)

Hlavním přínosem je tedy teamový projet, kde jsme letos dělali interpret jazyka LUA. Tady se člověk může opravdu vyřádit. Je to sice těžké až to bolí, ale zkušenosti, které vám to dá, jsou neocenitelné. A pokud něčemu nerozumíte, doktorandi ochotně vysvětlí.
Projekty: http://matejmarecek.blogspot.com/2012/01/ifj-projekt-formalni-jazyky-prekladace.html
Hodnocení: obsah=9/10, vyučující=10/10.

INM (Numerická matematika a pravděpodobnost):
Jediná matematika, o které si myslím, že mi k něčemu byla. Na přednášky se vyplatí chodit k „Horstovi“. Sice ho nemám rád, ale pravda je, že naučí (a také je u něj většinou narváno).
Hodnocení: obsah=7/10, vyučující=6/10.

INP (Návrh počítačových systémů):
Další HW předmět. Tentokrát zajímavější než jeho předchůdci. Vede to pan profesor Sekanina, který je poměrně dobrý přednášející. Rozhodně se vyplatí k němu na přednášky chodit. Řekne vám spoustu zajímavostí a u každého tématu řekne, co bude vyžadovat u zkoušky. A u zkoušky vám dá opravdu to, co řekl, že musíte umět + to, co MUSÍTE znát z předcházejícího studia (Moorovy a Mealyho automaty atp.)
Projekty: http://matejmarecek.blogspot.com/2012/01/vut-fit-inp-projekty.html
Hodnocení: obsah=7/10, vyučující=8/10.



ISS (Signály a systémy):
Já nevím. Toto nechám asi bez komentáře. Nepřijde mi, že by mi tento předmět něco dal, což je smůla, jelikož jeho garant je skvělý přednášející a snaží se vyjít studentům vstříc. Nicméně samotný obsah předmětu mě zaujal jen minimálně.
Projekty: http://matejmarecek.blogspot.com/2012/01/vut-fit-iss-projekt.html
Hodnocení: obsah=3/10, vyučující=8/10.

FCE (Angličtina: příprava na zkoušku FCE):
Myslel jsem, že tam připraví na FCE, ovšem šeredně jsem se zmýlil. Asi to bude tím, že letos to vedla otřesná „učitelka“ a spíše jsem toho více zapomněl, než se naučil. Toto bylo opravdu jedno veliké zklamání.
Hodnocení: obsah=2/10, vyučující=3/10.

IW1 (Desktop systémy Microsoft Windows):
Myslel jsem, že se tam naučím i něco, jak přesně Windows fungují v jádru, ale bohužel. Tento předmět je více o nastavení, zabezpečení, sdílení zdrojů, deploymentu atd. Takže klikání a cmd. Na druhou stranu něco se ze slidů pochytit dá (na přednášky jsem nechodil, přednášející mluvil jako totální čecháček a já ho nedokázal poslouchat), takže ten předmět byl alespoň užitečný do praxe.



Navíc jsem si MCP zkoušku (70-680), tak mám alespoň nějaký oficiální papír, že něco umím. Pokud tedy nevíte, co si vybrat a chcete něco, kde si můžete udělat alespoň nějaký certifikát, přičemž je vám jedno, že se všechno musíte naučit sami, tak tento předmět může být vhodný kandidát na zaplnění kreditové mezery.
Hodnocení: obsah=7/10, vyučující=5/10.

neděle 22. ledna 2012

IFJ projekt (Formální Jazyky a Překladače VUT FIT - LUA interpret)

Letos jsme měli za úkol udělat do IFJ interpret podmnožiny jazyka LUA. Kdo neví, co to je, Google určitě poradí.

Vzhledem k tomu, že se jedná o první teamový projekt na VUT FIT (3. semestr), tak si myslím, že spíše než popis tvorby interpretu by se hodilo mým nástupcům pár rad o tom, jak pracovat v teamu. Jedná se totiž o něco zcela diametrálně odlišného, než na co jste byli zvyklí doposud. Ať už jste v prvních dvou semestrech programovali na fakultě cokoli, tak stačilo dodržet zadání a základní programátorské zvyky a s projekty nebyly problémy (tedy byly, ale to se týkalo spíše technického hlediska).



Jak tedy projít IFJ? V první řadě si sežeňte kvalitní team. Nejlépe do toho jděte s lidmi, které znáte a o kterých víte, že na tom projektu budou opravdu pracovat. Pokud budete míst smůlu a zbyde na vás banda nespolehlivých „vocasů“, tak je jedno, jak dobří jsou to programátoři. S tímto projektem neuspějete. Viděl jsem na vlastní oči, jak team celkem dobrých programátorů ještě tři týdny před odevzdáním projektů plánoval a jen povídal o tom, že „za pár dní se do toho pustíme“ a týden před konce začali a zjistili, že je čeká tolik problémů, že nemají šanci. Nakonec dostali tak málo bodů, že jim to nestačilo ani na zápočet.

Další, co je potřeba udělat, tak je zvolit si vedoucího teamu. Pokud nechcete práci navíc a nevěříte si na to, tak do toho ani nejděte. Mohlo by to dopadnout špatně. Na druhou stranu pokud o sobě víte, že jste spolehlivý, věříte si a nechce se vám další rok IFJ opakovat, tak s chutí do toho. Lepší je mít více práce a starostí a mít jistotu, že se bude doopravdy pracovat, než toto místo přenechat někomu, kdo ani neumí komunikovat s lidmi, jeho spolehlivost se blíží nule a chce tuto pozici jen proto, že si myslí, že se bude moci ulívat. Pokud vás povede takový člověk, tak je šance na úspěšné odevzdání projektu mizivá a i toto se už pár teamům stalo.

Co se také nesmí podcenit je začátek prací. Co nejdříve si v teamu rozdělte úkoly. Pokud jste vedoucí a znáte svůj team, vezměte si tužku a papír a udělejte rozpis toho, co kdo bude dělat. Abych se přiznal, tak tato práce mi trvala skoro dvě hodiny. Musel jsem si prostudovat strukturu programu/projektu zhodnotit obtížnost jednotlivých částí a poté se rozhodnout co komu přidělit. Tuto část se opravdu nevyplácí podceňovat a prodiskutovat s ostatními. U rozdělování prací zohledněte také charakterové vlastní, časové možnosti a schopnosti lidí v teamu a zeptejte se, kdo by si, co přál dělat. Pokud je v teamu někdo, kdo rád odkládá povinnosti, tak mu dejte práci, která se dá dělat už od začátku, a dohlížejte na něj. Když máte někoho schopného, dejte mu těžší část, pokud někdo studuje další školu a nemá moc času, nechte ho dělat dokumentaci a testovací skripty. A pokud opravdu chcete mít přehled o tom, jak se projekt vyvíjí, tak si jako vedoucí vezměte na starost programování syntaktického analyzátoru. Vzhledem k tomu, že se v tomto projektu jedná o syntaxí řízený překlad, tak budete mít přehled opravdu o všem. Od parseru až po interpret a datové struktury.

Syntaktická analýza je obecně nejtěžší a nejkomplexnější část projektu a skládá se ze dvou částí. Rekurzivního sestupu, kde se implementuje gramatika a vše se řídí a vyhodnocování výrazů, které je s první částí úzce propojeno. Pokud si zvolíte syntaktickou analýzu, tak vřele doporučuji dát vyhodnocování výrazů někomu, s kým jste v neustálém kontaktu. Nejlépe, pokud s vámi bydlí přímo na koleji/bytě. Bude určitě často konzultovat a měnit spoustu věcí.



Pokud vám jde projet +- zdárně a už budete pomalu končit (blíží se termín odevzdání), ověřte si, že člověk, který pracuje, na interpretu ví, co dělá a jak to navázat na syntaktickou analýzu. Ono je totiž poměrně nepříjemné 3-4 dny před odevzdáním, že člověk, který má na starosti interpret se inspirovat projekty z minulých let do té míry, že výsledek jeho práce není ve vašem projektu zrovna dvakrát použitelný. Potom vás totiž čekají 3 dny zavřených na kolejích (4 lidi) a pracujících do 5 do rána. A toto je opravdu zabijácký způsob „dokončování“ projektu.

V takovémto nasazení se opravuje, buší kód a vymýšlí, jak to jen jde a na takové věci, jako korektní uvolňování paměti už nezbývá moc času. A všichni víme, jak to je s C. Navíc u takového složitého projektu je velice obtížné udělat korektní uvolnění paměti. Naštěstí někdo v teamu (myslím, že spolubydla) dostal nápad udělat garbage collerctor. A on to je opravdu hodně dobrý nápad. Trvalo mi jen hodinku – dvě než jsem naprogramoval vlastní GC a výsledek… „no leaks are possible“. Tedy naprosto elegantní zabití hromady much jednou ranou.

A ještě jedna užitečná rada: 
Udělejte si automatické testovací skripty a vyčleňte jeden výkonnější NB nebo server k nepřetržitému testování u ladění programu. V tak složitých programech stačí změnit jednu řádku kódu, o které si myslíte, že nic neovlivní a za pár hodin se divíte, jak tam vznikla nějaká skrytá chyba, která tam předtím nebyla.

Good luck/Have fun pro mé nástupce v dalších letech. ;-)
Dokumentace:
https://docs.google.com/open?id=0BzEavpv8QogcMmRiNWU0NzYtY2M2YS00YzI1LWE0MzgtNzhjNzZiMjk1ZTRj


Download project: https://docs.google.com/open?id=0BzEavpv8QogcZGExOWM2NmEtMWRjMS00NTkzLTlkYmYtNjc3YmQzMGIzODRl