[[PageOutline]] = Razvojno okolje za laboratorijske vaje = == Predstavitev okolja == Na vsakem računalniku v učilnici N17 je nameščen navidezni računalnik (''virtualbox'') z operacijskim sistemom Linux, ki vsebuje vsa potrebna orodja za izdelavo naloge. Navidezni računalnik deluje v nespremenljivi (''immutable'') obliki, kar pomeni, da se datoteke na navideznem računalniku ne hranijo stalno. Navidezni računalnik se ob ponovnem zagonu vedno postavi v prvotno stanje ne glede na spremembe datotečnega sistema. Delo (datoteke) je tako potrebno shranjevati na strežnik. Za hranjenje in sledenje spremembam je na strežniku nameščen sistem ''subversion''. Več o tem v nadaljevanju. [[BR]] == Namestitev navideznega računalnika == Virtualni račuanlnik za delo na vaji je možno namestiti tudi doma na računalnik z minimalnimi zahtevami: * 512 MB pomnilnika * 2GB prostega prostora na disku Namestitev poteka v dveh delih: * Najprej namestimo program za virtualizacijo [http://www.virtualbox.org/ VirtualBox] glede na operacijski sistem. Za navadne Windows-e je to [http://download.virtualbox.org/virtualbox/1.6.6/VirtualBox-1.6.6-Win_x86.msi distribucija x86]. Za namestitev je potreben administratorski privilegij. Namestitev navideznega računalnika je potrebno opraviti na privzeto mesto {{{c:\Program Files\Sun\xVM VirtualBox}}} * Namestitev navideznega računalnika za vaje se lahko opravi kot navadni uporabnik. Zapakirano datoteko odpakiramo v začasen imenik, nato pa z dvoklikom na '''namesti''' naredimo premik navideznega diska v uporabniški imenik in hkrati namestimo navidezni računalnik skupaj z ikono na namizju. Po namestitvi lahko preostale datoteke v začasnem imeniku pobrišemo. Če nam iz kakršnihkoli razlogov ne uspe namestiti navideznega računalnika z dvoklikom na '''namesti''', lahko to storimo tako, da v programu Virtualbox ustvarimo nov navidezni računalnik, za katerega nastavimo {{{vaje.vdi}}} kot ''Hard disk''. Navidezni računalnik nato zaženemo s klikom na ikono ''Start'', kot kaže slika 1. [[Image(VirtualBox.PNG)]] Slika 1: Virtual Box Datoteke za namestitev si lahko v laboratoriju tudi zapišemo na ključek USB. [[BR]] == Predstavitev orodij == Za razvoj programske opreme so predvidena naslednja orodja: * '''Terminalsko okno z ukazno lupino''' - To je orodje, pri katerem preko ukazne vrstice pošiljamo ukaze operacijskemu sistemu. V terminalskem oknu se nam izpisujejo tudi rezultati programov. Najbolj pogosto uporabljeni ukazi so: * {{{cd}}} - ''Spremeni direktorij (change directory)'' * {{{ls}}} - ''Pogledamo, katere datoteke imamo pod direktorijem (list)'' * {{{gedit}}} - ''Odpremo urejevalnik besedil Gedit'' * {{{cc}}} - ''ukaz za C-prevajalnik (C-compiler)'' * {{{cp}}} - ''Kopiranje datotek (copy)'' * '''Urejevalnik gedit''' - Gedit je urejevalnik besedil, v katerem se piše izvorno kodo programa. Gre za preprost urejevalnik besedil, ki podpira večino standardnih funkcij urejanja. * '''Razhroščevalnik ''' - Več o tem pod poglavjem Razhroščevalnik. * '''Prenos datotek in komunikacija s strežnikom - subversion''' - Več o tem pod poglavjem Subversion. * '''Brskalnik''' [[BR]] == Makefile == Enostavno grajene programe, kjer je izvorna koda programa zapisana v eni sami datoteki z izvorno kodo, brez težav prevedemo iz ukazne vrstice. Kadar pa je izvorna koda programa razdeljena med več datotek, pa raje uporabimo ''Make''. Pri tem potrebujemo datoteko ''Makefile'' z navodili za gradnjo. Z ukazom {{{make}}} v ukazni vrstici se nato prevedejo vse tiste datoteke, ki so bile od zadnje gradnje spremenjene. Poleg tega je dobra lastnost tudi ta, da moramo datoteko ''Makefile'' napisati le enkrat in ne ob vsakem prevajanju. '''Struktura datotek Makefile''' {{{ #!sh #Ukazna datoteka za make vse: hello readbel hello: hello.c cc -o hello hello.c readbel: readbel.c lupack.o cc -o readbel readbel.c lupack.o -lm -lglut }}} Primer prikazuje prevajanje izvorne kode ''hello.c'' in ''readbel.c''. Primer enostavnega programa, kjer je izvorna koda zapisana v eni sami datoteki, prikazuje program ''hello''. Pri ''readbel'' pa se izvorna koda nanaša še na ''lupack'' datoteke. Ko prevedemo kode, se ustvarijo datoteke programov. V našem primeru gre to za datoteko ''hello'' in ''readbel''. Pri tem je zelo pomembno, da drugo vrstico posameznega "cilja" vedno začnemo s tabulatorjem in ne s presledki! Komentarje v ''Makefile'' pa pišemo z znakom #, kot je razvidno iz primera. [[BR]] == Razhroščevalnik == [[BR]] == Subversion == Subversion je sistem za sledenje spremembam izvorne kode, ki omogoča sočasno delo na skupnem projektu. Pri vsaki shranitvi na SVN strežnik, se shranijo le spremembe datotek, ki so bile dane pod nadzor. S hranjenjem vseh verzij izvorne kode je tako lažje nadzorovati razvoj projekta, slediti spremembam in oceniti njihov vpliv na delovanje celotnega projekta. Ker se hranijo vse verzije določene datoteke, lahko tako delamo le na eni datoteki, ne da bi bilo potrebno shranjevanje stabilnih ali kako drugače pomembnih verzij datoteke. Način dela je tako lahko časovno in prostorsko razporejen. Delo na projektu je s Subversion enostavno razdeliti na manjše naloge, ki jih ob vsaki shranitvi na strežnik na kratko opišemo kot delo, ki ga poslane spremembe kode opravijo. Datoteke ki so že pod kontrolo SVN lahko prosto urejamo z urejevalnikom. Stanje datotek v imeniku SVN izpišemo z ukazom {{{ #!sh svn status ? rezultat.dat M vaja M vaja1.c }}} Vprašaj pred imenom pomeni, da datoteka ali imenik ni pod SVN nadzorom in za take datoteke so možni naslednji ukrepi: 1. Ne zmenimo se za opozorilo. Ker pri večjem številu opozoril lahko kakšno pomembno datoteko spregledamo to ti priporočljiv način dela 1. Če je datoteka pomembna in se je ne da enostavno izpeljati (prevesti) iz drugih datotek, se datoteko da pod SVN nadzor z ukazom {{{ svn add datoteka }}} 1. Nastavimo, katere datoteke se v imeniku ignorirajo. To je priporočeno za vse datoteke, ki so rezultat pretvorbe ali so pomožnega tipa. V imeniku nastavimo spregledovanje datotek z ukazom {{{svn pe svn:ignore . }}} V zgornjem primeru dodamo ignoriranje za vse datoteke s končnico *.dat in vaja1 Datoteke, ki so spremenjene (Modified) imajo pred imenom črko M, kar pomeni, da je lokalna kopija različna od tiste, ki smo jo nazadnje osvežili z ukazom {{{ #!sh svn update }}} Če želimo izpis naših popravkov to naredimo z ukazom {{{ #!sh svn diff datoteka.c }}} ali samo {{{svn diff}}} za vse spremembe v spremenjenih datotekah. Svoje spremembe pošljemo na SVN strežnik z ukazom {{{ #!sh svn ci -m "Spremenjen format izpisa" Sending vaja1.c Transmitting file data .. Committed revision 260. }}} Pri tem se pošljejo na strežnik spremembe vse spremembe spremenjenih datotek. Datoteka vaja1 je bila pod nadzorom in se je vseeno poslala, kot sprememba, čeprav je bilo dodano vaja1 v svn:ignore, kar pomeni, da je svn:ignore le pomoč pri izpisu stanja in ne izključuje datotek, ki jih ročno damo pod SVN kontrolo. Za datoteko vaja1 je bilo to narejeno pomotoma saj izvršnih datotek ne shranjujemo na stražnik, zato lahko z ukazom {{{ #!sh svn del vaja1 }}} hkrati lokalno pobrišemo in označimo datoteko vaja1 za brisanje na strežniku, kar vidimo pri izpisu kot črko D pred datoteko: {{{ svn status D vaja1 }}} Novo datoteko damo pod kontrolo z ukazom {{{ svn add datoteka }}} Podobno velja za imenike in preimenovanja/kopiranja/premikanja datotek kjer uporabimo ukaz {{{ svn mv prvotno.ime novo.ime svn copy prvotno.ime kopija.ime }}} kar je bolje uporabiti kot pa ukaza ADD/DEL saj je pri tem možna sledljivost verzij od prvotne pa vse do zadnje verzije posamezne datoteke, ki se je premikala po imenikih, preimenovala ali kopirala. === SVN Dostop do primerov v projektu vaje === Primere lahko poleg brskanja na WWW strani poberete tudi z ukazom {{{ svn co --username vaje svn://www.lecad.uni-lj.si/rpk/vaje }}} Podajanje uporabniškega imena vaje v navideznem računalniku ni potrebno, saj je to ime že privzeto. Geslo za dostop je ravno tako vaje. Primer za reševanje linearnih enačb si skopirate v svoj imenik z ukazom: {{{ cd cp vaje/lupack.c ipriimek/ cp vaje/lupack.h ipriimek/ cp vaje/example-lin.c ipriimek/ }}} kjer je ipriimek seveda vaš imenik projekta, ki ste ga popreje ravno tako izvozili {{{ svn co svn://www.lecad.uni-lj.si/rpk/ipriimek }}} Ne pozabite si datoteke prijaviti z ukazi {{{ cd ipriimek svn add lupack.* example-lin.c svn ci -m "Primer reševanja linearnih enačb" }}} [[BR]] == Trac == ''Trac'' je programski vmesnik za vaje, ki se uporablja za sprotno preverjanje dela tako na vajah kot tudi doma. Gre za sistem, s pomočjo katerega poteka prikaz, primerjanje in komunikacija pri izvedbi vaj na namenskem strežniku {{{http://www.lecad.fs.uni-lj.si:8000/ipriimek}}} . Ob logiranju s svojim uporabniškim imenom in geslom, nam je omogočeno delo z naslednjimi stranmi: * '''Wiki''' - Uporablja se za izdelavo končnega poročila ob zaključku našega projekta. Več o načinu pisanja na Wiki strani najdemo na povezavi [http://www.lecad.uni-lj.si:8000/vaje/wiki/WikiFormatting WikiFormatting] in [http://www.lecad.uni-lj.si:8000/vaje/wiki/TracWiki TracWiki]. * '''Timeline''' - Na tej strani spremljamo vse spremembe, ki smo jih napravili v času dela. Poleg tega spremljamo prejete in poslane listke ter spremembe, ki so bile napravljene na Wiki strani. * '''Browse Source''' - Tu preverjamo katere datoteke smo dodali na strežnik. Spremljamo lahko tudi spremembe med prejšnjimi naloženimi datotekami. * '''New Ticket''' - Ustvarimo listek, ki ga dobi asistent. [[BR]] == Prvi koraki v C-ju == V tem poglavju bo predstavljeno, kako napisati, prevesti in zagnati svoj prvi program s pomočjo ''terminalskega okna'' in orodja ''gedit(Urejevalnik besedil)''. 1. V terminalsko okno zapišemo ukaz {{{gedit hello.c}}}. S tem povemo, da bomo ustvarili datoteko ''hello.c'' in jo odprli z orodjem ''gedit''. 1. Odpre se nam okno ''hello.c(~) - gedit'', v katerem bomo zapisali kodo našega programa. 1. Koda programa naj bo: {{{ #!c #include int main() { printf("Hello\n"); return 0; } }}} 1. Ko pretipkamo kodo programa, jo shranimo in zapremo ''gedit.'' 1. Sledi prevajanje programske kode. To storimo v terminalskem oknu z ukazom {{{cc hello.c}}} , kjer ''cc'' pomeni ''c compiler(c prevajalnik)''. 1. Če se pri tem ne pojavi nobena napaka, smo uspešno prevedli programsko kodo. Ob tem se ustvari datoteka z imenom ''a.out'', ki predstavlja naš program. 1. Program zaženemo s pomočjo terminalskega okna z ukazom {{{./a.out}}} . Več o osnovah programiranja s programskim jezikom c si lahko ogledamo pod ''Uvod v programski jezik C'' na naslednji povezavi [wiki:c-intro c-intro]. [[BR]] == OpenGL primer == [[Image(Trikotnik.png)]] Slika 2: Trikotnik s prelivajočimi barvami Primer programa, ki nam izriše trikotnik, kot kaže slika 2: {{{ #!c #include void display() { glClear(GL_COLOR_BUFFER_BIT); glBegin(GL_TRIANGLES); glColor3f(1.0, 0.0, 0.0); glVertex2f(-1.0, -1.0); glColor3f(0.0, 1.0, 0.0); glVertex2f(0.0, 1.0); glColor3f(0.0, 0.0, 1.0); glVertex2f(1.0, 0.0); glEnd(); glFlush(); } int main(int argc, char *argv[]) { glutInit(&argc,argv); glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); glutCreateWindow("Trikotnik"); glutDisplayFunc(display); glutMainLoop(); return 0; } }}} Za prevod te kode uporabimo ukaz {{{cc ime_programa.c -lglut}}} , kjer z ''lglut'' povemo, da imamo vključene ukaze in knjižnico ''glut''. Pri tem opazimo, da moramo za grafični izris nekoliko dopolniti funkcijo ''main'' in sicer z argumentoma ''argc'' in ''argv''. Poleg tega moramo klicati še naslednje funkcije: - ''glutInit(&argc,argv)'' - ''glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB)'' - S tem definiramo, da program dela samo v eni ravnini (SINGLE), poleg tega pa definiramo še barve red, green in blue. Poznamo še DOUBLE, kjer dela program v dveh ravninah (program izrisuje na spodnjo ravnino, ko vse izriše, poda rezultat na zgornjo ravnino, ki jo vidi uporabnik). - ''glutCreateWindow("Trikotnik")'' - ''glutDisplayFunc(display)'' - Kličemo podprogram ''display'', v katerem imamo definirano, kaj naj program pravzaprav izriše. - ''glutMainLoop()'' - Predstavlja zanko, ki ponavlja vse funkcije v ''main''. Zanko prekinemo šele, ko zapremo okno. Več o OpenGL si lahko preberemo pod ''Računalniška grafika z OpenGL'' na povezavi [wiki:opengl-intro opengl-intro].