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: 10 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 või SaxParser), 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)
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.
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.
- 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)
- 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.
Slack integration
Variant 1
Kirjuta slacki bot, mis jälgib edasijõudnute rühma koduste ülesannete lehekülge ja kui see muutub (mingi sisuline muudatus, mitte lihtsalt timestamp uueneb vms), siis saadab #r9 channelisse teavituse.
Variant 2
Kirjuta slacki bot, mis jälgib sinu rühmatöö git repositoryt. Kui keegi commitib koodi, kus on "catch (NullPointerException e)" või ".close();", siis postita oma rühma channelisse kuri kiri.
Vihjed:
- Slack API https://api.slack.com/community (võid kasutada oma lemmik libraryt)
- Github repo commitide list (xml) https://github.com/mbakhoff/jdbc-template/commits/master.atom (asenda mbakhoff/jdbc-template oma repoga).
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 toetama tavalist cron syntaxi, välja arvatud special strings syntaxi (nt @reboot).
Kasutada võiks mõistlikke vahendeid, nt ScheduledExecutorService. Programm peab töötama mõistlikult efektiivselt, st ei jookse busy loopis ega kontrolli iga sekundi tagant, kas midagi on vaja teha.
Vaata cron juhendit https://help.ubuntu.com/community/CronHowto
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
) - programm peab töötama linux op-süsteemiga