Boonusülesanded
Boonusülesannete lahendamisega saab praksist puudumistega teenitud miinuspunkte lunastada ja rühmatöös teenimata jäänud punkte asendada. Iga boonusülesande lahendamine annab 2 punkti.
Boonuspunktidele kehtivad järgnevad piirangud:
- ei saa plusspunkte koguda,
- ei saa üle 1/3 rühmatöö punktidest asendada (kõigi etappide peale kokku kuni 10p),
- ei saa koduste ülesannete hilinemisi lunastada.
Tähtaeg: 14 päeva enne eksamit
Spreadsheet parser
LibreOffice Calc on MS Office Excel alternatiiv, mis on open-source ja avatud failiformaadiga. Kirjuta programm, mis oskab lihtsaid LibreOffice spreadsheet faile (.ods) avada ja nende sisu näidata. ODS failid on tavalised zip failid, mis sisaldavad kindla struktuuriga xml faile.
Programm võtav käsureal parameetriks ods faili nime, avab selle zip failina ja loeb zipist content.xml
faili sisu. Seejärel kasutab programm mõnda XML töötlemise libraryt (nt dom4j), et leida xml seest spreadsheet lahtrite väärtused. Leitud väärtused peab käsureale väljastama, nii et on aru saada, mis väärtus tuli mis lahtrist (ei pea midagi keerulist tegema).
Võib eeldada, et ods failis on ainult üks spreadsheet. Võib eeldada, et spreadsheetil on ainult tekst (pilte, graafikuid jms pole).
Näide. Tabeli sisu:
a1 | b1 | (tühi) |
a2 | (tühi) | c2 |
(tühi) | b3 | c3 |
Sellele vastav ods fail: Attach:sample.ods (ava 7-zip vms programmiga)
Calendar reader
Kirjuta programm, mis oskab online kalendreid lugeda ja sealt sündmusi näidata. Programm peab oskama lugeda iCalendar formaati (https://tools.ietf.org/html/rfc5545). Kasutaja sisestab käsurea parameetritega kalendri URLi, ajavahemiku alguse- ja lõpukuupäeva. Programm peab näitama selles ajavahemikus toimuvate sündmuste nimesi, kirjeldusi ja täpseid toimumisaegu.
Täpsustused:
- programm peab lugema kalendrist sündmusi ja korduvaid sündmusi (ainult FREQ ja UNTIL reeglid). Korduvate sündmuste puhul näidata iga kordust eraldi.
- kalendri lugemise loogika tuleb ise kirjutada. olemasolevaid ical librarysi kasutada ei tohi.
- programm võib ignoreerida infot, mida pole vaja kasutajale näidata (st tervet kalendri formaati ei pea oskama lugeda).
- käsurealt sisestatud kuupäevad on ISO-8601 date formaadis (nt 2017-04-23). programmi väljastatud toimumisajad on ISO-8601 Combined date and time formaadis (nt 2017-04-23T19:03:35+03:00)
- kuupäevade arvutamiseks peab kasutama
java.time
klasse, nt LocalDateTime, Instant ja DateTimeFormatter. Ära kasuta vanu ja jaburaid klasse Date, Calendar, SimpleDateFormat. - kalendri URList lugemist peaks testima kas google calendar või ut.ee ÕISi kalendriga. google jaoks vaata https://support.google.com/calendar/answer/37648?hl=en "See your calendar" ja ÕISis ainetele registreerimise vaates kalendri kõrval on nupuke "telli" - copy-paste selle link.
Vihje: failiformaat on lihtsam, kui esialgu tundub. vaata nende google/ÕIS linkide sisse - tegu on ilusate tekstifailidega, mille formaat on täpselt ära spetsifitseeritud.
Repo watchdog
Kirjuta programm, mis kontrollib perioodiliselt sinu rühmatöö git repositoryt. Kui keegi commitib koodi, kus on catch (NullPointerException e)
või .close()
ilma lähedal asuva finally keywordita, siis programm saadab sulle emaili peale teavituse. Iga committi peaks kontrollima ainult ühe korra (st ei vaadata perioodiliselt kõiki commite läbi vaid ainult uued).
Github repo commitide listi saab mugavalt vaadata https://github.com/mbakhoff/jdbc-template/commits/master.atom urli kaudu (asenda mbakhoff/jdbc-template oma repoga). Fail sisaldab ka commit id'si, mille kaudu saab githubist vastavate commitide sisu leida, nt https://github.com/mbakhoff/jdbc-template/commit/631c5d0c0b8ae8c00c206bc15fb8a97c86f35eb7
DNS client
Internetis surfates kirjutame tavaliselt URL riba peale serveri nime, nt google.com. Reaalse ühenduse loomiseks tuleb serveri nimi tõlkida serveri IP aadressiks. Selle jaoks kasutataks DNS (domain name system) protokolli.
Kirjuta programm, mis võtab käsurea parameetriks serveri nime, ühendub DNS serveriga ja uurib välja serveri IP aadressi. Vaja on koostada ja saata DNS query ning vastu võtta ja parseda vastus. Olemasolevaid DNS librarysi kasutada ei tohi.
Vihjed:
- DNS protokoll on kirjeldatud siin https://www.ietf.org/rfc/rfc1035.txt
- Vaja on küsida ja näidata ainult QTYPE A, QCLASS IN andmeid (tavalised IPv4 aadressid). Igasugust lisainfot võib ignoreerida.
- DNS päringud on ajalooliselt käinud läbi UDP socketite, aga praksis oleme kasutanud ainult TCP socketeid. DNS päringuid saab teha ka läbi TCP socketite - vaata lisaks RFC1035 4.2.2.
- Katsetamiseks võib kasutada google avalikku DNS serverit 8.8.8.8:53
Cron
Igas viisakas linuxi masinas jookseb taustaprotsess cron, mille ülesanne on etteantud graafiku alusel programme käima panna (nt perioodiliselt vanade logifailide ära kustutamine, uuenduste kontrollimine jms). Graafiku määramiseks kasutatakse lihtsat tekstifaili, kus iga rea peal on üks käsk ja info, millal seda käivitama peaks.
Kirjuta lihtsustatud cron programm, mis loeb sisse käsurea parameetriga antud tekstifaili ja käivitab ettenähtud aegadel õiged programmid. Programm peab oskama lugeda ainult kõige lihtsamaid ajagraafiku reegleid (ainult numbritest ja tärnidest koosnevaid).
Vaata cron juhendit https://help.ubuntu.com/community/CronHowto#Crontab_Lines
MiniMaven
Kirjuta maveni sarnane programm, mis oskab java koodi kompileerida ja projekti jar failiks pakkida. Nõuded:
- kompilaator leitakse JAVA_HOME environment variable kaudu
- programm ei pea ise dependency jar-e downloadima, aga kasutaja poolt lib kausta paigutatud jar failid peab lisama kompileerimise classpathi
- kõik src/main/java all olevad
.java
failid kompileeritakse target/classes kausta (kood võib olla organiseeritud erinevate package sisse) - kogu src/main/resources sisu kopeeritakse target/classes kausta (võib sisaldada alamkatalooge)
- target/classes sisu (kompileeritud kood ja resources) pakitakse korrektse struktuuriga jar failiks, mis paigutatakse target kausta
- programm ei tohi kasutada
java.io.File
(kasutajava.nio.file.Files
)
NIO fileserver (raske)
Kirjuta echo serveri sarnane programm. Server võtab käsurea argumendina directory nime, kust ta hakkab klientidele faile otsima. Client saadab soovitava faili nime (relative path, nt andmed.txt
või images/kitten.png
) ja server vastab faili sisuga. Client kirjutab vastu võetud faili kettale. Kui faili ei leita, siis server peab server sellest viisakalt teada andma. Seejärel ühendus suletakse.
Täpsustused:
- Client ja server võivad omavahel peale failinimede ja sisude vahetada ka täiendavat lisainfot (nt failinime pikkus / faili suurus).
- Server peab suutma kõiki kliente paralleelselt teenindada.
- Server tohib kasutada ainult ühte threadi (main). Ülesande lahendamiseks peab serveris võrguühenduste jaoks kasutama
java.nio.channels.Selector
ja non-blocking I/O.
Non-blocking I/O lühidalt. Socket asemel kasutatakse SocketChannel klassi. Andmete vastuvõtmisel ei loeta kõike korraga while loopiga sisse, sest andmed ei jõua tavaliselt kõik korraga üle võrgu kohale. Selle asemel loetakse sisse ainult antud hetkeks kohale jõudnud andmed. Seejärel tegeletakse teiste ühendustega, kuni rohkem andmeid üle võrgu kohale jõuab. Kuna andmeid lugev thread ei jää kunagi andmete üle võrgu kohale jõudmist ootama, saab ta kordamööda kõigi channelitega tegeleda.
NB! Client võib kasutada tavalist Socketit ja blocking I/O'd.