Fabijan Lukin, Fran Pregernik, Tomislav Sukser

Dokumentacija za izradu programa i senzora za obojivo računarstvo

Povratak

5        Pisanje svog programa

5.1    Dodavanje razreda

Nakon svega ovog, bio bi red da pokažemo pisanje jednog jednostavnog programa. Dakle, potrebno je otvoriti projekt ProcessFragment.Programs, i napraviti novi razred u njemu. Mi ćemo napraviti novi razred imena mojVirus i spremiti ga u datoteku MojVirus.cs.

Dodavanje novog razreda

Sada je stvoren novi razred MojVirus unutar imenika (namespace) PaintableSimulator.Programs. Razred kao takav nije dovoljan da bi on postao program. On mora naslijediti apstraktni razred ProcessFragmentBase. Prije toga, potrebno je uključiti navedene using direktive:

using PaintableSimulator.Engine;

using PaintableSimulator.Engine.PaintableComputers.OperatingSystem;

using PaintableSimulator.Engine.PaintableComputers;

using System.Drawing;

Nakon toga trebamo naslijediti razred MojVirus iz razreda ProcessFragmentBase, naredbom iz izbornika Implement Abstract Class. Sada razred sadrži jedno svojstvo – ProcessFragmentId i pet metoda, redom: Install, Uninstall, TransferGranted, TransferRefused, te na kraju Update.

Za početak ćemo  implementirati svojstvo ProcessFragmentId. Ono mora vratiti 32-bitni nepredznačeni cijeli broj, koji će biti jedinstven u svim programima. Dobar izbor bi mogao biti korištenje JMBAG-a, no mi ćemo za ovaj primjer odabrati broj 0x1369. I to ćemo napisati. Dakle, svojstvo vraća 0x1369, a kako je moguće samo njegovo čitanje, dio za pisanje nećemo implementirati; ipak ne bi bilo previše zgodno kada bi program mijenjao svoj identifikacijski broj tijekom izvođenja.

public override uint ProcessFragmentId

{

    get { return 0x1369; }

}

Zatim, ukratko ćemo proći kroz metode Uninstall, TransferGranted i TransferRefused. Ovaj naš virus će imati svojstvo da se širi na sve susjede na kojima se još ne nalazi i da stalno provjerava jesi li svi njegovi susjedi zaraženi, stoga nas uopće ne zanima metoda TransferRefused. Svejedno ćemo kasnije probat ponovo. Dakle, ta metoda ostaje prazna i ne radi ništa. Kad program dobije dopuštenje da kopiranje na neko drugo računalo, pozvat će se metoda TransferGranted. Trebamo li kopiranome programu dati neku informaciju koju će on vidjeti kada dođe na novo obojivo računalo, napisat ćemo nešto u tijelu metode TransferGranted. Kako to kod nas nije slučaj jer se od programa traži uvijek jednako ponašanje, i ova metoda će nam ostati prazna. Nadalje, u metodi Uninstall bi trebali napisati kod koji će počistiti sve što naš program ostavi u obojivom računalu. Postoji razlog zašto ćemo i ovu metodu ostavit praznom. Razlog se svodi na to da mi ustvari ne želimo deinstalirati naš virus i obrisat njegove tragove. U protivnom bi mu valjalo promjeniti ime u nešto benignije (iako i ovako nije pretjerano štetan). Na kraju, ove 3 metode u kodu izgledaju ovako:

public override void Uninstall(byte remainingTimeslots)

{

    // Ništa.

}

 

public override void TransferGranted(ref ProcessFragmentBase copy)

{

    // Ništa.

}

 

public override void TransferRefused()

{

    // Ništa.

}

5.2    Dodavanje smisla postojanju

Nakon rješavanja dosadnog dijela, rješit ćemo i zabavniji. U tom smislu, napisat ćemo tijelo metoda Install i Update. Za početak, razložit ćemo djelovanje virusa na 2 dijela. Jedno će biti njegov dolazak na novo računalo, a drugi dio će biti njegovo širenje. Prvi dio upravo odgovara metodi Install. Kako nam je dovoljan jedan virus po računalu, njegovu instalaciju ćemo dozvoliti samo onda ukoliko se on već ne nalazi na tom računalu. To ćemo provjeriti na jednostavan način da pogledamo koliko ima zapisa za program ovog identifikacijskog broja na podatkovnoj stranici. Ako ih ima, odmah ćemo deinstalirati novi program i ostaviti stari da živi. U protivnom, zapisat ćemo na naše mjesto na podatkovnoj stranici da smo se doselili. Prema tome, tijelo funkcije Install bi uz naše želje trebalo izgledati ovako:

public override void Install()

{

    // Ako postoje naznake da je virus već ovdje...

    if (Api.GetPostCount() > 0)

    {

        // ...deinstalirat ćemo ga...

        Api.QueueUninstall();

        return;

    }

    else

    {

        // ...a u protivnom postavit ćemo na zapis nultog indeksa

        // na stranicu predviđenu za ovaj program oznaku da smo

        // ovdje.

        Api.PostEntry(0, "MojVirus");

    }

}

Nakon što smo rješili postavljanje virusa, trebamo rješiti i njegovo širenje. U tom dijelu nema previše mudrosti. Provjerit ćemo zrcaljene stranice svih susjeda od našeg računala i na svako računalo koje na svojoj stranici nema ćemo poslati njegovu kopiju. Kako bi osigurali konstantnu provjeru da na našem zidu ne bi postojalo niti jedno računalo bez virusa, opisani postupak ćemo smjestiti u metodu Update koja će se pozivati nakon promjena na lokalnoj podatkovnoj stranici ili pri uočenoj promjeni na nekoj od zrcaljenih podatkovnih stranica. U konačnici, tijelo metode Update će izgledati ovako:

public override void Update(byte remainingTimeslots)

{

    // Ići ćemo iteratorom i po svim susjedima

    for (int i = 0; i < Api.GetIOSpaceCount(); i++)

    {

        // i ako dođemo do nekog (i-tog) koji nema oznaku

        // da je zaražen virusom, zahtijevat ćemo

        // kopiranje na njega (na i-tog susjeda).

        if (Api.GetIOPostCount(i) <= 0)

        {

            Api.QueueTransfer(i);

        }

    }

}

5.3    Dodavanje boje

Do sada smo napravili jedan vrlo jednostavan program. No, rezultat njegovog izvođenja nećemo vidjeti na lijepi način, odnosno, jedini način na koji možemo vidjeti njegovu prisutnost je taj da iskoristimo opciju Debug u simulatoru i pregledamo sadržaj podatkovnih stranica. To nam ne odgovara pa ćemo u tu svrhu napisati jedan razred koji će poslužiti za vizualizaciju programa. Razred koji napravimo mora biti naslijeđen iz razreda HomepageColorizer i potrebno je nadjačati metodu Colorize. Deklarirat ćemo naš razred imenom BojanjeVirusa i naslijediti ga iz razreda HomepageColorizer. Nakon toga, u razredu se pojavljuje metoda public override System.Drawing.Color Colorize(Homepage homepage). Njezin je zadatak da iz zapisa s podatkovne stranice vrati boju s kojom će se pokazati obojivo računalo na zidu. Možemo reći da ćemo nezaražena računala obojati u zeleno, a zaražena u crveno. Ako naiđemo na zapis od programa MojVirus na podatkovnoj stranici, smatrat ćemo računalo zaraženim, nezaraženim inače.

Podatkovna stranica sadrži popis ključeva gdje oni imaju vrijednosti identifikacijskih brojeva programa koji su zapisali nešto na podatkovnu stranicu. Proći ćemo kroz sve ključeve i za ključ koji predstavlja identifikacijski broj našeg programa, ukoliko postoji bilokoji zapis, vratit ćemo crvenu boju iz metode. Na kraju, ako nismo pronašli odgovarajući ključ, računalo smatramo nezaraženim i predstavljamo ga zelenom bojom. Kod navedene metode u razredu BojanjeVirusa će na kraju izgledati ovako:

public override System.Drawing.Color Colorize(Homepage homepage)

{

   // Prolazimo kroz sve zapise na podatkovnoj stranici s

    // iteratorom i.

    for (int i = 0; i < homepage.Count; i++)

    {

        // Ukoliko nađemo zapis koji odgovara programu koji ima

        // identifikator kao i MojVirus (0x1369), ...

        if (homepage.KeyList[i] == 0x1369)

        {

            // ... te ako na tom dijelu podatkovne stranice postoje zapisi ...

            if (homepage.DataList[i].Count > 0)

            {

                // ... obojat ćemo računalo u crveno.

                return Color.Red;

            }

        }

    }

 

    // U protivnom, obojat ćemo računalo u zeleno.

    return Color.Green;

}

5.4    Završne pripreme

Na kraju ostaje nam povezati program i razred koji je odgovoran za bojanje. Za ostvarenje toga, razredu MojVirus pridjelit ćemo nekoliko atributa. Prvi od njih je DefaultHomepageColorizerAttribute, čiji parametar je tip razreda BojanjeVirusa. Sljedeća dva atributa su FriendlyDescription i FriendlyName, a oni predstavljaju opis programa i njegov naziv, respektivno. Njihovi su parametri varijable tipa string. Na kraju, dodat ćemo i atribut Serializable. Nakon ovoga, iznad razreda će se pojaviti sljedeći programski kod:

[DefaultHomepageColorizerAttribute(typeof(BojanjeVirusa))]

[FriendlyDescription("Ovo je svježe napisani program")]

[FriendlyName("MojVirus")]

[Serializable()]

public sealed class MojVirus : ProcessFragmentBase { ... }

5.5    Novi program na djelu

Osim navedenih dodataka, potrebno je oba razreda proglasiti javnima i zapečaćenima, dakle napisati public sealed ispred svakog od njih. Na kraju, preostaje nam da prevedemo naš program i pokrenemo ga. Prevođenje napisanih programa se po postavkama projekta obavlja u DLL datoteku PaintableSimulator.Programs.dll u podmapi Plugins, a dotična podmapa se nalazi u mapi koja je u projektu označena kao ciljna mapa za projekt. Tu datoteku trebamo smjestiti u odgovarajuću mapu koja se nalazi gdje i simulator. Na kraju, možemo pokrenuti simulator i diviti se remek-djelu.

MojVirus nakon nekoliko koraka simulacije