Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

ITKP102 Ohjelmointi 1

Tämä on Jyväskylän yliopiston järjestämän ITKP102 Ohjelmointi 1 -opintojakson oppimateriaali.

Tervetuloa opiskelemaan ohjelmointia! 😍

Tällä opintojaksolla käsitellään ohjelmoinnin perusteita C#-kielellä. Opintojaksolla opit

  • rakenteisen ohjelmoinnin perusperiaatteita,
  • ratkaisemaan yksinkertaisia ongelmia sopivilla algoritmeilla ja tietorakenteilla,
  • suunnittelemaan ja toteuttamaan pienimuotoisen pelin C#-kielellä ja siihen tarkoitetuilla työkaluilla.

Et tarvitse aiempaa ohjelmointikokemusta.

Miten aloitan?

Ennen kuin aloitat opintojakson suorittamisen, tee seuraavat asiat:

  • Tutustu opintojakson suorittamisen periaatteisiin (ks. Suorittaminen).
  • Suosittelemme, että asennat valmiiksi tarvittavat ohjelmistot ja työkalut. Voit kuitenkin selailla materiaalia jo ennen työkalujen asentamista.
  • Pyydämme, että käyt vastaamassa alkukyselyyn.

Uutiset

1. tammikuuta 2026: Kurssimateriaalia uudistetaan keväällä 2026

Teemme kokonaisvaltaisen uudistuksen oppimateriaaliin sekä tehtäviin kevään 2026 aikana. Osa materiaalista julkaistaan kurssin edetessä, osa on vielä TIMissä ja osa siirretty uuteen materiaaliin. Uudistamisesta johtuen sisällössä voi olla myös keskeneräisyyksiä ja virheitä. Pahoittelemme tästä mahdollisesti aiheutuvaa haittaa. Pyydämme, että ilmoitat virheistä tai parannusehdotuksista GitHubin kautta (katso tämän sivun alareuna) tai suoraan opettajien sähköpostiin ohj1-opet@jyu.onmicrosoft.com.

Tuki ja palaute

Kevään 2026 on 12. tammikuuta – 24. huhtikuuta välisenä aikana tarjolla lähiohjausta Agoralla, etäohjausta Teamsin kautta, sekä sähköpostitukea.

Pääsiäistauon aikana (30.3. – 6.4.) ei kuitenkaan ole ohjausta tarjolla.

Sisu vaatii ilmoittautumisen yhteydessä valitsemaan ohjausryhmän. Voit kuitenkin täysin vapaasti käyttää kaikkia ohjausaikoja ja -kanavia riippumatta siitä, mihin ohjausryhmään olet ilmoittautunut.

TukikanavaAikaPaikka/Linkki
Lähiohjauske 8-18, to 8-18, pe 8-14Agoralla luokat Ag B212.1 Finland ja Ag B211.1 Sovjet
Etäohjauske 8-18, to 8-18, pe 8-14Ohjelmointi 1 Teams-kanava
Vastuuopettajien ja tuntiopettajien sähköpostiosoiteJatkuvaohj1-opet@jyu.onmicrosoft.com

Ohjaukset ovat yhteisiä TIEP111 Ohjelmointi 2, ITKP102 Ohjelmointi 1- ja ITKA2004 Tietokannat ja tiedonhallinta -opintojaksojen kanssa. Ohjaajat auttavat kaikkien kolmen kurssin opiskelijoita.

Ohjausaikoja saatetaan lisätä tai poistaa kysynnän mukaan; kerro aikatoiveistasi opettajille sähköpostitse.

24.4. jälkeen ohjausta on saatavilla ajanvarauksella. Linkki ajanvaraukseen tulee myöhemmin saataville.

Miten saan Sisun kalenteriin ohjausaikoja näkyviin? (Avaa ohje klikkaamalla)
  1. Kirjaudu Sisuun

  2. Jos olet jo ilmoittautunut kurssille, klikkaa ylhäällä välilehteä Opintokalenteri tai klikkaa sitä hampurilaisvalikosta

  3. Selaa oikealla oikea kurssi näkyville, eli tässä tapauksessa Ohjelmointi 1

  4. Klikkaa oikealla olevaa oikealle osoittavaa väkästä Ohjelmointi 1 -kurssin kohdalla

    Image

  5. Skrollaa alaspäin, kunnes tulee alaotsikko Pääteohjaus

  6. Jos ei vielä näy, niin skrollaa alaspäin, kunnes näkyy Muiden ryhmien tiedot ja klikkaa sitä

  7. Nyt voit skrollaamalla alaspäin haluamiesi pääteohjauksien kohdalta klikata nappulaa Näytä tapahtumat kalenterissa.

    Image

  8. Nyt kyseisen ryhmän ohjausajat näkyvät sinulla automaattisesti. Tarvittaessa voit poistaa ryhmän tapahtumia viikkokohtaisesti Tapahtumakalenterista.

Ohjeet Teams-ohjauksiin liittymiseksi (tutkinto-opiskelijat)

  1. Kirjaudu yliopiston tunnuksellasi Microsoft Teamsiin osoitteessa https://teams.microsoft.com. Käyttäjätunnus on muotoa käyttäjätunnus@jyu.fi (esim. mameikal@jyu.fi). Tunnuksen muoto student.jyu.fi ei käy. Tunnuksen toimiminen vaatii, että olet hyväksynyt Office 365 -palvelut OMA-palvelussa (https://sso.jyu.fi).

  2. Lataa Teams-sovellus (suositus) tai käytä nettiversiota. Saatavilla on myös mobiilisovellus. Jos selaimella liittymisessä on ongelmia, tarkista ensin tukeeko Microsoft sitä täältä.

  3. Teams-sovelluksessa klikkaa Teams Join or create team Join a team with a code

  4. Syötä koodi fb8q3qa

  5. Testaa kaverin kanssa, että puhelu ja ruudun jakaminen toimii. Sinun tulee tarvittaessa sallia oikeudet käyttöjärjestelmäsi asetuksista.

Ohjeet Teams-ohjauksiin liittymiseksi (avoin yliopisto, erilliset opinto-oikeudet)

Lähetä sähköpostilla alla oleva pyyntö osoitteeseen ohj1-opet@jyu.onmicrosoft.com.

Hei,

opiskelen Ohjelmointi 1 -kurssilla ei-tutkintoon johtavassa koulutuksessa.
Pyydän liittämään minut Ohjelmointi 1 -kurssin Teams-ryhmään vieraana. 
Teamsissa käyttämäni sähköpostiosoite on: [oma sähköposti tähän].

Terveisin, [oma nimi]

Liitämme sinut viimeistään seuraavana arkipäivänä.

Etäohjauksiin osallistuminen ilman Teamsia

Jos et millään onnistu kirjautumaan Teamsiin tai et halua olla Teams-kanavalla, voit pyytää etäohjausta Zoomin kautta seuraavasti:

  1. Asenna Zoom sovellus koneellesi osoitteesta https://zoom.us/download (muut kuin tutkinto-opiskelijat) tai https://jyufi.zoom.us (tutkinto-opiskelijat; Valitse Download Client ihan alhaalta)
  2. Kirjaudu Zoomiin valitsemallasi tilillä, esim. Google-kirjautumista käyttäen (muut kuin tutkinto-opiskelijat) tai Single Sign-on / SSO -toiminnolla (tutkinto-opiskelijat; käytä company domainia jyufi)
  3. Aloita kokous New meeting toiminnolla
  4. Testaa Audio Test speaker & mikrofone toiminnolla että äänet pelittää
  5. Ota kokouslinkki talteen Participants Copy invite link
  6. Avaa ohjauspyyntölomake: https://forms.gle/5QULUPBHjjqS4ndf6
  7. Täytä omat tietosi ja HUOM Pasteta lisätietokenttään kohdassa 5 kopioimasi linkki
  8. Odota että ohjaaja tulee huoneeseesi. Saatat joutua hyväksymään hänen sisäänpääsyn (riippuu kokoushuoneesi asetuksista)

Tässä muutama pikavinkki tässä materiaalissa navigoimiseen:

  • Sisällysluettelon saat auki ja kiinni sivupalkki-kuvakkeesta .
  • Voit selata materiaalia eteen- ja taaksepäin nuolikuvakkeista sivun vasemmassa ja oikeassa laidassa (tai ihan sivun alalaidassa, jos käytät mobiililaitetta) .
  • Hakutoiminnon saat auki suurennuslasista oikeasta yläreunasta tai painamalla S-kirjainta näppäimistöltä .

Palaute ja kehittäminen

Olemme erittäin kiitollisia kaikesta palautteesta, joka auttaa meitä kehittämään opintojaksoa edelleen! Voit antaa palautetta ja kehitysehdotuksia opintojaksosta kolmella tavalla:

  1. Jyväskylän yliopiston tutkinto-opiskelijat voivat antaa jatkuvaa palautetta opintojakson aikana Norppa-järjestelmässä. Nyt, kun olemme kehittämässä opintojakson sisältöjä ja toteutusta, tämä jatkuva palaute on erityisen tärkeää.

  2. Kaikki opiskelijat voivat ilmoittaa havaitsemistaan virheistä, epäselvyyksistä, tai muista ongelmista tässä oppimateriaalissa. Raportoi havaintosi GitHubissa klikkaamalla kunkin sivun alareunassa olevia linkkejä. Voit myös ilmoittaa puutteista suoraan opettajille sähköpostitse osoitteeseen ohj1-opet@jyu.onmicrosoft.com.

  3. Opintojakson lopuksi kaikki Sisussa (tai Ilpo-portaalissa) ilmoittautuneet (tutkinto, avoin, erilliset opinto-oikeudet, lukiolinjat) saavat henkilökohtaisen linkin kurssipalautekyselyyn, jossa voit antaa anonyymisti palautetta koko opintojaksosta.

Suorittaminen

Suorituksen voi saada kahdella tavalla, ja arvosana määräytyy valitun tavan mukaan. Näet suoritustapojen vaatimukset alta klikkaamalla.

Suoritustapa 1Suoritustapa 2
teet ja palautat kaikki pakolliset harjoitustehtävät (ns. "tähtitehtävät")teet ja palautat kaikki pakolliset harjoitustehtävät (ns. "tähtitehtävät")
keräät yhteensä vähintään 27 pistettä harjoitustehtävistäkeräät vähintään 5 pistettä jokaiselta harjoitustehtäväviikolta
suoritat debuggausnäytteen hyväksytystisuoritat debuggausnäytteen hyväksytysti
suoritat harjoitustyön hyväksytystisuoritat harjoitustyön hyväksytysti
osallistut tenttiinei tenttiä
Arvosana välillä 1-5Arvosana 1

Suoritustavassa 1 arvosana määräytyy tenttipisteistä, joita voi korottaa harjoitustehtävistä saatavilla hyvityspisteillä.

varoitus

Suoritustapa 2 ei sovellu välttämättä sinulle, jos tavoitteenasi on hakea opiskelupaikkaa avoimen väylän kautta. Tarkista huolellisesti hakukohteesi valintaperusteet.

Näet harjoitustehtävistä keräämäsi pisteet ja muut osasuoritusten edistymiset Eteneminen-sivulla TIMissä.

Kaikkien suoritusten tekemisessä on noudatettava opintojakson eettisiä ohjeita.

Mikäli sairauden tai muun hyvän syyn vuoksi et pysty tekemään jotain osasuoritusta, ilmoita siitä heti opettajalle.

Harjoitustehtävät

Kuhunkin osan liittyy harjoitustehtäviä. Harjoitustehtävien tekemiseen saa apua pääteohjauksissa; ks. ajat etusivulta.

Harjoitustehtäviä on hieman eri tasoisia. Opintojakson osaamistavoitteiden kannalta keskeiset tehtävät ovat T-tehtäviä eli ydintehtäviä, ja näistä osa on pakollisia, jotka on merkitty tähdellä (★). Muita tehtäviä (bonustehtävät, gurutehtävät) on tarjolla kertausta, harjoittelua ja lisähaastetta varten.

Jokaisesta valmiiksi tehdystä tehtävästä saa yhden pisteen, ellei erikseen toisin mainita. Voit vastata niin monta kertaa kuin haluat. Pisteet lasketaan aina viimeisimmän tallennuksen perusteella. Osa tehtävistä on automaattisesti arvosteltuja, osassa asetat itse pisteesi. Lue aina tehtävänannon ohjeet huolellisesti ja tarkista, että viimeisin saamasi tai itse asettamasi pistemäärä on oikein.

Tehtävien aikataulurajoitukset ja mallivastauskäytänteet vaihtelevat opiskelijaryhmittäin seuraavasti:

JY tutkinto-opiskelijat Lukiolinjalaiset Avoin yliopisto
Tehtävien deadline Vastuuopettajan määrittämät. Näkyy TIMissä kunkin tehtävän kohdalla. Oman opettajasi määrittämät. Näkyy TIMissä kunkin tehtävän kohdalla. Ei deadlineja -- vain opiskeluoikeutesi rajoittama.
Mallivastaukset Mallivastaus avataan deadlinen jälkeen. Mallivastauksen saa auki kunkin tehtävän kohdalla Näytä mallivastaus -painikkeella. Tehtävän mallivastauksen saa auki käyttämällä Näytä mallivastaus -painiketta.

Mallivastauksen avaaminen lukitsee tehtävän, eikä avaamisen jälkeen annettuja vastauksia enää lasketa.

Mallivastauksia sekä harjoitustehtävien palautustilaisuuksien tallenteita voivat katsoa vain opintojaksolle ilmoittautuneet opiskelijat. Linkit näihin löytyvät TIMistä.

Ohjelmatehtävät tehdään Riderissa tai suoraan TIMissä. Heti kun Rideria opitaan käyttämään, kannattaa ohjelmatehtävät pääsääntöisesti tehdä ko. työkalulla. Tehtävien vastaukset palautetaan aina TIM-järjestelmään.

Hyvitykset tenttiin (suoritustapa 1)

Tentin minimipistemäärä on 0 ja maksimipistemäärä on 24. Tekemällä harjoitustehtäviä kerrytät hyvityspisteitä tenttiin seuraavasti.

harjoitustehtävistä kerättyjä pisteitä vähintäänHyvityspisteitä
271
332
403
474
535
606

Kultakin harjoitustehtäväkerralta hyväksiluetaan enintään 8 harjoitustehtäväpistettä. Toisin sanoen, vaikka saisit joltain harjoitustehtäväkerralla kerättyä lisätehtävillä enemmänkin pisteitä, huomioidaan vain 8 harjoitustehtäväpistettä tentin hyvityspisteiden laskennassa.

Hyvityspisteet lasketaan suoraan tenttipisteisiin ennen tenttiarvosanan laskemista. Hyvityspisteet otetaan lukuun kolmeen ensimmäiseen tenttiin, jotka opiskelija suorittaa, ja enintään yhden vuoden sisällä opintojakson viimeisestä suorituspäivästä.

Tehtävien muutos- ja päivityskäytänteet

Opintojaksolla ei ole enää vaihtuvia versioita vuosittaisille toteutukselle, vaan samat materiaalit ovat käytettävissä kaikissa toteutuksissa, myös avoimen yliopiston toteutuksissa sekä lukioyhteistyössä.

Opintojakson materiaaleja ja harjoitustehtäviä päivitetään 1–2 kertaa vuodessa. Useimmiten päivitykset ovat pieniä, kuten kirjastojen versiopäivityksiä ja tekstien selkeyden parannuksia. Ajoittain voidaan kuitenkin tehdä myös suurempia muutoksia, esimerkiksi poistaa tehtäviä tai lisätä uusia, tai tehdä isompia päivityksiä oppimateriaaleihin.

Muutoksista huolimatta kaikki jo kerätyt harjoitustehtäväpisteet pysyvät voimassa, ja opintojakson suorittamista voi jatkaa normaalisti päivityksistä välittämättä. Myös opintojakson suoritusehdot pysyvät samoina muutoksista riippumatta.

Eettiset ohjeet

Olet vastuussa kaikista palauttamistasi töistä. Kopioiminen tai toisen henkilön työn esittäminen omanaan on kiellettyä. Ryhmätyö on sallittua, mutta jokaisen ryhmän jäsenen tulee antaa panoksensa työhön, ymmärtää tekemänsä asiat ja osata selittää ne tarvittaessa. Ryhmätyönä tehty osa tulee aina merkitä selvästi palautettuun työhön, esimerkiksi koodin kommenttien avulla.

Noudatamme Jyväskylän yliopiston ohjeita ja linjauksia tekoälypohjaisten sovellusten käytössä opiskelussa. Alla olevat ohjeet täydentävät näitä linjauksia.

Generatiivisten tekoälytyökalujen käyttö koodin luomisessa on kiellettyä. Ohjelmoinnin opiskelun eräinä keskeisinä osaamistavoitteina on ongelmanratkaisun ja päättelyn oppiminen, ja tekoälytyökalujen käyttö vääristää näitä osaamistavoitteita. Kiellettyjä generatiivisia työkaluja ovat esimerkiksi GitHub Copilot, ChatGPT, Bard ja vastaavat chat- ja agenttisovellukset. Myös Riderin koodin tekoälypohjainen täydennys käyttö on kiellettyä.

Generatiivista tekoälyä voi käyttää apuvälineenä esimerkiksi käsitteiden selittämiseen, tehtävänantojen ymmärtämiseen tai materiaalissa annettujen esimerkkien selittämiseen. Tekoälytyökalulle annettavassa kehotteessa tulee huomioida, että tekoäly ei saa tuottaa suoria vastauksia tai koodia opintojakson tehtäviin.

Menettely vilppiepäilytilanteessa on kuvattu Jyväskylän yliopiston opintoja ohjaavissa säädöksissä ja määräyksissä.

Työkaluohjeet

Ohjelmointi 1 -opintojaksolla käytämme alla olevia työkaluja. Tässä dokumentissa opastetaan, miten nämä työkalut asennetaan.

  • .NETohjelmistoviitekehys (engl. framework), tarvitaan C#-ohjelmien kehittämiseen ja valmiiden ohjelmien ajamiseen.
  • Gitversiohallintaohjelma, joka mahdollistaa koodin versioinnin ja yhteistyön koodaajien välillä. Tätä voisi kutsua koodaajien Google Docsiksi.
  • JetBrains Riderintegroitu kehitysympäristö, jolla voi kirjoittaa, kääntää, ajaa ja debugata ohjelmia. Rider on erityisesti .NET- ja C#-ohjelmille tarkoitettu IDE. Käytämme ilmaista Community Edition -versiota.
  • Tekstieditori – ohjelma, jolla voi muokata tekstipohjaisia tiedostoja, kuten lähdekoodia avaamatta IDE-ohjelmistoa. Suosittelemme esimerkiksi Visual Studio Code tai Notepad++. Microsoft Word tai Google Docs ei ole opintojaksolle soveltuva tekstieditori.
  • JyPelipelimoottori, joka on Jyväskylän yliopistossa kehitetty C#-kirjasto pelien tekemiseen.
  • ComTestyksikkötestigeneraattori, joka on aputyökalu, jonka avulla kirjoitetulle koodille voidaan kirjoittaa testejä helposti luettavalla merkintätavalla.

Yllä olevat ohjelmat löytyvät valmiiksi asennettuna Agoran mikroluokissa (Alban puoleinen pääty, 1. ja 2. kerros). Jos sinulla on oma tietokone, suosittelemme vahvasti, että asennat ohjelmat lisäksi niille tietokoneille, joilla aiot suorittaa opintojakson.

Käyttöjärjestelmä ja vaatimukset

Tällä sivulla olevat ohjeet riippuvat käyttöjärjestelmästä. Valitse käyttöjärjestelmä alta.

Valitsit Microsfot Windows -käyttöjärjestelmän. Alla olevat ohjeet on testattu seuraavilla käyttöjärjestelmillä:

  • Windows 11
  • Windows 10

Pikakurssi komentorivin käyttöön

Tämän sivun asennusohjeet vaativat komentorivin avaamista ja käyttöä.

Opintojaksolla komentorivin käyttöä käsitellään tarkemmin opintojakson aikana; jos luet nämä ohjeet aivan opintojakson alussa, komentorivi saattaa kuulostaa vielä hämärältä asialta.

Jos et ikinä ennen käyttänyt komentoriviä, katso pikainen johdatus komentorivin käyttöön alta.

Pikainen johdatus komentorivin käyttöön (Avaa klikkaamalla)

Mikä on komentorivi?

Komentorivi (engl. command line) tai pääte (engl. terminal) on (tämän ohjeen puitteissa) tietokoneohjelma, jolla tietokonetta voi ohjata tekstillä. Esimerkiksi, kun Windowsissa jonkun kansion sisällön katsominen onnistuu graafisesti avaamalla Resurssinhallinta (tai macOS:lla vastaavasti Finder), sama asia onnistuu komentorivillä kirjoittamalla komento (engl. command), joka tulostaa näkyviin kansion sisällön.

Komentorivillä työskentely on yleistä ohjelmoinnin yhteydessä. Syitä on monia, kuten toiston ja automaation helpottaminen. Tämän ohjeen kannalta olennainen syy on, että ohjelmien asentaminen onnistuu nykyään jopa helpommin komentorivillä kuin etsimällä sopiva asennusohjelma verkosta.


Miten avaan komentoriviin omalla tietokoneellani?

Toimintatapa vaihtelee eri käyttöjärjestelmillä. Samalla käyttöjärjestelmällä voi olla myös useita komentoriviohjelmia. Alla olevilla ohjeilla saata ainakin kaikki tarvittavat työkalut asennettua.

  1. Paina Käynnistä-painikkeen vieressä olevaa Haku-ikonia
  2. Kirjoita hakupalkkiin PowerShell
  3. Valitse löytyvistä tuloksista Windows PowerShell

Tämä avaa PowerShell-komentorivin, joka on eräs Windowsilla oleva komentorivipääte.

Miten käytän komentoriviä?

Kun näet tällä sivulla alla olevan tapaisen laatikon:

ls

Tulee sinun kirjoittaa laatikossa oleva komento ja suorittaa se komentorivillä. Toimi seuraavasti:

  1. Klikkaa komentorivi aktiiviseksi ikkunaksi.
  2. Kirjoita laatikossa oleva komento komentoriviin näppäimistöllä.
  3. Tarkista, että kirjoitit komennon täysin oikein. Huomaa, että kirjainkoolla, välilyönneillä ja muilla merkeillä on merkitystä komennon kannalta!
  4. Kun olet varmistanut, että kirjoitit komennon oikein, paina Enter-näppäintä.

Riippuen komennosta komentoriviin voi ilmestyä tuloste, virhe tai ei mitään. Jotkin ohjelmat eivät tulosta mitään tekstiä onnistumisen merkiksi. Kun komennon suoritus on valmis, komentorivin uudelle riville ilmestyy uusi komentokehote.

Kokeile kirjoittaa ja suorittaa yllä oleva esimerkkikomento. Komento listaa hakemistossa olevien tiedostojen ja kansioiden nimiä (ls on lyhenne sanalle "list").

Kun tällä sivulla näet laatikon, jossa on useita rivejä, kuten

echo "Kissa"
ls

Toimi seuraavasti:

  1. Tee yllä mainitut vaiheet 1-4 vain ensimmäisellä rivillä olevalle komennolle (eli tässä echo "Kissa")
  2. Tee yllä mainitut vaiheet 1-4 vain toisella rivillä olevalle komennolle (eli ls)
  3. Jatka rivien suorittamista kunnes olet suorittanut kaikki laatikossa olevat rivit

Toisin sanoen, tällä sivulla jokainen yksittäinen komento on aseteltu omalle rivilleen. Tarkoitus on, että suoritat jokaisen rivin yksi kerrallaan siinä järjestyksessä, jossa ne on laatikossa kirjoitettu.

Kokeile kirjoittaa ja suorittaa yllä olevassa laatikossa olevat komennot. Kirjoita ja suorita ensin komento echo "Kissa" ja sen jälkeen komento ls. Muista, että tietokone suorittaa komennon vasta, kun painat Enter-painiketta.

Voinko kopioida komentoja kirjoittamisen sijaan?

Kyllä voit. Tällä ohjesivulla komentojen kopiointi onnistuu klikkaamalla kopioitavasta komennosta kerran ja painamalla Ctrl+C (Windows, Linux) tai Command+C (macOS).

Komennon liittäminen komentoriville riippuu käyttöjärjestelmästä:

  • Windows: Valitse PowerShell-komentorivi aktiiviseksi ja paina Ctrl+V (tai klikkaa hiiren oikea painike)
  • macOS: Valitse Pääte aktiiviseksi ja paina Command+V
  • Linux: Valitse komentorivi aktiiviseksi ja paina Ctrl+Shift+V TAI Shift+Insert. Tarkista pääteohjelmasi ohjeista oikea näppäinoikotie

varoitus

Älä ikinä kopioi ja liitä komentoriville mitään komentoja, joihin et luota etkä tiedä, mitä ne oikeasti tekevät. Komentorivien komennot ovat usein peruuttamattomia: jos vahingossa poistat jonkun tiedoston, poisto on usein lopullinen eikä sitä voi peruuttaa. Esimerkiksi tekoälyn ehdottamiin komentoihin tulee suhtautua aina varauksella. Tällä sivulla mainitut komennot on testattu toimivaksi ja turvalliseksi vastuuopettajan toimesta.

Valmistelu

  1. Varmista, että tietokoneesi on ajan tasalla (Windows Update:ssa ei uusia päivityksiä) ja että näytönohjaimen ajurit ovat asennettu.

  2. Avaa PowerShell-komentorivi (Haku-ikoni Kirjoita PowerShell Windows PowerShell).

  3. Kokeile, että winget-komento on asennettu ja toimii. Suorita seuraava komento:

    winget -v
    

    Tuloksena pitäisi tulostua winget-työkalun versio. Jos sen sijaan saat virheen, jossa lukee 'winget' is not recognized as the name of a cmdlet, function, script file, or operable program, tarkoittaa tämä, että sinulla todennäköisesti ei ole winget-työkalua asennettuna. Kokeile siinä tapauksessa seuraavat ratkaisut:

    • Tarkista, että käyttöjärjestelmäsi on ajan tasalla
    • Kokeile ladata ja asentaa winget-käsin: Lataa asennusohjelma. Asennuksen jälkeen sulje ja käynnistä PowerShell uudelleen.

.NET

  1. Avaa PowerShell-komentorivi ellei se ole jo auki.

  2. Suorita alla oleva komento

    winget install -e --id=Microsoft.DotNet.SDK.10
    

    Odota komennon suorittamista loppuun ja anna tarvittaessa asennusoikeus. Jos näet komentorivillä kysymyksen, kuten:

    Do you agree to all the source agreements terms?
    [Y] Yes [N] No:
    

    Paina komentorivillä y-näppäintä ja sen jälkeen Enter-näppäintä.

    Tarkista lopuksi, että komentorivillä olevassa tulosteessa on teksti Successfully installed.

  3. Sulje kaikki auki olevat komentorivit ja avaa uusi PowerShell-komentorivi

  4. Testaa, että .NET on asennettu suorittamalla komento:

    dotnet --list-sdks
    

    Jos asennus onnistui, näet seuraavanlaisen tulosteen:

    10.0.XXX [C:\Program Files\dotnet\sdk]
    

    Huomaa, että XXX on joku numero; olennaista, että versiona lukee 10.0 ja että virhettä ei tule.

Git

  1. Avaa PowerShell-komentorivi ellei se ole jo auki.

  2. Asenna Git for Windows suorittamalla alla oleva komento:

    winget install -e --id=Git.Git --custom '/COMPONENTS="ext,ext\shellhere,ext\guihere"'
    

    Odota komennon suorittamista loppuun ja anna tarvittaessa asennusoikeus. Jos näet komentorivillä kysymyksen, kuten:

    Do you agree to all the source agreements terms?
    [Y] Yes [N] No:
    

    Paina komentorivillä y-näppäintä ja sen jälkeen Enter-näppäintä.

    Tarkista lopuksi, että komentorivillä olevassa tulosteessa on teksti Successfully installed.

  3. Sulje kaikki auki olevat komentorivit ja avaa uusi PowerShell-komentorivi

  4. Testaa, että git-komento on asennettu suorittamalla komento:

    git --version
    

    Jos asennus onnistui, näet seuraavanlaisen tulosteen:

    git version X.XX.XX
    

    Tekstin X.XX.XX tilalla näkyy git-työkalun tarkka versio.

  5. Testaa, vielä, että Git Bash on asennettu. Mene Haku-ikoni Kirjoita Git Bash Valitse Git Bash.

    Jos kaikki toimii, pitäisi avautua Git Bash -komentorivi:

    Git bash avattu

JetBrains Rider

  1. Avaa PowerShell-komentorivi ellei se ole jo auki.

  2. Asenna JetBrains Rider suorittamalla alla oleva komento:

    winget install --interactive -e --id=JetBrains.Rider
    

    Ohjelman lataamisen jälkeen avautuu asennusohjelma. Etene asennusohjelmassa eteenpäin Next-painikkeella. Kohdassa Installation Options valitse seuraavat ruksit päälle:

    • Add "Open Folder as Project"
    • Install JetBrains ETW Host Service
    • Add Rider executables to Microsoft Defender exclusions
    • Create Associations: .sln, .cs, .csproj Etene asennusohjelmassa ja anna ohjelman asentua.
  3. Kun pääset asennusohjelman loppuun, valitse Run JetBrains Rider ja paina Finish. Testaa, että ohjelma toimii.

    Ensimmäisellä kerralla käynnistys saattaa kestää, sillä järjestelmä tarkistaa sovelluksen. Järjestelmä saattaa myös kysyä, Rider on internetsitä ladattu appi. Avataanko se?. Siinä tapauksessa voi valita Avaa.

    Hyväksy mahdolliset Riderin käyttöehdot.

  4. Kun JetBrains Rider kysyy lisenssiä, valitse Free Non-Commercial License.

  5. Valitse Register-linkki ja rekisteröidy JetBrains-käyttäjäksi. Valitse Continue with email ja tee itsellesi tunnus.

  6. Kun olet rekisteröitynyt, avaa Rider ja valitse Log in for Non-Commercial License.

    Kun olet kirjautunut, hyväksy vielä lisenssin ehdot ja valitse Start Non-Commercial license.

  7. Suorita asetusten asettaminen loppuun. Suositellut asetukset:

    • Teema: Valitse haluamasi teema
    • Näppäimistöasettelu: Suosittelemme vaihtoehtoja Visual Studio tai VS Code
    • Pluginit: valitse Continue without Plugins
  8. Kun olet valmis ja pääset Welcome to JetBrains Rider -ikkunaan, ohjelman asennus on onnistunut.

  9. Poistetaan oikoluku. Ollessasi Welcome-ikkunassa, valitse alhaalta Configure. Kirjoita hakukenttään "spell" ja mene Spelling .NET languages ja klikkaa pois valinta Enable spell checking -kohdasta.

  10. Laitetaan opintojakson suositellut koodin muotoilu- ja analyysiasetukset. Lataa asetuspaketti (settings.zip)

    • Valitse Welcome-ikkunassa vasemmasta alalaidasta Configure Import Settings...
    • Etsi ja valitse äsken haettu tiedosto
    • Klikkaa OK, sitten Import and Restart

Jos et halua ladata asetuksia tiedostosta, voit asettaa ne manuaalisesti.

Tekstieditori

Tälle opintojaksolle riittää mikä tahansa tekstieditori, joka ei ole toimistosovellus, eli ei Google Docs, Microsoft Word, tai muu asiakirjojen laadintaan tarkoitettu sovlelus. Vaihtoehtoja on monta. Ihmisillä on hyvin erilaisia preferenssejä tekstieditorien suhteen, joten kannattaa kokeilla erilaisia vaihtoehtoja ja valita itselle mieluisin.

Koska jokin tekstieditori täytyy valita, käytämme tässä ohjeessa Visual Studio Codea (VS Code). Se on suosittu, ilmainen, ja monipuolinen tekstieditori, jota voi laajentaa monin tavoin, jopa IDE-tasoiseksi työkaluksi lisäosien avulla. Jos haluat käyttää jotain muuta tekstieditoria, voit toki tehdä niin, mutta ohjeet on kirjoitettu VS Coden käyttöä ajatellen.

  1. Avaa PowerShell-komentorivi ellei se ole jo auki.

  2. Asenna VS Code suorittamalla seuraava komento:

    winget install -e --id=Microsoft.VisualStudioCode --override '/SILENT /mergetasks="!runcode,addcontextmenufiles,addcontextmenufolders"'
    

    Odota komennon suorittamista loppuun ja anna tarvittaessa asennusoikeus. Jos näet komentorivillä kysymyksen, kuten:

    Do you agree to all the source agreements terms?
    [Y] Yes [N] No:
    

    Paina komentorivillä y-näppäintä ja sen jälkeen Enter-näppäintä.

    Tarkista lopuksi, että komentorivillä olevassa tulosteessa on teksti Successfully installed.

  3. Sulje kaikki auki olevat komentorivit ja avaa uusi PowerShell-komentorivi

  4. Kokeile käynnistää VS Code suorittamalla komento:

    code
    

    Jos VS Code avautuu, olet onnistuneesti asentanut sen! Jatkossa pääset VS Codeen myös klikkaamalla käynnistä-palkin Hae-ikonia Kirjoita Visual Studio Code Valitse Visual Studio Code.

JyPeli

  1. Avaa käyttöjärjestelmäsi komentorivi (PowerShell, Pääte tai vastaava).

  2. Asenna JyPeli-projektipohjat (engl. templates) suorittamalla alla oleva komento:

    dotnet new install Jypeli.Templates
    

    Kun asennus on valmis, näet jotakin tekstiä mallia:

    Success: Jypeli.Templates installed the following templates:
    
  3. Kokeile, että JyPeli toimii luomalla tasohyppelypeliprojekti ja suorittamalla se. Suorita alla olevat komennot (huom: yhteensä neljä komentoa):

    cd ~
    
    dotnet new Tasohyppelypeli -o TasohyppelypeliTesti
    
    cd TasohyppelypeliTesti
    
    dotnet run
    

    Erityisesti viimeisen komennon suorittaminen voi hieman kestää. Komennot tekevät seuraavat asiat:

    • Komento 1 muuttaa aktiivisen hakemiston kotihakemistoksi
    • Komento 2 tekee uuden C#-projektin, jonka pohja otetaan JyPeli tasohyppelypeliesimerkistä
    • Komento 3 siirtää komentorivin projektikansion sisälle
    • Komento 4 kääntää ja käynnistää pelin. Tuloksena pitäisi avautua pelattava tasohyppelypeli. Voit kokeilla peliä tai sulkea sen.

ComTest

ComTest on Riderin lisäosa, jonka avulla tällä opintojaksolla kirjoitetaan yksikkötestejä.

  1. Avaa JetBrains Rider ja odota, kunnes pääset Welcome to JetBrains Rider -näkymään
  2. Klikkaa ikkunan vasemmassa alalaidassa oleva Configure Plugins
  3. Valitse Marketplace-välilehti ja hae hakusanalla ComTest
  4. Valitse Comtest Runner -pluginin kohdalta Install
  5. Paina Save
  6. Sulje JetBrains Rider

Mitä seuraavaksi?

Onneksi olkoon! Asennettujen työkalujen käyttöä käydään läpi luennoilla sekä muun uassa mmateriaalin luvussa 1.3 Ohjelmointiympäristö kuntoon.

Jos olet tutkinto-opiskelija, sinulla on oikeus hankkia JetBrains Student Pack, joka sisältää käyttöoikeuden kaikkiin JetBrains IDE-ohjelmiin. Tällä opintojaksolla Riderin Non-commercial license -lisenssi riittää, mutta erityisesti ohjelmoinnista kiinnostuneelle Student Packista voi olla hyötyä myöhemmissä opinnoissa.

Ongelmatilanteita ja niiden ratkaisuja

Alla on lueteltu joitain yleisimpiä ongelmatilanteita, joita asennuksen tai työkalujen käytön yhteydessä voi tulla vastaan. Jos löydät ongelman, jota ei ole listattu alla,

Silk.NET.Core.Loader.SymbolLoadingException' occurred in Silk.NET.Core.dll: 'Native symbol not found (Symbol: glfwWindowHintString)

Yllä olevan virheviestin syynä on todennäköisimmin että sinulla ei ole GLFW asennettuna, tai se on liian vanha. Monen Linux-distron mukana tulee versio 3.2, mutta Jypeli vaatii vähintään version 3.3.

Asenna uusin GLFW-versio käyttämäsi paketinhallinnan avulla.

System.PlatformNotSupportedException: GLFW is not supported on this platform...

Voi olla että tietokoneellasi ei ole näytönohjaimen ajureita asennettuna. Mene Windowsin asetukset Päivitykset Valinnaiset (päivitä-nappulan alapuolella) -> Ajurit. Asenna sieltä jotenkin näyttöön liittyvä ajuri, esimerkiksi "Intel Display Driver"

Jos ajuria ei löydy ja käytät kannettavaa, todennäköisesti sinulla on integroitu näytöonohjain, jolloin ajuri voi löytyä prosessorin valmistajan (Intel tai AMD) sivulta. Hae ajurit Googlesta esimerkiksi hakusanalla Intel graphics driver tai AMD graphics driver prosessorin valmistajasta riippuen.

Seuraavista työkaluista voi olla hyötyä:

Rider pyytää asentamaan .NETia vaikka olen asentanut sen jo

Voi olla, että Rider ei löydä oikeaa .NET-versiota.

Kokeile seuraavaa:

  • Avaa Rider aloitusnäkymä (jos Rider on auki, laita se kiinni ja avaa uudelleen).

  • Avaa asetukset menemällä Configure (vasemmassa alalaidassa) Settings

  • Mene kohtaan Build, Execution, Deployment Toolset and Build

  • Klikkaa kohdan .NET CLI executable path -kentän alasvetovalikkoa:

Jos alasvetovalikon listassa näkyy useampi vaihtoehto, kokeile valita jotain toista vaihtoehtoa kuin nykyinen arvo. Paina lopuksi Save ja kokeile luoda uusi solution. Jos virhe toistuu, kokeile jotain toista valintaa.

Rider on hidas tai antaa erilaisia oikeusvirheitä

Erityisesti Windows-laitteilla Rider tai C#-ohjelmien ajaminen voi olla hidasta haittaohjelmien torjuntaohjelman erityisen tiukkojen tarkistusääntöjen vuoksi.

Mikäli sinulla on käytössä Microsoft Defender, Rider yleensä kysyy, haluatko Riderin säätävän sen asetukset automaattisesti. Muiden tuotteiden tapauksessa asetukset tulee säätää itse.

Katso Riderin viralliset toimintaohjeet haittaohjelmien torjuntaohjelmien säätämiseksi.

Rider-lisenssin uudelleenaktivointi

Lisenssi täytyy mahdollisesti aika ajoin uudelleenaktivoida kohdasta Help -> Manage licenses Activate.

dotnet not found / command not found: dotnet

Katso .NET-asennusohjeet Työkalut-ohjeesta.

A fatal error occurred. The folder [/usr/share/dotnet/host/fxr] does not exist

Jos komentoriviltä tulee (Linux):

A fatal error occurred. The folder [/usr/share/dotnet/host/fxr] does not exist 

niin ks: https://stackoverflow.com/questions/73753672/a-fatal-error-occurred-the-folder-usr-share-dotnet-host-fxr-does-not-exist

Näppäinkomennot eivät toimi

Jotkin editorin näppäinoikotiet ei toimi sellaisenaan muilla kuin Yhdysvaltalaisilla näppäimistöillä. On siis tarpeen valita toimimattomille suosikkikomennoillesi uudet näppäinoikotiet asetuksista: File → Settings → Keymap → Editor actions.

Valinnaista lisätietoa: Koodin muotoilu- ja analyysiasetukset

Seuraavassa on muutamia esimerkkejä varoituksista, joita settings.zipissä on otettu pois päältä. Näistä varoituksista on enemmänkin haittaa kuin hyötyä tämän kurssin kannalta. Ajatus on, että on parempi, että varoituksia tulee vain niistä asioista, jotka on oikeasti syytä ottaa huomioon. Kun opit ohjelmointia lisää, on noista edistyneemmistä varoituksistakin enemmän hyötyä. Kannattaa avata Riderissa joku solution, jos säädät seuraavia käsin.

  • Huomatus nimiavaruudesta: Kurssilla ei aina käytetä nimiavaruuksia: kirjoita asetusten hakukentään inspection severity ja mene asetuksissa Editor/Inspection Settings/Inspection Severity/C# valitsemalla Inspection Severity alla olevista kielistä C#. Pitäisi tulla näkyviin uusi valikko C#:n kielikohtaisia asetuksia. Kirjoita tämän uuden valikon omaan hakuun namespace ja ota ruksi pois kohdasta Namespace does not correspond to file location, joka löytyy uudesta valikossa Constraints violations- alaotsikon alta.

  • Luokasta ole luotu oliota: Kurssilla luokkia käytetään (myös) tallentamaan joukko staattisia aliohjelmia, joten tämä varoitus ei ole relevantti. Samaan tapaan kuin edellisessä kohdassa, mene ensin C#:n kielikohtaisiin asetuksiin: Editor/Inspection Settings/Inspection Severity/C# ja kirjoita avautuvan valikon hakukentään instantiated ja ota ruksi pois kohdasta Non-private accessibility, joka on alaotsikon Potential Code Quality Issues ja Class is never instantiated-asetuksen alla.

  • Metodi voisi olla private: Yleiskäyttöiseksi tarkoitetut funktiot kannattaa tehdä julkisiksi, mutta koska niitä ei ole vielä mistään kutsuttu, Rider huomauttaa tästä. Mene taas C#:n kielikohtaisten asetusten valikkoon Editor/Inspection Settings/Inspection Severity/C# edellisen kohdan tavoin. Hae member ja etsi Common Practices and Code Improvements alaotsikon alta Member can be made private-asetuksen alla oleva asetus Non-private accessibility, josta ota ruksi pois.

  • Luokkaa ei ole määritelty nimiavaruudessa: Koska kurssilla ei aina käytetä nimiavaruuksia: Jos koodissa on jossakin kohti alleviivattuna class-sanan jälkeinen nimi, niin mene sen nimen alkuun, paina nimeä ja vasemmalle syttyy vasaran kuva. Klikkaa vasaraa ja valitse valikosta Inspection: 'Declare types in namespaces'/Configure inspection severity/Do not show kuten kuvassa alla: Poistetaan Laskuja-luokan nimen alleviivaus näkyvistä Tämän Context Actions-valikon saa auki myös klikkaamalla hiiren oikealla painikkeella alleviivattua kohtaa ja valitsemalla valikosta Show Context Actions. Joissain tapauksissa valikon saa auki rivinumeroiden vieressä olevasta hehkulampun kuvasta.Context Actions-valikon saa auki kursorin kohdalla myös painamalla Alt + Enter. Tällä samalla menetelmällä on helppo säätää pois häiritseviä alleviivauksia, mutta ensin on varmistuttava, että kyseinen asetus/alleviivaus/vihje ei ole itselle tarpeellinen tai huomionarvoinen.

  • var-sanan käyttö: Pyritään oppimaan tyyppien merkitystä. Toimi kuten edellä silloin kun ehdotetaan esimerkiksi int ika tyyppisessä lausessa int sanan kohdalle että use var, eli poista tämä huomautus käytöstä.

  • Editor/General/Code Completion poista ruksi "Preselect the best match to insert it by pressing dot, parantheses, and other keys"

  • Editor/Inlay Hints poista ruksi "Enable Inlay Hints in .NET languages"

Valinnaista lisätietoa: Suositeltavat käyttöliittymän asetukset

Tässä on lueteltu muutamia asetuksia, joita luentojen esimerkeissä käytetään tai on käytetty. Jokainen voi toki rakennella ympäristöstään haluamansa, mutta näistä voi olla sinulle hyötyä jos haluat seurata täsmälleen luennolla käytettyjä asetuksia.

Siirrä alaosan paneelit yhteen reunaan. Move panels example gif Tämän ansiosta esimerkiksi tulosteita on helpompi tarkastella hieman leveämmässä näkymässä. Joissakin tilanteissa (esimerkiksi debugatessa) joitakin paneeleja voi olla hyvä siirtää tarvittaessa oikeallekin. Voit myös piilottaa turhia paneeleja näkyviltä kun klikkaat hiiren oikealla kuvakkeen päällä ja sitten Hide.

Paneeleita voi "unpinnata" eli piilottaa näkyvistä silloin kun ne eivät ole aktiivisia. Klikkaa paneelista kolmea pistettä ja valitse View Mode Dock Unpinned. Jos unpinnaat esimerkiksi Debug-paneelin, voit ajaa ConsoleMain-sovelluksen (Debug-tilassa), ja painaa ajon jälkeen Esc-näppäintä. Paneeli sulkeutuu ja fokus siirtyy takaisin editoriin. (Ei tarvitse koskea hiireen, JES! :))

Piilota onnistuneen käännöksen ilmoitus. Tämä ilmoitus on lähinnä vain tiellä. Valitse Settings Notifications Build messages No popup. Suosittelen myös poistamaan valinnan kohdasta Show in tool window, koska harvemmin on tarvetta tietää tarkkoja kellonaikoja milloin käännös on onnistunut tai epäonnistunut.

Koko ruudun tilan saat käyntiin View Appearance Enter Full Screen. Minulla näppäinoikotie on Ctrl+Shift+Enter, mutta kuten mitä tahansa näppäinoikoteitä, tätäkin voi muuttaa kohdasta Settings Keymap. Myös Distraction Free Mode on mielestäni mukava, vaikkakin se piilottaa jotain hyviäkin käyttöliittymäelementtejä, kuten koodialueiden supistamiseen liittyvät pikkukolmiot.

Debug/release-valikon näyttäminen New UI:ssa. Jos käytät uutta käyttöliittymävaihtoehtoa (Settings New UI), kannattaa ns. debug/release-käännösvalikko ottaa käyttöön tässä ohjeessa kuvatulla tavalla.

Ulkoisen konsoli-ikkunan käyttäminen: Jos haluat konsoliohjelman aukeavan ulkoiseen konsoliin katso How to launch console app in external window?

vinkki

Pro tip: Jos käytät Rideria usealla tietokoneella, voit synkronoida asetuksesi valitsemalla File Manage IDE Settings Settings sync.

Sisäänrakennetun tekoälytäydennyksen kytkeminen pois

Riderissa on sisäänrakennettu tekoälypohjainen täydennys, joka yrittää täydentää kirjoitetun rivin loppuun ympäröivän koodin perusteella:

AI autocompletion example

Aivan opintojakson alussa tämä täydennys ei haittaa, mutta myöhemmin täydennys pikemmin häiritsee sen rajoittuneisuuden vuoksi. Siispä suosittelemme kytkemään se pois seuraavasti:

  • Avaa Rider Welcome to JetBrains Rider -näkymään
  • Valitse vasemmasta alalalaidasta Configure Settings
  • Mene asetuksissa kohtaan Editor General Inline Completion
  • Ota ruksi pois kohdasta Enable local Full Line completion suggestions
  • Tallenna asetukset Save-painikkeella

Git-versiohallinta

Ohjeet Ohjelmointi 1 -opintojaksolle

Tässä dokumentissa kerrotaan miten harjoitustyön suunnitelmaa, lähdekoodia sekä muita tiedostoja (mm. kuvat) käsitellään Git-versiohallinnan avulla Ohjelmointi 1 -opintojaksolla.

Ohje on pitkän puoleinen, mutta on tärkeää, että luet sen huolellisesti. Git-versiohallinnan käyttö on olennainen osa ohjelmistokehitystä, ja sen perusteiden ymmärtäminen on tärkeää paitsi tällä opintojaksolla, myös myöhemmissä opinnoissa ja työelämässä.

varoitus

Jos olet Jyväskylän yliopiston opiskelija, sinun tulee tietää JY-käyttäjätunnuksesi jotta voit käyttää gitlab.jyu.fi-palvelua. Varmista, että tiedät käyttäjätunnuksesi, ja kirjoita se muistiin ennen kuin aloitat tämän ohjeen seuraamisen. Tässä ohjeessa viitataan toistuvasti käyttäjätunnukseen tunnisteella kayttajatunnus. Korvaa tämä aina omalla käyttäjätunnuksellasi.

Ennen kuin aloitat

Asenna kehitystyökalut ja Git-versiohallinta, ellet ole vielä tehnyt niin.

Mikä Git on

Git on ohjelmisto, jolla voidaan toteuttaa tiedostojen versiohallintaa. Ohjelmistotyössä on erityisen tärkeää, että jokainen ohjelmistoon tehty muutos versioidaan selkeästi. Versiohallinnan käyttäminen yhteistyöskentelyyn ja muutosten jäljittämiseen on normi niin teollisessa ohjelmistotuotannossa, vapaan/avoimen lähdekoodin projekteissa kuin myös monien harrastajien henkilökohtaisissa töissä.

Versiohallinta mahdollistaa myös saman koodin parissa työskentelyn eri tietokoneilta, mikä sopii hyvin tälle kurssille, koska usein tehdään töitä eri tietokoneilta (mikroluokka, kotikone, jne.).

Git-varasto (engl. repository) sisältää sekä kooditiedostot että koko projektin muokkaushistorian. GitLab ja GitHub ovat eräitä suosittuja internetissä toimivia palveluita, joissa Git-varastoja voidaan säilyttää.

Tällä kurssilla emme käytä Dropboxia, muistitikkuja, sähköpostia tai vastaavia palveluita kooditiedostojen jakamiseen, koska ne eivät sovellu todelliseen yhteistyöskentelyyn. Vaikka työskentelisitkin yksin, käytä versiohallintaa ohjaajien työn helpottamiseksi sekä harjoitustyön esittelyn mahdollistamiseksi.

Voit hyödyntää versiohallintaa opinnoissa muutenkin, esimerkiksi tutkielmien kirjoittamisessa.

Miten saan Gitin auki

Git on komentoriviohjelma, eli sitä ei varsinaisesti avata vaan käytetään komentoriviltä. Gitille on tarjolla myös graafisia käyttöliittymiä (ks. Luku 11. Tapoja käyttää Gitiä), jotka käytännössä suorittavat tarvittavia komentorivikomentoja puolestasi. Ohjelmointi 1 -kurssilla harjoittelemme käyttämään Gitiä komentoriviltä nk. bash-komentokehotteesta.

Valitse alta käyttöjärjestelmäsi mukainen käyttötapa.

Valitse käyttöjärjestelmäsi yllä olevista vaihtoehdoista.

Muistilista

Alla on lyhyt muistilista tyypillisimmistä tällä kurssilla vastaan tulevista tilanteista gitin kanssa. Lue kuitenkin ensin tarkemmat kuvaukset tämän dokumentin seuraavista luvuista.

TavoiteToimenpideKomentoLinkki ohjeeseen
Aloitan harjoitustyönTeen fork-toiminnolla gitlab.jyu.fi-palvelussa uuden etävaraston.Hyppää ohjeeseen
Menen koneelle, jossa sisältöä ei vielä oleHaen GitLabista etävarastoni HTTPS-osoitteen ja kloonaan etävaraston omalle koneelle. Huomaa piste komennon päätteeeksi.git clone [etävaraston osoite] .Hyppää ohjeeseen
Menen koneelle jossa sisältö jo onPäivitän etävaraston version koneelle.git pullHyppää ohjeeseen
Muutan tai lisään tiedostoja (esimerkiksi suunnitelmakuva suunnitelma-kansioon)(1) Lisään muuttuneet ja uudet tiedostot stage-tilaan, ja (2) siirrän stage-tilan tiedon lokaaliin varastoon, ja (3) "pusken" tekemäni commitin etävarastoon.

Huomaa kolme erillistä komentoa.
git add --all

git commit -m "Muutoksia kuvaava viesti."

git push
Hyppää ohjeeseen

Nämä samat ohjeet pätevät myös ryhmätyössä, mutta silloin kannattaa kiinnittää erityistä huomiota siihen, että tekee pull, commit- ja push-toimintoja riittävän usein konfliktien välttämiseksi.

git status-komentoa voi viljellä missä tahansa välissä. Se kertoo paikallisen varaston tilasta, muun muassa mitä tiedostoja on muutettu, poistettu tai lisätty.

Oman etävaraston luominen GitLab-palveluun

huomautus

Harjoitustyön suunnitelman viemisestä versiohallintaan on myös videotutoriaali. Huomaa, että videolla projektin alku tehdään käyttäen Visual Studiota, mutta voit käyttää myös Rideria.

Tässä vaiheessa luodaan henkilökohtainen etävarasto (engl. remote repository) gitlab.jyu.fi-palveluun. Etävarastosta käytetään jatkossa nimitystä origin. Kunkin opiskelijan (tai ryhmätyön) etävarasto perustuu valmiiseen pohjaan, josta tehdään kopiohaara, eli GitLab-terminologiassa fork. Forkkauksen ansiosta saadaan uuteen Git-varastoosi kurssin alkuasetukset.

Tämä vaihe tehdään kurssilla yhden kerran.

  1. (a) Jos sinulla on JY-tunnukset: Kirjaudu gitlab.jyu-palveluun (https://gitlab.jyu.fi/) JY-tunnuksilla.
    (b) Jos sinulla ei ole JY-tunnuksia: Tee tunnukset GitHub-palveluun (https://github.com), ja kirjaudu sisään.
  2. (a) JY: Avaa Ohj1-kurssin pohjaprojekti selaimessa: https://gitlab.jyu.fi/tie/ohj1/2025k/ohj1ht
    (b) Ei-JY: Avaa Ohj1-kurssin pohjaprojekti selaimessa: https://github.com/ITKP102-Ohjelmointi-1/ohj1ht.git
  3. (a) JY: Valitse oikeasta ylänurkasta fork (b) Ei-JY: Vastaavasti.
  4. Valitse omaa tunnustasi vastaava namespace (ryhmä).
  5. Valitse näkyvyydeksi public.
  6. Tarkista, että Project slug kohdassa lukee ohj1ht. Jos muutat tätä, niin tämän ohjeen myöhemmät kohdat eivät toimi oikein.

Projektisi etävaraston URL-osoite on nyt (jos sinulla on JY-tunnukset):

https://gitlab.jyu.fi/käyttäjätunnus/ohj1ht.git

tai (jos sinulla ei ole JY-tunnuksia):

https://github.com/käyttäjänimi/ohj1ht.git

Tallenna URL-osoite TIMiin Harjoitustyö -sivulle. TODO: Linkki.

Näet jatkossa oman etävarastosi URL-osoitteen gitlab.jyu.fi-palvelussa kohdasta Clone Clone with HTTPS. Käytä oman etävarastosi URL-osoitetta tulevissa ohjeissa.

Valinnaista lisätietoa: Mikä fork on?

Tämä teksti kannattaa lukea, kun ymmärrät, mitä commit, push ja pull tarkoittavat.

Fork on itsenäinen kopio olemassa olevasta git-varastosta. Fork säilyttää aikaisemman historian (commitit), ja jatkaa omaa elämäänsä irrallaan alkuperäisestä projektista. Tähän kopioon (fork-projektiin) tehtävät commitit eivät mene alkuperäiseen projektiin, eivätkä alkuperäisen projektin commitit tule kopioon.

Käytännön elämässä fork-projekti tehdään usein tilanteessa, kun kehittäjä haluaa syystä tai toisesta erottaa oman työnsä alkuperäisen projektin työstä. Kehittäjä voi esimerkiksi olla pettynyt projektin suuntaan ja haluaa jatkaa itsenäisesti eteenpäin. Yksi esimerkki tästä ovat striimausohjelmistot OBS Studio ja Streamlabs Desktop: OBS Studio on maksuton, vapaan lähdekoodin (Gnu GPL v2) projekti. Streamlabs forkkasi OBS-projektin vuonna 2014, ja on siitä eteenpäin tuonut omaan forkkiinsa yhä enemmän kaupallisia ominaisuuksia, kun taas OBS jatkaa edelleen ilmaisohjelmiston periaatteella.

Tällä kurssilla forkkaaminen mahdollistaa opiskelijalle helpon tavan perustaa oma Git-repo GitLabiin, ja toisaalta forkin ansiosta opettaja voi samalla jakaa opiskelijoille projektin pohjakoodit (suunnitelmien pohjat jne.) valmiiksi.

Älä sotke fork-termiä branch-termiin. Brancheja käytetään Gitissä aivan eri tarkoitukseen, vaikka myös branch usein suomennetaan haaraksi.

Fork-projektista on viite alkuperäiseen projektiin, siis siihen, josta fork otettiin, jotta alkuperäisestä projektista käsin voidaan seurata mitä haaroja siitä on tehty.

Lisätietoa kiinnostuneille: https://help.github.com/en/github/getting-started-with-github/fork-a-repo

Oikeuksien antaminen muille ryhmäläisille

Jos teet harjoitustyön yksin, voit ohittaa tämän kohdan.

Forkin tekijä antaa oikeudet muille ryhmäläisille. Tämä tapahtuu projektin vasemman reunan kohdasta Members. Syötä kohtaan GitLab member or Email address ryhmän jäsenet yksi kerrallaan. Huom! Kaikkien jäsenten tulee olla tätä ennen olla kirjautunut gitlab.jyu.fi-palveluun vähintään kerran.

Kaikki ryhmäläiset käyttävät samaa etävaraston osoitetta. Tämä on otettava huomioon alempana olevissa ohjeissa, joissa tällöin näkyy "väärän" henkilön tunnus.

Omien tietojen (nimi, sähköposti) asettaminen

Tämä vaihe tehdään yhden kerran jokaisella tietokoneella jolla harjoitustyötä työstetään.

Versiohallinta liittää jokaiseen muutokseen tiedot muutoksen tekijän nimestä ja sähköpostiosoitteesta. Tästä syystä Git-ohjelmalle täytyy antaa nimi ja sähköposti. Aseta omat tietosi Git-asiakasohjelmaan seuraavasti.

Mene komentoriville (miten avaan komentorivin?) ja aseta tietosi antamalla alla olevat komennot:

(Korvaa lainausmerkkien sisällä olevat tiedot omilla tiedoillasi. Lainausmerkit tulee pitää mukana komennossa.)

git config --global user.name "Olli Opiskelija"
git config --global user.email "olli.o.opiskelija@student.jyu.fi"

Jos ei tulostu virheviestiä, niin komennot ovat onnistuneet.

Lisätietoa kiinnostuneille: git config

Etävaraston hakeminen omalle tietokoneelle (clone)

Tämä vaihe tehdään yhden kerran jokaisella tietokoneella jolla harjoitustyötä työstetään.

Seuraavaksi haetaan etävarasto omalle paikalliselle tietokoneelle. Tästä käytetään termiä kloonaaminen (engl. clone). Kloonattuun paikalliseen tietovarastoon tehdyt muutokset voi aikanaan lähettää takaisin etävarastoon; tästä kerrotaan lisää myöhemmässä kohdassa.

Kloonaus tehdään tyhjään hakemistoon.

Entä jos hakemisto ei ole tyhjä?

Mikäli haluat kloonata ei-tyhjään hakemistoon, on tähän ohjeet Gitin keskustelupalstalla, mutta melkein helpompi on tässä vaiheessa:

  • nimeä olemassa oleva hakemisto uudelleen
  • tee uusi työhakemisto
  • tee sinne clone
  • siirrä sisältö vanhasta hakemistosta
  • poista vanha hakemisto
  • jatka kuten muuten kloonin jälkeen

Valitse alta käyttöjärjestelmästi mukainen käyttötapa.

Valitse käyttöjärjestelmäsi yllä olevista vaihtoehdoista.

Lisätietoa: Git-ohje: clone, reference: clone

Tiedostojen vieminen paikalliseen tietovarastoon (add, commit)

Kun tiedostoja lisätään, muokataan tai poistetaan, tulee kaikki nämä muutokset lisätä paikalliseen tietovarastoon.

Tämä vaihe tehdään joka kerta kun olet tehnyt muutoksia koodiin tai muihin tiedostoihin.

Esimerkki: Suunnitelman kuvan tallentaminen. Tallenna harjoitustyösi suunnitelman sekä luonnoskuvan suunnitelma-kansioon. Ole tarkkana, että kuva menee oikeasti juuri tuohon kansioon. Sekä suunnitelmatekstiä varten että kuvaa varten on olemassa esimerkit suunnitelma-kansiossa.

Kuvan pikselikoon tulee olla enintään 1920 x 1080 pikseliä. Kuvan tiedostokoon tulee mielellään olla enintään 1 megatavu.

Avaa Pääte (macOS), Git Bash (Windows) tai muu komentorivi, siirry cd-komentoja käyttämällä harkkatyökansioosi ja anna seuraavat kaksi komentoa:

git add --all 
git commit -m "kuvaava viesti miksi muutokset on tehty"

Ensimmäinen komento lisää kaikki muokatut tiedostot ns. index/stage-alueelle, ja seuraava komento tekee varsinaisen tietovarastoon tallentamisen.

On tärkeää, että aina add-komennon jälkeen tarkistat git status-komennolla mitä tiedostoja tietovarastoon on menossa. Älä lähetä tietovarastoihin suuria tiedostoja.

Mikäli et halua lähettää tietovarastoon kaikkia muutoksia, vaan esimerkiksi vain yhden tiedoston, laita --all-option tilalle haluamasi tiedoston nimi:

git add TIEDOSTONNIMI   (hakemistoineen, /-viiva hakemistomerkkinä)

Jotkut pitävät parempana luetella kukin lisättävä tiedosto erikseen edellä mainitulla komennolla. Kummassakin tavassa (all-vipu, tai kukin tiedosto erikseen) on puolensa.

Huomaa, että .gitignore-tiedosto sisältää tiedot sellaisista tiedostoista, joita ei lähtökohtaisesti viedä versiohallintaan. Jos kuitenkin ehdottomasti haluat lisätä tällaisen, esimerkiksi .jar-päätteisen tiedoston, niin silloin on käytettävä -f -optiota, jolla pakotetaan lisäys. Esimerkiksi:

git add -f kerho.jar

Toinen vaihtoehto on erikseen sallia vastava jar lisäämällä .gitignore-tiedostoon rivin .jar perään rivi:

!kerho.jar

Tehtyjen muutosten lähettäminen etävarastoon (push)

Tässä vaiheessa paikalliseen tietovarastoon lähetetyt muutokset lähetetään etävarastoon.

Tämä vaihe tehdään joka kerta kun olet tehnyt muutoksia koodiin tai muihin tiedostoihin. Älä unohda tehdä tätä työskentelyn päätteeksi. Muutoin tiedot jäävät vain paikalliseen tietovarastoon.

Avaa Pääte (macOS), Git Bash (Windows) tai muu komentorivi. Siirry harjoitustyökansioosi cd-komentoja käyttämällä ja anna sitten komento

git push

Ensimmäisellä kerralla sinulta kysytään käyttäjätunnusta ja salasanaa. Valitse kirjautumisikkunassa muodoksi Salasana (Password), ei Token.

Anna käyttäjätunnus lyhyessä muodossa käyttäjätunnus ilman @-merkkiä ja loppuosaa. Salasana on se, jota käytät JY-verkossa.

Mikäli annat salasanan väärin, joudut muokkaamaan kirjautumistietojasi, ks. kohta 12.

MacOS-käyttäjät huomatkaa, että salasana on KIRJOITETTAVA vaikka sen kohdalla näkyisi avaimen kuva. Kun salasanaa kirjoitetaan, ei näyttöön tule mitään. Lopuksi on painettava enter. Jos tässä tulee virhe, niin gitlab-salasana on poistettava avainnipusta.

Tarkista tämän jälkeen Gitlab-osoitteestasi, että sieltä löytyy lähettämäsi tiedostot (alkukurssista ne kuvat).

Muutosten hakeminen etävarastosta paikalliseen varastoon (pull)

Kun sinä tai joku muu on muuttanut tiedostoja ja vienyt muutoksia etävarastoon, niin muutokset tulee hakea omalle koneelle. Yhteistyöskentelyssä on syytä aina työskentelyä aloittaessa antaa pull-komento.

Siirry hakemistoon, johon olet kloonannut projektin (ks. clone) ja anna komento:

git pull

Tässä kohti voi tulla kysymys siitä, että miten käyttäjä haluaa pull-komennon jatkossa toimivan. Ohj1-kurssin osalta toimiva vaihtoehto on

git config pull.rebase false

Lue tästä lisää esimerkiksi StackOverflowsta.

Git ja ryhmätyöskentely

Kun työskennellään ryhmässä esimerkiksi jos teet harjoitustyön parityönä, tulee eräisiin Git-toimintoihin kiinnittää erityistä huomiota, jotta välttyy turhalta työltä. Kun useampi työstää samaa tiedostoa, tulee helposti tilanne, jossa on tehty eri muokkauksia samoille riveille. Tällöin Git ei tiedä mitä tehdä ja konfliktit täytyy ratkaista käsin. Tälläistä tilannetta kutsutaan nimellä merge conflict ja se ilmaantuu, kun omia muutoksia yrittää puskea tai kun muutoksia koitetaan hakea omalle koneelle.

Alla on esitetty tärkeimmät tavat, joilla vältytään ongelmilta, kun työstetään samaa haaraa ryhmänä.

  • Kommunikoikaa selkeästi mitä työstätte ja milloin.

  • Aina ennen kuin aloittaa koodaamisen, haetaan muutokset etävarastosta --rebase lipulla, jonka ansiosta omat muutokset asetetaan paikalliseen varastoon vasta etävarastosta haettujen muutosten jälkeen.

    git pull --rebase
    
  • Kun viette (push) muutoksia etävarastoon, ilmoittakaa siitä muulle ryhmälle.

Esimerkki merge conflict -tilanteesta

Vaikka noudattettaisiin hyviä käytänteitä, niin välillä merge conflict tulee vastaan silti. Tätä ei kuitenkaan kannata pelätä ja se saadaan ratkaistua esimerkiksi Riderissa. Tässä skenaariossa kaksi kehittäjää muokkaa samaa tiedostoa ja molemmat ovat haarassa main.

Kehittäjä A puskee etävarastoon seuraavan koodin:

public override void Begin()
{
    PhysicsObject nelio = new PhysicsObject(100, 100, Shape.Rectangle);
    Add(nelio);
}

Tämän jälkeen Kehittäjä B luo oman kommitin ja yrittää puskea (push) oman koodinsa, jossa luodaan pallo, etävarastoon:

public override void Begin()
{
    PhysicsObject pallo = new PhysicsObject(50, 50, Shape.Circle);
    Add(pallo);
}

Tämä pusku ei onnistu, sillä Kehittäjä A on puskenut oman muutoksensa etävarastoon ja Kehittäjä B ei ole hakenut näitä muutoksia itselleen lokaaliin varastoon. Komento git push johtaa tämän näköiseen tulosteeseen. Epäonnistunut pusku merge conflictissä

Kehittäjä B hakee muutokset itselleen komennolla git pull --rebase. Tämä komento epäonnistuu kuvassa näkyvällä tulosteella. Epäonnistunut hakeminen merge conflictissä

Jos tämä komento ajettiin Riderin terminaalissa, niin Rider näyttää ylälaidassa varoituksen merge conflictista. Tästä ilmoituksesta voi klikata Resolve conflicts... nappia, jolloin avautuu Riderin näkymä konfliktien ratkomiseen. Riderin merge conflict varoitus

Konfliktin ratkaiseminen editorissa

Riderin Merge conflict editor näkymä näkyy alla olevassa kuvassa. Editorissa on kolme ikkunaa. Vasemmalla puolella on Kehittäjän B lokaalit muutokset, eli hänen, joka yritti hakea muutoksia etävarastosta. Oikealla puolella taas näkyy etävarastosta haettu tiedosto. Keskimmäinen ikkuna taas näyttää lopputuloksen. Riderin merge conflict editori

Nyt Kehittäjän B tulee päättää, säilytetäänkö lokaalit muutokset vai etävarastosta haetut muutokset. Tämä tapahtuu painamalla muutoksen eli punaisella näkyvän alueen kohdalla ikkunoiden välissä näkyvää nuoli symbolia joko vasemmalta(lokaali) tai oikealta(etävarasto) puolelta. Tämän jälkeen valittu muutos siirtyy keskimmäiseen ikkunaan. Kun kaikki konfliktit on ratkaistu tällä tavoin ja lopputulos(keskimmäinen ikkuna) näyttää oikealta, voidaan painaa alakulmasta Apply nappia ja sitten Apply Changes and Mark Resolved.

Tehdään tämä vielä muille mahdollisille tiedostoille, joissa on konflikteja. Lopuksi kun yhtään konfliktiä ei ole enää jälellä, painetaan Riderin yläreunasta vihreää nuolikuvaketta Continue Rebase. Tämän jälkeen Merge conflict on ratkaistu ja Kehittäjä B voi jatkaa työskentelyä normaalisti.

Huomioitavaa

Tiedostojen koko

Versionhallintajärjestelmä ei sovi suurten tiedostojen tallennukseen. Älä lähetä versiohallintaan esimerkiksi suuria kuva-, musiikki- tai videotiedostoja. Myöskään bin, obj ja vastaavat kansiot (sis. käännetyt ohjelmat ja muut IDE:n tuottamat käännöksen oheistiedostot) eivät kuulu versiohallintaan. Täydennä tarvittaessa .gitignore-tiedostoa.

Älä laita salaisuuksia versiohallintaan

Älä lisää projektisi commiteihin mitään salaista, kuten salasanoja tai henkilötietoja. Vaikka poistaisit tiedon seuraavassa commitissa, se jää Gitin projekti-historiaan, ja on löydettävissä julkaisun jälkeen. Mikäli kuitenkin lähetit etävarastoon jotain, jonka haluat poistaa myöhemmin, se onnistuu esimerkiksi BFG Repo-Cleaner-työkalun avulla.

Tapoja käyttää Gitiä

Aluksi ehdottomasti suositeltavin tapa on käyttää Gitiä komentoriviltä. On olemassa kuitenkin myös graafisia ympäristöjä Gitin käyttämiseen. Myös IDEissä on nykyään varsin asialliset Git-asiakasohjelmistot (eli käyttöliittymä Git-komentojen käyttämistä varten), joskin jokainen on aina vähän omanlaisensa ja vaatii totuttelua. Kaikkia alla mainittuja työkaluja voit kuitenkin käyttää ristiin. Kannattaa kokeilla eri tapoja. Mikroluokista löytyy ainakin komentorivityökalut, Eclipse sekä TortoiseGit.

Git termejä

  • repository, suom. säilytyspaikka, tietovarasto tai arkisesti "repo" = Paikka jossa versioitava tieto tallennetaan, voi olla paikallinen (local) tai etä (remote). Periaatteessa samasta projektista voi olla samasta projektista useita säilytyspaikkoja niin paikallisesti kuin etänä. local repository on käytännössä hakemistossa oleva .git-hakemisto. Repository koostuu loogisesti commiteista, jotka muodostavat kokoelman projektin eri vaiheista. Näin mihin tahansa commitoituun kohtaan voidaan viitata tai tarvittaessa myös palata.
  • fork = projektista tehty "kopiohaara", joka elää omaa elämäänsä irrallaan alkuperäisestä projektista. Fork ei ole Gitin toiminto, mutta useat ulkoiset Git-palvelimet (kuten GitHub ja GitLab) tarjoavat tämän toiminnon.
  • origin = lyhenne käytettävän etävaraston osoitteelle (remote repository). Jos etäsäilytyspaikkoja on useita, tulee näitäkin useita.
  • project = jokin selkeä projekti, joka tähtää esimerkiksi jonkin yhden ohjelmatuotteen tekemiseen
  • working directory (tai workspace) = työhakemisto, lokaali työhakemisto (kaikki tiedostot ja versiot löytyvät tämän alla olevasta .git -hakemistosta, jos ne on koneelle haettu (fetch))
  • index = varastoon seuraavalla commitilla siirrettävien tiedostojen luettelo (versioitavien, staging area joissakin lähteissä, koska tiedosto laitetaan "näytille"). Käytännössä tiedosto .git/index.
  • main = projektin päähaaran oletusnimi, joka pyritään pitämään toimivana koodina. Aikaisemmin päähaaran oletusnimi oli master.

Vaativampaan käyttöön ja viimeistään Ohjelmointi 2 -kurssilla tarvittavia termejä:

  • branch = kehityshaara jossa kehitetään uutta koodia. Kehityshaaroja voi olla useita. Kun koodi on hyväksi todettu, se voidaan yhdistää (merge) päähaaraan.
  • tag = jäädytetty haara (esimerkiksi ohjelman tietty versio), jota ei aktiivisesti kehitetä, mutta johon voi tulla esimerkiksi tietoturvapäivityksiä
  • HEAD = viite aktiivisen haaran "päähän" tietyssä lokaalissa

Kurssilla käytettäviä Git-komentoja:

git config --global user.name "käyttäjätunnus"
git config --global user.email "tunnus@student.jyu.fi"    
git clone https://gitlab.jyu.fi/käyttäjätunnus/ohj1ht.git .
git status  # tätä komentoa kannattaa käyttää ahkeraan vaikka joka välissä
git log     # samoin tätä, kunhan opit lukemaan sen sisältöä
# tee tarvittavia muutoksia
git add --all
git commit -m "Vaihe 1, kuvat"
git push    # kaverin pitää tämän jälkeen tehdä kotona tehdä git pull
git pull

Ongelmia?

Yleisimpiä ongelmia on lueteltu alla.

remote: The project you were looking for could not be found or you don't have permission to view it.

Annoit git clone -komennolle väärän etävaraston URL-osoitteen. Tarkista etävarastosi osoite gitlab.jyu.fi-palvelussa oman projektisi kohdasta Clone Clone with HTTPS. Anna tämä osoite git clone -komennon perään.

Syy, miksi näin kävi, johtuu todennäköisesti siitä, että forkkia tehdessäsi muutit Project slugia, eli projektin tunnistetta, joka muuttaa etävaraston URL-osoitetta.

Push ei onnistu (remote: HTTP Basic: Access denied)

Ongelma: Git ei anna viedä mitään etävarastoon (push ei onnistu). Antaa virheilmoituksen:

remote: HTTP Basic: Access denied fatal: Authentication failed for 'https://gitlab.jyu.fi/NIMI/ohj1ht.git'

Push access denied

Huomaa, että virheilmoitus voi näyttää hieman erilaiselta riippuen siitä käytätkö komentoriviä vai jotain muuta Git-asiakasohjelmaa.

Syy (vaihtoehto 1): Etävaraston url-osoitteesta puuttuu lopusta osa .git.

Korjaus: Anna git bashissa / Päätteessä komento git remote -v

Jos fetch- ja push-urlien lopussa ei ole .git-osaa, käy kopioimassa GitLab-palvelussa varastosi HTTPS-url-osoite, ks. kuva alla.

Gitlab clone https

Anna sitten alla oleva komento, ja pasteta URL-kohtaan äsken kopioimasi osoite.

git remote set-url URL

Kokeile nyt tehdä git push.

Syy (vaihtoehto 2): Olet kirjautumisikkunassa kirjoittanut käyttäjätunnuksesi tai salasanasi väärin.

Korjaus Windowsilla: Tarkistetaan käyttäjänimi ja kirjoitetaan salasana uudelleen.

  1. Avaa Control panel (ohjauspaneeli).
  2. Valitse 'User accounts' (käyttäjätilit).
  3. Valitse 'Manage your credentials' (Tunnistetietojen hallinta).

Win credman 1

  1. Valitse 'Windows credentials' (Windows-tunnistetiedot).

Win credman 2

  1. Laajentamalla gitin kohtaa, pitäisi päästä muokkaamaan asetettuja käyttäjänimeä ja salasanaa.

Korjaus Mac: Sama homma macOS:ssa (??): https://help.github.com/en/github/using-git/updating-credentials-from-the-osx-keychain

fatal: destination path ‘.’ already exists and is not an empty directory

git clone komennon jälkeen antaa tälläisen:

fatal: destination path ‘.’ already exists and is not an empty directory.

Korjaus: Kun tehdään clone, pitää olla tyhjässä hakemistossa.

'[ht]/' does not have a commit checked out, fatal: adding files failed

Poista projektin hakemistosta .git-kansio. (Huom. älä poista ylätason hakemistosta.) Piilotetut kansiot eivät välttämättä näy tiedostonhallinta-ikkunassa (macOS:lla Finder). Komentorivillä tuon poisto onnistuu esim

rm -rf .git
You can't push or pull repositories using SSH until you add an SSH key to your profile

Syy: Kloonatessasi etävarastoa olet todennäköisesti valinnut SSH-osoitteen HTTPS-osoitteen sijaan.

Suositellaan, että otat tässä kohden työstäsi varmuuskopion.

Korjaus, tapa 1:

  1. Kopioi Gitlab-palvelusta (tai muusta palvelusta) tietovarastosi HTTPS-osoite.
  2. Avaa komentorivi.
  3. Siirry cd-komentoja käyttäen harjoitustyösi kansioon.
  4. Anna komentorivillä komento git remote. Näyttöön pitäisi tulostua teksti origin. Mikäli tulostuu jotain muuta, korvaa seuraavassa kohdassa origin-sana sillä, mitä sinulle tulostui.
  5. Anna komentorivillä alla oleva komento ja korvaa UUSIOSOITE kohdassa 1 kopioimallasi osoitteella
git remote set-url origin UUSIOSOITE

Korjaus, tapa 2: Jos tapa 1 ei toimi, voit tehdä uuden clonen uuteen kansioon käyttäen HTTPS-osoitetta, ja kopioida aikaisempaan kansioon tekemäsi muutokset tähän uuteen kansioon. Tämän jälkeen pitää tehdä add- ja commit-komennot uudestaan, sen jälkeen push pitäisi onnistua.

Joskus käy niin että Gitissä tulee touhuttua jotakin mikä saa hommat ihan solmuun. Joihinkin probleemiin vastauksia voi löytyä täältä: https://ohshitgit.com/. Ko. saitin kielenkäyttö ei ehkä sovi perheen pienimmille mutta varsinaiset vinkit voivat pelastaa kiperistä tilanteista.

Lisätietoa kiinnostuneille

Harjoitustyö

Tällä sivulla kerrotaan harjoitustyön aikataulusta, kuvataan harjoitustyön vaiheet, sekä kerrotaan harjoitustyöstä tarkistettavat asiat.

Mikä on harjoitustyö

Ohjelmointi 1 -opintojakson harjoitus työ

  • on osa kurssisuoritusta ja arvioidaan asteikolla hyväksytty/hylätty. Harjoitustyö pitää olla hyväksytty ennen kuin kurssista voi saada arvosanan.
  • tehdään yksin tai parityönä. Mikäli luontaista paria ei löydy, ei sitä kannata ehkä etsiäkään väkisin. Kolmen hengen ja sitä isompia ryhmiä ei hyväksytä.
  • sisältää keskimääräisesti opiskelijaa kohti noin 27 tuntia työtä. Parityönä tehtävän työn määrä on siis laskennallisesti 54 tuntia. Katso tarkat vaatimukset paritöille alla.
  • voi olla Jypeli-työkaluilla tehty peli, mutta voi olla jokin muukin C#-kielellä tehty komentoriviohjelma. Muita kieliä ei hyväksytä.

Vaiheet ja aikataulu

Harjoitustyöhön kuuluu kolme vaihetta: Vaihe 1 (suunnitelma), Vaihe 2 (työ 50 % valmis) ja Vaihe 3 (työ 100 % valmis). Vaiheiden tarkemmat kuvaukset löytyvät alta.

Harjoitustyön vaiheet palautetaan esittelemällä ne ohjaajalle. Voit esittää harjoitustyösi ohjauksessa tai sopimalla erillinen ohjausaika sähköpostitse ohj1-opet@jyu.onmicrosoft.com.

Aikataulu ja takarajat

Tutkinto-opiskelijatLukiolinjatAvoin yliopisto
Jokainen vaihe tulee palauttaa ennen asetettua takarajaa. Mahdollisista aikataulujoustoista (esim. sairauden takia) on aina sovittava ohjaajan kanssa. Työn vaiheiden palauttaminen myöhässä ilman ennalta sovittua joustoa voi johtaa harjoitustyön hylkäämiseen. Päätöksen tekevät opintojakson vastuuopettajat tapauskohtaisesti.Vaiheet tulee palauttaa valitsemasi opintojaksototeutuksen aikataulun mukaisesti.Vaiheiden palauttamiselle ei ole kiinteitä takarajoja, mutta vaiheet on hyväksytettävä ohjaajalla. Kun vaihe on valmis, laita harjoitustyön vaihe ajoissa versionhallintaan ja käy esittelemässä työtä ohjaajalle pääteohjaustilaisuuksissa.

Harjoitustyön vaiheiden kuvaukset ja tarkistuslistat

Vaihe 1: Suunnitelma versiohallinnassa

  1. Tutkinto-opiskelijat ja lukiolinjat: Suunnitelma on näytettävä ohjaajalle ennen osan 5 harjoitustehtävien takarajaa.
  2. Sinulla tulee olla Git-työkalu asennettuna (ohje).
  3. Luo oma etävarasto GitLabiin tai GitHubiin. (Katso kirjalliset ohjeet tai ohjevideo).
  4. Kopioi ja liitä etävarastosi osoite Oma eteneminen-sivulle . Etävaraston osoitteen on oltava muotoa https://github.com/nimi/ohj1ht.git tai https://gitlab.com/nimi/ohj1ht.git. TODO: Linkki.
  5. Aseta omat Git-tiedot (ohje).
  6. Hae oma etävarastosi omalle tietokoneelle Git-työkalun avulla (ohje).
  7. Kirjoita harjoitustyön suunnitelma ladattuun harjoitustyökansioon. Katso suunnitelman vaatimukset alla ja katso esimerkkisuunnitelma.
  8. Lataa suunnitelmasi ja kuvasi etävarastoon (add-commit ja push).
  9. Esittele suunnitelma ohjaajalle lähi- tai etäohjauksessa.

Vaihe 2: Työ 50 % valmis

  1. Tutkinto-opiskelijat ja lukiolinjat: Harjoitustyön tilanne on näytettävä ohjaajalle ennen osan 8 harjoitustehtävien takarajaa.
  2. Tee työsi eteenpäin suunnitelman mukaan.
    • Luo ohjelmakoodia varten uusi solution.
    • Aseta Solution directory-kohtaan sama polku kuin 1. vaiheen Git-varastolla. Esim. C:\kurssit\ohj1\ht.
    • Pidä mielessä suunnitelmasi sekä harjoitustyön vaatimukset.
    • Jos teet harjoitustyön parityönä, muista tehdä tarkka tuntikirjanpito
  3. Varmista, että työsi koodi on ajan tasalla etävarastossa.
  4. Esittele suunnitelma ohjaajalle lähi- tai etäohjauksessa.

Jos tämä vaihe on pahasti kesken, tarkastaja palauttaa työn opiskelijalle ja antaa 7 päivää aikaa tehdä korjaukset, jonka jälkeen vaihe tarkastetaan uudelleen.

Vaihe 3: Työ 100 % valmis

  1. Tutkinto-opiskelijat ja lukiolinjat: Näytettävä ohjaajalle ennen kuin menet tenttiin
  2. Tarkista, että työ täyttää kaikki vaaditut osa-alueet
  3. Jos teet harjoitustyön parityönä, tarkista, että tuntikirjanpito on ajan tasalla
  4. Varmista, että työsi lopullinen, toimiva koodi on etävarastossa
  5. Esittele työ ohjaajalle lähi- tai etäohjauksessa.

Mikäli ohjaaja antaa merkittävän määrän korjauskehotuksia, opiskelijalla on 7 päivää aikaa tehdä korjaukset, jonka jälkeen vaihe tarkastetaan uudelleen.


Vaatimukset

Suunnitelma

Harjoitustyö täytyy olla suunniteltu ja suunnitelman tulee olla ohjaajan hyväksymä. Suunnitelmat tallennetaan GitLabiin, ks. yläpuolelta vaiheen 1 tarkistuslista.

Suunnitelmassa pitää olla ainakin seuraavat asiat (soveltaen ei-peliharjoitustyöhön):

  1. Tekijöiden nimet
  2. Pelin nimi
  3. Harjoitustyön osoite gitissä
  4. Pelaajien lukumäärä (1-4)
  5. Pelin taustatarina tai kuvaus pelin teemasta
  6. Pelin idea ja tavoitteet
  7. Hahmotelma pelistä (kuva tai kuvia paperilla käsin tai tietokoneella piirrettynä)
  8. Jonkinlainen kuvaus siitä, miten peli etenee
  9. Pelissä olevat oliot, niiden toiminnot ja missä suhteessa ne ovat toisiinsa
  10. Toteutuksen suunnitelma: mitä tekisin ja missä järjestyksessä? Millä aikataululla?

Toiminnallisuus

Pelissä pitää tapahtua jotakin, eli ruudulla pitää tapahtua jotain järkevää. Käyttäjän tulee voida osallistua peliin interaktiivisesti esimerkiksi hiiren ja/tai näppäimistön välityksellä.

Koodi

Työssä on oltava vähintään muutama aliohjelma Jypelin valmiiden aliohjelmien (Main, Begin) lisäksi.

Muut tarkastettavat osa-alueet on lueteltu alempana kohdassa "Tarkastettavat osa-alueet".

Paritöistä

Kaikki ryhmäläiset käyttävät samaa etävaraston osoitetta. Ks. Git-ohjeet.

Molempien on annettava kutakuinkin yhtäläinen panos työn ohjelmalliseen toteutukseen. Yksittäisenä varoittavana esimerkkinä mainittakoon parityö, jossa toinen on paneutunut grafiikan tekemiseen ja toinen ohjelmointiin. Tällöin grafiikkaan paneutuneelta osallistujalta voidaan pyytää lisänäyttöjä työn ohjelmalliseen toteutukseen johon parityön toinen osapuoli ei saa osallistua. Lisäksi kummankin tekijän on pystyttävä esittämään riittävän tarkka tuntikirjanpito ja selvitys mitä työajalla on tehty, jotta osaamistavoitteet ohjelmoinnin osalta voidaan todentaa.

Työn on oltava vaativampi kuin yksin tehdyn työn, ja tässä työmäärä on tärkein mittari. Ohjaajat käyvät työn läpi tarkastustilaisuudessa ryhmäläisten kanssa. Yksittäistä pelin ominaisuutta joka kaikilta paritöiltä vaadittaisiin ei yleisellä tasolla voi antaa. Näiden kriteerien tarkoitus ei ole vaikeuttaa tekemistä vaan ehkäistä ennalta vapaamatkustamista.

Tarkastettavat osa-alueet

Alla on tarkastettavien osa-alueiden lista, jonka ohjaajat tulevat tarkastamaan harjoitustyön esittelemisen yhteydessä.

  1. Koodin tyyli on kurssin tyylioppaan mukaista.

  2. Näkyvyys: Aliohjelmien ja attribuuttien näkyvyys tulee olla määritelty (public, private). Julkisia staattisia (public static) muuttujia ei saa olla.

  3. Ei turhia peliluokan attribuutteja.

    Jos joitain koko peliluokkaan näkyviä arvoja tarvitaan, pyritään käyttämään vakioita (const). Kuvat, äänet, animaatiot ja muut raskaat resurssit on kuitenkin hyvä pitää attribuutteina, jolloin ne ladataan vain kerran pelin aikana. Esim. kuvien olioviitteet voi kiinnittää muuttumattomaksi static readonly määreellä.

  4. Toimii: Ohjelma toimii, ei kaadu ja päättyy asiallisesti.

    Pelissä pitää tapahtua jotakin järkevää, johon käyttäjä voi osallistua interaktiivisesti. Pelissä pitää myös olla tavoite, haaste tai tarina.

  5. Ei toistoa, joka olisi voitu tehdä silmukoilla tai aliohjelmilla.

    Myöskään aliohjelmien välillä ei saa olla toistoa: esimerkiksi LuoVihu1 ja LuoVihu2, joissa olisi lähes sama koodi kahteen kertaan.

  6. Taulukko: Käytetään taulukkoa tai listaa.

    Tietorakenteella täytyy olla jokin tarkoitus siten, että sinne tallennetaan useita arvoja, joita todella käytetään pelissä. Tietorakenteen käytön tulee parantaa koodin laatua ja helpottaa koodin lukemista, kirjoittamista tai edelleenkehittämistä. Keinotekoisia tai vailla käyttötarkoitusta olevia tietorakenteita ei hyväksytä. Esimerkkejä.

  7. Silmukka: Ainakin yksi silmukka.

    Silmukalla täytyy olla jokin tarkoitus siten, että rakenteen avulla luetaan ja/tai käsitellään tietoa. Ei riitä että lisätään "tähtiä taivaalle silmukassa 10 kpl." Silmukalla tulee olla merkitys, joka parantaa koodin laatua ja helpottaa koodin lukemista, kirjoittamista tai edelleenkehittämistä. Esimerkkejä.

  8. Ei turhia literaaleja: Kiinteiden lukuarvojen tai muiden sellaisten arvojen käyttö, jotka heikentävät koodin ylläpidettävyyttä, on kielletty.

    Et siis saa tehdä koodia kuten

    if (y < 18)
    

    jossa 18 on hyvin todennäköisesti turha literaali. Sen tilalle tulee laittaa muuttuja tai vakio, kuten

    int pisteraja = 18
    

    Vakiot ilmaistaan const-määreellä.

  9. } + 2 tyhjää: Aliohjelmien loppusulun } jälkeen tasan kaksi tyhjää riviä.

  10. Dokumentaatio: Luokat, aliohjelmat ja attribuutit tulee dokumentoida.

    Dokumenteissa kuvataan muun muassa sitä, mitä aliohjelmat tekevät, ei miten ne sen tekevät. Luokan alussa tulee olla tekijän nimi ja versio (@author, @version). Myös attribuutit dokumentoidaan summary-tagein.

  11. Funktio: Pelissä on funktio.

    Funktio ottaa vastaan parametrin tai parametreja, käsittelee parametrina saatua tietoa, ja palauttaa arvon annetun syötteen perusteella. Funktion täytyy prosessoida tietoa jotenkin; funktiolla täytyy olla jokin todellinen tarkoitus ohjelman kokonaisuuden kannalta. Tyypillisesti funktiossa voi hyödyntää silmukkaa tai taulukkoa/listaa. Esimerkkejä.

  12. Ei virheitä eikä varoituksia Riderin oikeassa yläkulmassa. Muista asentaa kurssin Rider-asetukset

  13. Ei-pelien tapauksessa osoitettu myös taito testata aliohjelmia.

Usein kysytyt kysymykset ja muut vinkit

Millaisia pelejä voi harjoitustyöksi tehdä?

Jos et keksi, minkä tyylisen pelin haluaisit tehdä, katso, millaisia pelejä on tehty edellisissä toteutuksissa:

Muista että voit tehdä muutakin kuin pelin!

Miten saan taulukon, silmukan tai funktion peliini?

Kun tallennat pelin olioita tai tapahtumia listaan / taulukkoon, voit käsitellä niitä yhdellä silmukalla ja paketoida logiikan omaan funktioon. Näin syntyy sekä selkeää että tehokasta koodia.

Mitä pelidataa kannattaa kerätä? Tässä esimerkkejä.

  • Pelaajan syötteet: painetut näppäimet, kosketukset
  • Pelimaailman tila: viholliset, kerättävät, esteet
  • Tapahtumat: törmäysten tagit, pistemäärät, aikaleimat, ratakierrokset

Tallenna tiedot listaan sitä mukaa kun ne (olio, tapahtuma...) syntyvät.

Millainen funktio voisi olla? Tässä esimerkkejä. Huomaa, että nämä ovat enemmän ideoita siitä, millaiset funktiot voisivat olla pelissä hyödyllisiä.

  • Laske aikojen keskiarvo
  • Etsi minimi, maksimi tai eniten kerätty esine
  • Yhdistele dataa (esim. kaksinpelissä pallon hallinta-aika)
  • Erityisesti ei-peleissä jokin muu tiedonkäsittely, johon liittyy sisään menevä aineisto ja siitä tehty laskennallinen tulos

Pidä laskentalogiikka omassa funktiossa, jotta peliluokka pysyy selkeänä.

Milloin dataa käsitellään? Tässä esimerkkejä.

  • Kenttä vaihtuu
  • Aikaraja ylittyy
  • Peli alkaa alusta

Hyödynnä tulokset pelissä Tässä esimerkkejä.

  • Näytä pelaajalle (pisteet, tilastot, top-ajat)
  • Käynnistä uusi vaikeustaso, jos keskimääräinen kierrosaika laskee
  • Palkitse pelaaja, kun kerättyjen esineiden määrä ylittää rajan

Jypelin kirjaston ohjeissa on koodiesimerkkejä, joissa käytetään silmukkaa tai taulukkoa. Nämä eivät sellaisenaan riitä, vaan työssä tulee olla oman ajatustyön tulos.

Mikäli omassa pelissä ei ole taulukkoa/listaa, silmukkaa tai funktiota, pitää ohjaajalle esittää itse tehdyn (ts. työ on tehty omatoimisesti ilman merkittävää apua ohjaajalta tai muilta opiskelijoilta) demotehtävän vastaus, missä em. asioiden osaaminen on näytetty. Tästä voi laittaa vaikka kommentin omaan harjoitustyöhön tyyliin:

// TODO: taulukko, ks: https://tim.jyu.fi/answers/kurssit/tie/ohj1/%%vuosik%%/demot/demo7?answerNumber=1&task=matriisiensumma&user=anlakane

Linkin saa otettua demotehtävän vierellä olevasta pienestä Link-linkistä klikkaamalla sitä hiiren oikealla painikkeella, ja kopioimalla linkin osoite.

Voinko tehdä jotain muuta kuin peli?

Kyllä, vaihtoehtoja ovat esimerkiksi:

Muita vaihtoehtoja:

  • Yksi esimerkki voisi olla vaikkapa lukea tiedostosta suomenkielinen teksti ja lasketaan mitä vokaalia on eniten.
  • Tai työ voi olla tietyn WWW-sivun lukeminen ja sieltä tiettyjen tietojen käsittely yksinkertaiseen muotoon.
  • Esimerkiksi joltakin sääsivulta päivän tuuliarvojen maksimi ja keskiarvo.

Monet Advent of code -tapahtuman tehtävät voivat hyvinkin soveltua harjoitustyön aiheeksi -- tosin loppupään tehtävät ovat jo hyvin vaikeita. Inspraatiota voi hakea myös vaikkapa täältä http://nifty.stanford.edu/. Katso tuolta CS1-tasoiset tehtävät, niiden pitäisi (suurelta osin) olla tämän kurssin osaamistavoitteiden mukaisia. Näissäkin tapauksissa suunnitelma tulee kuitenkin hyväksyttää ohjaajalla.

Ei-pelien tapauksessa ohjelmaan tehdyt testattavissa olevat aliohjelmat tulee testata.

Mistä aloitan pelin koodaamisen?

Inspiraatiota voi hakea vaikkapa Pong-pelistä tai Läpsylinnusta.

Miten voisin työskennellä parin kanssa samanaikaisesti?

Lähtökohtaisesti on kolme tapaa, joita tällä opintojaksolla suositellaan:

  • Kunkin tekee muutoksia omalla koneella ja lataa ne samaan etävarastoon
  • Pariohjelmointi
  • Koodieditorin jakaminen verkossa (Google Docs -tyylinen samanaikainen muokkaus)

Eri koneet, sama etävarasto:

Yleisin tapa yhdessä ohjelmointiin on, että kumpikin lataa saman etävaraston omalle tietokoneelle, tekee omia muutoksia ja lataa ne takaisin samaan etävarastoon. Niin kauan kuin muutoksia ei tehdä päällekkäin (eli kummatkin muokkaatte samaa koodiriviä) tai päällekkäiset muutokset ovat tarpeeksi yksinkertaisia, git-työkalu osaa yhdistää kahden eri tekijän muutokset yhteen. Tässä tärkeintä on, että muutokset lähetetään etävarastoon (git push) ja ladataan (git pull) sieltä mahdollisimman usein. Tapauksissa, jossa git-työkalu ei pysty yhdistämään kahden henkilön muutoksia, syntyy ns. konflikti, joka pitää ratkaista itse. Git-konfliktien ratkaiseminen on tämän opintojakson ulkopuolella; ongelmatilanteissa ota yhteyttä siis ohjaajaan. Lyhyt kuvaus tästä löytyy Git ja ryhmätyöskentely osiosta.

Pariohjelmointi:

Toinen tapa työskennellä yhdessä on pariohjelmointi (engl. pair programming). Siinä kumpikin pari työskentelee saman tietokoneen äärellä: yksi parista ohjelmoi ja toinen seuraa tai ohjaa. Ajatus on, että rooleja vaihdetaan usein -- vaihto voi tapahtua jopa "lennosta". Koska muutokset tehdään samalla tietokoneella, koodin lataaminen etävarastoon menee samalla tavalla kuin jos tekisi harjoitustyötä yksin. Pariohjelmoinnin tapauksessa tulee kuitenkin pitää tarkasti tuntikirjanpitoa, sillä kunkin parin työpanosta ei näe suoraan git-versiohistoriasta. Pariohjelmointi lisäksi toimii parhaiten lähitapaamisissa, sillä "vuoron vaihtaminen" etänä on yleensä hankalaa.

Työskentely samanaikaisesti verkossa:

Jos työtä halutaan työstää yhtä aikaa samassa editorissa, helpoin tapa on käyttää Riderin Code With Me -ominaisuutta. Ominaisuuden avulla koodieditorista tulee Google Docs -tapainen alue, jossa kaksi tai useampaa henkilöä voi muokata koodia samanaikaisesti eri koneella. Muutokset tallentuvat yhdelle tietokoneelle, josta ne on helppoa ladata etävarastoon ilman konflikteja. Ominaisuus on Riderissa betakokeilussa. Valitettavasti non-commercial-lisenssillä (oletus tällä kurssilla) session enimmäisaika on 30 minuuttia. Jos anot opiskelijalisenssiä (ks. seuraava ohje), saat (ilmeisesti) rajattoman käyttöajan.

Opiskelijalisenssin anominen Rideriin

Voit anoa itsellesi maksuttoman opiskelijalisenssin käyttäen student.jyu.fi-sähköpostiosoitetta. Noudata huolellisesti alla olevia ohjeita.

  1. Varmista, että student.jyu.fi-osoitteesi toimii. Kannattaa lähettää itselleen testiposti jostain ulkopuolisesta osoitteesta (esim. Gmail tai Hotmail) ja katsoa tuleeko posti itselle perille. Ota varmuuden vuoksi mahdollinen edelleenohjaus pois päältä. Huomioi, että edelleenohjauksen deaktivoitumisessa on viivettä. Jos posti ei tule perille, tarkista account.jyu.fi sähköpostiasetukset. Selvitä tarvittaessa Digipalveluiden (help.jyu.fi) kanssa missä vika on.

    Et voi edetä tässä ohjeessa, jos opiskelijasähköpostisi ei toimi.

  2. Siirry osoitteeseen https://www.jetbrains.com/community/education/#students

  3. Klikkaa Apply now.

  4. Täytä tiedot Apply with: University email address -lomakkeessa, ole tarkkana että annat student.jyu.fi-loppuisen opiskelijasähköpostiosoitteen. Hyväksy mahdolliset käyttöehdot. Klikkaa Apply for free products.

  5. Avaa yliopiston sähköpostisi, noudata JetBrainsin lähettämän vahvistusviestin ohjeita ja vahvista lisenssi. Jos viesti ei tulekaan, älä lähetä lomaketta useita kertoja "varmuuden vuoksi". Siitä on vain ja ainoastaan haittaa.

  6. JetBrains pyytää linkittämään lisenssin JetBrains-tiliin. Tilin voinee luoda M365/Microsoft-tilin kautta valitsemalla Sign in with Microsoft ja yhdistämällä suoraan
    yliopiston sähköpostiin.

Lisenssi on voimassa vuoden, jonka jälkeen sen voi uusia.

Jos teet yrityksiä väärällä sähköpostiosoitteella (esim. muulla kuin tuo pitkä student-muoto), niin
JetBrains lisää osoitteesi mustalle listalle, ja sen jälkeen osoitteen avaamista pitää pyytää lomakkeella:

Code With Me käyttöönotto: Valitse yläpalkista ToolsEnable Code With Me ja lopuksi Enable and restart

Session aloitus

  1. Yksi ryhmänjäsen käynnistää Code With Me session oikealta ylhäältä löytyvästä kuvakkeesta. (henkilön kuva plus merkillä)

  2. Valitse sopivat oikeudet. Edit files sopivin mikäli koodataan yhdessä. Tämän jälkeen valitse Start Session

  3. Lähetä liittymislinkki kaikille koodisessioon osallistuville. Linkin saat jälleen oikealta ylhäältä Code With Me valikosta.

Sessioon Liittyminen

  1. Mene linkkiin, jonka session aloittaja jakoi ja paina Join Session. Mikäli mitään ei tapahdu, asenna sivun ohjeiden mukaan Toolbox App.

  2. Odota, että session aloittaja hyväksyy liittymispyynnön.

Debuggausnäyte

Debuggausnäytteessä osoitat, että osaat käyttää debuggeria ongelmatilanteiden selvittämiseen. Näytteessä testataan muun muassa seuraavien osa-alueiden hallintaa:

  • askeltaminen aliohjelman sisään (step into)
  • aliohjelman suorittaminen yhtenä askeleena (step over)
  • keskeytyskohdan (breakpoint) asettaminen
  • ehdollisen keskeytyskohdan (conditional breakpoint) asettaminen
  • arvon muuttaminen debuggerissa
  • muuttujan asettaminen watch-seurantaan; watch-arvon seuraaminen

Näyte arvostellaan asteikolla hyväksytty/hylätty.

Aikataulu ja takarajat

Tutkinto-opiskelijatLukiolinjatAvoin yliopisto
Näyte tulee palauttaa osan 8 takarajaan mennessä. Mahdollisista aikataulujoustoista (esim. sairauden takia) on aina sovittava ohjaajan kanssa. Palauttaminen myöhässä ilman ennalta sovittua joustoa voi johtaa näytteen hylkäämiseen.Näyte tulee palauttaa valitsemasi opintojaksototeutuksen aikataulun mukaisesti.Näytteen palauttamiselle ei ole takarajaa, mutta se on hyväksytettävä ohjaajalla.

Miksi?

Debuggerin käyttö on osa kurssin osaamistavoitteita. Ohjelman koon kasvaessa testaus- ja debuggaustaidot ovat olennainen osa virheiden etsimisessä ja korjaamisessa. Debuggeri on myös loistava työkalu ohjelman toiminnan ymmärtämiseksi.

Miten valmistaudun?

  1. Lue osa 5.1 Debuggaus
  2. Katso luennon debuggauksesta ja debuggerin käytöstä (kevät 2023)
  3. Tee Osan 5 harjoitustehtävä 4
  4. Tee harjoittelunäyte (vapaaehtoinen)

Näytteen suorittaminen

Voit suorittaa debuggausnäytteen videona itsenäisesti tai ohjauksessa. Voit suorittaa debuggausnäytteen sinulle sopivana aikana. Debuggausnäytteen suorittamiselle ei ole takarajaa.

Valitse haluamasi debuggausnäytteen suoritustapa ja seuraa sen mukaiset ohjeet.

  1. Lataa ja avaa DebugKoe-projekti
Debuggausnäyteprojektin latausohjeet
  1. Lataa DebugKoe.zip
  2. Pura lataamasi zip-tiedosto paikkaan, josta löydät sen. Jos suoritat näytteen Agoran mikroluokan tietokoneella, käytä kansiota C:\MyTemp\ohj1\<käyttäjänimi>.
  3. Avaa Rider. Welcome to JetBrains Rider -näkymässä klikkaa oikeassa yläkulmassa olevaa Open -painiketta.
  4. Etsi ja avaa DebugKoe.sln-tiedosto Riderissa. Mikäli Rider kysyy, luotatko avattavaan projektiin, valitse Trust and Open.
  5. Avaa sen jälkeen Riderissa Program.cs-tiedosto, josta ohjelmakoodi löytyy.
  1. Lue alla vaatimukset ja ohjeet debuggausnäytteen tekemiselle ja palauttamiselle
Ruutukaappausvideon vaatimukset ja ohjeet

Sisällölliset vaatimukset videolle

  1. Opiskelijan tulee käyttää kurssilla annettua DebugKoe-tehtävää.
  2. Videossa tulee näkyä debuggausnäytteen suorittaminen kokonaisuudessaan ja katkeamattomana. Videoa ei saa editoida.
  3. Videolla tulee näkyä sekä ruutukaappauskuva että opiskelijan puhe selkeällä äänellä.
  4. Opiskelijan tulee selittää jokainen tekemänsä toiminto perustellen. Selitys tulee olla esimerkiksi:
    • "Asetan riville 59 ehdollisen keskeytyskohdan, koska..." tai
    • "Käytän continue-toimintoa, jotta..."

Näytteen hylkäämisen perusteet

  1. Videolla ei näy debuggausnäytteen suorittaminen kokonaisuudessaan.
  2. Tehtyjä toimia ei perustella.
  3. Opiskelija ei puhu tai puheesta ei saa selvää.
  4. Annetut perustelut ovat oleellisesti vääriä tai sisältävät selkeitä virhekäsityksiä. Näytteen toisessa osassa on kiinnitettävä erityistä huomiota siihen, mihin kohtaan ohjelman suoritus keskeytyy ja miksi.

Tekniset vaatimukset videolle

  1. Resoluution tulee olla mielellään vähintään Full HD (1920x1080). Jos näyttösi tarkkuus on hyvin korkea, pienennä sitä. Pääasia on, että tekstistä saa selvää.
  2. Äänen tulee olla selvästi kuultavissa. Käytä mielellään hyvälaatuista mikrofonia ja puhu lähelle mikrofonia.
  3. Tarkista äänentasot testinauhoituksella. Kytke tarvittaessa kohinansuodatukset tai muut automaattiset äänenparannustoiminnot pois päältä mikäli mahdollista.
  4. Valitse videon laaduksi Korkea, tai vähintään 5 Mbps, jos voit sen valita.
  5. Hyviä ohjelmia ruutukaappauksen tekemiseen ovat esimerkiksi Screen-Cast-O-Matic (Windows), Open Broadcast Software (Win/Mac/Linux) ja Quicktime (Mac).

Näytteen hylkäämisen perusteet

  1. Video on niin epäselvä ettei tekstistä saa selvää.
  2. Puheraita puuttuu tai siitä ei saa selvää.

Videon jakelun vaatimukset

Laita video YouTubeen (suositus) tai Moniviestimeen. YouTubessa voit laittaa videon Unlisted-tilaan, mutta ei Private-tilaan. Tarkista esimerkiksi selaimen Incognito-tilassa, että video on todella katsottavissa myös kirjautumattomana käyttäjänä. Emme lataa tiedostoja esim. MediaFirestä tai vastaavista tiedostonjakopalveluista.

Voit poistaa videon näytteen tarkastamisen jälkeen.

Näytteen hylkäämisen perusteet

  1. Videon URL-osoite ei ole TIMissa.
  2. Tarkastaja ei pääse käsiksi videoon.
  3. Video on jossain muualla kuin YouTubessa tai Moniviestimessä.
  1. Tee DebugKoe-projektissa olevat tehtävät ja nauhoita suorituksesi, ks. ohjeet yllä.
  • Käynnistä ladattu ohjelma Debug-tilassa ja suorita projektissa olevat tehtävät. Tehtävien ohjeet löytyvät Program.cs -tiedostosta.
  • Voit yrittää debuggausnäytteen suorittamista niin monta kertaa kuin haluat.
  1. Julkaise nauhoitteesi YouTubeen tai Moniviestimeen. Kopioi videon URL-osoite TIMin Oma eteneminen -sivun debuggausnäytteen URL-osoitteen palautuskenttään. Mikäli videosi on YouTubessa, kopioi videon URL-osoite käyttäen Share-painiketta videon alapuolella.

Debuggausnäytteet tarkistetaan noin kerran viikossa. Saat ilmoituksen, kun työsi on tarkistettu.

Harjoittelunäyte

Voit harjoitella debuggausnäytettä tekemällä harjoittelunäytteen.

  1. Lataa Debugnayte.zip ja pura se paikkaan, josta löydät sen.
  2. Etsi ja avaa DebugNayte.sln-tiedosto Riderissa. Mikäli Rider kysyy, luotatko avattavaan projektiin, valitse Trust and Open.
  3. Avaa sen jälkeen Riderissa Program.cs-tiedosto, josta ohjelmakoodi löytyy.
  4. Seuraa DebugNayte-luokan dokumentaatiossa olevia ohjeita ja tee siellä annetut tehtävät. Kun pyydetään "ohjaajan antamaa lukua", kirjoita mikä luku tahansa väliltä 600-1500.

Älä muuta koodia ellei tehtävässä ole niin käsketty.

Voit pyytää harjoittelunäytteen tekemiseen apua pääteohjauksissa; ks. ajat etusivulta.

Tentti

Lukuvuonna 2025-2026 tenttejä järjestetään seuraavasti

TenttiPäivämääräAikaPaikkaIlmoittautumislinkki
Kevät 1pp.kk.2026klo xx-xxAgora / ZoomIlmoittaudu
Kevät 2pp.kk.2026klo xx-xxAgora / ZoomIlmoittaudu
Kevät 3pp.kk.2026klo xx-xxAgora / ZoomIlmoittaudu
Kesä 1pp.kk.2026klo xx-xxAgora / ZoomIlmoittaudu
Kesä 2pp.kk.2026klo xx-xxAgora / ZoomIlmoittaudu
Syksy 1pp.kk.2026klo xx-xxAgora / ZoomIlmoittaudu
Syksy 2pp.kk.2026klo xx-xxAgora / ZoomIlmoittaudu
Syksy 3pp.kk.2026klo xx-xxAgora / ZoomIlmoittaudu

Voit osallistua tenttiin joko Agoran luentosalissa tai etänä Zoomin kautta.

Tenttiin tulee ilmoittautua viimeistään 72 tuntia ennen tentin alkuhetkeä. Ilmoittautumisen yhteydessä opiskelijan valitsee tentin suoritustavan (salitentti tai etätentti) ja hyväksyy tentin säännöt (kuvattu alla).

Opiskelijan on todistettava henkilöllisyytensä ennen tentistä poistumista. Henkilöllisyyden todistamiseksi hyväksytään passi, henkilökortti tai ajokortti. Vain tunnistettujen opiskelijoiden suorituksen arvostellaan.

Tenttiaika on 4 tuntia. Ilmoita ilmoittautumisen yhteydessä, mikäli sinulle on esimerkiksi myönnetty lisäaikaa tentteihin yksilöllisenä järjestelynä.

Ennen kuin ilmoittaudut tenttiin, lue huolellisesti (i) Jyväskylän yliopiston ohjeet verkkotenttien suorittamiseen ja (ii) Tarkentavat ohjeet opintojakson Ohjelmointi 1 (ITKP102) -tenttiin ennen tenttiin ilmoittautumista. Jos yliopiston ohjeiden ja opintojakson tarkentavien ohjeiden välillä on ristiriita, opintojakson ohjeet pätevät.

Tekniset ongelmat tentin aikana

Jos tentin aikana ilmenee teknisiä ongelmia, käytä jotakin seuraavista yhteydenottotavoista:

  • Salissa: Nosta kätesi ylös ja odota, että valvoja tulee luoksesi.
  • Etänä: Jätä avunpyyntö lomakkeella: Avunpyyntö etätentissä (linkki tulee tähän hyvissä ajoin ennen tenttiä)
  • Laita viesti osoitteeseen ohj1-opet@jyu.onmicrosoft.com
  • Soita numeroon teacher_phone_number
  • Muista, että ongelman sattuessa ei ole kiirettä tai syytä paniikkiin. Vastuuopettaja voi tarvittaessa myöntää lisäaikaa tenttiin.

Tyyliopas

Tämä on lyhyt koodin tyyliopas Ohjelmointi 1 -kurssille. Tyyliopas perustuu suurelta osin Microsoftin C#-kielen tyylioppaaseen.

Yleiset periaatteet

Koodin tulee olla luettavaa ja ylläpidettävää. Ajattele, että joku kun sinä tai joku muu lukee koodiasi kuukauden tai vuoden päästä, hän ymmärtää mitä koodi tekee ilman turhaa päänvaivaa.

Käytä selkeitä ja kuvailevia nimiä muuttujille, metodeille ja luokille. Käytä mieluummin hieman pitkiä nimiä, jotka kertovat tarkoituksensa, kuin lyhyitä ja epäselviä nimiä.

Poista käyttämätön koodi ja kommentit. Pidä koodi siistinä ja järjestyksessä.

Projektikansiossa tulee olla vain tarpeelliset tiedostot. Poista vanhat, käyttämättömät tai väliaikaiset tiedostot.

Käytä Riderin automaattisia C#-kielen koodinmuotoiluasetuksia säännöllisesti (Code Reformat Code...).

Dokumentointi ja kommentointi

Käytä XML-dokumentointikommentteja julkisissa metodeissa ja luokissa. Dokumentoi metodien parametrit ja paluuarvot.

/// <summary>
/// Laskee kahden luvun summan.
/// </summary>
/// <param name="a">Ensimmäinen luku.</param>
/// <param name="b">Toinen luku.</param>
/// <returns>Palauttaa lukujen summan.</returns>
public int LaskeSumma(int a, int b)
{
    return a + b;
}

Voit käyttää tavallisia kommentteja selittämään monimutkaista logiikkaa koodissasi, mutta vältä liiallista kommentointia. Koodi pitäisi olla itsestään selittävää.

// Väärin: Liian paljon kommentteja ja huonot muuttujien nimet
int x = 10; // Määritellään muuttuja x ja asetetaan sen arvoksi 10
int y = 20; // Määritellään muuttuja y ja asetetaan sen arvoksi 20
int z = 30; // Määritellään muuttuja z ja asetetaan sen arvoksi 30
int s = x + y + z; // Lasketaan x, y ja z yhteen ja tallennetaan tulos s:ään   

// Oikein: Selkeä koodi ilman tarpeettomia kommentteja
double anttiJussinRahat = 0.1;
double denisinRahat = 20;
double saminRahat = 1000.67;
double kokoPotti = anttiJussinRahat + denisinRahat + saminRahat;

Sisennykset ja välilyönnit

Käytä neljän välilyönnin sisennystä koodilohkoissa, älä käytä tabulaattoreita.

(Pisteet lisätty havainnollistamaan välilyöntien määrää.)

if (ehto)
{
....for (int i = 0; i < 10; i++)
....{
........Console.WriteLine(i);
....}
}

Avaa ja sulje aaltosulkeet omille riveilleen.

Oikein:

if (ehto)
{
    // koodia
}

Väärin:

if (ehto) {
    // koodia 
}

Nimeämiskäytännöt

  • Luokat ja metodit: PascalCase (esim. Laskin, LaskeSumma, HäiriönKäsittely tai HairionKasittely).
  • Muuttujat ja kentät: camelCase (esim. laskettavaLuku, tulos)
  • Vakiot: PascalCase (esim. const int MaxArvo, const double Muunnoskerroin)
  • Tiedostojen nimet: PascalCase (esim. Laskin.cs, Ohjelma.cs)
  • Kansiot: PascalCase (esim. Palvelut, Mallit)

Vaikka skandien ja muidenkin Unicode-merkkien käyttö on teknisesti sallittua, on syytä huomata, että niiden käyttö ammattimaisessa ohjelmistokehityksesä ei välttämättä ole suositeltavaa, tai se voi olla jopa kiellettyä. Voikin olla hyödyllistä alusta asti omaksua tapa, jossa käytät nimeämisessä vain ASCII-merkkejä (a-z, A-Z, 0-9 ja _).

Rivinvaihdot

Jätä yksi, enintään kaksi tyhjää riviä metodien ja luokkien väliin parantamaan luettavuutta.

public class Laskin
{ 
    public int LaskeSumma(int a, int b)
    {
        return a + b;
    }

    public int LaskeErotus(int a, int b)
    {
        return a - b;
    }
}

Poista ylimääräiset tyhjät rivit koodista.

Usein kysyttyä

Kuinka paljon aikaa Ohjelmointi 1 vie viikossa?

Opintopisteiden mukainen laskennallinen työmäärä on noin 14-15 tuntia viikossa. Ajankäyttö vaihtelee yksilöllisesti, eikä aiempi kokemus välttämättä vähennä ajantarvetta. Ratkaisevaa ovat työtavat ja säännöllisyys.

En ehtinyt palauttaa harjoitustehtäviä ajoissa. Mitä teen?

Ota yhteyttä vastuuopettajaan. Sairauden tai muun odottamattoman esteen takia saat pisteet kyllä jälkikäteenkin.

Voinko käyttää tekoälyä apuna?

Tekoälyä voi käyttää tukena tietyissä tilanteissa, mutta siihen ei pidä luottaa sokeasti, eikä valmiita tehtäviä saa kopioida tekoälyn vastauksista. Tekoäly voi selittää asioita myös väärin. Tentissä tekoälyn käyttö on ehdottomasti kielletty. Tarkemmat tiedot löytyvät eettisestä ohjeistuksesta.

Voiko seuraavien viikkojen tehtäviä tehdä etukäteen?

Voi. Keväällä 2026 joitain tehtäviä uudistetaan, joten on mahdollista että jotkin tehtävät muuttuvat. Jos näin käy, niin vanha versio jää kuitenkin näkyviin sivun alareunaan tämän lukuvuoden 2025-2026 ajaksi.

Toimiiko kurssi Macilla tai Linuxilla?

Kyllä. Koska vastuuopettajilla on käytössään sekaisin Windows- ja Linux-koneita, saattaa meillä itsellämme olla joissain kohdin epävarmuutta miten macOS:ssa jokin asia toimii ja miltä se näyttää. Arvostamme suuresti mikäli ilmoitat meille mahdollisista virheistä tai ongelmista, jotta voimme parantaa ohjeita jatkossa. Kunkin sivun alalaidasta löytyy linkit tätä varten.

Miksi tällä kurssilla käytetään C#:ia?

C# ja Java muodostavat Ohjelmointi 1- ja Ohjelmointi 2 -opintojaksojen jatkumon. C# on laajalti käytetty, nykyaikainen ja monipuolinen ohjelmointikieli. C#:n opiskelu antaa hyvän pohjan myöhemmille ohjelmointiopinnoille ja ohjelmistokehitykselle yleisesti. Myös Jypeli-pelimoottori käyttää C#:ia.

Onko väliä mitä IDEä käyttää (Rider, Visual Studio, VS Code)?

ComTest toimii vain Riderissa, mutta muuten ei ole merkitystä mitä IDEä käyttää. Vastuuopettajat käyttävät JetBrains Rideria, mutta Visual Studio ja VS Code toimivat myös hyvin. Ohjemateriaalit on pääosin kirjoitettu Riderin käyttöä ajatellen, mutta suurin osa ohjeista pätee myös muihin IDE:hin.

Millainen tentti on?

Tentti on yleensä perinteinen ohjelmointiin ja ymmärtämiseen painottuva tentti. Vanhoja tenttejä ja arvosteluperusteita on tarjolla malliksi.

Voinko korvata opintojakson aiemmalla kokemuksella (työkokemus, oma projekti, jne.)?

Suosittelemme opintojakson suorittamista aiemmasta kokemuksesta huolimatta. Monet asiat voivat olla sinulle uusia, vaikka aikaisempaa ohjelmointikokemusta olisikin. Myös opiskelijoilta saamamme palautteen perusteella opintojakson suorittaminen voi olla hyvin opettavainen kokemus, vaikka ohjelmointikokemusta olisikin.

Jos sinulla on kuitenkin sekä kestoajan että laajuuden näkökulmista merkittävästi aiempaa ohjelmointikokemusta, ota yhteyttä opettajiin, niin voimme keskustella mahdollisesta vaihtoehtoisesta suoritustavasta. Tyypillisesti vaihtoehtoinen suoritus voisi sisältää ainakin seuraavat osat:

  • Osaamisnäyte (esim. oma projekti, työkokemuksen raportointi, tms.), joka kattaa opintojakson osaamistavoitteet
  • Suullinen tai kirjallinen keskustelu osaamisnäytteestä
  • Debuggausnäyte
  • Osallistuminen tenttiin

Vastuuopettaja harkitsee mikä tai mitkä näistä osista ovat tarpeen sinun kohdallasi.

Mikäli arvosanaa ei ole mahdollista määrittää muilla osilla, opiskelijan on osallistuttava kurssin tenttiin. Arvosana tällöin määräytyy tentin arvosanan perusteella.

Voinko korvata kurssin toisella suorittamallani ohjelmoinnin peruskurssilla?

Suomalaisten yliopistojen kohdalla vastaus on lähtökohtaisesti kyllä, mutta korvaavuus saattaa vaatia lisänäyttöä. Alla on lueteltu muiden yliopistojen opintojaksoja, ja niihin vaadittavia lisänäyttöjä. Jos omaa yliopistoasi ei ole listattu, ota yhteyttä opettajiin.

  • Helsingin yliopisto: Ohjelmoinnin perusteet (5 op). Korvataan, mutta vaaditaan lisänäyttönä osallistuminen Jyväskylän yliopiston Ohjelmointi 1 -kurssin tenttiin. Tentistä on saatava vähintään arvosana 1. Arvosana määräytyy tentin arvosanan perusteella.

Tenttiohjeet

Tämä sivu sisältää Jyväskylän yliopiston ohjeet verkkotenttien suorittamiseen sekä tarkentavat ohjeet opintojakson Ohjelmointi 1 (ITKP102) -tenttiin.

1. Jyväskylän yliopiston ohjeet verkkotenttien suorittamiseen

Verkkotentin suorittaminen

  • Verkkotenttiin ilmoittaudutaan tentin järjestäjän ohjeiden mukaisesti.
  • Verkkotentti on yksilökoe, ellei tentin järjestäjä ole muuta ohjeistanut. Se suoritetaan ilman ulkopuolisten henkilöiden suoraa tai välillistä apua.
  • Järjestelmään, jossa verkkotentti järjestetään, kirjaudutaan Jyväskylän yliopiston käyttäjätunnuksella ja salasanalla. Käyttäjätunnus on henkilökohtainen, eikä omaa tunnusta saa luovuttaa eteenpäin muille henkilöille.
  • Verkkotentti suoritetaan sille varattuna aikana.
  • Verkkotentin saa suorittaa tietokoneella, tabletilla tai puhelimella. Tentti suositellaan suoritettavaksi tietokoneella.
  • Verkkotentin suorittamisen aikainen yhteydenpito ja viestintä ulkopuolisten henkilöiden kanssa on kielletty.
  • Tentin järjestäjä antaa ennen tenttiä tarkentavat ohjeet mahdollisista aineistoista, materiaaleista ja välineistä, joita tentin suorittamiseen saa käyttää. (Katso seuraavassa alaluvussa olevat kurssin tenttisäännöt.)
  • Verkkotentin suorittamisen aikana saa tarvittaessa käyttää Jyväskylän yliopiston VPN-yhteyttä, mutta ei muita VPN-yhteyksiä.
  • Jos yhteytesi verkkotenttijärjestelmään katkeaa tentin suorittamisen aikana, ilmoita siitä tentin jälkeen tentin järjestäjälle.

Verkkotentin valvonta ja henkilötietojen käsittely

  • Yliopisto valvoo verkkotenttien suorittamista käytettävissä olevin keinoin. Yliopisto voi käyttää valvonnassa ensisijaisesti tietojärjestelmien keräämiä lokitietoja tai live-kuvaa ja toissijaisesti video- ja äänitallenteita.
  • Yliopisto voi tarkistaa opiskelijan henkilöllisyyden tentin aikana.
  • Arkaluonteisia henkilötietoja ei käsitellä verkkotenttien valvonnan yhteydessä.
  • Henkilötietojen käsittelyssä noudatetaan yliopiston tietosuoja- ja tietoturvaohjeita.

Verkkotenttiohjeiden noudattaminen ja vilppi verkkotentissä

  • Opiskelijalla on ehdoton velvollisuus perehtyä ennen tenttiä annettuihin ohjeisiin ja noudattaa niitä yksityiskohtaisesti.
  • Tenttiin osallistuva opiskelija tiedostaa, että Jyväskylän yliopisto valvoo verkkotentin suorittamista ja verkkotenttiohjeiden noudattamista käytettävissä olevin keinoin.
  • Tenttivastaukset voidaan opiskelijan suostumuksella käsitellä plagiaatintunnistusohjelmalla.
  • Vilppi ja vilpin yritys tentissä on kielletty. Vilppiepäilytapauksissa noudatetaan rehtorin päätöstä opiskelun eettisistä ohjeista ja vilppitapausten käsittelystä Jyväskylän yliopistossa. Vilppi johtaa aina opintosuorituksen hylkäämiseen ja voi johtaa kirjalliseen huomautukseen, kirjalliseen varoitukseen tai määräaikaiseen erottamiseen.

2. Tarkentavat ohjeet opintojakson Ohjelmointi 1 (ITKP102) -tenttiin

Lisäohjeet salitenttiin

  • Tentti suoritetaan paikan päällä valvotussa luentosalissa Jyväskylän yliopiston Agora-rakennuksessa.
  • Tentti suoritetaan ensisijaisesti omalla henkilökohtaisella laitteella. Ilmoita ilmoittautumisen yhteydessä, mikäli sinulla ei ole omaa tietokonetta, niin järjestämme sinulle lainakoneen tenttipäiväksi.
  • Tentti alkaa salissa, kun valvoja antaa luvan aloittaa tentin.
  • Tenttisuorituksen päätteeksi opiskelijan on todistettava henkilöllisyytensä ennen salista poistumista.

Lisäohjeet etätenttiin

  • Tentti suoritetaan etävalvotusti Zoom-ohjelman välityksellä.
  • Tentin aikana opiskelijan tulee jakaa kaikkien näyttöjen ruutukuvat sekä videokuvan itsestään. Tarvittavan laitteiston hankinta on opiskelijan vastuulla. Videokamerana on sallittua käyttää oman puhelimen kameraa.
  • Tentti alkaa, kun valvoja antaa luvan aloittaa tentin.
  • Valvojalla on oikeus pyytää näyttämään videokuvaa ympäristöstä tai pyytää laittamaan mikrofonin päälle.
  • Valvojalla on oikeus pyytää suorittamaan toimintoja tietokoneella, kuten avaamaan tehtävienhallintaa.
  • Valvojalla on oikeus pyytää opiskelijaa todistamaan henkilöllisyytensä tentin aikana.
  • Zoom-puhelusta saa poistua vain valvojan luvalla.

Tentissä sallitut aineistot ja materiaalit

  • Tenttivastausten antamiseen saa käyttää vain tietokonetta. Mobiililaitteiden käyttö on kielletty.
  • Tentin aikana saa käyttää tekstiin ja videoon perustuvia verkkosivuja, mukaan lukien opintojakson materiaaleja, harjoitustehtäviä, ohje- ja dokumentaatiosivuja.
  • Tentin aikana ainoa sallittu hakukone on DuckDuckGo, jonka tekoälyominaisuudet tulee kytkeä pois päältä.
  • Tentin aikana saa käyttää Rideria, Visual Studiota, tai vastaavaa kehitysympäristöä.
  • Tentin aikana saa käyttää Visual Studio Codea, Sublime Textia, tai vastaavaa tekstieditoria.
  • Tentin aikana saa käyttää itse tehtyjä sähköisiä tai paperille kirjoitettuja muistiinpanoja.

Tentissä kielletyt välineet ja menetelmät

  • ChatGPT:n, Geminin, Copilotin tai vastaavien generatiivisten tekoälyteknologioiden käyttö on kielletty. Kielto koskee myös kehitysympäristöjen tekoälylisäkkeitä/-avustimia jne.
  • Tentin aikana ainoa sallittu hakukone on DuckDuckGo, jonka tekoälyominaisuudet tulee kytkeä pois päältä. Muiden hakukoneiden (kuten Google, Bing tai Yahoo) käyttö on kielletty, koska niiden tekoälyominaisuuksia ei voi tällä hetkellä kytkeä pois päältä.
  • Verkkotentti on yksilökoe. Kommunikointi muiden kanssa verkkotentin suorittamisen aikana on ehdottomasti kielletty.

Henkilötietojen käsittely tentissä

  • TIM-järjestelmän keräämiä toimintalokeja voidaan käyttää vilppiepäilytapausten tutkimiseen. Järjestelmän tiedot kerätään ja käsitellään järjestelmän oman tietosuojaselosteen mukaisesti.
  • Live-kuvaa, video- tai äänitallenteita ei tallenneta.

Muita ohjeita

  • Tallenna vastauksesi ennen palautusajan päättymistä, mielellään muutamia minuutteja ennakkoon. Mikäli et ole tallentanut vastaustasi ennen palautusajan päättymistä, menetät viimeisimmät muutoksesi.
  • Vastausten lukumäärää ei ole tentin aikana rajoitettu. Viimeisin tallennettu vastaus arvioidaan. Voit vielä tarkistaa tentin lopussa olevalla painikkeella, että vastasit kaikkiin kysymyksiin.
  • Tentin arvioinnista, arvosanoista ja hyvityspisteistä on kerrottu tarkemmin kurssin suoritusohjeissa.

Omat tiedot

Löydät omat etenemistietosi TIMistä osoitteesta https://tim.jyu.fi/view/kurssit/tie/itkp102/eteneminen.

Osa 1

Tämä osa sisältää:

Luento 1: Johdatus, mitä ohjelmointi on?

Kevät 2026

Syksy 2025

Luento 2: Integroitu kehitysympäristö, graafinen C#-ohjelma

Kevät 2026

Syksy 2025

Ohjelmointiympäristö kuntoon

Ensimmäisten viikkojen tehtävät voi periaatteessa suorittaa verkkoselaimessa, mutta varsin pian on tarpeen saada oma ohjelmointiin sopiva ympäristö toimimaan tietokoneella. Sovelluskehittimen (engl. Integrated Development Environment, IDE) asentaminen omalle tietokoneelle on tärkeä askel kohti itsenäisempää ohjelmointia. IDE mahdollistaa esimerkiksi seuraavat asiat:

  • koodin kirjoittaminen
  • koodin kääntäminen ohjelmaksi
  • virheiden ja ongelmien etsiminen koodissa
  • koodin navigointi- ja refaktorointityökaluja, kuten "Etsi koodista", kirjoittamisen aikaiset ehdotukset, koodin massamuokkaaminen
  • ohjelman virheiden jäljitys eli debuggaus
  • samaan asiakokonaisuuteen liittyvän koodin hallinta ("projektit")
  • versionhallinnan tuki

Lisäksi itse asennettua IDE-ympäristöä on helpompi mukauttaa omien tarpeiden mukaan, kuten vaihtaa värejä, fontteja ja muita asetuksia.

Ellet ole vielä asentanut kehitystyökaluja, tee se nyt Työkalut-sivun ohjeiden mukaisesti.

IDE-ympäristöjä on useita eri ohjelmointikielille ja ympäristöille. Ohjelmointi 1 -opintojaksolla käytetään JetBrains Rider-kehitysympäristöä, joka on erityisesti C#- ja .NET-ajoympäristölle tarkoitettu IDE. Riderilla voi tehdä niin tekstipohjaisia sovelluksia kuin Jypeli-pelejäkin.

Vaihtoehtoisesti voit käyttää myös Visual Studio Code -editoria (lyhyesti VS Code), joka on hyvin suosittu tekstieditori, jota voi käyttää myös IDE:nä.

Sivuhuomiona mainittakoon, että kaikenlaiset pilvipalvelut ovat yleistyneet, ja myös pilvipohjaisia kehitysympäristöjä on olemassa. Kuitenkin edelleen yleinen käytäntö ohjelmoinnin opiskelussa, kuten myös Ohjelmointi 1 -kurssilla, on asentaa kehitysympäristö omalle paikalliselle tietokoneelle. Oman kehitysympäristön käyttö on yleensä nopeampaa, edullisempaa ja joustavampaa kuin pilvipohjaiset ratkaisut. Myös työelämässä paikalliset kehitysympäristöt ovat yleensä vallitseva käytäntö.

Suositeltava hakemistorakenne

Kaikki tämän opintojakson asiat kannattaa tehdä esimerkiksi kansioon nimeltä ohj1. Se, mihin tämä kansio kannattaa sijoittaa tietokoneellasi paikkaan riippuu käyttöjärjestelmästäsi ja omista mieltymyksistäsi.

Sopivia sijainteja ovat esimerkiksi:

  • Windows: C:\Users\<käyttäjätunnus>\kurssit\ohj1 tai C:\Opiskelu\ohj1
  • Mac ja Linux: ~/kurssit/ohj1

Korvaa <käyttäjätunnus> omalla käyttäjänimelläsi tai vastaavalla tunnisteella. Omalla koneella sen ei tietenkään tarvitse olla sama tunniste kuin yliopiston käyttäjänimi.

Mikroluokan koneessa: c:\MyTemp\<käyttäjätunnus>\ohj1

Kansio voi sijaita jossain muuallakin. Tärkeintä on, että itse tiedät missä kansiossa työskentelet, ja että löydät sen helposti myöhemmin.

Tämän ohj1-kansion alle kannattaa luoda kaksi alikansiota: demot ja harjoitustyo.

Rakenne näyttäisi nyt tältä.

ohj1demotharjoitustyo

Riderin peruskäyttö: solution ja projekti

Rider käyttää ns. solution-projekti-rakennetta koodin organisointiin. Projekti kuuluu aina johonkin solutioniin. Yksi solution voi sisältää yhden tai useampia projekteja. Projekti sisältää yhteen ohjelmaan (peliin tai konsolisovellukseen) liittyvän koodin ja grafiikka- ja musiikkitiedostot.

Esimerkiksi yksi demokerta, esimerkiksi demo1 voi olla yksi solution, ja se sisältää useita projekteja (demotehtäviä), kuten Lumiukko ja HelloWorld. Useiden projektien lisäämisessä samaan solutioniin on se etu, että silloin voi pitää samaan demoon liittyvät tehtävät yhtä aikaa näkyvillä ilman että niitä tarvitsee jatkuvasti avata tai sulkea.

Sivuhuomiona mainittakoon, että solution on Microsoftin keksimä nimi tällaiselle projekteja koostavalle kapistukselle. Sana ei varsinaisesti tarkoita mitään.

Uusi solution

Katsotaan nyt uuden solutionin ja projektin luomista Riderissa.

Luodaan uusi solution ja siihen projekti edellä luodun kansiorakenteen alaisuuteen. Tässä esimerkissä luodaan demo1-niminen solution ja siihen Lumiukko-niminen projekti demot-alikansioon. Mikäli haluat lisätä projektin olemassa olevaan solutioniin, katso luku Uusi projekti olemassa olevaan solutioniin.

  • Valitse New Solution. Mikäli joku vanha solution on jo auki, niin sama onnistuu yläpalkista File New Solution`. Uusi solution Linuxissa

  • Valitse vasemmalta Custom templates -listasta FysiikkaPeli.

  • Anna solutionin nimeksi demoX, esimerkiksi demo1

  • Anna projektin nimi, esimerkiksi Lumiukko tai Teht3Lumiukko riippuen tehtävästä mitä olet tekemässä (Huom Iso alkukirjan!).

  • Kirjoita tai selaa poluksi edellisessä kohdassa tekemäsi kansion sijainti. Jos olet tekemässä demoja, niin tähän kohtaan tulee esimerkiksi C:\Users\<käyttäjätunnus>\kurssit\ohj1 (Windows) tai ~/kurssit/ohj1 (Mac ja Linux).

    Yliopiston mikroluokissa projekti tulee tehdä ensin tietokoneen kiintolevylle, esim. C:\MyTemp\<käyttäjätunnus>\.... Siirrä lopuksi tiedostot muualle talteen.

  • Jätä Put solution and project in the same directory-boksi tyhjäksi.

  • Framework-kohtaan net8.0

  • Klikkaa Create.

  • Tutki syntynyttä tiedostohierarkiaa esimerkiksi tiedostohallinnassa tai Finderissa. Hierarkian pitäisi näyttää suurin piirtein tältä:

ohj1demotdemo1demo1.slnLumiukkoharjoitustyotehtiintehtiintehtiinnytnytnytbinobjLumiukko.csOhjelma.csLumiukko.csproj

Lyhyt selitys demo1-kansion sisältämistä tiedostoista ja kansioista:

demo1                - kansio joka sisältää demo1-solutionin
  demo1.sln          - solution-tiedosto, jossa luetellaan projektit
  Lumiukko           - kansio, jonka alla Lumiukko-projekti     
    bin              - kansio, jonne tulee ajettavaa koodia
    obj              - kansio, jonne tulee käännettyjä tiedostoja
    Lumiukko.cs      - C#-lähdekooditiedosto, johon tulee lumiukon piirtävä koodi
    Ohjelma.cs       - C#-lähdekooditiedosto, joka sisältää pääohjelman
    Lumiukko.csproj  - projektin asetustiedosto, jossa kerrotaan mitä tiedostoja
                       projektiin liittyy
  • Klikkaa Solution Explorerissa Lumiukko.cs-kooditiedostoa. Koodissa pitäisi näkyä:
public class Lumiukko : PhysicsGame
{
    public override void Begin()
    {
        // Kirjoita ohjelmakoodisi tähän
        PhoneBackButton.Listen(ConfirmExit, "Lopeta peli");
        Keyboard.Listen(Key.Escape, ButtonState.Pressed, ConfirmExit, "Lopeta peli");
    }
}
  • Kokeile käynnistää ohjelma Run/Run 'Lumiukko', jolloin pitäisi näkyä uusi ikkuna vaaleansinisellä taustalla. Jos kaikki toimii, sulje ikkuna.
  • Pyyhi pois koko se rivi jossa lukee "Kirjoita ohjelmakoodisi tähän" ja kirjoita tilalle
Level.Background.Color = Color.Black;
PhysicsObject pallo = new PhysicsObject(200, 200, Shape.Circle);
pallo.Color = Color.White;
Add(pallo);
  • Käynnistä ohjelma uudestaan ja tarkista että ohjelma muuttui.

  • Kirjoita luokan dokumentaatiokommentti näppäilemällä luokan esittelyrivin (elipublic class...) yläpuolelle kolme kauttaviivaa ///. Kirjoita <summary>-tagien väliin selvitys luokan toiminnasta (eli että piirretään lumiukko)

  • Kirjoita vastaavasti Begin-metodin dokumentaatiokommentit.

Uusi projekti olemassa olevaan solutioniin

Oletetaan, että solution on jo olemassa. Lisätään siihen toinen projekti olemassa olevan lisäksi. Tässä esimerkissä luodaan uusi ConsoleMain-projekti olemassa olevaan demo1-solutioniin.

  • Klikkaa Explorer-paneelissa solutionin demo1 nimeä hiiren oikealla (Macissa kahdella sormella).
  • Valitse Add <i class="bi bi-chevron-right"></i> New Project
  • Valitse vasemmalta ConsoleMain-projektimalli
  • Anna nimeksi HelloWorld
  • Paina Create.
  • Ensimmäisellä kerralla projekti ajetaan klikkaamalla Explorerissa sen nimeä HelloWorld hiiren oikealla ja valitse Run HelloWorld. Myöhemmillä kerroilla voit käynnistää projektin käynnistämällä yläpalkista haluamasi projektin.
ohj1demotdemo1demo1.slnLumiukko'Lumiukko.csHelloWorld...demo2Lumiukko2LukujenLaskemista...harjoitustyo...jne.tehtiinnytvastaavastivoisittehdäprojektejavastaavastivoisittehdäsolutionejalisäälisää

Jypeli-projektit

Jypeli-projektin voi tehdä valitsemalla solutionia tai projektia luodessa Custom Templates -kohdasta oikean projektimallin.

  • ConsoleMain (Konsolisovellukset, joissa on Ohj1 kurssin pohja)
  • Fysiikkapeli (Fysiikkaa käyttävät pelit ja muut graafiset sovellukset)
  • Tasohyppelypeli (Esimerkkipeli)
  • Android Fysiikkapeli (Android-alustaa varten)

Pääohjelma Jypeli-projekteissa (Main)

Jypeli-projektissa Main-pääohjelma menee Ohjelma.cs-tiedostoon, joten jos copy-pastetat koodin, joka sisältää Main-pääohjelman, niin poista Main-pääohjelma Portaat-luokan (tms. projektisi nimeä vastaava luokka) sisältä. Projektissa ei saa olla kahta Main-pääohjelmaa.

Sisällön tuominen Jypeli-projektiin (Content-kansio)

Kuvat ja äänet lisätään peliprojektin Content-kansioon, joka näkyy editorin tiedostolistauksessa.

Content-kansion voi luoda klikkaamalla hiiren oikealla projektia Add Directory

Sisällön lisääminen

  1. Lisää tiedosto klikkaamalla kansiota hiiren oikealla napilla Add Add Existing Item
  2. Valitse tiedosto(t) jonka haluat lisätä ja paina ok.
  3. Valitse Copy.
  4. Klikkaa tuomaasi tiedostoa Content-kansiossa hiiren oikealla ja valitse Properties
  5. Vaihda Copy to output directory -kohtaan "Copy if newer"

Graafinen sovellus Jypeli-kirjastolla

Jypeli on C#-kielellä kirjoitettu pelimoottori, joka on suunniteltu erityisesti opetuskäyttöön. Jypeli tarjoaa helppokäyttöisen tavan pelien luomiseen, mikä tekee siitä hyvän valinnan tälle kurssille.

Jypelin avulla voi luoda 2D-pelejä, joissa on grafiikkaa ja ääniä. Jypeliin on tarjolla paljon valmiita ohjeita ja esimerkkejä TODO: Linkki, jotka auttavat sinua pääsemään alkuun pelien tekemisessä.

Tehdään seuraavaksi pieni Jypeli-esimerkki, jossa luodaan ikkuna ja piirretään siihen ympyrä.

huomautus

Jos haluat kokeilla tätä koodia itse, sinulla tulee olla kehitystyökalut asennettuna; ohjeet löytyvät Työkalut-sivulta. Luo uusi Fysiikkapeli-projekti Riderissa ja korvaa Begin-metodin sisältö yllä olevalla koodilla. Suorita sitten peli painamalla vihreää "Play"-painiketta ikkunan yläreunassa.

using Jypeli;
public class YmpyraPeli : PhysicsGame
{
    public override void Begin()
    {
        GameObject ympyra = new GameObject(50, 50);
        ympyra.Shape = Shape.Circle; 
        ympyra.Position = new Vector(0, 0); // Asetetaan ympyrä keskelle ikkunaa
        Add(ympyra); // Lisätään ympyrä peliin
    }
}

Voit käynnistää pelin yllä klikkaamalla oikean yläreunan vihreää "Play"-painiketta. Ikkunaan pitäisi ilmestyä keskelle pieni ympyrä.

Huh! Siinä oli jo aika paljon uutta. Käydään koodi läpi vaiheittain.

Ensimmäinen rivi luo uuden muuttujan nimeltä ympyra, joka on tyyppiä GameObject. Sen leveydeksi ja korkeudeksi annetaan 50.

GameObject ympyra = new GameObject(50, 50);

Seuraavaksi asetamme ympyra muuttujan muodoksi Shape.Circle ja sijainniksi asetetaan vektori, joka osoittaa keskipisteeseen new Vector(0, 0).

ympyra.Shape = Shape.Circle; // Asetetaan muodoksi Shape.Circle
ympyra.Position = new Vector(0, 0); // Asetetaan ympyrä keskelle ikkunaa

Lopuksi lisäämme ympyra muuttujan näkyviin kutsumalla Jypelin Add metodia. ympyra muuttuja on siis olemassa jo heti ensimmäisen rivin jälkeen, mutta se pitää erikseen vielä lisätä "pelimaailmaan".

Add(ympyra); // Lisätään ympyrä peliin

Harjoitustehtävät 1

Tee harjoitustehtävät TIMissä: https://tim.jyu.fi/view/kurssit/tie/itkp102/demot/demo1.

Näet myös harjoitustehtävien palautustilaisuuden videotallenteen TIMissä: https://tim.jyu.fi/view/kurssit/tie/itkp102/koti#aikataulu.

Osa 2

Tämä osa sisältää:

3. luento: Muuttujat

Kevät 2026

Syksy 2025

4. luento: Aliohjelmat

  • Lue: 6. Aliohjelmat
    • Oletusnäkyvyys aliohjelmille on private. Tällä kurssilla tehdään kuitenkin käytännössä aina public-aliohjelmia, joten public kirjoitetaan aliohjelmien (ja luokan) eteen aina manuaalisesti. Asiasta lisää Ohjelmointi 2 -kurssilla.
    • Huomaa, että komentoriviohjelmassa näkyvyysmääreen perään tulee toistaiseksi staattisuusmääre, eli public static. Jypelissä taas riittää vain public

Kevät 2026

Syksy 2025

Harjoitustehtävät 2

Tee harjoitustehtävät TIMissä: https://tim.jyu.fi/view/kurssit/tie/itkp102/demot/demo2.

Näet myös harjoitustehtävien palautustilaisuuden videotallenteen TIMissä: https://tim.jyu.fi/view/kurssit/tie/itkp102/koti#aikataulu.

Osa 3

Tämä osa sisältää:

5. luento: muuttujat, operaattorit, aliohjelman paluuarvo

Kevät 2026

  • Valitettavasti luentotallennetta ei ole saatavilla. Katso syksyn 2025 tallenne, kalvot ja koodit alla.

Syksy 2025

6. luento: Aliohjelman kuormittaminen, ehtolause

Kevät 2026

Syksy 2025

Harjoitustehtävät 3

Tee harjoitustehtävät TIMissä: https://tim.jyu.fi/view/kurssit/tie/itkp102/demot/demo3.

Näet myös harjoitustehtävien palautustilaisuuden videotallenteen TIMissä: https://tim.jyu.fi/view/kurssit/tie/itkp102/koti#aikataulu.

Osa 4

Tämä osa sisältää:

7. luento: Testaaminen, ComTest

Kevät 2026

Syksy 2025

  • Huom: Videossa on paikoin pausseja ja vaihtelevaa äänenlaatua johtuen salin vieressä olevista työmaan äänistä. Pahoittelen pausseja. -DZ
  • 📺 Katso tallenne (YouTube, Moniviestin)
  • 📊 Kalvot
  • 🧾 Koodit

8. luento: Harjoitustyö, Merkkijonot

Kevät 2026

Syksy 2025

Harjoitustehtävät 4

Tee harjoitustehtävät TIMissä: https://tim.jyu.fi/view/kurssit/tie/itkp102/demot/demo4.

Näet myös harjoitustehtävien palautustilaisuuden videotallenteen TIMissä: https://tim.jyu.fi/view/kurssit/tie/itkp102/koti#aikataulu.

Osa 5

Tämä osa sisältää:

9. luento: Toistolauseet ja debuggaus

Syksy 2025

10. luento: Taulukot

Syksy 2025

Debuggaus

Tässä esitellään lyhyesti debuggauksen tarkoitus ja Riderin tärkeimmät debuggaustoiminnot. Vaikka jokaisessa kehitysympäristössä on omat debuggaustapansa, ovat periaatteet hyvin pitkälti yhteisiä eri ympäristöjen välillä.

Tämä sivu kuuluu myös Ohjelmointi 1 -kurssin debuggausnäytteen esitietoihin. Lue tämä sivu huolellisesti ennen debuggausnäytteeseen tulemista.

Miksi pitää debugata?

Jos ohjelmassa on jotakin vikaa (ohjelmointivirhe eli bug), debuggeri on usein helpoin vaihtoehto vian löytämiseksi (virheenjäljitys eli debug). Ohjelmaa voi debugata myös lisäämällä sinne tänne ylimääräisiä tulostuslauseita, mutta debuggerin avulla ohjelmakoodiin ei tarvitse tehdä muutoksia. Debuggerin avulla ohjelma voidaan myös pysäyttää haluttuun kohtaan ja tutkia muuttujien senhetkisiä arvoja, mahdollisesti jopa muuttaa niitä ennen kuin ohjelman suorittamista taas jatketaan. Tämä ei ole mahdollista tulostuslause-tyylisessä debuggauksessa.

Ohjelmointia opetellessa debuggeri on myös oiva väline askeltaa silmukoita, ehtoja ja aliohjelmia ja näin havainnollistaa ohjelman kulkua itselleen.

Debuggaustila Riderissa

Debuggaustila käynnistetään painamalla Run Debug tai leppäkertun kuvaa. Tällöin ohjelma voidaan pysäyttää ns. keskeytyskohtien avulla ja tutkia ohjelman tilaa. Jos ohjelmassa ei ole yhtään keskeytyskohtaa, vaikuttaa debugtilassa ajo samanlaiselta kuin "normaalissa" suoritustilassa.

Jos ohjelma tuntuu olevan totaalisen jumissa, voidaan sen ajo pysäyttää ja katsoa, missä kohti ohjelmaa ollaan menossa ja näin ehkä voidaan ratkaista, mistä ohjelman jumi johtuu.

Rider työkalupalkki:
Rider debug työkalupalkki

Kannattaa harjoitella käyttämään näppäinoikoteitä debuggaustilassa, sillä ne nopeuttavat debuggausta huomattavasti. Riderin näppäinoikoteitä saa tarkistettua ja muutettua Configure <i class="bi bi-chevron-right"></i> Settings <i class="bi bi-chevron-right"></i> Keymap tai File <i class="bi bi-chevron-right"></i> Settings <i class="bi bi-chevron-right"></i> Keymap.

Keskeytyskohta (breakpoint)

Voit laittaa ohjelmaan keskeytyskohdan (engl. breakpoint), jonka tarkoituksena on keskeyttää ohjelman suoritus haluttuun kohtaan. Toisin sanoen, ohjelma suoritetaan alusta siihen saakka, kunnes tullaan keskeytyskohtaan, johon suoritus sitten pysähtyy.

Riderissa keskeytyskohta asetetaan klikkaamalla sitä rivinumeroa, johon keskeytyskohta halutaan asettaa. Keskeytyskohtaa EI voi asettaa Riderissä tyhjälle riville, kommenttiriveille eikä funktion tai luokan esittelyriville.

Keskeytyskohtia voi olla ohjelmassa useita. Keskeytyskohdan saa pois klikkaamalla sitä uudestaan.

Aseta keskeytyskohta

Debuggaustilan käynnistäminen

Ohjelma käynnistyy debuggaustilaan painamalla joko F5, klikkaamalla oikean ylälaidassa olevaa Debug painiketta tai valitsemalla valikosta Run Debug. Tällöin ohjelman suoritus "pysähtyy" ensimmäiseen asettamaasi keskeytyskohtaan.

Debug pysähtynyt keskeytyskohtaan

Huomaa, että keskeytyskohdan osoittaman punaisen pallon vieressä on nyt myös keltainen nuoli, joka näyttää seuraavaksi suoritettavan rivin. Toisin sanoen, ohjelman alkuosa on suoritettu rivi riviltä normaaliin tapaan, ja suoritus pysähtyy keskeytyskohtaan siten, että seuraavaksi suoritusvuorossa on tutkittava rivi, jolle keskeytyskohta on asetettu. Korostan: tätä keltaisen nuolen osoittamaa asiaa ei ole vielä suoritettu.

On mahdollista suorittaa ohjelma myös ilman debuggausta (Ctrl + F5 tai valitsemalla Run). Tällöin keskeytyskohdat jätetään huomiotta. Toisaalta silloin myös esimerkiksi mahdollisia poikkeuksia ei käsitellä Riderin avulla.

Askellus (Step into, Step over)

Koodia voidaan askeltaa rivi kerrallaan. Tällöin ohjelman suoritus etenee debuggaustilassa lause kerrallaan eteenpäin. Askellukseen on kaksi erilaista tapaa:

  • Step into (F11), jos lause on aliohjelmakutsu, askelletaan myös kyseisen aliohjelman koodi
  • Step over (F10), aliohjelmakutsujen koodi suoritetaan kerralla ilman askellusta, eli tavallaan hypätään aliohjelman yli

Step over -toimintoa kannattaa käyttää sellaisen aliohjelmakutsun kohdalla, jonka sisäistä logiikka ei ole tarkoitus tarkastella. Esimerkiksi Console.WriteLine- aliohjelmakutsun kohdalla kannattaa mieluummin valita Step over kuin Step into, sillä meitä ei oikeastaan kiinnosta tuon aliohjelman toiminta.

Resume

Resume-toiminto jatkaa ohjelman suorittamista normaaliin tapaan. Mikäli ohjelmassa on myöhemmin keskeytyskohta, ohjelman suoritus keskeytyy siihen.

Debuggaustilan lopettaminen (ohjelman ajon lopettaminen)

Debuggauksen voi lopettaa painamalla Shift + F5 tai valikosta Run Stop debugging.

Muuttuja-arvot (locals)

Debuggaus‐näkymän Threads & Variables-paneelissa (tai välilehdellä) näkyy tällä hetkellä näkyvissä olevat muuttujat ja niiden arvot.

Paikalliset muuttujat debug-näkymässä

Locals-paneelissa voi myös muokata muuttujien arvoja ajonaikaisesti. Esimerkiksi muuttujan luku-arvoa voi muokata kaksoisklikkaamalla Value-sarakkeen kohdalta numeroa ja kirjoittamalla uuden luvun vanhan tilalle. Tämän jälkeen kannattaa painaa Enteriä, jotta editori ottaa muutoksen. Riderissa muuttujan arvoa voi locals-ikkunassa muokata painamalla F2 tai klikkaamalla hiiren oikealla ja valistemalla Set Value.

Set value painike

huomautus

Double-tyyppisen muuttujan arvoa muutettaessa on arvoksi asetettava desimaaliluku, esimerkiksi 3.0. Mikäli asetat arvoksi kokonaisluvun, esimerkiksi 3, debuggeri antaa virheilmoituksen "Error: Size of source and of dest differ".

Watch

Paikallisten muuttujien lisäksi voidaan suorituksen aikana seurata itse valittuja muuttujia Add to Watches toiminnolla. Yksittäisten muuttujien lisäksi voidaan tarkastella lausekkeita, esimerkiksi taulukko[i] > suurin (tuottaisi true tai false).

  1. Aseta keskeytyskohta haluamaasi paikkaan ja aloita debuggaus.

  2. Etsi koodista se muuttuja (tai lauseke), jonka tilaa haluat tarkkailla ajon aikana. Valitse se (maalaamalla esimerkiksi hiirellä), klikkaa sitten hiiren oikealla ja valitse Add to Watches. Alla olevassa kuvassa lisätään suurin-muuttuja locals/watch-paneeliin.

    Add to Watches painike

    Watches muuttuja

  3. Voit lisätä eri "watcheja" haluamasi määrän. Alla lisätään myös i, taulukko[i] ja taulukko[i] > suurin watch-paneeliin.

Huomaa, että watch-paneeliin lisäämäsi muuttuja (tai lauseke) ei välttämättä ole olemassa (ts. ei ole luotu tai ei "näy" sillä hetkellä), joten luonnollisestikaan tilaa ei voida tällöin tutkia. Alla olevassa kuvassa suoritus on menossa vasta rivillä 10.

Muuttujat ei vielä olemassa

Tässä esimerkissä i, taulukko[i] ja taulukko[i] > suurin ovat paikallisia muuttujia (lausekkeita) EtsiSuurin-lohkossa ja tulevat näkyviin kun ohjelman suoritus etenee sinne saakka.

Muuttujat on nyt olemassa

Nyt watch-ikkunasta on helppo tarkastella esimerkiksi taulukon arvoja sitä mukaa kun silmukka etenee.

Taulukon arvot muuttuu silmukassa

Muuttujan arvon muuttaminen

Tarvittaessa muuttujan arvoa voi muuttaa esim Locals-ikkunassa klikkaamalla arvoa ja sitten antamalla sille uuden arvon.

Ehdollinen keskeytyskohta

Debuggerin avulla voidaan lisätä myös keskeytyskohdalle keskeytymisen ehto. Tällaista keskeytyskohtaa kutsutaan nimellä ehdollinen keskeytyskohta. Sen avulla debuggeri keskeyttää ohjelman suorittamisen vain, kun keskeytyskohtaan annettu ehto toteutuu. Ehto voi olla mikä tahansa totuusarvoinen lauseke, esimerkiksi muuttujan tietty arvo.

Ehdollinen keskeytyskohta on kätevä esimerkiksi tilanteessa, jossa on pitkä silmukka, joka halutaan pysäyttää vain jossain tietyssä kohdassa. Jos ohjelma pysähtyisi silmukan jokaisella kierroksella, olisi hyvin työlästä ajaa ohjelmaa haluttuun pisteeseen. Ehdon voi lisätä seuraavasti:

  1. Siirry haluamallesi riville koodissa

  2. Siirry rivinumeron koodiin väliin ja klikkaa siihen breakpoint (näkyy punaisena täplänä)

  3. Paina breakpointin kohdalla hiiren oikeaa näppäintä saadaksesi esiin valikon

  4. Lisää Condition tekstikenttään lauseke, joka saa ajon aikana arvon true tai false, esimerkiksi

    luku == 4
    

    Sen sijaan

    int luku = 4
    

    ei ole ehto, eikä kenttään voi myöskään laittaa if-sanaa. Kun lauseke saa arvon true debuggeri keskeyttää ohjelman suorittamisen. Muutamia muita esimerkkejä ehdoista:

    i > 3
    luvut[i+2] != 3
    pallot[i] == null
    
  5. Aloita debuggaus

  6. Kun pysähtyy, tarkastele Locals- ja Watch-ikkunoista muuttujien arvoja ja jatka tarvittaessa Step into, Step over tai Resume.

Hit Count

Hit Countilla voit laittaa ehdon niin, että kun näin monennen kerran tullaan keskeytyskohtaan, niin silloin pysähdytään.

Kutsupino (call stack)

Jos saa ison ohjelman tutkittavakseen ja pitää korjata jotakin kohtaa eikä tiedä mistä kyseiseen kohtaan tullaan, niin jälleen debuggeri on avuksi. Laita keskeytyskohta tutkittavaan kohtaan, sitten ohjelma käyntiin. Kun ohjelma pysähtyy laittamaasi keskeytyskohtaan, niin kutsupinosta (call stack) voidaan katsoa reitti, mistä pysäytyskohtaan on päädytty.

Jos kutsupinoa ei näy Debug-näkymässä, sen saa esille valitsemalla klikkaamalla paneelin oikeassa yläreunassa olevaa ikkunan näköistä kuvaketta: Layout settings Threads Frames Side by side.

Kutsupino Riderin Threads & Variables paneelissa

Riderin kutsupinossa ei valitettavasti näy lähdekoodin rivinumeroita siitä, miltä riviltä kutsuun on lähdetty. Mutta klikkaamalla kutsupinossa hiiren oikealla, voidaan ottaa pinon sisältä leikepöydälle ja sitten tarkastella sitä rivinumeroineen jossakin editorissa.

Ongelmia debuggaustilan käynnistymisessä?

class com.intellij.util.ui.components cannot be cast

Mikäli saat debuggauksen aikana Riderissa poikkeuksen, esim.

class com.intellij.util.ui.components.BorderLayoutPanel 
cannot be cast to class com.intellij.ui.OnePixelSplitter

kokeile asetusten resetointia seuraavien ohjeiden mukaisesti

varoitus

Näin tekemällä menetät kaikki asetuksesi, kuten näppäinoikotiet sekä teemat. Ota asetuksistasi halutessasi varmuuskopiot File Manage IDE Settings Export Settings.

  1. Paina Shift+Shift (eli kaksi kertaa Shift-painiketta) tai Ctrl+T,
  2. Kirjoita "Restore Default settings" ja valitse ko. toiminto
  3. Rider käynnistyy uudestaan, valitse haluamasi asetukset.

Rider clr load callback is already in error state. A debug component is not installed

Jos saat yllä mainitun virheilmoituksen kun yrität käynnistää debuggerin niin ongelmana on todennäköisesti, että Mac-koneelle on asennettu väärä versio Riderista.

Joudut siis asentamaan Riderin uudestaan:

  1. Mene sivulle: https://www.jetbrains.com/rider/
  2. Klikkaa Download
  3. Valitse omalle koneellesi sopiva versio ja lataa se
  4. Asenna Rider uudelleen

Harjoitustehtävät 5

Tee harjoitustehtävät TIMissä: https://tim.jyu.fi/view/kurssit/tie/itkp102/demot/demo5.

Näet myös harjoitustehtävien palautustilaisuuden videotallenteen TIMissä: https://tim.jyu.fi/view/kurssit/tie/itkp102/koti#aikataulu.

Osa 6

Tämä osa sisältää:

11. luento: Tyyppimuunnokset, kertaus operaattoreista

Syksy 2025

12. luento: Taulukkoja ja silmukoita

Syksy 2025

Harjoitustehtävät 6

Tee harjoitustehtävät TIMissä: https://tim.jyu.fi/view/kurssit/tie/itkp102/demot/demo6.

Näet myös harjoitustehtävien palautustilaisuuden videotallenteen TIMissä: https://tim.jyu.fi/view/kurssit/tie/itkp102/koti#aikataulu.

Osa 7

Tämä osa sisältää:

13. luento: Hyödyllisiä tietorakenteita 1

Syksy 2025

14. luento: Hyödyllisiä tietorakenteita 2; harjoitustyön tekemisestä

Syksy 2025

Harjoitustehtävät 7

Tee harjoitustehtävät TIMissä: https://tim.jyu.fi/view/kurssit/tie/itkp102/demot/demo7.

Näet myös harjoitustehtävien palautustilaisuuden videotallenteen TIMissä: https://tim.jyu.fi/view/kurssit/tie/itkp102/koti#aikataulu.

Osa 8

Tämä osa sisältää:

15. luento: C#-kielen tyyppijärjestelmästä

Syksy 2025

16. luento: switch-lause, attribuutit, rekursio

Syksy 2025

Harjoitustehtävät 8

Tee harjoitustehtävät TIMissä: https://tim.jyu.fi/view/kurssit/tie/itkp102/demot/demo8.

Näet myös harjoitustehtävien palautustilaisuuden videotallenteen TIMissä: https://tim.jyu.fi/view/kurssit/tie/itkp102/koti#aikataulu.

Osa 9

Tämä osa sisältää:

17. luento: Kertaus, tietoa tentistä

Syksy 2025

Harjoitustehtävät 9

Tee harjoitustehtävät TIMissä: https://tim.jyu.fi/view/kurssit/tie/itkp102/demot/demo9.

Näet myös harjoitustehtävien palautustilaisuuden videotallenteen TIMissä: https://tim.jyu.fi/view/kurssit/tie/itkp102/koti#aikataulu.

Osa 10

Tämä osa sisältää:

Harjoitustehtävät 10

Tee harjoitustehtävät TIMissä: https://tim.jyu.fi/view/kurssit/tie/itkp102/demot/demo10.

Näet myös harjoitustehtävien palautustilaisuuden videotallenteen TIMissä: https://tim.jyu.fi/view/kurssit/tie/itkp102/koti#aikataulu.

Osa 11

Tämä osa sisältää:

Harjoitustehtävät 11

Tee harjoitustehtävät TIMissä: https://tim.jyu.fi/view/kurssit/tie/itkp102/demot/demo11.

Näet myös harjoitustehtävien palautustilaisuuden videotallenteen TIMissä: https://tim.jyu.fi/view/kurssit/tie/itkp102/koti#aikataulu.

Extramateriaali

Nämä ovat lisämateriaalia eivätkä kuulu varsinaisen luentosarjan piiriin.

Harjoitustyö 2,5 tunnissa

Tehdään harjoitustyö "Kivi, paperi, sakset" alusta loppuun 2,5 tunnissa.

Johdattelua olio-ohjelmointiin

Maistiainen Ohjelmointi 2 -kurssin aihepiiristä: luokka, olio, metodi, perintä, ylikirjoitus.