sobota 11. června 2011

VUT–FIT: IOS projekt 2 (problém spícího holiče)

Druhý projekt do operačních systémů. Jednalo se o problém spícího holiče.
Získal jsem za to 13 bodů z 15, takže pro inspiraci se může hodit.


Zdrojový kód nalezte ZDE.
Makefile:
barber: main.c
gcc -std=gnu99 -Wall -Wextra -Werror -pedantic -lrt main.c -o barbers




Script na úklid:
#!/bin/bash ids=$(ipcs | grep $(whoami) | awk "{print \$2}") for id in $ids; do ipcrm -m $id 2>/dev/null ipcrm -q $id 2>/dev/null ipcrm -s $id 2>/dev/null done


   1: /**
   2:     - Soubor:  main.c
   3:     - Datum:   2011/04/26
   4:     - Autor:   Matej Marecek
   5:     - Kontakt: xmarec12@stud.fit.vutbr.cz
   6:     - Projekt: Semafory IOS.
   7:     - Popis:   Program implementuje problem spiciho holice pomoci semaforu.
   8:     - Dalsi popis: Napoveda-viz. stranky se zadanim.
   9:     - Verze:   017_stableD
  10:  **/
 

Foto - 22.5.2011





čtvrtek 9. června 2011

Smile Generator

I have created simple smile generator. It is my first non-console application. I am using .NET programming platform and code itself is written in C# and (G)UI is based on (WPF (Windows Presentation Foundation).

String versus StringBuilder:
In first prototype of my application I used algorithms which were using simple .NET strings and this solution proved to be ineffective. Problems occurred when I wanted to generate more lines of smiles. The disadvantage of using strings is, that when you want to append another characters, operating system has to reallocate memory. So when you appending in each cycle another data to string, it is very slow.

Try to write algorithm where is one cycle inside another and in each pass computer has to reallocate memory. If you put high numbers to cycle’s conditions, you can wait forever.

One solution is to use array of chars, like in C/C++ and then create intelligent function, which can double allocated memory if it is needed (that is just example). But in that case, you have to write everything yourself (C# is awesome because you can use lot of libraries). It would be better to write application in C/C++ because it these apps are usually faster than .NET/Java apps.

Fortunately C# has StringBuider Class (System.Text.StringBuilder) and it is very useful when you need to work with long strings.

There is example form Microsoft website:

using System;
using System.Text;

public sealed class Example
{
   public static void Demo(System.Windows.Controls.TextBlock outputBlock)
   {
      // Create a StringBuilder that expects to hold 50 characters.
      // Initialize the StringBuilder with "ABC".
      StringBuilder sb = new StringBuilder("ABC", 50);

      // Append three characters (D, E, and F) to the end of the StringBuilder.
      sb.Append(new char[] { 'D', 'E', 'F' });

      // Exampleend a format string to the end of the StringBuilder.
      sb.AppendFormat("GHI{0}{1}", 'J', 'k');

      // Display the number of characters in the StringBuilder and its string.
      outputBlock.Text += String.Format("{0} chars: {1}", sb.Length, sb.ToString()) + "\n";

      // Insert a string at the beginning of the StringBuilder.
      sb.Insert(0, "Alphabet: ");

      // Replace all lowercase k's with uppercase K's.
      sb.Replace('k', 'K');

      // Display the number of characters in the StringBuilder and its string.
      outputBlock.Text += String.Format("{0} chars: {1}", sb.Length, sb.ToString()) + "\n";
   }
}

// This code produces the following output.
//
// 11 chars: ABCDEFGHIJk
// 21 chars: Alphabet: ABCDEFGHIJK

Optimization:
Optimization is very important aspect in programming. Many orthodox programmers say that apps written in .NET/Java etc. are slow. In some cases it is true. Especially some Java apps are incredible slow. But if you write bad code, your app in assembly language/C/C++ can be much slower than Java. There are many things, which can cause problem with speed. In my Smile Generator I had to solve problems with access to RAM memory.

Processors are very complex and fast devices. In the past decade, processor performance increased rapidly (and RAM not so much). If we compare CPU and RAM, we can see that CPU is much faster and every single access to RAM is like ages for processor. And this is the reason why we should avoid read/write to RAM unreasonably often.

Code examples:

string vystup = "";
              for (int i = 0; i < _lines; i++)
              {
                     for (int j = 0; j <= i; j++)
                     {
                           vystup = vystup + _type + " ";
                     }
                     vystup = vystup + "\n";
              }
              return vystup.ToString();


If we rewrite this code with StringBuilder we will achieve better result with long strings.

StringBuilder vystup = new StringBuilder();
           
              for (int i = 0; i < _lines; i++)
              {
                     for (int j = 0; j <= i; j++)
                     {
                           vystup.Append(_type + " ");
                     }
                     vystup.Append("\n");
              }
              return vystup.ToString() ;



And if we optimize this algorithm, your app becomes even much faster.

StringBuilder vystup = new StringBuilder();
              StringBuilder tmp = new StringBuilder();
              for (int i = 0; i < _lines; i++)
              {
                     tmp.Append(_type + " ");
                     vystup.Append(tmp.ToString() + "\n");
              }
              return vystup.ToString();


The result is this algorithm is:

:-)

:-) :-)

:-) :-) :-)

:-) :-) :-) :-)

:-) :-) :-) :-) :-)

If you want, the app is HERE. :-) (it is still beta version)

pondělí 30. května 2011

VUT - FIT: První semestr

Dnes mi byla opravena poslední semestrální písemka, tak mám konečně čas napsat text, který jsem již hooodně dlouhou dobu odkládal. Vím, že je už konec května a já budu psát o zimním semestru, ale třeba to bude užitečné pro někoho, kdo právě teď maturuje (jo, dneska rozvezli modré maturitní bedny, tak se snažte. :-D ).

"Když jsem se před rokem rozhodoval, co dál dělat, pekařina pro mě byla jasná volba..." respektive byl jsem přijat na Fakultu informatiky Masarykovy univerzity a na Fakultu informačních technologií Vysokého učení technického v Brně. Rozhodl jsem se nakonec pro VUT - FIT, jelikož je zaměřena prakticky (na rozdíl od MUNI, kde je hromada teorie a nakonec vám dají titul Mgr) a navíc jsem na FIT na dni otevřených dveří, kde byla pěkná prezentace toho, že jsou z přednášek dělány záznamy a live streamy atp. Nedělal jsem si iluze, že by FIT byla zrovna fakulta, která se dá vystudovat levou zadní, ale to jak ji prezentovali na DOD vypadalo poměrně optimisticky.

Každopádně koncem září jsem se sbalil, přestěhoval pár věcí na Palačák a hurá do školy. To jsem ještě netušil, jakou "zábavu" následujících měsících zažiji. Především úvodní přednášky byly zajímavé. Většina přednášejících nám totiž ukazovala, kolik lidí vyhodili minulý rok. Grafy to byly vážně pozoruhodné (u některých předmětů), ale připadalo mi to zvládnutelné. Přeci jenom budu mít k dispozici spousty studijních materiálů, když onemocním tak streamy, angličtina není požadovaná při přijetí na školu programování také ne. Ti z vás, kteří si myslí "jo, tak to je v pohodě" a půjdou na tuto školu, velice rychle vystřízliví. Bez středně pokročilé znalosti angličtiny se zde člověk neobejde. Kromě toho, že prakticky všechny věci na počítači jsou anglicky, tak zeptáte-li se na něco doktoranda v laboratořích nebo na oficiálním fóru, odkáže vás na manuálové stránky Linuxu, popřípadě vám pošle odkaz na nějakou stránku v angličtině. Pokud upozorníte na fakt, že angličtina nebyla požadovaná a že umíte jen němčinu, tak se vám na oficiálním fóru k projektu prakticky vysmějí a odkáží na Google Translate.

Jestliže onemocníte a nemůžete na přednášku, tak máte smůlu. Streamy byly zakázány, záznamy se sice pořizuji, ale nezveřejňují, kdo pořádně nepochopil látku na hodině, tak ze slidů to je velice obtížné a pokud čekáte kvalitní oporu, tak máte smůlu a sami přednášející vám řeknou, že je zastaralá a nemáte se z ní učit. Toliko tedy úvod a nyní na popis jednotlivých předmětů.

IZP: Základy programování
Zde je slovo "základy" poněkud zavádějící, jelikož moc základů nedostanete. Na začátku semestru sice existuje kurz, kde vám jakože vysvětlí o čem Céčko je, ale už nikomu nevysvětlí v čem vlastně programování spočívá a jak se má postupovat při tvorbě algoritmů a řešení složitějších úloh. Kdo nikdy předtím neprogramoval, nebude stejně vědět o čem je řeč a kdo na programování nemá ani buňky, tak tam ani chodit nemusí. Ale zase pokud má člověk s programováním nějaké, byť letmé zkušenosti, tak se zde něčemu přiučí.

Co se týče přednášek, doporučuji chodit k přednášejícímu, který se jmenuje po jednom jehličnatém stromu. Jede sice jak drak, ale ví o čem mluví a celkem pěkně demonstruje na praktických příkladech.

K projektům napíši asi jen to, že to je masakr. Kdo je už od začátku nedělá poctivě a sám (to znamená strávit nad tím desítky hodin), tak se s touto školou může velice rychle rozloučit. Už u prvního projektu, kde jsme měli naprogramovat komprimaci textu (ano komprimaci textu a to jsme ani pořádně nevěděli, co to jsou podmínky a iterace) bylo vidět, kdo vyletí a kdo ne. Byli zde i tací, kteří měli jakože "doučování" u někoho staršího, ale ve skutečnosti jim ty projekty psal a sami nic neuměli. A když poté "doučovatel" někam odjel nebo neměl čas, tak dotyčný vyhodil několik stovek komínem, neměl projekt, neudělal tedy předmět a mohl si rovnou balit kufry.

Dalším projektem bylo počítání kotangentu a podobných matematických srand, pomocí Taylorové série + optimalizace výpočtu (doporučuji nasimulovat Taylorovu sérii ve Wolframu, podívat se jak to funguje a až poté optimalizovat). Třetí program měl procházet nějaké bludiště, osmi měrky, bubliny atd. V zadání bylo, že kdo implementuje bubliny ve 3D, dostane bonusový bod navíc. Implementoval jsem tedy 3D bubliny, fungovaly bezchybně, ale jelikož jsem z ostatních částí programu neměl 100% funkčních, tak mi opravující nepřidal ani ten jeden bonusový bod. Tehdy mě to opravdu potěšilo. :-/ Poslední projekt před Vánoci, bylo české řazení seznamů. A aby to nebylo tak jednoduché, tak byla zakázaná lokalizace, funkci na porovnání stringů jsme si museli vymyslet sami a seznamy také. Do toho se už klasicky starat o alokaci a dealokaci paměti atp. Nakonec mi vše fungovalo, tak jak mělo, ale jelikož se mi v jednom specifickém případě nedealokovala trocha paměti (co si pamatuji ,tak to bylo v rámci maximálně několika bajtů), tak jsem přišel celkem o hromadu bodů.

IAS: Asemblery
Celkem normální předmět. Člověk se tam učí, jaké instrukce má procesor atp. Rozhodně to není nic, co by nějak nadchlo, ale musí se nechat, že některé pasáže byly zajímavé a budou se hodit v budoucnu při programování. Každopádně předmět pokročilé asemblery si již raději nezapíši. :-)

IDA: Diskrétní matematika
Na cvičení mě měl pan (teď hromada titulů) K. a na přednášky jsem chodil k (nějaké tituly) D. Paní D. byla příjemná, vyše pěkně vysvětlila a i když mě ta matika nebavila, alespoň jsem neměl nutkání utíkat z přednáše a dokone jsem se přinutil na ní vstávat už v 5:30 ráno. Čas od času sem zavítal také na přednášky pana K., kde bylo vidět, že tomu opravdu rozumí a je na matiku neuvěřitelná bedna, nicméně asi právě proto jsem jeho výkladu vůbec nerozumněl a nebyl jsem zdaleka jediný. Spíše by bylo velice obtížné najít někoho, kdo by jeho výkladu rozumněl. Sic nevím, k čemu mi tato matika byla a bude, tak za ní mám 7 kreditů, jsem rád, že ji mám a osobně považuji pana K. a paní D. za skvělé vyučující (ten komu bude chybět nějaký ten bodí do lepší známky pozná proč jsou tak oblíbení. :-D ).

IUS: Úvod do softwarového inženýrství
Jeden z největších filstrů na škole. Když jsem šel psát semestrální test, tak snad většina lidí, co jsem tam potkal byli druháci, kteří tento předmět opakovali. :-D Osobně si myslím, že tento předmět přišel moc brzy, jelikož pokud není spjatý s nějakým teamovým projektem, tak mu zcela chybí praktická část a jedná se pouze o terii, kterou se člověk musí učit z nic neříkajích slidů. Navíc přednášky jenoho z přednášejích jsou ve stylu předčítání pohádek na dobrou noc. Nic neříkající monolog, kde pouze přečte slovo od slova to, co je napsané na už tak nic neříkajích slidech.

A celkově k IUS? Navrhovat programy v UML mi příjde užitečné, možná bych se tím chtěl i někdy zabývat, ale tak jak nám to bylo podáno, tak se jedná o nic neříkající nudu, která akorát vyhodila spoustu lidí ze školy.

ITO: Teorie obvodů
Obsah předmětu? Viz název. Počítají se napětí, proudy, sestavují diferenciální orvnice atp. Prostě něco, co nemůže nikoho bavit. Tedy za předpokladu, že ten předmět nevyučuje pan docent Kunovský (Doc. Ing. Jiří Kunovský, CSc), který pořád vtipku a je na fakultní poměry veliký lidumil. Dokonce, když byl toální fail u semestrální zkoušky, tak nám místo lyžování vykládal v čem jsme dělali chyby na písemce. Sečteno podtrženo, náplň předmětu mě nebavila, samotný předmět ovšem ano.

pátek 29. dubna 2011

ITW (Tvorba webových stránek) - projekt č. 2 (VUT FIT)

Kdyby se chtěl někdo inspirovat pro tvorbu druhého projektu do předmětu ITW (Tvorba webových stránek), tak může. Mějte ovšem na zřeteli, že v zadání je napsáno:
Veškerý kód musí být vlastním dílem studenta. Při návrhu vzhledu je možno se inspirovat existujícími stránkami, nelze však převzít žádný kód z cizích webů ani z volně dostupných knihoven. Totéž platí i pro JavaScriptový kód.
 Tedy nekopírujte celé kusy kódu, mohlo by se vám to vymstít.
Odkaz na stránky je ZDE. Stránky jsou umístěny na fakultním serveru, takže by tam měly vydržet snad docela dlouho. (http://www.stud.fit.vutbr.cz/~xmarec12/ITW/proj2/index.html).

Pro ty, co neumí efektivně prohlížet zdrojové kódy přímo v prohlížeči tu ještě přidávám JavaScript, který se stará o cookies v sekci "aktuality". Snad k tomu nemusím přidávat komentáře, dá se to pochopit na první pohled. V zásadě se jen testuje několik podmínek a klasicky se "rozsekávají sušenky".

JavaScript pro práci s cookies:

function ShowHideFunc(el_ID){
    el_css = document.getElementById(el_ID).style;
     
    if (el_css.display == 'none')    {  
        el_css.display = 'block';      
        if (el_ID == "aktualita1")
            document.cookie = "PARAGRAPH1=show;expires=Sun, 29 Nov 2015 20:00:00 GMT";
        if (el_ID == "aktualita2")
            document.cookie = "PARAGRAPH2=show;expires=Sun, 29 Nov 2015 20:00:00 GMT";
     
    }
    else{
          el_css.display = 'none';
     
        if (el_ID == "aktualita1")
            document.cookie = "PARAGRAPH1=hidden;expires=Sun, 29 Nov 2015 20:00:00 GMT";
        if (el_ID == "aktualita2")
            document.cookie = "PARAGRAPH2=hidden;expires=Sun, 29 Nov 2015 20:00:00 GMT";
    }
}
function SetSetting(){    
    splitedCookies = document.cookie.split("; ");
    var aktual_1='hidden';
    var aktual_2='hidden';
     
    for (i in splitedCookies){
       cookName = splitedCookies[i].split("=");
       if (cookName[0] == "PARAGRAPH1")
            aktual_1 = cookName[1];
       if (cookName[0] == "PARAGRAPH2")
            aktual_2 = cookName[1];
    }
 
    if (aktual_1 == "on"){
        styl_p = document.getElementById("aktualita1").style;
        styl_p.display = 'block';
    }  
    if (aktual_1 == "hidden"){
        styl_p = document.getElementById("aktualita1").style;
        styl_p.display = 'none';
    }
 
    if (aktual_2 == "show"){
        styl_p = document.getElementById("aktualita2").style;
        styl_p.display = 'block';
    }  
    if (aktual_2 == "hidden"){
        styl_p = document.getElementById("aktualita2").style;
        styl_p.display = 'none';
    }  
}

CSS kód:

Někdy může být zádrhel i CSS, tak se popřípadě můžete inspirovat následujícími konstrukcemi (z důvodů úspory místa jen prvních pár řádků. Celé CSS naleznete ZDE). Samozřejmě neručím za správnost a některé prvky jsou zatím čistě experimentální a podporují je jen některé prohlížeče.

btw: text-align: left je v body jen kvůli IE.
body {
background-color: #232323;
text-align: center;
}
#omni {
font-family: Arial, calibri, Helvetica,  sans-serif;
width: 850px;
margin: 0 auto;
text-align: left
}
#head {
height: 100px;
border: 1px solid rgb(155, 155, 155);
border: 1px solid rgba(255, 255, 255, 0.1);    
border-radius: 7px;
box-shadow: 2px 2px 7px rgba(10, 10, 10, 0.8);
background-image: url(imgs/logo/txt_logo_01.png);
background-color: #292929;
color: #6C6C6C;
}

pondělí 31. ledna 2011

VUT - FIT: ITO - semestrální projekt

Pro příští generace, jenž budou tvořit semestrální projekt do Teorie obvodů.
Znovu upozorňuji, že se níže zveřejněný dokument slouží pouze pro studijní účely, ne pro opisování a přestože jsem z něj dostal plný počet bodů, tak neručím za 100% správnost.
Odkaz na stáhnutí máte ZDE.

sobota 18. prosince 2010

VUT - FIT: IUS - 2. projekt (Dokumentace k 2. projektu do IZP)

Kdo by se chtěl inspirovat mou dokumentací k druhému projektu do IZP, tak může. Upozorňuji ovšem, že tento dokument je zveřejněn pouze pro studijní účely a je stále chráněn autorským zákonem. Tudíž se k této dokumentaci chovejte, tak jak se sluší a patří. ;-)
Odkaz na stáhnutí máte ZDE.