Nipitiri
Nipitiri
Meeskonna liikmed
- Kristjan Pihus
- Hanno Sirkel
- Rait Ots
- Ago Kütt
- Merje Kungla
Projekti esimene osa: XML
Idee
Luua 4-tasemeline XML definitsioon, näidis sellele ning transleerimised HTML ja XML formaati.
XML
XML fail
<?xml version="1.0" encoding="UTF-8"?>
<tns:autod xmlns:tns="http://www.example.org/autod" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.example.org/autod autod.xsd ">
<tns:auto id="0" mark="Ford" mudel="Sierra">
<tns:mootor>
<tns:kytus>bensiin</tns:kytus>
<tns:kubatuur yhik="ccm">2000</tns:kubatuur>
</tns:mootor>
<tns:kere v2rv="punane"/>
</tns:auto>
<tns:auto id="1" mark="ZAZ" mudel="969">
<tns:mootor>
<tns:kytus>diisel</tns:kytus>
<tns:kubatuur yhik="ccm">2500</tns:kubatuur>
</tns:mootor>
<tns:kere v2rv="roheline"/>
</tns:auto>
<tns:auto id="2" mark="Saab" mudel="9-5">
<tns:mootor>
<tns:kytus>bensiin</tns:kytus>
<tns:kubatuur yhik="ccm">1500</tns:kubatuur>
</tns:mootor>
<tns:kere v2rv="sinine"/>
</tns:auto>
<tns:auto id="3" mark="Volvo" mudel="960">
<tns:mootor>
<tns:kytus>elekter</tns:kytus>
</tns:mootor>
<tns:kere v2rv="sinine"/>
</tns:auto>
<tns:auto id="4" mark="Volvo" mudel="V40">
<tns:mootor>
<tns:kytus>diisel</tns:kytus>
<tns:kubatuur yhik="ccm">2400</tns:kubatuur>
</tns:mootor>
<tns:kere v2rv="must"/>
</tns:auto>
<tns:auto id="5" mark="Volvo" mudel="V70">
<tns:mootor>
<tns:kytus>gaas</tns:kytus>
<tns:kubatuur yhik="ccm">2000</tns:kubatuur>
</tns:mootor>
<tns:kere v2rv="valge"/>
</tns:auto>
</tns:autod>
XSD fail
<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.example.org/autod"
xmlns:tns="http://www.example.org/autod"
elementFormDefault="qualified">
<simpleType name="kytusSimpleType">
<restriction base="string">
<enumeration value="bensiin"></enumeration>
<enumeration value="diisel"></enumeration>
<enumeration value="elekter"></enumeration>
</restriction>
</simpleType>
<complexType name="mootorComplexType">
<sequence>
<element name="kytus" type="tns:kytusSimpleType"
maxOccurs="1" minOccurs="0">
</element>
<element name="kubatuur" maxOccurs="1" minOccurs="0">
<complexType>
<simpleContent>
<extension base="int">
<attribute name="yhik" use="required">
<simpleType>
<restriction base="string">
<enumeration value="ccm"/>
<enumeration value="l"/>
</restriction>
</simpleType>
</attribute>
</extension>
</simpleContent>
</complexType>
</element>
</sequence>
</complexType>
<complexType name="autoComplexType">
<sequence>
<element name="mootor" type="tns:mootorComplexType"></element>
<element name="kere" type="tns:kereComplexType"
maxOccurs="1" minOccurs="1">
</element>
</sequence>
<attribute name="id" type="int"></attribute>
<attribute name="mark" type="string"></attribute>
<attribute name="mudel" type="string"></attribute>
</complexType>
<simpleType name="v2rvSimpleType">
<restriction base="string">
<enumeration value="punane"></enumeration>
<enumeration value="roheline"></enumeration>
<enumeration value="sinine"></enumeration>
</restriction>
</simpleType>
<complexType name="kereComplexType">
<attribute name="v2rv" type="tns:v2rvSimpleType"></attribute>
</complexType>
<element name="autod" type="tns:AutodListComplexType"></element>
<complexType name="AutodListComplexType">
<sequence>
<element name="auto" type="tns:autoComplexType" maxOccurs="unbounded" minOccurs="0"></element>
</sequence>
</complexType>
</schema>
XSLT failid
XML -> HTML
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:tns="http://www.example.org/autod">
<xsl:output encoding="UTF-8" method="html" />
<xsl:template match="/">
<html>
<body>
<h2>Autode nimekiri</h2>
<table border="1">
<tr><td>Mark</td><td>Mudel</td><td>Värv</td><td>Mootor</td></tr>
<xsl:for-each select="tns:autod/tns:auto">
<tr>
<td><xsl:value-of select="@mark"/></td>
<td><xsl:value-of select="@mudel"/></td>
<td><xsl:value-of select="tns:kere/@v2rv"/></td>
<td><xsl:value-of select="tns:mootor/tns:kytus"/> <xsl:text> </xsl:text> <xsl:value-of select="tns:mootor/tns:kubatuur"/><xsl:value-of select="tns:mootor/tns:kubatuur/@yhik"/></td>
</tr>
<p> </p>
</xsl:for-each>
</table>
</body>
</html>
</xsl:template>
</xsl:stylesheet>
XML -> XML
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:tns="http://www.example.org/autod">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/">
<tns:autod>
<xsl:for-each select="tns:autod/tns:auto">
<xsl:if test="@mark='Volvo'">
<auto>
<mark>
<xsl:value-of select="@mark"/>
</mark>
<mudel>
<xsl:value-of select="@mudel"/>
</mudel>
</auto>
</xsl:if>
</xsl:for-each>
</tns:autod>
</xsl:template>
</xsl:stylesheet>
Projekti teine osa: veebiteenus ja klientrakendus
Analüüs
Projekti tulemina luuakse keeleõppe keskkond milles õppijal on võimalik testida ning selle käigus laiendada oma sõnavara õpitavas võõrkeeles. Veebirakendus realiseeritakse JavaScripti abil (AngularJS raamistikku kasutades) ning veebiteenus MVC Web API tehnoloogial.
Andmemudel koosneb kolmest olemist (sõnad, õppetükkid, skoor), lisaks hoitakse andmebaasis logi kasutaja tehtud tegevuste kohta ning kasutajate autentimisega seotud olemid (Web API Security). Igal olemil on olemas primaarvõti ID näol. Andmemudel on graafiliselt kujutatud joonisel.
Olemite kirjeldused: Lesson - siia salvestatakse õppetüki nimi Word - Sõnad ning nende vasted siht- ja lähtekeeles, seotud Lesson olemiga Score - Rakenduse kasutaja poolt sõna arvamise tulemus, seotud Word olemiga
Andmemudel:
Esialgne API kirjeldus:
Kasutaja vaate kirjeldus:
Rakenduse kasutajale kuvatakse sisselogimisvaade. Peale sisselogimist saab kasutaja valida õppetüki, mille järel rakendus pakub arvamiseks sõna sellest peatükist veel mittäraarvatud sõnade hulgast. API kontrollib vastuse ning salvestab tulemuse skooritabelisse. API's on ka päringud kasutaja õppetükkide hetkeseisu kohta. API tagastab õppetüki kohta äraarvatud sõnade arvu ning sõnade koguarvu. Kui see on võrdne, kuvatakse vastavat õppetükki kasutaja vaates rohelisena ning vastava õppetüki valik mitteaktiivsena.
Klientrakendus
Klientrakendus on realiseeritud JavaScriptis, lähtekood asub siin: [1]
Veebiteenus
Veebiteenus on realiseeritud ASP.NET MVC Web API vahenditega. Lähtekood asub siin: [2]
Retsensioon meeskonna XYZ xml rakendusele
XML töö raames on loodud nõutud osad: XML fail, neli skeemifaili, ning XSLT transformatsioonifail. XML töös on kirjeldatud reisipakkumiste infot, ning XSLTs koondatakse reisipakkumised tabeli kujule ning kuvatakse reisipakkumiste hinnad. XML andmefailis on kirjeldatud neli dimensiooni, nii nagu lähteülesandes nõutud. Sellest johtuvalt võib lugeda töö igati püstitatud tingimustele vastavaks. Arvestades tõsiasja, et projeki meeskond koosnes ühest isikust, on tööga äraütlemata hästi toime tuldud. XML faili tagide nimedes on kasutataud eesti keeleruumile omaseid täpitähti, mis on ASCII kooditabeli laiendatud osas. See teguviis ei ole otseselt keelatud. Seda enam et xml fail on määratud kasutama utf-8 kodeeringut, mis saab hakkama kõigi tähemärkidega. Siiski võiks võimalusel laientatud ascii kooditabeli osasse jäävaid tähemärke vältida, kuna osade xml faili parseritega võib tekkida probleeme nimetatud tähti sisaldavate tagide parsimisel. Mis XML faili sisulisse poolde puutub, siis eraldi on välja toodud valuutakursid, aga ei ole kuskilt näha milline on baas valuuta, ehk mis valuua suhtes need kursid on määratud. Niisamuti ei ole määratud millised valuutas on sätestatud reisi hind. Jääb üle vaid loota et baas valuuta, ehk ka reisis spetsifitseeritud hinna valuutaks on meil kehtiv euro. Kuigi töös võib leida välja toodud pisikesi puudusi on siiski meeskond oma tööga edukalt hakkama saanud, ning selles osas võib pingutuse lugeda arvestatuks.
Retsensioon meeskonna BACKBONE rakendusele
Meeskond BACKBONE on võtnud eemärgiks ehitada tööülesannete haldamse rakendus, ehk TODO List rakendus. Võetud ülesanne on omamoodi ambitsioonikas, kuna sedalaadseid rakendusi on loodud aegade juuksul mitmeid, ning seetõttu midagi paremini teha on äärmiselt keerukas. Kuid mitte võimatu. Peab mainima, et tehtud töö on äärmiselt põhjalik. Rakenduse eesmäriks on seatud kuvada tööülesandeid kategooriate, prioriteetide ja asukohtade järgi. Rakenduse toimimiseks vajalike andmeid hoitakse andmebaasis kokku üheksas olemis, ehk tabelis, mis on antud rakenduse spetsiifikat arvestades enam kui küll. Salvestatud andmed presenteeritakse ASP.NET MVC API tehnoloogia abil kasutajale. Klientrakendus on implementeeritud ilusti dünaamiliselt, mis võimaldab sisuliselt reaal ajas saada ülevaadet tööülesande tähtaja kättejõudmisest. Veebiteenise API spetsifikaatsioon on siiski koostaud liiga üldsõnaliselt. See kahjuks ei võimalda kolmandatel osapooltel probleemideta liidestada oma loodud rakendusi meeskonna poolt koostatud veebiteenusega. Liidestuse teostamiseks on vajalik roheksti lisa informatsiooni. Näiteks ei ole välja toodud millist tüüpi päringut peaks kasutama. Samuti ei ole teada milliseid sisendparameetreid API käsk ootab, ning millisel kujul väljund informatsioon tagasi kliendile saadetakse. Selliselt piiratud informatsiooni baasilt kolmanda osapoole liidestust teha on töömahukas, kuna see eeldab olemasoleva näidis rakenduse üksipulgi läbitöötamist. Samsa olemasolev programmikood on avalikustatud, seega selline tagurpidi analüüs on igati võimalik. Programmi lähtekood on samas ilusti liidestatud alam programmideks, ning koodeerimise stiil on hea. Liigselt on küll programmi koodi jäänud arenduse aegseid kommentaare, mis hetkel ainult segavad programmi analüüsi, kuid programmi reallses töös see mõju ei avalda. Veebiteenust kasuvav rakendus on ehitatud lähtudes MVC ehk mudel, vaade, kontroller raamistiku põhimõtetest, mis on tähapäevast veebirakendust ehitades igati apsepteeritav lähenemine. Vaadete ülesehitamiseks on kasutatud Bootstrap raamistiku koos jQuery javascript raamistikuga. Sellest johtuvalt jääb pisut segaseks, miks ei ole veebiklienti ehitatud täiesti sõltumatult kasutates nimetatud vahendeid. Aga üldkokkuvõttes on tööga hästi toime tuldud, ning soovitud tulem saavutatud.