Meeskond "Offline"

From ICO wiki
Jump to navigationJump to search

Meeskond

  • Kristjan Roosild
  • Ragnar Rattas
  • Holger Rünkaru

XML

Luua XML fail andmete edastamiseks, selle XML faili skeemifail ning paar kolm sobivat XSL faili loodud XML failis olevate andmete transformeerimiseks HTML formaati ja XML faili formaadi muutmiseks. XML-il peab olema vähemalt 4 loogilist dimensiooni. Lisaks tuleb kasutada 3-el dimensioonil attribuute, mis on enamat, kui lihtsalt ID.

XML

XML fail sisaldab andmeid Eesti haldus- ja asustusüksuste (EHAK) kohta. Andmed saadi siit. Statistikaametil on küll juba olemas EHAKi xml, kuid see ei ole just kõige paremini loetav, sellepärast proovisimegi ise parema teha.

Link codeplexis olevale xml-ile (see on liiga suur siia panekuks).

XML schema (XSD)

<?xml version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="ehak">
    <xs:complexType>
      <xs:sequence >
        <!-- maakodi võib olla maksimaalselt 90 kuna maakonna kood peab olema unikaalne ja alati kahekohaline integer-->
        <xs:element maxOccurs="90" name="maakond">
          <!-- keelame ära maakonna mixed contenti, sest kõik info on atribuutides ja elemendil endal puudub väärtus -->
          <xs:complexType mixed="false">
            <xs:sequence>
              <xs:element maxOccurs="unbounded" name="omavalitsus">
                <!-- keelame ära omavalitsuse mixed contenti, sest kõik info on atribuutides ja elemendil endal puudub väärtus -->
                <xs:complexType mixed="false">
                  <xs:sequence >
                    <xs:element maxOccurs="unbounded" name="asustusüksus">
                      <!-- keelame ära asustusüksuse mixed contenti, sest kõik info on atribuutides ja elemendil endal puudub väärtus -->
                      <xs:complexType mixed="false">
                        <xs:attribute name="nimi" type="xs:string" use="required" />
                        <!-- alati neljakohaline positiivne integer - seda peaks kuidagi saama pareimini ära määrata/piirata...-->
                        <xs:attribute name="kood" type="xs:unsignedShort" use="required"></xs:attribute>
                        <!-- alati ühekohaline positiivne integer - seda peaks kuidagi saama pareimini ära määrata/piirata...-->
                        <xs:attribute name="tüüp" type="xs:unsignedByte" use="required" />
                        <xs:attribute name="tüübinimi" type="xs:string" use="required" />
                        <!-- osadel küladel, kus on suur hulk sisserännanuid (Noarootsi) on kasutusel ka võõrkeelne nimi -->
                        <xs:attribute name="rööpnimi" type="xs:string" use="optional" />
                      </xs:complexType>
                    </xs:element>
                  </xs:sequence>
                  <xs:attribute name="nimi" type="xs:string" use="required" />
                  <!-- alati kolmekohaline positiivne integer - seda peaks kuidagi saama pareimini ära määrata/piirata...-->
                  <xs:attribute name="kood" type="xs:unsignedShort" use="required" />
                  <xs:attribute name="tüübinimi" type="xs:string" use="required" />
                </xs:complexType>
                <xs:unique name="UnikaalneAsustusüksuseKood">
                  <xs:selector xpath="asustusüksus" />
                  <xs:field xpath="@kood" />
                </xs:unique>
              </xs:element>
            </xs:sequence>
            <xs:attribute name="nimi" type="xs:string" use="required"/>
            <!-- alati kahekohaline positiivne integer - seda peaks kuidagi saama pareimini ära määrata/piirata...-->
            <xs:attribute name="kood" type="xs:unsignedByte" use="required" />
          </xs:complexType>
          <xs:unique name="UnikaalneOmavalitsuseKood">
            <xs:selector xpath="omavalitsus" />
            <xs:field xpath="@kood" />
          </xs:unique>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
    <xs:unique name="UnikaalneMaakonnaKood">
      <xs:selector xpath="maakond" />
      <xs:field xpath="@kood" />
    </xs:unique>
  </xs:element>
</xs:schema>


XSLT (esimene)

Esimene xslt fail kuvab xml sisu html-is. Iga maakonna all kuvatakse omavalitsused eraldi valdade ja linnade kaupa. Valdade all kuvatakse asustusüksused sorteerituna külade, alevike ja alevite kaupa. Kui külal leidub rööpnimi, kuvatakse ka see. XSLT output on siin ja source on siin:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"
>
  <xsl:output method="html" indent="yes"/>
  <xsl:template match="/">
    <html>
      <head>
        <title>Superkena haldus- ja asustusüksuste kuvamise leht!</title>
      </head>
      <body>
        <h2>
          Maakonnad, omavalitsused ja asustusüksused
        </h2>
        <table border="0">
          <xsl:for-each select="/ehak/maakond">
            <tr valign="top">
              <th>
                <br/>
                <h2>
                  <xsl:value-of select="@nimi"/>
                </h2>
              </th>
            </tr>
            <tr valign="top">
              <th>
                <br/>
                <i>
                  <b>
                    <font size="5">Vallad</font>
                  </b>
                </i>
              </th>
            </tr>
            <!-- omavalitsuste puhul on kaks tsüklit - esimene kuvab vallad ja teine linnad-->
            <xsl:for-each select="omavalitsus">
              <xsl:if test="@tüübinimi='vald'">
                <tr valign="top">
                  <th>
                    <br/>
                    <xsl:value-of select="@nimi"/>
                    <xsl:text> </xsl:text>
                    <xsl:value-of select="@tüübinimi"/>
                  </th>
                </tr>
                <tr valign="top">
                  <th>
                    <i>Külad, alevikud, alevid</i>
                  </th>
                </tr>
                <!-- asustusüksuste kuvamiseks on kolm tsüklit, sest need kuvatakse sorteeritult
                 - esmalt külad, siis alevikud ja lõpuks alevid -->
                <xsl:for-each select="asustusüksus">
                  <xsl:if test="@tüübinimi='küla'">
                    <tr valign="top">
                      <td>
                        <!-- kirjutame nime koos tüübinimega-->
                        <xsl:value-of select="@nimi"/>
                        <xsl:text> </xsl:text>
                        <xsl:value-of select="@tüübinimi"/>
                        <!-- kui leidub rööpnimesid, siis pane need nime järgi, sulgudesse-->
                        <xsl:if test="@rööpnimi">
                          <xsl:text> (</xsl:text>
                          <xsl:value-of select="@rööpnimi"/>
                          <xsl:text>)</xsl:text>
                        </xsl:if>
                      </td>
                    </tr>
                  </xsl:if>
                </xsl:for-each>
                <xsl:for-each select="asustusüksus">
                  <xsl:if test="@tüübinimi='alevik'">
                    <tr valign="top">
                      <td>
                        <!-- kirjutame nime koos tüübinimega-->
                        <xsl:value-of select="@nimi"/>
                        <xsl:text> </xsl:text>
                        <u>
                          <xsl:value-of select="@tüübinimi"/>
                        </u>
                        <!-- kui leidub rööpnimesid, siis pane need nime järgi, sulgudesse-->
                        <xsl:if test="@rööpnimi">
                          <xsl:text> (</xsl:text>
                          <xsl:value-of select="@rööpnimi"/>
                          <xsl:text>)</xsl:text>
                        </xsl:if>
                      </td>
                    </tr>
                  </xsl:if>
                </xsl:for-each>
                <xsl:for-each select="asustusüksus">
                  <xsl:if test="@tüübinimi='alev'">
                    <tr valign="top">
                      <td>
                        <!-- kirjutame nime koos tüübinimega-->
                        <xsl:value-of select="@nimi"/>
                        <xsl:text> </xsl:text>
                        <u>
                          <xsl:value-of select="@tüübinimi"/>
                        </u>
                        <!-- kui leidub rööpnimesid, siis pane need nime järgi, sulgudesse-->
                        <xsl:if test="@rööpnimi">
                          <xsl:text> (</xsl:text>
                          <xsl:value-of select="@rööpnimi"/>
                          <xsl:text>)</xsl:text>
                        </xsl:if>
                      </td>
                    </tr>
                  </xsl:if>
                </xsl:for-each>
              </xsl:if>
            </xsl:for-each>
            <tr valign="top">
              <th>
                <br/>
                <i>
                  <b>
                    <font size="5">Linnad</font>
                  </b>
                </i>
              </th>
            </tr>
            <xsl:for-each select="omavalitsus">
              <xsl:if test="@tüübinimi='linn'">
                <tr valign="top">
                  <th>
                    <br/>
                    <xsl:value-of select="@nimi"/>
                  </th>
                </tr>
                <tr valign="top">
                  <th>
                    <i>Linnaosad</i>
                  </th>
                </tr>
                <!-- kuna linnas saavad ainsaks asustusüksuseks olla linnaosad, 
                siis on ainult üks tsükkel ja tüübinime ei kontrollita-->
                <xsl:for-each select="asustusüksus">
                  <tr valign="top">
                    <td>
                      <xsl:value-of select="@nimi"/>
                      <xsl:text> </xsl:text>
                      <xsl:value-of select="@tüübinimi"/>
                    </td>
                  </tr>
                </xsl:for-each>
              </xsl:if>
            </xsl:for-each>
          </xsl:for-each>
        </table>
      </body>
    </html>
  </xsl:template>
</xsl:stylesheet>

XSLT (teine)

<?xml version="1.0" encoding="utf-8"?>
<!-- Aluseks on võetud Kristjani xslt fail.
Kaotatakse ära kogu fondindus ning lisatakse ID', elementide tüübi info jms.
-->
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">
  <xsl:output method="html" indent="yes"/>
  <xsl:template match="/">
    <html>
      <head>
        <title>Haldus- ja asustusüksuste detailinfo</title>
      </head>
      <body>
        <table border="0">
          <xsl:for-each select="/ehak/maakond">
            <tr>
              <th>
                  <xsl:value-of select="@nimi"/>
                  <xsl:text> (kood=</xsl:text><xsl:value-of select="@kood"/>
                  <xsl:text>)</xsl:text>
              </th>
            </tr>
            <xsl:for-each select="omavalitsus">
              <xsl:if test="@tüübinimi='vald'">
                <tr>
                  <th>
                    <xsl:value-of select="@nimi"/>
                    <xsl:text> (kood=</xsl:text>
                    <xsl:value-of select="@kood"/><xsl:text> tyyp=</xsl:text><xsl:value-of select="@tüübinimi"/><xsl:text>)</xsl:text>
                  </th>
                </tr>
                <!-- asustusüksuste kuvamiseks on kolm tsüklit, sest need kuvatakse sorteeritult
                 - esmalt külad, siis alevikud ja lõpuks alevid -->
                <xsl:for-each select="asustusüksus">
                  <xsl:if test="@tüübinimi='küla'">
                    <tr>
                      <td>
                        <!-- kirjutame nime koos tüübinimega-->
                        <xsl:value-of select="@nimi"/>
                        <xsl:text> (kood=</xsl:text>
                        <xsl:value-of select="@kood"/>
                        <xsl:text> tyyp=</xsl:text>
                        <xsl:value-of select="@tüübinimi"/>
                        <xsl:if test="@rööpnimi">
                          <xsl:text> rööpnimi=</xsl:text>
                          <xsl:value-of select="@rööpnimi"/>
                        </xsl:if>
                      <xsl:text>)</xsl:text>
                      </td>
                    </tr>
                  </xsl:if>
                </xsl:for-each>
                <xsl:for-each select="asustusüksus">
                  <xsl:if test="@tüübinimi='alevik'">
                    <tr>
                      <td>
                        <!-- kirjutame nime koos tüübinimega-->
                        <xsl:value-of select="@nimi"/>
                        <xsl:text> (kood=</xsl:text>
                        <xsl:value-of select="@kood"/>
                        <xsl:text> tyyp=</xsl:text>
                        <xsl:value-of select="@tüübinimi"/>
                        <xsl:if test="@rööpnimi">
                          <xsl:text> rööpnimi=</xsl:text>
                          <xsl:value-of select="@rööpnimi"/>
                        </xsl:if>
                      <xsl:text>)</xsl:text>
                      </td>
                    </tr>
                  </xsl:if>
                </xsl:for-each>
                <xsl:for-each select="asustusüksus">
                  <xsl:if test="@tüübinimi='alev'">
                    <tr>
                      <td>
                        <!-- kirjutame nime koos tüübinimega-->
                        <xsl:value-of select="@nimi"/>
                        <xsl:text> (kood=</xsl:text>
                        <xsl:value-of select="@kood"/>
                        <xsl:text> tyyp=</xsl:text>
                        <xsl:value-of select="@tüübinimi"/>
                        <xsl:if test="@rööpnimi">
                          <xsl:text> rööpnimi=</xsl:text>
                          <xsl:value-of select="@rööpnimi"/>
                        </xsl:if>
                      <xsl:text>)</xsl:text>
                      </td>
                    </tr>
                  </xsl:if>
                </xsl:for-each>
              </xsl:if>
            </xsl:for-each>
            <xsl:for-each select="omavalitsus">
              <xsl:if test="@tüübinimi='linn'">
                <tr valign="top">
                  <th>
                    <xsl:value-of select="@nimi"/>
                    <xsl:text> (kood=</xsl:text>
                	<xsl:value-of select="@kood"/>
                    <xsl:text>)</xsl:text>
                  </th>
                </tr>
                <!-- kuna linnas saavad ainsaks asustusüksuseks olla linnaosad, 
                siis on ainult üks tsükkel ja tüübinime ei kontrollita-->
                <xsl:for-each select="asustusüksus">
                  <tr valign="top">
                    <td>
                      <xsl:value-of select="@nimi"/>
                        <xsl:text> (kood=</xsl:text>
                        <xsl:value-of select="@kood"/>
                        <xsl:text> tyyp=</xsl:text>
                        <xsl:value-of select="@tüübinimi"/>
                        <xsl:text>)</xsl:text>
                    </td>
                  </tr>
                </xsl:for-each>
              </xsl:if>
            </xsl:for-each>
          </xsl:for-each>
        </table>
      </body>
    </html>
  </xsl:template>
</xsl:stylesheet>

XSLT (kolmas)

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"
>
  <xsl:output method="html" indent="yes"/>
  <xsl:template match="/">
    <html>
      <head>
        <title>Rööpnimedega asustusüksuste loetelu</title>
      </head>
      <body>
       <h3>
          Rööpnimedega asustusüksuste nimekiri koos tüübiga
       </h3>
        
        <table border="1">
          <tr>
            <th>
              <td>
                <h4>Asustusüksuse nimi</h4>
              </td>
              <td>
                <h4>Asustusüksuse rööpnimi</h4>
              </td>
              <td>
                <h4>Asustusüksuse tüüp</h4>
              </td>
            </th>
          </tr>
          <!-- Valin kõik asustusüksused, millel esineb parameeter "rööpnimi"-->
          <xsl:for-each select="/ehak/maakond/omavalitsus/asustusüksus">
            <xsl:if test="@rööpnimi">
            <tr valign="top">
              <th>
               <!-- Lisan tabelisse soovitud informatsiooni kolmest parameetrist --> 
                <td>
                  <xsl:value-of select="@nimi"/>
                </td>
                <td>
                  <xsl:value-of select="@rööpnimi"/>
                </td>
                <td>
                  <xsl:value-of select="@tüübinimi"/>
                </td>
              </th>
            </tr>
            </xsl:if>
          </xsl:for-each>
        </table>
      </body>
    </html>
  </xsl:template>
</xsl:stylesheet>

Veebiteenus

Analüüs

1. Esimese asjana turvalisuse pool üritada wiki ja screencasti (https://wiki.itcollege.ee/index.php/Praktikum:_Windows_Communication_Foundation_teenuse_turvamine,_VR2.9) abiga üles ehitada

2. Koostada rakenduse loogika kiht, mis iga tunni aja tagant salvestab andmed EMHI xml-ist (http://www.emhi.ee/ilma_andmed/xml/observations.php) andmebaasi.

3. Teenus pakub andmebaasi salvestatud andmete pärimiseks järgnevaid meetodeid:

       // Tagastab viimase 24 tunni mõõtmiste tulemused. List koosneb 24 Observation elemendist. 
        //Igas Observation elemendis on iga jaama kohta üks StationObservation.
       public List<Observation> GetLast24Observations()


       // Annab antud Stationi ID viimased etteantud arvu sissekandeid (vaikimisi 24)
       public List<StationObservation> GetStationObservations(int stationID, int count = 24)


       // Tagastab hetkel kõige soojema ilmaga Stationi
       public Station GetWarmest()


       // Tagastab kõik Stationid (see tähendab, et sisuliselt saab kätte kogu informatsiooni, mida algsest XML-ist lugeda saab)
       public List<Station> GetStations()


       // Tagastab Stationid, kus on hetkel antud temperatuurist madalam temperatuur
       public List<Station> GetStationsWhereLower(double temp)


       // Tagastab Stationid, kus on hetkel antud temperatuurist kõrgem temperatuur
       public List<Station> GetStationsWhereHigherOrEqual(double temp)


       // Tagastab arvu, kui suur on sademete hulk antud algus kuupäevast (k.a.) antud lõpukuupäevani (k.a) antud jaamas
       public double GetPercipitationsSum(DateTime begin, DateTime end, String stationName)

Teostus

Teenuse source code asub aadressil https://ehak.codeplex.com/SourceControl/list/changesets#

Klientrakendus

Klientrakendus on codeplexis. Siin on selle toimimise video: http://youtu.be/X3JxYDn6958

Retsensioonid

Vennaskonna XML'i retsensioon

Kuivõrd XML kodutöö oli oma olemuselt üpris lihtne ja mitte väga mahukas, siis retsenseerimisel on seatud nõudeid arvestatud piinliku täpsusega.

Nõuete täitmise osas jäi esimese asjana silma vähemalt kolme ID-st erineva atribuudi nõude mittetäitmine. Kui vaadata nende XML faili, siis tõepoolest on kasutatud kolme erinevat atribuuti, kuid ID-st erinevad on ainult aasta ja koht. Seega formaalselt pole nõue täidetud.

Teine puudus on seotud dokumentatsiooniga. Kuigi kõik loodud failid on oma olemuselt suhteliselt lihtsad, loogilise struktuuriga ning räägivad paljuski iseenda eest ise, siis ei leidu neist mitte ühtegi kommentaari. Ei maksa arvata, et praktikas need kommentaarid koodi kuidagi veel rohkem arusaadavamaks teeksid, kuid kodutöö nõuetes oli sellekohane punkt olemas ning seda ei ole täidetud.

Töö sisulise poole pealt võib suurimaks puuduseks nimetada liiga “lõtva” skeemifaili. Näiteks etappide algus ja lõpukuupäevad on defineeritud string tüüpi elementidena ning ei ole määratud täiendavaid piiranguid ega nõudeid selle kohta kuidas see kuupäeva ikkagi kirjutatud peaks olema. Kuupäevade osas oleks üldse mõistlikum kasutada date andmetüüpi.

Sarnane probleem on ka elemendil riigikood. Defineeritud on ta jällegi lihtsalt stringina ning ei ole seatud ühtegi piirangut tema pikkusele. Kuna riigikoodide esitamisel on levinud kaks standardit, nii kahe kui ka kolme täheline esitlus, siis ei ole üheselt arusaadav, mida sinna ikkagi kirjutama peaks. Kusjuures XML andmefailis on kasutatud mõlemat varianti, näiteks FIN ja NL.

Viimase asjana tasub veel mainimist täpitähtede, täpsemalt õ tähe kasutamine “Võistlussari” elemendis. Kuigi see ei ole otseselt viga, siis praktikas võib ta ikkagi probleeme põhjustada.

Log

3. mai 2012 - neljapäev

Kristjan ja Holger arutasid skypes XML teemal, Kristjan pakkus õppejõule välja variandi teha XML EHAKist, tegi codeplexi konto ja lisas sinna ka Holgeri kasutaja ja tegi xml faili.

4. mai 2012 - reede

Kristjan tegi xsd faili ja ühe xslt faili ning lisas Ragnari kasutaja codeplexi. Lepiti kokku, et ülejäänud kaks xslt-d ja retsensioonid teise grupi xml faili kohta teevad Ragnar ja Holger.

5. mai 2012 - laupäev

Kristjan lõi meeskonna wiki lehe ja tõstis sinna seni tehtud materjalid

6. mai 2012 - pühapäev

Holger lisas enda XSLT koodi wikisse - järjenumbriga 3.

7. mai 2012 - esmaspäev

Kristjan lisas Ragnari XSLT koodi wikisse - järjenumbriga 2.

14. mai 2012 - esmaspäev

Ragnar lisas retsensiooni.

18. mai 2012 - reede

Kristjan koostas õppejõu abiga veebiteenuse esialgse analüüsi

23.mai.2012 - kolmapäev

Kristjan seadistas WCF turvalisuse ja lisas teenuse analüüsis kirjeldatud meetodid. https://ehak.codeplex.com/SourceControl/changeset/view/17294 (vt WeatherServiceLibrary)

29.mai.2012 - teisipäev

Kristjan pani andmed andmebaasi käsitsi (Exceli ja SQL lausete abiga) ning koostas analüüsis kirjeldatud meetodid.

31.mai.2012 - neljapäev

Kristjanil valmis teenus ja klient - valmis õppejõule näitamiseks.