Meeskond Pakiraam

From ICO wiki

Meeskond

  • Kristo Naeris
  • Indro Kottise

Analüüs

Idee

Luua blogiportaal, kus kasutajad saavad blogi poste teha, neid kommenteerida ja märkida meeldivaks ja jälgida.

Kasutajad

  • Kasutaja
  • Külaline

Must have

  • Logib kõik kasutajad ja nende tegevused

Tavakasutaja

  • Blogi otsimine pealkirja alusel
  • Teiste kasutajate blogipostituste lugemine
  • Blogide sorteerimine/filtreerimine kategooria alusel
  • Blogi postituste lisamine ja nende haldamine
  • Saab likeda või dislikeda blogisid
  • Blogide kommenteerimine ja kommentaaride haldamine
  • Blogipostide kommenteerimine
  • Saab likeda blogiposte
  • Saab valida lemmik blogikategooriad

Külaline

  • Lugeda blogisid
  • Kommenteerida blogisid

Nice to have

Mudel

Blogdom.png

Tehnoloogia

XML

NB! Ei ole seotud meie projektiga.

XML

<?xml version="1.0" encoding="utf-8" ?>
<blog_users>
  <user id="2" type="regular" gender="male">
    <username><![CDATA[iAmRockstarYo]]></username>
    <firstname><![CDATA[Lemon]]></firstname>
    <lastname><![CDATA[Fight]]></lastname>
    <posts>
      <post id="5" category="cars" posted="2017-01-01">
        <content><![CDATA[Today i really got to meet a nice car owner, who owned a Miata]]></content>
      </post>
      <post id="6" category="cars" posted="2017-11-11">
        <content><![CDATA[Blew my engine :(]]></content>
      </post>
    </posts>
  </user>
  <user id="4" type="popular" gender="female">
    <username><![CDATA[PurpleBaby]]></username>
    <firstname><![CDATA[Cutie]]></firstname>
    <lastname><![CDATA[Pie]]></lastname>
    <posts>
      <post id="7" category="cars" posted="2017-05-02">
        <content><![CDATA[That Corrado G60 will definitely burn rubber]]></content>
      </post>
      <post id="9" category="cars" posted="2017-07-15">
        <content><![CDATA[Where to find new tires?]]></content>
      </post>
    </posts>
  </user>
  <user id="7" type="regular" gender="male">
    <username><![CDATA[RustyJoe]]></username>
    <firstname><![CDATA[Joe]]></firstname>
    <lastname><![CDATA[Frankfurter]]></lastname>
    <posts>
      <post id="8" category="cars" posted="2017-03-03">
        <content><![CDATA[Guys, where can I find my blinker fluid???]]></content>
      </post>
      <post id="12" category="women" posted="2018-05-06">
        <content><![CDATA[I really love my wife]]></content>
      </post>
    </posts>
  </user>
  <user id="9" type="annoying" gender="male">
    <username><![CDATA[BMW4Life]]></username>
    <firstname><![CDATA[Jackson]]></firstname>
    <lastname><![CDATA[Michael]]></lastname>
    <posts>
      <post id="14" category="marriage" posted="2017-05-31">
        <content><![CDATA[Is it ok if my wife sounds like Marilyn Manson?]]></content>
      </post>
      <post id="15" category="other" posted="2017-06-08">
        <content><![CDATA[Did Avicii deserve it?]]></content>
      </post>
    </posts>
  </user>
  </blog_users>

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="blog_users">
    <xs:complexType>
      <xs:sequence>
        <xs:element maxOccurs="unbounded" name="user">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="username" type="xs:string" />
              <xs:element name="firstname" type="xs:string" />
              <xs:element name="lastname" type="xs:string" />
              <xs:element name="posts">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element maxOccurs="unbounded" name="post">
                      <xs:complexType>
                        <xs:sequence>
                          <xs:element name="content" type="xs:string" />
                        </xs:sequence>
                        <xs:attribute name="id" type="xs:unsignedByte" use="required" />
                        <xs:attribute name="category" type="xs:string" use="required" />
                        <xs:attribute name="posted" type="xs:date" use="required" />
                      </xs:complexType>
                    </xs:element>
                  </xs:sequence>
                </xs:complexType>
              </xs:element>
            </xs:sequence>
            <xs:attribute name="id" type="xs:unsignedByte" use="required" />
            <xs:attribute name="type" type="xs:string" use="required" />
            <xs:attribute name="gender" type="xs:string" use="required" />
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

XSLT HTML transformation

<?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="/blog_users">
    <html>
      <head>
        <title>Users data</title>
      </head>
      <body>
        <h1>Regular user posts</h1>
        <xsl:for-each select="user">
          <xsl:if test="@type='regular'">
          <h3>
            Username:
            <xsl:value-of select="username"/>
          </h3>
            <p>Posts by this user:</p>
            <ul>
              <xsl:for-each select="posts/post">
                <li>
                  <xsl:value-of select="@content"/>
                  <xsl:value-of select="."/>
                </li>
              </xsl:for-each>
            </ul>
          </xsl:if>
        </xsl:for-each>
        <h1>Popular female user posts</h1>
        <xsl:for-each select="user">
          <xsl:if test="@gender='female' and @type='popular'">
            <h3>
              Username:
              <xsl:value-of select="username"/>
            </h3>
            <ul style="list-style-type:none">
              <li>
                Firstname:
                <xsl:value-of select="firstname"/>
              </li>
              <li>
                Lastname:
                <xsl:value-of select="lastname"/>
              </li>
            </ul>
            <p>Posts:</p>
            <ul>
              <xsl:for-each select="posts/post">
                <li>
                  <xsl:value-of select="@content"/>
                  <xsl:value-of select="."/>
                </li>
              </xsl:for-each>
            </ul>
          </xsl:if>
        </xsl:for-each>
      </body>
    </html>
  </xsl:template>
</xsl:stylesheet>

XSLT XML transformation

<?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="xml" indent="yes"/>

  <xsl:template match="/">
      <blog_users>
        <xsl:for-each select="blog_users/user">
            <user>
              <xsl:if test="@type='regular'">
                <username>
                  <xsl:value-of select="username"/>
                </username>
                <firstname>
                 <xsl:value-of select="firstname"/>
                </firstname>
                <lastname>
                  <xsl:value-of select="lastname"/>
               </lastname>
               <posts>
                  <xsl:for-each select="posts/post">
                    <post>
                     <xsl:value-of select="@content"/>
                     <xsl:value-of select="."/>
                    </post>
                  </xsl:for-each>
                </posts>
              </xsl:if>
            <xsl:if test="@gender='female' and @type='popular'">
            <firstname>
              <xsl:value-of select="firstname"/>
            </firstname>
            <lastname>
              <xsl:value-of select="lastname"/>
            </lastname>
            <posts>
              <xsl:for-each select="posts/post">
                <post>
                  <xsl:value-of select="@content"/>
                  <xsl:value-of select="."/>
                </post>
                  </xsl:for-each>
                </posts>
              </xsl:if>
            </user>
        </xsl:for-each>
    </blog_users>
  </xsl:template>
</xsl:stylesheet>

Retsensioonid

Retsenseerisime Raavo_V2™

Veebiteenus

Klientrakendus Rakendust avades ilmub ette kohe suurelt „Garagefy, Online booking system for car workshops“ mis tõstab lootused kohe kõrgele. Meeskond on realiseerinud kõik Must have funktsionaalsused, mida nad on enda wikis kirjeldanud, ehk sisselogimine, kliendil võimalus remonditeenust broneerida ja jälgida neid ning muuta andmeid. Administraatorina saab kasutajaid ja broneeringuid hallata. Väike mõte tekkis, et kui klient helistab töötajale, siis võiks ka temal olla võimalus aeg tühistada, sest vahel peab mehaanikuga asju otse arutama ja kergem oleks mitte läbi vahendaja suhelda. Jäi arusaamatuks, kas administraatori all mõeldakse süsteemi administraatorit või kliendiga suhtlevat. Hetkel tundub, et need kaks on kokku liidetud, võiks broneeringute haldamise ikkagi töötajale jätta, sest talle on broneeringu kustutamiseks ja kinnitamiseks nupp olemas, aga need ei funktsioneeri. Admini email võiks ka viisakam olla, kuid see on väga väike viga.

Administraatorina leidub ka puudusi, näiteks ei saa muuta garaaži andmeid, vaid on jäetud kustutamise nupp. See on jälle ajakadu, kui süsteem on suurem, lisaks käsitsi uuesti lisamisel võivad tekkida vead, mis võivad tuua ärile kahju. Kui proovida lisada Service Type’i ilma garaažita, siis ei toimu midagi, viisakas oleks anda mingisugunegi vihje, miks seda andmebaasi ei lisatud (kasutaja võib ikkagi rumal olla). Sama kehtib Service’i kohta. Service’s ei toimu ka väljade tühjendamist, väga tüütu on neid eraldi tühjendada kui on vajadust, samas saab seda võtta omamoodi „editimise“ viisiks, kus saab kiirelt muudetud andmed sisestada ja vanad ära kustutada, kuid funktsionaalsuse poolelt on see ebapraktiline.

Kasutajat registreerides on hea näha, et on mõeldud turvalisusele, üritades sisestada lihtsat parooli „lammas1“ ilmub mitmeid nõudmisi, millele igal saidil tähelepanu ei pöörata. Näiteks, et parool peab olema vähemalt 8 tähte, sisaldama vähemalt ühte suurt tähte ning 6 erinevat sümbolit. Silma jäi, et automaatselt luuakse emailist username, mida saab alles hiljem muuta, seda võiks lasta kohe registreerides valida või üldse ära jätta, sest sisse saab nagunii logida ainult ühe emailiga. Turvalisuse lisa on ka see, et teatud aja peale logitakse kasutaja välja, sellega välditakse pahatahtlikku identiteedivargust. Auto andmeid lisades on aga palju asju puudu, näiteks mootor, kütuseliik, käigukasti tüüp, veoskeem jne. Autoremondis on need tähtsad teadmised, sest paljud töökojad ei tegele automaatkäigukastidega, 90% firmasid ei tunne karburaator ja mehaanilise pritsega mootoreid, ehk tähtsa info lisamine on puudu jäänud. Hiljem ei saa ka muuta auto andmeid (näiteks kui on sõidukil tehtud mootorivahetus). Broneerimises puudub võimalus broneeringut tühistada või edasi lükata. Ei saa ka lisada täpsustusi, et mis sõidukil viga on.

Töökodadel võiks olla võimalus ennast hallata. Praegu käib kõik läbi administraatori ja teenuse kasvades muutub see viis nagu pudelikaelaks, mis piirab teenuse võimekust ja ajakohasust. Admini õigus kasutajaid deaktiveerida on väga kasulik, sest antud süsteemi saaks spammida kui tahta ning nii saab vähendada netitrollide arvu. Kui administraator peab juba enamik haldusega tegelema, siis spämmerite segaduse eemaldamisega on mõttetu võidelda, kui kasutaja saab edasi tegutseda.

Liikumine on kasutajaliideses tehtud mugavaks ja enam-vähem arusaadavaks. Näiteks saab kodulehele kohe kui vajutada üleval riba peal Garagefy. Samas Home nupuga on seda duubeldatud ja mõttetu, Garagefy nupp oleks üksi ratsionaalsem. Kood on visuaalselt väga ilus ja kõik on jaotatud korrektselt funktsioonidesse, kommentaarid teevad koodist arusaamise lihtsamaks, kuigi võiks natuke rohkem informatiivsemad olla nende jaoks, kes Javascriptiga vähem kokku puutuvad. Klientrakendus oleks võinud eraldi osana olla, hetkel oli see veebiteenusega koos. Idee on hea, teostus kesine, aga ette ei saa heita midagi, tegu on kooliprojektiga ja on õppimise faas, loodame, et võetakse tulevikus õppust.

XML

Antud meeskond on näinud palju vaeva oma XML failiga, seal on kohati 5 dimensiooni ning sellega nad on täitnud esitatud nõuet. Silma paistab palju väärtusi, mis on CDATA-ga ümbritsetud, et vältida selle parse’imist ehk algupärase kuju säilitamist. Andmed on sisukad ja vastavalt nende loodud projektile. Silma hakkab veel see, et valuuta on kursiga seotud, mitte pole tühjaks ja mõttetuks arvuks jäetud. Bookingutel on näha veel kinnitust, kas remonditöökoda on selle kinnitanud.

Meeskond Raavo on teinud HTML-i ja XML-i transformatsioonid. HTML-i transofrmatsioon on tehtud vastavalt nõuetele, isegi stiilile on rõhku pandud, ehk broneeningu staatus sõltub vastustest (ootel on punane, kinnitatud roheline). Tekkis ainult küsimus, et mille jaoks on xsl:sort lisatud? Võimalik, et neil oli plaanis sorteerida asju id abil, kuid see jäi ära, samas oleks võinud selle siis eemaldada. XML-i transformatsioon on hästi loetav ja grupeeritud mõistlikult, välja arvatud „Boooking“, kuid sellele hooletusveale on raske kohe tähelepanu pöörata. Veel torkab silma, et XLS-is pole kasutatud atribuute, üldse tundub, et XML-i transformatsiooniga pole nii palju vaeva nähtud, kui ülejäänud XML-ga. Rohkem ei ole midagi ette heita, tundub, et rühm on ülesandega hästi hakkama saanud.