# data[].attributes.body
1. Kood on inglise keelne

2. Koodis olevad kommentaarid on eesti keeles

3. JavaDoc on kas inglise- või eestikeelne, sõltub ülesandest

4. Muutujanimed on ennast selgitavad inglise keeles. Algavad väikse tähega

5. Meetodite/funktsioonide nimed on ennast selgitavad - inglise keeles. Algavad väikse tähega

6. Klassi failid on ennast selgitavad inglise keeles ja algavad suure tähega. Näitkes klassi fail rahvad, inimesed on Peoples või Persons

7. Kui muutujanimi või meetodi/funktsiooni nimi koosneb mitmest sõnast, siis see kirjutatakse kokku algab väikse tähega ning iga uus sõna algab suuretähega. Tekst on inglise keeles. Näiteks muutuja: maxNameLength või meetod/funktsioon: maxNameLength()

8. Kasutajaliides (Interface) on eestikeelne

9. Muutujad millel on kindel väärtus defineeritakse koodi alguses. Näiteks kui on vaja kasutada failinime Riigipuhad.xml, siis kirjutatakse see koodi algusesse

String filename = "Riigipuhad.xml";

Mõned Java meetodid

# data[].attributes.headline
29.03.2019 Python ->Java Class + GUI App

# data[].attributes.subject
29.03.2019 Python ->Java Class + GUI App

# data[].attributes.body
Pythoni klassi fail kirjutada Java klassi failiks (vaja pole canCalculate)
Teha Java graafiline rakendus kasutades tehtud Java klassi faili
Rakendus peab kasutama kõiki meetodeid rakenduses.

# data[].attributes.body
1. Teha eraldi leht, mis on kättesaadav aadressilt https://SINUDOMEEN/bistroo/duplicates

1. Disain jätke samaks nagu menüü puhul

2. Leht peab näitama millised praed olid eelmisel päeval ka olemas. Näiteks kui reedel oli praeks Šašlõkk ja esmaspäeval on ka Šašlõkk, siis esmaspäeval näitabki seda Šašlõkki.

# data[].attributes.body
Karlis ja Rain kirjutavad tagasiside Tieto kohta. Küsimused on Triin postitanud eelmisel nädalal Facebooki. Tagasiside tuleb vormistada kirjalike tööde vormistasmise juhendi põhjal https://www.kehtna.edu.ee/opilasele/oppetoo-dokumendid/ Töö peab sisaldama Tiitellehte ja tagasisidet.

Nädala ülesanne on aga manuses kõigile.

# data[].attributes.body
Esmalt loe keskmise veeru esimest postitust (Koodi kirjutamisereeglid). Kui ülesanne valmis, saada see aadressile: livental@gmail.com

Selgitus

Kasutajal on üks CSV fail mis on seotud tema aktiivsusmonitoriga Xioami Mi Band 2. Tema soov oleks saada infot päevade kohta ja statistikat kuude kaupa. Kasutajaliides peab olema mugav lihtne ja loogiline. Kui näidatakse mingit statistilist infot peab olema näha ka algandmed mille põhjal on see tehtud. Võib olla ka mõni otsingu variant. Näiteks millal käididi rohkem kui 5000 sammu päevas või millal käidi alla 500 päeva. Valikud on teie teha. Seal võivad olla distantsi kohta kui ka kalorite kohta.

Kasutaja on tuvastanud faili struktuuri ja selle sisu. Info mis teda ei huvita, kuid näha peab olema on runDistance. lastSyncTime on UnixTimestamp mis sisaldab kuupäeva, kui ka kellaaega. See on aeg millal antud andmed viimati uuendati. Näidatud peaks olema nii originaal number kui ka inimlikul kujul number. Steps on sammude arv. Distance on käidud tee meetrites. Calories on kulutatud kalorid antud päeval. Date on aga kuupäev.

Kuupäevad võiks olla õiget pidi ja eesti vormingus (PP.KK.AAAA). Seda ka lastSyncTime puhul. Arvestama peab, et fail hakkab päevade kaupa kasvama. Üks rida päevas ja failinimi on alati sama.

Vajalik fail on siin.

Treeview näidis https://knowpapa.com/ttk-treeview/

# data[].attributes.body
Manuses on lihtne GUI vaade. Proovige tekitada sama paigutus (Layout). Mõned tähelepanekut:

1. Raadionupud on üle kahe veeru

2. Nupud Korras ja Tühista on teise veeru all.

3. Nupp Salvesta on uuel real paremal servas

4. Tekstarea on üle kuue rea kõrge.

5. Kõik vidinad (Widget) on vaikimisi (Default) suurustega. V.a. TextArea millel on suuruseks 80x12. Vajadusle võib neid kohendada.

6. Selleks et vidinad üksteise selgas ja liiga ääres pole on kasutataud padx ja/või pady mõlemal juhul 5.

7. Aken ise on 800x600

8. Ideaalne juhtum oleks nii, et akna suuruse muutmisega võiks vidinad peal ka liikuda

# data[].attributes.body
Graafiline keskkond on ka Pythonil huvitav. Kõike tuleb n.ö. nullist kirjutada. Pole see nii mugav kui Javas, aga põnev ikkagi. Tehke sellejaoks üks või mitu faili, et saaksite kõik variandid ära proovitud. Lisaks proovige tekitada olukord, et kui midagi valida või sisestada, et te vajaliku info ka kätte saaksite. Näiteks: Kolm radiobuttoni, milline on kolmest valitud. Harjutamiseks on juhend https://likegeeks.com/python-gui-examples-tkinter-tutorial/

Ülesanne 1

1. Pealkiri on Iseseisev harjutus

2. Aken mille mõõdud oleks 900x600

3. Aken oleks keset ekraani

4. Akna suurust ei saa muuta

5. Kõik vormile tulevad asjad on Verdana ja suurus 12

6. Rida 1

1. Lisa Label tekstiga Sisesta tekst:  mis oleks joondatud veeru paremale äärde

2. Peale labelit lisa Enrty mille laius oleks 20

1. Kui vajutada Enter, siis peab näitama 6.4. tulemust tagurpidi, eeldusel et väli pole tühi!

3. Selle kõrvale lisa label nimega Tulemus: Joondatud veeru keskele (default)

4. Lõpuks lisa teine Entry kus näidatakse esimese Entry tulemust tagurpidi ja punase tekstina ja väikeste tähtedega

7. Rida 2

1. Lisa Label tekstiga Sisesta üks märk:. mis oleks joondatud veeru paremale serva

2. Lisa Entry kuhu saab sisestada klaviatuuri märgu (võib ka mitu märki) aga arvestatakse ainult esimest märki!

3. Lisa Button nimega Näita.

1. Kui nupule vajutada, siis näidatakse sisestatud märgi ASCII koodi (ord) järgnevass Entry's. Kui on rohkem kui mitu märki, siis ainult esimest. Jällegi, eeldusel et lahter on täidetud!

4. Viimaseks selles reas on Entry. Näitab siis esimese Entry ASCII koodi. A on 65 6 on 54 jne.

8. Rida 3

1. Esimene veerus on ScrolledText mille laius on 20

2. Teine on reas Button, mille tekst Tähestik

1. Kui nuppu vajutada, siis näidatakse ScrolledTexis kogu eesti tähestik s.h. ÄÖÕÜŠŽ ja ka väiksed tähed. AINULT TÄHED! Koos ASCII koodiga

2. Kui ASCII kood on suurem kui 300, siis näidatakse seda rida punasena

3. Kolmas selles reas on Combobox

1. Combobox on täidetud selle sama eesti tähestikuga suured ja väiksed tähed

2. Tehes sealt valik, siis eelmise rea veeru viimases lahtris näidatakse täht ja selle ASCII kood. Näiteks A 65.

3. Kui ASCII kood on suurem kui 300, siis on see seal lahtris samal kujul aga PUNANE. Näiteks Š 352

9. NB! Kolmanda veeru nupp ja combobox peavad olema veeru üleval paremal servas ja sama lai kui veerg.

# data[].attributes.headline
19.09.2018 CSV faili osadest teha JSON fail

# data[].attributes.subject
19.09.2018 CSV faili osadest teha JSON fail

# data[].attributes.body
Eilses ülesandes saite ühe JSON faili. Täna on teil vaja teha midagi sarnast. See tuleb teha failist ElavadJaSurnud.csv, mis on teil juba arvutis olemas. Kui mitte, siis 12.09.2018 ülesandest saate selle allalaadida. Kui tavaliselt olen csv failide puhul öelnud et ärge kasutage import csv skripti alguses, siis see kord jätan teil käed vabaks, kasutage kui soovite. Peaks olema võimalik teha nii ühte kui teistpidi. JSON faili ei lähe kogu csv faili sisu, kuigi, kui seadetes muuta ühte rida, on see täitsa võimalik. Originaalis on vaja saada JSON faili järgnevad veerud: Eesnimi, Perenimi, Sugu, Sünniaeg, Isikukood, Surmaaeg

Kuidas ülesannet lahendada?
Esmalt defineerige muutujad mis on globaalsed, sest kui midagi muuta, siis see peab olema alati skripti alguses. Mõned vihjed:

1. Kaks failinime üks on .csv ja teine .json. Nimi võib mõlemal sama olla

2. Veergude numbrid mis on vajalikd. Originaal variandi puhul on nendeks 0,1,2,3,4,12 Nende numbrite muutmisest sõltub millised veerud on JSON failis. Siin 0 = 1 veerg ehk Eesnimi, 1 = 2 veerg ehk Perenimi jne. Selle võib soovikorral teha nii, et saab kirjutada 1 = 1, 2 = 2 jne. Aga pole kohustulsik

3. CSV veergude eraldaja võiks olla eraldi defineeritud

4. Paar muutujat (LISTi) mida peate vajalikuks :-)

Järgnev eesmärk on teil vaja saada kätte ja kirjutada kuhugi LISTi CSV faili esimene rida, ehk päis. Kui see väljastada, siis peaks see olema selline:

['Eesnimi', 'Perenimi', 'Sugu', 'Sünniaeg', 'Isikukood', 'Surmaaeg']

Sellist rida on sul ainult üks!

Kui päis on käes, siis on vaja vastavalt nendele veergudele kätte saada kõik isikud. See peaks olema samal kujul nagu päis. Seega viimase isikupuhul csv failis oleks see järgnev:

['Richard', 'Bell', 'M', '1979-03-11', '37903117038', '']

Selliseid ridu on sul nii plaju kui on isikuid CSV failis.

Nagu sa tead, koosneb JSON nagu ka Pythoni Dictionary key:value paarist. Iga kord kui sa oled saanud isiku kätte on sul need kaks asja päis (key) ja isikuandmed (value) panna paari. Selleks on Pythonil vajalikud vahendid olemas. Tulemus peaks viimase isiku puhul olema järgnev:

{'Eesnimi': 'Richard', 'Perenimi': 'Bell', 'Sugu': 'M', 'Sünniaeg': '1979-03-11', 'Isikukood': '37903117038', 'Surmaaeg': ''}

Sellisel kujul nagu sa viimase rea said tuleb need kõik sellisel kujul kirjutada LISTi. Kui kõik andmed on koos, on see vaja viia JSON vormingusse ja kirjutada faili. Juhul kui csv failis oleks ainult kolm isikut, oleks see lõpp tulemus alljärgnev:

[
    {
        "Eesnimi": "Janar",
        "Perenimi": "Käsper",
        "Sugu": "M",
        "Sünniaeg": "2005-05-04",
        "Isikukood": "50505045263",
        "Surmaaeg": ""
    },
    {
        "Eesnimi": "Elisabeth",
        "Perenimi": "Kasemets",
        "Sugu": "N",
        "Sünniaeg": "1966-10-21",
        "Isikukood": "46610214567",
        "Surmaaeg": ""
    },
    {
        "Eesnimi": "Trinity",
        "Perenimi": "Merila",
        "Sugu": "N",
        "Sünniaeg": "2001-01-29",
        "Isikukood": "60101299732",
        "Surmaaeg": ""
    }
]

importida on vaja ainult json. Kui aga kasutad csv faili lugemiseks pythoni vahendeid, siis ka csv. Seega:

import json
import csv

# data[].attributes.body
Nüüdseks peaksite olema kokku puutunud Pythoni Dictionaries. Laiaslaastus on see key:value Sellist varianti kasutatakse tavaliselt JSON failides. Neid aga kasutatakse mitmetes erinevates keeltes. Näiteks Javascript või phpMyAdmin suudab exportida info JSON faili. Üks selline ongi teil siin. Laadige alla ja pakkige lahti kausta, kus on teil Pythoni skriptid. .json faili vaatamiseks kasutage Notepad++. NB! Failisisu on korrektne!

Kuna osadel on endiselt probleeme korraliku koodi kirjutamisega, siis lugeda siinse tahvli algusest teemat Koodi kirjutamisereeglid Ma ei hakka siin nimesid mainima aga Rain ja Karlis ning Paul :-)

Ülesanne 1: Tutvus JSON failiga ja esmane lugemine

1. Guugeldage ja otsige lahendus kuidas lugeda JSON faili sisu muutujasse. Üle ei tohi mõelda. See tehakse ära kahe reaga. NB! Lugedes failis sisu ärge samas tsüklis või tegevuses üritage infot näidata. Python IDLE võib kokku jooksta! Ülesannet ei lahendada stiilis rea kaupa (line by line) faili sisu lugemine.

2. Näidake järgnevat infot:

1. Kui palju on isikuid kokku (sõltumata käivitus kordade arvust on see alati sama kui faili pole muudetud!)

2. Kelle nimi (täisnimi) on kõige pikem (mitu tähemärki pikk ja nimi. Sõltumata käivitus kordade arvust on see alati sama kui faili pole muudetud!)

3. Mis ametinimi on kõige pikem (mitu tähemärki ja mis ametinimi. Sõltumata käivitus kordade arvust on see alati sama kui faili pole muudetud!)

4. Üks juhuslik isik (igakord kui käivitad skripti näidatakse erinevat isikut) koos isiku infoga:

1. järjekorranumber (näiteks: Tarvo Krall on 0 (null))

2. nimi

3. sundinud

4. amet

5. surnud

5. Näita lisaks viimase isiku:

1. Millised võtmed (keys() on antud kirjes. Näiteks nii ja sellisel kujul: dict_keys(['nimi', 'sundinud', 'amet', 'surnud'])

2. MIllised andmed (values()) on antud kirjes. Näiteks nii ja sellisel kujul: dict_values(['Katrin Õunap', '1964-07-29', 'arstiteadlane', '0000-00-00'])

1. NB! dict_keys ja dict_values ei ole minu muutujad vaid süsteemi poolt pandud.

Ülesanne 2: Isikute vanused
Järgnevas ülesandes on vaja arvutada kõikidel isikutel vanus aastates. Kui elab, siis kui vana ta täna on.Ja kui surnud, siis kui vanalt ta suri. Arvestama peab kuud ja kuupäevi. Kui täna on 18.09.2018 ja isik sündis 01.09.2000, siis on ta vanus 18 aasta. Kui aga isik sündis 30.09.2000 siis on ta 17 aastat. Sama tingimus on ka surnud isikute kohta. Kui vana oleks surnud isik täna pole oluline arvutada, kuid soovi korral võid teha.
Kõigele lisaks tuleb infot näidata järgnevalt: Täna peaks näitama surnud isiku vanust tänase päeva seisuga (kui plaanid seda teha). Kõik veerud peavad olema ühtlased, et kui infot jooksvalt näidatakse, siis kogu info peab paistma ilusti veergudes. Selleks tuleb kasutada eelmise ülesanne muutuja väärtust, mis ütles kõige pikema isiku nime.

Nimi                                 Sünniaeg   Surmaaeg     Vanus Täna
Olga Lauristin                       1903-04-28 2005-06-25   102   115
Kaie Kõrb                            1961-04-01               57
jne..

NB! Kui š Š või ž Ž tähtedega inimesed ei jää korrektselt, siis nendega ei maksa pead murdma hakata. ÄÖÕÜäöõü aga peaks paika jääma!

Ülesanne 3: Kaks uut faili
Eelmise ülesande vastused kirjuta eraldi faili. Ühes on elavad isikud (veerg Surmaaeg ja Täna kaota failis ära) faili nimega Elavad.txt ja teises on surnud isikud failinimega Surnud.txt Konsooli ei pea näitama muud kui Oota... ja Valmis!

# data[].attributes.headline
12.09.2018 Failist lugemine ja kirjutamine

# data[].attributes.subject
12.09.2018 Failist lugemine ja kirjutamine

# data[].attributes.body
Ilma failideta ei saa programmeerida. Ikka on vaja sealt midagi lugeda, midagi teha ja tulemus vajadusel konsooli või faili kirjutada. Ülesandes on kaks erinevat faili mida on vaja lugeda. Kuid alustame algusest. Vajalikud failid saab siit. Paki lahti need samasse kausta kus on sul pythoni skriptid. Sel juhul saad muutuja nimeks kasutada ainult failinimi ilma kausta teeta!

Ülesanne 1: Failist lugemine ja arvutamine

def is_integer(s):
    try:
        int(s)
        return True
    except ValueError:
        return False

1. Tee uus skript ja kirjuta antud funktsioon faili. Proovi kindlaks teha kuidas see töötab. Testi!

2. Nüüd on vaja lugeda faili bigCSVFile.csv rea kaupa.

3. Küsida kasutajalt millise veeru täisarvud on vaja kokku liita ja liida need kokku. Veerg on tulp ehk rida ülevalt alla :)

4. Vastuseks näita mitmes veerg ja mis on summa.

1. Kirjuta kood nii:

1. et pole vahet kas veerge on 10 või 110. (Hetkel on 15)

2. et pole vahet kas ridu on 100 või miljon (Hetkel 10000)

3. et kui kasutaja sisestab liiga suure numbri, siis loetakse kokku viimane veerg (andes sellest ka teada)

4. et kui kasutaja sisestab liiga väikse numbri või üldse mitte, siis arvutab kokku esimese veeru (andes sellest ka teada)

Ülesanne 2: Failist lugemine ja uute andmetega uue faili tegemine

Fail ElavadJaSurnud.csv sisaldab igasugust kahtlast kuid huvitavat infot. Faili genereerimisega tekkis viga, mis on nüüd muutunud tüütavaks (see on viga). Kahjuks on juhtunud nii, et osades  tänava nimedes on kaks tühikut kõrvuti.
Teie ülesandeks on kõik need isikud kogu infoga kirjutada uude faili. Seal hulgas peab olema faili alguses sama rida mis originaal faili alguses.
Lõpp tulemusena peab failis olema 319 rida k.a. esimene rida algsest failist (päis)

Ülesanne 3: Uue faili genereerimine
Juhuslikkus on huvitav. Nüüd proovime eilse ja tänase asja kokku panna. Teie ülesandeks on vaja teha sarnane fail nagu esimese ülesandes (bigCSVFile.csv). Selleks on vaja teil küsida kasutajalt mõningaid algandmeid ja siis lasta skriptil kogu asi ära teha. Siin võikski juhend lõppeda. Selleks et teid kursil hoida mõned tähelepanekud.

1. Üks on kindel igal juhul peab lõpp tulemusena fail tekkima sõtlumata sellest mida kasutaja on soovinud :-)

2. String peab koosnema SUURTEST väikestest tähtedest ja numbritest. Lihtsuse huvides US variant

3. Stringi pikkus (originaalis oli see 3 märki). Miinimum on 2 ja maksimum 5 märki. Kui on liiga suur või  väike siis on 3 märki.

4. Veergude arv (originaalis oli see 15 veergu). Miinimum on 1 ja maksimum on 20. Jällegi, kui on liiga suur, või liiga väike siis on 10 veergu.

5. Ridade arv (originaalis oli see 10000 rida). Miinimum on 100 ja maksimum on 20000 rida. Jällegi, kui kasutaja sisestab liiga väikse või liiga suure numbri, siis on 5000 rida.

6. Failinimi võiks küsida kasutajalt ilma csv laiendita. Selle laiendi (.csv) lisab skript ise. Kui failinimi jääb tühjaks, siis kirjutatakse nimeks bigCSVFile_new.csv

Ekstra täiendused

Proovige kasutajalt küsimine teha nii, et kui int puhul vajutatakse Enter või kirjutatakse tekst, siis kasutatakse vaikimisi (default) väärtust. Hetkel tuleb vale sisestuse korral error!

Default stringi pikkus on 3 märki

Default veergude arv on 10 veergu

Default ridade arv on 5000 rida

Default failinimi on bigCSVFile_new.csv

Võid ja peaksid teatud tegevuse jaoks kasutama funktsioone

Küsi kasutajalt kas mingi veerg peab ainult numbritest koosnema (arvestades algseid tingimusi). Kui jah, siis küsi kui mitmendad veerud need olema peavad.  Näiteks soovitakse 15 veergu ja iga 3. on numbrite veerg, siis tulemuses ongi 3, 6, 9, 12, 15. Kui aga soovitakse 10 veergu ja iga kolmas on numbriga veerg, siis on 3, 6, 9 veerg numbrilised. (Lisatud 12.09.2018 @ 19:42 )

# data[].attributes.body
1. Tee List kus oleks kogu eesti tähestik väikeste tähtedena. s.h. äöõüšž

2. Küsi kasutajalt, kui pikk peab olema juhuslik string

3. Küsi kasutajalt, mitu sellist stringi on vaja

4. Genereeri vajalikud stringid kasutades alguses defineeritud Listi ja võttes vajalikud tähed antud listist

Täiendus:

1. Kõik täishäälikud on SUURTÄHED

2. Tee muudatus, nii et algne tähestik oleks stringina

3. Punkt 2 ja 3 küsimus miinimum pikkus on 5 mõlemal variandil

1. Väljasta tulemus tekstifaili

# data[].attributes.body
Tehke uus skript. Küsige kasutajalt mitu juhuslikku arvu peab arvuti tegema. Kui palju teha, siin piiranguid pole. Juhuslik arv peab aga olema vahemikus 5 - 15 k.a. Kirjuta juhuslik arv massiivi (List). Sorteeri massiiv (kasuta sisseehitatud meetodit/funktsiooni).
Väljasta juhuslikud arvud konsooli nii, et esamlt näidatakse juhuslik number. Siis on tühik või kaks, sõltuvalt kas on kahekohaline või ühekohaline number selle järgi tuleb tühik ja nüüd tuleb nii mitu * kui suur see juhuslik number oli: Näiteks:

5  *****
10 **********

Juhuslik arvu saamiseks kirjuta koodi algusesse import random Juhusliku arvu saamiskes on aga rida print(random.randint(5, 15))

Ülesanne võib täieneda :)

# data[].attributes.body
Tekitage veebilehe template (põhi) Bootstrap baasil (viimane versioon), mis sisaldaks:

1. Bootstrap 4.1.3

1. Tether

2. Font Awesome 5.3

3. JQuery (DatePicker)

1. Eesti keelne variant

2. Kuupäev on kujul AAAA-KK-PP

3. Väikseim kuupäev on täpselt aasta tagasi tänane kuupäev

4. Suurim kuupäev on tänane kuupäev

4. Vaikimisi kaust on default Töötab sellisle kujul: http://localhost/default/

5. Lisa ilusate URLide osa (SEO) ka juurde.

1. Sisaldas .htaccess faili

2. Neli rida PHP koodi enne HTML tagi index.php failis

3. HEAD osas on base

4. PHP plokk, kus toimub lehtede vahetus

5. Fail avaleht.php (valikuline)

6. Selleks et kontrollida lisa veebilehele:

1. Üks ikoon versioonist Font Awesome 5.3

2. Kalender

3. http://localhost/default/avaleht (peaks tooma sama asja ette mis http://localhost/default/), kui on 5 punkt tehtud ;)

7. Sessioonide jaoks vajalikud failid.

1. Importige default.sql phpmyadminni. Andmebaasi olema ei pea. Tehakse automaatselt andmebaas default.

8. Tekitage olukord, et saaksite andmebaasis oleva kasutajanime ja parooliga veebile logida.

1. Logimine eraldi faili (login.php)

9. Nüüd pange tööle uue konto registreerimine.

1. Registreerimise vorm eraldi failis (register.php)

2. Kontrollitakse ainult seda, et poleks ühesugused kasutajanimed, muud infot ei kontrollita. Lisada juurde parooli kontroll, et need oleks ühesugused.

10. Lõpetuseks tehke kasutaja kontode haldamine. Seda saab ainult admin ehk leveliga 9 kasutaja teha

1. Võite kirjutada juurde process.php faili meetodi nimega isAdmin()

2. Muuta peab saama valitud kasutaja parooli ja valitud kasutaja levelit

3. Haldamine on failis manage.php