TIDE-komentorivityökalun käyttöohjeet
10.6.2024
Jyväskylän yliopisto
Informaatioteknologian tiedekunta
1. Johdanto
Olethan ensin asentanut komentorivityökalun?
TIDE-komentorivityökalu mahdollistaa TIM-järjestelmän ohjelmointitehtävien hakemisen ja palauttamisen käyttäjän omalla paikallisella työasemalla.
Mikäli ohjeet eivät sisällä tarvitsemaasi tietoa, jätä kommentti dokumenttiin. Tarvittaessa voit olla yhteydessä TIM-ylläpitäjiin lähettämällä sähköpostia osoitteeseen tim@jyu.fi
.
2. Kohdealueeseen liittyvät käsitteet
Dokumentissa käytetään seuraavia kohdealueeseen liittyviä käsitteitä:
Komentorivityökalu tarkoittaa IDE-pluginin ja TIM-järjestelmän välistä komentoriviohjelmaa.
TIDE-tehtävä tarkoittaa TIM-järjestelmässä sijaitsevaa tehtävää, joka voidaan ladata TIDE-komentorivityökalulla.
TIDE-tunniste tarkoittaa tehtävälle annettua ID:tä, jonka saa selville komennon
tide task list
vasteesta.Tehtävien hakeminen tarkoittaa tehtävien tietojen lataamista TIM-järjestelmästä.
Tehtävien lataaminen tarkoittaa IDE-tehtävien tallentamista paikallisiksi tiedostoiksi käyttäjän laitteelle.
Tehtävän palauttaminen tarkoittaa käyttäjän paikallisten tehtävätiedostojen palauttamista TIM-palvelimelle.
$ kuvaa komentorivin komentotulkin komentokehotetta.
<- ja >-merkkejä käytetään esimerkeissä erotinmerkkeinä polkujen yhteydessä. Merkkejä ei tule antaa komentoja käytettäessä.
[- ja ]-merkkejä käytetään esimerkeissä erotinmerkkeinä valitsimien yhteydessä. Merkkejä ei tule antaa komentoja käytettäessä.
3. Komentoesimerkkien syntaksi
Ohjeen komentoriviesimerkeissä käytetään seuraavia merkintätapoja:
Merkintätapa | Kuvaus |
---|---|
Arvo |
Arvo ilman sulkeita tulee kirjoittaa esimerkin mukaisesti. |
< Arvo > |
Kulmasulkeissa oleva arvo on vapaasti annettava. |
[ Arvo ] |
Hakasulkeissa oleva arvo on valinnainen. |
4. Kirjautuminen
Komento
$ tide login
avaa selainikkunan, jossa pyydetään kirjautumaan TIM-järjestelmään. Kirjautuminen antaa komentorivityökalulle oikeudet käyttäjän profiilin sekä käyttäjälle oikeudet kurssien ja tehtävien hakemiseen ja palauttamiseen.
Onnistuneen kirjautumisen jälkeen komentoriviohjelmaan tallennetaan käyttöoikeus käyttöjärjestelmän mukaiseen tunnistetietojen hallintaan, ja se pysyy voimassa 10 vuorokautta kirjautumiskertaa kohden. Jos sisäänkirjautuminen on vielä voimassa ja tide login
komento ajetaan uudestaan, kirjautuneen käyttäjän TIM-tunnus ja käyttöoikeuden voimassaoloaika näkyvät komennon antamassa vasteessa.
5. Kirjaudu ulos
Komento
$ tide logout
kirjaa ulos komentorivityökalusta. Samalla poistuvat myös kirjautumistiedot käyttäjän tietokoneelta ja komentorivityökalulle annetut käyttöoikeudet.
6. Listaa kurssit
Komento
$ tide courses
listaa kaikki kurssit, jotka sisältävät komentoriviltä ladattavia harjoituksia. Jos kursseja ei löydy, tulostuu näyttöön ilmoitus No courses found.
Esimerkiksi komento ja sen antama vaste voivat olla seuraavanlaiset:
$ tide courses
Course: TIEP112, C/C++ Javan jälkeen, ID: 115303
- DemoC1, ID: 639244, Path: kurssit/tie/ohj2/2024k/demot/DemoC1
- DemoC2, ID: 639246, Path: kurssit/tie/ohj2/2024k/demot/DemoC2
7. Listaa tehtävät
Komento
$ tide task list <TIM-HARJOITUSKANSIO>
hakee tehtävät annetusta TIM-HARJOITUSKANSIO
-polusta.
Esimerkiksi komento ja sen vaste voivat olla seuraavanlaiset:
$ tide task list kurssit/tie/ohj2/2024k/demot/DemoC1
ID: t2
ID: t3
ID: t6
ID: t7
...
8. Lataa tehtävä
Komento
$ tide task create [--all] <TIM-HARJOITUSKANSIO> [<TIDE-TUNNISTE>]
hakee ja tallentaa yhden tehtävän tai kaikki tehtäväkerran tehtävät annetun TIM-HARJOITUSKANSIO
-parametrin mukaisesta polusta. Käytettäessä TIDE-tunniste
tta, haetaan ja tallennetaan vain yksi tehtävä. Käytettäessä -a
tai --all
valitsinta ilman TIDE-tunniste
tta, tallennetaan kaikki polun tehtävät.
Tallennus tapahtuu siihen polkuun, jossa komento suoritetaan.
Komennon valinnaiset valitsimet ovat seuraavat:
Options:
-a, --all
-f, --force
-d, --dir TEXT
Jokaisella valitsimella on pitkä ja lyhyt versio, esimerkiksi --all
ja -a
.
Komennon task
ja sen valitsimien käyttöä sekä niiden antamia vasteita havainnollistavat seuraavat esimerkit:
Yhden tehtävän lataaminen
$ tide task create kurssit/tie/ohj2/2024k/demot/DemoC1 t2 Tehtävä1 was saved
Kaikkien tehtävien lataaminen polusta valitsimella
-a
$ tide task create kurssit/tie/ohj2/2024k/demot/DemoC1 -a t2 was saved t3 saved t6 saved t7 was saved ...
Tehtävän ylikirjoittaminen valitsimella
-f
$ tide task create kurssit/tie/ohj2/2024k/demot/DemoC1 t2 -f Tehtävä1 was saved
Kaikki aiemmin ladatut tehtävät ylikirjoitetaan lisäämällä polun perään valitsimet
-a
-f
$ tide task create kurssit/tie/ohj2/2024k/demot/DemoC1 -a -f
Tehtävien lataaminen valitsimen
-d
avulla haluttuun hakemistoon nykyisessä polussa$ tide task create kurssit/tie/ohj2/2024k/demot/DemoC1 t2 -d Omakansio
Tehtävien lataaminen valitsimen
-d
avulla haluttuun polkuun$ tide task create kurssit/tie/ohj2/2024k/demot/DemoC1 Tehtävä1 -d C:\Users\Nimi\Desktop\
Jos polussa on välilyöntejä, se tulee laittaa lainausmerkkeihin seuraavasti:
$ tide task kurssit/tie/ohj2/2024k/demot/DemoC1 t2 -d "C:\Users\Nimi\Desktop\Omakansio 3"
9. Tehtävän palauttaminen
Komento
$ tide submit <POLKU>
palauttaa tehtävän TIM-järjestelmään annetun polun perusteella. POLKU
-parametrin on vastattava polkua, johon tehtävä on tallennettu käyttäjän paikallisella työasemalla. Onnistunut palautus tulostaa komentoriville palautteen vastauksesta tai virheilmoituksen.
Esimerkiksi kun palautettava tehtävä sijaitsee käyttäjän laitteella kansiossa D:\DemoC1\t2\
, komento ja sen antama vaste voisivat olla seuraavanlaiset:
PS C:\Users\Nimi> tide submit D:\DemoC1\t2\
Saved answer successfully.
Stats for nerds:
0.920 0.908
Compile time:
real 0m0.082s
user 0m0.030s
sys 0m0.032s
Run time:
real 0m0.001s
user 0m0.000s
sys 0m0.001s
Console feedback:
Anna huoneen pituus, leveys ja korkeus metreissä > Huoneen pinta-ala
on 12.0 neliömetriä. Huoneen tilavuus on 30.0 kuutiometriä.
Komento
$ tide submit .
palauttaa vastaustiedostot kansiosta, jossa komento suoritetaan.
Palautuksen onnistuessa komento ja sen antama vaste ovat seuraavankaltaiset:
PS D:\DemoC1\t2> tide submit .
Saved answer successfully.
...
10. Lisätietoja
Lisätietoja komentojen käytöstä ja niiden vaihtoehdoista saadaan käyttämällä --help
-valitsinta kunkin komennon kanssa. Esimerkiksi tide login --help
näyttää lisätietoja kirjautumiskomennosta.
Konsoliin tulostuvat INFO-lokitiedot raportoivat komentoriviohjelman toimintaa. Voit vaihtaa lokituksen tasoa DEBUG tasolle, lisäämällä ympäristömuuttujan TIDECLI_LOG_LEVEL arvolla 10. Esim. linuxissa export TIDECLI_LOG_LEVEL=10
Komentorivityökalun ja IDE-lisäosan tehtävien kanssa yhteensopivan kurssin ja kurssitehtävien määrittäminen TIMissä
7.6.2024
Jyväskylän yliopisto
Informaatioteknologian tiedekunta
1. Johdanto
Komentorivityökalu mahdollistaa TIM-järjestelmän ohjelmointitehtävien hakemisen ja niiden vastausten palauttamisen opiskelijan omalla työasemalla komentoriviä käyttäen. Komentorivityökalulla voi tarkastella TIMistä yhteensopivia kursseja ja niiden tehtäväkertoja, hakea TIMistä yksittäisen kurssin yhden tehtäväkerran kaikki tehtävät tai yksittäisen tehtävän, listata yhden tehtäväkerran kaikki yhteensopivat tehtävät ja palauttaa yhden tehtävävastauksen kerrallaan.
Visual Studio Coden IDE-lisäosan avulla on mahdollista ladata ja palauttaa TIM-ohjelmointitehtäviä suoraan Visual Studio Code -kehitysympäristössä.
Kurssin opettajan tulee määrittää TIM-järjestelmässä komentorivityökalulla tai IDE-lisäosaan haettavissä olevat ohjelmointitehtävät. Ohje neuvoo kurssille, tehtäväkertaan ja tehtäviin tarvittavien asetusten määrittämisessä.
Mikäli ohjeista puuttuu jokin tarvitsemasi tieto, jätä kommentti dokumenttiin. Tarvittaessa voit olla yhteydessä TIM-ylläpitäjiin lähettämällä sähköpostia osoitteeseen tim@jyu.fi
.
2. Kohdealueeseen liittyvät käsitteet
Dokumentissa käytetään seuraavia kohdealueeseen liittyviä käsitteitä:
Komentorivityökalu tarkoittaa IDE-pluginin ja TIM-järjestelmän välistä komentoriviohjelmaa.
Kurssi voi koostua yhdestä tai useammasta tehtäväkerrasta.
Tehtäväkerta tarkoittaa yleensä yksittäistä TIM-dokumenttia (esimerkiksi Jyväskylän yliopiston ohjelmointikursseilta tuttu
Demo 1
), jossa on yksi tai useampi ohjelmointitehtävä.Tehtävä on tyypillisesti erityinen TIM-lohko, jonka opettaja voi määritellä TIM-järjestelmään ja johon opiskelija voi tallentaa vastauksia.
IDE-lisäosa tarkoittaa IDE-ympäristöön kehitettyä lisäosaa, jonka avulla voidaan käyttää TIMin toiminnallisuuksia suoraan IDEn kautta.
IDE-tehtävä tarkoittaa TIM-järjestelmässä sijaitsevaa tehtävää, joka on mahdollista hakea komentorivityökalulla tai IDE-lisäosalla.
Tehtävien hakeminen tarkoittaa tehtävien hakemista TIM-järjestelmästä.
Tehtävien lataaminen tarkoittaa IDE-tehtävien lataamista paikallisiksi tiedostoiksi opiskelijan laitteelle.
Tehtävän palauttaminen tarkoittaa yksittäisen tehtävän opiskelijan laitteella olevien tiedostojen palauttamista TIM-järjestelmään. Palautuksen jälkeen palautetut tiedostot näkyvät opiskelijalle ja kurssin opettajalle kyseisen tehtävän vastauksissa.
Yhteensopiva tarkoittaa tehtäväkerran tehtäville ja kurssin etusivudokumentille tehtäviä määrityksiä, joiden avulla kurssi, tehtäväkerrat ja tehtävät saadaan näkyviin komentorivityökalussa ja IDE-lisäosassa.
Plugin tarkoittaa TIMin csPlugin-liitännäistä.
$ kuvaa komentorivin komentotulkin komentokehotetta.
3. Yhteensopivan kurssin etusivudokumentin määritys
Jotta kurssin tehtävät saadaan määritettyä komentorivityökalun ja IDE-lisäosan kanssa yhteensopiviksi tulee kurssin etusivun asetuslohkoa muokata seuraavasti:
Lohkoa pääsee muokkaamaan painamalla vasemman navigaatiolistan yläosan rataskuvaketta ja avautuvasta asetuslistasta Edit settings -painiketta Edit settings.
Etusivudokumentin
settings-
attribuuttiin tulee lisätä asetusideCourse:
ja eritellä- path:
-muuttujiin kaikkien IDE-tehtäviä sisältävien tehtäväkertojen polut.
IdeCourse
-asetusta ja IDE-tehtäviä sisältävien tehtäväkertojen polkujen asettamista havainnollistaa seuraava esimerkki:
``` {settings=""}
ideCourse:
- path: kurssit/Python/tk1
- path: kurssit/Python/tk2
- path: kurssit/Python/tk3
```
Tarkoitetaanko sanalla "tehtäväkertojen" samaa kuin "dokumenttien"? Jos kyllä, niin dokumenttien olisi tässä kuvaavampi. (Jollakin saattaa olla useita demoja/tehtäväkertoja/tms. yhdessä dokumentissa.) -AJL
—4. Yhteensopivien tehtävien määritys
Komentorivityökalun ja IDE-lisäosan kanssa yhteensopivien ohjelmointitehtävien plugin tulee olla csPlugin
. Aínoastaan csPlugin-liitännäisellä toteutettuja ohjelmointitehtäviä on mahdollista hakea komentorivityökalulla ja IDE-lisäosalla. Tehtävälle tulee myös olla määriteltynä yksilölliset taskID
(kuten #esimerkki
) ja ideTask
(kuten ideTask="t1"
). Mikäli tehtävä koostuu TIMissä useammasta tiedostosta tulee näillä tiedostoilla olla sama ideTask
-arvo.
Lisäksi tehtävälle kannattaa määrittää yksilöllinen tiedostonimi filename:
-attribuutilla (kuten numerot.py
). Ilman filename
-attribuutin määritystä tehtävän nimeksi asetetaan main
, johon liitetään type
-attribuutin arvo, kuten c
, cpp
, cs
tai py
. Filename
-attribuutti määrittämällä saadaan tiedostolle asetettua haluttu nimi ja tiedostotyyppi. Type
-attribuutin arvo määrittyy automaattisesti kun csPlugin-liitännäinen luodaan ja valitaan haluttu ohjelmointikieli. Kyseistä attribuuttia käytetään tiedostotyypin määrityksessä siinä tapauksessa, jos filename
-attribuuttia ei ole annettu. Muiden kuin edellä mainittujen attribuuttien arvot tulevat valmiina csPluginista
.
TaskID
-attribuutti määritetään csPlugin-liitännäistä luodessa. Jos kahdelle csPluginille
yritetään asettaa sama taskID
-attribuutin arvo, ilmoittaa TIM-järjestelmä virheestä. IdeTask
-arvo määrittämällä yksilöidään ohjelmointitehtävät toisistaan komentorityökalua ja IDE-lisäosaa varten.
Path
-attribuutti tulee csPlugin-liitännäistä luodessa automaattisesti osaan ohjelmointikielistä, jolloin sen arvoksi tulee user
automaattisesti. Lisätietoja path
-attribuutista voi lukea csPlugin-attribuutit -ohjeesta.
Useita tiedostoja sisältävien IDE-tehtävien tapauksessa filename
-attribuutin lisäämättä jättäminen johtaa mahdollisesti virheeseen opiskelijan hakiessa tehtäviä omalle laitteelleen. Virhe johtuu siitä, että mikään käyttöjärjestelmä ei salli kahden tai useamman samannimisen tiedoston luomista samaan hakemistoon.
Komentorivityökalun ja IDE-lisäosan kanssa yhteensopivan tehtävän määrittämistä havainnollistaa seuraava esimerkki:
``` {#lentokone plugin="csPlugin" ideTask="t4"}
filename: lentokone.py
type: py
path: user
fullprogram: |!!
# BYCODEBEGIN
lento = " __|__ "
kone = "*---o--(_)--o---*"
print(lento + "\n" + kone)
# BYCODEEND
!!
```
Vain rivien # BYCODEBEGIN ja # BYCODEEND välissä oleva sisältö tulee näkyviin opiskelijan hakemiin tehtäviin, kun ne haetaan komentorivityökalun tai IDE-lisäosan avulla. Tämän lohkon ulkopuolelle voidaan lisätä esimerkiksi tehtävän mallivastaus tai muita tietoja ja ne eivät tule näkyviin opiskelijoille.
5. Määritysten toimivuuden varmistaminen
Luvun ohjeilla voit varmistaa, että olet määrittänyt oikein komentorivityökalulla tai IDE-lisäosalla kurssilta haettavissa olevat tehtävät.
Komento
$ tide courses
listaa kaikki opiskelijan kurssit ja tehtäväkerrat, jotka ovat komentorivityökalun ja IDE-lisäosan kanssa yhteensopivia. Jos kursseja ei löydy, tulostetaan ilmoitus No courses found.
Yhteensopivat kurssit ja niiden tehtäväkerrat hakeva komentorivikomento ja sen vaste näyttävät seuraavan kaltaisilta:
$ tide courses
Course: Sekakurssi, ID: 82
- ts1, ID: 84, Path: kurssit/allinone/tasksets/ts1
- ts2, ID: 85, Path: kurssit/allinone/tasksets/ts2
- ts3, ID: 86, Path: kurssit/allinone/tasksets/ts3
- ts4, ID: 87, Path: kurssit/allinone/tasksets/ts4
Course: Python, ID: 71
- tk1, ID: 72, Path: kurssit/Python/tk1
- tk2, ID: 73, Path: kurssit/Python/tk2
- tk3, ID: 74, Path: kurssit/Python/tk3
Course: C++-kurssi, ID: 76
- demo1, ID: 77, Path: kurssit/c/demo1
IDE-lisäosan tapauksessa oikein määritellyt kurssit ja tehtäväkerrat tulevat näkyviin, kun opiskelija on kirjautunut TIM-tunnuksilla käyttäen IDE-lisäosan login-painiketta. Tämän jälkeen esille tulee My Courses -painike, mitä painamalla yhteensopivat kurssit ja tehtäväkerrat esitetään IDE-lisäosassa kuvan 1 mukaisesti.
Lisätietoja komentorivityökalun komennoista voi katsoa komentorivityökalun käyttöohjeesta ja lisätietoja IDE-lisäosan toiminnoista IDE-lisäosan käyttöohjeesta.
Java-tehtävien palautus
Mennään kurssin hakemistoon
Annetaan komento, esim
tide task create kurssit/tie/ohj2/v/2025/kevat/demot/Demo4 -a
syntyy (jos ei jo ole)
src/demo/d4
-hakemisto ja sen alle kaikki tehtävätpalautus:
tide submit IkaMain.java
palauttaa yhden tiedoston tai jos haluaa kaikki saman tehtävän kerralla, niin
tide submit -a IkaMain.java
missä
IkaMain.java
on jokin ko tehtävän tiedosto.
Tyypillinen Ohj2-kurssin Java-tehtävien kansio on seuraavanlainen:
Esimerkiksi Demo4 päätaso on
src/demo/d4
Tide haku
tide task create kurssit/tie/ohj2/2024k/demot/Demo4 -a
voitaisiin tehdä joko src
kansiossa tai demo
kansiossa (tai ylempänä) sopimuksen mukaan. Tidelle pitäisi voida toimittaa tieto minkä nimisen pääkansion se tuosta luo. Jos oletetaan (mikä olisi ehkä hyvä oletus), että tuo komento annetaan hakemistossa
src
niin TIM antaisi tidecli:lle tiedoksi että tehtävät haetaan hakemistoon
demo/d4
Nykyisinhän siitä tulee Demo4
ja se olisi väärin.
Sitten nyt Tide luo oletuksena kunkin tehtävän mukaisen alikansion tuonne, eli jos on
ideTask=tauno1a
niin siitä tulee alikansio tauno1a. Java-palautuksissa alikansiota ei pitäisi syntyä, vaan pitäisi olla tapa sanoa minkä nimiseen. Tosin nyt src-kansiosta mitattuna tuo oikea kansio on Java-tiedoston pacakage-riville. Esimerkissä on sulkuihin laitettuna mikä olisi ollut kunkin tiedoston ideTask=
-rivissä =-merkin perässä
.timdata
Demopisteet.java (t4)
Etumerkki.java (t3)
Henkilo.java (t8)
Ika.java (t1)
Kolmio.java (t2)
Kasittele1.java (tauno1a)
Kasittele2.java (tauno1b)
UkkoSample.java (tb1)
./a:
Automaatti.java (tb23)
Automaatti0.java
Automaatti2.java
AutomaattiIf.java
AutomaattiIf2.java
AutomaattiIf3.java
AutomaattiReg.java
AutomaattiTaulukolla.java
AutomaattiTaulukolla2.java
Automaattix00x11xIf.java
./a/y:
Automaatti.java (tg13)
Automaatti2.java
./fx:
ika.css (t1)
IkaGUIController.java (t1)
IkaGUIView.fxml (t1)
IkaMain.java (t1)
IkaLaskenta.java (t1)
rpnlaskin.css (tb45)
RPNLaskinGUIController.java (tb45)
RPNLaskinGUIView.fxml (tb45)
RPNLaskinMain.java (tb45)
Nykyinen tauno1b
tuleva .timdata
-tiedosto on:
{
"path":"kurssit/tie/ohj2/2024k/demot/Demo4",
"type":"java/jcomtest",
"doc_id":639255,
"ide_task_id":"tauno1b",
"task_files":[
{
"task_id_ext":"639255.lasketaulukkoon.PM7iRFNgXBVw",
"content":"package demo.d4;\n\nimport java.util.Arrays;\n\n/**\n * Pohja Tauno-testeille\n * @author vesal\n * @version 8.1.2015\n *\n */\n@SuppressWarnings(\"all\")\npublic class Kasittele2\n{\n public static void main(String args[])\n {\n int[] t = { 23, 45, 12, 9, 3, 7 };\n System.out.println(\"Aluksi : \" + Arrays.toString(t));\n KasitteleTaulukko(t);\n System.out.println(\"Lopuksi: \" + Arrays.toString(t));\n }\n\n\n /**\n * Aliohjelmalla käsitellään taulukko sovitulla tavalla\n * @param t taulukko joka käsitellään\n * @example\n * #import java.util.Arrays;\n * <pre name=\"test\">\n * int[] t;\n * t = new int[]{$t1}; KasitteleTaulukko(t); Arrays.toString(t) === \"[$t2]\";\n *\n * $t1 | $t2\n * ------------------------------------------------\n * 5, 4, 6, 2, 9, 1 | 9, 0, 8, 0, 10, 0\n * 12, 3, 5, -5, 7, 10 | 15, 0, 0, 0, 17, 0\n * </pre>\n */\n public static void KasitteleTaulukko(int[] t)\n {\n// --- Write your code below this line. ---\n\n// --- Write your code above this line. ---\n }\n}",
"file_name":"lasketaulukkoon.java",
"source":"editor",
"user_input":"",
"user_args":""
}
],
"supplementary_files":[],
"stem":"Laske yhteen peräkkäisissä paikoissa olevat taulukon alkiot ja laita tulos aina parilliseen (0,2,4) paikkaan. Vastaavaan parittomaan paikkaan laitetaan arvo 0, eli taulukon summa pysyy samana, mutta parittomissa (1,3,5) paikoissa olevat alkiot nollautuvat (Esim: taulukko 5 4 6 2 9 1 muuttuu taulukoksi 9 0 8 0 10 0).",
"header":"Tehtävä Tauno T1 b"
}
Ehdotus .timdata sijainneille:
.project
.timdata
src/demo/d1
src/demo/d2
Uudet attribuutti:
# task_directory: <docname>/<task> # nykyinen malli
task_directory: src/demo/d4
# timdata_directory: src/demo/d4 # viikkomalli (oletus sama kuin task_directory)
# timdata_directory: . # kurssimalli
# timdata_directory: <task> # nykyinen / oletus // src/demo/d4/t1
# jos timdata_directory puuttuu, niin nykyinen malli eli jokaisella taskille oma dir
Koko kurssin kaikki metadata yhdessä paikassa
{
"weeks": {
"kurssit/tie/ohj2/v/2025/kevat/demot/Demo4": {
"tasks": {
"tauno1a": {
"path": "kurssit/tie/ohj2/v/2025/kevat/demot/Demo4",
"type": "java/jcomtest",
"doc_id": 1166,
"ide_task_id": "tauno1a",
"task_files": [
{
"task_id_ext": "1166.lisaaviisi.2PyX4zJKqres",
"content": "package demo.d4;\n\nimport java.util.Arrays;\n\n/**\n * Pohja Tauno-testeille\n * @author vesal\n * @version 8.1.2015\n *\n */\n@SuppressWarnings(\"all\")\npublic class Tauno1a\n{\n public static void main(String args[])\n {\n int[] t = { 23, 45, 12, 9, 3, 7 };\n System.out.println(\"Aluksi : \" + Arrays.toString(t));\n KasitteleTaulukko(t);\n System.out.println(\"Lopuksi: \" + Arrays.toString(t));\n }\n\n\n /**\n * Aliohjelmalla käsitellään taulukko sovitulla tavalla\n * @param t taulukko joka käsitellään\n * @example\n * #import java.util.Arrays;\n * <pre name=\"test\">\n * int[] t;\n * t = new int[]{$t1}; KasitteleTaulukko(t); Arrays.toString(t) === \"[$t2]\";\n *\n * $t1 | $t2\n * ------------------------------------------------\n * 55, 44, 33, 2, 5, 9 | 60, 49, 38, 7, 10, 14\n * 23, 45, -12, 9, 0, -5 | 28, 50, -7, 14, 5, 0\n * </pre>\n */\n public static void KasitteleTaulukko(int[] t)\n {\n// --- Write your code below this line. ---\n \tfor (int i=0; i<t.length; i++) {\n \t\tt[i] += 5;\n \t}\n// --- Write your code above this line. ---\n }\n}\n",
"file_name": "demo/d4/Tauno1a.java",
"source": "editor",
"task_directory": "src",
"task_type": "java/jcomtest",
"saved_full_path": "e:\\temp\\o2\\demot\\src\\demo\\d4\\Tauno1a.java",
"user_input": "",
"user_args": ""
}
],
"supplementary_files": [],
"stem": "Tee ensin muuttuja lisattava, jonka arvo on 5. Sitten lisää tämän muuttujan arvo jokaiseen taulukon alkioon (Esim: taulukko 5 4 6 2 9 1 muuttuu taulukoksi 10 9 11 7 14 6).",
"task_directory": "src",
"header": "Tehtävä Tauno T1 a"
},
"tauno1b": {
"path": "kurssit/tie/ohj2/v/2025/kevat/demot/Demo4",
"type": "java/jcomtest",
"doc_id": 1166,
"ide_task_id": "tauno1b",
"task_files": [
{
"task_id_ext": "1166.lasketaulukkoon.PM7iRFNgXBVw",
"content": "package demo.d4;\n\nimport java.util.Arrays;\n\n/**\n * Pohja Tauno-testeille\n * @author vesal\n * @version 8.1.2015\n *\n */\n@SuppressWarnings(\"all\")\npublic class Tauno1b {\n\n public static void main(String args[])\n {\n int[] t = { 23, 45, 12, 9, 3, 7 };\n System.out.println(\"Aluksi : \" + Arrays.toString(t));\n KasitteleTaulukko(t);\n System.out.println(\"Lopuksi: \" + Arrays.toString(t));\n }\n\n\n /**\n * Aliohjelmalla käsitellään taulukko sovitulla tavalla\n * @param t taulukko joka käsitellään\n * @example\n * #import java.util.Arrays;\n * <pre name=\"test\">\n * int[] t;\n * t = new int[]{$t1}; KasitteleTaulukko(t); Arrays.toString(t) === \"[$t2]\";\n *\n * $t1 | $t2\n * ------------------------------------------------\n * 5, 4, 6, 2, 9, 1 | 9, 0, 8, 0, 10, 0\n * 12, 3, 5, -5, 7, 10 | 15, 0, 0, 0, 17, 0\n * </pre>\n */\n public static void KasitteleTaulukko(int[] t)\n {\n// --- Write your code below this line. ---\n \tfor (int i=0; i+1<t.length; i+=2) {\n \t\tt[i] += t[i+1];\n \t\tt[i+1] = 0;\n \t}\n// --- Write your code above this line. ---\n }\n}",
"file_name": "demo/d4/Tauno1b.java",
"source": "editor",
"task_directory": "src",
"task_type": "java/jcomtest",
"saved_full_path": "e:\\temp\\o2\\demot\\src\\demo\\d4\\Tauno1b.java",
"user_input": "",
"user_args": ""
}
],
"supplementary_files": [],
"stem": "Laske yhteen peräkkäisissä paikoissa olevat taulukon alkiot ja laita tulos aina parilliseen (0,2,4) paikkaan. Vastaavaan parittomaan paikkaan laitetaan arvo 0, eli taulukon summa pysyy samana, mutta parittomissa (1,3,5) paikoissa olevat alkiot nollautuvat (Esim: taulukko 5 4 6 2 9 1 muuttuu taulukoksi 9 0 8 0 10 0).",
"task_directory": "src",
"header": "Tehtävä Tauno T1 b"
},
"t1": {
"path": "kurssit/tie/ohj2/v/2025/kevat/demot/Demo4",
"type": "java/comtest/doc",
"doc_id": 1166,
"ide_task_id": "t1",
"task_files": [
{
"task_id_ext": "1166.ika.orjl5TuQylsE",
"content": "package demo.d4;\n\npublic class Ika {\n private static final int NYKYVUOSI = 2024;\n\n /**\n * Funktiolla muutetaan vuosi vuosisadalle 1900 tai 2000 mikäli\n * annettu vuosi on annettu kahdella numerolla.\n * Negatiiviset vuodet tulkitaan ennen ajanlaskun alkua oleviksi :-)\n * @param vuosi muutettava vuosi\n * @return muutettu vuosi\n * @example\n * <pre name=\"test\">\n * muutaVuosi(-55) === -55;\n * muutaVuosi(1982) === 1982;\n * muutaVuosi(2001) === 2001;\n * muutaVuosi(07) === 2007;\n * muutaVuosi(96) === 1996;\n * </pre>\n */\n public static int muutaVuosi(int vuosi) {\n if (vuosi < 0 || 100 < vuosi) return vuosi; // 1982 tai 2001\n if (vuosi <= (NYKYVUOSI % 100)) return vuosi + 2000; // 01 => 2001\n return vuosi + 1900; // 82 => 1982\n }\n\n\n /**\n * Laskee henkilön iän syntymävuoden perusteella.\n * Vuoden saa antaa kahdella numerolla.\n * @param svuosi henkilön syntymävuosi\n * @return henkilön ikä\n * @example\n * <pre name=\"test\">\n * laskeIka(2024) === 0;\n * laskeIka(24) === 0;\n * laskeIka(19) === 5;\n * laskeIka(18) === 6;\n * laskeIka(2008) === 16;\n * laskeIka(98) === 26;\n * </pre>\n */\n public static int laskeIka(int svuosi) {\n return NYKYVUOSI - muutaVuosi(svuosi);\n }\n}",
"file_name": "demo/d4/Ika.java",
"source": "editor",
"task_directory": "src",
"task_type": "java/comtest/doc",
"saved_full_path": "e:\\temp\\o2\\demot\\src\\demo\\d4\\Ika.java",
"user_input": "",
"user_args": ""
},
{
"task_id_ext": "1166.ikaCss.0be2MER3cOjA",
"content": "/* JavaFX CSS - Leave this comment until you have at least create one rule which uses -fx-Property */",
"file_name": "demo/d4/fx/ika.css",
"source": "editor",
"task_directory": "src",
"task_type": "css/args",
"saved_full_path": "e:\\temp\\o2\\demot\\src\\demo\\d4\\fx\\ika.css",
"user_input": "",
"user_args": "demo/d4/fx/ika.css"
},
{
"task_id_ext": "1166.ikaView.yycAjIO0JBdZ",
"content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\n<?import javafx.geometry.Insets?>\n<?import javafx.scene.control.Label?>\n<?import javafx.scene.control.TextField?>\n<?import javafx.scene.layout.BorderPane?>\n<?import javafx.scene.layout.ColumnConstraints?>\n<?import javafx.scene.layout.GridPane?>\n<?import javafx.scene.layout.RowConstraints?>\n\n<BorderPane xmlns=\"http://javafx.com/javafx/17\" xmlns:fx=\"http://javafx.com/fxml/1\" fx:controller=\"demo.d4.fx.IkaGUIController\">\n <top>\n <GridPane BorderPane.alignment=\"CENTER\">\n <columnConstraints>\n <ColumnConstraints hgrow=\"SOMETIMES\" maxWidth=\"129.0\" minWidth=\"10.0\" />\n <ColumnConstraints hgrow=\"SOMETIMES\" maxWidth=\"81.0\" minWidth=\"6.0\" prefWidth=\"6.0\" />\n <ColumnConstraints hgrow=\"SOMETIMES\" maxWidth=\"128.0\" minWidth=\"10.0\" prefWidth=\"78.0\" />\n <ColumnConstraints hgrow=\"SOMETIMES\" minWidth=\"10.0\" />\n </columnConstraints>\n <rowConstraints>\n <RowConstraints minHeight=\"10.0\" prefHeight=\"30.0\" vgrow=\"SOMETIMES\" />\n <RowConstraints minHeight=\"10.0\" prefHeight=\"30.0\" vgrow=\"SOMETIMES\" />\n <RowConstraints minHeight=\"10.0\" prefHeight=\"30.0\" vgrow=\"SOMETIMES\" />\n </rowConstraints>\n <children>\n <Label text=\"Syntymävuotesi\" GridPane.rowIndex=\"1\" />\n <TextField fx:id=\"textSyntymavuosi\" onAction=\"#onEnter\" onKeyReleased=\"#keyReleased\" text=\"1995\" GridPane.columnIndex=\"2\" GridPane.rowIndex=\"1\" />\n <Label text=\"Kerron sinulle paljonko täytät tänä vuonna\" GridPane.columnSpan=\"4\" />\n <TextField fx:id=\"textTulos\" editable=\"false\" styleClass=\"harmaa\" stylesheets=\"@ika.css\" text=\"Täytät tänä vuonna 21 vuotta\" GridPane.columnSpan=\"2147483647\" GridPane.rowIndex=\"2\" />\n </children>\n <BorderPane.margin>\n <Insets bottom=\"20.0\" left=\"20.0\" right=\"20.0\" top=\"20.0\" />\n </BorderPane.margin>\n </GridPane>\n </top>\n</BorderPane>\n",
"file_name": "demo/d4/fx/IkaGUIView.fxml",
"source": "editor",
"task_directory": "src",
"task_type": "xml/args",
"saved_full_path": "e:\\temp\\o2\\demot\\src\\demo\\d4\\fx\\IkaGUIView.fxml",
"user_input": "",
"user_args": "demo/d4/fx/IkaGUIView.fxml"
},
{
"task_id_ext": "1166.ikaController.pO9rCi45aUKe",
"content": "package demo.d4.fx;\n\nimport java.net.URL;\nimport java.util.List;\nimport java.util.ResourceBundle;\n\nimport demo.d4.Ika;\nimport fi.jyu.mit.ohj2.*;\nimport javafx.application.Application.Parameters;\nimport javafx.event.ActionEvent;\nimport javafx.fxml.FXML;\nimport javafx.fxml.Initializable;\nimport javafx.scene.control.*;\n\n\n/**\n * Käyttöliittymän käsittely matka-ohjelmalle\n * @author vesal\n * @version 17.1.2016\n *\n */\npublic class IkaGUIController implements Initializable {\n @FXML private TextField textSyntymavuosi;\n @FXML private TextField textTulos;\n\n @FXML\n private void keyReleased() {\n laske();\n }\n\n\n @FXML\n private void onEnter(final ActionEvent action) {\n ((TextField)(action.getSource())).selectAll();\n }\n\n\n @Override\n public void initialize(URL location, ResourceBundle resources) {\n // Platform.runLater( () -> textKartalla.requestFocus());\n laske();\n }\n\t\n\t\n /**\n * Haetaan tekstikentässä oleva kokonaisluku \n * @param text kenttä josta kokonaisluku haetaan\n * @param oletus mikä on luvun arvo jos kentästä ei saada järkevää lukua\n * @return kentästä haettu kokonaisluku\n * @example\n * <pre name=\"test\">\n * #TOLERANCE=0.01\n * #import javafx.embed.swing.JFXPanel;\n * #import javafx.scene.control.*;\n * (new JFXPanel()).toString(); // tarvitaan jjotta JavaFX alustuu\n * haeLuku(new TextField(\"2000\"), 44) ~~~ 2000;\n * haeLuku(new TextField(\"kissa\"), 44) ~~~ 44.00;\n * haeLuku(new TextField(\"0\"), 44) ~~~ 0;\n * </pre>\n */\n public static int haeLuku(TextField text, int oletus) {\n int luku = Mjonot.erotaInt(text.getText(), oletus);\n return luku;\n }\n\n \n /**\n * Lasketaan henkilön ikä ottamalla syntymävuosi\n * tekstilaatikosta. \n */\n protected void laske() {\n int svuosi = haeLuku(textSyntymavuosi, 1990);\n int ika = Ika.laskeIka(svuosi);\n String tulos = \"Täytät tänä vuonna \" + ika + \" vuotta.\";\n textTulos.setText(tulos);\n }\n\n\n /**\n * Lasketaan arvot parametrien avulla\n * @param parameters kutsuparametrit\n */\n public void laske(Parameters parameters) {\n List<String> params = parameters.getRaw();\n if ( params.size() == 0 ) return;\n textSyntymavuosi.setText(params.get(0));\n laske();\n }\n}\n",
"file_name": "demo/d4/fx/IkaGUIController.java",
"source": "editor",
"task_directory": "src",
"task_type": "java/doc",
"saved_full_path": "e:\\temp\\o2\\demot\\src\\demo\\d4\\fx\\IkaGUIController.java",
"user_input": "",
"user_args": ""
},
{
"task_id_ext": "1166.ikaMain.tFyGdZPKeb37",
"content": "package demo.d4.fx;\n\nimport javafx.application.Application;\nimport javafx.stage.Stage;\nimport javafx.scene.Scene;\nimport javafx.scene.layout.Pane;\nimport javafx.fxml.FXMLLoader;\n\n\n/**\n * @author vesal\n * @version 10.12.2024\n *\n */\npublic class IkaMain extends Application {\n @Override\n public void start(Stage primaryStage) {\n try {\n FXMLLoader ldr = new FXMLLoader(getClass().getResource(\"IkaGUIView.fxml\"));\n final Pane root = ldr.load();\n //final IkaGUIController ikaCtrl = (IkaGUIController) ldr.getController();\n Scene scene = new Scene(root);\n scene.getStylesheets().add(getClass().getResource(\"ika.css\").toExternalForm());\n primaryStage.setScene(scene);\n primaryStage.setTitle(\"ika\");\n primaryStage.show();\n } catch(Exception e) {\n e.printStackTrace();\n }\n }\n\n /**\n * @param args Ei kaytossa\n */\n public static void main(String[] args) {\n launch(args);\n }\n}",
"file_name": "demo/d4/fx/IkaMain.java",
"source": "editor",
"task_directory": "src",
"task_type": "graphics/args/doc",
"saved_full_path": "e:\\temp\\o2\\demot\\src\\demo\\d4\\fx\\IkaMain.java",
"user_input": "",
"user_args": ""
}
],
"supplementary_files": [],
"stem": null,
"task_directory": "src",
"header": "Mahdollinen eri tiedostoon kirjoitettu laskenta, ei pakollinen"
}
}
},
"kurssit/tie/ohj1/v/2024/syksy/demot/demo4": {
"tasks": {
"t3aa": {
"path": "kurssit/tie/ohj1/v/2024/syksy/demot/demo4",
"type": "cs",
"doc_id": 1159,
"ide_task_id": "t3aa",
"task_files": [
{
"task_id_ext": "1159.t3aa.xrc9bTG0PhnI",
"content": "using System;\n\npublic class PikkuIsoksi\n{\n public static void Main()\n {\n char pienena = 'a';\n char isona = Char.ToUpper(pienena);\n Console.WriteLine(pienena + \" => \" + isona); // a => A\n pienena = 't';\n isona = Char.ToUpper(pienena);\n Console.WriteLine(pienena + \" => \" + isona); // t => T\n }\n}",
"file_name": "PikkuIsoksi.cs",
"source": "editor",
"task_directory": null,
"task_type": "cs",
"saved_full_path": "e:\\temp\\o2\\demot\\demo4\\t3aa\\PikkuIsoksi.cs",
"user_input": "",
"user_args": ""
}
],
"supplementary_files": [
{
"file_name": "t3aa.csproj",
"content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n <PropertyGroup>\n <OutputType>Exe</OutputType>\n <TargetFramework>net$(NETCoreAppMaximumVersion)</TargetFramework>\n </PropertyGroup>\n</Project>\n",
"source": null,
"task_directory": null,
"saved_full_path": "e:\\temp\\o2\\demot\\demo4\\t3aa\\t3aa.csproj"
}
],
"stem": "Katso, mikä kutsu sinun on kirjoitettava xxx:n paikalle, jotta seuraava ohjelma toimisi:",
"task_directory": null,
"header": "Tehtävä 3a. Kirjain isoksi"
},
"t4a": {
"path": "kurssit/tie/ohj1/v/2024/syksy/demot/demo4",
"type": "cs",
"doc_id": 1159,
"ide_task_id": "t4a",
"task_files": [
{
"task_id_ext": "1159.kirjainIsoksia.iB1ok7xJjm7F",
"content": "using System;\n\npublic class PienetIsoksi\n{\n public static void Main()\n {\n\n// --- Write your code below this line. ---\n char pienena = 'a';\n char isona = Char.ToUpper(pienena);\n Console.WriteLine(pienena + \" => \" + isona); // a => A\n pienena = 't';\n isona = Char.ToUpper(pienena);\n Console.WriteLine(pienena + \" => \" + isona); // t => T\n// --- Write your code above this line. ---\n }\n}",
"file_name": "Pikku.cs",
"source": "editor",
"task_directory": null,
"task_type": "cs",
"saved_full_path": "e:\\temp\\o2\\demot\\demo4\\t4a\\Pikku.cs",
"user_input": "",
"user_args": ""
}
],
"supplementary_files": [
{
"file_name": "t4a.csproj",
"content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n <PropertyGroup>\n <OutputType>Exe</OutputType>\n <TargetFramework>net$(NETCoreAppMaximumVersion)</TargetFramework>\n </PropertyGroup>\n</Project>\n",
"source": null,
"task_directory": null,
"saved_full_path": "e:\\temp\\o2\\demot\\demo4\\t4a\\t4a.csproj"
}
],
"stem": "Katso, mikä kutsu sinun on kirjoitettava xxx:n paikalle, jotta seuraava ohjelma toimisi:",
"task_directory": null,
"header": "Tehtävä 4a. Kirjain isoksi"
},
"tb12": {
"path": "kurssit/tie/ohj1/v/2024/syksy/demot/demo4",
"type": "jypeli/doc",
"doc_id": 1159,
"ide_task_id": "tb12",
"task_files": [
{
"task_id_ext": "1159.pallot.HviKWR5WCBsf",
"content": "using System;\nusing System.Collections.Generic;\nusing Jypeli;\nusing Jypeli.Assets;\nusing Jypeli.Controls;\nusing Jypeli.Effects;\nusing Jypeli.Widgets;\n\nnamespace PukkailuPeli;\n\npublic class PukkailuPeli : PhysicsGame\n{\n// --- Write your code below this line. ---\n public override void Begin()\n {\n // OMAAAA KOODI TÄHÄN\n }\n// --- Write your code above this line. ---\n}\n",
"file_name": "PukkailuPeli.cs",
"source": "editor",
"task_directory": null,
"task_type": "jypeli/doc",
"saved_full_path": "e:\\temp\\o2\\demot\\demo4\\tb12\\PukkailuPeli.cs",
"user_input": "",
"user_args": ""
}
],
"supplementary_files": [
{
"file_name": "tb12.csproj",
"content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n <PropertyGroup>\n <OutputType>WinExe</OutputType>\n <TargetFramework>net$(NETCoreAppMaximumVersion)</TargetFramework>\n </PropertyGroup>\n <ItemGroup>\n <PackageReference Include=\"Jypeli.NET\" Version=\"11.*\"/>\n <PackageReference Include=\"Jypeli.FarseerPhysics.NET\" Version=\"2.*\"/>\n </ItemGroup>\n <ItemGroup>\n <PackageReference Include=\"Jypeli.NET\" Version=\"11.*\"/>\n <PackageReference Include=\"Jypeli.FarseerPhysics.NET\" Version=\"2.*\"/>\n </ItemGroup>\n <ItemGroup>\n <None Update=\"Content\\*.*\">\n <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n </None>\n </ItemGroup> \n</Project>\n",
"source": null,
"task_directory": null,
"saved_full_path": "e:\\temp\\o2\\demot\\demo4\\tb12\\tb12.csproj"
},
{
"file_name": "Ohjelma.cs",
"content": "using System;\nnamespace PukkailuPeli;\npublic static class Program\n{\n [STAThread]\n static void Main()\n {\n using var game = new PukkailuPeli();\n game.Run();\n }\n}\n",
"source": null,
"task_directory": null,
"saved_full_path": "e:\\temp\\o2\\demot\\demo4\\tb12\\Ohjelma.cs"
},
{
"file_name": "Content/Baby.png",
"content": null,
"source": "static/ohj1/Content/Baby.png",
"task_directory": null,
"saved_full_path": "e:\\temp\\o2\\demot\\demo4\\tb12\\Content\\Baby.png"
},
{
"file_name": "Content/Chell.png",
"content": null,
"source": "static/ohj1/Content/Chell.png",
"task_directory": null,
"saved_full_path": "e:\\temp\\o2\\demot\\demo4\\tb12\\Content\\Chell.png"
},
{
"file_name": "Content/Cigur.png",
"content": null,
"source": "static/ohj1/Content/Cigur.png",
"task_directory": null,
"saved_full_path": "e:\\temp\\o2\\demot\\demo4\\tb12\\Content\\Cigur.png"
},
{
"file_name": "Content/Igor.png",
"content": null,
"source": "static/ohj1/Content/Igor.png",
"task_directory": null,
"saved_full_path": "e:\\temp\\o2\\demot\\demo4\\tb12\\Content\\Igor.png"
},
{
"file_name": "Content/Infant.png",
"content": null,
"source": "static/ohj1/Content/Infant.png",
"task_directory": null,
"saved_full_path": "e:\\temp\\o2\\demot\\demo4\\tb12\\Content\\Infant.png"
},
{
"file_name": "Content/Jango.png",
"content": null,
"source": "static/ohj1/Content/Jango.png",
"task_directory": null,
"saved_full_path": "e:\\temp\\o2\\demot\\demo4\\tb12\\Content\\Jango.png"
},
{
"file_name": "Content/Knive.png",
"content": null,
"source": "static/ohj1/Content/Knive.png",
"task_directory": null,
"saved_full_path": "e:\\temp\\o2\\demot\\demo4\\tb12\\Content\\Knive.png"
},
{
"file_name": "Content/Leader.png",
"content": null,
"source": "static/ohj1/Content/Leader.png",
"task_directory": null,
"saved_full_path": "e:\\temp\\o2\\demot\\demo4\\tb12\\Content\\Leader.png"
},
{
"file_name": "Content/Mum.png",
"content": null,
"source": "static/ohj1/Content/Mum.png",
"task_directory": null,
"saved_full_path": "e:\\temp\\o2\\demot\\demo4\\tb12\\Content\\Mum.png"
},
{
"file_name": "Content/Ron.png",
"content": null,
"source": "static/ohj1/Content/Ron.png",
"task_directory": null,
"saved_full_path": "e:\\temp\\o2\\demot\\demo4\\tb12\\Content\\Ron.png"
},
{
"file_name": "Content/Ven.png",
"content": null,
"source": "static/ohj1/Content/Ven.png",
"task_directory": null,
"saved_full_path": "e:\\temp\\o2\\demot\\demo4\\tb12\\Content\\Ven.png"
},
{
"file_name": "Content/Yar.png",
"content": null,
"source": "static/ohj1/Content/Yar.png",
"task_directory": null,
"saved_full_path": "e:\\temp\\o2\\demot\\demo4\\tb12\\Content\\Yar.png"
},
{
"file_name": "Content/King.png",
"content": null,
"source": "static/ohj1/Content/King.png",
"task_directory": null,
"saved_full_path": "e:\\temp\\o2\\demot\\demo4\\tb12\\Content\\King.png"
},
{
"file_name": "Content/village.png",
"content": null,
"source": "static/ohj1/Content/village.png",
"task_directory": null,
"saved_full_path": "e:\\temp\\o2\\demot\\demo4\\tb12\\Content\\village.png"
}
],
"stem": null,
"task_directory": null,
"header": "Bonus 1-2: Pallojen pukkaileminen"
},
"pallot2": {
"path": "kurssit/tie/ohj1/v/2024/syksy/demot/demo4",
"type": "jypeli/doc",
"doc_id": 1159,
"ide_task_id": "pallot2",
"task_files": [
{
"task_id_ext": "1159.pallot2.CUNfwN8mmd7t",
"content": "using System;\nusing System.Collections.Generic;\nusing Jypeli;\nusing Jypeli.Assets;\nusing Jypeli.Controls;\nusing Jypeli.Effects;\nusing Jypeli.Widgets;\n\nnamespace PukkailuPeli;\n\npublic class PukkailuPeli : PhysicsGame\n{\n// --- Write your code below this line. ---\n public override void Begin()\n {\n // OMA KOODI TÄHÄN\n }\n// --- Write your code above this line. ---\n}\n",
"file_name": "PukkailuPeli.cs",
"source": "editor",
"task_directory": null,
"task_type": "jypeli/doc",
"saved_full_path": "e:\\temp\\o2\\demot\\demo4\\pallot2\\PukkailuPeli.cs",
"user_input": "",
"user_args": ""
}
],
"supplementary_files": [
{
"file_name": "pallot2.csproj",
"content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n <PropertyGroup>\n <OutputType>WinExe</OutputType>\n <TargetFramework>net$(NETCoreAppMaximumVersion)</TargetFramework>\n </PropertyGroup>\n <ItemGroup>\n <PackageReference Include=\"Jypeli.NET\" Version=\"11.*\"/>\n <PackageReference Include=\"Jypeli.FarseerPhysics.NET\" Version=\"2.*\"/>\n </ItemGroup>\n <ItemGroup>\n <PackageReference Include=\"Jypeli.NET\" Version=\"11.*\"/>\n <PackageReference Include=\"Jypeli.FarseerPhysics.NET\" Version=\"2.*\"/>\n </ItemGroup>\n <ItemGroup>\n <None Update=\"Content\\*.*\">\n <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n </None>\n </ItemGroup> \n</Project>\n",
"source": null,
"task_directory": null,
"saved_full_path": "e:\\temp\\o2\\demot\\demo4\\pallot2\\pallot2.csproj"
},
{
"file_name": "Ohjelma.cs",
"content": "using System;\nnamespace PukkailuPeli;\npublic static class Program\n{\n [STAThread]\n static void Main()\n {\n using var game = new PukkailuPeli();\n game.Run();\n }\n}\n",
"source": null,
"task_directory": null,
"saved_full_path": "e:\\temp\\o2\\demot\\demo4\\pallot2\\Ohjelma.cs"
}
],
"stem": null,
"task_directory": null,
"header": "pallot2: Kokeilu 1-2: Pallojen pukkaileminen"
},
"t4b": {
"path": "kurssit/tie/ohj1/v/2024/syksy/demot/demo4",
"type": "java",
"doc_id": 1159,
"ide_task_id": "t4b",
"task_files": [
{
"task_id_ext": "1159.java1.wyR6aYZeU2JQ",
"content": "public class HelloWorld {\n public static void main(String args[]) {\n System.out.println(\"Hello World!\");\n }\n}",
"file_name": "HelloWorld.java",
"source": "editor",
"task_directory": null,
"task_type": "java",
"saved_full_path": "e:\\temp\\o2\\demot\\demo4\\t4b\\HelloWorld.java",
"user_input": "",
"user_args": ""
}
],
"supplementary_files": [],
"stem": null,
"task_directory": null,
"header": null
},
"tauno1a": {
"path": "kurssit/tie/ohj1/v/2024/syksy/demot/demo4",
"type": "cs/comtest",
"doc_id": 1159,
"ide_task_id": "tauno1a",
"task_files": [
{
"task_id_ext": "1159.lisaaTaulukkoon.sbo5F1EyHQlZ",
"content": "using System;\n\n/// @author vesal\n/// @version 28.8.2014\npublic class Tauno1\n{\n public static void Main()\n {\n int[] t = { 23, 45, 12, 9, 3, 7 };\n Console.WriteLine(\"Aluksi : \" + string.Join(\", \", t));\n KasitteleTaulukko(t);\n Console.WriteLine(\"Lopuksi: \" + string.Join(\", \", t));\n }\n\n\n /// <summary>\n /// Aliohjelmalla käsitellään taulukko sovitulla tavalla\n /// </summary>\n /// <param name=\"t\">taulukko joka käsitellään</param>\n /// <example>\n /// <pre name=\"test\">\n /// int[] t;\n /// t = new int[]{$t1}; KasitteleTaulukko(t); String.Join(\", \",t) === \"$t2\";\n ///\n /// $t1 | $t2\n /// ------------------------------------------------\n /// 2, 3, 1, 4, 6, 5 | 7, 8, 6, 9, 11, 10\n /// 10, 3, 1, 9, 4, 2 | 15, 8, 6, 14, 9, 7\n /// </pre>\n /// </example>\n public static void KasitteleTaulukko(int[] t)\n {\n// --- Write your code below this line. ---\n t[0] += 5;\n// --- Write your code above this line. ---\n }\n}",
"file_name": "Tauno1.cs",
"source": "editor",
"task_directory": null,
"task_type": "cs/comtest",
"saved_full_path": "e:\\temp\\o2\\demot\\demo4\\tauno1a\\Tauno1.cs",
"user_input": "",
"user_args": ""
}
],
"supplementary_files": [
{
"file_name": "tauno1a.csproj",
"content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n <PropertyGroup>\n <OutputType>Exe</OutputType>\n <TargetFramework>net$(NETCoreAppMaximumVersion)</TargetFramework>\n </PropertyGroup>\n</Project>\n",
"source": null,
"task_directory": null,
"saved_full_path": "e:\\temp\\o2\\demot\\demo4\\tauno1a\\tauno1a.csproj"
}
],
"stem": "Tee ensin muuttuja lisattava, jonka arvo on 5. Sitten lisää tämän muuttujan arvo jokaiseen taulukon alkioon. Esim: taulukko 5 4 6 2 9 1 muuttuu taulukoksi 10 9 11 7 14 6",
"task_directory": null,
"header": "Tehtävä Tauno T4 a"
},
"tb2": {
"path": "kurssit/tie/ohj1/v/2024/syksy/demot/demo4",
"type": "jypeli/doc",
"doc_id": 1159,
"ide_task_id": "tb2",
"task_files": [
{
"task_id_ext": "1159.pistelaskuri.DoM3IS3XYx0X",
"content": "using System;\nusing System.Collections.Generic;\nusing Jypeli;\nusing Jypeli.Assets;\nusing Jypeli.Controls;\nusing Jypeli.Effects;\nusing Jypeli.Widgets;\n\nnamespace PukkailuPeli;\n\npublic class PukkailuPeli : PhysicsGame\n{\n// --- Write your code below this line. ---\n public override void Begin()\n {\n Image[] kuvat = LoadImages(\"Baby\", \"Chell\", \"Cigur\", \"Igor\", \"Infant\", \"Jango\", \"Knive\", \"Leader\", \"Mum\", \"Ron\", \"Ven\", \"Yar\");\n Level.Background.Color = Color.Black;\n Level.Background.Image = LoadImage(\"village\");\n // Level.Size = Screen.Size;\n Level.Height = Level.Width * Screen.Height / Screen.Width;\n // Level.Width = Level.Height * Screen.Width / Screen.Height;\n Camera.ZoomToLevel();\n Level.CreateBorders();\n // Level.Background.CreateGradient(Color.White, Color.Blue);\n Gravity = new Vector(0, -50);\n\n for (int i = 0; i < 40; i++)\n {\n PhysicsObject p; // Tämä apumuuttuja tarvitaan Guru-tehtävää varten\n p = PiirraPallo(\n this,\n RandomGen.NextDouble(Level.Left, Level.Right), // Kentän vasen ja oikea reuna\n RandomGen.NextDouble(Level.Bottom, Level.Top), // alareuna, yläreuna\n RandomGen.NextDouble(5, 30),\n RandomGen.NextColor()\n );\n p.Tag = \"vihollinen\"; // jotta voidaan antaa tunniste törmäyksille\n p.Image = kuvat[RandomGen.NextInt(kuvat.Length)];\n }\n\n\n PhysicsObject pallo = PiirraPallo(this, 0, 0, 40, Color.White);\n\n AddCollisionHandler(pallo, \"vihollinen\", PalloTormasi); // Guru tehtävää varten oman pallon ja muiden törmäys\n pallo.Image = LoadImage(\"King\");\n\n Keyboard.Listen(Key.Escape, ButtonState.Pressed, ConfirmExit, \"Poistu\");\n Keyboard.Listen(Key.F1, ButtonState.Pressed, ShowControlHelp, \"Näytä näppäinohjeet\");\n Keyboard.Listen(Key.Up, ButtonState.Pressed, LyoPalloa, \"Lyö palloa ylöspäin\", pallo, new Vector(0, 1000));\n Keyboard.Listen(Key.Down, ButtonState.Pressed, LyoPalloa, \"Lyö palloa alaspäin\", pallo, new Vector(0, -1000));\n Keyboard.Listen(Key.Left, ButtonState.Pressed, LyoPalloa, \"Lyö palloa vasemmalle\", pallo, new Vector(-1000, 0));\n Keyboard.Listen(Key.Right, ButtonState.Pressed, LyoPalloa, \"Lyö palloa oikealle\", pallo, new Vector(1000, 0));\n\n // Seuraavat rivit puhelinta varten\n PhoneBackButton.Listen(Exit, \"Lopeta peli\");\n // Accelerometer.Calibration = AccelerometerCalibration.ZeroAngle; // WP7\n // Accelerometer.ListenAnalog(AccelerometerSensitivity.Realtime, VaihdaSuuntaa, \"Vaihda suuntaa\", pallo); // WP7\n }\n\n\n /// <summary>\n /// Annetaan pallolle isku pyydettyyn suuntaan ja pyydetyllä voimalla\n /// </summary>\n /// <param name=\"pallo\">pallo jota lyödään</param>\n /// <param name=\"suunta\">suunta/voimavektori lyöntiä varten</param>\n private static void LyoPalloa(PhysicsObject pallo, Vector suunta)\n {\n pallo.Hit(suunta);\n }\n\n\n /// <summary>\n /// Guru-tehtävää varten pallojen törmäysten käsittely\n /// </summary>\n /// <param name=\"pallo\">Oma pallo</param>\n /// <param name=\"p\">pallo johon törmättiin</param>\n private void PalloTormasi(PhysicsObject pallo, PhysicsObject p)\n {\n if (p.Y < 0) return;\n Explosion rajahdys = new Explosion(p.Width);\n rajahdys.Position = p.Position;\n rajahdys.UseShockWave = false;\n Add(rajahdys);\n p.Destroy();\n }\n\n\n /// <summary>\n /// Luodaan ja lisätään ruudulle annetun kokoinen pallo\n /// annettuun paikkaan.\n /// </summary>\n /// <param name=\"peli\">Peli, johon pallo piirretään</param>\n /// <param name=\"x\">Kappaleen keskipisteen x-koordinaatti</param>\n /// <param name=\"y\">Kappaleen keskipisteen y-koordinaatti</param>\n /// <param name=\"r\">Pallon säde</param>\n /// <param name=\"vari\">Pallon väri</param>\n /// <returns>luodun pallon viite</returns>\n public static PhysicsObject PiirraPallo(Game peli, double x, double y, double r, Color vari)\n {\n PhysicsObject kappale = new PhysicsObject(2 * r, 2 * r, Shape.Ellipse);\n kappale.Position = new Vector(x, y);\n kappale.Color = vari;\n peli.Add(kappale);\n return kappale;\n }\n// --- Write your code above this line. ---\n}",
"file_name": "PukkailuPeli.cs",
"source": "editor",
"task_directory": null,
"task_type": "jypeli/doc",
"saved_full_path": "e:\\temp\\o2\\demot\\demo4\\tb2\\PukkailuPeli.cs",
"user_input": "",
"user_args": ""
}
],
"supplementary_files": [
{
"file_name": "tb2.csproj",
"content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n <PropertyGroup>\n <OutputType>WinExe</OutputType>\n <TargetFramework>net$(NETCoreAppMaximumVersion)</TargetFramework>\n </PropertyGroup>\n <ItemGroup>\n <PackageReference Include=\"Jypeli.NET\" Version=\"11.*\"/>\n <PackageReference Include=\"Jypeli.FarseerPhysics.NET\" Version=\"2.*\"/>\n </ItemGroup>\n <ItemGroup>\n <PackageReference Include=\"Jypeli.NET\" Version=\"11.*\"/>\n <PackageReference Include=\"Jypeli.FarseerPhysics.NET\" Version=\"2.*\"/>\n </ItemGroup>\n <ItemGroup>\n <None Update=\"Content\\*.*\">\n <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>\n </None>\n </ItemGroup> \n</Project>\n",
"source": null,
"task_directory": null,
"saved_full_path": "e:\\temp\\o2\\demot\\demo4\\tb2\\tb2.csproj"
},
{
"file_name": "Ohjelma.cs",
"content": "using System;\nnamespace PukkailuPeli;\npublic static class Program\n{\n [STAThread]\n static void Main()\n {\n using var game = new PukkailuPeli();\n game.Run();\n }\n}\n",
"source": null,
"task_directory": null,
"saved_full_path": "e:\\temp\\o2\\demot\\demo4\\tb2\\Ohjelma.cs"
},
{
"file_name": "Content/Baby.png",
"content": null,
"source": "static/ohj1/Content/Baby.png",
"task_directory": null,
"saved_full_path": "e:\\temp\\o2\\demot\\demo4\\tb2\\Content\\Baby.png"
},
{
"file_name": "Content/Chell.png",
"content": null,
"source": "static/ohj1/Content/Chell.png",
"task_directory": null,
"saved_full_path": "e:\\temp\\o2\\demot\\demo4\\tb2\\Content\\Chell.png"
},
{
"file_name": "Content/Cigur.png",
"content": null,
"source": "static/ohj1/Content/Cigur.png",
"task_directory": null,
"saved_full_path": "e:\\temp\\o2\\demot\\demo4\\tb2\\Content\\Cigur.png"
},
{
"file_name": "Content/Igor.png",
"content": null,
"source": "static/ohj1/Content/Igor.png",
"task_directory": null,
"saved_full_path": "e:\\temp\\o2\\demot\\demo4\\tb2\\Content\\Igor.png"
},
{
"file_name": "Content/Infant.png",
"content": null,
"source": "static/ohj1/Content/Infant.png",
"task_directory": null,
"saved_full_path": "e:\\temp\\o2\\demot\\demo4\\tb2\\Content\\Infant.png"
},
{
"file_name": "Content/Jango.png",
"content": null,
"source": "static/ohj1/Content/Jango.png",
"task_directory": null,
"saved_full_path": "e:\\temp\\o2\\demot\\demo4\\tb2\\Content\\Jango.png"
},
{
"file_name": "Content/Knive.png",
"content": null,
"source": "static/ohj1/Content/Knive.png",
"task_directory": null,
"saved_full_path": "e:\\temp\\o2\\demot\\demo4\\tb2\\Content\\Knive.png"
},
{
"file_name": "Content/Leader.png",
"content": null,
"source": "static/ohj1/Content/Leader.png",
"task_directory": null,
"saved_full_path": "e:\\temp\\o2\\demot\\demo4\\tb2\\Content\\Leader.png"
},
{
"file_name": "Content/Mum.png",
"content": null,
"source": "static/ohj1/Content/Mum.png",
"task_directory": null,
"saved_full_path": "e:\\temp\\o2\\demot\\demo4\\tb2\\Content\\Mum.png"
},
{
"file_name": "Content/Ron.png",
"content": null,
"source": "static/ohj1/Content/Ron.png",
"task_directory": null,
"saved_full_path": "e:\\temp\\o2\\demot\\demo4\\tb2\\Content\\Ron.png"
},
{
"file_name": "Content/Ven.png",
"content": null,
"source": "static/ohj1/Content/Ven.png",
"task_directory": null,
"saved_full_path": "e:\\temp\\o2\\demot\\demo4\\tb2\\Content\\Ven.png"
},
{
"file_name": "Content/Yar.png",
"content": null,
"source": "static/ohj1/Content/Yar.png",
"task_directory": null,
"saved_full_path": "e:\\temp\\o2\\demot\\demo4\\tb2\\Content\\Yar.png"
},
{
"file_name": "Content/King.png",
"content": null,
"source": "static/ohj1/Content/King.png",
"task_directory": null,
"saved_full_path": "e:\\temp\\o2\\demot\\demo4\\tb2\\Content\\King.png"
},
{
"file_name": "Content/village.png",
"content": null,
"source": "static/ohj1/Content/village.png",
"task_directory": null,
"saved_full_path": "e:\\temp\\o2\\demot\\demo4\\tb2\\Content\\village.png"
}
],
"stem": null,
"task_directory": null,
"header": "Tehtävä B2. Pistelaskuri"
},
"lassytysta": {
"path": "kurssit/tie/ohj1/v/2024/syksy/demot/demo4",
"type": "cs/comtest/doc",
"doc_id": 1159,
"ide_task_id": "lassytysta",
"task_files": [
{
"task_id_ext": "1159.lassytysta.xldW4mKXWoJC",
"content": "",
"file_name": "lassytysta.cs",
"source": "editor",
"task_directory": null,
"task_type": "cs/comtest/doc",
"saved_full_path": "e:\\temp\\o2\\demot\\demo4\\lassytysta\\lassytysta.cs",
"user_input": "",
"user_args": ""
}
],
"supplementary_files": [
{
"file_name": "lassytysta.csproj",
"content": "<Project Sdk=\"Microsoft.NET.Sdk\">\n <PropertyGroup>\n <OutputType>Exe</OutputType>\n <TargetFramework>net$(NETCoreAppMaximumVersion)</TargetFramework>\n </PropertyGroup>\n</Project>\n",
"source": null,
"task_directory": null,
"saved_full_path": "e:\\temp\\o2\\demot\\demo4\\lassytysta\\lassytysta.csproj"
}
],
"stem": "Kirjoita funktio MuutaKirjaimet joka palauttaa jonon lässytettynä, eli jokainen parametrina viety korvattava kirjain on korvattu vastaavalla toisella kirjaimella koosta riippumatta.",
"task_directory": null,
"header": "Tehtävä B1. Lässytystä"
}
}
}
}
}
Muutokset 9.12.2024
Haun syntaksi ennallaan, annetaan hakemistossa joka on tehtävien "juuri"
lähettämisen syntaksi
tide submit ([-a] tiedoston nimi) | .
.timdata
on yhteinen koko kurssin kaikille tehtäville (ks esim edellä)se syntyy hakemistoon, jossa
create
-komento annetaan tai joka on sen viimeisenä parametrinalisätty attribuutti
taskDirectory
, joka Pythonissa näkyytask_directory
task_directory
voi olla eri jokaiselle samankin tehtävän tiedostolle, tosin Java-tiedostojen osalta yleensä samatulee automaattisesti Jave-tiedostolle esim:
josta tulee automaattisesti
task_directory: src/demo/d4/fx
jafilename: IkaMain
JavaFX:n
.css
ja.fxml
-tiedostoille pitää itse laittaataskDirectory: src
jolloin tiedoston nimi vie ne oikeaan paikkaan.muutokset tehty:
Muutokset 10.12.2024
kohtuullisen iso muutus tuli siitä, että
task_type
pitää erikseen kuljettaa kaikissa taskin tiedostoissa, koska ne eivät ole välttämättä samaa tyyppiä. Esim jos ei kuljettanut, niin.css
tiedosto yritettiin ajaa Java-tiedostona.jos annetaan
submit .
otetaan nykyhakemisto, noustaan ylöspäin kunnes löytyy
.timdata
-tiedosto (ks esimerkki yllä).- jos hakemistossa on vain yksi task, se lähetetään (tämä vastaa vanhaa toimintaa loogisesti, eli yksi tehtävä/hakemisto)
- jos on useita, niin virhe
jos annetaan esimerkiksi
submit IkaMain.java
niin otetaan ko tiedoston täydellinen polku. Noustaan tiedoston hakemistosta ylöspäin kunnes löytyy
.timdata
- tuolta etsitään se task, jolla on täsmälleen sama
saved_full_path
-arvo.- lähetetään ko
tiedosto
- lähetetään ko
- tuolta etsitään se task, jolla on täsmälleen sama
jos annetaan esimerkiksi
submit -a IkaMain.java
niin otetaan ko tiedoston täydellinen polku.
- kuten edellä, mutta lähetetään kaikki sen taskin tiedostot johon etsittävä tiedosto kuuluu
- tiedostot lähetettävä tällöion siinä järjestyksessä kuin ne ovat
task_files
-listassa
Vielä pitää tehdä
Mahdollisesti tarvitaan joskus:
- voisi optimoida metadatan tallennusta siten, että sitä ei kirjoiteta heti tiedostoon, vaan vasta kun kaikki demokerran tehtävät on lisätty. Vaatisi "globaalin"
course_metadatan
ja jos se on, niin sitä muutetaan ja sitten lopuksi kun createsta ollaan postumassa se globaali tallennetaan. En tiedä kuinka hyvin file-cachet huolehtivat siitä, että onko tuolla merkitystä sitten kun demoja on paljon samassa.timdata
:ssa. Tuo selviää kun pääss kokeilemaan koko Ohj2-kurssin datalla.
These are the current permissions for this document; please modify if needed. You can always modify these permissions from the manage page.